/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * 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. * ============LICENSE_END========================================================= */ /** * Created by obarda on 1/27/2016. */ 'use strict'; import * as _ from "lodash"; import {IAppConfigurtaion} from "app/models"; export class FileUploadModel { filetype:string; filename:string; filesize:number; base64:string; } export interface IFileUploadScope extends ng.IScope { fileModel:FileUploadModel; formElement:ng.IFormController; extensions:string; elementDisabled:string; elementName:string; elementRequired:string; myFileModel:any; // From the ng bind to { return require('./file-upload.html'); }; link = (scope:IFileUploadScope, element:any, $attr:any) => { // In case the browse has filename, set it valid. // When editing artifact the file is not sent again, so if we have filename I do not want to show error. if (scope.fileModel && scope.fileModel.filename && scope.fileModel.filename !== '') { scope.formElement[scope.elementName].$setValidity('required', true); } scope.getExtensionsWithDot = ():string => { let ret = []; if (scope.extensions) { _.each(scope.extensions.split(','), function (item) { ret.push("." + item.toString()); }); } return ret.join(","); }; scope.onFileChange = ():void => { if (scope.myFileModel || scope.fileModel) { scope.fileModel = scope.myFileModel; scope.formElement[scope.elementName].value = scope.myFileModel; } if (scope.onFileChangedInDirective) { scope.onFileChangedInDirective(); } }; scope.setEmptyError = (element):void => { if (element.files[0].size) { scope.formElement[scope.elementName].$setValidity('emptyFile', true); } else { scope.formElement[scope.elementName].$setValidity('emptyFile', false); scope.fileModel = undefined; } }; // Prevent case-sensitivity in the upload-file accept parameter // Workaround for github issue: https://github.com/adonespitogo/angular-base64-upload/issues/81 scope.onAfterValidate = () => { if (!scope.formElement[scope.elementName].$valid && scope.extensions) { let uploadfileExtension:string = scope.fileModel.filename.split('.').pop().toLowerCase(); if (scope.extensions.split(',').indexOf(uploadfileExtension) > -1) { scope.formElement[scope.elementName].$setValidity('accept', true); } } // Adding fix for cases when we're changing file type for upload from file that requires certain // extensions to a file that don't requires any extensions if (!scope.formElement[scope.elementName].$valid && scope.formElement[scope.elementName].$error.accept && scope.extensions === "") { scope.formElement[scope.elementName].$setValidity('accept', true); } }; // Workaround, in case user select a file then cancel (X) then select the file again, the event onChange is not fired. // This is a workaround to fix this issue. scope.onFileClick = (element:any):void => { element.value = null; }; scope.cancel = ():void => { scope.myFileModel = new FileUploadModel(); scope.formElement[scope.elementName].$pristine; scope.formElement[scope.elementName].$setValidity('required', false); scope.onFileChange(); } }; public static factory = (sdcConfig:IAppConfigurtaion)=> { return new FileUploadDirective(sdcConfig); }; } FileUploadDirective.factory.$inject = [ 'sdcConfig'];