From 4751dcd12c8c66f4ea1df49e8cf19c2988a077c9 Mon Sep 17 00:00:00 2001 From: Mykyta Maliarchuk <84377976+nikita-web-ua@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:53:22 +0100 Subject: [PATCH] [ACS-9158] Remove 'View Details' button from node Details page (#4351) * [ACS-9158] Remove 'View Details' button from node Details page * [ACS-9158] remove redundant onDestroy$ * cr fix --- docs/extending/rules.md | 3 +- .../aca-content/assets/app.extensions.json | 4 +- .../aca-content/src/lib/aca-content.module.ts | 1 + .../details/details.component.spec.ts | 47 ++----------------- .../components/details/details.component.ts | 23 +-------- .../aca-shared/rules/src/app.rules.spec.ts | 7 ++- .../rules/src/navigation.rules.spec.ts | 22 +++++++++ .../aca-shared/rules/src/navigation.rules.ts | 6 +++ 8 files changed, 43 insertions(+), 70 deletions(-) diff --git a/docs/extending/rules.md b/docs/extending/rules.md index 883442edd..7d614dadc 100644 --- a/docs/extending/rules.md +++ b/docs/extending/rules.md @@ -248,7 +248,7 @@ for example mixing `core.every` and `core.not`. `!app.navigation.isTrashcan` is the opposite of the `app.navigation.isTrashcan`. | Version | Key | Description | -| ------- | --------------------------------- | ---------------------------------------------------------------- | +|---------|-----------------------------------|------------------------------------------------------------------| | 1.7.0 | app.navigation.folder.canCreate | User can create content in the currently opened folder. | | 1.7.0 | app.navigation.folder.canUpload | User can upload content to the currently opened folder. | | 1.7.0 | app.navigation.isTrashcan | User is using the **Trashcan** page. | @@ -269,6 +269,7 @@ for example mixing `core.every` and `core.not`. | 1.7.0 | app.navigation.isPreview | Current page is **Preview**. | | 1.7.0 | app.navigation.isPersonalFiles | Current page is **Personal Files**. | | 1.7.0 | app.navigation.isLibraryFiles | Current page is **Library Files**. | +| 5.3.0 | app.navigation.isNotDetails | Current page is not **Details**. | **Tip:** See the [Registration](./registration) section for more details on how to register your own entries to be re-used at runtime. diff --git a/projects/aca-content/assets/app.extensions.json b/projects/aca-content/assets/app.extensions.json index 670e8f3df..5cdec3632 100644 --- a/projects/aca-content/assets/app.extensions.json +++ b/projects/aca-content/assets/app.extensions.json @@ -495,7 +495,7 @@ "order": 700, "component": "app.toolbar.toggleInfoDrawer", "rules": { - "visible": "canShowInfoDrawer" + "visible": ["canShowInfoDrawer", "app.navigation.isNotDetails"] } }, { @@ -1084,7 +1084,7 @@ "order": 500, "component": "app.toolbar.toggleInfoDrawer", "rules": { - "visible": "canShowInfoDrawer" + "visible": ["canShowInfoDrawer", "app.navigation.isNotDetails"] } }, { diff --git a/projects/aca-content/src/lib/aca-content.module.ts b/projects/aca-content/src/lib/aca-content.module.ts index 9d5587c4e..47e93d37f 100644 --- a/projects/aca-content/src/lib/aca-content.module.ts +++ b/projects/aca-content/src/lib/aca-content.module.ts @@ -223,6 +223,7 @@ export class ContentServiceExtensionModule { 'app.navigation.isSharedPreview': rules.isSharedPreview, 'app.navigation.isFavoritesPreview': rules.isFavoritesPreview, 'app.navigation.isSharedFileViewer': rules.isSharedFileViewer, + 'app.navigation.isNotDetails': rules.isNotDetails, 'repository.isQuickShareEnabled': rules.hasQuickShareEnabled, 'user.isAdmin': rules.isAdmin, diff --git a/projects/aca-content/src/lib/components/details/details.component.spec.ts b/projects/aca-content/src/lib/components/details/details.component.spec.ts index bcd964b8d..b3450c8e3 100644 --- a/projects/aca-content/src/lib/components/details/details.component.spec.ts +++ b/projects/aca-content/src/lib/components/details/details.component.spec.ts @@ -25,12 +25,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AppTestingModule } from '../../testing/app-testing.module'; import { DetailsComponent } from './details.component'; -import { ActivatedRoute, NavigationStart, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { BehaviorSubject, of, Subject } from 'rxjs'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { DefaultProjectorFn, MemoizedSelector, Store } from '@ngrx/store'; +import { Store } from '@ngrx/store'; import { ContentApiService } from '@alfresco/aca-shared'; -import { AppStore, isInfoDrawerOpened, NavigateToFolder, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; +import { NavigateToFolder, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; import { Node, NodeEntry, PathElement } from '@alfresco/js-api'; import { RouterTestingModule } from '@angular/router/testing'; import { AuthenticationService, CORE_PIPES, PageTitleService } from '@alfresco/adf-core'; @@ -258,45 +258,4 @@ describe('DetailsComponent', () => { component.setActiveTab('permissions'); expect(component.activeTab).not.toBe(2); }); - - describe('infoDrawerOpened$ event', () => { - let infoDrawerOpened$: Subject; - - beforeEach(() => { - infoDrawerOpened$ = new Subject(); - spyOn(store, 'select').and.callFake((mapFn: MemoizedSelector>) => - mapFn === isInfoDrawerOpened ? infoDrawerOpened$ : mockStream - ); - }); - - it('should dispatch store NavigateToPreviousPage by store if info drawer is closed', () => { - component.ngOnInit(); - - infoDrawerOpened$.next(false); - expect(storeMock.dispatch).toHaveBeenCalledWith(jasmine.any(NavigateToPreviousPage)); - }); - - it('should not dispatch store NavigateToPreviousPage by store if info drawer is opened', () => { - component.ngOnInit(); - - infoDrawerOpened$.next(true); - expect(storeMock.dispatch).not.toHaveBeenCalledWith(jasmine.any(NavigateToPreviousPage)); - }); - - it('should not dispatch store NavigateToPreviousPage by store if info drawer opening state is not changed', () => { - component.ngOnInit(); - - expect(storeMock.dispatch).not.toHaveBeenCalledWith(jasmine.any(NavigateToPreviousPage)); - }); - - it('should not dispatch store NavigateToPreviousPage by store if info drawer is closed but there occurred NavigationStart event', () => { - Object.defineProperty(TestBed.inject(Router), 'events', { - value: of(new NavigationStart(1, '')) - }); - component.ngOnInit(); - - infoDrawerOpened$.next(false); - expect(storeMock.dispatch).not.toHaveBeenCalledWith(jasmine.any(NavigateToPreviousPage)); - }); - }); }); diff --git a/projects/aca-content/src/lib/components/details/details.component.ts b/projects/aca-content/src/lib/components/details/details.component.ts index 80859daee..40c566640 100644 --- a/projects/aca-content/src/lib/components/details/details.component.ts +++ b/projects/aca-content/src/lib/components/details/details.component.ts @@ -23,10 +23,9 @@ */ import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import { ActivatedRoute, NavigationStart } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { ContentApiService, PageComponent, PageLayoutComponent, ToolbarComponent } from '@alfresco/aca-shared'; import { NavigateToFolder, NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; -import { merge, Subject } from 'rxjs'; import { BreadcrumbComponent, ContentService, NodesApiService, PermissionListComponent } from '@alfresco/adf-content-services'; import { CommonModule } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; @@ -37,7 +36,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MetadataTabComponent } from '../info-drawer/metadata-tab/metadata-tab.component'; import { CommentsTabComponent } from '../info-drawer/comments-tab/comments-tab.component'; import { NodeEntry, PathElement } from '@alfresco/js-api'; -import { first, takeUntil } from 'rxjs/operators'; +import { first } from 'rxjs/operators'; import { ContentActionRef } from '@alfresco/adf-extensions'; import { FileSizePipe, InfoDrawerButtonsDirective } from '@alfresco/adf-core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @@ -73,8 +72,6 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy nodeIcon: string; canManagePermissions = true; - private readonly onDestroy$: Subject = new Subject(); - constructor( private readonly route: ActivatedRoute, private readonly contentApi: ContentApiService, @@ -110,20 +107,6 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy .subscribe((aspectActions) => { this.aspectActions = aspectActions; }); - this.infoDrawerOpened$ - .pipe( - first((opened) => !opened), - takeUntil( - merge( - this.onDestroy$, - this.router.events.pipe( - first((event) => event instanceof NavigationStart), - takeUntil(this.onDestroy$) - ) - ) - ) - ) - .subscribe(() => this.goBack()); } setActiveTab(tabName: string) { @@ -153,8 +136,6 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy } ngOnDestroy(): void { - this.onDestroy$.next(); - this.onDestroy$.complete(); this.store.dispatch(new SetSelectedNodesAction([])); super.ngOnDestroy(); } diff --git a/projects/aca-shared/rules/src/app.rules.spec.ts b/projects/aca-shared/rules/src/app.rules.spec.ts index 1237dfe22..08abd82d4 100644 --- a/projects/aca-shared/rules/src/app.rules.spec.ts +++ b/projects/aca-shared/rules/src/app.rules.spec.ts @@ -1412,16 +1412,19 @@ describe('app.evaluators', () => { expect(app.canShowInfoDrawer(context)).toBeFalse(); }); - it('should return false when user is in libraries or trashcan', () => { + it('should return false when user is in libraries or trashcan or details', () => { context.selection.isEmpty = false; context.navigation.url = '/trashcan/test'; expect(app.canShowInfoDrawer(context)).toBeFalse(); context.navigation.url = '/test/libraries'; expect(app.canShowInfoDrawer(context)).toBeFalse(); + + context.navigation.url = '/test/details'; + expect(app.canShowInfoDrawer(context)).toBeFalse(); }); - it('should return true when selection exists and user is not in trashcan or libraries', () => { + it('should return true when selection exists and user is not in trashcan, libraries or details', () => { context.navigation.url = '/personal-files/test'; context.selection.isEmpty = false; expect(app.canShowInfoDrawer(context)).toBeTrue(); diff --git a/projects/aca-shared/rules/src/navigation.rules.spec.ts b/projects/aca-shared/rules/src/navigation.rules.spec.ts index ac0ad9132..8394e50c9 100644 --- a/projects/aca-shared/rules/src/navigation.rules.spec.ts +++ b/projects/aca-shared/rules/src/navigation.rules.spec.ts @@ -247,6 +247,28 @@ describe('navigation.evaluators', () => { }); }); + describe('isNotDetails', () => { + it('should return true if url does not include `/details`', () => { + const context: any = { + navigation: { + url: '/path' + } + }; + + expect(app.isNotDetails(context)).toBe(true); + }); + + it('should return false if url includes `/details`', () => { + const context: any = { + navigation: { + url: 'personal-files/details/path' + } + }; + + expect(app.isNotDetails(context)).toBe(false); + }); + }); + describe('isRecentFiles', () => { it('should return [true] if url starts with `/recent-files`', () => { const context: any = { diff --git a/projects/aca-shared/rules/src/navigation.rules.ts b/projects/aca-shared/rules/src/navigation.rules.ts index 7999f229f..869136ad0 100644 --- a/projects/aca-shared/rules/src/navigation.rules.ts +++ b/projects/aca-shared/rules/src/navigation.rules.ts @@ -115,6 +115,12 @@ export function isDetails(context: RuleContext): boolean { return url?.includes('/details'); } +/** + * Checks if the activated route is not **Details**. + * JSON ref: `app.navigation.isNotDetails` + */ +export const isNotDetails = (context: RuleContext): boolean => !isDetails(context); + /** * Checks if the activated route is neither **Libraries** nor **Library Search Results**. * JSON ref: `app.navigation.isNotLibraries`