mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-07 18:25:09 +00:00
[ADF-2826] added a check for duplicate permission add (#3265)
* [ADF-2556] first step to create add people or group to permissions * [ADF-2556] creating a dialog with user results * [ADF-2556] integrated service for add and remove permission from node * [ADF-2556] fixed behaviour and style for add user group * [ADF-2556] added some refactoring for dialog service * [ADF-2556] refactoring the dependencies of the components * [ADF-2556] added some fix and a new key for dialog * [ADF-2556] start adding test for node permission service * [ADF-2556] added test for add permission panel component * [ADf-2556] adding tests for new add permission component * [ADF-2556] fixed tests and added documentation * [ADF-2556] fixed documentation for add-node components * [ADF-2556] added peer review changes * [ADF-2826] added a check for duplicate permission add * [ADF-2826] removed fdescribe * [ADF-2826] applied peer review changes
This commit is contained in:
parent
b7d11d7697
commit
18ebf9f2f7
@ -73,7 +73,7 @@ export class DemoPermissionComponent implements OnInit {
|
|||||||
|
|
||||||
showErrorMessage(error) {
|
showErrorMessage(error) {
|
||||||
this.notificationService.openSnackMessage(
|
this.notificationService.openSnackMessage(
|
||||||
JSON.parse(error.response.text).error.errorKey,
|
error,
|
||||||
4000
|
4000
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
Added: v2.4.0
|
Added: v2.4.0
|
||||||
Status: Active
|
Status: Active
|
||||||
Last reviewed: 2018-05-04
|
Last reviewed: 2018-05-03
|
||||||
---
|
---
|
||||||
|
|
||||||
# Add Permission Component
|
# 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
|
```html
|
||||||
<adf-add-permission [nodeId]="nodeId"
|
<adf-add-permission [nodeId]="nodeId"
|
||||||
(success)="onSuccess($event)" (error)="onError($event)">
|
(success)="onSuccess($event)" (error)="onError($event)">
|
||||||
</adf-add-permission>
|
</adf-add-permission>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class members
|
## Class members
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
|
||||||
|
| Name | Type | Default value | Description |
|
||||||
|
| -- | -- | -- | -- |
|
||||||
|
|
||||||
### Events
|
### Events
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| -- | -- | -- |
|
| -- | -- | -- |
|
||||||
| select | `EventEmitter<any>` | Emitted when a permission list item is selected. |
|
| select | `EventEmitter<MinimalNodeEntryEntity>` | |
|
||||||
|
|
||||||
## Details
|
## Details
|
||||||
|
|
||||||
This component uses a [Search component](../search.component.md) to retrieve the
|
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.
|
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.
|
@ -264,14 +264,17 @@
|
|||||||
"ROLE": "Role",
|
"ROLE": "Role",
|
||||||
"LOCALLY_SET": "Locally set",
|
"LOCALLY_SET": "Locally set",
|
||||||
"NO_PERMISSIONS": "No permissions"
|
"NO_PERMISSIONS": "No permissions"
|
||||||
},
|
},
|
||||||
"ADD-PERMISSION": {
|
"ADD-PERMISSION": {
|
||||||
"SEARCH" : "Search",
|
"SEARCH": "Search",
|
||||||
"TYPE-MESSAGE" : "Type something to start searching groups or people",
|
"TYPE-MESSAGE": "Type something to start searching groups or people",
|
||||||
"NO-RESULT": "No result found for this search",
|
"NO-RESULT": "No result found for this search",
|
||||||
"ADD-ACTION" : "ADD",
|
"ADD-ACTION": "ADD",
|
||||||
"CLOSE-ACTION" : "CLOSE",
|
"CLOSE-ACTION": "CLOSE",
|
||||||
"BASE-DIALOG-TITLE" : "Search a group or people to add..."
|
"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}}"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ export class AddPermissionDialogComponent {
|
|||||||
@ViewChild('addPermission')
|
@ViewChild('addPermission')
|
||||||
addPermissionComponent: AddPermissionComponent;
|
addPermissionComponent: AddPermissionComponent;
|
||||||
|
|
||||||
currentSelection: MinimalNodeEntity[] = [];
|
private currentSelection: MinimalNodeEntity[] = [];
|
||||||
|
|
||||||
constructor(@Inject(MAT_DIALOG_DATA) public data: AddPermissionDialogData) {
|
constructor(@Inject(MAT_DIALOG_DATA) public data: AddPermissionDialogData) {
|
||||||
}
|
}
|
||||||
|
@ -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');
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Observable } from 'rxjs/Observable';
|
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 { QueryBody, MinimalNodeEntryEntity, MinimalNodeEntity, PathElement, GroupMemberEntry, GroupsPaging, GroupMemberPaging, PermissionElement } from 'alfresco-js-api';
|
||||||
import 'rxjs/add/operator/switchMap';
|
import 'rxjs/add/operator/switchMap';
|
||||||
import { of } from 'rxjs/observable/of';
|
import { of } from 'rxjs/observable/of';
|
||||||
@ -28,7 +28,8 @@ export class NodePermissionService {
|
|||||||
|
|
||||||
constructor(private apiService: AlfrescoApiService,
|
constructor(private apiService: AlfrescoApiService,
|
||||||
private searchApiService: SearchService,
|
private searchApiService: SearchService,
|
||||||
private nodeService: NodesApiService) {
|
private nodeService: NodesApiService,
|
||||||
|
private translation: TranslationService) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,7 +57,6 @@ export class NodePermissionService {
|
|||||||
* @returns Node with updated permission
|
* @returns Node with updated permission
|
||||||
*/
|
*/
|
||||||
updatePermissionRole(node: MinimalNodeEntryEntity, updatedPermissionRole: PermissionElement): Observable<MinimalNodeEntryEntity> {
|
updatePermissionRole(node: MinimalNodeEntryEntity, updatedPermissionRole: PermissionElement): Observable<MinimalNodeEntryEntity> {
|
||||||
|
|
||||||
let permissionBody = { permissions: { locallySet: []} };
|
let permissionBody = { permissions: { locallySet: []} };
|
||||||
const index = node.permissions.locallySet.map((permission) => permission.authorityId).indexOf(updatedPermissionRole.authorityId);
|
const index = node.permissions.locallySet.map((permission) => permission.authorityId).indexOf(updatedPermissionRole.authorityId);
|
||||||
permissionBody.permissions.locallySet = permissionBody.permissions.locallySet.concat(node.permissions.locallySet);
|
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<MinimalNodeEntryEntity> {
|
updateLocallySetPermissions(node: MinimalNodeEntryEntity, nodes: MinimalNodeEntity[], nodeRole: string[]): Observable<MinimalNodeEntryEntity> {
|
||||||
let permissionBody = { permissions: { locallySet: []} };
|
let permissionBody = { permissions: { locallySet: []} };
|
||||||
const permissionList = this.transformNodeToPermissionElement(nodes, nodeRole[0]);
|
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;
|
permissionBody.permissions.locallySet = node.permissions.locallySet ? node.permissions.locallySet.concat(permissionList) : permissionList;
|
||||||
return this.nodeService.updateNode(node.id, permissionBody);
|
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[] {
|
private transformNodeToPermissionElement(nodes: MinimalNodeEntity[], nodeRole: any): PermissionElement[] {
|
||||||
return nodes.map((node) => {
|
return nodes.map((node) => {
|
||||||
let newPermissionElement: PermissionElement = <PermissionElement> {
|
let newPermissionElement: PermissionElement = <PermissionElement> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user