Browse Source

Fix title and shortcut.

pull/773/head
Sebastian 4 years ago
parent
commit
bb93080c4e
  1. 5
      frontend/app/framework/angular/title.component.spec.ts
  2. 9
      frontend/app/framework/angular/title.component.ts
  3. 14
      frontend/app/framework/services/title.service.spec.ts
  4. 15
      frontend/app/framework/services/title.service.ts

5
frontend/app/framework/angular/title.component.spec.ts

@ -31,6 +31,9 @@ describe('TitleComponent', () => {
router.setup(x => x.serializeUrl(tree)) router.setup(x => x.serializeUrl(tree))
.returns(() => 'my-url'); .returns(() => 'my-url');
titleService.setup(x => x.push(It.isAnyString(), It.isAny(), It.isAny()))
.returns(() => 0);
}); });
it('should set title in service', () => { it('should set title in service', () => {
@ -51,7 +54,7 @@ describe('TitleComponent', () => {
expect().nothing(); expect().nothing();
titleService.verify(x => x.push('title2', 'title1', 'my-url'), Times.once()); titleService.verify(x => x.push('title2', 0, 'my-url'), Times.once());
}); });
it('should remove title on destroy if set before', () => { it('should remove title on destroy if set before', () => {

9
frontend/app/framework/angular/title.component.ts

@ -10,6 +10,7 @@
import { ChangeDetectionStrategy, Component, Input, OnChanges, OnDestroy } from '@angular/core'; import { ChangeDetectionStrategy, Component, Input, OnChanges, OnDestroy } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { TitleService } from '@app/framework/internal'; import { TitleService } from '@app/framework/internal';
import { Types } from '@app/shared';
@Component({ @Component({
selector: 'sqx-title[message]', selector: 'sqx-title[message]',
@ -17,7 +18,7 @@ import { TitleService } from '@app/framework/internal';
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class TitleComponent implements OnDestroy, OnChanges { export class TitleComponent implements OnDestroy, OnChanges {
private previous: any; private previousIndex: undefined | number;
@Input() @Input()
public url: any[] = ['./']; public url: any[] = ['./'];
@ -36,13 +37,11 @@ export class TitleComponent implements OnDestroy, OnChanges {
const routeTree = this.router.createUrlTree(this.url, { relativeTo: this.route }); const routeTree = this.router.createUrlTree(this.url, { relativeTo: this.route });
const routeUrl = this.router.serializeUrl(routeTree); const routeUrl = this.router.serializeUrl(routeTree);
this.titleService.push(this.message, this.previous, routeUrl); this.previousIndex = this.titleService.push(this.message, this.previousIndex, routeUrl);
this.previous = this.message;
} }
public ngOnDestroy() { public ngOnDestroy() {
if (this.previous) { if (Types.isNumber(this.previousIndex)) {
this.titleService.pop(); this.titleService.pop();
} }
} }

14
frontend/app/framework/services/title.service.spec.ts

@ -44,16 +44,26 @@ describe('TitleService', () => {
expect(document.title).toBe('my-title1 | my-title2'); expect(document.title).toBe('my-title1 | my-title2');
}); });
it('should replace previous element if found', () => { it('should replace previous index if found', () => {
const titleService = new TitleService(new TitlesConfig(), localizer.object); const titleService = new TitleService(new TitlesConfig(), localizer.object);
titleService.push('i18n:my-title1'); titleService.push('i18n:my-title1');
titleService.push('i18n:my-title2'); titleService.push('i18n:my-title2');
titleService.push('i18n:my-title3', 'i18n:my-title2'); titleService.push('i18n:my-title3', 1);
expect(document.title).toBe('my-title1 | my-title3'); expect(document.title).toBe('my-title1 | my-title3');
}); });
it('should replace previous index if found and not last', () => {
const titleService = new TitleService(new TitlesConfig(), localizer.object);
titleService.push('i18n:my-title1');
titleService.push('i18n:my-title2');
titleService.push('i18n:my-title3', 0);
expect(document.title).toBe('my-title3 | my-title2');
});
it('should concatenate remainging parts if title elements are popped', () => { it('should concatenate remainging parts if title elements are popped', () => {
const titleService = new TitleService(new TitlesConfig(), localizer.object); const titleService = new TitleService(new TitlesConfig(), localizer.object);

15
frontend/app/framework/services/title.service.ts

@ -7,6 +7,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { Types } from './../utils/types';
import { LocalizerService } from './localizer.service'; import { LocalizerService } from './localizer.service';
export class TitlesConfig { export class TitlesConfig {
@ -43,7 +44,9 @@ export class TitleService {
}); });
} }
public push(value: string, previous?: string, route?: any) { public push(value: string, index?: number, route?: any) {
let result: number | undefined;
if (value) { if (value) {
const clone = [...this.path$.value]; const clone = [...this.path$.value];
@ -52,14 +55,20 @@ export class TitleService {
const title = { localized, value, route }; const title = { localized, value, route };
if (previous && clone[lastIndex].value === previous) { if (Types.isNumber(index) && index >= 0 && index <= lastIndex) {
clone[lastIndex] = title; clone[index] = title;
result = index;
} else { } else {
clone.push(title); clone.push(title);
result = lastIndex + 1;
} }
this.path$.next(clone); this.path$.next(clone);
} }
return result;
} }
public pop() { public pop() {

Loading…
Cancel
Save