evoapp.directive('fileUpload', function($rootScope, $filter, globals, $timeout) { return { restrict: 'AE', template: '' + 'Seleccionar Ficheiro' + '' + '' + '
' , scope: { title: '@', name: '@', itemId: '@', url: '@', formData: '=' }, controller: function($rootScope, $scope, $filter, globals, $timeout) { $scope.files = []; $scope.$filter = $filter; $scope.$rootScope = $rootScope; if($scope.$parent[$scope.itemId] == undefined) { $scope.$parent[$scope.itemId] = $scope; } else { throw Error('FileUpload ' + $scope.itemId + ' already exists!'); } }, link: function (scope, elem, attrs) { var files = $($(elem[0]).find('#files')[0]); //pass specified values to specified function arguments function callback(fn, args) { var fnArgs = [].concat(args); fnArgs.push.apply(fnArgs, arguments); return fn.apply(this, fnArgs); }; $(elem[0]).fileupload({ url: scope.url, dataType: 'json', singleFileUploads: true, autoUpload: false, acceptFileTypes: /(\.|\/)(gif|jpe?g|png|pdf|doc|docx|odt|ods|odp)$/i }).on('fileuploadadd', function (e, data) { var file = data.files[0]; files.html('
' + file.name + '
'); }).on('fileuploadprocessalways', function (e, data) { }).on('fileuploadprogressall', function (e, data) { }).on('fileuploaddone', function (e, data) { files.text(''); }).on('fileuploadfail', function (e, data) { files.text(''); }); $(elem[0]).bind('change', function (e) { var f = e.target.files || [{name: this.value}]; scope.files = new Array(); var file = f[0]; if(file.error == undefined) { scope.files.push(f[0]); } else { globals.message.alert({ message: 'Tipo de Ficheiro inválido!', callback: function(){ scope.reset(); } }); } }); scope.upload = function(formData){ if(scope.files.length > 0) { scope.$rootScope.$broadcast('loadingStatusActive'); var callbackFn = arguments[1]; $(elem[0]).fileupload('send', { files: scope.files, formData: formData }) .success(function (result, textStatus, jqXHR) { scope.$rootScope.$broadcast('loadingStatusInactive'); callback(callbackFn, [result, textStatus, jqXHR]); }) .error(function (jqXHR, textStatus, errorThrown) { scope.$rootScope.$broadcast('loadingStatusInactive'); //callback(callbackFn, [jqXHR, textStatus, errorThrown]); }) .complete(function (result, textStatus, jqXHR) { //callback(callbackFn, [result, textStatus, jqXHR]); }); } }; scope.reset = function(){ scope.files = []; files.empty(); }; } } });