diff --git a/demo-shell/src/app/components/permissions/demo-permissions.component.ts b/demo-shell/src/app/components/permissions/demo-permissions.component.ts index 49455b8c51..87576ec947 100644 --- a/demo-shell/src/app/components/permissions/demo-permissions.component.ts +++ b/demo-shell/src/app/components/permissions/demo-permissions.component.ts @@ -73,7 +73,7 @@ export class DemoPermissionComponent implements OnInit { showErrorMessage(error) { this.notificationService.openSnackMessage( - JSON.parse(error.response.text).error.errorKey, + error, 4000 ); } diff --git a/docs/content-services/add-permission-panel.component.md b/docs/content-services/add-permission-panel.component.md index c5126feaa6..479e7bd0bb 100644 --- a/docs/content-services/add-permission-panel.component.md +++ b/docs/content-services/add-permission-panel.component.md @@ -1,12 +1,12 @@ --- Added: v2.4.0 Status: Active -Last reviewed: 2018-05-04 +Last reviewed: 2018-05-03 --- # Add Permission Component -Searches for people or groups to add to the current node permissions. +Allow user to search people or group that could be added to the current node permissions. ![Add Permission Component](../docassets/images/add-permission-component.png) @@ -14,20 +14,24 @@ Searches for people or groups to add to the current node permissions. ```html + (success)="onSuccess($event)" (error)="onError($event)"> ``` ## Class members +### Properties + +| Name | Type | Default value | Description | +| -- | -- | -- | -- | + ### Events | Name | Type | Description | | -- | -- | -- | -| select | `EventEmitter` | Emitted when a permission list item is selected. | +| select | `EventEmitter` | | ## Details - This component uses a [Search component](../search.component.md) to retrieve the groups and people that could be added to the permission list of the current node. -The `select` event is emitted when a result is clicked from the list. +The `select` event will be emitted when a result is clicked from the list. \ No newline at end of file diff --git a/lib/content-services/i18n/en.json b/lib/content-services/i18n/en.json index 646c62b803..fdeb118602 100644 --- a/lib/content-services/i18n/en.json +++ b/lib/content-services/i18n/en.json @@ -264,14 +264,17 @@ "ROLE": "Role", "LOCALLY_SET": "Locally set", "NO_PERMISSIONS": "No permissions" - }, - "ADD-PERMISSION": { - "SEARCH" : "Search", - "TYPE-MESSAGE" : "Type something to start searching groups or people", - "NO-RESULT": "No result found for this search", - "ADD-ACTION" : "ADD", - "CLOSE-ACTION" : "CLOSE", - "BASE-DIALOG-TITLE" : "Search a group or people to add..." - } + }, + "ADD-PERMISSION": { + "SEARCH": "Search", + "TYPE-MESSAGE": "Type something to start searching groups or people", + "NO-RESULT": "No result found for this search", + "ADD-ACTION": "ADD", + "CLOSE-ACTION": "CLOSE", + "BASE-DIALOG-TITLE": "Search a group or people to add..." + }, + "ERROR": { + "DUPLICATE-PERMISSION": "One or more of the permission you set is already present : {{list}}" + } } } diff --git a/lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts b/lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts index 2c0270fa0d..c41d208557 100644 --- a/lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts +++ b/lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts @@ -32,7 +32,7 @@ export class AddPermissionDialogComponent { @ViewChild('addPermission') addPermissionComponent: AddPermissionComponent; - currentSelection: MinimalNodeEntity[] = []; + private currentSelection: MinimalNodeEntity[] = []; constructor(@Inject(MAT_DIALOG_DATA) public data: AddPermissionDialogData) { } diff --git a/lib/content-services/permission-manager/services/node-permission.service.spec.ts b/lib/content-services/permission-manager/services/node-permission.service.spec.ts index 588f80426a..6e443caae2 100644 --- a/lib/content-services/permission-manager/services/node-permission.service.spec.ts +++ b/lib/content-services/permission-manager/services/node-permission.service.spec.ts @@ -148,4 +148,35 @@ describe('NodePermissionService', () => { }); })); + it('should be fail when user select the same authority and role to add', async(() => { + const fakeNodeCopy = Object.assign(fakeNodeWithOnlyLocally); + + const fakeDuplicateAuthority: any = [{ + 'entry': { + 'isFolder': false, + 'search': { + 'score': 0.3541112 + }, + 'isFile': false, + 'name': 'GROUP_EVERYONE', + 'location': 'nodes', + 'id': 'GROUP_EVERYONE', + 'nodeType': 'cm:authorityContainer', + 'properties': { + 'cm:authorityName': 'GROUP_EVERYONE' + }, + 'parentId': '030d833e-da8e-4f5c-8ef9-d809638bd04b' + } + }]; + + service.updateLocallySetPermissions(fakeNodeCopy, fakeDuplicateAuthority, ['Contributor']) + .subscribe((node: MinimalNodeEntryEntity) => { + + }, (errorMessage) => { + expect(errorMessage).not.toBeNull(); + expect(errorMessage).toBeDefined(); + expect(errorMessage).toBe('PERMISSION_MANAGER.ERROR.DUPLICATE-PERMISSION'); + }); + })); + }); diff --git a/lib/content-services/permission-manager/services/node-permission.service.ts b/lib/content-services/permission-manager/services/node-permission.service.ts index 357b5e6202..c16bc6f9ca 100644 --- a/lib/content-services/permission-manager/services/node-permission.service.ts +++ b/lib/content-services/permission-manager/services/node-permission.service.ts @@ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; -import { AlfrescoApiService, SearchService, NodesApiService } from '@alfresco/adf-core'; +import { AlfrescoApiService, SearchService, NodesApiService, TranslationService } from '@alfresco/adf-core'; import { QueryBody, MinimalNodeEntryEntity, MinimalNodeEntity, PathElement, GroupMemberEntry, GroupsPaging, GroupMemberPaging, PermissionElement } from 'alfresco-js-api'; import 'rxjs/add/operator/switchMap'; import { of } from 'rxjs/observable/of'; @@ -28,7 +28,8 @@ export class NodePermissionService { constructor(private apiService: AlfrescoApiService, private searchApiService: SearchService, - private nodeService: NodesApiService) { + private nodeService: NodesApiService, + private translation: TranslationService) { } /** @@ -56,7 +57,6 @@ export class NodePermissionService { * @returns Node with updated permission */ updatePermissionRole(node: MinimalNodeEntryEntity, updatedPermissionRole: PermissionElement): Observable { - let permissionBody = { permissions: { locallySet: []} }; const index = node.permissions.locallySet.map((permission) => permission.authorityId).indexOf(updatedPermissionRole.authorityId); permissionBody.permissions.locallySet = permissionBody.permissions.locallySet.concat(node.permissions.locallySet); @@ -82,10 +82,33 @@ export class NodePermissionService { updateLocallySetPermissions(node: MinimalNodeEntryEntity, nodes: MinimalNodeEntity[], nodeRole: string[]): Observable { let permissionBody = { permissions: { locallySet: []} }; const permissionList = this.transformNodeToPermissionElement(nodes, nodeRole[0]); + const duplicatedPermissions = this.getDuplicatedPermissions(node.permissions.locallySet, permissionList); + if (duplicatedPermissions.length > 0) { + const list = duplicatedPermissions.map((permission) => 'authority -> ' + permission.authorityId + ' / role -> ' + permission.name).join(', '); + const duplicatePermissionMessage: string = this.translation.instant('PERMISSION_MANAGER.ERROR.DUPLICATE-PERMISSION', {list}); + return Observable.throw(duplicatePermissionMessage); + } permissionBody.permissions.locallySet = node.permissions.locallySet ? node.permissions.locallySet.concat(permissionList) : permissionList; return this.nodeService.updateNode(node.id, permissionBody); } + private getDuplicatedPermissions(nodeLocallySet: PermissionElement[], permissionListAdded: PermissionElement[]): PermissionElement[] { + let duplicatePermissions: PermissionElement[] = []; + permissionListAdded.forEach((permission: PermissionElement) => { + const duplicate = nodeLocallySet.find((localPermission) => this.isEqualPermission(localPermission, permission)); + if (duplicate) { + duplicatePermissions.push(duplicate); + } + }); + return duplicatePermissions; + } + + private isEqualPermission(oldPermission: PermissionElement, newPermission: PermissionElement): boolean { + return oldPermission.accessStatus === newPermission.accessStatus && + oldPermission.authorityId === newPermission.authorityId && + oldPermission.name === newPermission.name; + } + private transformNodeToPermissionElement(nodes: MinimalNodeEntity[], nodeRole: any): PermissionElement[] { return nodes.map((node) => { let newPermissionElement: PermissionElement = {