diff --git a/ng2-components/ng2-alfresco-core/src/models/file.model.spec.ts b/ng2-components/ng2-alfresco-core/src/models/file.model.spec.ts new file mode 100644 index 0000000000..da87c5ac4f --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/models/file.model.spec.ts @@ -0,0 +1,48 @@ +/*! + * @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 { FileModel } from './file.model'; + +describe('FileModel', () => { + + describe('extension', () => { + + it('should return the extension if file has it', () => { + const file = new FileModel( { name: 'tyrion-lannister.doc' }); + + expect(file.extension).toBe('doc'); + }); + + it('should return the empty string if file has NOT got it', () => { + const file = new FileModel( { name: 'daenerys-targaryen' }); + + expect(file.extension).toBe(''); + }); + + it('should return the empty string if file is starting with . and doesn\'t have extension', () => { + const file = new FileModel( { name: '.white-walkers' }); + + expect(file.extension).toBe(''); + }); + + it('should return the last extension string if file contains many dot', () => { + const file = new FileModel( { name: 'you.know.nothing.jon.snow.exe' }); + + expect(file.extension).toBe('exe'); + }); + }); +}); diff --git a/ng2-components/ng2-alfresco-core/src/models/file.model.ts b/ng2-components/ng2-alfresco-core/src/models/file.model.ts index 1e98bd4080..f4b9f8fa7a 100644 --- a/ng2-components/ng2-alfresco-core/src/models/file.model.ts +++ b/ng2-components/ng2-alfresco-core/src/models/file.model.ts @@ -73,4 +73,8 @@ export class FileModel { return v.toString(16); }); } + + get extension(): string { + return this.name.slice((Math.max(0, this.name.lastIndexOf('.')) || Infinity) + 1); + } } diff --git a/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.spec.ts b/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.spec.ts index 7a337a24ce..950b74dd9e 100644 --- a/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.spec.ts +++ b/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.spec.ts @@ -261,4 +261,60 @@ describe('UploadButtonComponent', () => { fixture.detectChanges(); expect(compiled.querySelector('#uploadFolder-label-static').textContent).toEqual('test-text'); }); + + describe('uploadFiles', () => { + + const files: File[] = [ + { name: 'phobos.jpg' }, + { name: 'deimos.png' }, + { name: 'ganymede.bmp' } + ]; + + let addToQueueSpy; + + beforeEach(() => { + addToQueueSpy = spyOn(uploadService, 'addToQueue'); + }); + + it('should filter out file, which is not part of the acceptedFilesType', () => { + component.acceptedFilesType = '.jpg'; + + component.uploadFiles(files); + + const filesCalledWith = addToQueueSpy.calls.mostRecent().args; + expect(filesCalledWith.length).toBe(1, 'Files should contain only one element'); + expect(filesCalledWith[0].name).toBe('phobos.jpg', 'png file should be filtered out'); + }); + + it('should filter out files, which are not part of the acceptedFilesType', () => { + component.acceptedFilesType = '.jpg,.png'; + + component.uploadFiles(files); + + const filesCalledWith = addToQueueSpy.calls.mostRecent().args; + expect(filesCalledWith.length).toBe(2, 'Files should contain two elements'); + expect(filesCalledWith[0].name).toBe('phobos.jpg'); + expect(filesCalledWith[1].name).toBe('deimos.png'); + }); + + it('should not filter out anything if acceptedFilesType is wildcard', () => { + component.acceptedFilesType = '*'; + + component.uploadFiles(files); + + const filesCalledWith = addToQueueSpy.calls.mostRecent().args; + expect(filesCalledWith.length).toBe(3, 'Files should contain all elements'); + expect(filesCalledWith[0].name).toBe('phobos.jpg'); + expect(filesCalledWith[1].name).toBe('deimos.png'); + expect(filesCalledWith[2].name).toBe('ganymede.bmp'); + }); + + it('should not add any file to que if everything is filtered out', () => { + component.acceptedFilesType = 'doc'; + + component.uploadFiles(files); + + expect(addToQueueSpy).not.toHaveBeenCalled(); + }); + }); }); diff --git a/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.ts b/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.ts index 2db23474d3..bb577c281d 100644 --- a/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.ts +++ b/ng2-components/ng2-alfresco-upload/src/components/upload-button.component.ts @@ -152,12 +152,11 @@ export class UploadButtonComponent implements OnInit, OnChanges { * @param path */ uploadFiles(files: File[]): void { - if (files.length > 0) { - const latestFilesAdded = files.map(file => new FileModel(file, { - newVersion: this.versioning, - parentId: this.rootFolderId, - path: (file.webkitRelativePath || '').replace(/\/[^\/]*$/, '') - })); + const latestFilesAdded: FileModel[] = files + .map(this.createFileModel.bind(this)) + .filter(this.isFileAcceptable.bind(this)); + + if (latestFilesAdded.length > 0) { this.uploadService.addToQueue(...latestFilesAdded); this.uploadService.uploadFilesInTheQueue(this.onSuccess); if (this.showNotificationBar) { @@ -166,6 +165,40 @@ export class UploadButtonComponent implements OnInit, OnChanges { } } + /** + * Creates FileModel from File + * + * @param file + */ + private createFileModel(file: File): FileModel { + return new FileModel(file, { + newVersion: this.versioning, + parentId: this.rootFolderId, + path: (file.webkitRelativePath || '').replace(/\/[^\/]*$/, '') + }); + } + + /** + * Checks if the given file is allowed by the extension filters + * + * @param file FileModel + */ + private isFileAcceptable(file: FileModel): boolean { + if (this.acceptedFilesType === '*') { + return true; + } + + const allowedExtensions = this.acceptedFilesType + .split(',') + .map(ext => ext.replace(/^\./, '')); + + if (allowedExtensions.indexOf(file.extension) !== -1) { + return true; + } + + return false; + } + /** * Show undo notification bar. *