mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
[ADF-2432] Creating component to display node permission (#3106)
* [ADF-2432] start adding demo shell changes for permissions * [ADF-2432] permission display component - phase 1 * [ADF-2432] added permissions to node query| * [ADF-2432] display permission table for node - phase 2 * [ADF-2432] fixed layout for display permissions * [ADF-2432] added test and documentation for permission display * [ADF-2432] fixed wrong rebase changes * [ADF-2432] added peer review changes * [ADF-2432] added license header to mock file
This commit is contained in:
@@ -89,6 +89,7 @@
|
|||||||
"VERSIONS": "Manage versions",
|
"VERSIONS": "Manage versions",
|
||||||
"METADATA": "Info",
|
"METADATA": "Info",
|
||||||
"DOWNLOAD": "Download",
|
"DOWNLOAD": "Download",
|
||||||
|
"PERMISSION": "Permission",
|
||||||
"FOLDER": {
|
"FOLDER": {
|
||||||
"COPY": "Copy",
|
"COPY": "Copy",
|
||||||
"MOVE": "Move",
|
"MOVE": "Move",
|
||||||
|
@@ -47,6 +47,7 @@ import { ReactiveFormsModule } from '@angular/forms';
|
|||||||
import { TaskAttachmentsComponent } from './components/process-service/task-attachments.component';
|
import { TaskAttachmentsComponent } from './components/process-service/task-attachments.component';
|
||||||
import { ProcessAttachmentsComponent } from './components/process-service/process-attachments.component';
|
import { ProcessAttachmentsComponent } from './components/process-service/process-attachments.component';
|
||||||
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
|
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
|
||||||
|
import { DemoPermissionComponent } from './components/permissions/demo-permissions.component';
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@@ -94,7 +95,8 @@ import { SharedLinkViewComponent } from './components/shared-link-view/shared-li
|
|||||||
ProcessAttachmentsComponent,
|
ProcessAttachmentsComponent,
|
||||||
OverlayViewerComponent,
|
OverlayViewerComponent,
|
||||||
SharedLinkViewComponent,
|
SharedLinkViewComponent,
|
||||||
FormLoadingComponent
|
FormLoadingComponent,
|
||||||
|
DemoPermissionComponent
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: AppConfigService, useClass: DebugAppConfigService },
|
{ provide: AppConfigService, useClass: DebugAppConfigService },
|
||||||
|
@@ -46,6 +46,7 @@ import { FormListComponent } from './components/form/form-list.component';
|
|||||||
import { OverlayViewerComponent } from './components/overlay-viewer/overlay-viewer.component';
|
import { OverlayViewerComponent } from './components/overlay-viewer/overlay-viewer.component';
|
||||||
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
|
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
|
||||||
import { FormLoadingComponent } from './components/form/form-loading.component';
|
import { FormLoadingComponent } from './components/form/form-loading.component';
|
||||||
|
import { DemoPermissionComponent } from './components/permissions/demo-permissions.component';
|
||||||
|
|
||||||
export const appRoutes: Routes = [
|
export const appRoutes: Routes = [
|
||||||
{ path: 'login', component: LoginComponent },
|
{ path: 'login', component: LoginComponent },
|
||||||
@@ -165,6 +166,11 @@ export const appRoutes: Routes = [
|
|||||||
component: SocialComponent,
|
component: SocialComponent,
|
||||||
canActivate: [AuthGuardEcm]
|
canActivate: [AuthGuardEcm]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'permissions/:id',
|
||||||
|
component: DemoPermissionComponent,
|
||||||
|
canActivate: [AuthGuardEcm]
|
||||||
|
},
|
||||||
{ path: 'about', component: AboutComponent },
|
{ path: 'about', component: AboutComponent },
|
||||||
{ path: 'form', component: FormComponent },
|
{ path: 'form', component: FormComponent },
|
||||||
{ path: 'form-list', component: FormListComponent },
|
{ path: 'form-list', component: FormListComponent },
|
||||||
|
@@ -178,7 +178,7 @@ export class DataTableComponent {
|
|||||||
getRowForNode() {
|
getRowForNode() {
|
||||||
const opts: any = {
|
const opts: any = {
|
||||||
includeSource: true,
|
includeSource: true,
|
||||||
include: ['path', 'properties', 'allowableOperations']
|
include: ['path', 'properties', 'allowableOperations', 'permissions']
|
||||||
};
|
};
|
||||||
|
|
||||||
Observable.fromPromise(this.apiService.getInstance().nodes
|
Observable.fromPromise(this.apiService.getInstance().nodes
|
||||||
|
@@ -308,6 +308,13 @@
|
|||||||
title="DOCUMENT_LIST.ACTIONS.DOCUMENT.PROCESS_ACTION"
|
title="DOCUMENT_LIST.ACTIONS.DOCUMENT.PROCESS_ACTION"
|
||||||
(execute)="startProcesAction($event)">
|
(execute)="startProcesAction($event)">
|
||||||
</content-action>
|
</content-action>
|
||||||
|
<content-action
|
||||||
|
icon="settings_input_component"
|
||||||
|
title="{{'DOCUMENT_LIST.ACTIONS.PERMISSION' | translate}}"
|
||||||
|
permission="copy"
|
||||||
|
(error)="onContentActionError($event)"
|
||||||
|
(execute)="onPermissionRequested($event)">
|
||||||
|
</content-action>
|
||||||
</content-actions>
|
</content-actions>
|
||||||
</adf-document-list>
|
</adf-document-list>
|
||||||
<adf-pagination
|
<adf-pagination
|
||||||
|
@@ -344,6 +344,10 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
this.reloadForInfiniteScrolling();
|
this.reloadForInfiniteScrolling();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onPermissionRequested(node) {
|
||||||
|
this.router.navigate(['/permissions', node.value.entry.id]);
|
||||||
|
}
|
||||||
|
|
||||||
private reloadForInfiniteScrolling() {
|
private reloadForInfiniteScrolling() {
|
||||||
if (this.infiniteScrolling) {
|
if (this.infiniteScrolling) {
|
||||||
this.documentList.skipCount = 0;
|
this.documentList.skipCount = 0;
|
||||||
|
@@ -0,0 +1,2 @@
|
|||||||
|
<adf-permission-list [nodeId]="nodeId">
|
||||||
|
</adf-permission-list>
|
@@ -0,0 +1,43 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Component, Optional, OnInit } from '@angular/core';
|
||||||
|
import { ActivatedRoute, Params} from '@angular/router';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-permissions',
|
||||||
|
templateUrl: './demo-permissions.component.html',
|
||||||
|
styleUrls: ['./demo-permissions.component.scss']
|
||||||
|
})
|
||||||
|
export class DemoPermissionComponent implements OnInit {
|
||||||
|
|
||||||
|
nodeId: string;
|
||||||
|
|
||||||
|
constructor(@Optional() private route: ActivatedRoute) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
if (this.route) {
|
||||||
|
this.route.params.forEach((params: Params) => {
|
||||||
|
if (params['id']) {
|
||||||
|
this.nodeId = params['id'];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
26
docs/content-services/permission-list.component.md
Normal file
26
docs/content-services/permission-list.component.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
Added: v2.3.0
|
||||||
|
Status: Active
|
||||||
|
Last reviewed: 2018-03-12
|
||||||
|
---
|
||||||
|
|
||||||
|
# Permission List Component
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Basic Usage
|
||||||
|
|
||||||
|
```html
|
||||||
|
<adf-permission-list [nodeId]="nodeId">
|
||||||
|
</adf-permission-list>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
|
||||||
|
| Name | Type | Default value | Description |
|
||||||
|
| ---- | ---- | ------------- | ----------- |
|
||||||
|
| nodeId | `string` | `null` | node id which we want to show the permissions |
|
||||||
|
|
||||||
|
## Details
|
||||||
|
|
||||||
|
This component use the `datatable` to show the permission retrieved from the node service.
|
BIN
docs/docassets/images/adf-permission-list.png
Normal file
BIN
docs/docassets/images/adf-permission-list.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 116 KiB |
@@ -36,6 +36,7 @@ import { ContentDirectiveModule } from './directives/content-directive.module';
|
|||||||
import { DialogModule } from './dialogs/dialog.module';
|
import { DialogModule } from './dialogs/dialog.module';
|
||||||
import { FolderDirectiveModule } from './folder-directive/folder-directive.module';
|
import { FolderDirectiveModule } from './folder-directive/folder-directive.module';
|
||||||
import { ContentMetadataModule } from './content-metadata/content-metadata.module';
|
import { ContentMetadataModule } from './content-metadata/content-metadata.module';
|
||||||
|
import { PermissionManagerModule } from './permission-manager/permission-manager.module';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
@@ -57,7 +58,8 @@ import { ContentMetadataModule } from './content-metadata/content-metadata.modul
|
|||||||
ContentMetadataModule,
|
ContentMetadataModule,
|
||||||
DialogModule,
|
DialogModule,
|
||||||
FolderDirectiveModule,
|
FolderDirectiveModule,
|
||||||
ContentDirectiveModule
|
ContentDirectiveModule,
|
||||||
|
PermissionManagerModule
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{
|
{
|
||||||
@@ -84,7 +86,8 @@ import { ContentMetadataModule } from './content-metadata/content-metadata.modul
|
|||||||
ContentMetadataModule,
|
ContentMetadataModule,
|
||||||
DialogModule,
|
DialogModule,
|
||||||
FolderDirectiveModule,
|
FolderDirectiveModule,
|
||||||
ContentDirectiveModule
|
ContentDirectiveModule,
|
||||||
|
PermissionManagerModule
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
export class ContentModule {
|
export class ContentModule {
|
||||||
|
@@ -50,7 +50,7 @@ export class DocumentListService {
|
|||||||
|
|
||||||
let params: any = {
|
let params: any = {
|
||||||
includeSource: true,
|
includeSource: true,
|
||||||
include: ['path', 'properties', 'allowableOperations']
|
include: ['path', 'properties', 'allowableOperations', 'permissions']
|
||||||
};
|
};
|
||||||
|
|
||||||
if (folder) {
|
if (folder) {
|
||||||
@@ -127,7 +127,7 @@ export class DocumentListService {
|
|||||||
getFolderNode(nodeId: string): Promise<MinimalNodeEntryEntity> {
|
getFolderNode(nodeId: string): Promise<MinimalNodeEntryEntity> {
|
||||||
let opts: any = {
|
let opts: any = {
|
||||||
includeSource: true,
|
includeSource: true,
|
||||||
include: ['path', 'properties', 'allowableOperations']
|
include: ['path', 'properties', 'allowableOperations', 'permissions']
|
||||||
};
|
};
|
||||||
|
|
||||||
let nodes: any = this.apiService.getInstance().nodes;
|
let nodes: any = this.apiService.getInstance().nodes;
|
||||||
|
@@ -206,5 +206,13 @@
|
|||||||
"CLOSE": "CLOSE",
|
"CLOSE": "CLOSE",
|
||||||
"COPY-LINK": "COPY LINK"
|
"COPY-LINK": "COPY LINK"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"PERMISSION_MANAGER": {
|
||||||
|
"PERMISSION_DISPLAY": {
|
||||||
|
"INHERITED" : "Inherited",
|
||||||
|
"AUTHORITY_ID" : "Authority ID",
|
||||||
|
"NAME": "Name",
|
||||||
|
"LOCALLY_SET" : "Locally set"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -31,6 +31,7 @@ export * from './dialogs/dialog.module';
|
|||||||
export * from './folder-directive/folder-directive.module';
|
export * from './folder-directive/folder-directive.module';
|
||||||
export * from './content-metadata/content-metadata.module';
|
export * from './content-metadata/content-metadata.module';
|
||||||
export * from './directives/content-directive.module';
|
export * from './directives/content-directive.module';
|
||||||
|
export * from './permission-manager/permission-manager.module';
|
||||||
|
|
||||||
export * from './directives';
|
export * from './directives';
|
||||||
export * from './social';
|
export * from './social';
|
||||||
@@ -46,3 +47,4 @@ export * from './content-node-selector';
|
|||||||
export * from './dialogs';
|
export * from './dialogs';
|
||||||
export * from './folder-directive';
|
export * from './folder-directive';
|
||||||
export * from './content-metadata';
|
export * from './content-metadata';
|
||||||
|
export * from './permission-manager';
|
||||||
|
185
lib/content-services/mock/permission-list.component.mock.ts
Normal file
185
lib/content-services/mock/permission-list.component.mock.ts
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const fakeNodeWithPermissions: any = {
|
||||||
|
'aspectNames': [
|
||||||
|
'cm:auditable',
|
||||||
|
'cm:taggable',
|
||||||
|
'cm:author',
|
||||||
|
'cm:titled',
|
||||||
|
'app:uifacets'
|
||||||
|
],
|
||||||
|
'createdAt': '2017-11-16T16:29:38.638+0000',
|
||||||
|
'isFolder': true,
|
||||||
|
'isFile': false,
|
||||||
|
'createdByUser': {
|
||||||
|
'id': 'System',
|
||||||
|
'displayName': 'System'
|
||||||
|
},
|
||||||
|
'modifiedAt': '2018-03-21T03:17:58.783+0000',
|
||||||
|
'permissions': {
|
||||||
|
'inherited': [
|
||||||
|
{
|
||||||
|
'authorityId': 'guest',
|
||||||
|
'name': 'Read',
|
||||||
|
'accessStatus': 'ALLOWED'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'authorityId': 'GROUP_EVERYONE',
|
||||||
|
'name': 'Read',
|
||||||
|
'accessStatus': 'ALLOWED'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'locallySet': [
|
||||||
|
{
|
||||||
|
'authorityId': 'GROUP_EVERYONE',
|
||||||
|
'name': 'Contributor',
|
||||||
|
'accessStatus': 'ALLOWED'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'settable': [
|
||||||
|
'Contributor',
|
||||||
|
'Collaborator',
|
||||||
|
'Coordinator',
|
||||||
|
'Editor',
|
||||||
|
'Consumer'
|
||||||
|
],
|
||||||
|
'isInheritanceEnabled': true
|
||||||
|
},
|
||||||
|
'modifiedByUser': {
|
||||||
|
'id': 'admin',
|
||||||
|
'displayName': 'PedroH Hernandez'
|
||||||
|
},
|
||||||
|
'name': 'test',
|
||||||
|
'id': 'f472543f-7218-403d-917b-7a5861257244',
|
||||||
|
'nodeType': 'cm:folder',
|
||||||
|
'properties': {
|
||||||
|
'cm:title': 'test',
|
||||||
|
'cm:author': 'yagud',
|
||||||
|
'cm:taggable': [
|
||||||
|
'e8c8fbba-03ba-4fa6-86b1-f7ad7c296409'
|
||||||
|
],
|
||||||
|
'cm:description': 'sleepery',
|
||||||
|
'app:icon': 'space-icon-default'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const fakeNodeInheritedOnly: any = {
|
||||||
|
'aspectNames': [
|
||||||
|
'cm:auditable',
|
||||||
|
'cm:taggable',
|
||||||
|
'cm:author',
|
||||||
|
'cm:titled',
|
||||||
|
'app:uifacets'
|
||||||
|
],
|
||||||
|
'createdAt': '2017-11-16T16:29:38.638+0000',
|
||||||
|
'isFolder': true,
|
||||||
|
'isFile': false,
|
||||||
|
'createdByUser': {
|
||||||
|
'id': 'System',
|
||||||
|
'displayName': 'System'
|
||||||
|
},
|
||||||
|
'modifiedAt': '2018-03-21T03:17:58.783+0000',
|
||||||
|
'permissions': {
|
||||||
|
'inherited': [
|
||||||
|
{
|
||||||
|
'authorityId': 'guest',
|
||||||
|
'name': 'Read',
|
||||||
|
'accessStatus': 'ALLOWED'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'authorityId': 'GROUP_EVERYONE',
|
||||||
|
'name': 'Read',
|
||||||
|
'accessStatus': 'ALLOWED'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'settable': [
|
||||||
|
'Contributor',
|
||||||
|
'Collaborator',
|
||||||
|
'Coordinator',
|
||||||
|
'Editor',
|
||||||
|
'Consumer'
|
||||||
|
],
|
||||||
|
'isInheritanceEnabled': true
|
||||||
|
},
|
||||||
|
'modifiedByUser': {
|
||||||
|
'id': 'admin',
|
||||||
|
'displayName': 'PedroH Hernandez'
|
||||||
|
},
|
||||||
|
'name': 'test',
|
||||||
|
'id': 'f472543f-7218-403d-917b-7a5861257244',
|
||||||
|
'nodeType': 'cm:folder',
|
||||||
|
'properties': {
|
||||||
|
'cm:title': 'test',
|
||||||
|
'cm:author': 'yagud',
|
||||||
|
'cm:taggable': [
|
||||||
|
'e8c8fbba-03ba-4fa6-86b1-f7ad7c296409'
|
||||||
|
],
|
||||||
|
'cm:description': 'sleepery',
|
||||||
|
'app:icon': 'space-icon-default'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
export const fakeNodeWithOnlyLocally: any = {
|
||||||
|
'aspectNames': [
|
||||||
|
'cm:auditable',
|
||||||
|
'cm:taggable',
|
||||||
|
'cm:author',
|
||||||
|
'cm:titled',
|
||||||
|
'app:uifacets'
|
||||||
|
],
|
||||||
|
'createdAt': '2017-11-16T16:29:38.638+0000',
|
||||||
|
'isFolder': true,
|
||||||
|
'isFile': false,
|
||||||
|
'createdByUser': {
|
||||||
|
'id': 'System',
|
||||||
|
'displayName': 'System'
|
||||||
|
},
|
||||||
|
'modifiedAt': '2018-03-21T03:17:58.783+0000',
|
||||||
|
'permissions': {
|
||||||
|
'locallySet': [
|
||||||
|
{
|
||||||
|
'authorityId': 'GROUP_EVERYONE',
|
||||||
|
'name': 'Contributor',
|
||||||
|
'accessStatus': 'ALLOWED'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'settable': [
|
||||||
|
'Contributor',
|
||||||
|
'Collaborator',
|
||||||
|
'Coordinator',
|
||||||
|
'Editor',
|
||||||
|
'Consumer'
|
||||||
|
],
|
||||||
|
'isInheritanceEnabled': true
|
||||||
|
},
|
||||||
|
'modifiedByUser': {
|
||||||
|
'id': 'admin',
|
||||||
|
'displayName': 'PedroH Hernandez'
|
||||||
|
},
|
||||||
|
'name': 'test',
|
||||||
|
'id': 'f472543f-7218-403d-917b-7a5861257244',
|
||||||
|
'nodeType': 'cm:folder',
|
||||||
|
'properties': {
|
||||||
|
'cm:title': 'test',
|
||||||
|
'cm:author': 'yagud',
|
||||||
|
'cm:taggable': [
|
||||||
|
'e8c8fbba-03ba-4fa6-86b1-f7ad7c296409'
|
||||||
|
],
|
||||||
|
'cm:description': 'sleepery',
|
||||||
|
'app:icon': 'space-icon-default'
|
||||||
|
}
|
||||||
|
};
|
@@ -0,0 +1,28 @@
|
|||||||
|
<div id="adf-permission-display-container" class="adf-display-permission-container">
|
||||||
|
<adf-datatable [rows]="permissionList" class="adf-datatable-permission">
|
||||||
|
<data-columns>
|
||||||
|
<data-column key="icon" type="icon" [sortable]="false">
|
||||||
|
</data-column>
|
||||||
|
<data-column title="{{'PERMISSION_MANAGER.PERMISSION_DISPLAY.AUTHORITY_ID' | translate}}" key="authorityId"></data-column>
|
||||||
|
<data-column title="{{'PERMISSION_MANAGER.PERMISSION_DISPLAY.NAME' | translate}}" key="name"></data-column>
|
||||||
|
<data-column title="{{'PERMISSION_MANAGER.PERMISSION_DISPLAY.INHERITED' | translate}}" key="isInherited">
|
||||||
|
<ng-template let-entry="$implicit">
|
||||||
|
<mat-chip-list>
|
||||||
|
<mat-chip *ngIf="!!entry.data.getValue(entry.row, entry.col) else locally_set_chip"
|
||||||
|
id="adf-permission-inherited-label"
|
||||||
|
color="primary" selected="true">{{'PERMISSION_MANAGER.PERMISSION_DISPLAY.INHERITED' | translate}}</mat-chip>
|
||||||
|
</mat-chip-list>
|
||||||
|
<ng-template #locally_set_chip>
|
||||||
|
<mat-chip-list>
|
||||||
|
<mat-chip id="adf-permission-locallyset-label"
|
||||||
|
color="accent" selected="true">
|
||||||
|
{{'PERMISSION_MANAGER.PERMISSION_DISPLAY.LOCALLY_SET' | translate}}
|
||||||
|
</mat-chip>
|
||||||
|
</mat-chip-list>
|
||||||
|
</ng-template>
|
||||||
|
</ng-template>
|
||||||
|
</data-column>
|
||||||
|
</data-columns>
|
||||||
|
</adf-datatable>
|
||||||
|
</div>
|
||||||
|
|
@@ -0,0 +1,15 @@
|
|||||||
|
@mixin adf-permission-list-theme($theme) {
|
||||||
|
|
||||||
|
.adf{
|
||||||
|
|
||||||
|
&-display-permission-container {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-datatable-permission {
|
||||||
|
display: flex;
|
||||||
|
flex-basis: 38%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,81 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { PermissionListComponent } from './permission-list.component';
|
||||||
|
import { NodesApiService } from '@alfresco/adf-core';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
import { fakeNodeWithPermissions, fakeNodeInheritedOnly, fakeNodeWithOnlyLocally} from '../../../mock/permission-list.component.mock';
|
||||||
|
|
||||||
|
describe('PermissionDisplayComponent', () => {
|
||||||
|
|
||||||
|
let fixture: ComponentFixture<PermissionListComponent>;
|
||||||
|
let component: PermissionListComponent;
|
||||||
|
let element: HTMLElement;
|
||||||
|
let nodeService: NodesApiService;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [
|
||||||
|
PermissionListComponent
|
||||||
|
],
|
||||||
|
providers: [NodesApiService]
|
||||||
|
}).compileComponents().then(() => {
|
||||||
|
fixture = TestBed.createComponent(PermissionListComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
element = fixture.nativeElement;
|
||||||
|
nodeService = TestBed.get(NodesApiService);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
afterEach(async(() => {
|
||||||
|
fixture.destroy();
|
||||||
|
TestBed.resetTestingModule();
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should be able to render the component', async() => {
|
||||||
|
fixture.detectChanges();
|
||||||
|
expect(element.querySelector('#adf-permission-display-container')).not.toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should show the node permissions', async() => {
|
||||||
|
component.nodeId = 'fake-node-id';
|
||||||
|
spyOn(nodeService, 'getNode').and.returnValue(Observable.of(fakeNodeWithPermissions));
|
||||||
|
fixture.detectChanges();
|
||||||
|
expect(element.querySelector('#adf-permission-display-container')).not.toBeNull();
|
||||||
|
expect(element.querySelectorAll('.adf-datatable-row').length).toBe(4);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should show inherited label for inherited permissions', async() => {
|
||||||
|
component.nodeId = 'fake-node-id';
|
||||||
|
spyOn(nodeService, 'getNode').and.returnValue(Observable.of(fakeNodeInheritedOnly));
|
||||||
|
fixture.detectChanges();
|
||||||
|
expect(element.querySelector('#adf-permission-display-container')).not.toBeNull();
|
||||||
|
expect(element.querySelector('#adf-permission-inherited-label')).toBeDefined();
|
||||||
|
expect(element.querySelector('#adf-permission-inherited-label')).not.toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should show locally set label for locally set permissions', async() => {
|
||||||
|
component.nodeId = 'fake-node-id';
|
||||||
|
spyOn(nodeService, 'getNode').and.returnValue(Observable.of(fakeNodeWithOnlyLocally));
|
||||||
|
fixture.detectChanges();
|
||||||
|
expect(element.querySelector('#adf-permission-display-container')).not.toBeNull();
|
||||||
|
expect(element.querySelector('#adf-permission-locallyset-label')).toBeDefined();
|
||||||
|
expect(element.querySelector('#adf-permission-locallyset-label')).not.toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
@@ -0,0 +1,64 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Component, ViewEncapsulation, Input, OnInit } from '@angular/core';
|
||||||
|
import { NodesApiService } from '@alfresco/adf-core';
|
||||||
|
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
|
||||||
|
import { PermissionDisplayModel } from '../../models/permission.model';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'adf-permission-list',
|
||||||
|
templateUrl: './permission-list.component.html',
|
||||||
|
styleUrls: ['./permission-list.component.scss'],
|
||||||
|
encapsulation: ViewEncapsulation.None
|
||||||
|
})
|
||||||
|
export class PermissionListComponent implements OnInit {
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
nodeId: string = '';
|
||||||
|
|
||||||
|
permissionList: PermissionDisplayModel[];
|
||||||
|
|
||||||
|
constructor(private nodeService: NodesApiService) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.nodeService.getNode(this.nodeId).subscribe((node: MinimalNodeEntryEntity) => {
|
||||||
|
this.permissionList = this.getPermissionList(node);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private getPermissionList(node: MinimalNodeEntryEntity): PermissionDisplayModel[] {
|
||||||
|
let allPermissions: PermissionDisplayModel[] = [];
|
||||||
|
if (node.permissions.locallySet) {
|
||||||
|
node.permissions.locallySet.map((element) => {
|
||||||
|
let permission = new PermissionDisplayModel(element);
|
||||||
|
allPermissions.push(permission);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (node.permissions.inherited) {
|
||||||
|
node.permissions.inherited.map((element) => {
|
||||||
|
let permissionInherited = new PermissionDisplayModel(element);
|
||||||
|
permissionInherited.isInherited = true;
|
||||||
|
allPermissions.push(permissionInherited);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return allPermissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
18
lib/content-services/permission-manager/index.ts
Normal file
18
lib/content-services/permission-manager/index.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export * from './public-api';
|
@@ -0,0 +1,34 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class PermissionDisplayModel {
|
||||||
|
accessStatus: string;
|
||||||
|
authorityId: string;
|
||||||
|
name: string;
|
||||||
|
isInherited: boolean = false;
|
||||||
|
icon: string;
|
||||||
|
|
||||||
|
constructor(obj?: any) {
|
||||||
|
if (obj) {
|
||||||
|
this.accessStatus = obj.accessStatus;
|
||||||
|
this.authorityId = obj.authorityId;
|
||||||
|
this.name = obj.name;
|
||||||
|
this.isInherited = obj.isInherited;
|
||||||
|
this.icon = obj.icon ? obj.icon : 'lock_open';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,43 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
import { MaterialModule } from '../material.module';
|
||||||
|
import { PermissionListComponent } from './components/permission-display/permission-list.component';
|
||||||
|
import { DataTableModule, DataColumnModule } from '@alfresco/adf-core';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
CommonModule,
|
||||||
|
FormsModule,
|
||||||
|
ReactiveFormsModule,
|
||||||
|
MaterialModule,
|
||||||
|
TranslateModule,
|
||||||
|
DataTableModule,
|
||||||
|
DataColumnModule
|
||||||
|
],
|
||||||
|
declarations: [
|
||||||
|
PermissionListComponent
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
PermissionListComponent
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class PermissionManagerModule {}
|
20
lib/content-services/permission-manager/public-api.ts
Normal file
20
lib/content-services/permission-manager/public-api.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/*!
|
||||||
|
* @license
|
||||||
|
* Copyright 2016 Alfresco Software, Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export * from './components/permission-display/permission-list.component';
|
||||||
|
|
||||||
|
export * from './models/permission.model';
|
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
@import '../content-node-selector/content-node-selector.component';
|
@import '../content-node-selector/content-node-selector.component';
|
||||||
@import '../content-metadata/content-metadata.module';
|
@import '../content-metadata/content-metadata.module';
|
||||||
|
@import '../permission-manager/components/permission-display/permission-list.component';
|
||||||
|
|
||||||
@mixin adf-content-services-theme($theme) {
|
@mixin adf-content-services-theme($theme) {
|
||||||
@include adf-breadcrumb-theme($theme);
|
@include adf-breadcrumb-theme($theme);
|
||||||
@@ -28,4 +29,5 @@
|
|||||||
@include adf-dialog-theme($theme);
|
@include adf-dialog-theme($theme);
|
||||||
@include adf-content-node-selector-dialog-theme($theme) ;
|
@include adf-content-node-selector-dialog-theme($theme) ;
|
||||||
@include adf-content-metadata-module-theme($theme);
|
@include adf-content-metadata-module-theme($theme);
|
||||||
|
@include adf-permission-list-theme($theme);
|
||||||
}
|
}
|
||||||
|
@@ -46,7 +46,7 @@ export class NodesApiService {
|
|||||||
getNode(nodeId: string, options: any = {}): Observable<MinimalNodeEntryEntity> {
|
getNode(nodeId: string, options: any = {}): Observable<MinimalNodeEntryEntity> {
|
||||||
const { nodesApi, handleError, getEntryFromEntity } = this;
|
const { nodesApi, handleError, getEntryFromEntity } = this;
|
||||||
const defaults = {
|
const defaults = {
|
||||||
include: [ 'path', 'properties', 'allowableOperations' ]
|
include: [ 'path', 'properties', 'allowableOperations', 'permissions' ]
|
||||||
};
|
};
|
||||||
const queryOptions = Object.assign(defaults, options);
|
const queryOptions = Object.assign(defaults, options);
|
||||||
const promise = nodesApi
|
const promise = nodesApi
|
||||||
@@ -68,7 +68,7 @@ export class NodesApiService {
|
|||||||
const defaults = {
|
const defaults = {
|
||||||
maxItems: this.preferences.paginationSize,
|
maxItems: this.preferences.paginationSize,
|
||||||
skipCount: 0,
|
skipCount: 0,
|
||||||
include: [ 'path', 'properties', 'allowableOperations' ]
|
include: [ 'path', 'properties', 'allowableOperations', 'permissions' ]
|
||||||
};
|
};
|
||||||
const queryOptions = Object.assign(defaults, options);
|
const queryOptions = Object.assign(defaults, options);
|
||||||
const promise = nodesApi
|
const promise = nodesApi
|
||||||
|
Reference in New Issue
Block a user