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.

@@ -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 = {