diff --git a/ng2-components/ng2-alfresco-upload/src/assets/AlfrescoSettingsService.service.mock.ts b/ng2-components/ng2-alfresco-upload/src/assets/AlfrescoSettingsService.service.mock.ts index 64b4e105b2..fb4a14ca7e 100644 --- a/ng2-components/ng2-alfresco-upload/src/assets/AlfrescoSettingsService.service.mock.ts +++ b/ng2-components/ng2-alfresco-upload/src/assets/AlfrescoSettingsService.service.mock.ts @@ -32,10 +32,6 @@ export class AlfrescoSettingsServiceMock { return this._host; } - public set host(value: string) { - this._host = value; - } - getApiBaseUrl(): string { return this._host + this._contextPath + this._apiBasePath; } diff --git a/ng2-components/ng2-alfresco-upload/src/assets/upload.service.mock.ts b/ng2-components/ng2-alfresco-upload/src/assets/upload.service.mock.ts index 94ccf1a7fb..53ad887d24 100644 --- a/ng2-components/ng2-alfresco-upload/src/assets/upload.service.mock.ts +++ b/ng2-components/ng2-alfresco-upload/src/assets/upload.service.mock.ts @@ -34,10 +34,11 @@ export class UploadServiceMock extends UploadService { } addToQueue(files: any[]): FileModel[] { + let result = super.addToQueue(files); this.filesUpload$ = new Observable(observer => { observer.next(files); }); - return files; + return result; } createFolder(relativePath: string, name: string) { @@ -46,8 +47,10 @@ export class UploadServiceMock extends UploadService { promise = new Promise(function (resolve, reject) { resolve({ entry: { - userId: 'fake-username', - id: 'fake-post-token' + isFile: false, + isFolder: true, + name: name, + nodeType: 'cm:folder' } }); }); diff --git a/ng2-components/ng2-alfresco-upload/src/components/upload-drag-area.component.spec.ts b/ng2-components/ng2-alfresco-upload/src/components/upload-drag-area.component.spec.ts index 27ed88e41d..c22f579e74 100644 --- a/ng2-components/ng2-alfresco-upload/src/components/upload-drag-area.component.spec.ts +++ b/ng2-components/ng2-alfresco-upload/src/components/upload-drag-area.component.spec.ts @@ -105,4 +105,93 @@ describe('AlfrescoUploadDragArea', () => { expect(component._showUndoNotificationBar).toHaveBeenCalled(); }); + it('should upload a file when dropped', done => { + let component = componentFixture.componentInstance; + component.currentFolderPath = '/root-fake-/sites-fake/document-library-fake'; + component.onSuccess = null; + + componentFixture.detectChanges(); + spyOn(component._uploaderService, 'uploadFilesInTheQueue'); + spyOn(component, '_showUndoNotificationBar').and.callFake( () => { + expect(component._showUndoNotificationBar).toHaveBeenCalled(); + done(); + }); + + let itemEntity = { + fullPath: '/folder-fake/file-fake.png', + isDirectory: false, + isFile: true, + name: 'file-fake.png', + file: (callbackFile) => { + let fileFake = new File(['fakefake'], 'file-fake.png', {type: 'image/png'}); + callbackFile(fileFake); + } + }; + + component.onFilesEntityDropped(itemEntity); + expect(component._uploaderService.uploadFilesInTheQueue) + .toHaveBeenCalledWith('/root-fake-/sites-fake/document-library-fake/folder-fake/', null); + }); + + it('should throws an exception and show it in the notification bar when the folder already exist', done => { + let component = componentFixture.componentInstance; + component.currentFolderPath = '/root-fake-/sites-fake/folder-fake'; + component.showUdoNotificationBar = true; + + componentFixture.detectChanges(); + spyOn(component, '_showErrorNotificationBar').and.callFake( () => { + expect(component._showErrorNotificationBar).toHaveBeenCalledWith('FILE_UPLOAD.MESSAGES.FOLDER_ALREADY_EXIST'); + done(); + }); + + let folderEntry = { + fullPath: '/folder-duplicate-fake', + isDirectory: true, + isFile: false, + name: 'folder-duplicate-fake' + }; + + component.onFolderEntityDropped(folderEntry); + }); + + it('should create a folder and call onFilesEntityDropped with the file inside the folder', done => { + let component = componentFixture.componentInstance; + component.currentFolderPath = '/root-fake-/sites-fake/document-library-fake'; + component.onSuccess = null; + + componentFixture.detectChanges(); + + let itemEntity = { + fullPath: '/folder-fake/file-fake.png', + isDirectory: false, + isFile: true, + name: 'file-fake.png', + file: (callbackFile) => { + let fileFake = new File(['fakefake'], 'file-fake.png', {type: 'image/png'}); + callbackFile(fileFake); + } + }; + + spyOn(component, 'onFilesEntityDropped').and.callFake( () => { + expect(component.onFilesEntityDropped).toHaveBeenCalledWith(itemEntity); + done(); + }); + + let folderEntry = { + fullPath: '/folder-fake', + isDirectory: true, + isFile: false, + name: 'folder-fake', + createReader: () => { + return { + readEntries: (callback) => { + let entries = [itemEntity, itemEntity]; + callback(entries); + } + }; + } + }; + + component.onFolderEntityDropped(folderEntry); + }); }); diff --git a/ng2-components/ng2-alfresco-upload/src/directives/file-draggable.directive.spec.ts b/ng2-components/ng2-alfresco-upload/src/directives/file-draggable.directive.spec.ts new file mode 100644 index 0000000000..6d11ea7dd5 --- /dev/null +++ b/ng2-components/ng2-alfresco-upload/src/directives/file-draggable.directive.spec.ts @@ -0,0 +1,110 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, expect, beforeEach, it } from '@angular/core/testing'; +import { FileDraggableDirective } from '../directives/file-draggable.directive'; + +describe('AlfrescoDirectiveFileDraggable', () => { + + let component; + + beforeEach( () => { + component = new FileDraggableDirective(); + }); + + it('should emit onFolderEntityDropped event when a folder is dragged with Chrome' , (done) => { + + let itemEntity = { + fullPath: '/folder-fake', + isDirectory: true, + isFile: false, + name: 'folder-fake' + }; + let fakeEvent = { + dataTransfer: { + items: [{ + webkitGetAsEntry: () => { + return itemEntity; + } + }] + }, + stopPropagation: jasmine.createSpy('stopPropagation'), + preventDefault: jasmine.createSpy('preventDefault') + }; + + component.onFolderEntityDropped.subscribe(files => { + expect(files).toEqual(itemEntity); + expect(component.getInputFocus()).toBe(false); + done(); + }); + + component._onDropFiles(fakeEvent); + }); + + it('should emit onFilesDropped event when a file is dragged not with Chrome' , (done) => { + let file = {name: 'fake-name-1', size: 10, webkitRelativePath: 'fake-folder1/fake-name-1.json'}; + let fakeEvent = { + dataTransfer: { + files: [file] + }, + stopPropagation: jasmine.createSpy('stopPropagation'), + preventDefault: jasmine.createSpy('preventDefault') + }; + + component.onFilesDropped.subscribe(files => { + expect(files).toEqual([file]); + expect(component.getInputFocus()).toBe(false); + done(); + }); + + component._onDropFiles(fakeEvent); + }); + + it('should emit onFilesDropped event when a file is dragged with Chrome', (done) => { + let file = {name: 'fake-name-2', size: 10, webkitRelativePath: 'fake-folder1/fake-name-2.json'}; + let fakeEvent = { + dataTransfer: { + items: [''], + files: [file] + }, + stopPropagation: jasmine.createSpy('stopPropagation'), + preventDefault: jasmine.createSpy('preventDefault') + }; + + component.onFilesDropped.subscribe(files => { + expect(files).toEqual([file]); + expect(component.getInputFocus()).toBe(false); + done(); + }); + + component._onDropFiles(fakeEvent); + }); + + it('should take the focus when the drag enter is called', () => { + let mockEvent = new Event('dragstart'); + spyOn(mockEvent, 'preventDefault'); + + expect(component.getInputFocus()).toBe(false); + component._onDragEnter(mockEvent); + expect(component.getInputFocus()).toBe(true); + }); + + + + + +}); diff --git a/ng2-components/ng2-alfresco-upload/src/directives/file-draggable.directive.ts b/ng2-components/ng2-alfresco-upload/src/directives/file-draggable.directive.ts index 338f6145c0..e8cf85185a 100644 --- a/ng2-components/ng2-alfresco-upload/src/directives/file-draggable.directive.ts +++ b/ng2-components/ng2-alfresco-upload/src/directives/file-draggable.directive.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { Directive, ElementRef, EventEmitter, Output } from '@angular/core'; +import { Directive, EventEmitter, Output } from '@angular/core'; /** * [file-draggable] @@ -53,8 +53,7 @@ export class FileDraggableDirective { private _inputFocusClass: boolean = false; - constructor(public el: ElementRef) { - console.log('FileDraggableComponent constructor', el); + constructor() { } /** @@ -68,12 +67,13 @@ export class FileDraggableDirective { let items = $event.dataTransfer.items; if (items) { for (let i = 0; i < items.length; i++) { - let item = items[i].webkitGetAsEntry(); - if (item) { - this._traverseFileTree(item); + if (typeof items[i].webkitGetAsEntry !== 'undefined') { + let item = items[i].webkitGetAsEntry(); + if (item) { + this._traverseFileTree(item); + } } else { - let dt = $event.dataTransfer; - let files = dt.files; + let files = $event.dataTransfer.files; this.onFilesDropped.emit(files); } } @@ -144,4 +144,13 @@ export class FileDraggableDirective { $event.stopPropagation(); $event.preventDefault(); } + + + /** + * Return the value of input focus class + * @returns {boolean} + */ + getInputFocus () { + return this._inputFocusClass; + } }