s3_cors_fileupload 0.2.0 → 0.2.1
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 +4 -4
- data/CHANGELOG.md +12 -2
- data/Gemfile +1 -1
- data/Gemfile.lock +19 -19
- data/README.md +13 -1
- data/lib/generators/s3_cors_fileupload/install/templates/s3_uploads.js +1 -2
- data/lib/generators/s3_cors_fileupload/install/templates/source_file.rb +1 -1
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/_template_download.html.erb +19 -16
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/_template_upload.html.erb +31 -26
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/_template_uploaded.html.erb +18 -13
- data/lib/generators/s3_cors_fileupload/install/templates/views/erb/index.html.erb +1 -1
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/_template_download.html.haml +16 -21
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/_template_upload.html.haml +15 -18
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/_template_uploaded.html.haml +12 -13
- data/lib/generators/s3_cors_fileupload/install/templates/views/haml/index.html.haml +1 -1
- data/lib/s3_cors_fileupload/rails/form_helper.rb +16 -14
- data/lib/s3_cors_fileupload/version.rb +3 -3
- data/vendor/assets/javascripts/s3_cors_fileupload/index.js +4 -1
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-image.js +213 -0
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-process.js +164 -0
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-ui.js +62 -228
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload-validate.js +116 -0
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.fileupload.js +212 -84
- data/vendor/assets/javascripts/s3_cors_fileupload/jquery.iframe-transport.js +24 -4
- data/vendor/assets/javascripts/s3_cors_fileupload/vendor/jquery.ui.widget.js +1 -1
- data/vendor/assets/javascripts/s3_cors_fileupload/vendor/load-image.js +138 -172
- data/vendor/assets/javascripts/s3_cors_fileupload/vendor/tmpl.js +3 -4
- data/vendor/assets/stylesheets/jquery.fileupload-ui.css.erb +12 -28
- metadata +5 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery Iframe Transport Plugin 1.
|
2
|
+
* jQuery Iframe Transport Plugin 1.7
|
3
3
|
* https://github.com/blueimp/jQuery-File-Upload
|
4
4
|
*
|
5
5
|
* Copyright 2011, Sebastian Tschan
|
@@ -61,9 +61,10 @@
|
|
61
61
|
// IE versions below IE8 cannot set the name property of
|
62
62
|
// elements that have already been added to the DOM,
|
63
63
|
// so we set the name along with the iframe HTML markup:
|
64
|
+
counter += 1;
|
64
65
|
iframe = $(
|
65
66
|
'<iframe src="javascript:false;" name="iframe-transport-' +
|
66
|
-
|
67
|
+
counter + '"></iframe>'
|
67
68
|
).bind('load', function () {
|
68
69
|
var fileInputClones,
|
69
70
|
paramNames = $.isArray(options.paramName) ?
|
@@ -96,7 +97,12 @@
|
|
96
97
|
// (happens on form submits to iframe targets):
|
97
98
|
$('<iframe src="javascript:false;"></iframe>')
|
98
99
|
.appendTo(form);
|
99
|
-
|
100
|
+
window.setTimeout(function () {
|
101
|
+
// Removing the form in a setTimeout call
|
102
|
+
// allows Chrome's developer tools to display
|
103
|
+
// the response result
|
104
|
+
form.remove();
|
105
|
+
}, 0);
|
100
106
|
});
|
101
107
|
form
|
102
108
|
.prop('target', iframe.prop('name'))
|
@@ -164,7 +170,15 @@
|
|
164
170
|
});
|
165
171
|
|
166
172
|
// The iframe transport returns the iframe content document as response.
|
167
|
-
// The following adds converters from iframe to text, json, html,
|
173
|
+
// The following adds converters from iframe to text, json, html, xml
|
174
|
+
// and script.
|
175
|
+
// Please note that the Content-Type for JSON responses has to be text/plain
|
176
|
+
// or text/html, if the browser doesn't include application/json in the
|
177
|
+
// Accept header, else IE will show a download dialog.
|
178
|
+
// The Content-Type for XML responses on the other hand has to be always
|
179
|
+
// application/xml or text/xml, so IE properly parses the XML response.
|
180
|
+
// See also
|
181
|
+
// https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
|
168
182
|
$.ajaxSetup({
|
169
183
|
converters: {
|
170
184
|
'iframe text': function (iframe) {
|
@@ -176,6 +190,12 @@
|
|
176
190
|
'iframe html': function (iframe) {
|
177
191
|
return iframe && $(iframe[0].body).html();
|
178
192
|
},
|
193
|
+
'iframe xml': function (iframe) {
|
194
|
+
var xmlDoc = iframe && iframe[0];
|
195
|
+
return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
|
196
|
+
$.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
|
197
|
+
$(xmlDoc.body).html());
|
198
|
+
},
|
179
199
|
'iframe script': function (iframe) {
|
180
200
|
return iframe && $.globalEval($(iframe[0].body).text());
|
181
201
|
}
|
@@ -1,19 +1,16 @@
|
|
1
1
|
/*
|
2
|
-
* JavaScript Load Image 1.
|
2
|
+
* JavaScript Load Image 1.9.0
|
3
3
|
* https://github.com/blueimp/JavaScript-Load-Image
|
4
4
|
*
|
5
5
|
* Copyright 2011, Sebastian Tschan
|
6
6
|
* https://blueimp.net
|
7
7
|
*
|
8
|
-
* iOS image scaling fixes based on
|
9
|
-
* https://github.com/stomita/ios-imagefile-megapixel
|
10
|
-
*
|
11
8
|
* Licensed under the MIT license:
|
12
9
|
* http://www.opensource.org/licenses/MIT
|
13
10
|
*/
|
14
11
|
|
15
|
-
/*jslint nomen: true
|
16
|
-
/*global window, document, URL, webkitURL, Blob, File, FileReader
|
12
|
+
/*jslint nomen: true */
|
13
|
+
/*global define, window, document, URL, webkitURL, Blob, File, FileReader */
|
17
14
|
|
18
15
|
(function ($) {
|
19
16
|
'use strict';
|
@@ -75,54 +72,21 @@
|
|
75
72
|
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
|
76
73
|
};
|
77
74
|
|
78
|
-
//
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
canvas = document.createElement('canvas');
|
84
|
-
canvas.width = canvas.height = 1;
|
85
|
-
context = canvas.getContext('2d');
|
86
|
-
context.drawImage(img, -img.width + 1, 0);
|
87
|
-
// subsampled image becomes half smaller in rendering size.
|
88
|
-
// check alpha channel value to confirm image is covering edge pixel or not.
|
89
|
-
// if alpha value is 0 image is not covering, hence subsampled.
|
90
|
-
return context.getImageData(0, 0, 1, 1).data[3] === 0;
|
91
|
-
}
|
92
|
-
return false;
|
75
|
+
// Transform image coordinates, allows to override e.g.
|
76
|
+
// the canvas orientation based on the orientation option,
|
77
|
+
// gets canvas, options passed as arguments:
|
78
|
+
loadImage.transformCoordinates = function () {
|
79
|
+
return;
|
93
80
|
};
|
94
81
|
|
95
|
-
//
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
data,
|
100
|
-
sy,
|
101
|
-
ey,
|
102
|
-
py,
|
103
|
-
alpha;
|
104
|
-
canvas.width = 1;
|
105
|
-
canvas.height = correctedHeight;
|
106
|
-
context.drawImage(img, 0, 0);
|
107
|
-
data = context.getImageData(0, 0, 1, correctedHeight).data;
|
108
|
-
// search image edge pixel position in case it is squashed vertically:
|
109
|
-
sy = 0;
|
110
|
-
ey = correctedHeight;
|
111
|
-
py = correctedHeight;
|
112
|
-
while (py > sy) {
|
113
|
-
alpha = data[(py - 1) * 4 + 3];
|
114
|
-
if (alpha === 0) {
|
115
|
-
ey = py;
|
116
|
-
} else {
|
117
|
-
sy = py;
|
118
|
-
}
|
119
|
-
py = (ey + sy) >> 1;
|
120
|
-
}
|
121
|
-
return (py / correctedHeight) || 1;
|
82
|
+
// Returns transformed options, allows to override e.g.
|
83
|
+
// coordinate and dimension options based on the orientation:
|
84
|
+
loadImage.getTransformedOptions = function (options) {
|
85
|
+
return options;
|
122
86
|
};
|
123
87
|
|
124
|
-
//
|
125
|
-
//
|
88
|
+
// Canvas render method, allows to override the
|
89
|
+
// rendering e.g. to work around issues on iOS:
|
126
90
|
loadImage.renderImageToCanvas = function (
|
127
91
|
canvas,
|
128
92
|
img,
|
@@ -135,144 +99,143 @@
|
|
135
99
|
destWidth,
|
136
100
|
destHeight
|
137
101
|
) {
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
sourceHeight /= 2;
|
149
|
-
}
|
150
|
-
vertSquashRatio = loadImage.detectVerticalSquash(img, sourceHeight);
|
151
|
-
destWidth = Math.ceil(tileSize * destWidth / sourceWidth);
|
152
|
-
destHeight = Math.ceil(
|
153
|
-
tileSize * destHeight / sourceHeight / vertSquashRatio
|
102
|
+
canvas.getContext('2d').drawImage(
|
103
|
+
img,
|
104
|
+
sourceX,
|
105
|
+
sourceY,
|
106
|
+
sourceWidth,
|
107
|
+
sourceHeight,
|
108
|
+
destX,
|
109
|
+
destY,
|
110
|
+
destWidth,
|
111
|
+
destHeight
|
154
112
|
);
|
155
|
-
|
156
|
-
tileY = 0;
|
157
|
-
while (tileY < sourceHeight) {
|
158
|
-
destX = 0;
|
159
|
-
tileX = 0;
|
160
|
-
while (tileX < sourceWidth) {
|
161
|
-
tmpContext.clearRect(0, 0, tileSize, tileSize);
|
162
|
-
tmpContext.drawImage(
|
163
|
-
img,
|
164
|
-
sourceX,
|
165
|
-
sourceY,
|
166
|
-
sourceWidth,
|
167
|
-
sourceHeight,
|
168
|
-
-tileX,
|
169
|
-
-tileY,
|
170
|
-
sourceWidth,
|
171
|
-
sourceHeight
|
172
|
-
);
|
173
|
-
context.drawImage(
|
174
|
-
tmpCanvas,
|
175
|
-
0,
|
176
|
-
0,
|
177
|
-
tileSize,
|
178
|
-
tileSize,
|
179
|
-
destX,
|
180
|
-
destY,
|
181
|
-
destWidth,
|
182
|
-
destHeight
|
183
|
-
);
|
184
|
-
tileX += tileSize;
|
185
|
-
destX += destWidth;
|
186
|
-
}
|
187
|
-
tileY += tileSize;
|
188
|
-
destY += destHeight;
|
189
|
-
}
|
190
|
-
context.restore();
|
113
|
+
return canvas;
|
191
114
|
};
|
192
115
|
|
193
|
-
//
|
116
|
+
// This method is used to determine if the target image
|
117
|
+
// should be a canvas element:
|
118
|
+
loadImage.hasCanvasOption = function (options) {
|
119
|
+
return options.canvas || options.crop;
|
120
|
+
};
|
121
|
+
|
122
|
+
// Scales and/or crops the given image (img or canvas HTML element)
|
194
123
|
// using the given options.
|
195
124
|
// Returns a canvas object if the browser supports canvas
|
196
|
-
// and the
|
197
|
-
// is passed as image, else the scaled image:
|
125
|
+
// and the hasCanvasOption method returns true or a canvas
|
126
|
+
// object is passed as image, else the scaled image:
|
198
127
|
loadImage.scale = function (img, options) {
|
199
128
|
options = options || {};
|
200
129
|
var canvas = document.createElement('canvas'),
|
201
130
|
useCanvas = img.getContext ||
|
202
|
-
((options
|
203
|
-
width = img.width,
|
204
|
-
height = img.height,
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
131
|
+
(loadImage.hasCanvasOption(options) && canvas.getContext),
|
132
|
+
width = img.naturalWidth || img.width,
|
133
|
+
height = img.naturalHeight || img.height,
|
134
|
+
destWidth = width,
|
135
|
+
destHeight = height,
|
136
|
+
maxWidth,
|
137
|
+
maxHeight,
|
138
|
+
minWidth,
|
139
|
+
minHeight,
|
140
|
+
sourceWidth,
|
141
|
+
sourceHeight,
|
142
|
+
sourceX,
|
143
|
+
sourceY,
|
144
|
+
tmp,
|
145
|
+
scaleUp = function () {
|
146
|
+
var scale = Math.max(
|
147
|
+
(minWidth || destWidth) / destWidth,
|
148
|
+
(minHeight || destHeight) / destHeight
|
149
|
+
);
|
150
|
+
if (scale > 1) {
|
151
|
+
destWidth = Math.ceil(destWidth * scale);
|
152
|
+
destHeight = Math.ceil(destHeight * scale);
|
153
|
+
}
|
154
|
+
},
|
155
|
+
scaleDown = function () {
|
156
|
+
var scale = Math.min(
|
157
|
+
(maxWidth || destWidth) / destWidth,
|
158
|
+
(maxHeight || destHeight) / destHeight
|
159
|
+
);
|
160
|
+
if (scale < 1) {
|
161
|
+
destWidth = Math.ceil(destWidth * scale);
|
162
|
+
destHeight = Math.ceil(destHeight * scale);
|
163
|
+
}
|
164
|
+
};
|
165
|
+
if (useCanvas) {
|
166
|
+
options = loadImage.getTransformedOptions(options);
|
167
|
+
sourceX = options.left || 0;
|
168
|
+
sourceY = options.top || 0;
|
169
|
+
if (options.sourceWidth) {
|
170
|
+
sourceWidth = options.sourceWidth;
|
171
|
+
if (options.right !== undefined && options.left === undefined) {
|
172
|
+
sourceX = width - sourceWidth - options.right;
|
173
|
+
}
|
174
|
+
} else {
|
175
|
+
sourceWidth = width - sourceX - (options.right || 0);
|
176
|
+
}
|
177
|
+
if (options.sourceHeight) {
|
178
|
+
sourceHeight = options.sourceHeight;
|
179
|
+
if (options.bottom !== undefined && options.top === undefined) {
|
180
|
+
sourceY = height - sourceHeight - options.bottom;
|
181
|
+
}
|
182
|
+
} else {
|
183
|
+
sourceHeight = height - sourceY - (options.bottom || 0);
|
184
|
+
}
|
185
|
+
destWidth = sourceWidth;
|
186
|
+
destHeight = sourceHeight;
|
187
|
+
}
|
188
|
+
maxWidth = options.maxWidth;
|
189
|
+
maxHeight = options.maxHeight;
|
190
|
+
minWidth = options.minWidth;
|
191
|
+
minHeight = options.minHeight;
|
216
192
|
if (useCanvas && maxWidth && maxHeight && options.crop) {
|
217
193
|
destWidth = maxWidth;
|
218
194
|
destHeight = maxHeight;
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
195
|
+
tmp = sourceWidth / sourceHeight - maxWidth / maxHeight;
|
196
|
+
if (tmp < 0) {
|
197
|
+
sourceHeight = maxHeight * sourceWidth / maxWidth;
|
198
|
+
if (options.top === undefined && options.bottom === undefined) {
|
199
|
+
sourceY = (height - sourceHeight) / 2;
|
200
|
+
}
|
201
|
+
} else if (tmp > 0) {
|
202
|
+
sourceWidth = maxWidth * sourceHeight / maxHeight;
|
203
|
+
if (options.left === undefined && options.right === undefined) {
|
204
|
+
sourceX = (width - sourceWidth) / 2;
|
205
|
+
}
|
225
206
|
}
|
226
207
|
} else {
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
(options.minWidth || destWidth) / destWidth,
|
231
|
-
(options.minHeight || destHeight) / destHeight
|
232
|
-
);
|
233
|
-
if (scale > 1) {
|
234
|
-
destWidth = Math.ceil(destWidth * scale);
|
235
|
-
destHeight = Math.ceil(destHeight * scale);
|
208
|
+
if (options.contain || options.cover) {
|
209
|
+
minWidth = maxWidth = maxWidth || minWidth;
|
210
|
+
minHeight = maxHeight = maxHeight || minHeight;
|
236
211
|
}
|
237
|
-
|
238
|
-
(
|
239
|
-
(
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
destHeight = Math.ceil(destHeight * scale);
|
212
|
+
if (options.cover) {
|
213
|
+
scaleDown();
|
214
|
+
scaleUp();
|
215
|
+
} else {
|
216
|
+
scaleUp();
|
217
|
+
scaleDown();
|
244
218
|
}
|
245
219
|
}
|
246
220
|
if (useCanvas) {
|
247
221
|
canvas.width = destWidth;
|
248
222
|
canvas.height = destHeight;
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
sourceX,
|
266
|
-
sourceY,
|
267
|
-
sourceWidth,
|
268
|
-
sourceHeight,
|
269
|
-
destX,
|
270
|
-
destY,
|
271
|
-
destWidth,
|
272
|
-
destHeight
|
273
|
-
);
|
274
|
-
}
|
275
|
-
return canvas;
|
223
|
+
loadImage.transformCoordinates(
|
224
|
+
canvas,
|
225
|
+
options
|
226
|
+
);
|
227
|
+
return loadImage.renderImageToCanvas(
|
228
|
+
canvas,
|
229
|
+
img,
|
230
|
+
sourceX,
|
231
|
+
sourceY,
|
232
|
+
sourceWidth,
|
233
|
+
sourceHeight,
|
234
|
+
0,
|
235
|
+
0,
|
236
|
+
destWidth,
|
237
|
+
destHeight
|
238
|
+
);
|
276
239
|
}
|
277
240
|
img.width = destWidth;
|
278
241
|
img.height = destHeight;
|
@@ -290,12 +253,15 @@
|
|
290
253
|
// Loads a given File object via FileReader interface,
|
291
254
|
// invokes the callback with the event object (load or error).
|
292
255
|
// The result can be read via event.target.result:
|
293
|
-
loadImage.readFile = function (file, callback) {
|
294
|
-
if (window.FileReader
|
256
|
+
loadImage.readFile = function (file, callback, method) {
|
257
|
+
if (window.FileReader) {
|
295
258
|
var fileReader = new FileReader();
|
296
259
|
fileReader.onload = fileReader.onerror = callback;
|
297
|
-
|
298
|
-
|
260
|
+
method = method || 'readAsDataURL';
|
261
|
+
if (fileReader[method]) {
|
262
|
+
fileReader[method](file);
|
263
|
+
return fileReader;
|
264
|
+
}
|
299
265
|
}
|
300
266
|
return false;
|
301
267
|
};
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* JavaScript Templates 2.
|
2
|
+
* JavaScript Templates 2.2.0
|
3
3
|
* https://github.com/blueimp/JavaScript-Templates
|
4
4
|
*
|
5
5
|
* Copyright 2011, Sebastian Tschan
|
@@ -15,7 +15,6 @@
|
|
15
15
|
/*jslint evil: true, regexp: true */
|
16
16
|
/*global document, define */
|
17
17
|
|
18
|
-
|
19
18
|
(function ($) {
|
20
19
|
"use strict";
|
21
20
|
var tmpl = function (str, data) {
|
@@ -49,7 +48,7 @@
|
|
49
48
|
if (p2 === "=") {
|
50
49
|
return "'+_e(" + p3 + ")+'";
|
51
50
|
}
|
52
|
-
return "'+
|
51
|
+
return "'+" + p3 + "+'";
|
53
52
|
}
|
54
53
|
if (p4) { // evaluation start tag: {%
|
55
54
|
return "';";
|
@@ -67,7 +66,7 @@
|
|
67
66
|
"'" : "'"
|
68
67
|
};
|
69
68
|
tmpl.encode = function (s) {
|
70
|
-
return String(s
|
69
|
+
return String(s).replace(
|
71
70
|
tmpl.encReg,
|
72
71
|
function (c) {
|
73
72
|
return tmpl.encMap[c] || "";
|