-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathn4fileupload.js
127 lines (113 loc) · 3.31 KB
/
n4fileupload.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
;
(function(ng) {
"use strict";
ng
.module("n4FileUpload", ["n4FileUpload.services", "n4FileUpload.directives"])
}(angular));
(function(ng) {
"use strict";
ng
.module("n4FileUpload.directives", [
"n4FileUpload.services"
])
.directive("n4FileUpload", [
"$timeout",
"n4FileUploadService",
"$q",
"$log",
function($timeout, service, $q, $log) {
return {
require: "ngModel",
restrict: "AE",
replace: true,
transclude: true,
scope: {
endpoint: "@",
onStart: "&",
onProgress: "=",
onFinish: "&"
},
template: [
"<label class=\"bt\">",
" <span ng-transclude=\"\"></span>",
" <input class=\"bt-input\" type=\"file\"/>",
"</label>"
].join(""),
link: function(scope, element, attrs, controller) {
var input = element.find("input");
if (!!attrs.multiple) {
input.attr("multiple", "multiple");
}
scope.files = [];
input.on("change", function(event) {
scope.onStart();
element.addClass("sending");
input.prop("disabled", true);
var promises = [],
files = event.target.files,
promise;
for (var i = (files.length - 1); i >= 0; i -= 1) {
scope.files.push(files[i]);
promise = service.send(files[i], scope.endpoint)
.then(null,
function(e) {
$log.error(e);
},
function(event) {
var file = event.config.file;
file.progress = parseInt(event.loaded * 100 / event.total, 10);
if (!!scope.onProgress) {
scope.onProgress(file);
}
});
promises.push(promise);
}
$q.all(promises)
.then(function(responses) {
try {
var data = responses.map(function(x) {
return x.data[0];
});
controller.$setViewValue(data);
} catch (e) {
$log.error(e);
controller.$setViewValue(responses);
}
})
.finally(function() {
element.removeClass("sending");
input.prop("disabled", false);
scope.onFinish();
});
});
scope.$on("$destroy", function() {
input.off("change");
});
}
};
}
]);
}(angular));
;
(function(ng) {
"use strict";
ng
.module("n4FileUpload.services", ["ngFileUpload"])
.provider("n4FileUploadService", function() {
var self = this;
this.endpoint = "";
this.$get = [
"Upload",
function(Upload) {
return {
send: function(file, endpoint) {
return Upload.upload({
url: endpoint || self.endpoint,
file: file
});
}
};
}
];
});
}(angular));