[ADF-] update library to use new js-api 3.0.0 (#4097)

This commit is contained in:
Eugenio Romano
2019-01-08 16:29:30 +00:00
committed by Eugenio Romano
parent 2acd1b4e26
commit 3ef7d3b7ea
430 changed files with 1966 additions and 2149 deletions
@@ -17,7 +17,7 @@
import { CUSTOM_ELEMENTS_SCHEMA, SimpleChange } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PathElementEntity } from 'alfresco-js-api';
import { PathElementEntity } from '@alfresco/js-api';
import { setupTestBed } from '@alfresco/adf-core';
import { fakeNodeWithCreatePermission } from '../mock';
import { DocumentListComponent } from '../document-list';
@@ -17,7 +17,7 @@
import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core';
import { MatSelect } from '@angular/material';
import { MinimalNodeEntryEntity, PathElementEntity } from 'alfresco-js-api';
import { Node, PathElementEntity } from '@alfresco/js-api';
import { DocumentListComponent } from '../document-list';
@Component({
@@ -33,7 +33,7 @@ export class BreadcrumbComponent implements OnInit, OnChanges {
/** Active node, builds UI based on folderNode.path.elements collection. */
@Input()
folderNode: MinimalNodeEntryEntity = null;
folderNode: Node = null;
/** (optional) Name of the root element of the breadcrumb. You can use
* this property to rename "Company Home" to "Personal Files" for
@@ -88,7 +88,7 @@ export class BreadcrumbComponent implements OnInit, OnChanges {
ngOnChanges(changes: SimpleChanges): void {
if (changes.folderNode) {
let node: MinimalNodeEntryEntity = null;
let node: Node = null;
node = this.transform ? this.transform(changes.folderNode.currentValue) : changes.folderNode.currentValue;
this.route = this.parseRoute(node);
}
@@ -121,7 +121,7 @@ export class BreadcrumbComponent implements OnInit, OnChanges {
return this.previousNodes ? true : false;
}
parseRoute(node: MinimalNodeEntryEntity): PathElementEntity[] {
parseRoute(node: Node): PathElementEntity[] {
if (node && node.path) {
const route = <PathElementEntity[]> (node.path.elements || []).slice();
@@ -150,13 +150,13 @@ export class BreadcrumbComponent implements OnInit, OnChanges {
}
private getElementPosition(route: PathElementEntity[], nodeId: string): number {
let result: number = -1;
let position: number = -1;
if (route && route.length > 0 && nodeId) {
result = route.findIndex((el) => el.id === nodeId);
position = route.findIndex((el) => el.id === nodeId);
}
return result;
return position;
}
onRoutePathClick(route: PathElementEntity, event?: Event): void {
@@ -17,7 +17,7 @@
import { Component, OnChanges, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core';
import { MatSelect } from '@angular/material';
import { PathElementEntity, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { PathElementEntity, Node } from '@alfresco/js-api';
import { BreadcrumbComponent } from './breadcrumb.component';
@Component({
@@ -39,7 +39,7 @@ export class DropdownBreadcrumbComponent extends BreadcrumbComponent implements
ngOnChanges(changes: SimpleChanges): void {
if (changes.folderNode) {
let node: MinimalNodeEntryEntity = null;
let node: Node = null;
node = this.transform ? this.transform(changes.folderNode.currentValue) : changes.folderNode.currentValue;
this.route = this.parseRoute(node);
}
@@ -17,7 +17,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { ContentMetadataCardComponent } from './content-metadata-card.component';
import { ContentMetadataComponent } from '../content-metadata/content-metadata.component';
import { setupTestBed, PermissionsEnum } from '@alfresco/adf-core';
@@ -27,7 +27,7 @@ describe('ContentMetadataCardComponent', () => {
let component: ContentMetadataCardComponent;
let fixture: ComponentFixture<ContentMetadataCardComponent>;
let node: MinimalNodeEntryEntity;
let node: Node;
let preset = 'custom-preset';
setupTestBed({
@@ -37,7 +37,7 @@ describe('ContentMetadataCardComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(ContentMetadataCardComponent);
component = fixture.componentInstance;
node = <MinimalNodeEntryEntity> {
node = <Node> {
aspectNames: [],
nodeType: '',
content: {},
@@ -16,7 +16,7 @@
*/
import { Component, Input, ViewEncapsulation } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { ContentService, PermissionsEnum } from '@alfresco/adf-core';
@Component({
@@ -29,7 +29,7 @@ import { ContentService, PermissionsEnum } from '@alfresco/adf-core';
export class ContentMetadataCardComponent {
/** (required) The node entity to fetch metadata about */
@Input()
node: MinimalNodeEntryEntity;
node: Node;
/** (optional) This flag displays/hides empty metadata
* fields.
@@ -18,7 +18,7 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SimpleChange } from '@angular/core';
import { By } from '@angular/platform-browser';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { ContentMetadataComponent } from './content-metadata.component';
import { ContentMetadataService } from '../../services/content-metadata.service';
import { CardViewBaseItemModel, CardViewComponent, CardViewUpdateService, NodesApiService, LogService, setupTestBed } from '@alfresco/adf-core';
@@ -28,8 +28,8 @@ import { ContentTestingModule } from '../../../testing/content.testing.module';
describe('ContentMetadataComponent', () => {
let component: ContentMetadataComponent;
let fixture: ComponentFixture<ContentMetadataComponent>;
let node: MinimalNodeEntryEntity;
let folderNode: MinimalNodeEntryEntity;
let node: Node;
let folderNode: Node;
let preset = 'custom-preset';
setupTestBed({
@@ -40,7 +40,7 @@ describe('ContentMetadataComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(ContentMetadataComponent);
component = fixture.componentInstance;
node = <MinimalNodeEntryEntity> {
node = <Node> {
id: 'node-id',
aspectNames: [],
nodeType: '',
@@ -50,7 +50,7 @@ describe('ContentMetadataComponent', () => {
modifiedByUser: {}
};
folderNode = <MinimalNodeEntryEntity> {
folderNode = <Node> {
id: 'folder-id',
aspectNames: [],
nodeType: '',
@@ -16,7 +16,7 @@
*/
import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewEncapsulation } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { Observable, Subscription } from 'rxjs';
import { CardViewItem, NodesApiService, LogService, CardViewUpdateService, AlfrescoApiService } from '@alfresco/adf-core';
import { ContentMetadataService } from '../../services/content-metadata.service';
@@ -33,7 +33,7 @@ import { switchMap } from 'rxjs/operators';
export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
/** (required) The node entity to fetch metadata about */
@Input()
node: MinimalNodeEntryEntity;
node: Node;
/** Toggles whether the edit button should be shown */
@Input()
@@ -95,14 +95,14 @@ export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
}
}
private loadProperties(node: MinimalNodeEntryEntity) {
private loadProperties(node: Node) {
if (node) {
this.basicProperties$ = this.contentMetadataService.getBasicProperties(node);
this.groupedProperties$ = this.contentMetadataService.getGroupedProperties(node, this.preset);
}
}
private saveNode({ changed: nodeBody }): Observable<MinimalNodeEntryEntity> {
private saveNode({ changed: nodeBody }): Observable<Node> {
return this.nodesApiService.updateNode(this.node.id, nodeBody);
}
@@ -16,7 +16,7 @@
*/
import { Injectable } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { CardViewDateItemModel, CardViewTextItemModel, FileSizePipe } from '@alfresco/adf-core';
@Injectable({
@@ -27,7 +27,7 @@ export class BasicPropertiesService {
constructor(private fileSizePipe: FileSizePipe) {
}
getProperties(node: MinimalNodeEntryEntity) {
getProperties(node: Node) {
const sizeInBytes = node.content ? node.content.sizeInBytes : '',
mimeTypeName = node.content ? node.content.mimeTypeName : '',
@@ -16,7 +16,7 @@
*/
import { Injectable } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { BasicPropertiesService } from './basic-properties.service';
import { Observable, of } from 'rxjs';
import { PropertyGroupTranslatorService } from './property-groups-translator.service';
@@ -37,11 +37,11 @@ export class ContentMetadataService {
private propertyDescriptorsService: PropertyDescriptorsService) {
}
getBasicProperties(node: MinimalNodeEntryEntity): Observable<CardViewItem[]> {
getBasicProperties(node: Node): Observable<CardViewItem[]> {
return of(this.basicPropertiesService.getProperties(node));
}
getGroupedProperties(node: MinimalNodeEntryEntity, presetName: string = 'default'): Observable<CardViewGroup[]> {
getGroupedProperties(node: Node, presetName: string = 'default'): Observable<CardViewGroup[]> {
let groupedProperties = of([]);
if (node.aspectNames) {
@@ -19,7 +19,7 @@ import { TestBed } from '@angular/core/testing';
import { PropertyDescriptorsService } from './property-descriptors.service';
import { AlfrescoApiService, setupTestBed } from '@alfresco/adf-core';
import { of } from 'rxjs';
import { ClassesApi } from 'alfresco-js-api';
import { ClassesApi } from '@alfresco/js-api';
import { PropertyGroup } from '../interfaces/content-metadata.interfaces';
import { ContentTestingModule } from '../../testing/content.testing.module';
@@ -16,7 +16,7 @@
*/
import { TestBed, fakeAsync, tick } from '@angular/core/testing';
import { MinimalNodeEntryEntity, SitePaging } from 'alfresco-js-api';
import { NodeEntry, Node, SitePaging, Site } from '@alfresco/js-api';
import { AppConfigService, SitesService, setupTestBed } from '@alfresco/adf-core';
import { DocumentListService } from '../document-list/services/document-list.service';
import { ContentNodeDialogService } from './content-node-dialog.service';
@@ -24,13 +24,20 @@ import { MatDialog } from '@angular/material';
import { Subject, of } from 'rxjs';
import { ContentTestingModule } from '../testing/content.testing.module';
const fakeNode: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const fakeNodeEntry: NodeEntry = <NodeEntry> {
entry: {
id: 'fake',
name: 'fake-name'
}
};
const fakeSiteList: SitePaging = {
list: {
const fakeNode: Node = <Node> {
id: 'fake',
name: 'fake-name'
};
const fakeSiteList: SitePaging = new SitePaging({
list: {
pagination: {
count: 1,
hasMoreItems: false,
@@ -48,7 +55,7 @@ const fakeSiteList: SitePaging = {
}
]
}
};
});
describe('ContentNodeDialogService', () => {
@@ -82,12 +89,13 @@ describe('ContentNodeDialogService', () => {
});
it('should not open the lock node dialog if have no permission', () => {
const testNode: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const testNode: Node = <Node> {
id: 'fake',
isFile: false
};
service.openLockNodeDialog(testNode).subscribe(() => {}, (error) => {
service.openLockNodeDialog(testNode).subscribe(() => {
}, (error) => {
expect(error).toBe('OPERATION.FAIL.NODE.NO_PERMISSION');
});
});
@@ -103,7 +111,8 @@ describe('ContentNodeDialogService', () => {
it('should NOT be able to open the dialog when node has NOT permission', () => {
service.openCopyMoveDialog('fake-action', fakeNode, 'noperm').subscribe(
() => { },
() => {
},
(error) => {
expect(spyOnDialogOpen).not.toHaveBeenCalled();
expect(JSON.parse(error.message).error.statusCode).toBe(403);
@@ -111,24 +120,27 @@ describe('ContentNodeDialogService', () => {
});
it('should be able to open the dialog using a folder id', fakeAsync(() => {
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNode));
service.openFileBrowseDialogByFolderId('fake-folder-id').subscribe(() => {});
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNodeEntry));
service.openFileBrowseDialogByFolderId('fake-folder-id').subscribe(() => {
});
tick();
expect(spyOnDialogOpen).toHaveBeenCalled();
}));
it('should be able to open the dialog for files using the first user site', fakeAsync(() => {
spyOn(sitesService, 'getSites').and.returnValue(of(fakeSiteList));
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNode));
service.openFileBrowseDialogBySite().subscribe(() => {});
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNodeEntry));
service.openFileBrowseDialogBySite().subscribe(() => {
});
tick();
expect(spyOnDialogOpen).toHaveBeenCalled();
}));
it('should be able to open the dialog for folder using the first user site', fakeAsync(() => {
spyOn(sitesService, 'getSites').and.returnValue(of(fakeSiteList));
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNode));
service.openFolderBrowseDialogBySite().subscribe(() => {});
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNodeEntry));
service.openFolderBrowseDialogBySite().subscribe(() => {
});
tick();
expect(spyOnDialogOpen).toHaveBeenCalled();
}));
@@ -140,23 +152,23 @@ describe('ContentNodeDialogService', () => {
});
describe('for the copy/move dialog', () => {
const siteNode: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const siteNode: Node = <Node> {
id: 'site-node-id',
nodeType: 'st:site'
};
const sites: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const sites: Node = <Node> {
id: 'sites-id',
nodeType: 'st:sites'
};
const site: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const site: Site = <Site> {
id: 'site-id',
guid: 'any-guid'
};
const nodeEntryWithRightPermissions: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const nodeEntryWithRightPermissions: Node = <Node> {
id: 'node-id',
allowableOperations: ['create']
};
const nodeEntryNoPermissions: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const nodeEntryNoPermissions: Node = <Node> {
id: 'node-id',
allowableOperations: []
};
@@ -192,7 +204,7 @@ describe('ContentNodeDialogService', () => {
beforeEach(() => {
spyOnDialogOpen.and.callFake((contentNodeSelectorComponent: any, config: any) => {
testContentNodeSelectorComponentData = config.data;
return {componentInstance: {}};
return { componentInstance: {} };
});
service.openCopyMoveDialog('fake-action', fakeNode, '!update');
});
@@ -20,7 +20,7 @@ import { EventEmitter, Injectable, Output } from '@angular/core';
import { ContentService } from '@alfresco/adf-core';
import { Subject, Observable, throwError } from 'rxjs';
import { ShareDataRow } from '../document-list/data/share-data-row.model';
import { MinimalNodeEntryEntity, SitePaging } from 'alfresco-js-api';
import { Node, NodeEntry, SitePaging } from '@alfresco/js-api';
import { DataColumn, SitesService, TranslationService, PermissionsEnum } from '@alfresco/adf-core';
import { DocumentListService } from '../document-list/services/document-list.service';
import { ContentNodeSelectorComponent } from './content-node-selector.component';
@@ -49,9 +49,9 @@ export class ContentNodeDialogService {
* @param folderNodeId ID of the folder to use
* @returns Information about the selected file(s)
*/
openFileBrowseDialogByFolderId(folderNodeId: string): Observable<MinimalNodeEntryEntity[]> {
return this.documentListService.getFolderNode(folderNodeId).pipe(switchMap((node: MinimalNodeEntryEntity) => {
return this.openUploadFileDialog('Choose', node);
openFileBrowseDialogByFolderId(folderNodeId: string): Observable<Node[]> {
return this.documentListService.getFolderNode(folderNodeId).pipe(switchMap((nodeEntry: NodeEntry) => {
return this.openUploadFileDialog('Choose', nodeEntry.entry);
}));
}
@@ -60,7 +60,7 @@ export class ContentNodeDialogService {
* @param contentEntry Node to lock
* @returns Error/status message (if any)
*/
public openLockNodeDialog(contentEntry: MinimalNodeEntryEntity): Subject<string> {
public openLockNodeDialog(contentEntry: Node): Subject<string> {
const observable: Subject<string> = new Subject<string>();
if (this.contentService.hasPermission(contentEntry, PermissionsEnum.LOCK)) {
@@ -85,7 +85,7 @@ export class ContentNodeDialogService {
* Opens a file browser at a chosen site location.
* @returns Information about the selected file(s)
*/
openFileBrowseDialogBySite(): Observable<MinimalNodeEntryEntity[]> {
openFileBrowseDialogBySite(): Observable<Node[]> {
return this.siteService.getSites().pipe(switchMap((response: SitePaging) => {
return this.openFileBrowseDialogByFolderId(response.list.entries[0].entry.guid);
}));
@@ -95,7 +95,7 @@ export class ContentNodeDialogService {
* Opens a folder browser at a chosen site location.
* @returns Information about the selected folder(s)
*/
openFolderBrowseDialogBySite(): Observable<MinimalNodeEntryEntity[]> {
openFolderBrowseDialogBySite(): Observable<Node[]> {
return this.siteService.getSites().pipe(switchMap((response: SitePaging) => {
return this.openFolderBrowseDialogByFolderId(response.list.entries[0].entry.guid);
}));
@@ -106,9 +106,9 @@ export class ContentNodeDialogService {
* @param folderNodeId ID of the folder to use
* @returns Information about the selected folder(s)
*/
openFolderBrowseDialogByFolderId(folderNodeId: string): Observable<MinimalNodeEntryEntity[]> {
return this.documentListService.getFolderNode(folderNodeId).pipe(switchMap((node: MinimalNodeEntryEntity) => {
return this.openUploadFolderDialog('Choose', node);
openFolderBrowseDialogByFolderId(folderNodeId: string): Observable<Node[]> {
return this.documentListService.getFolderNode(folderNodeId).pipe(switchMap((node: NodeEntry) => {
return this.openUploadFolderDialog('Choose', node.entry);
}));
}
@@ -119,10 +119,10 @@ export class ContentNodeDialogService {
* @param permission Permission for the operation
* @returns Information about files that were copied/moved
*/
openCopyMoveDialog(action: string, contentEntry: MinimalNodeEntryEntity, permission?: string): Observable<MinimalNodeEntryEntity[]> {
openCopyMoveDialog(action: string, contentEntry: Node, permission?: string): Observable<Node[]> {
if (this.contentService.hasPermission(contentEntry, permission)) {
const select = new Subject<MinimalNodeEntryEntity[]>();
const select = new Subject<Node[]>();
select.subscribe({
complete: this.close.bind(this)
});
@@ -164,8 +164,8 @@ export class ContentNodeDialogService {
* @param contentEntry Item to upload
* @returns Information about the chosen folder(s)
*/
openUploadFolderDialog(action: string, contentEntry: MinimalNodeEntryEntity): Observable<MinimalNodeEntryEntity[]> {
const select = new Subject<MinimalNodeEntryEntity[]>();
openUploadFolderDialog(action: string, contentEntry: Node): Observable<Node[]> {
const select = new Subject<Node[]>();
select.subscribe({
complete: this.close.bind(this)
});
@@ -190,8 +190,8 @@ export class ContentNodeDialogService {
* @param contentEntry Item to upload
* @returns Information about the chosen file(s)
*/
openUploadFileDialog(action: string, contentEntry: MinimalNodeEntryEntity): Observable<MinimalNodeEntryEntity[]> {
const select = new Subject<MinimalNodeEntryEntity[]>();
openUploadFileDialog(action: string, contentEntry: Node): Observable<Node[]> {
const select = new Subject<Node[]>();
select.subscribe({
complete: this.close.bind(this)
});
@@ -214,7 +214,7 @@ export class ContentNodeDialogService {
}
private imageResolver(row: ShareDataRow, col: DataColumn): string | null {
const entry: MinimalNodeEntryEntity = row.node.entry;
const entry: Node = row.node.entry;
if (!this.contentService.hasPermission(entry, 'create')) {
return this.documentListService.getMimeTypeIcon('disable/folder');
}
@@ -223,7 +223,7 @@ export class ContentNodeDialogService {
}
private rowFilter(currentNodeId, row: ShareDataRow): boolean {
const node: MinimalNodeEntryEntity = row.node.entry;
const node: Node = row.node.entry;
if (node.id === currentNodeId || node.isFile) {
return false;
@@ -232,23 +232,23 @@ export class ContentNodeDialogService {
}
}
private isNodeFile(entry: MinimalNodeEntryEntity): boolean {
private isNodeFile(entry: Node): boolean {
return entry.isFile;
}
private hasPermissionOnNodeFolder(entry: MinimalNodeEntryEntity): boolean {
private hasPermissionOnNodeFolder(entry: Node): boolean {
return this.isNodeFolder(entry) && this.contentService.hasPermission(entry, 'create');
}
private isNodeFolder(entry: MinimalNodeEntryEntity): boolean {
private isNodeFolder(entry: Node): boolean {
return entry.isFolder;
}
private isCopyMoveSelectionValid(entry: MinimalNodeEntryEntity): boolean {
private isCopyMoveSelectionValid(entry: Node): boolean {
return this.hasEntityCreatePermission(entry) && !this.isSite(entry);
}
private hasEntityCreatePermission(entry: MinimalNodeEntryEntity): boolean {
private hasEntityCreatePermission(entry: Node): boolean {
return this.contentService.hasPermission(entry, 'create');
}
@@ -18,13 +18,13 @@
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { async, fakeAsync, tick, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { MinimalNodeEntryEntity, SiteEntry, SitePaging } from 'alfresco-js-api';
import { NodeEntry, Node, SiteEntry, SitePaging } from '@alfresco/js-api';
import { SearchService, SitesService, setupTestBed } from '@alfresco/adf-core';
import { Observable, Observer, of, throwError } from 'rxjs';
import { DropdownBreadcrumbComponent } from '../breadcrumb';
import { ContentNodeSelectorPanelComponent } from './content-node-selector-panel.component';
import { ContentNodeSelectorService } from './content-node-selector.service';
import { NodePaging } from 'alfresco-js-api';
import { NodePaging } from '@alfresco/js-api';
import { ContentTestingModule } from '../testing/content.testing.module';
import { DocumentListService } from '../document-list/services/document-list.service';
import { DocumentListComponent } from '../document-list/components/document-list.component';
@@ -98,7 +98,7 @@ describe('ContentNodeSelectorComponent', () => {
describe('Parameters', () => {
it('should trigger the select event when selection has been made', (done) => {
const expectedNode = <MinimalNodeEntryEntity> {};
const expectedNode = <Node> {};
component.select.subscribe((nodes) => {
expect(nodes.length).toBe(1);
expect(nodes[0]).toBe(expectedNode);
@@ -116,10 +116,10 @@ describe('ContentNodeSelectorComponent', () => {
expectedDefaultFolderNode;
beforeEach(() => {
expectedDefaultFolderNode = <MinimalNodeEntryEntity> { path: { elements: [] } };
expectedDefaultFolderNode = <Node> { path: { elements: [] } };
documentListService = TestBed.get(DocumentListService);
sitesService = TestBed.get(SitesService);
spyOn(documentListService, 'getFolderNode').and.returnValue(of(expectedDefaultFolderNode));
spyOn(documentListService, 'getFolderNode').and.returnValue(of(<NodeEntry> { entry: { path: { elements: [] } } }));
spyOn(documentListService, 'getFolder').and.returnValue(throwError('No results for test'));
spyOn(sitesService, 'getSites').and.returnValue(of({ list: { entries: [] } }));
spyOn(component.documentList, 'loadFolderNodesByFolderNodeId').and.returnValue(Promise.resolve());
@@ -134,7 +134,7 @@ describe('ContentNodeSelectorComponent', () => {
fixture.detectChanges();
const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent));
expect(breadcrumb).not.toBeNull();
expect(breadcrumb.componentInstance.folderNode).toBe(expectedDefaultFolderNode);
expect(breadcrumb.componentInstance.folderNode).toEqual(expectedDefaultFolderNode);
done();
});
});
@@ -189,7 +189,7 @@ describe('ContentNodeSelectorComponent', () => {
tick(debounceSearch);
const chosenNode = <MinimalNodeEntryEntity> { path: { elements: ['one'] } };
const chosenNode = new Node({ path: { elements: ['one'] } });
component.onNodeSelect({ detail: { node: { entry: chosenNode } } });
fixture.detectChanges();
@@ -210,13 +210,13 @@ describe('ContentNodeSelectorComponent', () => {
component.onFolderChange();
fixture.detectChanges();
const chosenNode = <MinimalNodeEntryEntity> { path: { elements: [] } };
const chosenNode = <Node> { path: { elements: [] } };
component.onNodeSelect({ detail: { node: { entry: chosenNode } } });
fixture.detectChanges();
const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent));
expect(breadcrumb).not.toBeNull();
expect(breadcrumb.componentInstance.folderNode).toBe(expectedDefaultFolderNode);
expect(breadcrumb.componentInstance.folderNode).toEqual(expectedDefaultFolderNode);
done();
}, 300);
});
@@ -229,13 +229,13 @@ describe('ContentNodeSelectorComponent', () => {
expect(component.breadcrumbTransform).toBeNull();
const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent));
expect(breadcrumb.componentInstance.folderNode).toBe(expectedDefaultFolderNode);
expect(breadcrumb.componentInstance.folderNode).toEqual(expectedDefaultFolderNode);
done();
});
});
it('should make changes to breadcrumb\'s folderNode if breadcrumbTransform is defined', (done) => {
const transformedFolderNode = <MinimalNodeEntryEntity> {
const transformedFolderNode = <Node> {
id: 'trans-node',
name: 'trans-node-name',
path: { elements: [{ id: 'testId', name: 'testName' }] }
@@ -288,7 +288,7 @@ describe('ContentNodeSelectorComponent', () => {
beforeEach(() => {
const documentListService = TestBed.get(DocumentListService);
const expectedDefaultFolderNode = <MinimalNodeEntryEntity> { path: { elements: [] } };
const expectedDefaultFolderNode = <NodeEntry> { entry: { path: { elements: [] } } };
spyOn(documentListService, 'getFolderNode').and.returnValue(of(expectedDefaultFolderNode));
spyOn(component.documentList, 'loadFolderNodesByFolderNodeId').and.returnValue(Promise.resolve());
@@ -319,7 +319,7 @@ describe('ContentNodeSelectorComponent', () => {
}));
it('should reset the currently chosen node in case of starting a new search', fakeAsync(() => {
component.chosenNode = <MinimalNodeEntryEntity> {};
component.chosenNode = <Node> {};
typeToSearchBox('kakarot');
tick(debounceSearch);
@@ -458,7 +458,7 @@ describe('ContentNodeSelectorComponent', () => {
}));
it('should clear the search field, nodes and chosenNode when clicking on the X (clear) icon', () => {
component.chosenNode = <MinimalNodeEntryEntity> {};
component.chosenNode = <Node> {};
component.nodes = {
list: {
entries: [{ entry: component.chosenNode }]
@@ -684,7 +684,7 @@ describe('ContentNodeSelectorComponent', () => {
describe('Chosen node', () => {
const entry: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {};
const entry: Node = <Node> {};
const nodePage: NodePaging = <NodePaging> { list: {}, pagination: {} };
let hasPermission;
@@ -783,7 +783,7 @@ describe('ContentNodeSelectorComponent', () => {
it('should be null when the chosenNode is reset', async(() => {
hasPermission = true;
component.onNodeSelect({ detail: { node: { entry: <MinimalNodeEntryEntity> {} } } });
component.onNodeSelect({ detail: { node: { entry: <Node> {} } } });
fixture.detectChanges();
component.select.subscribe((nodes) => {
@@ -833,7 +833,7 @@ describe('ContentNodeSelectorComponent', () => {
it('should be null when the chosenNode is reset', async(() => {
fixture.detectChanges();
component.onNodeSelect({ detail: { node: { entry: <MinimalNodeEntryEntity> {} } } });
component.onNodeSelect({ detail: { node: { entry: <Node> {} } } });
fixture.detectChanges();
component.select.subscribe((nodes) => {
@@ -885,7 +885,7 @@ describe('ContentNodeSelectorComponent', () => {
it('should be null when the chosenNode is reset', async(() => {
fixture.detectChanges();
component.onNodeSelect({ detail: { node: { entry: <MinimalNodeEntryEntity> {} } } });
component.onNodeSelect({ detail: { node: { entry: <Node> {} } } });
fixture.detectChanges();
component.select.subscribe((nodes) => {
@@ -21,7 +21,7 @@ import {
PaginatedComponent, PaginationModel
} from '@alfresco/adf-core';
import { FormControl } from '@angular/forms';
import { MinimalNodeEntryEntity, NodePaging, Pagination, SiteEntry, SitePaging } from 'alfresco-js-api';
import { Node, NodePaging, Pagination, SiteEntry, SitePaging } from '@alfresco/js-api';
import { DocumentListComponent, PaginationStrategy } from '../document-list/components/document-list.component';
import { RowFilter } from '../document-list/data/row-filter.model';
import { ImageResolver } from '../document-list/data/image-resolver.model';
@@ -30,7 +30,7 @@ import { debounceTime } from 'rxjs/operators';
import { BehaviorSubject } from 'rxjs';
import { CustomResourcesService } from '../document-list/services/custom-resources.service';
export type ValidationFunction = (entry: MinimalNodeEntryEntity) => boolean;
export type ValidationFunction = (entry: Node) => boolean;
const defaultValidation = () => true;
@@ -95,7 +95,7 @@ export class ContentNodeSelectorPanelComponent implements OnInit, PaginatedCompo
/** Emitted when the user has chosen an item. */
@Output()
select: EventEmitter<MinimalNodeEntryEntity[]> = new EventEmitter<MinimalNodeEntryEntity[]>();
select: EventEmitter<Node[]> = new EventEmitter<Node[]>();
@ViewChild('documentList')
documentList: DocumentListComponent;
@@ -109,7 +109,7 @@ export class ContentNodeSelectorPanelComponent implements OnInit, PaginatedCompo
showingSearchResults: boolean = false;
loadingSearchResults: boolean = false;
inDialog: boolean = false;
_chosenNode: MinimalNodeEntryEntity = null;
_chosenNode: Node = null;
folderIdToShow: string | null = null;
paginationStrategy: PaginationStrategy = PaginationStrategy.Infinite;
pagination: BehaviorSubject<PaginationModel>;
@@ -141,7 +141,7 @@ export class ContentNodeSelectorPanelComponent implements OnInit, PaginatedCompo
this.pagination = new BehaviorSubject<PaginationModel>(defaultPagination);
}
set chosenNode(value: MinimalNodeEntryEntity) {
set chosenNode(value: Node) {
this._chosenNode = value;
let valuesArray = null;
if (value) {
@@ -184,8 +184,8 @@ export class ContentNodeSelectorPanelComponent implements OnInit, PaginatedCompo
/**
* Returns the actually selected|entered folder node or null in case of searching for the breadcrumb
*/
get breadcrumbFolderNode(): MinimalNodeEntryEntity | null {
let folderNode: MinimalNodeEntryEntity;
get breadcrumbFolderNode(): Node | null {
let folderNode: Node;
if (this.showingSearchResults && this.chosenNode) {
folderNode = this.chosenNode;
@@ -345,7 +345,7 @@ export class ContentNodeSelectorPanelComponent implements OnInit, PaginatedCompo
*
* @param entry
*/
private attemptNodeSelection(entry: MinimalNodeEntryEntity): void {
private attemptNodeSelection(entry: Node): void {
if (this.isSelectionValid(entry)) {
this.chosenNode = entry;
} else {
@@ -369,8 +369,8 @@ export class ContentNodeSelectorPanelComponent implements OnInit, PaginatedCompo
this.attemptNodeSelection(event.detail.node.entry);
}
onNodeDoubleClick(e: CustomEvent) {
const node: any = e.detail.node.entry;
onNodeDoubleClick(customEvent: CustomEvent) {
const node: any = customEvent.detail.node.entry;
if (node && node.guid) {
const options = {
@@ -15,7 +15,7 @@
* limitations under the License.
*/
import { MinimalNodeEntryEntity, SitePaging } from 'alfresco-js-api';
import { Node, SitePaging } from '@alfresco/js-api';
import { Subject } from 'rxjs';
export interface ContentNodeSelectorComponentData {
@@ -26,7 +26,7 @@ export interface ContentNodeSelectorComponentData {
dropdownSiteList?: SitePaging;
rowFilter?: any;
imageResolver?: any;
isSelectionValid?: (entry: MinimalNodeEntryEntity) => boolean;
isSelectionValid?: (entry: Node) => boolean;
breadcrumbTransform?: (node) => any;
select: Subject<MinimalNodeEntryEntity[]>;
select: Subject<Node[]>;
}
@@ -20,7 +20,7 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { EventEmitter } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ContentNodeSelectorComponent } from './content-node-selector.component';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { By } from '@angular/platform-browser';
import { setupTestBed, SitesService } from '@alfresco/adf-core';
import { of } from 'rxjs';
@@ -35,7 +35,7 @@ describe('ContentNodeSelectorDialogComponent', () => {
let data: any = {
title: 'Move along citizen...',
actionName: 'move',
select: new EventEmitter<MinimalNodeEntryEntity>(),
select: new EventEmitter<Node>(),
rowFilter: () => {
},
imageResolver: () => 'piccolo',
@@ -140,7 +140,7 @@ describe('ContentNodeSelectorDialogComponent', () => {
});
it('should be enabled when a node is chosen', () => {
component.onSelect([{ id: 'fake' }]);
component.onSelect([new Node({ id: 'fake' })]);
fixture.detectChanges();
let actionButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-actions-choose"]'));
@@ -17,7 +17,7 @@
import { Component, Inject, ViewEncapsulation, Input } from '@angular/core';
import { MAT_DIALOG_DATA } from '@angular/material';
import { MinimalNodeEntryEntity, SitePaging } from 'alfresco-js-api';
import { Node, SitePaging } from '@alfresco/js-api';
import { ContentNodeSelectorComponentData } from './content-node-selector.component-data.interface';
import { RowFilter } from '../document-list/data/row-filter.model';
import { ImageResolver } from '../document-list/data/image-resolver.model';
@@ -73,7 +73,7 @@ export class ContentNodeSelectorComponent {
pageSize: number;
buttonActionName: string;
chosenNode: MinimalNodeEntryEntity[];
chosenNode: Node[];
constructor(@Inject(MAT_DIALOG_DATA) public data: ContentNodeSelectorComponentData) {
this.buttonActionName = data.actionName ? `NODE_SELECTOR.${data.actionName.toUpperCase()}` : 'NODE_SELECTOR.CHOOSE';
@@ -83,7 +83,7 @@ export class ContentNodeSelectorComponent {
this.data.select.complete();
}
onSelect(nodeList: MinimalNodeEntryEntity[]) {
onSelect(nodeList: Node[]) {
this.chosenNode = nodeList;
}
@@ -16,7 +16,7 @@
*/
import { TestBed } from '@angular/core/testing';
import { QueryBody } from 'alfresco-js-api';
import { QueryBody } from '@alfresco/js-api';
import { SearchService, setupTestBed } from '@alfresco/adf-core';
import { ContentNodeSelectorService } from './content-node-selector.service';
import { ContentTestingModule } from '../testing/content.testing.module';
@@ -17,7 +17,7 @@
import { SearchService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { NodePaging } from 'alfresco-js-api';
import { NodePaging } from '@alfresco/js-api';
import { Observable } from 'rxjs';
/**
@@ -78,10 +78,6 @@ describe('ShareDialogComponent', () => {
};
});
afterEach(() => {
fixture.destroy();
});
it(`should toggle share action when property 'sharedId' does not exists`, () => {
spyOn(sharedLinksApiService, 'createSharedLinks').and.returnValue(of({
entry: { id: 'sharedId', sharedId: 'sharedId' }
@@ -34,7 +34,7 @@ import {
ContentService,
RenditionsService
} from '@alfresco/adf-core';
import { SharedLinkEntry, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { SharedLinkEntry, Node } from '@alfresco/js-api';
import { ConfirmDialogComponent } from '../dialogs/confirm.dialog';
import moment from 'moment-es6';
@@ -195,7 +195,7 @@ export class ShareDialogComponent implements OnInit, OnDestroy {
});
}
private updateNode(updates): Observable<MinimalNodeEntryEntity> {
private updateNode(updates): Observable<Node> {
return this.nodesApiService.updateNode(
this.data.node.entry.id,
{
@@ -28,7 +28,7 @@ import { ContentNodeShareModule } from './content-node-share.module';
@Component({
selector: 'adf-node-share-test-component',
template: `
<button
<button
[disabled]="!shareRef.isFile"
#shareRef="adfShare"
[baseShareUrl]="baseShareUrl"
@@ -75,7 +75,9 @@ describe('NodeSharedDirective', () => {
});
afterEach(() => {
fixture.destroy();
if (fixture) {
fixture.destroy();
}
});
beforeEach(() => {
@@ -88,67 +90,61 @@ describe('NodeSharedDirective', () => {
};
});
it('should have share button disabled when selection is empty', async() => {
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(shareButtonElement.disabled).toBe(true);
});
it('should have share button disabled when selection is empty', async () => {
fixture.whenStable();
fixture.detectChanges();
expect(shareButtonElement.disabled).toBe(true);
});
it('should have button enabled when selection is not empty', () => {
it('should have button enabled when selection is not empty', async () => {
component.documentList.selection = [selection];
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(shareButtonElement.disabled).toBe(false);
});
fixture.whenStable();
fixture.detectChanges();
expect(shareButtonElement.disabled).toBe(false);
});
it('should have button disabled when selection is not a file', () => {
it('should have button disabled when selection is not a file', async () => {
selection.entry.isFile = false;
component.documentList.selection = [selection];
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(shareButtonElement.disabled).toBe(true);
});
fixture.whenStable();
fixture.detectChanges();
expect(shareButtonElement.disabled).toBe(true);
});
it('should indicate if file is not shared', () => {
it('should indicate if file is not shared', async () => {
component.documentList.selection = [selection];
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(shareButtonElement.title).toBe('Not Shared');
});
fixture.whenStable();
fixture.detectChanges();
expect(shareButtonElement.title).toBe('Not Shared');
});
it('should indicate if file is already shared', () => {
it('should indicate if file is already shared', async () => {
selection.entry.properties['qshare:sharedId'] = 'someId';
component.documentList.selection = [selection];
fixture.detectChanges();
fixture.whenStable();
fixture.detectChanges();
expect(shareButtonElement.title).toBe('Shared');
});
it('should open share dialog on click event', async () => {
selection.entry.properties['qshare:sharedId'] = 'someId';
component.documentList.selection = [selection];
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(shareButtonElement.title).toBe('Shared');
});
});
it('should open share dialog on click event', () => {
selection.entry.properties['qshare:sharedId'] = 'someId';
component.documentList.selection = [selection];
fixture.whenStable();
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
shareButtonElement.click();
fixture.detectChanges();
shareButtonElement.click();
fixture.detectChanges();
expect(document.querySelector('.adf-share-link-dialog')).not.toBe(null);
});
expect(document.querySelector('.adf-share-link-dialog')).not.toBe(null);
});
});
@@ -17,7 +17,7 @@
import { Directive, Input, HostListener, OnChanges, NgZone } from '@angular/core';
import { MatDialog } from '@angular/material';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { ShareDialogComponent } from './content-node-share.dialog';
@@ -33,7 +33,7 @@ export class NodeSharedDirective implements OnChanges {
/** Node to share. */
// tslint:disable-next-line:no-input-rename
@Input('adf-share')
node: MinimalNodeEntity;
node: NodeEntry;
/** Prefix to add to the generated link. */
@Input()
@@ -48,7 +48,7 @@ export class NodeSharedDirective implements OnChanges {
constructor(private dialog: MatDialog, private zone: NgZone) {}
shareNode(node: MinimalNodeEntity) {
shareNode(node: NodeEntry) {
if (node && node.entry && node.entry.isFile) {
this.dialog.open(ShareDialogComponent, {
width: '600px',
@@ -21,7 +21,7 @@ import { Component, Inject, OnInit, Optional, EventEmitter, Output } from '@angu
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { NodesApiService, TranslationService } from '@alfresco/adf-core';
import { forbidEndingDot, forbidOnlySpaces, forbidSpecialCharacters } from './folder-name.validators';
@@ -35,7 +35,7 @@ export class FolderDialogComponent implements OnInit {
form: FormGroup;
folder: MinimalNodeEntryEntity = null;
folder: Node = null;
/** Emitted when the edit/create folder give error for example a folder with same name already exist
*/
@@ -45,7 +45,7 @@ export class FolderDialogComponent implements OnInit {
/** Emitted when the edit/create folder is successfully created/modified
*/
@Output()
success: EventEmitter<any> = new EventEmitter<MinimalNodeEntryEntity>();
success: EventEmitter<any> = new EventEmitter<Node>();
editTitle = 'CORE.FOLDER_DIALOG.EDIT_FOLDER_TITLE';
createTitle = 'CORE.FOLDER_DIALOG.CREATE_FOLDER_TITLE';
@@ -119,12 +119,12 @@ export class FolderDialogComponent implements OnInit {
};
}
private create(): Observable<MinimalNodeEntryEntity> {
private create(): Observable<Node> {
const { name, properties, nodeType, nodesApi, data: { parentNodeId} } = this;
return nodesApi.createFolder(parentNodeId, { name, properties, nodeType });
}
private edit(): Observable<MinimalNodeEntryEntity> {
private edit(): Observable<Node> {
const { name, properties, nodesApi, data: { folder: { id: nodeId }} } = this;
return nodesApi.updateNode(nodeId, { name, properties });
}
@@ -136,7 +136,7 @@ export class FolderDialogComponent implements OnInit {
(editing ? this.edit() : this.create())
.subscribe(
(folder: MinimalNodeEntryEntity) => {
(folder: Node) => {
this.success.emit(folder);
dialog.close(folder);
},
@@ -23,237 +23,240 @@ import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { MatDialogRef } from '@angular/material';
import {
AlfrescoApiService,
AlfrescoApiServiceMock,
setupTestBed
AlfrescoApiService,
AlfrescoApiServiceMock,
setupTestBed
} from '@alfresco/adf-core';
describe('LibraryDialogComponent', () => {
let fixture;
let component;
let alfrescoApi;
let findSitesSpy;
const findSitesResponse = { list: { entries: [] } };
const dialogRef = {
close: jasmine.createSpy('close')
};
let fixture;
let component;
let alfrescoApi;
let findSitesSpy;
const findSitesResponse = { list: { entries: [] } };
const dialogRef = {
close: jasmine.createSpy('close')
};
setupTestBed({
imports: [NoopAnimationsModule, CoreModule, ReactiveFormsModule],
declarations: [LibraryDialogComponent],
providers: [
{
provide: AlfrescoApiService,
useClass: AlfrescoApiServiceMock
},
{ provide: MatDialogRef, useValue: dialogRef }
],
schemas: [NO_ERRORS_SCHEMA]
});
beforeEach(() => {
fixture = TestBed.createComponent(LibraryDialogComponent);
component = fixture.componentInstance;
alfrescoApi = TestBed.get(AlfrescoApiService);
findSitesSpy = spyOn(alfrescoApi.getInstance().core.queriesApi, 'findSites');
});
afterEach(() => {
findSitesSpy.calls.reset();
});
it('should set library id automatically on title input', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
setupTestBed({
imports: [NoopAnimationsModule, CoreModule, ReactiveFormsModule],
declarations: [LibraryDialogComponent],
providers: [
{
provide: AlfrescoApiService,
useClass: AlfrescoApiServiceMock
},
{ provide: MatDialogRef, useValue: dialogRef }
],
schemas: [NO_ERRORS_SCHEMA]
});
fixture.detectChanges();
component.form.controls.title.setValue('libraryTitle');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe('libraryTitle');
}));
it('should translate library title space character to dash for library id', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
beforeEach(() => {
fixture = TestBed.createComponent(LibraryDialogComponent);
component = fixture.componentInstance;
alfrescoApi = TestBed.get(AlfrescoApiService);
findSitesSpy = spyOn(alfrescoApi.getInstance().core.queriesApi, 'findSites');
});
fixture.detectChanges();
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe('library-title');
}));
it('should not change custom library id on title input', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
afterEach(() => {
findSitesSpy.calls.reset();
});
fixture.detectChanges();
component.form.controls.id.setValue('custom-id');
component.form.controls.id.markAsDirty();
tick(500);
flush();
fixture.detectChanges();
it('should set library id automatically on title input', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.title.setValue('libraryTitle');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe('custom-id');
}));
expect(component.form.controls.id.value).toBe('libraryTitle');
}));
it('should invalidate form when library id already exists', fakeAsync(() => {
spyOn(alfrescoApi.sitesApi, 'getSite').and.returnValue(Promise.resolve());
it('should translate library title space character to dash for library id', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
fixture.detectChanges();
component.form.controls.id.setValue('existingLibrary');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.errors).toEqual({
message: 'LIBRARY.ERRORS.EXISTENT_SITE'
});
expect(component.form.valid).toBe(false);
}));
expect(component.form.controls.id.value).toBe('library-title');
}));
it('should create site when form is valid', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'createSite').and.returnValue(
Promise.resolve()
);
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
it('should not change custom library id on title input', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
fixture.detectChanges();
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.id.setValue('custom-id');
component.form.controls.id.markAsDirty();
tick(500);
flush();
fixture.detectChanges();
component.submit();
fixture.detectChanges();
flush();
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
expect(alfrescoApi.sitesApi.createSite).toHaveBeenCalledWith({
id: 'library-title',
title: 'library title',
description: '',
visibility: 'PUBLIC'
});
}));
expect(component.form.controls.id.value).toBe('custom-id');
}));
it('should not create site when form is invalid', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'createSite').and.returnValue(
Promise.resolve({})
);
spyOn(alfrescoApi.sitesApi, 'getSite').and.returnValue(Promise.resolve());
it('should invalidate form when library id already exists', fakeAsync(() => {
spyOn(alfrescoApi.sitesApi, 'getSite').and.returnValue(Promise.resolve());
fixture.detectChanges();
component.form.controls.title.setValue('existingLibrary');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.id.setValue('existingLibrary');
tick(500);
flush();
fixture.detectChanges();
component.submit();
fixture.detectChanges();
flush();
expect(component.form.controls.id.errors).toEqual({
message: 'LIBRARY.ERRORS.EXISTENT_SITE'
});
expect(component.form.valid).toBe(false);
}));
expect(alfrescoApi.sitesApi.createSite).not.toHaveBeenCalled();
}));
it('should create site when form is valid', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'createSite').and.returnValue(
Promise.resolve()
);
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
it('should notify when library title is already used', fakeAsync(() => {
spyOn(alfrescoApi.sitesApi, 'getSite').and.returnValue(Promise.resolve());
findSitesSpy.and.returnValue(Promise.resolve(
{ list: { entries: [ { entry: { title: 'TEST', id: 'library-id' } } ] } }
));
fixture.detectChanges();
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.title.setValue('test');
tick(500);
flush();
fixture.detectChanges();
component.submit();
fixture.detectChanges();
flush();
expect(component.libraryTitleExists).toBe(true);
}));
expect(alfrescoApi.sitesApi.createSite).toHaveBeenCalledWith({
id: 'library-title',
title: 'library title',
description: '',
visibility: 'PUBLIC'
});
}));
it('should notify on 409 conflict error (might be in trash)', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
const error = { message: '{ "error": { "statusCode": 409 } }' };
spyOn(alfrescoApi.sitesApi, 'createSite').and.callFake(() => {
return new Promise((resolve, reject) => reject(error));
});
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
it('should not create site when form is invalid', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'createSite').and.returnValue(
Promise.resolve({})
);
spyOn(alfrescoApi.sitesApi, 'getSite').and.returnValue(Promise.resolve());
fixture.detectChanges();
component.form.controls.title.setValue('test');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.title.setValue('existingLibrary');
tick(500);
flush();
fixture.detectChanges();
component.submit();
fixture.detectChanges();
flush();
component.submit();
fixture.detectChanges();
flush();
expect(component.form.controls.id.errors).toEqual({
message: 'LIBRARY.ERRORS.CONFLICT'
});
}));
expect(alfrescoApi.sitesApi.createSite).not.toHaveBeenCalled();
}));
it('should not translate library title if value is not a valid id', fakeAsync(() => {
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
it('should notify when library title is already used', fakeAsync(() => {
spyOn(alfrescoApi.sitesApi, 'getSite').and.returnValue(Promise.resolve());
findSitesSpy.and.returnValue(Promise.resolve(
{ list: { entries: [{ entry: { title: 'TEST', id: 'library-id' } }] } }
));
fixture.detectChanges();
component.form.controls.title.setValue('@@@####');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.title.setValue('test');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe(null);
}));
expect(component.libraryTitleExists).toBe(true);
}));
it('should translate library title partially for library id', fakeAsync(() => {
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
it('should notify on 409 conflict error (might be in trash)', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
const error = { message: '{ "error": { "statusCode": 409 } }' };
spyOn(alfrescoApi.sitesApi, 'createSite').and.callFake(() => {
return new Promise((resolve, reject) => reject(error));
});
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
fixture.detectChanges();
component.form.controls.title.setValue('@@@####library');
tick(500);
flush();
fixture.detectChanges();
fixture.detectChanges();
component.form.controls.title.setValue('test');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe('library');
}));
component.submit();
fixture.detectChanges();
flush();
it('should translate library title multiple space character to one dash for library id', fakeAsync(() => {
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
expect(component.form.controls.id.errors).toEqual({
message: 'LIBRARY.ERRORS.CONFLICT'
});
}));
fixture.detectChanges();
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
it('should not translate library title if value is not a valid id', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
expect(component.form.controls.id.value).toBe('library-title');
}));
fixture.detectChanges();
component.form.controls.title.setValue('@@@####');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe(null);
}));
it('should translate library title partially for library id', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
fixture.detectChanges();
component.form.controls.title.setValue('@@@####library');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe('library');
}));
it('should translate library title multiple space character to one dash for library id', fakeAsync(() => {
findSitesSpy.and.returnValue(Promise.resolve(findSitesResponse));
spyOn(alfrescoApi.sitesApi, 'getSite').and.callFake(() => {
return new Promise((resolve, reject) => reject());
});
fixture.detectChanges();
component.form.controls.title.setValue('library title');
tick(500);
flush();
fixture.detectChanges();
expect(component.form.controls.id.value).toBe('library-title');
}));
});
@@ -32,7 +32,7 @@ import {
AbstractControl
} from '@angular/forms';
import { MatDialogRef } from '@angular/material';
import { SiteBody, SiteEntry, SitePaging } from 'alfresco-js-api';
import { SiteBodyCreate, SiteEntry, SitePaging } from '@alfresco/js-api';
import { AlfrescoApiService } from '@alfresco/adf-core';
import { debounceTime, mergeMap, takeUntil } from 'rxjs/operators';
@@ -166,7 +166,7 @@ export class LibraryDialogComponent implements OnInit, OnDestroy {
private create(): Observable<SiteEntry> {
const { title, id, description, visibility } = this;
const siteBody = <SiteBody> {
const siteBody = <SiteBodyCreate> {
id,
title,
description,
@@ -21,6 +21,7 @@ import { TestBed, fakeAsync, tick } from '@angular/core/testing';
import { ComponentFixture } from '@angular/core/testing';
import { MatDialogRef } from '@angular/material';
import { AlfrescoApiService, setupTestBed } from '@alfresco/adf-core';
import { NodeBodyLock } from '@alfresco/js-api';
import { NodeLockDialogComponent } from './node-lock.dialog';
import { ContentTestingModule } from '../testing/content.testing.module';
@@ -67,7 +68,8 @@ describe('NodeLockDialogComponent', () => {
['cm:expiryDate']: expiryDate
}
},
onError: () => {}
onError: () => {
}
};
fixture.detectChanges();
});
@@ -100,11 +102,11 @@ describe('NodeLockDialogComponent', () => {
expect(alfrescoApi.nodesApi.lockNode).toHaveBeenCalledWith(
'node-id',
{
new NodeBodyLock({
'timeToExpire': 60,
'type': 'ALLOW_OWNER_CHANGES',
'lifetime': 'PERSISTENT'
}
})
);
});
@@ -21,7 +21,7 @@ import { Component, Inject, OnInit, Optional } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
import { FormBuilder, FormGroup } from '@angular/forms';
import { MinimalNodeEntryEntity, NodeEntry } from 'alfresco-js-api';
import { NodeBodyLock, Node, NodeEntry } from '@alfresco/js-api';
import { AlfrescoApiService } from '@alfresco/adf-core';
@Component({
@@ -32,7 +32,7 @@ import { AlfrescoApiService } from '@alfresco/adf-core';
export class NodeLockDialogComponent implements OnInit {
form: FormGroup;
node: MinimalNodeEntryEntity = null;
node: Node = null;
nodeName: string;
constructor(
@@ -42,7 +42,8 @@ export class NodeLockDialogComponent implements OnInit {
@Optional()
@Inject(MAT_DIALOG_DATA)
public data: any
) {}
) {
}
ngOnInit() {
const { node } = this.data;
@@ -65,12 +66,12 @@ export class NodeLockDialogComponent implements OnInit {
return 0;
}
private get nodeBodyLock(): object {
return {
private get nodeBodyLock(): NodeBodyLock {
return new NodeBodyLock({
'timeToExpire': this.lockTimeInSeconds,
'type': this.form.value.allowOwner ? 'ALLOW_OWNER_CHANGES' : 'FULL',
'lifetime': 'PERSISTENT'
};
});
}
private toggleLock(): Promise<NodeEntry> {
@@ -85,10 +86,10 @@ export class NodeLockDialogComponent implements OnInit {
submit(): void {
this.toggleLock()
.then((node) => {
.then((node: NodeEntry) => {
this.data.node.isLocked = this.form.value.isLocked;
this.dialog.close(node.entry);
})
.catch((error) => this.data.onError(error));
.catch((error: any) => this.data.onError(error));
}
}
@@ -20,14 +20,14 @@ import { By } from '@angular/platform-browser';
import { Component, DebugElement } from '@angular/core';
import { NodeLockDirective } from './node-lock.directive';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { NodeActionsService } from '../document-list/services/node-actions.service';
import { ContentNodeDialogService } from '../content-node-selector/content-node-dialog.service';
import { DocumentListService } from '../document-list/services/document-list.service';
import { setupTestBed } from '../../core/testing';
import { CoreModule } from '@alfresco/adf-core';
const fakeNode: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const fakeNode: Node = <Node> {
id: 'fake',
isFile: true,
isLocked: false
@@ -18,7 +18,7 @@
/* tslint:disable:no-input-rename */
import { Directive, ElementRef, Renderer2, HostListener, Input, AfterViewInit } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { PermissionsEnum, ContentService } from '@alfresco/adf-core';
import { ContentNodeDialogService } from '../content-node-selector/content-node-dialog.service';
@@ -29,7 +29,7 @@ export class NodeLockDirective implements AfterViewInit {
/** Node to lock/unlock. */
@Input('adf-node-lock')
node: MinimalNodeEntryEntity;
node: Node;
@HostListener('click', [ '$event' ])
onClick(event) {
@@ -38,6 +38,7 @@ import { CustomResourcesService } from './../services/custom-resources.service';
import { DocumentListComponent } from './document-list.component';
import { setupTestBed } from '@alfresco/adf-core';
import { ContentTestingModule } from '../../testing/content.testing.module';
import { NodeEntry } from '@alfresco/js-api';
describe('DocumentList', () => {
@@ -73,7 +74,7 @@ describe('DocumentList', () => {
documentList.ngOnInit();
spyGetSites = spyOn(apiService.sitesApi, 'getSites').and.returnValue(Promise.resolve(fakeGetSitesAnswer));
spyFavorite = spyOn(apiService.favoritesApi, 'getFavorites').and.returnValue(Promise.resolve({list: []}));
spyFavorite = spyOn(apiService.favoritesApi, 'getFavorites').and.returnValue(Promise.resolve({ list: [] }));
});
afterEach(() => {
@@ -202,6 +203,7 @@ describe('DocumentList', () => {
});
it('should reset selection upon reload', () => {
documentList.currentFolderId = 'id-folder';
spyOn(documentList, 'resetSelection').and.callThrough();
documentList.reload();
@@ -228,6 +230,7 @@ describe('DocumentList', () => {
});
it('should reset selection upon reload', () => {
documentList.currentFolderId = 'id-folder';
spyOn(documentList, 'resetSelection').and.callThrough();
documentList.reload();
@@ -296,6 +299,7 @@ describe('DocumentList', () => {
});
it('should disable the action if there is no permission for the file and disableWithNoPermission true', () => {
documentList.currentFolderId = 'fake-node-id';
let documentMenu = new ContentActionModel({
disableWithNoPermission: true,
permission: 'delete',
@@ -929,7 +933,7 @@ describe('DocumentList', () => {
it('should emit node-click DOM event', (done) => {
let node = new NodeMinimalEntry();
document.addEventListener('node-click', (e: CustomEvent) => {
document.addEventListener('node-click', (customEvent: CustomEvent) => {
done();
});
@@ -947,7 +951,7 @@ describe('DocumentList', () => {
it('should emit node-dblclick DOM event', (done) => {
let node = new NodeMinimalEntry();
document.addEventListener('node-dblclick', (e: CustomEvent) => {
document.addEventListener('node-dblclick', (customEvent: CustomEvent) => {
done();
});
@@ -977,7 +981,7 @@ describe('DocumentList', () => {
it('should emit error when loadFolderNodesByFolderNodeId fails', (done) => {
const error = { message: '{ "error": { "statusCode": 501 } }' };
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNodeWithCreatePermission));
spyOn(documentListService, 'getFolderNode').and.returnValue(of({ entry: fakeNodeWithCreatePermission }));
spyOn(documentList, 'loadFolderNodesByFolderNodeId').and.returnValue(Promise.reject(error));
let disposableError = documentList.error.subscribe((val) => {
@@ -996,7 +1000,7 @@ describe('DocumentList', () => {
expect(folderNode.value.id).toBe('fake-node');
done();
});
documentList.onNodeDblClick({ entry: { id: 'fake-node', isFolder: true } });
documentList.onNodeDblClick(new NodeEntry({ entry: { id: 'fake-node', isFolder: true } }));
});
it('should set no permission when getFolderNode fails with 403', (done) => {
@@ -1014,6 +1018,7 @@ describe('DocumentList', () => {
});
it('should reset noPermission upon reload', () => {
documentList.currentFolderId = 'fake-node-id';
documentList.noPermission = true;
fixture.detectChanges();
@@ -1043,7 +1048,7 @@ describe('DocumentList', () => {
documentList.folderNode = new NodeMinimal();
documentList.folderNode.id = '1d26e465-dea3-42f3-b415-faa8364b9692';
spyOn(documentListService, 'getFolderNode').and.returnValue(of(fakeNodeWithNoPermission));
spyOn(documentListService, 'getFolderNode').and.returnValue(of({ entry: fakeNodeWithNoPermission }));
spyOn(documentListService, 'getFolder').and.returnValue(throwError(error));
documentList.loadFolder();
@@ -1153,14 +1158,14 @@ describe('DocumentList', () => {
it('should fetch user membership sites', () => {
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(peopleApi.getSiteMembership).toHaveBeenCalled();
expect(peopleApi.listSiteMembershipsForPerson).toHaveBeenCalled();
});
it('should emit error when fetch membership sites fails', (done) => {
spyOn(apiService.getInstance().core.peopleApi, 'getSiteMembership')
spyOn(apiService.getInstance().core.peopleApi, 'listSiteMembershipsForPerson')
.and.returnValue(Promise.reject('error'));
let disposableError = documentList.error.subscribe((val) => {
@@ -1175,10 +1180,10 @@ describe('DocumentList', () => {
it('should assure that user membership sites have name property set', (done) => {
fixture.detectChanges();
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(peopleApi.getSiteMembership).toHaveBeenCalled();
expect(peopleApi.listSiteMembershipsForPerson).toHaveBeenCalled();
let disposableReady = documentList.ready.subscribe((page) => {
const entriesWithoutName = page.list.entries.filter((item) => !item.entry.name);
@@ -1191,10 +1196,10 @@ describe('DocumentList', () => {
it('should assure that user membership sites have name property set correctly', (done) => {
fixture.detectChanges();
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(peopleApi.getSiteMembership).toHaveBeenCalled();
expect(peopleApi.listSiteMembershipsForPerson).toHaveBeenCalled();
let disposableReady = documentList.ready.subscribe((page) => {
const wrongName = page.list.entries.filter((item) => (item.entry.name !== item.entry.title));
@@ -1259,6 +1264,7 @@ describe('DocumentList', () => {
});
it('should reset folder node upon changing current folder id', () => {
documentList.currentFolderId = 'fake-node-id';
documentList.folderNode = <any> {};
documentList.ngOnChanges({ currentFolderId: new SimpleChange(null, '-sites-', false) });
@@ -1278,7 +1284,7 @@ describe('DocumentList', () => {
documentList.currentFolderId = '12345-some-id-6789';
const peopleApi = apiService.getInstance().core.peopleApi;
spyOn(peopleApi, 'getSiteMembership').and.returnValue(Promise.resolve(fakeGetSiteMembership));
spyOn(peopleApi, 'listSiteMembershipsForPerson').and.returnValue(Promise.resolve(fakeGetSiteMembership));
documentList.loadFolderByNodeId('-mysites-');
expect(documentList.currentFolderId).toBe('-mysites-');
@@ -28,7 +28,7 @@ import {
UserPreferencesService, PaginationModel, ThumbnailService
} from '@alfresco/adf-core';
import { MinimalNodeEntity, MinimalNodeEntryEntity, NodePaging } from 'alfresco-js-api';
import { Node, NodeEntry, NodePaging } from '@alfresco/js-api';
import { Subject, BehaviorSubject, Subscription, of } from 'rxjs';
import { ShareDataRow } from './../data/share-data-row.model';
import { ShareDataTableAdapter } from './../data/share-datatable-adapter';
@@ -178,7 +178,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
* @deprecated 2.3.0 - use currentFolderId or node
*/
@Input()
folderNode: MinimalNodeEntryEntity = null;
folderNode: Node = null;
/** The Document list will show all the nodes contained in the NodePaging entity */
@Input()
@@ -238,7 +238,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
contextActionHandler: Subject<any> = new Subject();
data: ShareDataTableAdapter;
noPermission: boolean = false;
selection = new Array<MinimalNodeEntity>();
selection = new Array<NodeEntry>();
private _pagination: BehaviorSubject<PaginationModel>;
private layoutPresets = {};
@@ -256,7 +256,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
private thumbnailService: ThumbnailService) {
}
getContextActions(node: MinimalNodeEntity) {
getContextActions(node: NodeEntry) {
if (node && node.entry) {
let actions = this.getNodeActions(node);
if (actions && actions.length > 0) {
@@ -446,7 +446,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
getNodeActions(node: MinimalNodeEntity | any): ContentActionModel[] {
getNodeActions(node: NodeEntry | any): ContentActionModel[] {
if (node && node.entry) {
let target = null;
@@ -487,12 +487,12 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return [];
}
private refreshAction(action: ContentActionModel, node: MinimalNodeEntity) {
private refreshAction(action: ContentActionModel, node: NodeEntry) {
action.disabled = this.isActionDisabled(action, node);
action.visible = this.isActionVisible(action, node);
}
private isActionVisible(action: ContentActionModel, node: MinimalNodeEntity): boolean {
private isActionVisible(action: ContentActionModel, node: NodeEntry): boolean {
if (typeof action.visible === 'function') {
return action.visible(node);
}
@@ -500,7 +500,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return action.visible;
}
private isActionDisabled(action: ContentActionModel, node: MinimalNodeEntity): boolean {
private isActionDisabled(action: ContentActionModel, node: NodeEntry): boolean {
if (typeof action.disabled === 'function') {
return action.disabled(node);
}
@@ -519,7 +519,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
performNavigation(node: MinimalNodeEntity): boolean {
performNavigation(node: NodeEntry): boolean {
if (this.canNavigateFolder(node)) {
this.updateFolderData(node);
return true;
@@ -527,7 +527,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return false;
}
performCustomSourceNavigation(node: MinimalNodeEntity): boolean {
performCustomSourceNavigation(node: NodeEntry): boolean {
if (this.customResourcesService.isCustomSource(this.currentFolderId)) {
this.updateFolderData(node);
return true;
@@ -535,18 +535,18 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
return false;
}
updateFolderData(node: MinimalNodeEntity): void {
updateFolderData(node: NodeEntry): void {
this.resetNewFolderPagination();
this.currentFolderId = this.getNodeFolderDestinationId(node);
this.folderChange.emit(new NodeEntryEvent({ id: this.currentFolderId }));
this.folderChange.emit(new NodeEntryEvent(<Node> { id: this.currentFolderId }));
this.reload();
}
private getNodeFolderDestinationId(node: MinimalNodeEntity) {
private getNodeFolderDestinationId(node: NodeEntry) {
return this.isLinkFolder(node) ? node.entry.properties['cm:destination'] : node.entry.id;
}
private isLinkFolder(node: MinimalNodeEntity) {
private isLinkFolder(node: NodeEntry) {
return node.entry.nodeType === 'app:folderlink' && node.entry.properties &&
node.entry.properties['cm:destination'];
}
@@ -561,7 +561,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
* @param node Node to be the context of the execution.
* @param action Action to be executed against the context.
*/
executeContentAction(node: MinimalNodeEntity, action: ContentActionModel) {
executeContentAction(node: NodeEntry, action: ContentActionModel) {
if (node && node.entry && action) {
let handlerSub;
@@ -620,9 +620,9 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
} else {
this.documentListService
.getFolderNode(nodeId, this.includeFields)
.subscribe((node: MinimalNodeEntryEntity) => {
this.folderNode = node;
return this.loadFolderNodesByFolderNodeId(node.id, this.pagination.getValue())
.subscribe((node: NodeEntry) => {
this.folderNode = node.entry;
return this.loadFolderNodesByFolderNodeId(node.entry.id, this.pagination.getValue())
.catch((err) => this.handleError(err));
}, (err) => {
this.handleError(err);
@@ -675,13 +675,13 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
onPreviewFile(node: MinimalNodeEntity) {
onPreviewFile(node: NodeEntry) {
if (node) {
this.preview.emit(new NodeEntityEvent(node));
}
}
onNodeClick(node: MinimalNodeEntity) {
onNodeClick(node: NodeEntry) {
const domEvent = new CustomEvent('node-click', {
detail: {
sender: this,
@@ -709,7 +709,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
onNodeDblClick(node: MinimalNodeEntity) {
onNodeDblClick(node: NodeEntry) {
const domEvent = new CustomEvent('node-dblclick', {
detail: {
sender: this,
@@ -796,7 +796,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
}
}
canNavigateFolder(node: MinimalNodeEntity): boolean {
canNavigateFolder(node: NodeEntry): boolean {
let canNavigateFolder: boolean = false;
if (this.customResourcesService.isCustomSource(this.currentFolderId)) {
@@ -833,7 +833,7 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
this.currentFolderId = nodeId;
this.resetNewFolderPagination();
this.loadFolder();
this.folderChange.emit(new NodeEntryEvent({ id: nodeId }));
this.folderChange.emit(new NodeEntryEvent(<Node> { id: nodeId }));
}
private resetNewFolderPagination() {
@@ -848,9 +848,12 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
private handleError(err: any) {
if (err.message) {
if (JSON.parse(err.message).error.statusCode === 403) {
this.setLoadingState(false);
this.noPermission = true;
try {
if (JSON.parse(err.message).error.statusCode === 403) {
this.setLoadingState(false);
this.noPermission = true;
}
} catch (error) {
}
}
this.error.emit(err);
@@ -23,7 +23,7 @@ import {
Input,
ElementRef
} from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { ShareDataRow } from '../../data/share-data-row.model';
@Component({
@@ -43,7 +43,7 @@ export class LibraryNameColumnComponent implements OnInit {
displayTooltip: string;
displayText: string;
node: MinimalNodeEntity;
node: NodeEntry;
constructor(private element: ElementRef) {}
@@ -23,7 +23,7 @@ import {
ViewEncapsulation,
ElementRef
} from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
@Component({
selector: 'adf-name-column',
@@ -41,7 +41,7 @@ export class NameColumnComponent implements OnInit {
context: any;
displayText: string;
node: MinimalNodeEntity;
node: NodeEntry;
constructor(private element: ElementRef) {}
@@ -16,28 +16,28 @@
*/
import { BaseEvent } from '@alfresco/adf-core';
import { MinimalNodeEntity, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { NodeEntry, Node } from '@alfresco/js-api';
export class NodeEntityEvent extends BaseEvent<MinimalNodeEntity> {
export class NodeEntityEvent extends BaseEvent<NodeEntry> {
value: MinimalNodeEntity;
value: NodeEntry;
defaultPrevented: boolean;
constructor(entity: MinimalNodeEntity) {
constructor(nodeEntry: NodeEntry) {
super();
this.value = entity;
this.value = nodeEntry;
}
}
export class NodeEntryEvent extends BaseEvent<MinimalNodeEntryEntity> {
export class NodeEntryEvent extends BaseEvent<Node> {
value: MinimalNodeEntryEntity;
value: Node;
defaultPrevented: boolean;
constructor(entity: MinimalNodeEntryEntity) {
constructor(node: Node) {
super();
this.value = entity;
this.value = node;
}
}
@@ -22,7 +22,7 @@ import {
OnInit,
Input
} from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { ShareDataRow } from '../../data/share-data-row.model';
@Component({
@@ -46,7 +46,7 @@ export class TrashcanNameColumnComponent implements OnInit {
isLibrary = false;
displayText: string;
displayTooltip: string;
node: MinimalNodeEntity;
node: NodeEntry;
ngOnInit() {
this.node = this.context.row.node;
@@ -16,7 +16,7 @@
*/
import { DataRow, ObjectUtils, ThumbnailService } from '@alfresco/adf-core';
import { MinimalNode, MinimalNodeEntity } from 'alfresco-js-api';
import { MinimalNode, NodeEntry } from '@alfresco/js-api';
import { PermissionStyleModel } from './../models/permissions-style.model';
import { DocumentListService } from './../services/document-list.service';
@@ -29,11 +29,11 @@ export class ShareDataRow implements DataRow {
isDropTarget: boolean;
cssClass: string = '';
get node(): MinimalNodeEntity {
get node(): NodeEntry {
return this.obj;
}
constructor(private obj: MinimalNodeEntity,
constructor(private obj: NodeEntry,
private documentListService: DocumentListService,
private permissionsStyle: PermissionStyleModel[],
private thumbnailService?: ThumbnailService) {
@@ -48,7 +48,7 @@ export class ShareDataRow implements DataRow {
}
}
getPermissionClass(nodeEntity: MinimalNodeEntity): string {
getPermissionClass(nodeEntity: NodeEntry): string {
let permissionsClasses = '';
this.permissionsStyle.forEach((currentPermissionsStyle: PermissionStyleModel) => {
@@ -73,12 +73,12 @@ export class ShareDataRow implements DataRow {
return (currentPermissionsStyle.isFolder && node.isFolder);
}
isFolderAndHasPermissionToUpload(obj: MinimalNodeEntity): boolean {
return this.isFolder(obj) && this.documentListService.hasPermission(obj.entry, 'create');
isFolderAndHasPermissionToUpload(nodeEntry: NodeEntry): boolean {
return this.isFolder(nodeEntry) && this.documentListService.hasPermission(nodeEntry.entry, 'create');
}
isFolder(obj: MinimalNodeEntity): boolean {
return obj.entry && obj.entry.isFolder;
isFolder(nodeEntry: NodeEntry): boolean {
return nodeEntry.entry && nodeEntry.entry.isFolder;
}
cacheValue(key: string, value: any): any {
@@ -94,7 +94,9 @@ export class ShareDataRow implements DataRow {
}
imageErrorResolver(event: Event): any {
return this.thumbnailService.getMimeTypeIcon(this.obj.entry.content.mimeType);
if (this.obj.entry.content) {
return this.thumbnailService.getMimeTypeIcon(this.obj.entry.content.mimeType);
}
}
hasValue(key: string): boolean {
@@ -16,7 +16,7 @@
*/
import { DataColumn, DataRow, DataSorting, DataTableAdapter, ThumbnailService } from '@alfresco/adf-core';
import { NodePaging } from 'alfresco-js-api';
import { NodePaging } from '@alfresco/js-api';
import { PermissionStyleModel } from './../models/permissions-style.model';
import { DocumentListService } from './../services/document-list.service';
import { ShareDataRow } from './share-data-row.model';
@@ -17,7 +17,7 @@
// note: contains only limited subset of available fields
import { MinimalNodeEntity, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { NodeEntry, Node } from '@alfresco/js-api';
export class NodePaging {
list: NodePagingList;
@@ -28,7 +28,7 @@ export class NodePagingList {
entries: NodeMinimalEntry[];
}
export class NodeMinimalEntry implements MinimalNodeEntity {
export class NodeMinimalEntry implements NodeEntry {
entry: NodeMinimal;
}
@@ -40,7 +40,7 @@ export class Pagination {
maxItems: number;
}
export class NodeMinimal implements MinimalNodeEntryEntity {
export class NodeMinimal implements Node {
id: string;
parentId: string;
name: string;
@@ -26,8 +26,12 @@ import {
PersonEntry,
SitePaging,
DeletedNodesPaging,
SearchRequest
} from 'alfresco-js-api';
SearchRequest,
SharedLinkPaging,
FavoritePaging,
SiteMemberPaging,
SiteRolePaging
} from '@alfresco/js-api';
import { Injectable } from '@angular/core';
import { Observable, from, of, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
@@ -54,7 +58,7 @@ export class CustomResourcesService {
this.apiService.peopleApi.getPerson(personId)
.then((person: PersonEntry) => {
const username = person.entry.id;
const query: SearchRequest = {
const query: SearchRequest = new SearchRequest({
query: {
query: '*',
language: 'afts'
@@ -74,7 +78,7 @@ export class CustomResourcesService {
maxItems: pagination.maxItems,
skipCount: pagination.skipCount
}
};
});
return this.apiService.searchApi.search(query)
.then((searchResult) => {
observer.next(searchResult);
@@ -110,8 +114,8 @@ export class CustomResourcesService {
return new Observable((observer) => {
this.apiService.favoritesApi.getFavorites('-me-', options)
.then((result: NodePaging) => {
let page: NodePaging = {
.then((result: FavoritePaging) => {
let page: FavoritePaging = {
list: {
entries: result.list.entries
.map(({ entry: { target } }: any) => ({
@@ -143,7 +147,7 @@ export class CustomResourcesService {
* @param pagination Specifies how to paginate the results
* @returns List of sites
*/
loadMemberSites(pagination: PaginationModel): Observable<NodePaging> {
loadMemberSites(pagination: PaginationModel): Observable<SiteMemberPaging> {
const options = {
include: ['properties'],
maxItems: pagination.maxItems,
@@ -151,9 +155,9 @@ export class CustomResourcesService {
};
return new Observable((observer) => {
this.apiService.peopleApi.getSiteMembership('-me-', options)
.then((result: SitePaging) => {
let page: NodePaging = {
this.apiService.peopleApi.listSiteMembershipsForPerson('-me-', options)
.then((result: SiteRolePaging) => {
let page: SiteMemberPaging = new SiteMemberPaging( {
list: {
entries: result.list.entries
.map(({ entry: { site } }: any) => {
@@ -165,7 +169,7 @@ export class CustomResourcesService {
}),
pagination: result.list.pagination
}
};
});
observer.next(page);
observer.complete();
@@ -191,7 +195,7 @@ export class CustomResourcesService {
return new Observable((observer) => {
this.apiService.sitesApi.getSites(options)
.then((page: NodePaging) => {
.then((page: SitePaging) => {
page.list.entries.map(
({ entry }: any) => {
entry.name = entry.name || entry.title;
@@ -234,7 +238,7 @@ export class CustomResourcesService {
* @param includeFields List of data field names to include in the results
* @returns List of shared links
*/
loadSharedLinks(pagination: PaginationModel, includeFields: string[] = []): Observable<NodePaging> {
loadSharedLinks(pagination: PaginationModel, includeFields: string[] = []): Observable<SharedLinkPaging> {
let includeFieldsRequest = this.getIncludesFields(includeFields);
const options = {
@@ -286,7 +290,7 @@ export class CustomResourcesService {
* @param includeFields List of data field names to include in the results
* @returns List of items contained in the folder
*/
loadFolderByNodeId(nodeId: string, pagination: PaginationModel, includeFields: string[]): Observable<NodePaging> {
loadFolderByNodeId(nodeId: string, pagination: PaginationModel, includeFields: string[] = []): any {
if (nodeId === '-trashcan-') {
return this.loadTrashcan(pagination, includeFields);
} else if (nodeId === '-sharedlinks-') {
@@ -313,20 +317,10 @@ export class CustomResourcesService {
getCorrespondingNodeIds(nodeId: string, pagination: PaginationModel = {}): Observable<string[]> {
if (this.isCustomSource(nodeId)) {
return this.loadFolderByNodeId(nodeId, pagination, [])
.pipe(map((result) => result.list.entries.map((node: any) => {
if (nodeId === '-sharedlinks-') {
return node.entry.nodeId;
} else if (nodeId === '-sites-' || nodeId === '-mysites-') {
return node.entry.guid;
} else if (nodeId === '-favorites-') {
return node.entry.targetGuid;
}
return node.entry.id;
})));
return this.loadFolderByNodeId(nodeId, pagination)
.pipe(map((result: any): string[] => {
return result.list.entries.map((node: any): string => this.getIdFromEntry(node, nodeId));
}));
} else if (nodeId) {
// cases when nodeId is '-my-', '-root-' or '-shared-'
@@ -337,6 +331,18 @@ export class CustomResourcesService {
return of([]);
}
getIdFromEntry(node: any, nodeId: string): string {
if (nodeId === '-sharedlinks-') {
return node.entry.nodeId;
} else if (nodeId === '-sites-' || nodeId === '-mysites-') {
return node.entry.guid;
} else if (nodeId === '-favorites-') {
return node.entry.targetGuid;
} else {
return node.entry.id;
}
}
/**
* Does the well-known alias have a corresponding node ID?
* @param nodeId Node to check
@@ -17,7 +17,7 @@
import { ContentService, TranslationService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { Observable, Subject, throwError } from 'rxjs';
import { ContentActionHandler } from '../models/content-action.model';
import { PermissionModel } from '../models/permissions.model';
@@ -77,8 +77,8 @@ export class DocumentActionsService {
* @param obj Item to receive an action
* @returns True if the action can be executed on this item, false otherwise
*/
canExecuteAction(obj: any): boolean {
return this.documentListService && obj && obj.entry.isFile === true;
canExecuteAction(nodeEntry: NodeEntry): boolean {
return this.documentListService && nodeEntry && nodeEntry.entry.isFile === true;
}
private setupActionHandlers() {
@@ -89,21 +89,21 @@ export class DocumentActionsService {
this.handlers['lock'] = this.lockNode.bind(this);
}
private lockNode(node: MinimalNodeEntity, target?: any, permission?: string) {
private lockNode(node: NodeEntry, target?: any, permission?: string) {
return this.contentNodeDialogService.openLockNodeDialog(node.entry);
}
private downloadNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
private downloadNode(obj: NodeEntry, target?: any, permission?: string) {
this.nodeActionsService.downloadNode(obj);
}
private copyNode(node: MinimalNodeEntity, target?: any, permission?: string) {
private copyNode(node: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.copyContent(node.entry, permission);
this.prepareHandlers(actionObservable, 'content', 'copy', target, permission);
return actionObservable;
}
private moveNode(node: MinimalNodeEntity, target?: any, permission?: string) {
private moveNode(node: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.moveContent(node.entry, permission);
this.prepareHandlers(actionObservable, 'content', 'move', target, permission);
return actionObservable;
@@ -118,7 +118,7 @@ export class DocumentActionsService {
);
}
private deleteNode(node: MinimalNodeEntity, target?: any, permission?: string): Observable<any> {
private deleteNode(node: NodeEntry, target?: any, permission?: string): Observable<any> {
let handlerObservable;
if (this.canExecuteAction(node)) {
@@ -26,33 +26,6 @@ describe('DocumentListService', () => {
let service: DocumentListService;
let alfrescoApiService: AlfrescoApiService;
let fakeEntryNode = {
'entry': {
'aspectNames': ['cm:auditable'],
'createdAt': '2016-12-06T15:58:32.408+0000',
'isFolder': true,
'isFile': false,
'createdByUser': { 'id': 'admin', 'displayName': 'Administrator' },
'modifiedAt': '2016-12-06T15:58:32.408+0000',
'modifiedByUser': { 'id': 'admin', 'displayName': 'Administrator' },
'name': 'fake-name',
'id': '2214733d-a920-4dbe-af95-4230345fae82',
'nodeType': 'cm:folder',
'parentId': 'ed7ab80e-b398-4bed-b38d-139ae4cc592a'
}
};
let fakeAlreadyExist = {
'error': {
'errorKey': 'Duplicate child name not allowed: empty',
'statusCode': 409,
'briefSummary': '11060002 Duplicate child name not' +
' allowed: empty',
'stackTrace': 'For security reasons the stack trace is no longer displayed, but the property is kept for previous versions.',
'descriptionURL': 'https://api-explorer.alfresco.com'
}
};
let fakeFolder = {
'list': {
'pagination': { 'count': 1, 'hasMoreItems': false, 'totalItems': 1, 'skipCount': 0, 'maxItems': 20 },
@@ -105,43 +78,6 @@ describe('DocumentListService', () => {
jasmine.Ajax.uninstall();
});
it('should create a folder in the path', () => {
service.createFolder('fake-name', 'fake-path').subscribe(
(res) => {
expect(res).toBeDefined();
expect(res.entry).toBeDefined();
expect(res.entry.isFolder).toBeTruthy();
expect(res.entry.name).toEqual('fake-name');
expect(res.entry.nodeType).toEqual('cm:folder');
}
);
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'json',
responseText: fakeEntryNode
});
});
it('should emit an error when the folder already exist', () => {
service.createFolder('fake-name', 'fake-path').subscribe(
(res) => {
},
(err) => {
expect(err).toBeDefined();
expect(err.status).toEqual(409);
expect(err.response).toBeDefined();
}
);
jasmine.Ajax.requests.mostRecent().respondWith({
status: 409,
contentType: 'json',
responseText: fakeAlreadyExist
});
});
it('should return the folder info', () => {
service.getFolder('/fake-root/fake-name').subscribe(
(res) => {
@@ -186,7 +122,7 @@ describe('DocumentListService', () => {
});
it('should add the includeTypes in the request getFolderNode if required', () => {
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNodeInfo').and.callThrough();
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNode').and.callThrough();
service.getFolderNode('test-id', ['isLocked']);
@@ -197,7 +133,7 @@ describe('DocumentListService', () => {
});
it('should not add the includeTypes in the request getFolderNode if is duplicated', () => {
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNodeInfo').and.callThrough();
let spyGetNodeInfo = spyOn(alfrescoApiService.getInstance().nodes, 'getNode').and.callThrough();
service.getFolderNode('test-id', ['allowableOperations']);
@@ -211,7 +147,7 @@ describe('DocumentListService', () => {
it('should delete the folder', () => {
service.deleteNode('fake-id').subscribe(
(res) => {
expect(res).toBeNull();
expect(res).toBe('');
}
);
@@ -21,7 +21,7 @@ import {
} from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { MinimalNodeEntity, MinimalNodeEntryEntity, NodeEntry, NodePaging } from 'alfresco-js-api';
import { NodeEntry, NodePaging } from '@alfresco/js-api';
import { Observable, from, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@@ -39,37 +39,6 @@ export class DocumentListService {
private thumbnailService: ThumbnailService) {
}
private getNodesPromise(folder: string, opts?: any, includeFields: string[] = []): Promise<NodePaging> {
let rootNodeId = DocumentListService.ROOT_ID;
if (opts && opts.rootFolderId) {
rootNodeId = opts.rootFolderId;
}
let includeFieldsRequest = ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields]
.filter((element, index, array) => index === array.indexOf(element));
let params: any = {
includeSource: true,
include: includeFieldsRequest
};
if (folder) {
params.relativePath = folder;
}
if (opts) {
if (opts.maxItems) {
params.maxItems = opts.maxItems;
}
if (opts.skipCount) {
params.skipCount = opts.skipCount;
}
}
return this.apiService.getInstance().nodes.getNodeChildren(rootNodeId, params);
}
/**
* Deletes a node.
* @param nodeId ID of the node to delete
@@ -105,19 +74,6 @@ export class DocumentListService {
);
}
/**
* Creates a new folder in the path.
* @param name Folder name
* @param parentId Parent folder ID
* @returns Details of the created folder node
*/
createFolder(name: string, parentId: string): Observable<MinimalNodeEntity> {
return from(this.apiService.getInstance().nodes.createFolder(name, '/', parentId))
.pipe(
catchError((err) => this.handleError(err))
);
}
/**
* Gets the folder node with the specified relative name path below the root node.
* @param folder Path to folder.
@@ -126,10 +82,35 @@ export class DocumentListService {
* @returns Details of the folder
*/
getFolder(folder: string, opts?: any, includeFields: string[] = []): Observable<NodePaging> {
return from(this.getNodesPromise(folder, opts, includeFields))
.pipe(
catchError((err) => this.handleError(err))
);
let rootNodeId = DocumentListService.ROOT_ID;
if (opts && opts.rootFolderId) {
rootNodeId = opts.rootFolderId;
}
let includeFieldsRequest = ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields]
.filter((element, index, array) => index === array.indexOf(element));
let params: any = {
includeSource: true,
include: includeFieldsRequest
};
if (folder) {
params.relativePath = folder;
}
if (opts) {
if (opts.maxItems) {
params.maxItems = opts.maxItems;
}
if (opts.skipCount) {
params.skipCount = opts.skipCount;
}
}
return from(this.apiService.getInstance().nodes.getNodeChildren(rootNodeId, params)).pipe(
catchError((err) => this.handleError(err))
);
}
/**
@@ -153,12 +134,11 @@ export class DocumentListService {
/**
* Gets a folder node via its node ID.
* @deprecated 2.3.0
* @param nodeId ID of the folder node
* @param includeFields Extra information to include (available options are "aspectNames", "isLink" and "association")
* @returns Details of the folder
*/
getFolderNode(nodeId: string, includeFields: string[] = []): Observable<MinimalNodeEntryEntity> {
getFolderNode(nodeId: string, includeFields: string[] = []): Observable<NodeEntry> {
let includeFieldsRequest = ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields]
.filter((element, index, array) => index === array.indexOf(element));
@@ -168,14 +148,17 @@ export class DocumentListService {
include: includeFieldsRequest
};
return from(this.apiService.getInstance().nodes.getNodeInfo(nodeId, opts));
return from(this.apiService.getInstance().nodes.getNode(nodeId, opts)).pipe(
catchError((err) => this.handleError(err))
);
}
/**
* Get thumbnail URL for the given document node.
* @param node Node to get URL for.
* @returns Thumbnail URL string
*/
getDocumentThumbnailUrl(node: MinimalNodeEntity): string {
getDocumentThumbnailUrl(node: NodeEntry): string {
return this.thumbnailService.getDocumentThumbnailUrl(node);
}
@@ -17,7 +17,7 @@
import { ContentService, TranslationService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { Observable, Subject, throwError } from 'rxjs';
import { ContentActionHandler } from '../models/content-action.model';
import { PermissionModel } from '../models/permissions.model';
@@ -72,11 +72,11 @@ export class FolderActionsService {
/**
* Checks if an action is available for a particular item.
* @param obj Item to check
* @param nodeEntry Item to check
* @returns True if the action is available, false otherwise
*/
canExecuteAction(obj: any): boolean {
return this.documentListService && obj && obj.entry.isFolder === true;
canExecuteAction(nodeEntry: NodeEntry): boolean {
return this.documentListService && nodeEntry && nodeEntry.entry.isFolder === true;
}
private setupActionHandlers() {
@@ -86,18 +86,18 @@ export class FolderActionsService {
this.handlers['download'] = this.downloadNode.bind(this);
}
private downloadNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
this.nodeActionsService.downloadNode(obj);
private downloadNode(nodeEntry: NodeEntry) {
this.nodeActionsService.downloadNode(nodeEntry);
}
private copyNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.copyFolder(obj.entry, permission);
private copyNode(nodeEntry: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.copyFolder(nodeEntry.entry, permission);
this.prepareHandlers(actionObservable, 'folder', 'copy', target, permission);
return actionObservable;
}
private moveNode(obj: MinimalNodeEntity, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.moveFolder(obj.entry, permission);
private moveNode(nodeEntry: NodeEntry, target?: any, permission?: string) {
const actionObservable = this.nodeActionsService.moveFolder(nodeEntry.entry, permission);
this.prepareHandlers(actionObservable, 'folder', 'move', target, permission);
return actionObservable;
}
@@ -114,7 +114,7 @@ export class FolderActionsService {
);
}
private deleteNode(node: MinimalNodeEntity, target?: any, permission?: string): Observable<any> {
private deleteNode(node: NodeEntry, target?: any, permission?: string): Observable<any> {
let handlerObservable: Observable<any>;
if (this.canExecuteAction(node)) {
@@ -16,7 +16,7 @@
*/
import { async, TestBed } from '@angular/core/testing';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { AppConfigService, setupTestBed, CoreModule } from '@alfresco/adf-core';
import { DocumentListService } from './document-list.service';
import { NodeActionsService } from './node-actions.service';
@@ -25,7 +25,7 @@ import { of, throwError } from 'rxjs';
import { MatDialogRef } from '@angular/material';
import { DialogModule } from '../../dialogs/dialog.module';
const fakeNode: MinimalNodeEntryEntity = <MinimalNodeEntryEntity> {
const fakeNode: Node = <Node> {
id: 'fake'
};
@@ -16,7 +16,7 @@
*/
import { Injectable, Output, EventEmitter } from '@angular/core';
import { MinimalNodeEntryEntity, MinimalNodeEntity } from 'alfresco-js-api';
import { Node, NodeEntry } from '@alfresco/js-api';
import { Subject } from 'rxjs';
import { AlfrescoApiService, ContentService, NodeDownloadDirective } from '@alfresco/adf-core';
import { MatDialog } from '@angular/material';
@@ -39,7 +39,7 @@ export class NodeActionsService {
private apiService?: AlfrescoApiService,
private dialog?: MatDialog) {}
downloadNode(node: MinimalNodeEntity) {
downloadNode(node: NodeEntry) {
new NodeDownloadDirective(this.apiService, this.dialog)
.downloadNode(node);
}
@@ -50,7 +50,7 @@ export class NodeActionsService {
* @param contentEntry node to copy
* @param permission permission which is needed to apply the action
*/
public copyContent(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public copyContent(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('copy', 'content', contentEntry, permission);
}
@@ -60,7 +60,7 @@ export class NodeActionsService {
* @param contentEntry node to copy
* @param permission permission which is needed to apply the action
*/
public copyFolder(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public copyFolder(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('copy', 'folder', contentEntry, permission);
}
@@ -70,7 +70,7 @@ export class NodeActionsService {
* @param contentEntry node to move
* @param permission permission which is needed to apply the action
*/
public moveContent(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public moveContent(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('move', 'content', contentEntry, permission);
}
@@ -80,7 +80,7 @@ export class NodeActionsService {
* @param contentEntry node to move
* @param permission permission which is needed to apply the action
*/
public moveFolder(contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
public moveFolder(contentEntry: Node, permission?: string): Subject<string> {
return this.doFileOperation('move', 'folder', contentEntry, permission);
}
@@ -92,12 +92,12 @@ export class NodeActionsService {
* @param contentEntry the contentEntry which has to have the action performed on
* @param permission permission which is needed to apply the action
*/
private doFileOperation(action: string, type: string, contentEntry: MinimalNodeEntryEntity, permission?: string): Subject<string> {
private doFileOperation(action: string, type: string, contentEntry: Node, permission?: string): Subject<string> {
const observable: Subject<string> = new Subject<string>();
this.contentDialogService
.openCopyMoveDialog(action, contentEntry, permission)
.subscribe((selections: MinimalNodeEntryEntity[]) => {
.subscribe((selections: Node[]) => {
const selection = selections[0];
this.documentListService[`${action}Node`].call(this.documentListService, contentEntry.id, selection.id)
.subscribe(
@@ -24,7 +24,7 @@ import { FolderDialogComponent } from '../dialogs/folder.dialog';
import { ContentService, setupTestBed, CoreModule } from '@alfresco/adf-core';
import { FolderCreateDirective } from './folder-create.directive';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
@Component({
template: `
@@ -37,9 +37,9 @@ import { MinimalNodeEntryEntity } from 'alfresco-js-api';
})
class TestTypeComponent {
parentNode = '';
public successParameter: MinimalNodeEntryEntity = null;
public successParameter: Node = null;
success(node: MinimalNodeEntryEntity) {
success(node: Node) {
this.successParameter = node;
}
}
@@ -49,7 +49,7 @@ class TestTypeComponent {
})
class TestComponent {
parentNode = '';
public successParameter: MinimalNodeEntryEntity = null;
public successParameter: Node = null;
}
describe('FolderCreateDirective', () => {
@@ -91,7 +91,7 @@ describe('FolderCreateDirective', () => {
afterClosed: (val) => of(val),
componentInstance: {
error: new Subject<any>(),
success: new Subject<MinimalNodeEntryEntity>()
success: new Subject<Node>()
}
};
});
@@ -135,7 +135,7 @@ describe('FolderCreateDirective', () => {
});
it('should emit success event with node if the folder creation was successful', async(() => {
const testNode = <MinimalNodeEntryEntity> {};
const testNode = <Node> {};
fixture.detectChanges();
element.triggerEventHandler('click', event);
@@ -19,7 +19,7 @@
import { Directive, HostListener, Input, Output, EventEmitter } from '@angular/core';
import { MatDialog, MatDialogConfig } from '@angular/material';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { FolderDialogComponent } from '../dialogs/folder.dialog';
import { ContentService } from '@alfresco/adf-core';
@@ -49,7 +49,7 @@ export class FolderCreateDirective {
/** Emitted when the folder is created successfully. */
@Output()
success: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter<MinimalNodeEntryEntity>();
success: EventEmitter<Node> = new EventEmitter<Node>();
@HostListener('click', [ '$event' ])
onClick(event) {
@@ -80,11 +80,11 @@ export class FolderCreateDirective {
this.error.emit(error);
});
dialogInstance.componentInstance.success.subscribe((node: MinimalNodeEntryEntity) => {
dialogInstance.componentInstance.success.subscribe((node: Node) => {
this.success.emit(node);
});
dialogInstance.afterClosed().subscribe((node: MinimalNodeEntryEntity) => {
dialogInstance.afterClosed().subscribe((node: Node) => {
if (node) {
content.folderCreate.next(node);
}
@@ -23,16 +23,16 @@ import { Subject, of } from 'rxjs';
import { ContentService, setupTestBed, CoreModule } from '@alfresco/adf-core';
import { FolderEditDirective } from './folder-edit.directive';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
@Component({
template: '<div [adf-edit-folder]="folder" (success)="success($event)" title="edit-title"></div>'
})
class TestComponent {
folder = {};
public successParameter: MinimalNodeEntryEntity = null;
public successParameter: Node = null;
success(node: MinimalNodeEntryEntity) {
success(node: Node) {
this.successParameter = node;
}
}
@@ -74,7 +74,7 @@ describe('FolderEditDirective', () => {
afterClosed: (val) => of(val),
componentInstance: {
error: new Subject<any>(),
success: new Subject<MinimalNodeEntryEntity>()
success: new Subject<Node>()
}
};
@@ -106,7 +106,7 @@ describe('FolderEditDirective', () => {
});
it('should emit success event with node if the folder creation was successful', async(() => {
const testNode = <MinimalNodeEntryEntity> {};
const testNode = <Node> {};
fixture.detectChanges();
element.triggerEventHandler('click', event);
@@ -20,7 +20,7 @@
import { Directive, ElementRef, HostListener, Input, Output, EventEmitter } from '@angular/core';
import { MatDialog, MatDialogConfig } from '@angular/material';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { FolderDialogComponent } from '../dialogs/folder.dialog';
import { ContentService } from '@alfresco/adf-core';
@@ -33,7 +33,7 @@ export class FolderEditDirective {
/** Folder node to edit. */
@Input('adf-edit-folder')
folder: MinimalNodeEntryEntity;
folder: Node;
/** Emitted when an error occurs (eg, a folder with same name already exists). */
@Output()
@@ -45,7 +45,7 @@ export class FolderEditDirective {
/** Emitted when the folder has been edited successfully. */
@Output()
success: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter<MinimalNodeEntryEntity>();
success: EventEmitter<Node> = new EventEmitter<Node>();
@HostListener('click', [ '$event' ])
onClick(event) {
@@ -82,11 +82,11 @@ export class FolderEditDirective {
this.error.emit(error);
});
dialogInstance.componentInstance.success.subscribe((node: MinimalNodeEntryEntity) => {
dialogInstance.componentInstance.success.subscribe((node: Node) => {
this.success.emit(node);
});
dialogInstance.afterClosed().subscribe((node: MinimalNodeEntryEntity) => {
dialogInstance.afterClosed().subscribe((node: Node) => {
if (node) {
content.folderEdit.next(node);
}
+2
View File
@@ -35,8 +35,10 @@ module.exports = function (config) {
proxies: {
'/base/assets/': '/base/lib/content-services/assets/',
'/assets/': '/base/lib/content-services/assets/',
'/assets/adf-content-services/i18n/en.json': '/base/lib/content-services/i18n/en.json',
'/assets/adf-core/i18n/en.json': '/base/lib/core/i18n/en.json',
'/assets/adf-core/i18n/en-GB.json': '/base/lib/core/i18n/en.json',
'/app.config.json': '/base/lib/config/app.config.json',
},
@@ -17,7 +17,7 @@
import { Component, ViewChild } from '@angular/core';
import { SearchComponent } from '../search/components/search.component';
import { QueryBody } from 'alfresco-js-api';
import { QueryBody } from '@alfresco/js-api';
const entryItem = {
entry: {
+1 -1
View File
@@ -9,7 +9,7 @@
"entryFile": "./public-api.ts",
"flatModuleFile": "adf-content-services",
"umdModuleIds": {
"alfresco-js-api": "alfresco-js-api",
"@alfresco/js-api": "@alfresco/js-ap",
"minimatch": "minimatch",
"@angular/platform-browser/animations": "@angular/platform-browser/animations",
"@angular/material": "@angular/material",
+1 -1
View File
@@ -28,7 +28,7 @@
"alfresco-js-api": ">=2.7.0-beta5",
"rxjs": ">=6.2.2",
"@alfresco/adf-core": ">=2.7.0-beta5",
"@ngx-translate/core": ">=10.0.2",
"@ngx-translate/core": ">=11.0.0",
"hammerjs": ">=2.0.8",
"moment": ">=2.22.2",
"reflect-metadata": ">=0.1.10",
@@ -15,11 +15,11 @@
* limitations under the License.
*/
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { Subject } from 'rxjs';
export interface AddPermissionDialogData {
title?: string;
nodeId: string;
confirm: Subject<MinimalNodeEntity[]>;
confirm: Subject<NodeEntry[]>;
}
@@ -22,7 +22,7 @@ import { ContentTestingModule } from '../../../testing/content.testing.module';
import { By } from '@angular/platform-browser';
import { setupTestBed } from '@alfresco/adf-core';
import { AddPermissionDialogComponent } from './add-permission-dialog.component';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { Subject } from 'rxjs';
import { AddPermissionDialogData } from './add-permission-dialog-data.interface';
import { fakeAuthorityResults } from '../../../mock/add-permission.component.mock';
@@ -35,7 +35,7 @@ describe('AddPermissionDialog', () => {
let data: AddPermissionDialogData = {
title: 'dead or alive you are coming with me',
nodeId: 'fake-node-id',
confirm: new Subject<MinimalNodeEntity[]> ()
confirm: new Subject<NodeEntry[]> ()
};
const dialogRef = {
close: jasmine.createSpy('close')
@@ -17,7 +17,7 @@
import { Component, ViewEncapsulation, Inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA } from '@angular/material';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { AddPermissionDialogData } from './add-permission-dialog-data.interface';
import { AddPermissionComponent } from '../add-permission/add-permission.component';
@@ -32,12 +32,12 @@ export class AddPermissionDialogComponent {
@ViewChild('addPermission')
addPermissionComponent: AddPermissionComponent;
currentSelection: MinimalNodeEntity[] = [];
currentSelection: NodeEntry[] = [];
constructor(@Inject(MAT_DIALOG_DATA) public data: AddPermissionDialogData) {
}
onSelect(items: MinimalNodeEntity[]) {
onSelect(items: NodeEntry[]) {
this.currentSelection = items;
}
@@ -21,7 +21,7 @@ import { SearchService, SearchConfigurationService } from '@alfresco/adf-core';
import { SearchComponent } from '../../../search/components/search.component';
import { FormControl } from '@angular/forms';
import { debounceTime } from 'rxjs/operators';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
@Component({
selector: 'adf-add-permission-panel',
@@ -46,9 +46,9 @@ export class AddPermissionPanelComponent {
searchedWord = '';
debounceSearch: number = 200;
selectedItems: MinimalNodeEntity[] = [];
selectedItems: NodeEntry[] = [];
EVERYONE: MinimalNodeEntity = { entry: { properties: {'cm:authorityName': 'GROUP_EVERYONE'}}};
EVERYONE: NodeEntry = new NodeEntry({ entry: { properties: {'cm:authorityName': 'GROUP_EVERYONE'}}});
constructor() {
this.searchInput.valueChanges
@@ -63,7 +63,7 @@ export class AddPermissionPanelComponent {
});
}
elementClicked(item: MinimalNodeEntity) {
elementClicked(item: NodeEntry) {
if (this.isAlreadySelected(item)) {
this.selectedItems.splice(this.selectedItems.indexOf(item), 1);
} else {
@@ -72,7 +72,7 @@ export class AddPermissionPanelComponent {
this.select.emit(this.selectedItems);
}
private isAlreadySelected(item: MinimalNodeEntity): boolean {
private isAlreadySelected(item: NodeEntry): boolean {
return this.selectedItems.indexOf(item) >= 0;
}
@@ -24,6 +24,7 @@ import { of, throwError } from 'rxjs';
import { fakeAuthorityResults } from '../../../mock/add-permission.component.mock';
import { ContentTestingModule } from '../../../testing/content.testing.module';
import { NodePermissionService } from '../../services/node-permission.service';
import { Node } from '@alfresco/js-api';
describe('AddPermissionComponent', () => {
@@ -73,7 +74,7 @@ describe('AddPermissionComponent', () => {
it('should NOT enable the ADD button when a selection is sent but the user does not have the permissions', async(() => {
const addPermissionPanelComponent: AddPermissionPanelComponent = fixture.debugElement.query(By.directive(AddPermissionPanelComponent)).componentInstance;
addPermissionPanelComponent.select.emit(fakeAuthorityResults);
fixture.componentInstance.currentNode = {id: 'fake-node-id'};
fixture.componentInstance.currentNode = new Node({id: 'fake-node-id'});
fixture.whenStable().then(() => {
fixture.detectChanges();
const addButton: HTMLButtonElement = <HTMLButtonElement> element.querySelector('#adf-add-permission-action-button');
@@ -100,7 +101,7 @@ describe('AddPermissionComponent', () => {
it('should NOT emit a success event when the user does not have permission to update the node', () => {
fixture.componentInstance.selectedItems = fakeAuthorityResults;
fixture.componentInstance.currentNode = { id: 'fake-node-id' };
fixture.componentInstance.currentNode = new Node({ id: 'fake-node-id' });
spyOn(nodePermissionService, 'updateNodePermissions').and.returnValue(of({ id: 'fake-node-id' }));
let spySuccess = spyOn(fixture.componentInstance, 'success');
@@ -16,7 +16,7 @@
*/
import { Component, ViewEncapsulation, EventEmitter, Input, Output } from '@angular/core';
import { MinimalNodeEntity, MinimalNodeEntryEntity } from 'alfresco-js-api';
import { NodeEntry, Node } from '@alfresco/js-api';
import { NodePermissionService } from '../../services/node-permission.service';
import { NodesApiService, ContentService, PermissionsEnum } from '@alfresco/adf-core';
@@ -34,14 +34,14 @@ export class AddPermissionComponent {
/** Emitted when the node is updated successfully. */
@Output()
success: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter();
success: EventEmitter<Node> = new EventEmitter();
/** Emitted when an error occurs during the update. */
@Output()
error: EventEmitter<any> = new EventEmitter();
selectedItems: MinimalNodeEntity[] = [];
currentNode: MinimalNodeEntryEntity;
selectedItems: NodeEntry[] = [];
currentNode: Node;
currentNodeRoles: string[];
constructor(private nodePermissionService: NodePermissionService,
@@ -50,7 +50,7 @@ export class AddPermissionComponent {
this.nodeApiService.getNode(this.nodeId).subscribe((node) => this.currentNode = node);
}
onSelect(selection: MinimalNodeEntity[]) {
onSelect(selection: NodeEntry[]) {
this.selectedItems = selection;
}
@@ -15,7 +15,7 @@
* limitations under the License.
*/
import { QueryBody } from 'alfresco-js-api';
import { QueryBody } from '@alfresco/js-api';
import { SearchConfigurationInterface } from '@alfresco/adf-core';
export class SearchPermissionConfigurationService implements SearchConfigurationInterface {
@@ -18,7 +18,7 @@
/* tslint:disable:no-input-rename */
import { Directive, Input, Output, EventEmitter } from '@angular/core';
import { NodesApiService, ContentService, PermissionsEnum } from '@alfresco/adf-core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
@Directive({
selector: 'button[adf-inherit-permission], mat-button-toggle[adf-inherit-permission]',
@@ -35,7 +35,7 @@ export class InheritPermissionDirective {
/** Emitted when the node is updated. */
@Output()
updated: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter<MinimalNodeEntryEntity>();
updated: EventEmitter<Node> = new EventEmitter<Node>();
/** Emitted when an error occurs. */
@Output()
@@ -46,10 +46,10 @@ export class InheritPermissionDirective {
}
onInheritPermissionClicked() {
this.nodeService.getNode(this.nodeId).subscribe((node: MinimalNodeEntryEntity) => {
this.nodeService.getNode(this.nodeId).subscribe((node: Node) => {
if (this.contentService.hasPermission(node, PermissionsEnum.UPDATEPERMISSIONS)) {
const nodeBody = { permissions: { isInheritanceEnabled: !node.permissions.isInheritanceEnabled } };
this.nodeService.updateNode(this.nodeId, nodeBody, { include: ['permissions'] }).subscribe((nodeUpdated: MinimalNodeEntryEntity) => {
this.nodeService.updateNode(this.nodeId, nodeBody, { include: ['permissions'] }).subscribe((nodeUpdated: Node) => {
this.updated.emit(nodeUpdated);
}, (error) => this.error.emit(error));
} else {
@@ -17,7 +17,7 @@
import { Component, ViewEncapsulation, Input, OnInit, EventEmitter, Output } from '@angular/core';
import { NodesApiService } from '@alfresco/adf-core';
import { MinimalNodeEntryEntity, PermissionElement } from 'alfresco-js-api';
import { Node, PermissionElement } from '@alfresco/js-api';
import { PermissionDisplayModel } from '../../models/permission.model';
import { NodePermissionService } from '../../services/node-permission.service';
@@ -43,7 +43,7 @@ export class PermissionListComponent implements OnInit {
permissionList: PermissionDisplayModel[];
settableRoles: any[];
actualNode: MinimalNodeEntryEntity;
actualNode: Node;
constructor(private nodeService: NodesApiService,
private nodePermissionService: NodePermissionService) {
@@ -59,26 +59,26 @@ export class PermissionListComponent implements OnInit {
}
private fetchNodePermissions() {
this.nodeService.getNode(this.nodeId).subscribe((node: MinimalNodeEntryEntity) => {
this.nodeService.getNode(this.nodeId).subscribe((node: Node) => {
this.actualNode = node;
this.permissionList = this.getPermissionList(node);
this.nodePermissionService.getNodeRoles(node).subscribe((settableList: string[]) => {
this.settableRoles = settableList;
this.settableRoles = settableList;
});
});
}
private getPermissionList(node: MinimalNodeEntryEntity): PermissionDisplayModel[] {
private getPermissionList(node: Node): PermissionDisplayModel[] {
let allPermissions: PermissionDisplayModel[] = [];
if (node.permissions.locallySet) {
node.permissions.locallySet.map((element) => {
let permission = new PermissionDisplayModel(element);
node.permissions.locallySet.map((permissionElement: PermissionElement) => {
let permission = new PermissionDisplayModel(permissionElement);
allPermissions.push(permission);
});
}
if (node.permissions.inherited) {
node.permissions.inherited.map((element) => {
let permissionInherited = new PermissionDisplayModel(element);
node.permissions.inherited.map((permissionElement: PermissionElement) => {
let permissionInherited = new PermissionDisplayModel(permissionElement);
permissionInherited.isInherited = true;
allPermissions.push(permissionInherited);
});
@@ -89,7 +89,7 @@ export class PermissionListComponent implements OnInit {
saveNewRole(event: any, permissionRow: PermissionDisplayModel) {
let updatedPermissionRole: PermissionElement = this.buildUpdatedPermission(event.value, permissionRow);
this.nodePermissionService.updatePermissionRole(this.actualNode, updatedPermissionRole)
.subscribe((node: MinimalNodeEntryEntity) => {
.subscribe((node: Node) => {
this.update.emit(updatedPermissionRole);
});
}
@@ -15,7 +15,7 @@
* limitations under the License.
*/
import { PermissionElement } from 'alfresco-js-api';
import { PermissionElement } from '@alfresco/js-api';
export class PermissionDisplayModel implements PermissionElement {
@@ -22,7 +22,7 @@ import { MatDialog } from '@angular/material';
import { Subject, of, throwError } from 'rxjs';
import { ContentTestingModule } from '../../testing/content.testing.module';
import { NodePermissionService } from './node-permission.service';
import { Node } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
describe('NodePermissionDialogService', () => {
@@ -61,7 +61,7 @@ describe('NodePermissionDialogService', () => {
describe('when node has permission to update permissions', () => {
let fakePermissionNode = {};
let fakePermissionNode = new Node({});
beforeEach(() => {
fakePermissionNode = <Node> { id: 'fake-permission-node', allowableOperations: ['updatePermissions']};
@@ -97,7 +97,7 @@ describe('NodePermissionDialogService', () => {
describe('when node does not have permission to update permissions', () => {
let fakeForbiddenNode = {};
let fakeForbiddenNode = new Node({});
beforeEach(() => {
fakeForbiddenNode = <Node> { id: 'fake-permission-node', allowableOperations: ['update']};
@@ -20,7 +20,7 @@ import { Injectable } from '@angular/core';
import { Subject, Observable, throwError } from 'rxjs';
import { AddPermissionDialogComponent } from '../components/add-permission/add-permission-dialog.component';
import { AddPermissionDialogData } from '../components/add-permission/add-permission-dialog-data.interface';
import { MinimalNodeEntity, MinimalNodeEntryEntity, Node } from 'alfresco-js-api';
import { NodeEntry, Node } from '@alfresco/js-api';
import { NodePermissionService } from './node-permission.service';
import { ContentService, PermissionsEnum } from '@alfresco/adf-core';
import { switchMap } from 'rxjs/operators';
@@ -41,9 +41,9 @@ export class NodePermissionDialogService {
* @param title Dialog title
* @returns Node with updated permissions
*/
openAddPermissionDialog(node: Node, title?: string): Observable<MinimalNodeEntity[]> {
openAddPermissionDialog(node: Node, title?: string): Observable<NodeEntry[]> {
if (this.contentService.hasPermission(node, PermissionsEnum.UPDATEPERMISSIONS)) {
const confirm = new Subject<MinimalNodeEntity[]>();
const confirm = new Subject<NodeEntry[]>();
confirm.subscribe({
complete: this.close.bind(this)
@@ -81,7 +81,7 @@ export class NodePermissionDialogService {
* @param title Dialog title
* @returns Node with updated permissions
*/
updateNodePermissionByDialog(nodeId?: string, title?: string): Observable<MinimalNodeEntryEntity> {
updateNodePermissionByDialog(nodeId?: string, title?: string): Observable<Node> {
return this.contentService.getNode(nodeId, { include: ['allowableOperations'] })
.pipe(
switchMap((node) => {
@@ -18,7 +18,7 @@
import { async, TestBed } from '@angular/core/testing';
import { NodePermissionService } from './node-permission.service';
import { SearchService, NodesApiService, setupTestBed, CoreModule } from '@alfresco/adf-core';
import { MinimalNodeEntryEntity, PermissionElement } from 'alfresco-js-api';
import { Node, PermissionElement } from '@alfresco/js-api';
import { of } from 'rxjs';
import { fakeEmptyResponse, fakeNodeWithOnlyLocally, fakeSiteRoles, fakeSiteNodeResponse,
fakeNodeToRemovePermission, fakeNodeWithoutPermissions } from '../../mock/permission-list.component.mock';
@@ -52,7 +52,7 @@ describe('NodePermissionService', () => {
});
function returnUpdatedNode(nodeId, nodeBody) {
let fakeNode: MinimalNodeEntryEntity = {};
let fakeNode: Node = new Node({});
fakeNode.id = 'fake-updated-node';
fakeNode.permissions = nodeBody.permissions;
return of(fakeNode);
@@ -89,7 +89,7 @@ describe('NodePermissionService', () => {
spyOn(nodeService, 'updateNode').and.callFake((nodeId, permissionBody) => returnUpdatedNode(nodeId, permissionBody));
service.updatePermissionRole(fakeNodeWithOnlyLocally, fakePermission).subscribe((node: MinimalNodeEntryEntity) => {
service.updatePermissionRole(fakeNodeWithOnlyLocally, fakePermission).subscribe((node: Node) => {
expect(node).not.toBeNull();
expect(node.id).toBe('fake-updated-node');
expect(node.permissions.locallySet.length).toBe(1);
@@ -108,7 +108,7 @@ describe('NodePermissionService', () => {
spyOn(nodeService, 'updateNode').and.callFake((nodeId, permissionBody) => returnUpdatedNode(nodeId, permissionBody));
const fakeNodeCopy = JSON.parse(JSON.stringify(fakeNodeToRemovePermission));
service.removePermission(fakeNodeCopy, fakePermission).subscribe((node: MinimalNodeEntryEntity) => {
service.removePermission(fakeNodeCopy, fakePermission).subscribe((node: Node) => {
expect(node).not.toBeNull();
expect(node.id).toBe('fake-updated-node');
expect(node.permissions.locallySet.length).toBe(2);
@@ -124,7 +124,7 @@ describe('NodePermissionService', () => {
spyOn(searchApiService, 'searchByQueryBody').and.returnValue(of(fakeSiteNodeResponse));
spyOn(service, 'getGroupMemberByGroupName').and.returnValue(of(fakeSiteRoles));
service.updateNodePermissions('fake-node-id', fakeAuthorityResults).subscribe((node: MinimalNodeEntryEntity) => {
service.updateNodePermissions('fake-node-id', fakeAuthorityResults).subscribe((node: Node) => {
expect(node).not.toBeNull();
expect(node.id).toBe('fake-updated-node');
expect(node.permissions.locallySet.length).toBe(4);
@@ -138,7 +138,7 @@ describe('NodePermissionService', () => {
const fakeNodeCopy = JSON.parse(JSON.stringify(fakeNodeWithOnlyLocally));
spyOn(nodeService, 'updateNode').and.callFake((nodeId, permissionBody) => returnUpdatedNode(nodeId, permissionBody));
service.updateLocallySetPermissions(fakeNodeCopy, fakeAuthorityResults, fakeSiteRoles).subscribe((node: MinimalNodeEntryEntity) => {
service.updateLocallySetPermissions(fakeNodeCopy, fakeAuthorityResults, fakeSiteRoles).subscribe((node: Node) => {
expect(node).not.toBeNull();
expect(node.id).toBe('fake-updated-node');
expect(node.permissions.locallySet.length).toBe(4);
@@ -153,7 +153,7 @@ describe('NodePermissionService', () => {
fakeNodeCopy.permissions.locallySet = undefined;
spyOn(nodeService, 'updateNode').and.callFake((nodeId, permissionBody) => returnUpdatedNode(nodeId, permissionBody));
service.updateLocallySetPermissions(fakeNodeCopy, fakeAuthorityResults, fakeSiteRoles).subscribe((node: MinimalNodeEntryEntity) => {
service.updateLocallySetPermissions(fakeNodeCopy, fakeAuthorityResults, fakeSiteRoles).subscribe((node: Node) => {
expect(node).not.toBeNull();
expect(node.id).toBe('fake-updated-node');
expect(node.permissions.locallySet.length).toBe(3);
@@ -185,7 +185,7 @@ describe('NodePermissionService', () => {
}];
service.updateLocallySetPermissions(fakeNodeCopy, fakeDuplicateAuthority, ['Contributor'])
.subscribe((node: MinimalNodeEntryEntity) => {
.subscribe((node: Node) => {
}, (errorMessage) => {
expect(errorMessage).not.toBeNull();
@@ -18,7 +18,7 @@
import { Injectable } from '@angular/core';
import { Observable, of, from, throwError } from 'rxjs';
import { AlfrescoApiService, SearchService, NodesApiService, TranslationService } from '@alfresco/adf-core';
import { QueryBody, MinimalNodeEntryEntity, MinimalNodeEntity, PathElement, GroupMemberEntry, GroupsPaging, GroupMemberPaging, PermissionElement } from 'alfresco-js-api';
import { QueryBody, Node, NodeEntry, PathElement, GroupMemberEntry, GroupMemberPaging, PermissionElement } from '@alfresco/js-api';
import { switchMap, map } from 'rxjs/operators';
@Injectable({
@@ -37,7 +37,7 @@ export class NodePermissionService {
* @param node The target node
* @returns Array of strings representing the roles
*/
getNodeRoles(node: MinimalNodeEntryEntity): Observable<string[]> {
getNodeRoles(node: Node): Observable<string[]> {
const retrieveSiteQueryBody: QueryBody = this.buildRetrieveSiteQueryBody(node.path.elements);
return this.searchApiService.searchByQueryBody(retrieveSiteQueryBody)
.pipe(
@@ -58,7 +58,7 @@ export class NodePermissionService {
* @param updatedPermissionRole Permission role to update or add
* @returns Node with updated permission
*/
updatePermissionRole(node: MinimalNodeEntryEntity, updatedPermissionRole: PermissionElement): Observable<MinimalNodeEntryEntity> {
updatePermissionRole(node: Node, updatedPermissionRole: PermissionElement): Observable<Node> {
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);
@@ -76,7 +76,7 @@ export class NodePermissionService {
* @param permissionList New permission settings
* @returns Node with updated permissions
*/
updateNodePermissions(nodeId: string, permissionList: MinimalNodeEntity[]): Observable<MinimalNodeEntryEntity> {
updateNodePermissions(nodeId: string, permissionList: NodeEntry[]): Observable<Node> {
return this.nodeService.getNode(nodeId).pipe(
switchMap((node) => {
return this.getNodeRoles(node).pipe(
@@ -94,7 +94,7 @@ export class NodePermissionService {
* @param nodeRole Permission role
* @returns Node with updated permissions
*/
updateLocallySetPermissions(node: MinimalNodeEntryEntity, nodes: MinimalNodeEntity[], nodeRole: string[]): Observable<MinimalNodeEntryEntity> {
updateLocallySetPermissions(node: Node, nodes: NodeEntry[], nodeRole: string[]): Observable<Node> {
let permissionBody = { permissions: { locallySet: []} };
const permissionList = this.transformNodeToPermissionElement(nodes, nodeRole[0]);
const duplicatedPermissions = this.getDuplicatedPermissions(node.permissions.locallySet, permissionList);
@@ -126,7 +126,7 @@ export class NodePermissionService {
oldPermission.name === newPermission.name;
}
private transformNodeToPermissionElement(nodes: MinimalNodeEntity[], nodeRole: any): PermissionElement[] {
private transformNodeToPermissionElement(nodes: NodeEntry[], nodeRole: any): PermissionElement[] {
return nodes.map((node) => {
let newPermissionElement: PermissionElement = <PermissionElement> {
'authorityId': node.entry.properties['cm:authorityName'] ?
@@ -145,7 +145,7 @@ export class NodePermissionService {
* @param permissionToRemove Permission setting to remove
* @returns Node with modified permissions
*/
removePermission(node: MinimalNodeEntryEntity, permissionToRemove: PermissionElement): Observable<MinimalNodeEntryEntity> {
removePermission(node: Node, permissionToRemove: PermissionElement): Observable<Node> {
let permissionBody = { permissions: { locallySet: [] } };
const index = node.permissions.locallySet.map((permission) => permission.authorityId).indexOf(permissionToRemove.authorityId);
if (index !== -1) {
@@ -159,9 +159,9 @@ export class NodePermissionService {
const groupName = 'GROUP_site_' + siteName;
return this.getGroupMemberByGroupName(groupName)
.pipe(
map((res: GroupsPaging) => {
map((groupMemberPaging: GroupMemberPaging) => {
let displayResult: string[] = [];
res.list.entries.forEach((member: GroupMemberEntry) => {
groupMemberPaging.list.entries.forEach((member: GroupMemberEntry) => {
displayResult.push(this.formattedRoleName(member.entry.displayName, 'site_' + siteName));
});
return displayResult;
@@ -19,7 +19,7 @@ import { AuthenticationService, ThumbnailService } from '@alfresco/adf-core';
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output,
QueryList, ViewEncapsulation, ViewChild, ViewChildren, ElementRef, TemplateRef, ContentChild } from '@angular/core';
import { MinimalNodeEntity, QueryBody } from 'alfresco-js-api';
import { NodeEntry, QueryBody } from '@alfresco/js-api';
import { Observable, Subject } from 'rxjs';
import { SearchComponent } from './search.component';
import { MatListItem } from '@angular/material';
@@ -175,7 +175,7 @@ export class SearchControlComponent implements OnInit, OnDestroy {
return this.autocomplete ? 'on' : 'off';
}
getMimeTypeIcon(node: MinimalNodeEntity): string {
getMimeTypeIcon(node: NodeEntry): string {
let mimeType;
if (node.entry.content && node.entry.content.mimeType) {
@@ -25,6 +25,7 @@ import { FacetQuery } from '../../facet-query.interface';
import { FacetField } from '../../facet-field.interface';
import { SearchFilterList } from './models/search-filter-list.model';
import { takeWhile } from 'rxjs/operators';
import { ResultSetPaging } from '@alfresco/js-api';
@Component({
selector: 'adf-search-filter',
@@ -73,9 +74,9 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
if (this.queryBuilder) {
this.queryBuilder.executed.pipe(
takeWhile(() => this.isAlive)
).subscribe((data) => {
this.onDataLoaded(data);
this.searchService.dataLoaded.next(data);
).subscribe((resultSetPaging: ResultSetPaging) => {
this.onDataLoaded(resultSetPaging);
this.searchService.dataLoaded.next(resultSetPaging);
});
}
}
@@ -17,7 +17,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SearchService, setupTestBed, CoreModule } from '@alfresco/adf-core';
import { QueryBody } from 'alfresco-js-api';
import { QueryBody } from '@alfresco/js-api';
import { differentResult, folderResult, result, SimpleSearchTestComponent } from '../../mock';
import { Observable, of, throwError } from 'rxjs';
import { SearchModule } from '../search.module';
@@ -29,7 +29,7 @@ import {
ViewChild,
ViewEncapsulation
} from '@angular/core';
import { NodePaging, QueryBody } from 'alfresco-js-api';
import { NodePaging, QueryBody } from '@alfresco/js-api';
import { Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
@@ -119,7 +119,7 @@ export class SearchComponent implements AfterContentInit, OnChanges {
});
searchService.dataLoaded.subscribe(
(data) => this.onSearchDataLoaded(data),
(nodePaging: NodePaging) => this.onSearchDataLoaded(nodePaging),
(error) => this.onSearchDataError(error)
);
}
@@ -176,9 +176,9 @@ export class SearchComponent implements AfterContentInit, OnChanges {
}
}
onSearchDataLoaded(data: NodePaging) {
if (data) {
this.results = data;
onSearchDataLoaded(nodePaging: NodePaging) {
if (nodePaging) {
this.results = nodePaging;
this.resultLoaded.emit(this.results);
this.isOpen = true;
this.setVisibility();
@@ -18,7 +18,13 @@
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { AlfrescoApiService, AppConfigService } from '@alfresco/adf-core';
import { QueryBody, RequestFacetFields, RequestFacetField, RequestSortDefinitionInner } from 'alfresco-js-api';
import {
QueryBody,
RequestFacetFields,
RequestFacetField,
RequestSortDefinitionInner,
ResultSetPaging
} from '@alfresco/js-api';
import { SearchCategory } from './search-category.interface';
import { FilterQuery } from './filter-query.interface';
import { SearchRange } from './search-range.interface';
@@ -36,7 +42,7 @@ export class SearchQueryBuilderService {
private _userQuery = '';
updated: Subject<QueryBody> = new Subject();
executed: Subject<any> = new Subject();
executed: Subject<ResultSetPaging> = new Subject();
categories: Array<SearchCategory> = [];
queryFragments: { [id: string]: string } = {};
@@ -165,8 +171,8 @@ export class SearchQueryBuilderService {
async execute() {
const query = this.buildQuery();
if (query) {
const data = await this.alfrescoApiService.searchApi.search(query);
this.executed.next(data);
const resultSetPaging: ResultSetPaging = await this.alfrescoApiService.searchApi.search(query);
this.executed.next(resultSetPaging);
}
}
@@ -234,11 +240,11 @@ export class SearchQueryBuilderService {
protected get sort(): RequestSortDefinitionInner[] {
return this.sorting.map((def) => {
return {
return new RequestSortDefinitionInner({
type: def.type,
field: def.field,
ascending: def.ascending
};
});
});
}
@@ -17,7 +17,7 @@
import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
import { SitesService, LogService } from '@alfresco/adf-core';
import { SitePaging, SiteEntry } from 'alfresco-js-api';
import { SitePaging, SiteEntry } from '@alfresco/js-api';
export enum Relations {
Members = 'members',
@@ -91,30 +91,36 @@ export class DropdownSitesComponent implements OnInit {
if (this.relations) {
extendedOptions = { relations: [this.relations] };
}
this.sitesService.getSites(extendedOptions).subscribe((result) => {
this.sitesService.getSites(extendedOptions).subscribe((sitePaging: SitePaging) => {
this.siteList = this.relations === Relations.Members ? this.filteredResultsByMember(result) : result;
this.siteList = this.relations === Relations.Members ? this.filteredResultsByMember(sitePaging) : sitePaging;
if (!this.hideMyFiles) {
let myItem = { entry: { id: '-my-', guid: '-my-', title: 'DROPDOWN.MY_FILES_OPTION' } };
if (!this.hideMyFiles) {
let siteEntry = new SiteEntry({
entry: {
id: '-my-',
guid: '-my-',
title: 'DROPDOWN.MY_FILES_OPTION'
}
});
this.siteList.list.entries.unshift(myItem);
this.siteList.list.entries.unshift(siteEntry);
if (!this.value) {
this.value = '-my-';
if (!this.value) {
this.value = '-my-';
}
}
}
this.selected = this.siteList.list.entries.find((site) => site.entry.id === this.value);
},
(error) => {
this.logService.error(error);
});
this.selected = this.siteList.list.entries.find((site: SiteEntry) => site.entry.id === this.value);
},
(error) => {
this.logService.error(error);
});
}
private filteredResultsByMember(sites: SitePaging): SitePaging {
const loggedUserName = this.sitesService.getEcmCurrentLoggedUserName();
sites.list.entries = sites.list.entries.filter( (site) => this.isCurrentUserMember(site, loggedUserName));
sites.list.entries = sites.list.entries.filter((site) => this.isCurrentUserMember(site, loggedUserName));
return sites;
}
@@ -17,6 +17,7 @@
import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation } from '@angular/core';
import { RatingService } from './services/rating.service';
import { RatingEntry } from 'alfresco-js-api-node';
@Component({
selector: 'adf-like',
@@ -37,16 +38,17 @@ export class LikeComponent implements OnChanges {
ratingType: string = 'likes';
isLike: boolean = false;
constructor(private ratingService: RatingService) {}
constructor(private ratingService: RatingService) {
}
ngOnChanges() {
this.clean();
this.ratingService.getRating(this.nodeId, this.ratingType).subscribe(
(data) => {
if (data.entry.aggregate) {
this.likesCounter = data.entry.aggregate.numberOfRatings;
if (data.entry.ratedAt) {
(ratingEntry: RatingEntry) => {
if (ratingEntry.entry.aggregate) {
this.likesCounter = ratingEntry.entry.aggregate.numberOfRatings;
if (ratingEntry.entry.ratedAt) {
this.isLike = true;
}
}
@@ -65,8 +67,8 @@ export class LikeComponent implements OnChanges {
);
} else {
this.ratingService.postRating(this.nodeId, this.ratingType, true).subscribe(
(data) => {
this.likesCounter = data.entry.aggregate.numberOfRatings;
(ratingEntry: RatingEntry) => {
this.likesCounter = ratingEntry.entry.aggregate.numberOfRatings;
this.isLike = true;
this.changeVote.emit(this.likesCounter);
}
@@ -17,6 +17,7 @@
import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation } from '@angular/core';
import { RatingService } from './services/rating.service';
import { RatingEntry } from '@alfresco/js-api';
@Component({
selector: 'adf-rating',
@@ -47,9 +48,9 @@ export class RatingComponent implements OnChanges {
let ratingObserver = this.ratingService.getRating(this.nodeId, this.ratingType);
ratingObserver.subscribe(
(data) => {
if (data.entry.aggregate) {
this.average = data.entry.aggregate.average;
(ratingEntry: RatingEntry) => {
if (ratingEntry.entry.aggregate) {
this.average = ratingEntry.entry.aggregate.average;
this.calculateStars();
}
}
@@ -63,9 +64,9 @@ export class RatingComponent implements OnChanges {
for (let i = 0; i < 5; i++) {
if (i < this.average) {
this.stars.push({fill: true});
this.stars.push({ fill: true });
} else {
this.stars.push({fill: false});
this.stars.push({ fill: false });
}
}
@@ -74,10 +75,10 @@ export class RatingComponent implements OnChanges {
updateVote(vote: number) {
this.ratingService.postRating(this.nodeId, this.ratingType, vote).subscribe(
(data) => {
if (data.entry.aggregate) {
if (this.average !== data.entry.aggregate.average) {
this.average = data.entry.aggregate.average;
(ratingEntry: RatingEntry) => {
if (ratingEntry.entry.aggregate) {
if (this.average !== ratingEntry.entry.aggregate.average) {
this.average = ratingEntry.entry.aggregate.average;
this.calculateStars();
}
}
@@ -56,7 +56,7 @@ describe('Rating service', () => {
contentType: 'json',
responseText: {
'entry': {
myRating: 1,
myRating: '1',
'ratedAt': '2017-04-06T14:34:28.061+0000',
'id': 'fiveStar',
'aggregate': {'numberOfRatings': 1, 'average': 1.0}
@@ -79,7 +79,7 @@ describe('Rating service', () => {
contentType: 'json',
responseText: {
'entry': {
'myRating': 3,
'myRating': '3',
'ratedAt': '2017-04-06T14:36:40.731+0000',
'id': 'fiveStar',
'aggregate': {'numberOfRatings': 1, 'average': 3.0}
@@ -17,10 +17,10 @@
import { AlfrescoApiService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
import { RatingBody } from 'alfresco-js-api';
import { RatingEntry, RatingBody } from '@alfresco/js-api';
import { from, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { Observable } from 'rxjs/internal/Observable';
@Injectable({
providedIn: 'root'
@@ -36,7 +36,7 @@ export class RatingService {
* @param ratingType Type of rating (can be "likes" or "fiveStar")
* @returns The rating value
*/
getRating(nodeId: string, ratingType: any): any {
getRating(nodeId: string, ratingType: any): Observable<RatingEntry | {}> {
return from(this.apiService.getInstance().core.ratingsApi.getRating(nodeId, ratingType))
.pipe(
catchError(this.handleError)
@@ -50,11 +50,11 @@ export class RatingService {
* @param vote Rating value (boolean for "likes", numeric 0..5 for "fiveStar")
* @returns Details about the rating, including the new value
*/
postRating(nodeId: string, ratingType: any, vote: any): any {
let ratingBody: RatingBody = {
postRating(nodeId: string, ratingType: string, vote: any): Observable<RatingEntry | {}> {
let ratingBody: RatingBody = new RatingBody({
'id': ratingType,
'myRating': vote
};
});
return from(this.apiService.getInstance().core.ratingsApi.rate(nodeId, ratingBody))
.pipe(
catchError(this.handleError)
@@ -67,14 +67,14 @@ export class RatingService {
* @param ratingType Type of rating to remove (can be "likes" or "fiveStar")
* @returns Null response indicating that the operation is complete
*/
deleteRating(nodeId: string, ratingType: any): any {
deleteRating(nodeId: string, ratingType: any): Observable<any> {
return from(this.apiService.getInstance().core.ratingsApi.removeRating(nodeId, ratingType))
.pipe(
catchError(this.handleError)
);
}
private handleError(error: Response): any {
private handleError(error: any): any {
console.error(error);
return throwError(error || 'Server error');
}
@@ -19,7 +19,7 @@ import { AlfrescoApiService, LogService } from '@alfresco/adf-core';
import { EventEmitter, Injectable, Output } from '@angular/core';
import { Observable, from, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { TagPaging } from 'alfresco-js-api';
import { TagBody, TagPaging, TagEntry } from '@alfresco/js-api';
@Injectable({
providedIn: 'root'
@@ -39,7 +39,7 @@ export class TagService {
* @param nodeId ID of the target node
* @returns TagPaging object (defined in JS-API) containing the tags
*/
getTagsByNodeId(nodeId: string): any {
getTagsByNodeId(nodeId: string): Observable<TagPaging> {
return from(this.apiService.getInstance().core.tagsApi.getNodeTags(nodeId)).pipe(
catchError((err) => this.handleError(err))
);
@@ -61,20 +61,19 @@ export class TagService {
* @param tagName Name of the tag to add
* @returns TagEntry object (defined in JS-API) with details of the new tag
*/
addTag(nodeId: string, tagName: string): any {
const alfrescoApi: any = this.apiService.getInstance();
const tagBody = new alfrescoApi.core.TagBody();
addTag(nodeId: string, tagName: string): Observable<TagEntry> {
const tagBody = new TagBody();
tagBody.tag = tagName;
let promiseAdd = from(this.apiService.getInstance().core.tagsApi.addTag(nodeId, tagBody));
let observableAdd = from(this.apiService.getInstance().core.tagsApi.addTag(nodeId, tagBody));
promiseAdd.subscribe((data) => {
this.refresh.emit(data);
observableAdd.subscribe((tagEntry: TagEntry) => {
this.refresh.emit(tagEntry);
}, (err) => {
this.handleError(err);
});
return promiseAdd;
return observableAdd;
}
/**
@@ -83,16 +82,16 @@ export class TagService {
* @param tag Name of the tag to remove
* @returns Null object when the operation completes
*/
removeTag(nodeId: string, tag: string): any {
const promiseRemove = from(this.apiService.getInstance().core.tagsApi.removeTag(nodeId, tag));
removeTag(nodeId: string, tag: string): Observable<any> {
const observableRemove = from(this.apiService.getInstance().core.tagsApi.removeTag(nodeId, tag));
promiseRemove.subscribe((data) => {
observableRemove.subscribe((data) => {
this.refresh.emit(data);
}, (err) => {
this.handleError(err);
});
return promiseRemove;
return observableRemove;
}
private handleError(error: any) {
@@ -16,7 +16,7 @@
*/
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AppConfigService, setupTestBed } from '@alfresco/adf-core';
import { setupTestBed } from '@alfresco/adf-core';
import { TagActionsComponent } from './tag-actions.component';
import { ContentTestingModule } from '../testing/content.testing.module';
@@ -33,9 +33,6 @@ describe('TagActionsComponent', () => {
});
beforeEach(() => {
let appConfig: AppConfigService = TestBed.get(AppConfigService);
appConfig.config.ecmHost = 'http://localhost:9876/ecm';
fixture = TestBed.createComponent(TagActionsComponent);
element = fixture.nativeElement;
@@ -19,6 +19,7 @@ import { TranslationService } from '@alfresco/adf-core';
import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation, OnDestroy, OnInit } from '@angular/core';
import { TagService } from './services/tag.service';
import { Subscription } from 'rxjs';
import { TagPaging } from '@alfresco/js-api';
/**
*
@@ -56,7 +57,8 @@ export class TagActionsComponent implements OnChanges, OnInit, OnDestroy {
private subscriptions: Subscription[] = [];
constructor(private tagService: TagService, private translateService: TranslationService) {}
constructor(private tagService: TagService, private translateService: TranslationService) {
}
ngOnInit() {
this.subscriptions.push(
@@ -77,8 +79,8 @@ export class TagActionsComponent implements OnChanges, OnInit, OnDestroy {
refreshTag() {
if (this.nodeId) {
this.tagService.getTagsByNodeId(this.nodeId).subscribe((data) => {
this.tagsEntries = data.list.entries;
this.tagService.getTagsByNodeId(this.nodeId).subscribe((tagPaging: TagPaging) => {
this.tagsEntries = tagPaging.list.entries;
this.disableAddTag = false;
this.result.emit(this.tagsEntries);
}, () => {
@@ -17,6 +17,7 @@
import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation } from '@angular/core';
import { TagService } from './services/tag.service';
import { TagPaging } from '@alfresco/js-api';
/**
*
@@ -60,8 +61,8 @@ export class TagNodeListComponent implements OnChanges {
refreshTag() {
if (this.nodeId) {
this.tagService.getTagsByNodeId(this.nodeId).subscribe((data) => {
this.tagsEntries = data.list.entries;
this.tagService.getTagsByNodeId(this.nodeId).subscribe((tagPaging: TagPaging) => {
this.tagsEntries = tagPaging.list.entries;
this.results.emit(this.tagsEntries);
});
}
@@ -22,7 +22,7 @@ import { ContentTestingModule } from '../../testing/content.testing.module';
import { TreeViewService } from '../services/tree-view.service';
import { of, throwError } from 'rxjs';
import { TreeBaseNode } from '../models/tree-view.model';
import { NodeEntry } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
import { SimpleChange } from '@angular/core';
describe('TreeViewComponent', () => {
@@ -33,18 +33,32 @@ describe('TreeViewComponent', () => {
let component: any;
let fakeNodeList: TreeBaseNode[] = [
{ nodeId: 'fake-node-id', name: 'fake-node-name', level: 0, expandable: true,
node: { entry: { name: 'fake-node-name', id: 'fake-node-id' } } }
<TreeBaseNode> {
nodeId: 'fake-node-id', name: 'fake-node-name', level: 0, expandable: true,
node: { entry: { name: 'fake-node-name', id: 'fake-node-id' } }
}
];
let fakeChildrenList: TreeBaseNode[] = [
{ nodeId: 'fake-child-id', name: 'fake-child-name', level: 0, expandable: true, node : {} },
{ nodeId: 'fake-second-id', name: 'fake-second-name', level: 0, expandable: true, node : {} }
<TreeBaseNode> { nodeId: 'fake-child-id', name: 'fake-child-name', level: 0, expandable: true, node: {} },
<TreeBaseNode> { nodeId: 'fake-second-id', name: 'fake-second-name', level: 0, expandable: true, node: {} }
];
let fakeNextChildrenList: TreeBaseNode[] = [
{ nodeId: 'fake-next-child-id', name: 'fake-next-child-name', level: 0, expandable: true, node : {} },
{ nodeId: 'fake-next-second-id', name: 'fake-next-second-name', level: 0, expandable: true, node : {} }
<TreeBaseNode> {
nodeId: 'fake-next-child-id',
name: 'fake-next-child-name',
level: 0,
expandable: true,
node: {}
},
<TreeBaseNode> {
nodeId: 'fake-next-second-id',
name: 'fake-next-second-name',
level: 0,
expandable: true,
node: {}
}
];
let returnRootOrChildrenNode = function (nodeId: string) {
@@ -61,8 +75,7 @@ describe('TreeViewComponent', () => {
imports: [
ContentTestingModule
],
declarations: [
]
declarations: []
});
describe('When there is a nodeId', () => {
@@ -20,7 +20,7 @@ import { Component, Input, OnChanges, SimpleChanges, Output, EventEmitter } from
import { TreeBaseNode } from '../models/tree-view.model';
import { TreeViewDataSource } from '../data/tree-view-datasource';
import { TreeViewService } from '../services/tree-view.service';
import { NodeEntry } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
@Component({
selector: 'adf-tree-view-list',
@@ -15,7 +15,7 @@
* limitations under the License.
*/
import { NodeEntry } from 'alfresco-js-api';
import { NodeEntry } from '@alfresco/js-api';
export class TreeBaseNode {
@@ -25,10 +25,12 @@ export class TreeBaseNode {
expandable = true;
node: NodeEntry;
constructor(nodeEntry: NodeEntry, level?: number) {
constructor(nodeEntry: NodeEntry, level?: number, expandable?: boolean) {
this.name = nodeEntry.entry.name;
this.level = level ? level : 0;
this.nodeId = nodeEntry.entry.id;
this.node = nodeEntry;
this.level = level ? level : 0;
this.expandable = expandable ? expandable : true;
this.node = nodeEntry ? new NodeEntry(nodeEntry) : undefined;
}
}
@@ -19,7 +19,7 @@ import { NodesApiService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { TreeBaseNode } from '../models/tree-view.model';
import { NodePaging, NodeEntry } from 'alfresco-js-api';
import { NodePaging, NodeEntry } from '@alfresco/js-api';
import { map } from 'rxjs/operators';
@Injectable({
@@ -22,6 +22,7 @@ import { of, throwError } from 'rxjs';
import { UploadButtonComponent } from './upload-button.component';
import { TranslationMock } from '@alfresco/adf-core';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { NodeEntry } from '@alfresco/js-api';
describe('UploadButtonComponent', () => {
@@ -33,7 +34,7 @@ describe('UploadButtonComponent', () => {
target: { value: 'fake-name-1' }
};
let fakeFolderNodeWithPermission = {
let fakeFolderNodeWithPermission = new NodeEntry({
entry: {
allowableOperations: [
'create',
@@ -43,7 +44,7 @@ describe('UploadButtonComponent', () => {
name: 'Folder Fake Name',
nodeType: 'cm:folder'
}
};
});
let component: UploadButtonComponent;
let fixture: ComponentFixture<UploadButtonComponent>;
@@ -161,7 +162,7 @@ describe('UploadButtonComponent', () => {
it('should create a folder and emit an File uploaded event', (done) => {
component.rootFolderId = '-my-';
spyOn(contentService, 'createFolder').and.returnValue(of(true));
// spyOn(contentService, 'createFolder').and.returnValue(of(true));
spyOn(contentService, 'getNode').and.returnValue(of(fakeFolderNodeWithPermission));
component.ngOnChanges({ rootFolderId: new SimpleChange(null, component.rootFolderId, true) });
@@ -23,7 +23,7 @@ import {
Component, EventEmitter, forwardRef, Input,
OnChanges, OnInit, Output, SimpleChanges, ViewEncapsulation, NgZone
} from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { Subject } from 'rxjs';
import { PermissionModel } from '../../document-list/models/permissions.model';
import { UploadBase } from './base-upload/upload-base';
@@ -125,7 +125,7 @@ export class UploadButtonComponent extends UploadBase implements OnInit, OnChang
}
}
nodeHasPermission(node: MinimalNodeEntryEntity, permission: PermissionsEnum | string): boolean {
nodeHasPermission(node: Node, permission: PermissionsEnum | string): boolean {
return this.contentService.hasPermission(node, permission);
}
}
@@ -17,7 +17,7 @@
import { PermissionsEnum } from '@alfresco/adf-core';
import { Component, forwardRef, Input, OnChanges, ViewEncapsulation, OnInit } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { UploadButtonComponent } from './upload-button.component';
import { FileModel, EXTENDIBLE_COMPONENT } from '@alfresco/adf-core';
@@ -34,7 +34,7 @@ export class UploadVersionButtonComponent extends UploadButtonComponent implemen
/** (**Required**) The node to be versioned. */
@Input()
node: MinimalNodeEntryEntity;
node: Node;
protected createFileModel(file: File): FileModel {
const fileModel = super.createFileModel(file, this.rootFolderId, ((<any> file).webkitRelativePath || '').replace(/\/[^\/]*$/, ''), this.node.id);
@@ -23,6 +23,7 @@ import { AlfrescoApiService, setupTestBed, CoreModule, AlfrescoApiServiceMock }
import { MatDialog } from '@angular/material';
import { of } from 'rxjs';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { Node, VersionPaging, VersionEntry } from '@alfresco/js-api';
describe('VersionListComponent', () => {
let component: VersionListComponent;
@@ -34,10 +35,10 @@ describe('VersionListComponent', () => {
const versionId = '1.0';
const versionTest = [
{
<VersionEntry> {
entry: { name: 'test-file-name', id: '1.0', versionComment: 'test-version-comment' }
},
{
<VersionEntry> {
entry: { name: 'test-file-name-two', id: '1.0', versionComment: 'test-version-comment' }
}
];
@@ -67,7 +68,7 @@ describe('VersionListComponent', () => {
dialog = TestBed.get(MatDialog);
component = fixture.componentInstance;
component.node = { id: nodeId, allowableOperations: ['update'] };
component.node = <Node> { id: nodeId, allowableOperations: ['update'] };
spyOn(component, 'downloadContent').and.stub();
});
@@ -240,7 +241,7 @@ describe('VersionListComponent', () => {
}
};
spyOn(alfrescoApiService.versionsApi, 'listVersionHistory').and
.callFake(() => Promise.resolve({ list: { entries: [versionEntry] } }));
.callFake(() => Promise.resolve(new VersionPaging({ list: { entries: [versionEntry] } })));
const spyOnDownload = spyOn(alfrescoApiService.contentApi, 'getContentUrl').and.stub();
component.allowDownload = false;
@@ -276,8 +277,8 @@ describe('VersionListComponent', () => {
component.versions = versionTest;
const spyOnRevertVersion = spyOn(alfrescoApiService.versionsApi, 'revertVersion').and
.callFake(() => Promise.resolve(
{ entry: { name: 'test-file-name', id: '1.0', versionComment: 'test-version-comment' } }));
.callFake(() => Promise.resolve(new VersionEntry(
{ entry: { name: 'test-file-name', id: '1.0', versionComment: 'test-version-comment' } })));
component.restore(versionId);
@@ -307,9 +308,9 @@ describe('VersionListComponent', () => {
beforeEach(() => {
fixture.detectChanges();
component.node = { id: nodeId };
component.node = new Node({ id: nodeId });
spyOn(alfrescoApiService.versionsApi, 'listVersionHistory').and.callFake(() => {
return Promise.resolve({
return Promise.resolve(new VersionPaging({
list: {
entries: [
{
@@ -317,7 +318,7 @@ describe('VersionListComponent', () => {
}
]
}
});
}));
});
component.ngOnChanges();
@@ -356,9 +357,9 @@ describe('VersionListComponent', () => {
beforeEach(() => {
fixture.detectChanges();
component.node = { id: nodeId };
component.node = <Node> { id: nodeId };
spyOn(alfrescoApiService.versionsApi, 'listVersionHistory').and.callFake(() => {
return Promise.resolve({
return Promise.resolve(new VersionPaging({
list: {
entries: [
{
@@ -369,7 +370,7 @@ describe('VersionListComponent', () => {
}
]
}
});
}));
});
component.ngOnChanges();
@@ -406,9 +407,9 @@ describe('VersionListComponent', () => {
beforeEach(() => {
fixture.detectChanges();
component.node = { id: nodeId, allowableOperations: ['update', 'delete'] };
component.node = <Node> { id: nodeId, allowableOperations: ['update', 'delete'] };
spyOn(alfrescoApiService.versionsApi, 'listVersionHistory').and.callFake(() => {
return Promise.resolve({
return Promise.resolve(new VersionPaging({
list: {
entries: [
{
@@ -419,7 +420,7 @@ describe('VersionListComponent', () => {
}
]
}
});
}));
});
component.ngOnChanges();
@@ -17,7 +17,7 @@
import { AlfrescoApiService, ContentService } from '@alfresco/adf-core';
import { Component, Input, OnChanges, ViewEncapsulation, EventEmitter, Output } from '@angular/core';
import { VersionsApi, MinimalNodeEntryEntity, VersionEntry } from 'alfresco-js-api';
import { VersionsApi, Node, VersionEntry, VersionPaging } from '@alfresco/js-api';
import { MatDialog } from '@angular/material';
import { ConfirmDialogComponent } from '../dialogs/confirm.dialog';
@@ -42,7 +42,7 @@ export class VersionListComponent implements OnChanges {
/** The target node. */
@Input()
node: MinimalNodeEntryEntity;
node: Node;
/** Toggles showing/hiding of comments */
@Input()
@@ -58,11 +58,11 @@ export class VersionListComponent implements OnChanges {
/** Emitted when a version is restored */
@Output()
restored: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter<MinimalNodeEntryEntity>();
restored: EventEmitter<Node> = new EventEmitter<Node>();
/** Emitted when a version is deleted */
@Output()
deleted: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter<MinimalNodeEntryEntity>();
deleted: EventEmitter<Node> = new EventEmitter<Node>();
constructor(private alfrescoApi: AlfrescoApiService,
private contentService: ContentService,
@@ -92,8 +92,8 @@ export class VersionListComponent implements OnChanges {
loadVersionHistory() {
this.isLoading = true;
this.versionsApi.listVersionHistory(this.node.id).then((data) => {
this.versions = data.list.entries;
this.versionsApi.listVersionHistory(this.node.id).then((versionPaging: VersionPaging) => {
this.versions = versionPaging.list.entries;
this.isLoading = false;
});
}
@@ -19,7 +19,7 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { AlfrescoApiService, setupTestBed, CoreModule, AlfrescoApiServiceMock } from '@alfresco/adf-core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { VersionManagerComponent } from './version-manager.component';
import { VersionListComponent } from './version-list.component';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
@@ -31,11 +31,11 @@ describe('VersionManagerComponent', () => {
let alfrescoApiService: AlfrescoApiService;
const expectedComment = 'test-version-comment';
const node: MinimalNodeEntryEntity = {
const node: Node = new Node({
id: '1234',
name: 'TEST-NODE',
isFile: true
};
});
const versionEntry = {
entry: {
id: '1.0',
@@ -16,7 +16,7 @@
*/
import { Component, Input, ViewEncapsulation, ViewChild, Output, EventEmitter } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { VersionListComponent } from './version-list.component';
import { AppConfigService, ContentService, AlfrescoApiService } from '@alfresco/adf-core';
import { trigger, state, style, animate, transition } from '@angular/animations';
@@ -45,7 +45,7 @@ export class VersionManagerComponent {
/** Target node to manage version history. */
@Input()
node: MinimalNodeEntryEntity;
node: Node;
/** Toggles showing/hiding of comments. */
@Input()
@@ -57,11 +57,11 @@ export class VersionManagerComponent {
/** Emitted when a file is uploaded successfully. */
@Output()
uploadSuccess: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter<MinimalNodeEntryEntity>();
uploadSuccess: EventEmitter<Node> = new EventEmitter<Node>();
/** Emitted when an error occurs during upload. */
@Output()
uploadError: EventEmitter<MinimalNodeEntryEntity> = new EventEmitter<MinimalNodeEntryEntity>();
uploadError: EventEmitter<Node> = new EventEmitter<Node>();
@ViewChild('versionList')
versionListComponent: VersionListComponent;
@@ -73,7 +73,7 @@ export class VersionManagerComponent {
private alfrescoApiService: AlfrescoApiService) {
}
refresh(node: MinimalNodeEntryEntity) {
refresh(node: Node) {
this.alfrescoApiService.nodeUpdated.next(node);
this.versionListComponent.loadVersionHistory();
this.uploadSuccess.emit(node);
@@ -16,7 +16,7 @@
*/
import { Component, Input, ViewEncapsulation, Output, EventEmitter } from '@angular/core';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { Node } from '@alfresco/js-api';
import { ContentService } from '@alfresco/adf-core';
@Component({
@@ -33,7 +33,7 @@ export class VersionUploadComponent {
uploadVersion: boolean = false;
@Input()
node: MinimalNodeEntryEntity;
node: Node;
@Output()
success = new EventEmitter();
@@ -130,7 +130,7 @@ export class WebscriptComponent implements OnChanges {
this.data = new ObjectDataTableAdapter(data.data, data.schema);
}
} catch (e) {
} catch (error) {
this.logService.error('error during the cast as datatable');
}
@@ -28,16 +28,16 @@ export abstract class CardViewBaseItemModel {
validators?: CardViewItemValidator[];
data?: any;
constructor(obj: CardViewItemProperties) {
this.label = obj.label || '';
this.value = obj.value;
this.key = obj.key;
this.default = obj.default;
this.editable = !!obj.editable;
this.clickable = !!obj.clickable;
this.icon = obj.icon || '';
this.validators = obj.validators || [];
this.data = obj.data || null;
constructor(cardViewItemProperties: CardViewItemProperties) {
this.label = cardViewItemProperties.label || '';
this.value = cardViewItemProperties.value;
this.key = cardViewItemProperties.key;
this.default = cardViewItemProperties.default;
this.editable = !!cardViewItemProperties.editable;
this.clickable = !!cardViewItemProperties.clickable;
this.icon = cardViewItemProperties.icon || '';
this.validators = cardViewItemProperties.validators || [];
this.data = cardViewItemProperties.data || null;
}
isEmpty(): boolean {
@@ -25,11 +25,11 @@ export class CardViewBoolItemModel extends CardViewBaseItemModel implements Card
value: boolean = false;
default: boolean;
constructor(obj: CardViewBoolItemProperties) {
super(obj);
constructor(cardViewBoolItemProperties: CardViewBoolItemProperties) {
super(cardViewBoolItemProperties);
if (obj.value !== undefined) {
this.value = !!JSON.parse(obj.value);
if (cardViewBoolItemProperties.value !== undefined) {
this.value = !!JSON.parse(cardViewBoolItemProperties.value);
}
}
@@ -25,11 +25,11 @@ export class CardViewDateItemModel extends CardViewBaseItemModel implements Card
type: string = 'date';
format: string = 'MMM DD YYYY';
constructor(obj: CardViewDateItemProperties) {
super(obj);
constructor(cardViewDateItemProperties: CardViewDateItemProperties) {
super(cardViewDateItemProperties);
if (obj.format) {
this.format = obj.format;
if (cardViewDateItemProperties.format) {
this.format = cardViewDateItemProperties.format;
}
}
@@ -24,12 +24,12 @@ import { CardViewItemFloatValidator } from '..//validators/card-view.validators'
export class CardViewFloatItemModel extends CardViewTextItemModel implements CardViewItem, DynamicComponentModel {
type: string = 'float';
constructor(obj: CardViewTextItemProperties) {
super(obj);
constructor(cardViewTextItemProperties: CardViewTextItemProperties) {
super(cardViewTextItemProperties);
this.validators.push(new CardViewItemFloatValidator());
if (obj.value) {
this.value = parseFloat(obj.value);
if (cardViewTextItemProperties.value) {
this.value = parseFloat(cardViewTextItemProperties.value);
}
}
}
@@ -24,12 +24,12 @@ import { CardViewItemIntValidator } from '../validators/card-view.validators';
export class CardViewIntItemModel extends CardViewTextItemModel implements CardViewItem, DynamicComponentModel {
type: string = 'int';
constructor(obj: CardViewTextItemProperties) {
super(obj);
constructor(cardViewTextItemProperties: CardViewTextItemProperties) {
super(cardViewTextItemProperties);
this.validators.push(new CardViewItemIntValidator());
if (obj.value) {
this.value = parseInt(obj.value, 10);
if (cardViewTextItemProperties.value) {
this.value = parseInt(cardViewTextItemProperties.value, 10);
}
}
}

Some files were not shown because too many files have changed in this diff Show More