diff --git a/e2e/playwright/navigation/src/tests/details-reduced-panel-navigation.e2e.ts b/e2e/playwright/navigation/src/tests/details-reduced-panel-navigation.e2e.ts
new file mode 100644
index 000000000..5a86a1b7e
--- /dev/null
+++ b/e2e/playwright/navigation/src/tests/details-reduced-panel-navigation.e2e.ts
@@ -0,0 +1,203 @@
+/*!
+ * Copyright © 2005-2026 Hyland Software, Inc. and its affiliates. All rights reserved.
+ *
+ * Alfresco Example Content Application
+ *
+ * This file is part of the Alfresco Example Content Application.
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ *
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * from Hyland Software. If not, see .
+ */
+
+import { expect } from '@playwright/test';
+import {
+ AdfInfoDrawerComponent,
+ ApiClientFactory,
+ FileActionsApi,
+ NodesApi,
+ TEST_FILES,
+ TrashcanApi,
+ Utils,
+ test
+} from '@alfresco/aca-playwright-shared';
+
+test.describe('Search → Full Details → Reduced Panel navigation', () => {
+ let nodesApi: NodesApi;
+ let trashcanApi: TrashcanApi;
+ let fileActionsApi: FileActionsApi;
+
+ const random = Utils.random();
+ const username = `user-${random}`;
+ const fileName = `search-details-nav-${random}.docx`;
+ let fileNodeId: string;
+
+ test.beforeAll(async () => {
+ try {
+ const apiClientFactory = new ApiClientFactory();
+ await apiClientFactory.setUpAcaBackend('admin');
+ await apiClientFactory.createUser({ username });
+ nodesApi = await NodesApi.initialize(username, username);
+ trashcanApi = await TrashcanApi.initialize(username, username);
+ fileActionsApi = await FileActionsApi.initialize(username, username);
+ const uploadedFile = await fileActionsApi.uploadFileWithRename(TEST_FILES.DOCX.path, fileName, '-my-');
+ fileNodeId = uploadedFile.entry.id;
+ await fileActionsApi.waitForNodes(fileName, { expect: 1 });
+ } catch (error) {
+ console.error(`beforeAll failed: ${error}`);
+ }
+ });
+
+ test.beforeEach(async ({ loginPage }) => {
+ await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed');
+ });
+
+ test.afterAll(async () => {
+ await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed');
+ });
+
+ async function waitForFullDetailsPageToSettle(infoDrawer: AdfInfoDrawerComponent): Promise {
+ await infoDrawer.detailsTabs.waitFor({ state: 'visible' });
+ await infoDrawer.metadataTab.waitFor({ state: 'visible' });
+ await infoDrawer.contentMetadata.waitFor({ state: 'visible' });
+ await expect(infoDrawer.reducePanelButton).toBeVisible();
+ }
+
+ test.describe('File List page', () => {
+ test('[XAT-19925] should reduce Full Details to Details panel on File List page without navigating away', async ({ personalFiles }) => {
+ await personalFiles.navigate();
+ await Utils.reloadPageIfRowNotVisible(personalFiles, fileName);
+ await expect(personalFiles.dataTable.getRowByName(fileName)).toBeVisible();
+
+ await personalFiles.dataTable.getRowByName(fileName).click();
+ await personalFiles.acaHeader.viewDetails.click();
+ await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible();
+
+ await personalFiles.infoDrawer.expandDetailsButton.click();
+ await personalFiles.page.waitForURL(`**/personal-files/details/${fileNodeId}**`);
+ await waitForFullDetailsPageToSettle(personalFiles.infoDrawer);
+
+ await personalFiles.infoDrawer.reducePanelButton.click();
+ await personalFiles.page.waitForURL((url) => !url.href.includes('/details/'));
+
+ expect(personalFiles.page.url()).not.toContain('/details/');
+ expect(personalFiles.page.url()).not.toContain('/search');
+ await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible();
+ });
+
+ test('[XAT-19926] should reduce Full Details back to Search page when the journey started from Search', async ({ searchPage }) => {
+ await searchPage.searchWithin(fileName, 'files');
+ await expect(searchPage.dataTable.getRowByName(fileName)).toBeVisible();
+
+ await searchPage.dataTable.getRowByName(fileName).click();
+ await searchPage.acaHeader.viewDetails.click();
+
+ await expect(searchPage.infoDrawer.infoDrawerPanel).toBeVisible();
+ await searchPage.infoDrawer.expandDetailsButton.click();
+ await searchPage.page.waitForURL(`**/personal-files/details/${fileNodeId}**`);
+ await waitForFullDetailsPageToSettle(searchPage.infoDrawer);
+
+ await searchPage.infoDrawer.reducePanelButton.click();
+ await searchPage.page.waitForURL((url) => !url.href.includes('/details/'));
+
+ expect(searchPage.page.url()).not.toContain('/details/');
+ expect(searchPage.page.url()).toContain('/search');
+ });
+
+ test('[XAT-19927] should reduce Full Details to Details panel after navigating through Search page', async ({ searchPage, personalFiles }) => {
+ await personalFiles.navigate();
+ await Utils.reloadPageIfRowNotVisible(personalFiles, fileName);
+ await expect(personalFiles.dataTable.getRowByName(fileName)).toBeVisible();
+
+ await personalFiles.dataTable.getRowByName(fileName).click();
+ await personalFiles.acaHeader.viewDetails.click();
+ await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible();
+
+ await personalFiles.infoDrawer.expandDetailsButton.click();
+ await personalFiles.page.waitForURL(`**/personal-files/details/${fileNodeId}**`);
+ await waitForFullDetailsPageToSettle(personalFiles.infoDrawer);
+
+ await searchPage.searchWithin(fileName, 'files');
+ await expect(searchPage.dataTable.getRowByName(fileName)).toBeVisible();
+
+ await searchPage.searchInputComponent.searchCloseButton.click();
+ await personalFiles.page.waitForURL(`**/personal-files/details/${fileNodeId}**`);
+ await waitForFullDetailsPageToSettle(personalFiles.infoDrawer);
+
+ await personalFiles.infoDrawer.reducePanelButton.click();
+ await personalFiles.page.waitForURL((url) => !url.href.includes('/details/'));
+
+ expect(personalFiles.page.url()).not.toContain('/details/');
+ expect(personalFiles.page.url()).not.toContain('/search');
+ await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible();
+ });
+ });
+
+ test.describe('Viewer page', () => {
+ test('[ACS-19938] should reduce Full Details to Details panel on Viewer page without navigating away', async ({ personalFiles }) => {
+ await personalFiles.navigate();
+ await Utils.reloadPageIfRowNotVisible(personalFiles, fileName);
+ await expect(personalFiles.dataTable.getRowByName(fileName)).toBeVisible();
+
+ await personalFiles.dataTable.performClickFolderOrFileToOpen(fileName);
+ await personalFiles.viewer.waitForViewerToOpen();
+
+ await personalFiles.viewer.viewDetailsButton.click();
+ await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible();
+
+ await personalFiles.infoDrawer.expandDetailsButton.click();
+ await personalFiles.page.waitForURL(`**/personal-files/details/${fileNodeId}**`);
+ await waitForFullDetailsPageToSettle(personalFiles.infoDrawer);
+
+ await personalFiles.infoDrawer.reducePanelButton.click();
+ await personalFiles.page.waitForURL((url) => !url.href.includes('/details/'));
+
+ expect(personalFiles.page.url()).not.toContain('/search');
+ expect(personalFiles.page.url()).not.toContain('/details/');
+ });
+
+ test('[ACS-19939] should reduce Full Details to Viewer Details panel after navigating through Search page', async ({
+ searchPage,
+ personalFiles
+ }) => {
+ await personalFiles.navigate();
+ await Utils.reloadPageIfRowNotVisible(personalFiles, fileName);
+ await expect(personalFiles.dataTable.getRowByName(fileName)).toBeVisible();
+
+ await personalFiles.dataTable.performClickFolderOrFileToOpen(fileName);
+ await personalFiles.viewer.waitForViewerToOpen();
+
+ await personalFiles.viewer.viewDetailsButton.click();
+ await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible();
+ await personalFiles.infoDrawer.expandDetailsButton.click();
+ await personalFiles.page.waitForURL(`**/personal-files/details/${fileNodeId}**`);
+ await waitForFullDetailsPageToSettle(personalFiles.infoDrawer);
+
+ await searchPage.searchWithin(fileName, 'files');
+ await expect(searchPage.dataTable.getRowByName(fileName)).toBeVisible();
+
+ await searchPage.searchInputComponent.searchCloseButton.click();
+ await searchPage.page.waitForURL(`**/personal-files/details/${fileNodeId}**`);
+ await waitForFullDetailsPageToSettle(searchPage.infoDrawer);
+
+ await searchPage.infoDrawer.reducePanelButton.click();
+ await searchPage.page.waitForURL((url) => !url.href.includes('/details/'));
+
+ expect(personalFiles.page.url()).not.toContain('/search');
+ expect(personalFiles.page.url()).not.toContain('/details/');
+ await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible();
+ });
+ });
+});
diff --git a/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts b/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts
index 80b054c65..5266de368 100644
--- a/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts
+++ b/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts
@@ -60,6 +60,10 @@ export class AdfInfoDrawerComponent extends BaseComponent {
public errorNameMessage = this.getChild('[data-automation-id="library-name-properties-wrapper"] [aria-atomic="true"]');
public errorDescriptionMessage = this.getChild('[data-automation-id="library-description-properties-wrapper"] [aria-atomic="true"]');
public expandDetailsButton = this.getChild(`button[title='Expand panel']`);
+ public reducePanelButton = this.page.locator('[data-automation-id="close-library"]');
+ public detailsTabs = this.page.locator('.aca-details-tabs');
+ public metadataTab = this.page.locator('app-metadata-tab');
+ public contentMetadata = this.page.locator('adf-content-metadata');
public expandedDetailsTabs = this.page.locator('.aca-details-container [role="tab"]');
public expandedDetailsPermissionsTab = this.expandedDetailsTabs.getByText('Permissions');
public nameField = this.getChild('input[placeholder=Name]');
diff --git a/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts b/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts
index 3bae0e7a4..78e34e8fa 100644
--- a/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts
+++ b/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts
@@ -53,6 +53,7 @@ export class ViewerComponent extends BaseComponent {
public nextFileButton = this.getChild('[data-automation-id="adf-toolbar-next-file"]');
public previousFileButton = this.getChild('[data-automation-id="adf-toolbar-pref-file"]');
public noPermissionsView = this.getChild('aca-generic-error');
+ public viewDetailsButton = this.page.locator('#adf-viewer-toolbar [title="View Details"]');
toolbar = new AcaHeader(this.page);
diff --git a/projects/aca-playwright-shared/src/page-objects/pages/search.page.ts b/projects/aca-playwright-shared/src/page-objects/pages/search.page.ts
index 8e9ac8cf7..6d2ea7038 100644
--- a/projects/aca-playwright-shared/src/page-objects/pages/search.page.ts
+++ b/projects/aca-playwright-shared/src/page-objects/pages/search.page.ts
@@ -25,6 +25,7 @@
import { Page } from '@playwright/test';
import { BasePage } from './base.page';
import {
+ AdfInfoDrawerComponent,
DataTableComponent,
FolderInformationDialogComponent,
MatMenuComponent,
@@ -76,6 +77,7 @@ export class SearchPage extends BasePage {
public manageVersionsDialog = new ManageVersionsDialog(this.page);
public folderInformationDialog = new FolderInformationDialogComponent(this.page);
public searchMenuCard = new SearchMenuCard(this.page);
+ public infoDrawer = new AdfInfoDrawerComponent(this.page);
async searchWithin(searchText: string, searchType?: SearchType, searchMode?: SearchMode): Promise {
if (!(await this.searchInputComponent.searchInput.isVisible())) {