From 105bc80d2c8ad356a57d56bf63785a8e196fd12a Mon Sep 17 00:00:00 2001 From: Vito Date: Fri, 2 Feb 2018 19:27:54 +0000 Subject: [PATCH] [ADF-2163] added target all for content actions (#2900) * [ADF-2163] first step to target all * [ADF-2163] start refactoring folder dulpication action * [ADF-2163] start refactorin all approach * [ADF-2163] added test for target action 'all' * [ADF-2163] fixed test and added enum for target actions * [ADF-2163] updated documentation for content action target all * [ADF-2163] updated documentation adding ENUM * [ADF-2163] added change to documentation after quick review * [ADF-2163] moved to upper case enum * Revert "[ADF-2163] moved to upper case enum" This reverts commit 41da0a34dd075971ded8c633dd293c9d8c59ef40. * [ADF-2163] fixed case for documentation --- .../app/components/files/files.component.html | 45 ++--------- docs/content-action.component.md | 2 +- .../content-action.component.spec.ts | 65 ++++++++-------- .../content-action.component.ts | 74 +++++++++---------- .../models/content-action.model.ts | 6 ++ 5 files changed, 86 insertions(+), 106 deletions(-) diff --git a/demo-shell/src/app/components/files/files.component.html b/demo-shell/src/app/components/files/files.component.html index facb0ca9d7..37960fafe6 100644 --- a/demo-shell/src/app/components/files/files.component.html +++ b/demo-shell/src/app/components/files/files.component.html @@ -195,11 +195,10 @@ - + - - - - - - diff --git a/docs/content-action.component.md b/docs/content-action.component.md index 36a9879eff..e6d7886696 100644 --- a/docs/content-action.component.md +++ b/docs/content-action.component.md @@ -79,7 +79,7 @@ export class MyView { | title | `string` | `'Action'` | The title of the action as shown in the menu. | | icon | `string` | | The name of the icon to display next to the menu command (can be left blank). | | handler | `string` | | System actions. Can be "delete", "download", "copy" or "move". | -| target | `string` | | Type of item that the action appies to. Can be "document" or "folder" | +| target | `string` | [ContentActionTarget.All](https://github.com/Alfresco/alfresco-ng2-components/blob/development/lib/content-services/document-list/models/content-action.model.ts) | Type of item that the action applies to. Can be one of the values provided by the enum : **All**, **Folder**, **Document** | | permission | `string` | | The permission type. | | disableWithNoPermission | `boolean` | | Should this action be disabled in the menu if the user doesn't have permission for it? | | disabled | `boolean` | `false` | Is the menu item disabled? | diff --git a/lib/content-services/document-list/components/content-action/content-action.component.spec.ts b/lib/content-services/document-list/components/content-action/content-action.component.spec.ts index f30f94f7a9..f6214eeaa1 100644 --- a/lib/content-services/document-list/components/content-action/content-action.component.spec.ts +++ b/lib/content-services/document-list/components/content-action/content-action.component.spec.ts @@ -21,9 +21,8 @@ import { async, TestBed } from '@angular/core/testing'; import { ContentService } from '@alfresco/adf-core'; import { DataTableModule } from '@alfresco/adf-core'; import { MaterialModule } from '../../../material.module'; - -import { DocumentListService } from '../../services/document-list.service'; import { FileNode } from '../../../mock'; +import { DocumentListService } from '../../services/document-list.service'; import { ContentActionHandler } from './../../models/content-action.model'; import { DocumentActionsService } from './../../services/document-actions.service'; import { FolderActionsService } from './../../services/folder-actions.service'; @@ -31,6 +30,7 @@ import { NodeActionsService } from './../../services/node-actions.service'; import { DocumentListComponent } from './../document-list.component'; import { ContentActionListComponent } from './content-action-list.component'; import { ContentActionComponent } from './content-action.component'; +import { ContentActionModel } from './../../models/content-action.model'; describe('ContentAction', () => { @@ -131,25 +131,45 @@ describe('ContentAction', () => { expect(model.handler).toBe(handler); }); - it('should require target to get system handler', () => { + it('should create document and folder action when there is no target', () => { spyOn(folderActions, 'getHandler').and.stub(); spyOn(documentActions, 'getHandler').and.stub(); let action = new ContentActionComponent(actionList, documentActions, folderActions); action.handler = ''; + action.ngOnInit(); + expect(documentList.actions.length).toBe(2); + expect(folderActions.getHandler).toHaveBeenCalled(); + expect(documentActions.getHandler).toHaveBeenCalled(); + }); + + it('should create document action when target is document', () => { + spyOn(folderActions, 'getHandler').and.stub(); + spyOn(documentActions, 'getHandler').and.stub(); + + let action = new ContentActionComponent(actionList, documentActions, folderActions); + action.handler = ''; + action.target = 'document'; + action.ngOnInit(); expect(documentList.actions.length).toBe(1); expect(folderActions.getHandler).not.toHaveBeenCalled(); - expect(documentActions.getHandler).not.toHaveBeenCalled(); - - action.target = 'document'; - action.ngOnInit(); expect(documentActions.getHandler).toHaveBeenCalled(); + }); + it('should create folder action when target is folder', () => { + spyOn(folderActions, 'getHandler').and.stub(); + spyOn(documentActions, 'getHandler').and.stub(); + + let action = new ContentActionComponent(actionList, documentActions, folderActions); + action.handler = ''; action.target = 'folder'; + action.ngOnInit(); + expect(documentList.actions.length).toBe(1); expect(folderActions.getHandler).toHaveBeenCalled(); + expect(documentActions.getHandler).not.toHaveBeenCalled(); }); it('should be case insensitive for document target', () => { @@ -193,20 +213,6 @@ describe('ContentAction', () => { model.execute(''); }); - it('should sync localizable fields with model', () => { - - let action = new ContentActionComponent(actionList, null, null); - action.title = 'title1'; - action.ngOnInit(); - - expect(action.model.title).toBe(action.title); - - action.title = 'title2'; - action.ngOnChanges(null); - - expect(action.model.title).toBe('title2'); - }); - it('should not find document action handler with missing service', () => { let action = new ContentActionComponent(actionList, null, null); expect(action.getSystemHandler('document', 'name')).toBeNull(); @@ -245,31 +251,31 @@ describe('ContentAction', () => { }); - it('should wire model with custom event handler', (done) => { + it('should wire model with custom event handler', async(() => { let action = new ContentActionComponent(actionList, documentActions, folderActions); let file = new FileNode(); let handler = new EventEmitter(); handler.subscribe((e) => { expect(e.value).toBe(file); - done(); }); action.execute = handler; action.ngOnInit(); - action.model.execute(file); - }); + documentList.actions[0].execute(file); + })); it('should allow registering model without handler', () => { let action = new ContentActionComponent(actionList, documentActions, folderActions); spyOn(actionList, 'registerAction').and.callThrough(); action.execute = null; + action.handler = null; + action.target = 'document'; action.ngOnInit(); - expect(action.model.handler).toBeUndefined(); - expect(actionList.registerAction).toHaveBeenCalledWith(action.model); + expect(actionList.registerAction).toHaveBeenCalledWith(documentList.actions[0]); }); it('should register on init', () => { @@ -281,10 +287,11 @@ describe('ContentAction', () => { }); it('should require action list to register action with', () => { + const fakeModel = new ContentActionModel(); let action = new ContentActionComponent(actionList, null, null); - expect(action.register()).toBeTruthy(); + expect(action.register(fakeModel)).toBeTruthy(); action = new ContentActionComponent(null, null, null); - expect(action.register()).toBeFalsy(); + expect(action.register(fakeModel)).toBeFalsy(); }); }); diff --git a/lib/content-services/document-list/components/content-action/content-action.component.ts b/lib/content-services/document-list/components/content-action/content-action.component.ts index 6c0f93fd92..ed7becc777 100644 --- a/lib/content-services/document-list/components/content-action/content-action.component.ts +++ b/lib/content-services/document-list/components/content-action/content-action.component.ts @@ -17,12 +17,12 @@ /* tslint:disable:component-selector */ -import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { ContentActionHandler } from '../../models/content-action.model'; import { DocumentActionsService } from '../../services/document-actions.service'; import { FolderActionsService } from '../../services/folder-actions.service'; -import { ContentActionModel } from './../../models/content-action.model'; +import { ContentActionModel, ContentActionTarget } from './../../models/content-action.model'; import { ContentActionListComponent } from './content-action-list.component'; @Component({ @@ -33,7 +33,7 @@ import { ContentActionListComponent } from './content-action-list.component'; FolderActionsService ] }) -export class ContentActionComponent implements OnInit, OnChanges { +export class ContentActionComponent implements OnInit { /** The title of the action as shown in the menu. */ @Input() @@ -49,7 +49,7 @@ export class ContentActionComponent implements OnInit, OnChanges { /** Type of item that the action appies to. Can be "document" or "folder" */ @Input() - target: string; + target: string = ContentActionTarget.All; /** The permission type. */ @Input() @@ -83,58 +83,58 @@ export class ContentActionComponent implements OnInit, OnChanges { @Output() success = new EventEmitter(); - model: ContentActionModel; - constructor( private list: ContentActionListComponent, private documentActions: DocumentActionsService, private folderActions: FolderActionsService) { - this.model = new ContentActionModel(); } ngOnInit() { - this.model = new ContentActionModel({ - title: this.title, - icon: this.icon, - permission: this.permission, - disableWithNoPermission: this.disableWithNoPermission, - target: this.target, - disabled: this.disabled - }); - - if (this.handler) { - this.model.handler = this.getSystemHandler(this.target, this.handler); + if (this.target === ContentActionTarget.All) { + this.generateAction(ContentActionTarget.Folder); + this.generateAction(ContentActionTarget.Document); + } else { + this.generateAction(this.target); } - - if (this.execute) { - this.model.execute = (value: any): void => { - this.execute.emit({ value }); - }; - } - - this.register(); } - register(): boolean { + register(model: ContentActionModel): boolean { if (this.list) { - return this.list.registerAction(this.model); + return this.list.registerAction(model); } return false; } - ngOnChanges(changes) { - // update localizable properties - this.model.title = this.title; + private generateAction(target: string) { + let model = new ContentActionModel({ + title: this.title, + icon: this.icon, + permission: this.permission, + disableWithNoPermission: this.disableWithNoPermission, + target: target, + disabled: this.disabled + }); + if (this.handler) { + model.handler = this.getSystemHandler(target, this.handler); + } + + if (this.execute) { + model.execute = (value: any): void => { + this.execute.emit({ value }); + }; + } + + this.register(model); } getSystemHandler(target: string, name: string): ContentActionHandler { if (target) { let ltarget = target.toLowerCase(); - if (ltarget === 'document') { + if (ltarget === ContentActionTarget.Document) { if (this.documentActions) { - this.documentActions.permissionEvent.subscribe((permision) => { - this.permissionEvent.emit(permision); + this.documentActions.permissionEvent.subscribe((permission) => { + this.permissionEvent.emit(permission); }); this.documentActions.error.subscribe((errors) => { @@ -150,10 +150,10 @@ export class ContentActionComponent implements OnInit, OnChanges { return null; } - if (ltarget === 'folder') { + if (ltarget === ContentActionTarget.Folder) { if (this.folderActions) { - this.folderActions.permissionEvent.subscribe((permision) => { - this.permissionEvent.emit(permision); + this.folderActions.permissionEvent.subscribe((permission) => { + this.permissionEvent.emit(permission); }); this.folderActions.error.subscribe((errors) => { diff --git a/lib/content-services/document-list/models/content-action.model.ts b/lib/content-services/document-list/models/content-action.model.ts index 57938a1abb..54e113a306 100644 --- a/lib/content-services/document-list/models/content-action.model.ts +++ b/lib/content-services/document-list/models/content-action.model.ts @@ -39,6 +39,12 @@ export class ContentActionModel { } } +export enum ContentActionTarget { + Document = 'document', + Folder = 'folder', + All = 'all' +} + export type ContentActionHandler = (obj: any, target?: any, permission?: string) => any; export class DocumentActionModel extends ContentActionModel {