mirror of
https://github.com/wintercms/winter.git
synced 2024-06-28 05:33:29 +02:00
Update blueimp software to latest
This commit is contained in:
parent
df26e201df
commit
14c8bc9a49
@ -8820,6 +8820,7 @@ label {
|
||||
border-top: none !important;
|
||||
border-left: none !important;
|
||||
border-right: none !important;
|
||||
border-radius: 0;
|
||||
}
|
||||
.form-buttons {
|
||||
padding-bottom: 20px;
|
||||
|
@ -241,6 +241,7 @@ label {
|
||||
border-top: none !important;
|
||||
border-left: none !important;
|
||||
border-right: none !important;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.form-buttons {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* jQuery File Upload Plugin 5.28.5
|
||||
* jQuery File Upload Plugin 5.41.1
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2010, Sebastian Tschan
|
||||
@ -9,8 +9,8 @@
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/*jslint nomen: true, unparam: true, regexp: true */
|
||||
/*global define, window, document, File, Blob, FormData, location */
|
||||
/* jshint nomen:false */
|
||||
/* global define, window, document, location, Blob, FormData */
|
||||
|
||||
(function (factory) {
|
||||
'use strict';
|
||||
@ -27,12 +27,49 @@
|
||||
}(function ($) {
|
||||
'use strict';
|
||||
|
||||
// Detect file input support, based on
|
||||
// http://viljamis.com/blog/2012/file-upload-support-on-mobile/
|
||||
$.support.fileInput = !(new RegExp(
|
||||
// Handle devices which give false positives for the feature detection:
|
||||
'(Android (1\\.[0156]|2\\.[01]))' +
|
||||
'|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +
|
||||
'|(w(eb)?OSBrowser)|(webOS)' +
|
||||
'|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
|
||||
).test(window.navigator.userAgent) ||
|
||||
// Feature detection for all other devices:
|
||||
$('<input type="file">').prop('disabled'));
|
||||
|
||||
// The FileReader API is not actually used, but works as feature detection,
|
||||
// as e.g. Safari supports XHR file uploads via the FormData API,
|
||||
// but not non-multipart XHR file uploads:
|
||||
$.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader);
|
||||
// as some Safari versions (5?) support XHR file uploads via the FormData API,
|
||||
// but not non-multipart XHR file uploads.
|
||||
// window.XMLHttpRequestUpload is not available on IE10, so we check for
|
||||
// window.ProgressEvent instead to detect XHR2 file upload capability:
|
||||
$.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);
|
||||
$.support.xhrFormDataFileUpload = !!window.FormData;
|
||||
|
||||
// Detect support for Blob slicing (required for chunked uploads):
|
||||
$.support.blobSlice = window.Blob && (Blob.prototype.slice ||
|
||||
Blob.prototype.webkitSlice || Blob.prototype.mozSlice);
|
||||
|
||||
// Helper function to create drag handlers for dragover/dragenter/dragleave:
|
||||
function getDragHandler(type) {
|
||||
var isDragOver = type === 'dragover';
|
||||
return function (e) {
|
||||
e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
|
||||
var dataTransfer = e.dataTransfer;
|
||||
if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&
|
||||
this._trigger(
|
||||
type,
|
||||
$.Event(type, {delegatedEvent: e})
|
||||
) !== false) {
|
||||
e.preventDefault();
|
||||
if (isDragOver) {
|
||||
dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// The fileupload widget listens for change events on file input fields defined
|
||||
// via fileInput setting and paste or drop events of the given dropZone.
|
||||
// In addition to the default jQuery Widget methods, the fileupload widget
|
||||
@ -72,6 +109,14 @@
|
||||
// To limit the number of files uploaded with one XHR request,
|
||||
// set the following option to an integer greater than 0:
|
||||
limitMultiFileUploads: undefined,
|
||||
// The following option limits the number of files uploaded with one
|
||||
// XHR request to keep the request size under or equal to the defined
|
||||
// limit in bytes:
|
||||
limitMultiFileUploadSize: undefined,
|
||||
// Multipart file uploads add a number of bytes to each uploaded file,
|
||||
// therefore the following option adds an overhead for each file used
|
||||
// in the limitMultiFileUploadSize configuration:
|
||||
limitMultiFileUploadSizeOverhead: 512,
|
||||
// Set the following option to true to issue all file upload requests
|
||||
// in a sequential order:
|
||||
sequentialUploads: false,
|
||||
@ -115,6 +160,23 @@
|
||||
// By default, uploads are started automatically when adding files:
|
||||
autoUpload: true,
|
||||
|
||||
// Error and info messages:
|
||||
messages: {
|
||||
uploadedBytes: 'Uploaded bytes exceed file size'
|
||||
},
|
||||
|
||||
// Translation function, gets the message key to be translated
|
||||
// and an object with context specific data as arguments:
|
||||
i18n: function (message, context) {
|
||||
message = this.messages[message] || message.toString();
|
||||
if (context) {
|
||||
$.each(context, function (key, value) {
|
||||
message = message.replace('{' + key + '}', value);
|
||||
});
|
||||
}
|
||||
return message;
|
||||
},
|
||||
|
||||
// Additional form data to be sent along with the file uploads can be set
|
||||
// using this option, which accepts an array of objects with name and
|
||||
// value properties, a function returning such an array, a FormData
|
||||
@ -127,21 +189,28 @@
|
||||
// The add callback is invoked as soon as files are added to the fileupload
|
||||
// widget (via file input selection, drag & drop, paste or add API call).
|
||||
// If the singleFileUploads option is enabled, this callback will be
|
||||
// called once for each file in the selection for XHR file uplaods, else
|
||||
// called once for each file in the selection for XHR file uploads, else
|
||||
// once for each file selection.
|
||||
//
|
||||
// The upload starts when the submit method is invoked on the data parameter.
|
||||
// The data object contains a files property holding the added files
|
||||
// and allows to override plugin options as well as define ajax settings.
|
||||
// and allows you to override plugin options as well as define ajax settings.
|
||||
//
|
||||
// Listeners for this callback can also be bound the following way:
|
||||
// .bind('fileuploadadd', func);
|
||||
//
|
||||
// data.submit() returns a Promise object and allows to attach additional
|
||||
// handlers using jQuery's Deferred callbacks:
|
||||
// data.submit().done(func).fail(func).always(func);
|
||||
add: function (e, data) {
|
||||
if (e.isDefaultPrevented()) {
|
||||
return false;
|
||||
}
|
||||
if (data.autoUpload || (data.autoUpload !== false &&
|
||||
($(this).data('blueimp-fileupload') ||
|
||||
$(this).data('fileupload')).options.autoUpload)) {
|
||||
data.submit();
|
||||
$(this).fileupload('option', 'autoUpload'))) {
|
||||
data.process().done(function () {
|
||||
data.submit();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
@ -205,8 +274,9 @@
|
||||
cache: false
|
||||
},
|
||||
|
||||
// A list of options that require a refresh after assigning a new value:
|
||||
_refreshOptionsList: [
|
||||
// A list of options that require reinitializing event listeners and/or
|
||||
// special initialization code:
|
||||
_specialOptions: [
|
||||
'fileInput',
|
||||
'dropZone',
|
||||
'pasteZone',
|
||||
@ -214,6 +284,11 @@
|
||||
'forceIframeTransport'
|
||||
],
|
||||
|
||||
_blobSlice: $.support.blobSlice && function () {
|
||||
var slice = this.slice || this.webkitSlice || this.mozSlice;
|
||||
return slice.apply(this, arguments);
|
||||
},
|
||||
|
||||
_BitrateTimer: function () {
|
||||
this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
|
||||
this.loaded = 0;
|
||||
@ -237,7 +312,7 @@
|
||||
|
||||
_getFormData: function (options) {
|
||||
var formData;
|
||||
if (typeof options.formData === 'function') {
|
||||
if ($.type(options.formData) === 'function') {
|
||||
return options.formData(options.form);
|
||||
}
|
||||
if ($.isArray(options.formData)) {
|
||||
@ -317,10 +392,18 @@
|
||||
// Trigger a custom progress event with a total data property set
|
||||
// to the file size(s) of the current upload and a loaded data
|
||||
// property calculated accordingly:
|
||||
this._trigger('progress', e, data);
|
||||
this._trigger(
|
||||
'progress',
|
||||
$.Event('progress', {delegatedEvent: e}),
|
||||
data
|
||||
);
|
||||
// Trigger a global progress event for all current file uploads,
|
||||
// including ajax calls queued for sequential file uploads:
|
||||
this._trigger('progressall', e, this._progress);
|
||||
this._trigger(
|
||||
'progressall',
|
||||
$.Event('progressall', {delegatedEvent: e}),
|
||||
this._progress
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
@ -344,20 +427,29 @@
|
||||
}
|
||||
},
|
||||
|
||||
_isInstanceOf: function (type, obj) {
|
||||
// Cross-frame instanceof check
|
||||
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
|
||||
},
|
||||
|
||||
_initXHRData: function (options) {
|
||||
var formData,
|
||||
var that = this,
|
||||
formData,
|
||||
file = options.files[0],
|
||||
// Ignore non-multipart setting if not supported:
|
||||
multipart = options.multipart || !$.support.xhrFileUpload,
|
||||
paramName = options.paramName[0];
|
||||
options.headers = options.headers || {};
|
||||
paramName = $.type(options.paramName) === 'array' ?
|
||||
options.paramName[0] : options.paramName;
|
||||
options.headers = $.extend({}, options.headers);
|
||||
if (options.contentRange) {
|
||||
options.headers['Content-Range'] = options.contentRange;
|
||||
}
|
||||
if (!multipart) {
|
||||
if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
|
||||
options.headers['Content-Disposition'] = 'attachment; filename="' +
|
||||
encodeURI(file.name) + '"';
|
||||
options.contentType = file.type;
|
||||
}
|
||||
if (!multipart) {
|
||||
options.contentType = file.type || 'application/octet-stream';
|
||||
options.data = options.blob || file;
|
||||
} else if ($.support.xhrFormDataFileUpload) {
|
||||
if (options.postMessage) {
|
||||
@ -374,13 +466,14 @@
|
||||
} else {
|
||||
$.each(options.files, function (index, file) {
|
||||
formData.push({
|
||||
name: options.paramName[index] || paramName,
|
||||
name: ($.type(options.paramName) === 'array' &&
|
||||
options.paramName[index]) || paramName,
|
||||
value: file
|
||||
});
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (options.formData instanceof FormData) {
|
||||
if (that._isInstanceOf('FormData', options.formData)) {
|
||||
formData = options.formData;
|
||||
} else {
|
||||
formData = new FormData();
|
||||
@ -389,21 +482,18 @@
|
||||
});
|
||||
}
|
||||
if (options.blob) {
|
||||
options.headers['Content-Disposition'] = 'attachment; filename="' +
|
||||
encodeURI(file.name) + '"';
|
||||
formData.append(paramName, options.blob, file.name);
|
||||
} else {
|
||||
$.each(options.files, function (index, file) {
|
||||
// Files are also Blob instances, but some browsers
|
||||
// (Firefox 3.6) support the File API but not Blobs.
|
||||
// This check allows the tests to run with
|
||||
// dummy objects:
|
||||
if ((window.Blob && file instanceof Blob) ||
|
||||
(window.File && file instanceof File)) {
|
||||
if (that._isInstanceOf('File', file) ||
|
||||
that._isInstanceOf('Blob', file)) {
|
||||
formData.append(
|
||||
options.paramName[index] || paramName,
|
||||
($.type(options.paramName) === 'array' &&
|
||||
options.paramName[index]) || paramName,
|
||||
file,
|
||||
file.name
|
||||
file.uploadName || file.name
|
||||
);
|
||||
}
|
||||
});
|
||||
@ -416,13 +506,13 @@
|
||||
},
|
||||
|
||||
_initIframeSettings: function (options) {
|
||||
var targetHost = $('<a></a>').prop('href', options.url).prop('host');
|
||||
// Setting the dataType to iframe enables the iframe transport:
|
||||
options.dataType = 'iframe ' + (options.dataType || '');
|
||||
// The iframe transport accepts a serialized array as form data:
|
||||
options.formData = this._getFormData(options);
|
||||
// Add redirect url to form data on cross-domain uploads:
|
||||
if (options.redirect && $('<a></a>').prop('href', options.url)
|
||||
.prop('host') !== location.host) {
|
||||
if (options.redirect && targetHost && targetHost !== location.host) {
|
||||
options.formData.push({
|
||||
name: options.redirectParamName || 'redirect',
|
||||
value: options.redirect
|
||||
@ -444,7 +534,7 @@
|
||||
options.dataType = 'postmessage ' + (options.dataType || '');
|
||||
}
|
||||
} else {
|
||||
this._initIframeSettings(options, 'iframe');
|
||||
this._initIframeSettings(options);
|
||||
}
|
||||
},
|
||||
|
||||
@ -487,8 +577,10 @@
|
||||
options.url = options.form.prop('action') || location.href;
|
||||
}
|
||||
// The HTTP request method must be "POST" or "PUT":
|
||||
options.type = (options.type || options.form.prop('method') || '')
|
||||
.toUpperCase();
|
||||
options.type = (options.type ||
|
||||
($.type(options.form.prop('method')) === 'string' &&
|
||||
options.form.prop('method')) || ''
|
||||
).toUpperCase();
|
||||
if (options.type !== 'POST' && options.type !== 'PUT' &&
|
||||
options.type !== 'PATCH') {
|
||||
options.type = 'POST';
|
||||
@ -544,14 +636,35 @@
|
||||
return this._enhancePromise(promise);
|
||||
},
|
||||
|
||||
// Adds convenience methods to the callback arguments:
|
||||
// Adds convenience methods to the data callback argument:
|
||||
_addConvenienceMethods: function (e, data) {
|
||||
var that = this;
|
||||
var that = this,
|
||||
getPromise = function (args) {
|
||||
return $.Deferred().resolveWith(that, args).promise();
|
||||
};
|
||||
data.process = function (resolveFunc, rejectFunc) {
|
||||
if (resolveFunc || rejectFunc) {
|
||||
data._processQueue = this._processQueue =
|
||||
(this._processQueue || getPromise([this])).pipe(
|
||||
function () {
|
||||
if (data.errorThrown) {
|
||||
return $.Deferred()
|
||||
.rejectWith(that, [data]).promise();
|
||||
}
|
||||
return getPromise(arguments);
|
||||
}
|
||||
).pipe(resolveFunc, rejectFunc);
|
||||
}
|
||||
return this._processQueue || getPromise([this]);
|
||||
};
|
||||
data.submit = function () {
|
||||
if (this.state() !== 'pending') {
|
||||
data.jqXHR = this.jqXHR =
|
||||
(that._trigger('submit', e, this) !== false) &&
|
||||
that._onSend(e, this);
|
||||
(that._trigger(
|
||||
'submit',
|
||||
$.Event('submit', {delegatedEvent: e}),
|
||||
this
|
||||
) !== false) && that._onSend(e, this);
|
||||
}
|
||||
return this.jqXHR || that._getXHRPromise();
|
||||
};
|
||||
@ -559,12 +672,21 @@
|
||||
if (this.jqXHR) {
|
||||
return this.jqXHR.abort();
|
||||
}
|
||||
return that._getXHRPromise();
|
||||
this.errorThrown = 'abort';
|
||||
that._trigger('fail', null, this);
|
||||
return that._getXHRPromise(false);
|
||||
};
|
||||
data.state = function () {
|
||||
if (this.jqXHR) {
|
||||
return that._getDeferredState(this.jqXHR);
|
||||
}
|
||||
if (this._processQueue) {
|
||||
return that._getDeferredState(this._processQueue);
|
||||
}
|
||||
};
|
||||
data.processing = function () {
|
||||
return !this.jqXHR && this._processQueue && that
|
||||
._getDeferredState(this._processQueue) === 'pending';
|
||||
};
|
||||
data.progress = function () {
|
||||
return this._progress;
|
||||
@ -590,12 +712,13 @@
|
||||
// should be uploaded in chunks, but does not invoke any
|
||||
// upload requests:
|
||||
_chunkedUpload: function (options, testOnly) {
|
||||
options.uploadedBytes = options.uploadedBytes || 0;
|
||||
var that = this,
|
||||
file = options.files[0],
|
||||
fs = file.size,
|
||||
ub = options.uploadedBytes = options.uploadedBytes || 0,
|
||||
ub = options.uploadedBytes,
|
||||
mcs = options.maxChunkSize || fs,
|
||||
slice = file.slice || file.webkitSlice || file.mozSlice,
|
||||
slice = this._blobSlice,
|
||||
dfd = $.Deferred(),
|
||||
promise = dfd.promise(),
|
||||
jqXHR,
|
||||
@ -608,7 +731,7 @@
|
||||
return true;
|
||||
}
|
||||
if (ub >= fs) {
|
||||
file.error = 'Uploaded bytes exceed file size';
|
||||
file.error = options.i18n('uploadedBytes');
|
||||
return this._getXHRPromise(
|
||||
false,
|
||||
options.context,
|
||||
@ -644,7 +767,7 @@
|
||||
// Create a progress event if no final progress event
|
||||
// with loaded equaling total has been triggered
|
||||
// for this chunk:
|
||||
if (o._progress.loaded === currentLoaded) {
|
||||
if (currentLoaded + o.chunkSize - o._progress.loaded) {
|
||||
that._onProgress($.Event('progress', {
|
||||
lengthComputable: true,
|
||||
loaded: ub - o.uploadedBytes,
|
||||
@ -767,7 +890,11 @@
|
||||
// Set timer for bitrate progress calculation:
|
||||
options._bitrateTimer = new that._BitrateTimer();
|
||||
jqXHR = jqXHR || (
|
||||
((aborted || that._trigger('send', e, options) === false) &&
|
||||
((aborted || that._trigger(
|
||||
'send',
|
||||
$.Event('send', {delegatedEvent: e}),
|
||||
options
|
||||
) === false) &&
|
||||
that._getXHRPromise(false, options.context, aborted)) ||
|
||||
that._chunkedUpload(options) || $.ajax(options)
|
||||
).done(function (result, textStatus, jqXHR) {
|
||||
@ -813,7 +940,8 @@
|
||||
this._slots.push(slot);
|
||||
pipe = slot.pipe(send);
|
||||
} else {
|
||||
pipe = (this._sequence = this._sequence.pipe(send, send));
|
||||
this._sequence = this._sequence.pipe(send, send);
|
||||
pipe = this._sequence;
|
||||
}
|
||||
// Return the piped Promise object, enhanced with an abort method,
|
||||
// which is delegated to the jqXHR object of the current upload,
|
||||
@ -837,46 +965,80 @@
|
||||
var that = this,
|
||||
result = true,
|
||||
options = $.extend({}, this.options, data),
|
||||
files = data.files,
|
||||
filesLength = files.length,
|
||||
limit = options.limitMultiFileUploads,
|
||||
limitSize = options.limitMultiFileUploadSize,
|
||||
overhead = options.limitMultiFileUploadSizeOverhead,
|
||||
batchSize = 0,
|
||||
paramName = this._getParamName(options),
|
||||
paramNameSet,
|
||||
paramNameSlice,
|
||||
fileSet,
|
||||
i;
|
||||
if (!(options.singleFileUploads || limit) ||
|
||||
i,
|
||||
j = 0;
|
||||
if (limitSize && (!filesLength || files[0].size === undefined)) {
|
||||
limitSize = undefined;
|
||||
}
|
||||
if (!(options.singleFileUploads || limit || limitSize) ||
|
||||
!this._isXHRUpload(options)) {
|
||||
fileSet = [data.files];
|
||||
fileSet = [files];
|
||||
paramNameSet = [paramName];
|
||||
} else if (!options.singleFileUploads && limit) {
|
||||
} else if (!(options.singleFileUploads || limitSize) && limit) {
|
||||
fileSet = [];
|
||||
paramNameSet = [];
|
||||
for (i = 0; i < data.files.length; i += limit) {
|
||||
fileSet.push(data.files.slice(i, i + limit));
|
||||
for (i = 0; i < filesLength; i += limit) {
|
||||
fileSet.push(files.slice(i, i + limit));
|
||||
paramNameSlice = paramName.slice(i, i + limit);
|
||||
if (!paramNameSlice.length) {
|
||||
paramNameSlice = paramName;
|
||||
}
|
||||
paramNameSet.push(paramNameSlice);
|
||||
}
|
||||
} else if (!options.singleFileUploads && limitSize) {
|
||||
fileSet = [];
|
||||
paramNameSet = [];
|
||||
for (i = 0; i < filesLength; i = i + 1) {
|
||||
batchSize += files[i].size + overhead;
|
||||
if (i + 1 === filesLength ||
|
||||
((batchSize + files[i + 1].size + overhead) > limitSize) ||
|
||||
(limit && i + 1 - j >= limit)) {
|
||||
fileSet.push(files.slice(j, i + 1));
|
||||
paramNameSlice = paramName.slice(j, i + 1);
|
||||
if (!paramNameSlice.length) {
|
||||
paramNameSlice = paramName;
|
||||
}
|
||||
paramNameSet.push(paramNameSlice);
|
||||
j = i + 1;
|
||||
batchSize = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
paramNameSet = paramName;
|
||||
}
|
||||
data.originalFiles = data.files;
|
||||
$.each(fileSet || data.files, function (index, element) {
|
||||
data.originalFiles = files;
|
||||
$.each(fileSet || files, function (index, element) {
|
||||
var newData = $.extend({}, data);
|
||||
newData.files = fileSet ? element : [element];
|
||||
newData.paramName = paramNameSet[index];
|
||||
that._initResponseObject(newData);
|
||||
that._initProgressObject(newData);
|
||||
that._addConvenienceMethods(e, newData);
|
||||
result = that._trigger('add', e, newData);
|
||||
result = that._trigger(
|
||||
'add',
|
||||
$.Event('add', {delegatedEvent: e}),
|
||||
newData
|
||||
);
|
||||
return result;
|
||||
});
|
||||
return result;
|
||||
},
|
||||
|
||||
_replaceFileInput: function (input) {
|
||||
var inputClone = input.clone(true);
|
||||
_replaceFileInput: function (data) {
|
||||
var input = data.fileInput,
|
||||
inputClone = input.clone(true);
|
||||
// Add a reference for the new cloned file input to the data argument:
|
||||
data.fileInputClone = inputClone;
|
||||
$('<form></form>').append(inputClone)[0].reset();
|
||||
// Detaching allows to insert the fileInput on another form
|
||||
// without loosing the file input value:
|
||||
@ -912,7 +1074,25 @@
|
||||
// to be returned together in one set:
|
||||
dfd.resolve([e]);
|
||||
},
|
||||
dirReader;
|
||||
successHandler = function (entries) {
|
||||
that._handleFileTreeEntries(
|
||||
entries,
|
||||
path + entry.name + '/'
|
||||
).done(function (files) {
|
||||
dfd.resolve(files);
|
||||
}).fail(errorHandler);
|
||||
},
|
||||
readEntries = function () {
|
||||
dirReader.readEntries(function (results) {
|
||||
if (!results.length) {
|
||||
successHandler(entries);
|
||||
} else {
|
||||
entries = entries.concat(results);
|
||||
readEntries();
|
||||
}
|
||||
}, errorHandler);
|
||||
},
|
||||
dirReader, entries = [];
|
||||
path = path || '';
|
||||
if (entry.isFile) {
|
||||
if (entry._file) {
|
||||
@ -927,14 +1107,7 @@
|
||||
}
|
||||
} else if (entry.isDirectory) {
|
||||
dirReader = entry.createReader();
|
||||
dirReader.readEntries(function (entries) {
|
||||
that._handleFileTreeEntries(
|
||||
entries,
|
||||
path + entry.name + '/'
|
||||
).done(function (files) {
|
||||
dfd.resolve(files);
|
||||
}).fail(errorHandler);
|
||||
}, errorHandler);
|
||||
readEntries();
|
||||
} else {
|
||||
// Return an empy list for file system items
|
||||
// other than files or directories:
|
||||
@ -1036,84 +1209,99 @@
|
||||
this._getFileInputFiles(data.fileInput).always(function (files) {
|
||||
data.files = files;
|
||||
if (that.options.replaceFileInput) {
|
||||
that._replaceFileInput(data.fileInput);
|
||||
that._replaceFileInput(data);
|
||||
}
|
||||
if (that._trigger('change', e, data) !== false) {
|
||||
if (that._trigger(
|
||||
'change',
|
||||
$.Event('change', {delegatedEvent: e}),
|
||||
data
|
||||
) !== false) {
|
||||
that._onAdd(e, data);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_onPaste: function (e) {
|
||||
var cbd = e.originalEvent.clipboardData,
|
||||
items = (cbd && cbd.items) || [],
|
||||
var items = e.originalEvent && e.originalEvent.clipboardData &&
|
||||
e.originalEvent.clipboardData.items,
|
||||
data = {files: []};
|
||||
$.each(items, function (index, item) {
|
||||
var file = item.getAsFile && item.getAsFile();
|
||||
if (file) {
|
||||
data.files.push(file);
|
||||
if (items && items.length) {
|
||||
$.each(items, function (index, item) {
|
||||
var file = item.getAsFile && item.getAsFile();
|
||||
if (file) {
|
||||
data.files.push(file);
|
||||
}
|
||||
});
|
||||
if (this._trigger(
|
||||
'paste',
|
||||
$.Event('paste', {delegatedEvent: e}),
|
||||
data
|
||||
) !== false) {
|
||||
this._onAdd(e, data);
|
||||
}
|
||||
});
|
||||
if (this._trigger('paste', e, data) === false ||
|
||||
this._onAdd(e, data) === false) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
_onDrop: function (e) {
|
||||
e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
|
||||
var that = this,
|
||||
dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer,
|
||||
dataTransfer = e.dataTransfer,
|
||||
data = {};
|
||||
if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
|
||||
e.preventDefault();
|
||||
this._getDroppedFiles(dataTransfer).always(function (files) {
|
||||
data.files = files;
|
||||
if (that._trigger(
|
||||
'drop',
|
||||
$.Event('drop', {delegatedEvent: e}),
|
||||
data
|
||||
) !== false) {
|
||||
that._onAdd(e, data);
|
||||
}
|
||||
});
|
||||
}
|
||||
this._getDroppedFiles(dataTransfer).always(function (files) {
|
||||
data.files = files;
|
||||
if (that._trigger('drop', e, data) !== false) {
|
||||
that._onAdd(e, data);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_onDragOver: function (e) {
|
||||
var dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer;
|
||||
if (this._trigger('dragover', e) === false) {
|
||||
return false;
|
||||
}
|
||||
if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1) {
|
||||
dataTransfer.dropEffect = 'copy';
|
||||
e.preventDefault();
|
||||
}
|
||||
},
|
||||
_onDragOver: getDragHandler('dragover'),
|
||||
|
||||
_onDragEnter: getDragHandler('dragenter'),
|
||||
|
||||
_onDragLeave: getDragHandler('dragleave'),
|
||||
|
||||
_initEventHandlers: function () {
|
||||
if (this._isXHRUpload(this.options)) {
|
||||
this._on(this.options.dropZone, {
|
||||
dragover: this._onDragOver,
|
||||
drop: this._onDrop
|
||||
drop: this._onDrop,
|
||||
// event.preventDefault() on dragenter is required for IE10+:
|
||||
dragenter: this._onDragEnter,
|
||||
// dragleave is not required, but added for completeness:
|
||||
dragleave: this._onDragLeave
|
||||
});
|
||||
this._on(this.options.pasteZone, {
|
||||
paste: this._onPaste
|
||||
});
|
||||
}
|
||||
this._on(this.options.fileInput, {
|
||||
change: this._onChange
|
||||
});
|
||||
if ($.support.fileInput) {
|
||||
this._on(this.options.fileInput, {
|
||||
change: this._onChange
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_destroyEventHandlers: function () {
|
||||
this._off(this.options.dropZone, 'dragover drop');
|
||||
this._off(this.options.dropZone, 'dragenter dragleave dragover drop');
|
||||
this._off(this.options.pasteZone, 'paste');
|
||||
this._off(this.options.fileInput, 'change');
|
||||
},
|
||||
|
||||
_setOption: function (key, value) {
|
||||
var refresh = $.inArray(key, this._refreshOptionsList) !== -1;
|
||||
if (refresh) {
|
||||
var reinit = $.inArray(key, this._specialOptions) !== -1;
|
||||
if (reinit) {
|
||||
this._destroyEventHandlers();
|
||||
}
|
||||
this._super(key, value);
|
||||
if (refresh) {
|
||||
if (reinit) {
|
||||
this._initSpecialOptions();
|
||||
this._initEventHandlers();
|
||||
}
|
||||
@ -1135,10 +1323,41 @@
|
||||
}
|
||||
},
|
||||
|
||||
_create: function () {
|
||||
var options = this.options;
|
||||
_getRegExp: function (str) {
|
||||
var parts = str.split('/'),
|
||||
modifiers = parts.pop();
|
||||
parts.shift();
|
||||
return new RegExp(parts.join('/'), modifiers);
|
||||
},
|
||||
|
||||
_isRegExpOption: function (key, value) {
|
||||
return key !== 'url' && $.type(value) === 'string' &&
|
||||
/^\/.*\/[igm]{0,3}$/.test(value);
|
||||
},
|
||||
|
||||
_initDataAttributes: function () {
|
||||
var that = this,
|
||||
options = this.options,
|
||||
clone = $(this.element[0].cloneNode(false));
|
||||
// Initialize options set via HTML5 data-attributes:
|
||||
$.extend(options, $(this.element[0].cloneNode(false)).data());
|
||||
$.each(
|
||||
clone.data(),
|
||||
function (key, value) {
|
||||
var dataAttributeName = 'data-' +
|
||||
// Convert camelCase to hyphen-ated key:
|
||||
key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
||||
if (clone.attr(dataAttributeName)) {
|
||||
if (that._isRegExpOption(key, value)) {
|
||||
value = that._getRegExp(value);
|
||||
}
|
||||
options[key] = value;
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
_create: function () {
|
||||
this._initDataAttributes();
|
||||
this._initSpecialOptions();
|
||||
this._slots = [];
|
||||
this._sequence = this._getXHRPromise(true);
|
||||
@ -1207,8 +1426,13 @@
|
||||
if (aborted) {
|
||||
return;
|
||||
}
|
||||
if (!files.length) {
|
||||
dfd.reject();
|
||||
return;
|
||||
}
|
||||
data.files = files;
|
||||
jqXHR = that._onSend(null, data).then(
|
||||
jqXHR = that._onSend(null, data);
|
||||
jqXHR.then(
|
||||
function (result, textStatus, jqXHR) {
|
||||
dfd.resolve(result, textStatus, jqXHR);
|
||||
},
|
||||
@ -1230,4 +1454,4 @@
|
||||
|
||||
});
|
||||
|
||||
}));
|
||||
}));
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* jQuery Iframe Transport Plugin 1.6.1
|
||||
* jQuery Iframe Transport Plugin 1.8.2
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
@ -9,8 +9,7 @@
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/*jslint unparam: true, nomen: true */
|
||||
/*global define, window, document */
|
||||
/* global define, window, document */
|
||||
|
||||
(function (factory) {
|
||||
'use strict';
|
||||
@ -27,7 +26,7 @@
|
||||
// Helper variable to create unique names for the transport iframes:
|
||||
var counter = 0;
|
||||
|
||||
// The iframe transport accepts three additional options:
|
||||
// The iframe transport accepts four additional options:
|
||||
// options.fileInput: a jQuery collection of file input fields
|
||||
// options.paramName: the parameter name for the file form data,
|
||||
// overrides the name property of the file input field(s),
|
||||
@ -35,9 +34,16 @@
|
||||
// options.formData: an array of objects with name and value properties,
|
||||
// equivalent to the return data of .serializeArray(), e.g.:
|
||||
// [{name: 'a', value: 1}, {name: 'b', value: 2}]
|
||||
// options.initialIframeSrc: the URL of the initial iframe src,
|
||||
// by default set to "javascript:false;"
|
||||
$.ajaxTransport('iframe', function (options) {
|
||||
if (options.async) {
|
||||
var form,
|
||||
// javascript:false as initial iframe src
|
||||
// prevents warning popups on HTTPS in IE6:
|
||||
/*jshint scripturl: true */
|
||||
var initialIframeSrc = options.initialIframeSrc || 'javascript:false;',
|
||||
/*jshint scripturl: false */
|
||||
form,
|
||||
iframe,
|
||||
addParamChar;
|
||||
return {
|
||||
@ -56,14 +62,13 @@
|
||||
options.url = options.url + addParamChar + '_method=PATCH';
|
||||
options.type = 'POST';
|
||||
}
|
||||
// javascript:false as initial iframe src
|
||||
// prevents warning popups on HTTPS in IE6.
|
||||
// IE versions below IE8 cannot set the name property of
|
||||
// elements that have already been added to the DOM,
|
||||
// so we set the name along with the iframe HTML markup:
|
||||
counter += 1;
|
||||
iframe = $(
|
||||
'<iframe src="javascript:false;" name="iframe-transport-' +
|
||||
(counter += 1) + '"></iframe>'
|
||||
'<iframe src="' + initialIframeSrc +
|
||||
'" name="iframe-transport-' + counter + '"></iframe>'
|
||||
).bind('load', function () {
|
||||
var fileInputClones,
|
||||
paramNames = $.isArray(options.paramName) ?
|
||||
@ -94,9 +99,14 @@
|
||||
);
|
||||
// Fix for IE endless progress bar activity bug
|
||||
// (happens on form submits to iframe targets):
|
||||
$('<iframe src="javascript:false;"></iframe>')
|
||||
$('<iframe src="' + initialIframeSrc + '"></iframe>')
|
||||
.appendTo(form);
|
||||
form.remove();
|
||||
window.setTimeout(function () {
|
||||
// Removing the form in a setTimeout call
|
||||
// allows Chrome's developer tools to display
|
||||
// the response result
|
||||
form.remove();
|
||||
}, 0);
|
||||
});
|
||||
form
|
||||
.prop('target', iframe.prop('name'))
|
||||
@ -132,6 +142,8 @@
|
||||
.prop('enctype', 'multipart/form-data')
|
||||
// enctype must be set as encoding for IE:
|
||||
.prop('encoding', 'multipart/form-data');
|
||||
// Remove the HTML5 form attribute from the input(s):
|
||||
options.fileInput.removeAttr('form');
|
||||
}
|
||||
form.submit();
|
||||
// Insert the file input fields at their original location
|
||||
@ -139,7 +151,10 @@
|
||||
if (fileInputClones && fileInputClones.length) {
|
||||
options.fileInput.each(function (index, input) {
|
||||
var clone = $(fileInputClones[index]);
|
||||
$(input).prop('name', clone.prop('name'));
|
||||
// Restore the original name and form properties:
|
||||
$(input)
|
||||
.prop('name', clone.prop('name'))
|
||||
.attr('form', clone.attr('form'));
|
||||
clone.replaceWith(input);
|
||||
});
|
||||
}
|
||||
@ -153,7 +168,7 @@
|
||||
// concat is used to avoid the "Script URL" JSLint error:
|
||||
iframe
|
||||
.unbind('load')
|
||||
.prop('src', 'javascript'.concat(':false;'));
|
||||
.prop('src', initialIframeSrc);
|
||||
}
|
||||
if (form) {
|
||||
form.remove();
|
||||
@ -164,7 +179,15 @@
|
||||
});
|
||||
|
||||
// The iframe transport returns the iframe content document as response.
|
||||
// The following adds converters from iframe to text, json, html, and script:
|
||||
// The following adds converters from iframe to text, json, html, xml
|
||||
// and script.
|
||||
// Please note that the Content-Type for JSON responses has to be text/plain
|
||||
// or text/html, if the browser doesn't include application/json in the
|
||||
// Accept header, else IE will show a download dialog.
|
||||
// The Content-Type for XML responses on the other hand has to be always
|
||||
// application/xml or text/xml, so IE properly parses the XML response.
|
||||
// See also
|
||||
// https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
|
||||
$.ajaxSetup({
|
||||
converters: {
|
||||
'iframe text': function (iframe) {
|
||||
@ -176,10 +199,16 @@
|
||||
'iframe html': function (iframe) {
|
||||
return iframe && $(iframe[0].body).html();
|
||||
},
|
||||
'iframe xml': function (iframe) {
|
||||
var xmlDoc = iframe && iframe[0];
|
||||
return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
|
||||
$.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
|
||||
$(xmlDoc.body).html());
|
||||
},
|
||||
'iframe script': function (iframe) {
|
||||
return iframe && $.globalEval($(iframe[0].body).text());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}));
|
||||
}));
|
Loading…
x
Reference in New Issue
Block a user