From 5fff7fcb291037a578149d6ed3bd0761dcfb0a6a Mon Sep 17 00:00:00 2001 From: Cilibiu Bogdan Date: Tue, 7 Nov 2017 18:40:19 +0200 Subject: [PATCH] no permission content (#2616) --- .../docassets/images/no-permission-custom.png | Bin 0 -> 35310 bytes .../images/no-permission-default.png | Bin 0 -> 64715 bytes docs/document-list.component.md | 22 ++++++ .../ng2-alfresco-datatable/index.ts | 2 + .../datatable/datatable.component.html | 10 ++- .../datatable/datatable.component.scss | 11 +++ .../datatable/datatable.component.ts | 4 ++ .../no-permission-template.directive.spec.ts | 64 +++++++++++++++++ .../no-permission-template.directive.ts | 37 ++++++++++ .../ng2-alfresco-documentlist/index.ts | 3 + .../content-node-selector.component.spec.ts | 9 ++- .../components/document-list.component.html | 12 ++++ .../components/document-list.component.scss | 22 ++++++ .../document-list.component.spec.ts | 57 +++++++++++++++ .../src/components/document-list.component.ts | 24 ++++++- .../no-permission-content.directive.spec.ts | 66 ++++++++++++++++++ .../no-permission-content.directive.ts | 36 ++++++++++ .../src/i18n/en.json | 1 + 18 files changed, 375 insertions(+), 5 deletions(-) create mode 100644 docs/docassets/images/no-permission-custom.png create mode 100644 docs/docassets/images/no-permission-default.png create mode 100644 ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.spec.ts create mode 100644 ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.ts create mode 100644 ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.spec.ts create mode 100644 ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.ts diff --git a/docs/docassets/images/no-permission-custom.png b/docs/docassets/images/no-permission-custom.png new file mode 100644 index 0000000000000000000000000000000000000000..b551660444e9f0d1acbfdc526e5c6ab9501b7d71 GIT binary patch literal 35310 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 literal 0 HcmV?d00001 diff --git a/docs/docassets/images/no-permission-default.png b/docs/docassets/images/no-permission-default.png new file mode 100644 index 0000000000000000000000000000000000000000..12e364d6f319e7bdc6c9b5317c95b2b231f5d314 GIT binary patch literal 64715 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 aWK`9K{f)a0T>Sz3`&HlMT;`dpH~$wHoOdw* literal 0 HcmV?d00001 diff --git a/docs/document-list.component.md b/docs/document-list.component.md index 37bd3d0b82..c096534101 100644 --- a/docs/document-list.component.md +++ b/docs/document-list.component.md @@ -733,8 +733,30 @@ That will give the following output: ![Custom empty folder](docassets/images/empty-folder-template-custom.png) +### Custom 'permission denied' template + +By default DocumentList provides the following content for permission denied: + +![Default no permission](docassets/images/no-permission-default.png) + +This can be changed by means of the custom html template: + +```html + + + +

You don't have permissions

+
+
+
+``` + +That will give the following output: + +![Custom no permission](docassets/images/no-permission-custom.png) + ## See also - [Datatable component](datatable.component.md) diff --git a/ng2-components/ng2-alfresco-datatable/index.ts b/ng2-components/ng2-alfresco-datatable/index.ts index 16b3193e94..17aabfe106 100644 --- a/ng2-components/ng2-alfresco-datatable/index.ts +++ b/ng2-components/ng2-alfresco-datatable/index.ts @@ -39,6 +39,7 @@ import { FileSizeCellComponent } from './src/components/datatable/filesize-cell. import { LocationCellComponent } from './src/components/datatable/location-cell.component'; import { LoadingContentTemplateDirective } from './src/directives/loading-template.directive'; import { NoContentTemplateDirective } from './src/directives/no-content-template.directive'; +import { NoPermissionTemplateDirective } from './src/directives/no-permission-template.directive'; export function directives() { return [ @@ -52,6 +53,7 @@ export function directives() { FileSizeCellComponent, LocationCellComponent, NoContentTemplateDirective, + NoPermissionTemplateDirective, LoadingContentTemplateDirective ]; } diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html index 40be7d37c8..7f931e0082 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.html @@ -34,7 +34,7 @@ - + + + + + + + diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.scss b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.scss index 2bda6c680e..b06977844a 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.scss +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.scss @@ -202,6 +202,17 @@ } } + .adf-no-permission { + &__row:hover { + cursor: default; + background-color: inherit; + } + + &__cell { + padding: 0 !important; + } + } + .ellipsis-cell { .cell-container { height: 100%; diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts index fa2e24523d..40d3ee4e40 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable/datatable.component.ts @@ -96,7 +96,11 @@ export class DataTableComponent implements AfterContentInit, OnChanges, DoCheck @Input() loading: boolean = false; + @Input() + noPermission: boolean = false; + noContentTemplate: TemplateRef; + noPermissionTemplate: TemplateRef; loadingTemplate: TemplateRef; isSelectAllChecked: boolean = false; diff --git a/ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.spec.ts b/ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.spec.ts new file mode 100644 index 0000000000..d8d6cfdaf5 --- /dev/null +++ b/ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.spec.ts @@ -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 { async, TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { CoreModule } from 'ng2-alfresco-core'; +import { DataTableCellComponent } from '../components/datatable/datatable-cell.component'; +import { DataTableComponent } from '../components/datatable/datatable.component'; +import { DateCellComponent } from '../components/datatable/date-cell.component'; +import { FileSizeCellComponent } from '../components/datatable/filesize-cell.component'; +import { LocationCellComponent } from '../components/datatable/location-cell.component'; +import { MaterialModule } from '../material.module'; +import { NoPermissionTemplateDirective } from './no-permission-template.directive'; + +describe('NoPermissionTemplateDirective', () => { + + let dataTable: DataTableComponent; + let directive: NoPermissionTemplateDirective; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + MaterialModule, + CoreModule + ], + declarations: [ + DataTableComponent, + DataTableCellComponent, + DateCellComponent, + NoPermissionTemplateDirective, + LocationCellComponent, + FileSizeCellComponent + ] + }).compileComponents(); + })); + + beforeEach(() => { + let fixture = TestBed.createComponent(DataTableComponent); + dataTable = fixture.componentInstance; + directive = new NoPermissionTemplateDirective(dataTable); + }); + + it('should apply template to the datatable', () => { + const template = {}; + directive.template = template; + directive.ngAfterContentInit(); + expect(dataTable.noPermissionTemplate).toBe(template); + }); +}); diff --git a/ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.ts b/ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.ts new file mode 100644 index 0000000000..878f646df2 --- /dev/null +++ b/ng2-components/ng2-alfresco-datatable/src/directives/no-permission-template.directive.ts @@ -0,0 +1,37 @@ +/*! + * @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 { AfterContentInit, ContentChild, Directive, TemplateRef } from '@angular/core'; +import { DataTableComponent } from '../components/datatable/datatable.component'; + +@Directive({ + selector: 'no-permission-template' +}) +export class NoPermissionTemplateDirective implements AfterContentInit { + + @ContentChild(TemplateRef) + template: any; + + constructor(private dataTable: DataTableComponent) { + } + + ngAfterContentInit() { + if (this.dataTable) { + this.dataTable.noPermissionTemplate = this.template; + } + } +} diff --git a/ng2-components/ng2-alfresco-documentlist/index.ts b/ng2-components/ng2-alfresco-documentlist/index.ts index a8b23ea3c1..97d3991a8a 100644 --- a/ng2-components/ng2-alfresco-documentlist/index.ts +++ b/ng2-components/ng2-alfresco-documentlist/index.ts @@ -30,6 +30,7 @@ import { ContentColumnComponent } from './src/components/content-column/content- import { ContentNodeSelectorComponent } from './src/components/content-node-selector/content-node-selector.component'; import { DocumentListComponent } from './src/components/document-list.component'; import { EmptyFolderContentDirective } from './src/components/empty-folder/empty-folder-content.directive'; +import { NoPermissionContentDirective } from './src/components/no-permission/no-permission-content.directive'; import { DropdownSitesComponent } from './src/components/site-dropdown/sites-dropdown.component'; import { VersionListComponent } from './src/components/version-manager/version-list.component'; import { VersionManagerComponent } from './src/components/version-manager/version-manager.component'; @@ -51,6 +52,7 @@ export * from './src/components/content-action/content-action.component'; export * from './src/components/content-action/content-action-list.component'; export * from './src/components/content-node-selector/content-node-selector.component'; export * from './src/components/empty-folder/empty-folder-content.directive'; +export * from './src/components/no-permission/no-permission-content.directive'; export * from './src/components/breadcrumb/breadcrumb.component'; export * from './src/components/site-dropdown/sites-dropdown.component'; @@ -77,6 +79,7 @@ export const DOCUMENT_LIST_DIRECTIVES: any[] = [ ContentActionComponent, ContentActionListComponent, EmptyFolderContentDirective, + NoPermissionContentDirective, BreadcrumbComponent, DropdownSitesComponent, DropdownBreadcrumbComponent, diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts index c26073e6ce..ac9cb2a798 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/content-node-selector/content-node-selector.component.spec.ts @@ -246,6 +246,7 @@ describe('ContentNodeSelectorComponent', () => { spyOn(documentListService, 'getFolderNode').and.returnValue(Promise.resolve(expectedDefaultFolderNode)); spyOn(documentListService, 'getFolder').and.returnValue(Observable.throw('No results for test')); spyOn(sitesApiService, 'getSites').and.returnValue(Observable.of([])); + spyOn(component.documentList, 'loadFolderNodesByFolderNodeId').and.returnValue(Promise.resolve()); component.currentFolderId = 'cat-girl-nuku-nuku'; fixture.detectChanges(); }); @@ -347,6 +348,12 @@ describe('ContentNodeSelectorComponent', () => { } beforeEach(() => { + const documentListService = TestBed.get(DocumentListService); + const expectedDefaultFolderNode = { path: { elements: [] } }; + + spyOn(documentListService, 'getFolderNode').and.returnValue(Promise.resolve(expectedDefaultFolderNode)); + spyOn(component.documentList, 'loadFolderNodesByFolderNodeId').and.returnValue(Promise.resolve()); + component.currentFolderId = 'cat-girl-nuku-nuku'; fixture.detectChanges(); }); @@ -458,7 +465,7 @@ describe('ContentNodeSelectorComponent', () => { fixture.detectChanges(); let documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); expect(documentList).not.toBeNull('Document list should be shown'); - expect(documentList.componentInstance.currentFolderId).toBeNull(); + expect(documentList.componentInstance.currentFolderId).toBeUndefined(); }); })); diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.html b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.html index 0c01856563..253e77e4c2 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.html +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.html @@ -9,6 +9,7 @@ [rowStyle]="rowStyle" [rowStyleClass]="rowStyleClass" [loading]="loading" + [noPermission]="noPermission" [showHeader]="!isEmpty()" (showRowContextMenu)="onShowRowContextMenu($event)" (showRowActionsMenu)="onShowRowActionsMenu($event)" @@ -34,6 +35,17 @@ +
+ + +
+ ic_error +

{{ 'ADF-DOCUMENT-LIST.NO_PERMISSION' | translate }}

+
+
+
+
+
diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.scss b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.scss index 70a24f6775..60bfe047ea 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.scss +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.scss @@ -16,6 +16,28 @@ margin-bottom: 20px; } + .adf-no-permission__template { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + width: 100%; + height: 100%; + min-height: 300px; + + mat-icon { + font-size: 52px; + height: 52px; + width: 52px; + direction: rtl; + } + + &--text { + color: mat-color($foreground, text); + font-size: 16px; + } + } + .document-list__this-space-is-empty { height: 32px; opacity: 0.26; diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts index 194a646677..a84131d501 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.spec.ts @@ -741,6 +741,25 @@ describe('DocumentList', () => { expect(documentList.isEmptyTemplateDefined()).toBeFalsy(); }); + it('should require dataTable to check no permission template', () => { + documentList.dataTable = null; + expect(documentList.isNoPermissionTemplateDefined()).toBe(false); + }); + + it('should return true if custom permission template is provided', () => { + documentList.noPermissionTemplate = > {}; + documentList.dataTable = new DataTableComponent(null, null); + + expect(documentList.isNoPermissionTemplateDefined()).toBe(true); + }); + + it('should return false if no custom permission template is provided', () => { + documentList.noPermissionTemplate = null; + documentList.dataTable = new DataTableComponent(null, null); + + expect(documentList.isNoPermissionTemplateDefined()).toBe(false); + }); + it('should empty folder NOT show the pagination', () => { documentList.emptyFolderTemplate = > {}; documentList.dataTable = new DataTableComponent(null, null); @@ -824,6 +843,44 @@ describe('DocumentList', () => { expect(documentList.loadFolderNodesByFolderNodeId).toHaveBeenCalled(); }); + it('should emit error when getFolderNode fails', (done) => { + const error = { message: '{ "error": { "statusCode": 501 } }' } ; + spyOn(documentListService, 'getFolderNode').and.returnValue(Promise.reject(error)); + + documentList.error.subscribe(val => { + expect(val).toBe(error); + done(); + }); + + documentList.loadFolderByNodeId('123'); + }); + + it('should emit error when loadFolderNodesByFolderNodeId fails', (done) => { + const error = { message: '{ "error": { "statusCode": 501 } }' } ; + spyOn(documentListService, 'getFolderNode').and.returnValue(Promise.resolve(fakeNodeWithCreatePermission)); + spyOn(documentList, 'loadFolderNodesByFolderNodeId').and.returnValue(Promise.reject(error)); + + documentList.error.subscribe(val => { + expect(val).toBe(error); + done(); + }); + + documentList.loadFolderByNodeId('123'); + }); + + it('should set no permision when getFolderNode fails with 403', (done) => { + const error = { message: '{ "error": { "statusCode": 403 } }' } ; + spyOn(documentListService, 'getFolderNode').and.returnValue(Promise.reject(error)); + + documentList.error.subscribe(val => { + expect(val).toBe(error); + expect(documentList.noPermission).toBe(true); + done(); + }); + + documentList.loadFolderByNodeId('123'); + }); + xit('should load previous page if there are no other elements in multi page table', (done) => { documentList.currentFolderId = '1d26e465-dea3-42f3-b415-faa8364b9692'; documentList.folderNode = new NodeMinimal(); diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts index 5b34a7c32c..ddc426fa4e 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.component.ts @@ -116,6 +116,7 @@ export class DocumentListComponent implements OnInit, OnChanges, AfterContentIni supportedPageSizes: number[]; infiniteLoading: boolean = false; + noPermission: boolean = false; selection = new Array(); skipCount: number = 0; @@ -161,6 +162,7 @@ export class DocumentListComponent implements OnInit, OnChanges, AfterContentIni errorMessage; actions: ContentActionModel[] = []; emptyFolderTemplate: TemplateRef; + noPermissionTemplate: TemplateRef; contextActionHandler: Subject = new Subject(); data: ShareDataTableAdapter; @@ -305,6 +307,15 @@ export class DocumentListComponent implements OnInit, OnChanges, AfterContentIni return false; } + isNoPermissionTemplateDefined(): boolean { + if (this.dataTable) { + if (this.noPermissionTemplate) { + return true; + } + } + return false; + } + isMobile(): boolean { return !!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } @@ -440,14 +451,21 @@ export class DocumentListComponent implements OnInit, OnChanges, AfterContentIni this.loadRecent(); } else { this.documentListService - .getFolderNode(nodeId).then(node => { + .getFolderNode(nodeId) + .then(node => { this.folderNode = node; this.currentFolderId = node.id; this.skipCount = 0; this.currentNodeAllowableOperations = node['allowableOperations'] ? node['allowableOperations'] : []; - this.loadFolderNodesByFolderNodeId(node.id, this.pageSize, this.skipCount).catch(err => this.error.emit(err)); + return this.loadFolderNodesByFolderNodeId(node.id, this.pageSize, this.skipCount); }) - .catch(err => this.error.emit(err)); + .catch(err => { + if (JSON.parse(err.message).error.statusCode === 403) { + this.loading = false; + this.noPermission = true; + } + this.error.emit(err); + }); } } diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.spec.ts new file mode 100644 index 0000000000..711a212830 --- /dev/null +++ b/ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.spec.ts @@ -0,0 +1,66 @@ +/*! + * @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, TestBed } from '@angular/core/testing'; +import { MatProgressSpinnerModule } from '@angular/material'; +import { CoreModule } from 'ng2-alfresco-core'; +import { DataTableComponent, DataTableModule } from 'ng2-alfresco-datatable'; +import { DocumentListService } from '../../services/document-list.service'; + +import { DocumentListComponent } from './../document-list.component'; +import { NoPermissionContentDirective } from './no-permission-content.directive'; + +describe('NoPermissionContentDirective', () => { + + let noPermissionContent: NoPermissionContentDirective; + let documentList: DocumentListComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + CoreModule, + DataTableModule, + MatProgressSpinnerModule + ], + declarations: [ + DocumentListComponent + ], + providers: [ + DocumentListService + ] + }).compileComponents(); + })); + + beforeEach(() => { + documentList = (TestBed.createComponent(DocumentListComponent).componentInstance as DocumentListComponent); + documentList.dataTable = new DataTableComponent(null, null); + noPermissionContent = new NoPermissionContentDirective(documentList); + }); + + it('should be defined', () => { + expect(noPermissionContent).toBeDefined(); + }); + + it('should set template', () => { + noPermissionContent.template = ''; + + noPermissionContent.ngAfterContentInit(); + + expect(noPermissionContent.template).toBe(documentList.noPermissionTemplate); + expect(noPermissionContent.template).toBe(documentList.dataTable.noPermissionTemplate); + }); +}); diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.ts b/ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.ts new file mode 100644 index 0000000000..582843d8d6 --- /dev/null +++ b/ng2-components/ng2-alfresco-documentlist/src/components/no-permission/no-permission-content.directive.ts @@ -0,0 +1,36 @@ +/*! + * @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 { AfterContentInit, ContentChild, Directive, TemplateRef } from '@angular/core'; +import { DocumentListComponent } from './../document-list.component'; + +@Directive({ + selector: 'no-permission-content' +}) +export class NoPermissionContentDirective implements AfterContentInit { + + @ContentChild(TemplateRef) + template: any; + + constructor(private documentList: DocumentListComponent) { + } + + ngAfterContentInit() { + this.documentList.noPermissionTemplate = this.template; + this.documentList.dataTable.noPermissionTemplate = this.template; + } +} diff --git a/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json b/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json index c1b3b5213f..3244b92a65 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json +++ b/ng2-components/ng2-alfresco-documentlist/src/i18n/en.json @@ -3,6 +3,7 @@ "EMPTY": { "HEADER": "This folder is empty" }, + "NO_PERMISSION": "You don't have permission to view this file or folder.", "LAYOUT": { "CREATED": "Created", "THUMBNAIL": "Thumbnail",