jquery-fileupload-rails 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +38 -16
- data/{vendor → app}/assets/images/loading.gif +0 -0
- data/{vendor → app}/assets/images/progressbar.gif +0 -0
- data/app/assets/javascripts/jquery-fileupload/angularjs.js +12 -0
- data/app/assets/javascripts/jquery-fileupload/basic-plus.js +11 -0
- data/app/assets/javascripts/jquery-fileupload/basic.js +3 -0
- data/{vendor → app}/assets/javascripts/jquery-fileupload/cors/jquery.postmessage-transport.js +4 -4
- data/{vendor → app}/assets/javascripts/jquery-fileupload/cors/jquery.xdr-transport.js +1 -2
- data/app/assets/javascripts/jquery-fileupload/index.js +13 -0
- data/app/assets/javascripts/jquery-fileupload/jquery-ui.js +13 -0
- data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-angular.js +429 -0
- data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-audio.js +106 -0
- data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-image.js +315 -0
- data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-jquery-ui.js +152 -0
- data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-process.js +172 -0
- data/{vendor → app}/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js +178 -273
- data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-validate.js +119 -0
- data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-video.js +106 -0
- data/{vendor → app}/assets/javascripts/jquery-fileupload/jquery.fileupload.js +481 -188
- data/{vendor → app}/assets/javascripts/jquery-fileupload/jquery.iframe-transport.js +43 -14
- data/{vendor → app}/assets/javascripts/jquery-fileupload/locale.js +0 -0
- data/{vendor → app}/assets/javascripts/jquery-fileupload/vendor/canvas-to-blob.js +9 -5
- data/{vendor → app}/assets/javascripts/jquery-fileupload/vendor/jquery.ui.widget.js +72 -44
- data/app/assets/javascripts/jquery-fileupload/vendor/load-image.all.min.js +1 -0
- data/{vendor → app}/assets/javascripts/jquery-fileupload/vendor/tmpl.js +9 -8
- data/app/assets/stylesheets/jquery.fileupload-noscript.scss +22 -0
- data/app/assets/stylesheets/jquery.fileupload-ui-noscript.scss +17 -0
- data/app/assets/stylesheets/jquery.fileupload-ui.scss +57 -0
- data/app/assets/stylesheets/jquery.fileupload.scss +36 -0
- data/lib/jquery/fileupload/rails/version.rb +1 -1
- metadata +43 -39
- data/vendor/assets/javascripts/jquery-fileupload/basic.js +0 -4
- data/vendor/assets/javascripts/jquery-fileupload/index.js +0 -9
- data/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-fp.js +0 -223
- data/vendor/assets/javascripts/jquery-fileupload/vendor/load-image.js +0 -121
- data/vendor/assets/stylesheets/jquery.fileupload-ui.scss +0 -84
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c1371b3aeb9a281ebbb77cc9f3afc16e99598b77
|
4
|
+
data.tar.gz: 2bb1f4ab429a3e88c570d5d46a38df88e7557346
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 65eca9c49bca1f76e5d1a49e7255446c2f98c5bff0137b44581687a3043ee705fa06ece26d22a06538fad3d3864783304a92606eb1d8fa3f90f931704b681271
|
7
|
+
data.tar.gz: 3ca6ac7d6c4fc3498e3db0954d86decc131a760ae4b0eafeb75071f45e595da402934ecdc23f15b1e050ecbe8f2e2da11dd77ec98987623befeddd42c1498db8
|
data/README.md
CHANGED
@@ -6,9 +6,9 @@ jquery-fileupload-rails is a library that integrates jQuery File Upload for Rail
|
|
6
6
|
|
7
7
|
## Plugin versions
|
8
8
|
|
9
|
-
* jQuery File Upload User Interface Plugin 6.
|
10
|
-
* jQuery File Upload Plugin 5.
|
11
|
-
* jQuery UI Widget 1.
|
9
|
+
* jQuery File Upload User Interface Plugin 9.6.0
|
10
|
+
* jQuery File Upload Plugin 5.42.0
|
11
|
+
* jQuery UI Widget 1.11.1
|
12
12
|
|
13
13
|
## Installing Gem
|
14
14
|
|
@@ -22,32 +22,54 @@ Require jquery-fileupload in your app/assets/application.js file.
|
|
22
22
|
|
23
23
|
The snippet above will add the following js files to the mainfest file.
|
24
24
|
|
25
|
-
//=require jquery-fileupload/vendor/jquery.ui.widget
|
26
|
-
//=require jquery-fileupload/vendor/
|
27
|
-
//=require jquery-fileupload/vendor/
|
28
|
-
//=require jquery-fileupload/vendor/
|
29
|
-
//=require jquery-fileupload/jquery.iframe-transport
|
30
|
-
//=require jquery-fileupload/jquery.fileupload
|
31
|
-
//=require jquery-fileupload/jquery.fileupload-
|
32
|
-
//=require jquery-fileupload/jquery.fileupload-
|
33
|
-
//=require jquery-fileupload/
|
25
|
+
//= require jquery-fileupload/vendor/jquery.ui.widget
|
26
|
+
//= require jquery-fileupload/vendor/tmpl
|
27
|
+
//= require jquery-fileupload/vendor/load-image
|
28
|
+
//= require jquery-fileupload/vendor/canvas-to-blob
|
29
|
+
//= require jquery-fileupload/jquery.iframe-transport
|
30
|
+
//= require jquery-fileupload/jquery.fileupload
|
31
|
+
//= require jquery-fileupload/jquery.fileupload-process
|
32
|
+
//= require jquery-fileupload/jquery.fileupload-image
|
33
|
+
//= require jquery-fileupload/jquery.fileupload-audio
|
34
|
+
//= require jquery-fileupload/jquery.fileupload-video
|
35
|
+
//= require jquery-fileupload/jquery.fileupload-validate
|
36
|
+
//= require jquery-fileupload/jquery.fileupload-ui
|
37
|
+
//= require jquery-fileupload/locale
|
38
|
+
//= require jquery-fileupload/jquery.fileupload-angular
|
39
|
+
//= require jquery-fileupload/jquery.fileupload-jquery-ui
|
40
|
+
//= require jquery-fileupload/cors/jquery.postmessage-transport
|
41
|
+
//= require jquery-fileupload/cors/jquery.xdr-transport
|
34
42
|
|
35
43
|
If you only need the basic files, just add the code below to your application.js file. [Basic setup guide](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)
|
36
44
|
|
37
|
-
//=require jquery-fileupload/basic
|
45
|
+
//= require jquery-fileupload/basic
|
38
46
|
|
39
47
|
The basic setup only includes the following files:
|
40
48
|
|
41
|
-
//=require jquery-fileupload/vendor/jquery.ui.widget
|
42
|
-
//=require jquery-fileupload/jquery.iframe-transport
|
43
|
-
//=require jquery-fileupload/jquery.fileupload
|
49
|
+
//= require jquery-fileupload/vendor/jquery.ui.widget
|
50
|
+
//= require jquery-fileupload/jquery.iframe-transport
|
51
|
+
//= require jquery-fileupload/jquery.fileupload
|
52
|
+
|
53
|
+
You can also require the following to get the js from the Basic-Plus, AngularJS and jQuery UI Examples:
|
54
|
+
|
55
|
+
//= require jquery-fileupload/basic-plus
|
56
|
+
|
57
|
+
//= require jquery-fileupload/angularjs
|
58
|
+
|
59
|
+
//= require jquery-fileupload/jquery-ui
|
44
60
|
|
45
61
|
## Using the stylesheet
|
46
62
|
|
47
63
|
Require the stylesheet file to app/assets/stylesheets/application.css
|
48
64
|
|
65
|
+
*= require jquery.fileupload
|
49
66
|
*= require jquery.fileupload-ui
|
50
67
|
|
68
|
+
There are also noscript styles for Browsers with Javascript disabled, to use them create a noscript.css and add it to your precompile-list and layout inside a noscript tag:
|
69
|
+
|
70
|
+
*= require jquery.fileupload-noscript
|
71
|
+
*= require jquery.fileupload-ui-noscript
|
72
|
+
|
51
73
|
## Using the middleware
|
52
74
|
|
53
75
|
The `jquery.iframe-transport` fallback transport has some special caveats regarding the response data type, http status, and character encodings. `jquery-fileupload-rails` includes a middleware that handles these inconsistencies seamlessly. If you decide to use it, create an initializer that adds the middleware to your application's middleware stack.
|
File without changes
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
//= require jquery-fileupload/vendor/jquery.ui.widget
|
2
|
+
//= require jquery-fileupload/vendor/load-image.all.min
|
3
|
+
//= require jquery-fileupload/vendor/canvas-to-blob
|
4
|
+
//= require jquery-fileupload/jquery.iframe-transport
|
5
|
+
//= require jquery-fileupload/jquery.fileupload
|
6
|
+
//= require jquery-fileupload/jquery.fileupload-process
|
7
|
+
//= require jquery-fileupload/jquery.fileupload-image
|
8
|
+
//= require jquery-fileupload/jquery.fileupload-audio
|
9
|
+
//= require jquery-fileupload/jquery.fileupload-video
|
10
|
+
//= require jquery-fileupload/jquery.fileupload-validate
|
11
|
+
//= require jquery-fileupload/jquery.fileupload-angular
|
12
|
+
//= require jquery-fileupload/locale
|
@@ -0,0 +1,11 @@
|
|
1
|
+
//= require jquery-fileupload/vendor/jquery.ui.widget
|
2
|
+
//= require jquery-fileupload/vendor/load-image.all.min
|
3
|
+
//= require jquery-fileupload/vendor/canvas-to-blob
|
4
|
+
//= require jquery-fileupload/jquery.iframe-transport
|
5
|
+
//= require jquery-fileupload/jquery.fileupload
|
6
|
+
//= require jquery-fileupload/jquery.fileupload-process
|
7
|
+
//= require jquery-fileupload/jquery.fileupload-image
|
8
|
+
//= require jquery-fileupload/jquery.fileupload-audio
|
9
|
+
//= require jquery-fileupload/jquery.fileupload-video
|
10
|
+
//= require jquery-fileupload/jquery.fileupload-validate
|
11
|
+
//= require jquery-fileupload/locale
|
data/{vendor → app}/assets/javascripts/jquery-fileupload/cors/jquery.postmessage-transport.js
RENAMED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery postMessage Transport Plugin 1.1
|
2
|
+
* jQuery postMessage Transport Plugin 1.1.1
|
3
3
|
* https://github.com/blueimp/jQuery-File-Upload
|
4
4
|
*
|
5
5
|
* Copyright 2011, Sebastian Tschan
|
@@ -9,8 +9,7 @@
|
|
9
9
|
* http://www.opensource.org/licenses/MIT
|
10
10
|
*/
|
11
11
|
|
12
|
-
/*
|
13
|
-
/*global define, window, document */
|
12
|
+
/* global define, window, document */
|
14
13
|
|
15
14
|
(function (factory) {
|
16
15
|
'use strict';
|
@@ -64,8 +63,9 @@
|
|
64
63
|
xhrUpload = options.xhr().upload;
|
65
64
|
return {
|
66
65
|
send: function (_, completeCallback) {
|
66
|
+
counter += 1;
|
67
67
|
var message = {
|
68
|
-
id: 'postmessage-transport-' +
|
68
|
+
id: 'postmessage-transport-' + counter
|
69
69
|
},
|
70
70
|
eventName = 'message.' + message.id;
|
71
71
|
iframe = $(
|
@@ -0,0 +1,13 @@
|
|
1
|
+
//= require jquery-fileupload/vendor/jquery.ui.widget
|
2
|
+
//= require jquery-fileupload/vendor/tmpl
|
3
|
+
//= require jquery-fileupload/vendor/load-image.all.min
|
4
|
+
//= require jquery-fileupload/vendor/canvas-to-blob
|
5
|
+
//= require jquery-fileupload/jquery.iframe-transport
|
6
|
+
//= require jquery-fileupload/jquery.fileupload
|
7
|
+
//= require jquery-fileupload/jquery.fileupload-process
|
8
|
+
//= require jquery-fileupload/jquery.fileupload-image
|
9
|
+
//= require jquery-fileupload/jquery.fileupload-audio
|
10
|
+
//= require jquery-fileupload/jquery.fileupload-video
|
11
|
+
//= require jquery-fileupload/jquery.fileupload-validate
|
12
|
+
//= require jquery-fileupload/jquery.fileupload-ui
|
13
|
+
//= require jquery-fileupload/locale
|
@@ -0,0 +1,13 @@
|
|
1
|
+
//= require jquery-fileupload/vendor/tmpl
|
2
|
+
//= require jquery-fileupload/vendor/load-image.all.min
|
3
|
+
//= require jquery-fileupload/vendor/canvas-to-blob
|
4
|
+
//= require jquery-fileupload/jquery.iframe-transport
|
5
|
+
//= require jquery-fileupload/jquery.fileupload
|
6
|
+
//= require jquery-fileupload/jquery.fileupload-process
|
7
|
+
//= require jquery-fileupload/jquery.fileupload-image
|
8
|
+
//= require jquery-fileupload/jquery.fileupload-audio
|
9
|
+
//= require jquery-fileupload/jquery.fileupload-video
|
10
|
+
//= require jquery-fileupload/jquery.fileupload-validate
|
11
|
+
//= require jquery-fileupload/jquery.fileupload-ui
|
12
|
+
//= require jquery-fileupload/jquery.fileupload-jquery-ui
|
13
|
+
//= require jquery-fileupload/locale
|
@@ -0,0 +1,429 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery File Upload AngularJS Plugin 2.2.0
|
3
|
+
* https://github.com/blueimp/jQuery-File-Upload
|
4
|
+
*
|
5
|
+
* Copyright 2013, Sebastian Tschan
|
6
|
+
* https://blueimp.net
|
7
|
+
*
|
8
|
+
* Licensed under the MIT license:
|
9
|
+
* http://www.opensource.org/licenses/MIT
|
10
|
+
*/
|
11
|
+
|
12
|
+
/* jshint nomen:false */
|
13
|
+
/* global define, angular */
|
14
|
+
|
15
|
+
(function (factory) {
|
16
|
+
'use strict';
|
17
|
+
if (typeof define === 'function' && define.amd) {
|
18
|
+
// Register as an anonymous AMD module:
|
19
|
+
define([
|
20
|
+
'jquery',
|
21
|
+
'angular',
|
22
|
+
'./jquery.fileupload-image',
|
23
|
+
'./jquery.fileupload-audio',
|
24
|
+
'./jquery.fileupload-video',
|
25
|
+
'./jquery.fileupload-validate'
|
26
|
+
], factory);
|
27
|
+
} else {
|
28
|
+
factory();
|
29
|
+
}
|
30
|
+
}(function () {
|
31
|
+
'use strict';
|
32
|
+
|
33
|
+
angular.module('blueimp.fileupload', [])
|
34
|
+
|
35
|
+
// The fileUpload service provides configuration options
|
36
|
+
// for the fileUpload directive and default handlers for
|
37
|
+
// File Upload events:
|
38
|
+
.provider('fileUpload', function () {
|
39
|
+
var scopeEvalAsync = function (expression) {
|
40
|
+
var scope = angular.element(this)
|
41
|
+
.fileupload('option', 'scope');
|
42
|
+
// Schedule a new $digest cycle if not already inside of one
|
43
|
+
// and evaluate the given expression:
|
44
|
+
scope.$evalAsync(expression);
|
45
|
+
},
|
46
|
+
addFileMethods = function (scope, data) {
|
47
|
+
var files = data.files,
|
48
|
+
file = files[0];
|
49
|
+
angular.forEach(files, function (file, index) {
|
50
|
+
file._index = index;
|
51
|
+
file.$state = function () {
|
52
|
+
return data.state();
|
53
|
+
};
|
54
|
+
file.$processing = function () {
|
55
|
+
return data.processing();
|
56
|
+
};
|
57
|
+
file.$progress = function () {
|
58
|
+
return data.progress();
|
59
|
+
};
|
60
|
+
file.$response = function () {
|
61
|
+
return data.response();
|
62
|
+
};
|
63
|
+
});
|
64
|
+
file.$submit = function () {
|
65
|
+
if (!file.error) {
|
66
|
+
return data.submit();
|
67
|
+
}
|
68
|
+
};
|
69
|
+
file.$cancel = function () {
|
70
|
+
return data.abort();
|
71
|
+
};
|
72
|
+
},
|
73
|
+
$config;
|
74
|
+
$config = this.defaults = {
|
75
|
+
handleResponse: function (e, data) {
|
76
|
+
var files = data.result && data.result.files;
|
77
|
+
if (files) {
|
78
|
+
data.scope.replace(data.files, files);
|
79
|
+
} else if (data.errorThrown ||
|
80
|
+
data.textStatus === 'error') {
|
81
|
+
data.files[0].error = data.errorThrown ||
|
82
|
+
data.textStatus;
|
83
|
+
}
|
84
|
+
},
|
85
|
+
add: function (e, data) {
|
86
|
+
if (e.isDefaultPrevented()) {
|
87
|
+
return false;
|
88
|
+
}
|
89
|
+
var scope = data.scope,
|
90
|
+
filesCopy = [];
|
91
|
+
angular.forEach(data.files, function (file) {
|
92
|
+
filesCopy.push(file);
|
93
|
+
});
|
94
|
+
scope.$apply(function () {
|
95
|
+
addFileMethods(scope, data);
|
96
|
+
var method = scope.option('prependFiles') ?
|
97
|
+
'unshift' : 'push';
|
98
|
+
Array.prototype[method].apply(scope.queue, data.files);
|
99
|
+
});
|
100
|
+
data.process(function () {
|
101
|
+
return scope.process(data);
|
102
|
+
}).always(function () {
|
103
|
+
scope.$apply(function () {
|
104
|
+
addFileMethods(scope, data);
|
105
|
+
scope.replace(filesCopy, data.files);
|
106
|
+
});
|
107
|
+
}).then(function () {
|
108
|
+
if ((scope.option('autoUpload') ||
|
109
|
+
data.autoUpload) &&
|
110
|
+
data.autoUpload !== false) {
|
111
|
+
data.submit();
|
112
|
+
}
|
113
|
+
});
|
114
|
+
},
|
115
|
+
progress: function (e, data) {
|
116
|
+
if (e.isDefaultPrevented()) {
|
117
|
+
return false;
|
118
|
+
}
|
119
|
+
data.scope.$apply();
|
120
|
+
},
|
121
|
+
done: function (e, data) {
|
122
|
+
if (e.isDefaultPrevented()) {
|
123
|
+
return false;
|
124
|
+
}
|
125
|
+
var that = this;
|
126
|
+
data.scope.$apply(function () {
|
127
|
+
data.handleResponse.call(that, e, data);
|
128
|
+
});
|
129
|
+
},
|
130
|
+
fail: function (e, data) {
|
131
|
+
if (e.isDefaultPrevented()) {
|
132
|
+
return false;
|
133
|
+
}
|
134
|
+
var that = this,
|
135
|
+
scope = data.scope;
|
136
|
+
if (data.errorThrown === 'abort') {
|
137
|
+
scope.clear(data.files);
|
138
|
+
return;
|
139
|
+
}
|
140
|
+
scope.$apply(function () {
|
141
|
+
data.handleResponse.call(that, e, data);
|
142
|
+
});
|
143
|
+
},
|
144
|
+
stop: scopeEvalAsync,
|
145
|
+
processstart: scopeEvalAsync,
|
146
|
+
processstop: scopeEvalAsync,
|
147
|
+
getNumberOfFiles: function () {
|
148
|
+
var scope = this.scope;
|
149
|
+
return scope.queue.length - scope.processing();
|
150
|
+
},
|
151
|
+
dataType: 'json',
|
152
|
+
autoUpload: false
|
153
|
+
};
|
154
|
+
this.$get = [
|
155
|
+
function () {
|
156
|
+
return {
|
157
|
+
defaults: $config
|
158
|
+
};
|
159
|
+
}
|
160
|
+
];
|
161
|
+
})
|
162
|
+
|
163
|
+
// Format byte numbers to readable presentations:
|
164
|
+
.provider('formatFileSizeFilter', function () {
|
165
|
+
var $config = {
|
166
|
+
// Byte units following the IEC format
|
167
|
+
// http://en.wikipedia.org/wiki/Kilobyte
|
168
|
+
units: [
|
169
|
+
{size: 1000000000, suffix: ' GB'},
|
170
|
+
{size: 1000000, suffix: ' MB'},
|
171
|
+
{size: 1000, suffix: ' KB'}
|
172
|
+
]
|
173
|
+
};
|
174
|
+
this.defaults = $config;
|
175
|
+
this.$get = function () {
|
176
|
+
return function (bytes) {
|
177
|
+
if (!angular.isNumber(bytes)) {
|
178
|
+
return '';
|
179
|
+
}
|
180
|
+
var unit = true,
|
181
|
+
i = 0,
|
182
|
+
prefix,
|
183
|
+
suffix;
|
184
|
+
while (unit) {
|
185
|
+
unit = $config.units[i];
|
186
|
+
prefix = unit.prefix || '';
|
187
|
+
suffix = unit.suffix || '';
|
188
|
+
if (i === $config.units.length - 1 || bytes >= unit.size) {
|
189
|
+
return prefix + (bytes / unit.size).toFixed(2) + suffix;
|
190
|
+
}
|
191
|
+
i += 1;
|
192
|
+
}
|
193
|
+
};
|
194
|
+
};
|
195
|
+
})
|
196
|
+
|
197
|
+
// The FileUploadController initializes the fileupload widget and
|
198
|
+
// provides scope methods to control the File Upload functionality:
|
199
|
+
.controller('FileUploadController', [
|
200
|
+
'$scope', '$element', '$attrs', '$window', 'fileUpload',
|
201
|
+
function ($scope, $element, $attrs, $window, fileUpload) {
|
202
|
+
var uploadMethods = {
|
203
|
+
progress: function () {
|
204
|
+
return $element.fileupload('progress');
|
205
|
+
},
|
206
|
+
active: function () {
|
207
|
+
return $element.fileupload('active');
|
208
|
+
},
|
209
|
+
option: function (option, data) {
|
210
|
+
if (arguments.length === 1) {
|
211
|
+
return $element.fileupload('option', option);
|
212
|
+
}
|
213
|
+
$element.fileupload('option', option, data);
|
214
|
+
},
|
215
|
+
add: function (data) {
|
216
|
+
return $element.fileupload('add', data);
|
217
|
+
},
|
218
|
+
send: function (data) {
|
219
|
+
return $element.fileupload('send', data);
|
220
|
+
},
|
221
|
+
process: function (data) {
|
222
|
+
return $element.fileupload('process', data);
|
223
|
+
},
|
224
|
+
processing: function (data) {
|
225
|
+
return $element.fileupload('processing', data);
|
226
|
+
}
|
227
|
+
};
|
228
|
+
$scope.disabled = !$window.jQuery.support.fileInput;
|
229
|
+
$scope.queue = $scope.queue || [];
|
230
|
+
$scope.clear = function (files) {
|
231
|
+
var queue = this.queue,
|
232
|
+
i = queue.length,
|
233
|
+
file = files,
|
234
|
+
length = 1;
|
235
|
+
if (angular.isArray(files)) {
|
236
|
+
file = files[0];
|
237
|
+
length = files.length;
|
238
|
+
}
|
239
|
+
while (i) {
|
240
|
+
i -= 1;
|
241
|
+
if (queue[i] === file) {
|
242
|
+
return queue.splice(i, length);
|
243
|
+
}
|
244
|
+
}
|
245
|
+
};
|
246
|
+
$scope.replace = function (oldFiles, newFiles) {
|
247
|
+
var queue = this.queue,
|
248
|
+
file = oldFiles[0],
|
249
|
+
i,
|
250
|
+
j;
|
251
|
+
for (i = 0; i < queue.length; i += 1) {
|
252
|
+
if (queue[i] === file) {
|
253
|
+
for (j = 0; j < newFiles.length; j += 1) {
|
254
|
+
queue[i + j] = newFiles[j];
|
255
|
+
}
|
256
|
+
return;
|
257
|
+
}
|
258
|
+
}
|
259
|
+
};
|
260
|
+
$scope.applyOnQueue = function (method) {
|
261
|
+
var list = this.queue.slice(0),
|
262
|
+
i,
|
263
|
+
file;
|
264
|
+
for (i = 0; i < list.length; i += 1) {
|
265
|
+
file = list[i];
|
266
|
+
if (file[method]) {
|
267
|
+
file[method]();
|
268
|
+
}
|
269
|
+
}
|
270
|
+
};
|
271
|
+
$scope.submit = function () {
|
272
|
+
this.applyOnQueue('$submit');
|
273
|
+
};
|
274
|
+
$scope.cancel = function () {
|
275
|
+
this.applyOnQueue('$cancel');
|
276
|
+
};
|
277
|
+
// Add upload methods to the scope:
|
278
|
+
angular.extend($scope, uploadMethods);
|
279
|
+
// The fileupload widget will initialize with
|
280
|
+
// the options provided via "data-"-parameters,
|
281
|
+
// as well as those given via options object:
|
282
|
+
$element.fileupload(angular.extend(
|
283
|
+
{scope: $scope},
|
284
|
+
fileUpload.defaults
|
285
|
+
)).on('fileuploadadd', function (e, data) {
|
286
|
+
data.scope = $scope;
|
287
|
+
}).on('fileuploadfail', function (e, data) {
|
288
|
+
if (data.errorThrown === 'abort') {
|
289
|
+
return;
|
290
|
+
}
|
291
|
+
if (data.dataType &&
|
292
|
+
data.dataType.indexOf('json') === data.dataType.length - 4) {
|
293
|
+
try {
|
294
|
+
data.result = angular.fromJson(data.jqXHR.responseText);
|
295
|
+
} catch (ignore) {}
|
296
|
+
}
|
297
|
+
}).on([
|
298
|
+
'fileuploadadd',
|
299
|
+
'fileuploadsubmit',
|
300
|
+
'fileuploadsend',
|
301
|
+
'fileuploaddone',
|
302
|
+
'fileuploadfail',
|
303
|
+
'fileuploadalways',
|
304
|
+
'fileuploadprogress',
|
305
|
+
'fileuploadprogressall',
|
306
|
+
'fileuploadstart',
|
307
|
+
'fileuploadstop',
|
308
|
+
'fileuploadchange',
|
309
|
+
'fileuploadpaste',
|
310
|
+
'fileuploaddrop',
|
311
|
+
'fileuploaddragover',
|
312
|
+
'fileuploadchunksend',
|
313
|
+
'fileuploadchunkdone',
|
314
|
+
'fileuploadchunkfail',
|
315
|
+
'fileuploadchunkalways',
|
316
|
+
'fileuploadprocessstart',
|
317
|
+
'fileuploadprocess',
|
318
|
+
'fileuploadprocessdone',
|
319
|
+
'fileuploadprocessfail',
|
320
|
+
'fileuploadprocessalways',
|
321
|
+
'fileuploadprocessstop'
|
322
|
+
].join(' '), function (e, data) {
|
323
|
+
if ($scope.$emit(e.type, data).defaultPrevented) {
|
324
|
+
e.preventDefault();
|
325
|
+
}
|
326
|
+
}).on('remove', function () {
|
327
|
+
// Remove upload methods from the scope,
|
328
|
+
// when the widget is removed:
|
329
|
+
var method;
|
330
|
+
for (method in uploadMethods) {
|
331
|
+
if (uploadMethods.hasOwnProperty(method)) {
|
332
|
+
delete $scope[method];
|
333
|
+
}
|
334
|
+
}
|
335
|
+
});
|
336
|
+
// Observe option changes:
|
337
|
+
$scope.$watch(
|
338
|
+
$attrs.fileUpload,
|
339
|
+
function (newOptions) {
|
340
|
+
if (newOptions) {
|
341
|
+
$element.fileupload('option', newOptions);
|
342
|
+
}
|
343
|
+
}
|
344
|
+
);
|
345
|
+
}
|
346
|
+
])
|
347
|
+
|
348
|
+
// Provide File Upload progress feedback:
|
349
|
+
.controller('FileUploadProgressController', [
|
350
|
+
'$scope', '$attrs', '$parse',
|
351
|
+
function ($scope, $attrs, $parse) {
|
352
|
+
var fn = $parse($attrs.fileUploadProgress),
|
353
|
+
update = function () {
|
354
|
+
var progress = fn($scope);
|
355
|
+
if (!progress || !progress.total) {
|
356
|
+
return;
|
357
|
+
}
|
358
|
+
$scope.num = Math.floor(
|
359
|
+
progress.loaded / progress.total * 100
|
360
|
+
);
|
361
|
+
};
|
362
|
+
update();
|
363
|
+
$scope.$watch(
|
364
|
+
$attrs.fileUploadProgress + '.loaded',
|
365
|
+
function (newValue, oldValue) {
|
366
|
+
if (newValue !== oldValue) {
|
367
|
+
update();
|
368
|
+
}
|
369
|
+
}
|
370
|
+
);
|
371
|
+
}
|
372
|
+
])
|
373
|
+
|
374
|
+
// Display File Upload previews:
|
375
|
+
.controller('FileUploadPreviewController', [
|
376
|
+
'$scope', '$element', '$attrs',
|
377
|
+
function ($scope, $element, $attrs) {
|
378
|
+
$scope.$watch(
|
379
|
+
$attrs.fileUploadPreview + '.preview',
|
380
|
+
function (preview) {
|
381
|
+
$element.empty();
|
382
|
+
if (preview) {
|
383
|
+
$element.append(preview);
|
384
|
+
}
|
385
|
+
}
|
386
|
+
);
|
387
|
+
}
|
388
|
+
])
|
389
|
+
|
390
|
+
.directive('fileUpload', function () {
|
391
|
+
return {
|
392
|
+
controller: 'FileUploadController',
|
393
|
+
scope: true
|
394
|
+
};
|
395
|
+
})
|
396
|
+
|
397
|
+
.directive('fileUploadProgress', function () {
|
398
|
+
return {
|
399
|
+
controller: 'FileUploadProgressController',
|
400
|
+
scope: true
|
401
|
+
};
|
402
|
+
})
|
403
|
+
|
404
|
+
.directive('fileUploadPreview', function () {
|
405
|
+
return {
|
406
|
+
controller: 'FileUploadPreviewController'
|
407
|
+
};
|
408
|
+
})
|
409
|
+
|
410
|
+
// Enhance the HTML5 download attribute to
|
411
|
+
// allow drag&drop of files to the desktop:
|
412
|
+
.directive('download', function () {
|
413
|
+
return function (scope, elm) {
|
414
|
+
elm.on('dragstart', function (e) {
|
415
|
+
try {
|
416
|
+
e.originalEvent.dataTransfer.setData(
|
417
|
+
'DownloadURL',
|
418
|
+
[
|
419
|
+
'application/octet-stream',
|
420
|
+
elm.prop('download'),
|
421
|
+
elm.prop('href')
|
422
|
+
].join(':')
|
423
|
+
);
|
424
|
+
} catch (ignore) {}
|
425
|
+
});
|
426
|
+
};
|
427
|
+
});
|
428
|
+
|
429
|
+
}));
|