[MNT-25409] fix Cannot switch between saved searches correctly (#4876)

This commit is contained in:
Mykyta Maliarchuk
2025-10-31 08:46:05 +01:00
committed by GitHub
parent 03bda7cca7
commit 87a89c92d3
2 changed files with 28 additions and 3 deletions
@@ -339,8 +339,13 @@ describe('SearchComponent', () => {
expect(queryBuilder.execute).toHaveBeenCalledTimes(1); expect(queryBuilder.execute).toHaveBeenCalledTimes(1);
})); }));
it('should NOT call execute on navigation to search page', fakeAsync(() => { it('should NOT call execute on navigation to search page with unchanged query', fakeAsync(() => {
spyOn(queryBuilder, 'execute'); const executeSpy = spyOn(queryBuilder, 'execute');
queryParams.next({ q: encodeQuery({ userQuery: 'cm:name:"test*"' }) });
tick();
executeSpy.calls.reset();
routerEvents.next(new NavigationStart(1, '/mock-search-url', 'imperative')); routerEvents.next(new NavigationStart(1, '/mock-search-url', 'imperative'));
queryParams.next({ q: encodeQuery({ userQuery: 'cm:name:"test*"' }) }); queryParams.next({ q: encodeQuery({ userQuery: 'cm:name:"test*"' }) });
@@ -349,5 +354,20 @@ describe('SearchComponent', () => {
expect(queryBuilder.execute).not.toHaveBeenCalled(); expect(queryBuilder.execute).not.toHaveBeenCalled();
})); }));
it('should call execute on navigation to search page with changed query', fakeAsync(() => {
const executeSpy = spyOn(queryBuilder, 'execute');
queryParams.next({ q: encodeQuery({ userQuery: 'cm:name:"different*"' }) });
tick();
executeSpy.calls.reset();
routerEvents.next(new NavigationStart(1, '/mock-search-url', 'imperative'));
queryParams.next({ q: encodeQuery({ userQuery: 'cm:name:"test*"' }) });
tick();
expect(executeSpy).toHaveBeenCalledTimes(1);
}));
testHeader(SearchResultsComponent, false); testHeader(SearchResultsComponent, false);
}); });
@@ -147,6 +147,8 @@ export class SearchResultsComponent extends PageComponent implements OnInit {
encodedQuery: string; encodedQuery: string;
searchConfig: SearchConfiguration; searchConfig: SearchConfiguration;
private previousEncodedQuery: string;
constructor( constructor(
tagsService: TagService, tagsService: TagService,
private readonly queryBuilder: SearchQueryBuilderService, private readonly queryBuilder: SearchQueryBuilderService,
@@ -351,10 +353,13 @@ export class SearchResultsComponent extends PageComponent implements OnInit {
} }
private shouldExecuteQuery(navigationStartEvent: NavigationStart | null, query: string | undefined): boolean { private shouldExecuteQuery(navigationStartEvent: NavigationStart | null, query: string | undefined): boolean {
const hasQueryChanged = query !== this.previousEncodedQuery;
this.previousEncodedQuery = query;
if (!navigationStartEvent || navigationStartEvent.navigationTrigger === 'popstate' || navigationStartEvent.navigationTrigger === 'hashchange') { if (!navigationStartEvent || navigationStartEvent.navigationTrigger === 'popstate' || navigationStartEvent.navigationTrigger === 'hashchange') {
return true; return true;
} else if (navigationStartEvent.navigationTrigger === 'imperative') { } else if (navigationStartEvent.navigationTrigger === 'imperative') {
return false; return hasQueryChanged;
} else { } else {
return !!query; return !!query;
} }