[ADF-3869] extensibility related components (#4107)

* extensions: dynamic column

* content: trashcan name column

* content: library status column

* content: library role column

* content: library name column

* style fixes

* content: name column

* demo: use name column in DL example

* fix tests

* lint fixes

* code fixes

* update docs

* add toggle to demo shell
This commit is contained in:
Denys Vuika
2019-01-03 14:07:07 +00:00
committed by GitHub
parent 21710cfcff
commit 9dba816877
29 changed files with 940 additions and 11 deletions

View File

@@ -0,0 +1,106 @@
/*!
* @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 { TrashcanNameColumnComponent } from './trashcan-name-column.component';
describe('TrashcanNameColumnComponent', () => {
let component;
beforeEach(() => {
component = new TrashcanNameColumnComponent();
});
it('should set displayText for content files', () => {
const context = {
data: { rows: [] },
row: {
node: {
entry: {
name: 'contentName',
nodeType: 'content'
}
}
}
};
component.context = context;
component.ngOnInit();
expect(component.displayText).toBe('contentName');
});
it('should set displayText for library', () => {
const context = {
data: {
rows: []
},
row: {
node: {
entry: {
nodeType: 'st:site',
properties: {
'cm:title': 'libraryTitle'
}
}
}
}
};
component.context = context;
component.ngOnInit();
expect(component.displayText).toBe('libraryTitle');
});
it('should set custom displayText for libraries with same name', () => {
const context = {
data: {
rows: [
{
node: {
entry: {
id: 'id1',
name: 'name1',
nodeType: 'st:site',
properties: {
'cm:title': 'bogus'
}
}
}
}
]
},
row: {
node: {
entry: {
id: 'id2',
name: 'name1',
nodeType: 'st:site',
properties: {
'cm:title': 'bogus'
}
}
}
}
};
component.context = context;
component.ngOnInit();
expect(component.displayText).toBe('bogus (name1)');
});
});

View File

@@ -0,0 +1,87 @@
/*!
* @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,
ChangeDetectionStrategy,
ViewEncapsulation,
OnInit,
Input
} from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { ShareDataRow } from '../../data/share-data-row.model';
@Component({
selector: 'adf-trashcan-name-column',
template: `
<ng-container *ngIf="!isLibrary">
<span title="{{ node | adfNodeNameTooltip }}">{{ displayText }}</span>
</ng-container>
<ng-container *ngIf="isLibrary">
<span title="{{ displayTooltip }}">{{ displayText }}</span>
</ng-container>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
host: { class: 'adf-datatable-cell adf-trashcan-name-column' }
})
export class TrashcanNameColumnComponent implements OnInit {
@Input()
context: any;
isLibrary = false;
displayText: string;
displayTooltip: string;
node: MinimalNodeEntity;
ngOnInit() {
this.node = this.context.row.node;
const rows: Array<ShareDataRow> = this.context.data.rows || [];
if (this.node && this.node.entry) {
this.isLibrary = this.node.entry.nodeType === 'st:site';
if (this.isLibrary) {
const { properties } = this.node.entry;
this.displayText = this.makeLibraryTitle(this.node.entry, rows);
this.displayTooltip =
properties['cm:description'] || properties['cm:title'];
} else {
this.displayText = this.node.entry.name || this.node.entry.id;
}
}
}
makeLibraryTitle(library: any, rows: Array<ShareDataRow>): string {
const entries = rows.map((r: ShareDataRow) => r.node.entry);
const { id } = library;
const title = library.properties['cm:title'];
let isDuplicate = false;
if (entries) {
isDuplicate = entries.some((entry: any) => {
return entry.id !== id && entry.properties['cm:title'] === title;
});
}
return isDuplicate
? `${library.properties['cm:title']} (${library.name})`
: `${library.properties['cm:title']}`;
}
}