From c14774983887382d9d7283cd709151246f288c5a Mon Sep 17 00:00:00 2001 From: Anton Ramanovich Date: Tue, 30 Sep 2025 17:22:42 +0200 Subject: [PATCH 1/7] [ACS-10083]: adds query decoding --- .../aca-content/src/lib/components/files/files.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/aca-content/src/lib/components/files/files.component.ts b/projects/aca-content/src/lib/components/files/files.component.ts index 40eae8218a..32fd7409f2 100644 --- a/projects/aca-content/src/lib/components/files/files.component.ts +++ b/projects/aca-content/src/lib/components/files/files.component.ts @@ -61,6 +61,7 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { SearchAiInputContainerComponent } from '../knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { HttpErrorResponse } from '@angular/common/http'; +import { extractFiltersFromEncodedQuery } from '../../utils/aca-search-utils'; @Component({ imports: [ @@ -121,7 +122,7 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy { this.title = data.title; this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((queryMap: Params) => { - this.queryParams = queryMap.params; + this.queryParams = extractFiltersFromEncodedQuery(queryMap?.params?.q); }); this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ folderId }: Params) => { const nodeId = folderId || data.defaultNodeId; From e40cf54a7dfbb655d29282f8622002d4a6347a83 Mon Sep 17 00:00:00 2001 From: Anton Ramanovich Date: Tue, 30 Sep 2025 17:52:17 +0200 Subject: [PATCH 2/7] [ACS-10083]: adds unit test for added feature --- .../lib/components/files/files.component.spec.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/projects/aca-content/src/lib/components/files/files.component.spec.ts b/projects/aca-content/src/lib/components/files/files.component.spec.ts index 12b4abfb64..2e4c4c4d76 100644 --- a/projects/aca-content/src/lib/components/files/files.component.spec.ts +++ b/projects/aca-content/src/lib/components/files/files.component.spec.ts @@ -190,6 +190,22 @@ describe('FilesComponent', () => { expect(router.navigate['calls'].argsFor(0)[0]).toEqual(['/personal-files', 'parent-id']); }); + it('should set decoded query as queryParams', () => { + const initialQuery = { checkList: 'TYPE:"cm:folder"' }; + + const encoded = btoa(JSON.stringify(initialQuery)); + + const mockParamMap = convertToParamMap({ q: encoded }); + + Object.defineProperty(component['route'], 'queryParamMap', { + value: of(mockParamMap) + }); + + fixture.detectChanges(); + + expect(component.queryParams).toEqual(initialQuery); + }); + it('should check isFilterHeaderActive to be true when filters are present in queryParamMap', () => { Object.defineProperty(route, 'queryParamMap', { value: of({ params: { $thumbnail: 'TYPE:"cm:folder"' } }) }); From f302ac6045b4a6a95c12bec216b3d90cc7e24196 Mon Sep 17 00:00:00 2001 From: Anton Ramanovich Date: Wed, 1 Oct 2025 07:46:36 +0200 Subject: [PATCH 3/7] [ACS-10083]: unit test fix --- .../components/files/files.component.spec.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/projects/aca-content/src/lib/components/files/files.component.spec.ts b/projects/aca-content/src/lib/components/files/files.component.spec.ts index 2e4c4c4d76..166138042f 100644 --- a/projects/aca-content/src/lib/components/files/files.component.spec.ts +++ b/projects/aca-content/src/lib/components/files/files.component.spec.ts @@ -24,7 +24,7 @@ import { TestBed, fakeAsync, tick, ComponentFixture } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA, SimpleChange, SimpleChanges } from '@angular/core'; -import { Router, ActivatedRoute, convertToParamMap } from '@angular/router'; +import { Router, ActivatedRoute, convertToParamMap, ParamMap } from '@angular/router'; import { DocumentListService, FilterSearch, UploadService } from '@alfresco/adf-content-services'; import { NodeActionsService } from '../../services/node-actions.service'; import { FilesComponent } from './files.component'; @@ -72,6 +72,11 @@ describe('FilesComponent', () => { expect(template).not.toBeNull(); } + function getEncodedParamMap(initialQuery = { checkList: 'TYPE:"cm:folder"' }): ParamMap { + const encoded = btoa(JSON.stringify(initialQuery)); + return convertToParamMap({ q: encoded }); + } + beforeEach(() => { TestBed.configureTestingModule({ imports: [AppTestingModule, FilesComponent, MatSnackBarModule], @@ -193,9 +198,7 @@ describe('FilesComponent', () => { it('should set decoded query as queryParams', () => { const initialQuery = { checkList: 'TYPE:"cm:folder"' }; - const encoded = btoa(JSON.stringify(initialQuery)); - - const mockParamMap = convertToParamMap({ q: encoded }); + const mockParamMap = getEncodedParamMap(initialQuery); Object.defineProperty(component['route'], 'queryParamMap', { value: of(mockParamMap) @@ -207,7 +210,11 @@ describe('FilesComponent', () => { }); it('should check isFilterHeaderActive to be true when filters are present in queryParamMap', () => { - Object.defineProperty(route, 'queryParamMap', { value: of({ params: { $thumbnail: 'TYPE:"cm:folder"' } }) }); + const mockParamMap = getEncodedParamMap(); + + Object.defineProperty(component['route'], 'queryParamMap', { + value: of(mockParamMap) + }); fixture.detectChanges(); From 994e359084fb0c2caa1c611d1a3e25f7123ff87f Mon Sep 17 00:00:00 2001 From: Anton Ramanovich Date: Mon, 6 Oct 2025 12:56:14 +0200 Subject: [PATCH 4/7] [ACS-10083]: minor fixes --- .../src/lib/components/files/files.component.spec.ts | 4 ++-- .../aca-content/src/lib/components/files/files.component.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/aca-content/src/lib/components/files/files.component.spec.ts b/projects/aca-content/src/lib/components/files/files.component.spec.ts index 166138042f..0f4b45f86a 100644 --- a/projects/aca-content/src/lib/components/files/files.component.spec.ts +++ b/projects/aca-content/src/lib/components/files/files.component.spec.ts @@ -200,7 +200,7 @@ describe('FilesComponent', () => { const mockParamMap = getEncodedParamMap(initialQuery); - Object.defineProperty(component['route'], 'queryParamMap', { + Object.defineProperty(route, 'queryParamMap', { value: of(mockParamMap) }); @@ -212,7 +212,7 @@ describe('FilesComponent', () => { it('should check isFilterHeaderActive to be true when filters are present in queryParamMap', () => { const mockParamMap = getEncodedParamMap(); - Object.defineProperty(component['route'], 'queryParamMap', { + Object.defineProperty(route, 'queryParamMap', { value: of(mockParamMap) }); diff --git a/projects/aca-content/src/lib/components/files/files.component.ts b/projects/aca-content/src/lib/components/files/files.component.ts index 32fd7409f2..f9a2af1e3b 100644 --- a/projects/aca-content/src/lib/components/files/files.component.ts +++ b/projects/aca-content/src/lib/components/files/files.component.ts @@ -61,7 +61,7 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { SearchAiInputContainerComponent } from '../knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { HttpErrorResponse } from '@angular/common/http'; -import { extractFiltersFromEncodedQuery } from '../../utils/aca-search-utils'; +import { extractFiltersFromEncodedQuery } from '@alfresco/aca-content'; @Component({ imports: [ From e133c034c3809a2ac941f5ab2ee91a53d42a39ba Mon Sep 17 00:00:00 2001 From: Anton Ramanovich Date: Mon, 6 Oct 2025 13:03:08 +0200 Subject: [PATCH 5/7] [ACS-10083]: circular dep fix --- .../aca-content/src/lib/components/files/files.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/aca-content/src/lib/components/files/files.component.ts b/projects/aca-content/src/lib/components/files/files.component.ts index f9a2af1e3b..32fd7409f2 100644 --- a/projects/aca-content/src/lib/components/files/files.component.ts +++ b/projects/aca-content/src/lib/components/files/files.component.ts @@ -61,7 +61,7 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { SearchAiInputContainerComponent } from '../knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { HttpErrorResponse } from '@angular/common/http'; -import { extractFiltersFromEncodedQuery } from '@alfresco/aca-content'; +import { extractFiltersFromEncodedQuery } from '../../utils/aca-search-utils'; @Component({ imports: [ From 7b8470b61dfbd8aed76b61091bca0b974a180bcc Mon Sep 17 00:00:00 2001 From: Anton Ramanovich Date: Fri, 10 Oct 2025 08:30:42 +0200 Subject: [PATCH 6/7] [ACS-10083]: removes redundant code --- .../lib/components/files/files.component.ts | 7 ++-- .../document-base-page.component.ts | 7 ---- .../document-base-page.spec.ts | 39 +------------------ 3 files changed, 5 insertions(+), 48 deletions(-) diff --git a/projects/aca-content/src/lib/components/files/files.component.ts b/projects/aca-content/src/lib/components/files/files.component.ts index 32fd7409f2..430e854cc4 100644 --- a/projects/aca-content/src/lib/components/files/files.component.ts +++ b/projects/aca-content/src/lib/components/files/files.component.ts @@ -30,7 +30,7 @@ import { ShowHeaderMode } from '@alfresco/adf-core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import { ActivatedRoute, Params } from '@angular/router'; +import { ActivatedRoute, ParamMap, Params } from '@angular/router'; import { Node, NodeEntry, PathElement } from '@alfresco/js-api'; import { NodeActionsService } from '../../services/node-actions.service'; import { @@ -121,8 +121,8 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy { this.title = data.title; - this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((queryMap: Params) => { - this.queryParams = extractFiltersFromEncodedQuery(queryMap?.params?.q); + this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((queryMap: ParamMap) => { + this.queryParams = extractFiltersFromEncodedQuery(queryMap?.get('q')); }); this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ folderId }: Params) => { const nodeId = folderId || data.defaultNodeId; @@ -385,7 +385,6 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy { void this.router.navigate(['.'], { relativeTo: this.route }); this.isFilterHeaderActive = false; this.showHeader = ShowHeaderMode.Data; - this.onAllFilterCleared(); } } diff --git a/projects/aca-shared/src/lib/components/document-base-page/document-base-page.component.ts b/projects/aca-shared/src/lib/components/document-base-page/document-base-page.component.ts index fdc8093e1d..27111c10bd 100644 --- a/projects/aca-shared/src/lib/components/document-base-page/document-base-page.component.ts +++ b/projects/aca-shared/src/lib/components/document-base-page/document-base-page.component.ts @@ -259,11 +259,4 @@ export abstract class PageComponent implements OnInit, OnDestroy, OnChanges { onSortingChanged(event: any) { this.filterSorting = event.detail.key + '-' + event.detail.direction; } - - onAllFilterCleared() { - if (!this.isOutletPreviewUrl()) { - this.documentList.node = null; - this.documentListService.reload(); - } - } } diff --git a/projects/aca-shared/src/lib/components/document-base-page/document-base-page.spec.ts b/projects/aca-shared/src/lib/components/document-base-page/document-base-page.spec.ts index f20c83fb21..32167ef37c 100644 --- a/projects/aca-shared/src/lib/components/document-base-page/document-base-page.spec.ts +++ b/projects/aca-shared/src/lib/components/document-base-page/document-base-page.spec.ts @@ -26,11 +26,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PageComponent } from './document-base-page.component'; import { AppState, SetSelectedNodesAction, ViewNodeAction } from '@alfresco/aca-shared/store'; import { LibTestingModule, discoveryApiServiceMockValue, DocumentBasePageServiceMock } from '@alfresco/aca-shared'; -import { NodeEntry, NodePaging } from '@alfresco/js-api'; +import { NodeEntry } from '@alfresco/js-api'; import { DocumentBasePageService } from './document-base-page.service'; import { Store } from '@ngrx/store'; import { Component } from '@angular/core'; -import { DiscoveryApiService, DocumentListComponent, DocumentListService, SearchAiInputState, SearchAiService } from '@alfresco/adf-content-services'; +import { DiscoveryApiService, DocumentListService, SearchAiInputState, SearchAiService } from '@alfresco/adf-content-services'; import { MockStore, provideMockStore } from '@ngrx/store/testing'; import { provideCoreAuth, UserPreferencesService } from '@alfresco/adf-core'; import { of, Subscription } from 'rxjs'; @@ -157,41 +157,6 @@ describe('PageComponent', () => { expect(store.dispatch['calls'].mostRecent().args[0]).toEqual(new SetSelectedNodesAction([node])); }); - it('should clear results onAllFilterCleared event', () => { - spyOn(documentListService, 'reload'); - - component.documentList = { - node: { - list: { - pagination: {}, - entries: [{ entry: { id: 'new-node-id' } }] - } - } as NodePaging - } as DocumentListComponent; - spyOn(store, 'dispatch'); - - component.onAllFilterCleared(); - expect(component.documentList.node).toBe(null); - expect(documentListService.reload).toHaveBeenCalled(); - }); - - it('should call onAllFilterCleared event if page is viewer outlet', () => { - window.history.pushState({}, null, `${locationHref}#test(viewer:view)`); - const nodePaging = { - list: { - pagination: {}, - entries: [{ entry: { id: 'new-node-id' } }] - } - } as NodePaging; - - component.documentList = { node: nodePaging } as DocumentListComponent; - spyOn(store, 'dispatch'); - - component.onAllFilterCleared(); - expect(component.documentList.node).toEqual(nodePaging); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - it('should call ViewNodeAction on showPreview for selected node', () => { spyOn(store, 'dispatch'); const node = { From 835432bd2a34995d56020045af7f593196681eb4 Mon Sep 17 00:00:00 2001 From: Anton Ramanovich Date: Mon, 13 Oct 2025 12:04:59 +0200 Subject: [PATCH 7/7] [ACS-10083]: test fix --- .../src/lib/components/files/files.component.spec.ts | 2 +- .../aca-content/src/lib/components/files/files.component.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/aca-content/src/lib/components/files/files.component.spec.ts b/projects/aca-content/src/lib/components/files/files.component.spec.ts index 0f4b45f86a..f63de4d927 100644 --- a/projects/aca-content/src/lib/components/files/files.component.spec.ts +++ b/projects/aca-content/src/lib/components/files/files.component.spec.ts @@ -90,7 +90,7 @@ describe('FilesComponent', () => { useValue: { snapshot: { data: { preferencePrefix: 'prefix' }, paramMap: convertToParamMap({ folderId: undefined }) }, params: of({ folderId: 'someId' }), - queryParamMap: of({}) + queryParamMap: of(convertToParamMap({})) } }, AppExtensionService, diff --git a/projects/aca-content/src/lib/components/files/files.component.ts b/projects/aca-content/src/lib/components/files/files.component.ts index 430e854cc4..e5e12393c2 100644 --- a/projects/aca-content/src/lib/components/files/files.component.ts +++ b/projects/aca-content/src/lib/components/files/files.component.ts @@ -30,7 +30,7 @@ import { ShowHeaderMode } from '@alfresco/adf-core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import { ActivatedRoute, ParamMap, Params } from '@angular/router'; +import { ActivatedRoute, Params } from '@angular/router'; import { Node, NodeEntry, PathElement } from '@alfresco/js-api'; import { NodeActionsService } from '../../services/node-actions.service'; import { @@ -121,7 +121,7 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy { this.title = data.title; - this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((queryMap: ParamMap) => { + this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((queryMap) => { this.queryParams = extractFiltersFromEncodedQuery(queryMap?.get('q')); }); this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ folderId }: Params) => {