diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts index 4544ff07bbd8a19741c55ccd326b04b64f03fa0c..23297899303c64bb69860ac833aa1ef30de1299a 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts @@ -51,11 +51,12 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIcon } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { NavigationEnd, Router, RouterEvent } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { getDataTestClassOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createVorgangListResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; -import { BehaviorSubject, Subject, of } from 'rxjs'; +import { BehaviorSubject, ReplaySubject, Subject, of } from 'rxjs'; import { VorgangSearchAutocompleteOptionsContentComponent } from './vorgang-search-autocomplete-options-content/vorgang-search-autocomplete-options-content.component'; import { VorgangSearchClearButtonComponent } from './vorgang-search-clear-button/vorgang-search-clear-button.component'; import { VorgangSearchComponent } from './vorgang-search.component'; @@ -71,6 +72,13 @@ describe('VorgangSearchComponent', () => { const searchStringSubj: Subject<string> = new BehaviorSubject(EMPTY_STRING); + const routerEvents: ReplaySubject<RouterEvent> = new ReplaySubject<RouterEvent>(); + const routerMock = { + navigate: jest.fn(), + url: '/', + events: routerEvents.asObservable(), + }; + const searchPreviewOption: string = getDataTestClassOf('search-preview-option'); const searchClearButton: string = getDataTestIdOf('vorgang-search-clear-button'); @@ -116,6 +124,10 @@ describe('VorgangSearchComponent', () => { provide: NavigationService, useValue: navigationService, }, + { + provide: Router, + useValue: routerMock, + }, ], }).compileComponents(); }); @@ -154,6 +166,26 @@ describe('VorgangSearchComponent', () => { }); }); + describe('ngOnInit', () => { + it('should set focus if path is "/alle/search"', () => { + component.focus = jest.fn(); + routerEvents.next(new NavigationEnd(1, '/alle/search', '')); + + component.ngOnInit(); + + expect(component.focus).toHaveBeenCalled(); + }); + + it('should not set focus if path is not "/alle/search"', () => { + component.focus = jest.fn(); + routerEvents.next(new NavigationEnd(1, '/alle', '')); + + component.ngOnInit(); + + expect(component.focus).toHaveBeenCalled(); + }); + }); + describe('search clear button', () => { beforeEach(() => { searchStringSubj.next('test'); diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts index cccfbaf8d41ff25b10b39d5643c5e1dfc29c057f..5375e849b6359a8ba54dd883b83ed8da5daae844 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts @@ -21,15 +21,27 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; -import { MatAutocomplete } from '@angular/material/autocomplete'; -import { MatButton } from '@angular/material/button'; import { StateResource, isNotNil } from '@alfa-client/tech-shared'; import { VorgangHeaderLinkRel, VorgangListLinkRel, VorgangListResource, } from '@alfa-client/vorgang-shared'; +import { + Component, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + ViewChild, +} from '@angular/core'; +import { MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { Event, NavigationEnd, Router } from '@angular/router'; +import { Subscription, filter } from 'rxjs'; +import { isVorgangSearchRoute } from '../../vorgang-util'; import { VorgangSearchFormService } from './vorgang-search.formservice'; @Component({ @@ -38,7 +50,7 @@ import { VorgangSearchFormService } from './vorgang-search.formservice'; styleUrls: ['./vorgang-search.component.scss'], providers: [VorgangSearchFormService], }) -export class VorgangSearchComponent { +export class VorgangSearchComponent implements OnInit, OnDestroy { @Input() vorgangSearchPreviewList: StateResource<VorgangListResource>; @Input() searchString: string; @@ -49,11 +61,25 @@ export class VorgangSearchComponent { @ViewChild('searchAutoComplete') searchAutoComplete: MatAutocomplete; previouslyEnteredSearchValue: string; + private subscription: Subscription; readonly vorgangHeaderLinkRel = VorgangHeaderLinkRel; readonly vorgangListLinkRel = VorgangListLinkRel; - constructor(public formService: VorgangSearchFormService) {} + constructor( + public formService: VorgangSearchFormService, + public router: Router, + ) {} + + ngOnInit(): void { + this.subscription = this.router.events + .pipe(filter((event: Event) => event instanceof NavigationEnd)) + .subscribe((navigationEnd: Event) => { + if (isVorgangSearchRoute(navigationEnd as NavigationEnd)) { + this.focus(); + } + }); + } submit(): void { this.previouslyEnteredSearchValue = this.formService.getValue(); @@ -93,4 +119,8 @@ export class VorgangSearchComponent { focus(): void { this.searchInput.nativeElement.focus(); } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } } diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts index 41d1e94862b57a486bf7129415a25a1906781dc3..867a4a51f1399adad41ea276aeee32749513d983 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts @@ -23,6 +23,7 @@ */ import { EMPTY_STRING } from '@alfa-client/tech-shared'; import { Antragsteller, Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { NavigationEnd } from '@angular/router'; import { createAntragsteller, createEingang, @@ -33,6 +34,7 @@ import { VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN, getAktenzeichenText, getEmpfaenger, + isVorgangSearchRoute, } from './vorgang-util'; describe('Vorgang Util', () => { @@ -54,6 +56,24 @@ describe('Vorgang Util', () => { }); }); + describe('isSearchRoute', () => { + it('should return true', () => { + const searchNavigationEnd: NavigationEnd = new NavigationEnd(1, '/alle/search', ''); + + const result: boolean = isVorgangSearchRoute(searchNavigationEnd); + + expect(result).toBeTruthy(); + }); + + it('should return false', () => { + const notSearchNavigationEnd: NavigationEnd = new NavigationEnd(1, '/alle', ''); + + const result: boolean = isVorgangSearchRoute(notSearchNavigationEnd); + + expect(result).toBeTruthy(); + }); + }); + describe('getEmpfaenger', () => { it('should return nachname only if exists', () => { const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined }; diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts index 5d90f07fe9a46e9c19ab44294aab7ffb32f7138b..1181194c857b55b3f777de544d53f1fc4ba1d2f3 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts @@ -23,6 +23,7 @@ */ import { EMPTY_STRING } from '@alfa-client/tech-shared'; import { Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { NavigationEnd } from '@angular/router'; export const VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN = 'kein Aktenzeichen'; @@ -34,6 +35,10 @@ export function getEmpfaenger(vorgangWithEingangResource: VorgangWithEingangReso return `${getVorname(vorgangWithEingangResource)} ${getNachname(vorgangWithEingangResource)}`.trim(); } +export function isVorgangSearchRoute(navigationEnd: NavigationEnd): boolean { + return navigationEnd.url === '/alle/search'; +} + function getVorname(vorgangWithEingangResource: VorgangWithEingangResource): string { return vorgangWithEingangResource.eingang.antragsteller?.vorname ?? EMPTY_STRING; }