From 3064c0fc9a750f5214d2b7971545233ac1726932 Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Fri, 1 Sep 2023 04:13:25 +0530 Subject: [PATCH 01/24] [ACS-5540] changes for edit aspect button --- projects/aca-content/assets/app.extensions.json | 12 ++++++++++++ .../metadata-tab/metadata-tab.component.ts | 14 ++++++++++++-- .../src/lib/ui/variables/variables.scss | 6 +++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/projects/aca-content/assets/app.extensions.json b/projects/aca-content/assets/app.extensions.json index 9c0d7fff4d..c65d769e9d 100644 --- a/projects/aca-content/assets/app.extensions.json +++ b/projects/aca-content/assets/app.extensions.json @@ -1240,6 +1240,18 @@ "visible": "showInfoSelectionButton" } }, + { + "id": "app.toolbar.aspects", + "order": 160, + "title": "APP.ACTIONS.CHANGE_ASPECT", + "icon": "playlist_add", + "actions": { + "click": "ASPECT_LIST" + }, + "rules": { + "visible": "canEditAspects" + } + }, { "id": "app.sidebar.expand", "order": 200, diff --git a/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts b/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts index dfcaad995f..f0fa0c66c4 100644 --- a/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts +++ b/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts @@ -39,14 +39,16 @@ import { Actions, ofType } from '@ngrx/effects'; imports: [CommonModule, ContentMetadataModule], selector: 'app-metadata-tab', template: ` - - + `, encapsulation: ViewEncapsulation.None, host: { class: 'app-metadata-tab' } @@ -57,6 +59,14 @@ export class MetadataTabComponent implements OnInit, OnDestroy { @Input() node: Node; + /** Display tags in the card **/ + @Input() + displayTags = true; + + /** Display categories in the card **/ + @Input() + displayCategories = true; + displayAspect$: Observable; canUpdateNode = false; editable = false; diff --git a/projects/aca-content/src/lib/ui/variables/variables.scss b/projects/aca-content/src/lib/ui/variables/variables.scss index 8a11c08041..a3d528e0f0 100644 --- a/projects/aca-content/src/lib/ui/variables/variables.scss +++ b/projects/aca-content/src/lib/ui/variables/variables.scss @@ -36,6 +36,8 @@ $page-layout-header-background-color: #fff; $search-chip-icon-color: #757575; $disabled-chip-background-color: #f5f5f5; $contrast-gray: #646569; +$adf-metadata-property-panel-border-color: rgba(0, 0, 0, 0.12); +$adf-metadata-buttons-background-color: rgba(33, 33, 33, 0.05); // CSS Variables $defaults: ( @@ -76,7 +78,9 @@ $defaults: ( --theme-page-layout-header-background-color: $page-layout-header-background-color, --theme-search-chip-icon-color: $search-chip-icon-color, --theme-disabled-chip-background-color: $disabled-chip-background-color, - --theme-contrast-gray: $contrast-gray + --theme-contrast-gray: $contrast-gray, + --adf-metadata-property-panel-border-color: $adf-metadata-property-panel-border-color, + --adf-metadata-buttons-background-color: $adf-metadata-buttons-background-color ); // propagates SCSS variables into the CSS variables scope From 6a7f8b5b654c1421b7b1fe865807ec0e536630ad Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Fri, 1 Sep 2023 14:29:30 +0530 Subject: [PATCH 02/24] added aspect edit button --- .../components/details/details.component.html | 25 +++++++++++++------ .../components/details/details.component.ts | 15 ++++++++--- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/projects/aca-content/src/lib/components/details/details.component.html b/projects/aca-content/src/lib/components/details/details.component.html index 2d9dda876a..0d553319f8 100644 --- a/projects/aca-content/src/lib/components/details/details.component.html +++ b/projects/aca-content/src/lib/components/details/details.component.html @@ -12,14 +12,23 @@ - {{ 'APP.INFO_DRAWER.TITLE' | translate }} - +
+ + +
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 a025c0409c..956ad8f544 100644 --- a/projects/aca-content/src/lib/components/details/details.component.ts +++ b/projects/aca-content/src/lib/components/details/details.component.ts @@ -22,12 +22,12 @@ * from Hyland Software. If not, see . */ -import { Component, OnInit, ViewEncapsulation, OnDestroy } from '@angular/core'; +import { Component, OnInit, ViewEncapsulation, OnDestroy, Input } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { ContentApiService, PageComponent, PageLayoutComponent, ToolbarComponent } from '@alfresco/aca-shared'; import { NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; import { Subject } from 'rxjs'; -import { BreadcrumbModule, PermissionManagerModule } from '@alfresco/adf-content-services'; +import { BreadcrumbModule, PermissionManagerModule, NodeAspectService } from '@alfresco/adf-content-services'; import { CommonModule } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { MatIconModule } from '@angular/material/icon'; @@ -59,12 +59,17 @@ import { CommentsTabComponent } from '../info-drawer/comments-tab/comments-tab.c encapsulation: ViewEncapsulation.None }) export class DetailsComponent extends PageComponent implements OnInit, OnDestroy { + @Input() + readOnly = false; + nodeId: string; isLoading: boolean; onDestroy$ = new Subject(); activeTab = 1; + editAspectSupported = false; + hasAllowableOperations = false; - constructor(private route: ActivatedRoute, private contentApi: ContentApiService) { + constructor(private route: ActivatedRoute, private contentApi: ContentApiService, private nodeAspectService: NodeAspectService) { super(); } @@ -105,6 +110,10 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy this.store.dispatch(new NavigateToPreviousPage()); } + openAspectDialog() { + this.nodeAspectService.updateNodeAspects(this.node.id); + } + ngOnDestroy(): void { this.store.dispatch(new SetSelectedNodesAction([])); this.onDestroy$.next(); From 3e435be1d0d1166b864d8678a25d9bc986680f4b Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Fri, 1 Sep 2023 15:09:42 +0530 Subject: [PATCH 03/24] [ACS-5540]fixed unit test cases and added unit test cases --- .../details/details.component.spec.ts | 18 ++++++++++++++++-- .../metadata-tab.component.spec.ts | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) 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 0988ca7033..280dcbb882 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 @@ -31,10 +31,10 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { Store } from '@ngrx/store'; import { ContentApiService } from '@alfresco/aca-shared'; import { STORE_INITIAL_APP_DATA, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; -import { NodeEntry } from '@alfresco/js-api'; +import { MinimalNodeEntryEntity, NodeEntry } from '@alfresco/js-api'; import { RouterTestingModule } from '@angular/router/testing'; import { AuthenticationService, PageTitleService } from '@alfresco/adf-core'; -import { SearchQueryBuilderService } from '@alfresco/adf-content-services'; +import { NodeAspectService, SearchQueryBuilderService } from '@alfresco/adf-content-services'; describe('DetailsComponent', () => { let component: DetailsComponent; @@ -42,6 +42,7 @@ describe('DetailsComponent', () => { let contentApiService: ContentApiService; let store: Store; let node: NodeEntry; + let mockNodeAspectService: jasmine.SpyObj; const mockStream = new Subject(); const storeMock = { @@ -50,6 +51,7 @@ describe('DetailsComponent', () => { }; beforeEach(() => { + const nodeAspectServiceSpy = jasmine.createSpyObj('NodeAspectService', ['updateNodeAspects']); TestBed.configureTestingModule({ imports: [AppTestingModule, DetailsComponent], providers: [ @@ -78,6 +80,10 @@ describe('DetailsComponent', () => { onLogout: new Subject(), isLoggedIn: () => true } + }, + { + provide: NodeAspectService, + useValue: nodeAspectServiceSpy } ], schemas: [NO_ERRORS_SCHEMA] @@ -86,6 +92,8 @@ describe('DetailsComponent', () => { fixture = TestBed.createComponent(DetailsComponent); component = fixture.componentInstance; contentApiService = TestBed.inject(ContentApiService); + mockNodeAspectService = TestBed.inject(NodeAspectService) as jasmine.SpyObj; + component.node = { id: 'test-id' } as MinimalNodeEntryEntity; store = TestBed.inject(Store); node = { @@ -128,4 +136,10 @@ describe('DetailsComponent', () => { fixture.detectChanges(); expect(store.dispatch).toHaveBeenCalledWith(new SetSelectedNodesAction([node])); }); + + it('should call openAspectDialog and updateNodeAspects when the button is clicked', () => { + component.openAspectDialog(); + fixture.detectChanges(); + expect(mockNodeAspectService.updateNodeAspects).toHaveBeenCalledWith('test-id'); + }); }); diff --git a/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.spec.ts b/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.spec.ts index f990d7b3d5..4d01789afc 100644 --- a/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.spec.ts +++ b/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.spec.ts @@ -256,7 +256,7 @@ describe('MetadataTabComponent', () => { }); it('show pass empty when store is in initial state', () => { - const initialState = fixture.debugElement.query(By.css('adf-content-metadata-card')); + const initialState = fixture.debugElement.query(By.css('adf-content-metadata')); expect(initialState.componentInstance.displayAspect).toBeFalsy(); }); @@ -266,7 +266,7 @@ describe('MetadataTabComponent', () => { expect(aspect).toBe('EXIF'); }); fixture.detectChanges(); - const initialState = fixture.debugElement.query(By.css('adf-content-metadata-card')); + const initialState = fixture.debugElement.query(By.css('adf-content-metadata')); expect(initialState.componentInstance.displayAspect).toBe('EXIF'); }); }); From bcd2d1c1476092b7d9d7d84fd64a6fb2c91789a8 Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Tue, 5 Sep 2023 21:22:45 +0530 Subject: [PATCH 04/24] [ACS-5540] Modified changes --- .../components/details/details.component.html | 2 +- .../components/details/details.component.ts | 25 +++++++++++++++---- .../toggle-edit-offline.component.ts | 5 +++- .../src/lib/services/node-actions.service.ts | 15 +++++++++-- .../ui/overrides/adf-style-fixes.theme.scss | 19 ++++++++++++++ .../src/lib/ui/variables/variables.scss | 4 ++- 6 files changed, 60 insertions(+), 10 deletions(-) diff --git a/projects/aca-content/src/lib/components/details/details.component.html b/projects/aca-content/src/lib/components/details/details.component.html index 0d553319f8..ff3378f3a3 100644 --- a/projects/aca-content/src/lib/components/details/details.component.html +++ b/projects/aca-content/src/lib/components/details/details.component.html @@ -13,7 +13,7 @@ {{ 'APP.INFO_DRAWER.TITLE' | translate }}
-
-
- -
diff --git a/projects/aca-content/src/lib/components/details/details.component.scss b/projects/aca-content/src/lib/components/details/details.component.scss index 778bead773..de481d4647 100644 --- a/projects/aca-content/src/lib/components/details/details.component.scss +++ b/projects/aca-content/src/lib/components/details/details.component.scss @@ -1,19 +1,29 @@ app-details-manager { - .aca-close-details-button { - margin-right: 15px; - margin-top: 2px; - outline: none; - border-radius: 4px; - - &:focus { - background-color: var(--theme-selected-background-color); - outline: 2px solid var(--theme-blue-button-color); - border-radius: 4px; - } + .acs-details-buttons { + display: flex; - &:focus-visible { - outline: 2px solid var(--theme-blue-button-color); + .aca-close-details-button { + margin-right: 15px; + margin-top: 2px; + outline: none; border-radius: 4px; + + &:focus { + background-color: var(--theme-selected-background-color); + outline: 2px solid var(--theme-blue-button-color); + border-radius: 4px; + } + + &:focus-visible { + outline: 2px solid var(--theme-blue-button-color); + border-radius: 4px; + margin-top: 12px; + + &:focus-visible { + outline: 2px solid var(--theme-blue-button-color); + border-radius: 4px; + } + } } } } 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 264445fbe4..0988ca7033 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 @@ -31,10 +31,10 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { Store } from '@ngrx/store'; import { ContentApiService } from '@alfresco/aca-shared'; import { STORE_INITIAL_APP_DATA, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; -import { Node, NodeEntry } from '@alfresco/js-api'; +import { NodeEntry } from '@alfresco/js-api'; import { RouterTestingModule } from '@angular/router/testing'; import { AuthenticationService, PageTitleService } from '@alfresco/adf-core'; -import { NodeAspectService, SearchQueryBuilderService } from '@alfresco/adf-content-services'; +import { SearchQueryBuilderService } from '@alfresco/adf-content-services'; describe('DetailsComponent', () => { let component: DetailsComponent; @@ -42,7 +42,6 @@ describe('DetailsComponent', () => { let contentApiService: ContentApiService; let store: Store; let node: NodeEntry; - let nodeAspectService: NodeAspectService; const mockStream = new Subject(); const storeMock = { @@ -87,8 +86,6 @@ describe('DetailsComponent', () => { fixture = TestBed.createComponent(DetailsComponent); component = fixture.componentInstance; contentApiService = TestBed.inject(ContentApiService); - nodeAspectService = TestBed.inject(NodeAspectService); - component.node = { id: 'test-id' } as Node; store = TestBed.inject(Store); node = { @@ -106,7 +103,6 @@ describe('DetailsComponent', () => { } }; spyOn(contentApiService, 'getNode').and.returnValue(of(node)); - spyOn(nodeAspectService, 'updateNodeAspects'); }); afterEach(() => { @@ -132,26 +128,4 @@ describe('DetailsComponent', () => { fixture.detectChanges(); expect(store.dispatch).toHaveBeenCalledWith(new SetSelectedNodesAction([node])); }); - - it('should call updateNodeAspects when the aspect dialog is opened', () => { - component.openAspectDialog(); - fixture.detectChanges(); - expect(nodeAspectService.updateNodeAspects).toHaveBeenCalledWith('test-id'); - }); - - it('should subscribe to store and update isNodeLocked', () => { - const mockSelection = { file: { entry: { name: 'test', properties: {}, isLocked: false } } }; - spyOn(store, 'select').and.returnValue(of(mockSelection)); - fixture.detectChanges(); - expect(store.select).toHaveBeenCalled(); - expect(component.isNodeLocked).toBe(false); - }); - - it('should unsubscribe from observables on component destroy', () => { - spyOn(component.onDestroy$, 'next'); - spyOn(component.onDestroy$, 'complete'); - fixture.detectChanges(); - component.ngOnDestroy(); - expect(component.onDestroy$.complete).toHaveBeenCalled(); - }); }); 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 d454acac10..567d7c816c 100644 --- a/projects/aca-content/src/lib/components/details/details.component.ts +++ b/projects/aca-content/src/lib/components/details/details.component.ts @@ -22,12 +22,12 @@ * from Hyland Software. If not, see . */ -import { Component, OnInit, ViewEncapsulation, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { Component, OnInit, ViewEncapsulation, OnDestroy } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { ContentApiService, PageComponent, PageLayoutComponent, ToolbarComponent, isLocked } from '@alfresco/aca-shared'; -import { NavigateToPreviousPage, SetSelectedNodesAction, getAppSelection } from '@alfresco/aca-shared/store'; +import { ContentApiService, PageComponent, PageLayoutComponent, ToolbarComponent } from '@alfresco/aca-shared'; +import { NavigateToPreviousPage, SetSelectedNodesAction } from '@alfresco/aca-shared/store'; import { Subject } from 'rxjs'; -import { BreadcrumbModule, PermissionManagerModule, NodeAspectService } from '@alfresco/adf-content-services'; +import { BreadcrumbModule, PermissionManagerModule } from '@alfresco/adf-content-services'; import { CommonModule } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { MatIconModule } from '@angular/material/icon'; @@ -36,9 +36,8 @@ import { MatProgressBarModule } from '@angular/material/progress-bar'; 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 { NodeActionsService } from '../../services/node-actions.service'; -import { NodeEntry } from '@alfresco/js-api'; import { takeUntil } from 'rxjs/operators'; +import { ContentActionRef } from '@alfresco/adf-extensions'; @Component({ standalone: true, @@ -66,16 +65,9 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy isLoading: boolean; onDestroy$ = new Subject(); activeTab = 1; - selectionState: NodeEntry; - isNodeLocked = false; + actionsAspect: Array = []; - constructor( - private route: ActivatedRoute, - private contentApi: ContentApiService, - private nodeAspectService: NodeAspectService, - private nodeActionsService: NodeActionsService, - private cdr: ChangeDetectorRef - ) { + constructor(private route: ActivatedRoute, private contentApi: ContentApiService) { super(); } @@ -96,14 +88,12 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy this.store.dispatch(new SetSelectedNodesAction([{ entry: this.node }])); }); }); - this.store.select(getAppSelection).subscribe(({ file }) => { - this.selectionState = file; - const isNodeLockedFromStore = this.selection && isLocked(this.selectionState); - this.nodeActionsService.isNodeLocked$.pipe(takeUntil(this.onDestroy$)).subscribe((isNodeLockedFromService) => { - this.isNodeLocked = isNodeLockedFromStore || isNodeLockedFromService; - this.cdr.detectChanges(); + this.extensions + .getAllowedSidebarActions() + .pipe(takeUntil(this.onDestroy$)) + .subscribe((actionsAspect) => { + this.actionsAspect = actionsAspect; }); - }); } setActiveTab(tabName: string) { @@ -124,10 +114,6 @@ export class DetailsComponent extends PageComponent implements OnInit, OnDestroy this.store.dispatch(new NavigateToPreviousPage()); } - openAspectDialog() { - this.nodeAspectService.updateNodeAspects(this.node.id); - } - ngOnDestroy(): void { this.store.dispatch(new SetSelectedNodesAction([])); this.onDestroy$.next(); diff --git a/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.spec.ts b/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.spec.ts index 11a3c38227..e061c2a599 100644 --- a/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.spec.ts +++ b/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.spec.ts @@ -26,10 +26,9 @@ import { ToggleEditOfflineComponent } from './toggle-edit-offline.component'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { of } from 'rxjs'; import { Store } from '@ngrx/store'; -import { NodeEntry, NodesApi } from '@alfresco/js-api'; +import { NodeEntry } from '@alfresco/js-api'; import { DownloadNodesAction, EditOfflineAction, SnackbarErrorAction } from '@alfresco/aca-shared/store'; import { AppTestingModule } from '../../../testing/app-testing.module'; -import { NodeActionsService } from '../../../services/node-actions.service'; describe('ToggleEditOfflineComponent', () => { let fixture: ComponentFixture; @@ -39,49 +38,6 @@ describe('ToggleEditOfflineComponent', () => { let selectSpy: jasmine.Spy; let selection: any; - const lockedNodeEntry: NodeEntry = { - entry: { - isFile: true, - createdByUser: { - id: 'hruser', - displayName: 'hruser' - }, - modifiedAt: new Date('2023-09-08T11:54:48.325+0000'), - nodeType: 'cm:content', - content: { - mimeType: 'image/jpeg', - mimeTypeName: 'JPEG Image', - sizeInBytes: 128473, - encoding: 'UTF-8' - }, - parentId: '5a2d88ec-a29c-408a-874d-6394940c51d7', - aspectNames: ['cm:versionable', 'cm:lockable', 'cm:auditable', 'cm:taggable', 'exif:exif'], - createdAt: new Date('2023-09-07T11:10:48.788+0000'), - isFolder: false, - modifiedByUser: { - id: 'hruser', - displayName: 'hruser' - }, - name: 'e2e_favorite_file.jpg', - id: '36e5b5ad-3fa0-47e2-b256-016b868ac772', - properties: { - 'cm:lockType': 'WRITE_LOCK', - 'cm:lockOwner': { - id: 'hruser', - displayName: 'hruser' - }, - 'cm:versionType': 'MAJOR', - 'cm:versionLabel': '1.0', - 'cm:lockLifetime': 'PERSISTENT', - 'exif:pixelYDimension': 1253, - 'exif:pixelXDimension': 1024 - } - } - }; - - const nodesApiMock = jasmine.createSpyObj('nodesApi', ['lockNode', 'unlockNode']); - const nodeActionsServiceMock = jasmine.createSpyObj('nodeActionsService', ['setNodeLocked']); - beforeEach(() => { TestBed.configureTestingModule({ imports: [AppTestingModule, ToggleEditOfflineComponent], @@ -92,9 +48,7 @@ describe('ToggleEditOfflineComponent', () => { select: () => {}, dispatch: () => {} } - }, - { provide: NodesApi, useValue: nodesApiMock }, - { provide: NodeActionsService, useValue: nodeActionsServiceMock } + } ] }); @@ -179,51 +133,4 @@ describe('ToggleEditOfflineComponent', () => { }) ]); }); - - it('should call setNodeLocked with true when a node is locked', () => { - const nodeId = 'testNode1'; - nodesApiMock.lockNode.and.returnValue(Promise.resolve(lockedNodeEntry)); - - component.lockNode(nodeId).then((result) => { - expect(nodesApiMock.lockNode).toHaveBeenCalledWith(nodeId, { - type: 'ALLOW_OWNER_CHANGES', - lifetime: 'PERSISTENT' - }); - expect(nodeActionsServiceMock.setNodeLocked).toHaveBeenCalledWith(true); - expect(result).toEqual(lockedNodeEntry); - }); - }); - - it('should call setNodeLocked with false when a node is unlocked', () => { - const nodeId = 'testNode2'; - nodesApiMock.unlockNode.and.returnValue(Promise.resolve(lockedNodeEntry)); - - component.unlockNode(nodeId).then((result) => { - expect(nodesApiMock.unlockNode).toHaveBeenCalledWith(nodeId); - expect(nodeActionsServiceMock.setNodeLocked).toHaveBeenCalledWith(false); - expect(result).toEqual(lockedNodeEntry); - }); - }); - - it('should handle errors when locking a node encounters an error', () => { - const nodeId = 'testNode1'; - const error = new Error('Locking failed'); - nodesApiMock.lockNode.and.returnValue(Promise.reject(error)); - component.lockNode(nodeId).catch((err) => { - expect(nodesApiMock.lockNode).toHaveBeenCalledWith(nodeId, { type: 'ALLOW_OWNER_CHANGES', lifetime: 'PERSISTENT' }); - expect(nodeActionsServiceMock.setNodeLocked).not.toHaveBeenCalled(); - expect(err).toEqual(error); - }); - }); - - it('should handle errors when unlocking a node encounters an error', () => { - const nodeId = 'testNode1'; - const error = new Error('Unlocking failed'); - nodesApiMock.unlockNode.and.returnValue(Promise.reject(error)); - component.unlockNode(nodeId).catch((err) => { - expect(nodesApiMock.lockNode).toHaveBeenCalledWith(nodeId); - expect(nodeActionsServiceMock.setNodeLocked).not.toHaveBeenCalled(); - expect(err).toEqual(error); - }); - }); }); diff --git a/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.ts b/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.ts index a01f6e5f53..40410b94b5 100644 --- a/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.ts +++ b/projects/aca-content/src/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.ts @@ -31,7 +31,7 @@ import { getAppSelection } from '@alfresco/aca-shared/store'; import { NodeEntry, SharedLinkEntry, Node, NodesApi } from '@alfresco/js-api'; -import { ChangeDetectorRef, Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppExtensionService, isLocked } from '@alfresco/aca-shared'; import { AlfrescoApiService } from '@alfresco/adf-core'; @@ -39,7 +39,6 @@ import { CommonModule } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { MatMenuModule } from '@angular/material/menu'; import { MatIconModule } from '@angular/material/icon'; -import { NodeActionsService } from '../../../services/node-actions.service'; @Component({ standalone: true, @@ -60,13 +59,7 @@ export class ToggleEditOfflineComponent implements OnInit { nodeTitle = ''; isNodeLocked = false; - constructor( - private store: Store, - private alfrescoApiService: AlfrescoApiService, - private nodeActionsService: NodeActionsService, - private cdr: ChangeDetectorRef, - private extensions: AppExtensionService - ) { + constructor(private store: Store, private alfrescoApiService: AlfrescoApiService, private extensions: AppExtensionService) { this.nodesApi = new NodesApi(this.alfrescoApiService.getInstance()); } @@ -75,7 +68,6 @@ export class ToggleEditOfflineComponent implements OnInit { this.selection = file; this.isNodeLocked = this.selection && isLocked(this.selection); this.nodeTitle = this.isNodeLocked ? 'APP.ACTIONS.EDIT_OFFLINE_CANCEL' : 'APP.ACTIONS.EDIT_OFFLINE'; - this.cdr.detectChanges(); }); } @@ -127,27 +119,15 @@ export class ToggleEditOfflineComponent implements OnInit { ); } - lockNode(nodeId: string): Promise { - return this.nodesApi.lockNode(nodeId, { type: 'ALLOW_OWNER_CHANGES', lifetime: 'PERSISTENT' }).then( - (res: NodeEntry) => { - this.nodeActionsService.setNodeLocked(true); - return res; - }, - (error) => { - return error; - } - ); + lockNode(nodeId: string) { + return this.nodesApi.lockNode(nodeId, { + type: 'ALLOW_OWNER_CHANGES', + lifetime: 'PERSISTENT' + }); } - unlockNode(nodeId: string): Promise { - return this.nodesApi.unlockNode(nodeId).then( - (res: NodeEntry) => { - this.nodeActionsService.setNodeLocked(false); - return res; - }, - (error) => { - return error; - } - ); + + unlockNode(nodeId: string) { + return this.nodesApi.unlockNode(nodeId); } private update(data: Node) { diff --git a/projects/aca-content/src/lib/services/node-actions.service.ts b/projects/aca-content/src/lib/services/node-actions.service.ts index 382f5c9748..2485867783 100644 --- a/projects/aca-content/src/lib/services/node-actions.service.ts +++ b/projects/aca-content/src/lib/services/node-actions.service.ts @@ -24,7 +24,7 @@ import { Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { Observable, Subject, of, zip, from, BehaviorSubject } from 'rxjs'; +import { Observable, Subject, of, zip, from } from 'rxjs'; import { AlfrescoApiService, TranslationService, ThumbnailService } from '@alfresco/adf-core'; import { DocumentListService, @@ -49,7 +49,6 @@ export class NodeActionsService { contentMoved: Subject = new Subject(); moveDeletedEntries: any[] = []; isSitesDestinationAvailable = false; - private isNodeLockedSubject = new BehaviorSubject(false); isNodeLocked$: Observable; _nodesApi: NodesApi; @@ -66,9 +65,7 @@ export class NodeActionsService { private apiService: AlfrescoApiService, private translation: TranslationService, private thumbnailService: ThumbnailService - ) { - this.isNodeLocked$ = this.isNodeLockedSubject.asObservable(); - } + ) {} /** * Copy node list @@ -92,10 +89,6 @@ export class NodeActionsService { return this.doBatchOperation(NodeAction.MOVE, contentEntities, permission, focusedElementOnCloseSelector); } - setNodeLocked(isLocked: boolean) { - this.isNodeLockedSubject.next(isLocked); - } - /** * General method for performing the given operation (copy|move) to multiple nodes * diff --git a/projects/aca-shared/rules/src/app.rules.ts b/projects/aca-shared/rules/src/app.rules.ts index 71333f4bc6..ef23e53556 100644 --- a/projects/aca-shared/rules/src/app.rules.ts +++ b/projects/aca-shared/rules/src/app.rules.ts @@ -511,6 +511,8 @@ export const canEditAspects = (context: RuleContext): boolean => repository.isMajorVersionAvailable(context, '7') ].every(Boolean); +export const canNotShowExpand = (context: RuleContext): boolean => [!navigation.isLibraries(context), !navigation.isDetails(context)].every(Boolean); + /** * Checks if user can manage permissions for the selected node. * JSON ref: `canManagePermissions` diff --git a/projects/aca-shared/rules/src/navigation.rules.ts b/projects/aca-shared/rules/src/navigation.rules.ts index 02d6a6df93..5a3c5569cf 100644 --- a/projects/aca-shared/rules/src/navigation.rules.ts +++ b/projects/aca-shared/rules/src/navigation.rules.ts @@ -110,6 +110,11 @@ export function isLibraryContent(context: RuleContext): boolean { return url && (url.endsWith('/libraries') || url.includes('/libraries/') || url.startsWith('/search-libraries')); } +export function isDetails(context: RuleContext): boolean { + const { url } = context.navigation; + return url && (url.endsWith('/details') || url.includes('/details/') || url.startsWith('/details')); +} + /** * Checks if the activated route is neither **Libraries** nor **Library Search Results**. * JSON ref: `app.navigation.isNotLibraries` From 5121ad09c062a7c5855fbb22f3d82ec9d882b8cb Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Wed, 13 Sep 2023 12:34:57 +0530 Subject: [PATCH 12/24] [ACS-5540] modified the changes --- .../src/lib/components/details/details.component.html | 2 +- .../src/lib/components/details/details.component.ts | 6 +++--- .../aca-content/src/lib/services/node-actions.service.ts | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/projects/aca-content/src/lib/components/details/details.component.html b/projects/aca-content/src/lib/components/details/details.component.html index afcde3c44d..18dc2c3b13 100644 --- a/projects/aca-content/src/lib/components/details/details.component.html +++ b/projects/aca-content/src/lib/components/details/details.component.html @@ -13,7 +13,7 @@ {{ 'APP.INFO_DRAWER.TITLE' | translate }}
- +
-
From ed561bcf8b2185adf105b5e8fd6add6430f6b17c Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Fri, 22 Sep 2023 09:57:33 +0530 Subject: [PATCH 18/24] [ACS-5540]Implemented the changes as per the review comments --- projects/aca-shared/rules/src/navigation.rules.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/aca-shared/rules/src/navigation.rules.spec.ts b/projects/aca-shared/rules/src/navigation.rules.spec.ts index 5f7941f177..44f43e8e7f 100644 --- a/projects/aca-shared/rules/src/navigation.rules.spec.ts +++ b/projects/aca-shared/rules/src/navigation.rules.spec.ts @@ -226,7 +226,7 @@ describe('navigation.evaluators', () => { }); describe('isDetails', () => { - it('should return [true] if url ends with `/details`', () => { + it('should return true if url ends with `/details`', () => { const context: any = { navigation: { url: '/path/details' @@ -236,7 +236,7 @@ describe('navigation.evaluators', () => { expect(app.isDetails(context)).toBe(true); }); - it('should return [true] if url starts with `/details`', () => { + it('should return true if url starts with `/details`', () => { const context: any = { navigation: { url: '/details/path' @@ -246,7 +246,7 @@ describe('navigation.evaluators', () => { expect(app.isDetails(context)).toBe(true); }); - it('should return [true] if url includes with `/details`', () => { + it('should return true if url includes with `/details`', () => { const context: any = { navigation: { url: '/details/path' From c38a0460b8e3c36a0c66bd04fc3ca4e3aa7d184d Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Fri, 22 Sep 2023 20:56:13 +0530 Subject: [PATCH 19/24] [ACS-5540] added group lock changes --- .../info-drawer/metadata-tab/metadata-tab.component.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts b/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts index 34f125ddb8..2a5654fae3 100644 --- a/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts +++ b/projects/aca-content/src/lib/components/info-drawer/metadata-tab/metadata-tab.component.ts @@ -49,6 +49,7 @@ import { Actions, ofType } from '@ngrx/effects'; [(editable)]="editable" [(editableTags)]="editableTags" [(editableCategories)]="editableCategories" + [(group)]="group" > `, @@ -65,6 +66,9 @@ export class MetadataTabComponent implements OnInit, OnDestroy { editable = false; editableTags = false; editableCategories = false; + group: any = { + editable: false + }; constructor( private permission: NodePermissionService, @@ -98,6 +102,7 @@ export class MetadataTabComponent implements OnInit, OnDestroy { this.editable = false; this.editableTags = false; this.editableCategories = false; + this.group.editable = false; } }); } From f4005753786d191388e953381fbd4543c4672920 Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Mon, 25 Sep 2023 15:16:46 +0530 Subject: [PATCH 20/24] [ACS-5540] added tooltip --- projects/aca-content/assets/app.extensions.json | 2 +- projects/aca-content/assets/i18n/en.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/projects/aca-content/assets/app.extensions.json b/projects/aca-content/assets/app.extensions.json index 144023805a..51de285a05 100644 --- a/projects/aca-content/assets/app.extensions.json +++ b/projects/aca-content/assets/app.extensions.json @@ -1243,7 +1243,7 @@ { "id": "app.toolbar.aspects", "order": 160, - "title": "APP.ACTIONS.CHANGE_ASPECT", + "title": "APP.ACTIONS.ADD_ASPECTS", "icon": "playlist_add", "actions": { "click": "ASPECT_LIST" diff --git a/projects/aca-content/assets/i18n/en.json b/projects/aca-content/assets/i18n/en.json index bab98e67e3..0c07008e4e 100644 --- a/projects/aca-content/assets/i18n/en.json +++ b/projects/aca-content/assets/i18n/en.json @@ -259,7 +259,8 @@ "LEAVE": "Leave Library", "EDIT_OFFLINE": "Edit Offline", "EDIT_OFFLINE_CANCEL": "Cancel Editing", - "CHANGE_ASPECT": "Edit Aspects" + "CHANGE_ASPECT": "Edit Aspects", + "ADD_ASPECTS": "Add Aspects" }, "DIALOGS": { "CONFIRM_PURGE": { From 1116dfd3aeb41fcb5c3dcb30d07ffda696686dbd Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Thu, 28 Sep 2023 11:19:39 +0530 Subject: [PATCH 21/24] [ACS-5540] Implemented the review comments --- .../components/details/details.component.scss | 2 +- .../rules/src/navigation.rules.spec.ts | 18 ++++-------------- .../aca-shared/rules/src/navigation.rules.ts | 2 +- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/projects/aca-content/src/lib/components/details/details.component.scss b/projects/aca-content/src/lib/components/details/details.component.scss index de481d4647..4e76575e86 100644 --- a/projects/aca-content/src/lib/components/details/details.component.scss +++ b/projects/aca-content/src/lib/components/details/details.component.scss @@ -4,7 +4,7 @@ app-details-manager { .aca-close-details-button { margin-right: 15px; - margin-top: 2px; + margin-top: 12px; outline: none; border-radius: 4px; diff --git a/projects/aca-shared/rules/src/navigation.rules.spec.ts b/projects/aca-shared/rules/src/navigation.rules.spec.ts index 44f43e8e7f..9582223e44 100644 --- a/projects/aca-shared/rules/src/navigation.rules.spec.ts +++ b/projects/aca-shared/rules/src/navigation.rules.spec.ts @@ -226,17 +226,7 @@ describe('navigation.evaluators', () => { }); describe('isDetails', () => { - it('should return true if url ends with `/details`', () => { - const context: any = { - navigation: { - url: '/path/details' - } - }; - - expect(app.isDetails(context)).toBe(true); - }); - - it('should return true if url starts with `/details`', () => { + it('should return true if url includes with `/details`', () => { const context: any = { navigation: { url: '/details/path' @@ -246,14 +236,14 @@ describe('navigation.evaluators', () => { expect(app.isDetails(context)).toBe(true); }); - it('should return true if url includes with `/details`', () => { + it('should return false if url not includes with `/details`', () => { const context: any = { navigation: { - url: '/details/path' + url: '/path' } }; - expect(app.isDetails(context)).toBe(true); + expect(app.isDetails(context)).toBe(false); }); }); diff --git a/projects/aca-shared/rules/src/navigation.rules.ts b/projects/aca-shared/rules/src/navigation.rules.ts index 5a3c5569cf..a26d8a2366 100644 --- a/projects/aca-shared/rules/src/navigation.rules.ts +++ b/projects/aca-shared/rules/src/navigation.rules.ts @@ -112,7 +112,7 @@ export function isLibraryContent(context: RuleContext): boolean { export function isDetails(context: RuleContext): boolean { const { url } = context.navigation; - return url && (url.endsWith('/details') || url.includes('/details/') || url.startsWith('/details')); + return url?.includes('/details'); } /** From fab07b9a9bdf2170e4239e29625db8bcee7ba489 Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Thu, 28 Sep 2023 17:51:28 +0530 Subject: [PATCH 22/24] [ACS-5540] added tooltips --- projects/aca-content/assets/i18n/en.json | 4 ++-- .../src/lib/components/details/details.component.html | 2 +- projects/aca-content/src/lib/ui/variables/variables.scss | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/projects/aca-content/assets/i18n/en.json b/projects/aca-content/assets/i18n/en.json index 0c07008e4e..faf977f981 100644 --- a/projects/aca-content/assets/i18n/en.json +++ b/projects/aca-content/assets/i18n/en.json @@ -395,7 +395,7 @@ }, "INFO_DRAWER": { "TITLE": "Details", - "CLOSE": "Close", + "REDUCE_PANEL": "Reduce panel", "DATA_LOADING": "Data is loading", "TABS": { "PROPERTIES": "Properties", @@ -403,7 +403,7 @@ "VERSIONS": "Versions", "COMMENTS": "Comments", "PERMISSIONS": "Permissions", - "EXPAND": "Expand" + "EXPAND": "Expand panel" } }, "TOOLTIPS": { diff --git a/projects/aca-content/src/lib/components/details/details.component.html b/projects/aca-content/src/lib/components/details/details.component.html index 7ba883cee6..d2b2b752b5 100644 --- a/projects/aca-content/src/lib/components/details/details.component.html +++ b/projects/aca-content/src/lib/components/details/details.component.html @@ -18,7 +18,7 @@ class="aca-close-details-button" mat-icon-button data-automation-id="close-library" - title="{{ 'APP.INFO_DRAWER.CLOSE' | translate }}" + title="{{ 'APP.INFO_DRAWER.REDUCE_PANEL' | translate }}" (click)="goBack()"> fullscreen_exit diff --git a/projects/aca-content/src/lib/ui/variables/variables.scss b/projects/aca-content/src/lib/ui/variables/variables.scss index 8e4c0be6d9..45bcc8ecd8 100644 --- a/projects/aca-content/src/lib/ui/variables/variables.scss +++ b/projects/aca-content/src/lib/ui/variables/variables.scss @@ -38,6 +38,7 @@ $disabled-chip-background-color: #f5f5f5; $contrast-gray: #646569; $metadata-property-panel-border-color: rgba(0, 0, 0, 0.12); $metadata-buttons-background-color: rgba(33, 33, 33, 0.05); +$metadata-action-button-clear-color: #212328b2; // CSS Variables $defaults: ( @@ -80,7 +81,8 @@ $defaults: ( --theme-disabled-chip-background-color: $disabled-chip-background-color, --theme-contrast-gray: $contrast-gray, --theme-metadata-property-panel-border-color: $metadata-property-panel-border-color, - --theme-metadata-buttons-background-color: $metadata-buttons-background-color + --theme-metadata-buttons-background-color: $metadata-buttons-background-color, + --theme-metadata-action-button-clear-color: $metadata-action-button-clear-color ); // propagates SCSS variables into the CSS variables scope From 627c953ed0c50736cafc98d9352921c23fe016f9 Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Tue, 3 Oct 2023 21:35:48 +0530 Subject: [PATCH 23/24] [ACS-5540] Added styles --- .../src/lib/ui/overrides/adf-style-fixes.theme.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss b/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss index fc30adc81a..f96504711a 100644 --- a/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss +++ b/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss @@ -27,6 +27,10 @@ border: 1px solid var(--theme-metadata-property-panel-border-color); margin: 24px; border-radius: 12px; + + .adf-metadata-properties-group-title { + width: 548px; + } } } } From 0559405f183abf13a17d1a3e15bc5044aca443b3 Mon Sep 17 00:00:00 2001 From: Yasa-Nataliya Date: Wed, 4 Oct 2023 12:02:27 +0530 Subject: [PATCH 24/24] [ACS-5540]Added focus --- .../src/lib/ui/overrides/adf-style-fixes.theme.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss b/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss index f96504711a..0daf5ea047 100644 --- a/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss +++ b/projects/aca-content/src/lib/ui/overrides/adf-style-fixes.theme.scss @@ -17,6 +17,10 @@ border: 1px solid var(--theme-metadata-property-panel-border-color); border-radius: 12px; margin-bottom: 12px; + + .mat-expansion-panel-header { + border-radius: 12px; + } } .acs-details-container { @@ -28,6 +32,10 @@ margin: 24px; border-radius: 12px; + .mat-expansion-panel-header { + border-radius: 12px; + } + .adf-metadata-properties-group-title { width: 548px; }