From deb09e4d5f9b67e49894f4a176148b05cf7c1dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Popovics=20Andr=C3=A1s?= Date: Thu, 19 Apr 2018 13:03:38 +0100 Subject: [PATCH] Create Folder directive enhancement: custom nodeType (#3214) --- .../folder-create.directive.md | 1 + .../dialogs/folder.dialog.spec.ts | 25 ++- lib/content-services/dialogs/folder.dialog.ts | 6 +- .../folder-create.directive.spec.ts | 164 +++++++++++------- .../folder-create.directive.ts | 10 +- .../no-permission.component.ts | 2 +- .../permission-manager.module.ts | 2 +- 7 files changed, 138 insertions(+), 72 deletions(-) diff --git a/docs/content-services/folder-create.directive.md b/docs/content-services/folder-create.directive.md index 0cc9c6eeb3..8735feba1d 100644 --- a/docs/content-services/folder-create.directive.md +++ b/docs/content-services/folder-create.directive.md @@ -33,6 +33,7 @@ Creates folders. | -- | -- | -- | -- | | adf-create-folder | `string` | DEFAULT_FOLDER_PARENT_ID | Parent folder where the new folder will be located after creation. | | title | `string` | null | The title of the opened dialog. | +| nodeType | `string` | 'cm:folder' | The type of the node to be created. | ### Events diff --git a/lib/content-services/dialogs/folder.dialog.spec.ts b/lib/content-services/dialogs/folder.dialog.spec.ts index 0f01522022..4853c1d760 100644 --- a/lib/content-services/dialogs/folder.dialog.spec.ts +++ b/lib/content-services/dialogs/folder.dialog.spec.ts @@ -299,7 +299,30 @@ describe('FolderDialogComponent', () => { properties: { 'cm:title': 'folder-name-update', 'cm:description': 'folder-description-update' - } + }, + nodeType: 'cm:folder' + } + ); + }); + + it('should submit updated values if form is valid (with custom nodeType)', () => { + spyOn(nodesApi, 'createFolder').and.returnValue(Observable.of({})); + + component.form.controls['name'].setValue('folder-name-update'); + component.form.controls['description'].setValue('folder-description-update'); + component.nodeType = 'cm:sushi'; + + component.submit(); + + expect(nodesApi.createFolder).toHaveBeenCalledWith( + 'parentNodeId', + { + name: 'folder-name-update', + properties: { + 'cm:title': 'folder-name-update', + 'cm:description': 'folder-description-update' + }, + nodeType: 'cm:sushi' } ); }); diff --git a/lib/content-services/dialogs/folder.dialog.ts b/lib/content-services/dialogs/folder.dialog.ts index abdb640e9e..3180f19b78 100644 --- a/lib/content-services/dialogs/folder.dialog.ts +++ b/lib/content-services/dialogs/folder.dialog.ts @@ -47,6 +47,7 @@ export class FolderDialogComponent implements OnInit { editTitle = 'CORE.FOLDER_DIALOG.EDIT_FOLDER_TITLE'; createTitle = 'CORE.FOLDER_DIALOG.CREATE_FOLDER_TITLE'; + nodeType = 'cm:folder'; constructor( private formBuilder: FormBuilder, @@ -60,6 +61,7 @@ export class FolderDialogComponent implements OnInit { if (data) { this.editTitle = data.editTitle || this.editTitle; this.createTitle = data.createTitle || this.createTitle; + this.nodeType = data.nodeType || this.nodeType; } } @@ -116,8 +118,8 @@ export class FolderDialogComponent implements OnInit { } private create(): Observable { - const { name, properties, nodesApi, data: { parentNodeId} } = this; - return nodesApi.createFolder(parentNodeId, { name, properties }); + const { name, properties, nodeType, nodesApi, data: { parentNodeId} } = this; + return nodesApi.createFolder(parentNodeId, { name, properties, nodeType }); } private edit(): Observable { diff --git a/lib/content-services/folder-directive/folder-create.directive.spec.ts b/lib/content-services/folder-directive/folder-create.directive.spec.ts index 8580d2be56..d2e5d7672b 100644 --- a/lib/content-services/folder-directive/folder-create.directive.spec.ts +++ b/lib/content-services/folder-directive/folder-create.directive.spec.ts @@ -31,9 +31,15 @@ import { Subject } from 'rxjs/Subject'; import { MinimalNodeEntryEntity } from 'alfresco-js-api'; @Component({ - template: '
' + template: ` +
+
` }) -class TestComponent { +class Test1Component { parentNode = ''; public successParameter: MinimalNodeEntryEntity = null; @@ -42,20 +48,25 @@ class TestComponent { } } +@Component({ + template: `
` +}) +class Test2Component { + parentNode = ''; + public successParameter: MinimalNodeEntryEntity = null; +} + describe('FolderCreateDirective', () => { - let fixture: ComponentFixture; + let fixture: ComponentFixture; let element; let node: any; let dialog: MatDialog; let contentService: ContentService; let dialogRefMock; - const event = { - type: 'click', - preventDefault: () => null - }; + const event = { type: 'click', preventDefault: () => null }; - beforeEach(() => { + beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ HttpClientModule, @@ -71,22 +82,16 @@ describe('FolderCreateDirective', () => { }) ], declarations: [ - TestComponent, + Test1Component, + Test2Component, FolderDialogComponent, FolderCreateDirective ], providers: [ ContentService ] - }); - - TestBed.compileComponents(); - - fixture = TestBed.createComponent(TestComponent); - element = fixture.debugElement.query(By.directive(FolderCreateDirective)); - dialog = TestBed.get(MatDialog); - contentService = TestBed.get(ContentService); - }); + }).compileComponents(); + })); beforeEach(() => { node = { entry: { id: 'nodeId' } }; @@ -98,60 +103,95 @@ describe('FolderCreateDirective', () => { success: new Subject() } }; - - spyOn(dialog, 'open').and.returnValue(dialogRefMock); }); - xit('should emit folderCreate event when input value is not undefined', (done) => { - spyOn(dialogRefMock, 'afterClosed').and.returnValue(Observable.of(node)); - spyOn(contentService.folderCreate, 'next'); + describe('With overrides', () => { - contentService.folderCreate.subscribe((val) => { - expect(val).toBe(node); - done(); + beforeEach(() => { + fixture = TestBed.createComponent(Test1Component); + element = fixture.debugElement.query(By.directive(FolderCreateDirective)); + dialog = TestBed.get(MatDialog); + contentService = TestBed.get(ContentService); + spyOn(dialog, 'open').and.returnValue(dialogRefMock); }); - fixture.detectChanges(); + xit('should emit folderCreate event when input value is not undefined', (done) => { + spyOn(dialogRefMock, 'afterClosed').and.returnValue(Observable.of(node)); + spyOn(contentService.folderCreate, 'next'); - fixture.whenStable().then(() => { - element.nativeElement.click(); + contentService.folderCreate.subscribe((val) => { + expect(val).toBe(node); + done(); + }); + + fixture.detectChanges(); + + fixture.whenStable().then(() => { + element.nativeElement.click(); + }); }); + + it('should not emit folderCreate event when input value is undefined', () => { + spyOn(dialogRefMock, 'afterClosed').and.returnValue(Observable.of(null)); + spyOn(contentService.folderCreate, 'next'); + + fixture.detectChanges(); + + fixture.whenStable().then(() => { + element.nativeElement.click(); + expect(contentService.folderCreate.next).not.toHaveBeenCalled(); + }); + }); + + it('should emit success event with node if the folder creation was successful', async(() => { + const testNode = {}; + fixture.detectChanges(); + + element.triggerEventHandler('click', event); + dialogRefMock.componentInstance.success.next(testNode); + + fixture.whenStable().then(() => { + expect(fixture.componentInstance.successParameter).toBe(testNode); + }); + })); + + it('should open the dialog with the proper title and nodeType', async(() => { + fixture.detectChanges(); + element.triggerEventHandler('click', event); + + expect(dialog.open).toHaveBeenCalledWith(jasmine.any(Function), { + data: { + parentNodeId: jasmine.any(String), + createTitle: 'create-title', + nodeType: 'cm:my-litte-pony' + }, + width: jasmine.any(String) + }); + })); }); - it('should not emit folderCreate event when input value is undefined', () => { - spyOn(dialogRefMock, 'afterClosed').and.returnValue(Observable.of(null)); - spyOn(contentService.folderCreate, 'next'); + describe('Without overrides', () => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - element.nativeElement.click(); - expect(contentService.folderCreate.next).not.toHaveBeenCalled(); + beforeEach(() => { + fixture = TestBed.createComponent(Test2Component); + element = fixture.debugElement.query(By.directive(FolderCreateDirective)); + dialog = TestBed.get(MatDialog); + contentService = TestBed.get(ContentService); + spyOn(dialog, 'open').and.returnValue(dialogRefMock); }); + + it('should open the dialog with the default title and nodeType', async(() => { + fixture.detectChanges(); + element.triggerEventHandler('click', event); + + expect(dialog.open).toHaveBeenCalledWith(jasmine.any(Function), { + data: { + parentNodeId: jasmine.any(String), + createTitle: null, + nodeType: 'cm:folder' + }, + width: jasmine.any(String) + }); + })); }); - - it('should emit success event with node if the folder creation was successful', async(() => { - const testNode = {}; - fixture.detectChanges(); - - element.triggerEventHandler('click', event); - dialogRefMock.componentInstance.success.next(testNode); - - fixture.whenStable().then(() => { - expect(fixture.componentInstance.successParameter).toBe(testNode); - }); - })); - - it('should open the dialog with the proper title', async(() => { - fixture.detectChanges(); - element.triggerEventHandler('click', event); - - expect(dialog.open).toHaveBeenCalledWith(jasmine.any(Function), { - data: { - parentNodeId: jasmine.any(String), - createTitle: 'create-title' - }, - width: jasmine.any(String) - }); - })); }); diff --git a/lib/content-services/folder-directive/folder-create.directive.ts b/lib/content-services/folder-directive/folder-create.directive.ts index 946a7357ea..0f298fb191 100644 --- a/lib/content-services/folder-directive/folder-create.directive.ts +++ b/lib/content-services/folder-directive/folder-create.directive.ts @@ -38,6 +38,9 @@ export class FolderCreateDirective { @Input() title: string = null; + @Input() + nodeType = 'cm:folder'; + /** Emitted when the create folder give error for example a folder with same name already exist */ @Output() error: EventEmitter = new EventEmitter(); @@ -58,13 +61,10 @@ export class FolderCreateDirective { private get dialogConfig(): MatDialogConfig { const { DIALOG_WIDTH: width } = FolderCreateDirective; - const { parentNodeId } = this; + const { parentNodeId, title: createTitle, nodeType } = this; return { - data: { - parentNodeId, - createTitle: this.title - }, + data: { parentNodeId, createTitle, nodeType }, width: `${width}px` }; } diff --git a/lib/content-services/permission-manager/components/permission-list/no-permission.component.ts b/lib/content-services/permission-manager/components/permission-list/no-permission.component.ts index 38a8406957..230852ab27 100644 --- a/lib/content-services/permission-manager/components/permission-list/no-permission.component.ts +++ b/lib/content-services/permission-manager/components/permission-list/no-permission.component.ts @@ -17,7 +17,7 @@ /* tslint:disable:no-input-rename */ -import { Component} from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'adf-no-permission-template', diff --git a/lib/content-services/permission-manager/permission-manager.module.ts b/lib/content-services/permission-manager/permission-manager.module.ts index 3d0b401fbe..ff918e5d2c 100644 --- a/lib/content-services/permission-manager/permission-manager.module.ts +++ b/lib/content-services/permission-manager/permission-manager.module.ts @@ -24,7 +24,7 @@ import { PermissionListComponent } from './components/permission-list/permission import { DataTableModule, DataColumnModule } from '@alfresco/adf-core'; import { InheritPermissionDirective } from './components/inherited-button.directive'; import { NodePermissionService } from './services/node-permission.service'; -import { NoPermissionTemplateComponent } from "./components/permission-list/no-permission.component"; +import { NoPermissionTemplateComponent } from './components/permission-list/no-permission.component'; @NgModule({ imports: [