Remove blueimp uploader, replaced with dropzone.js
This commit is contained in:
parent
ab712f44fb
commit
a9eecfecd5
File diff suppressed because one or more lines are too long
|
|
@ -1,530 +0,0 @@
|
|||
/*
|
||||
* jQuery UI Widget 1.10.3+amd
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2013 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/jQuery.widget/
|
||||
*/
|
||||
|
||||
(function (factory) {
|
||||
if (typeof define === "function" && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(["jquery"], factory);
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function( $, undefined ) {
|
||||
|
||||
var uuid = 0,
|
||||
slice = Array.prototype.slice,
|
||||
_cleanData = $.cleanData;
|
||||
$.cleanData = function( elems ) {
|
||||
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
|
||||
try {
|
||||
$( elem ).triggerHandler( "remove" );
|
||||
// http://bugs.jquery.com/ticket/8235
|
||||
} catch( e ) {}
|
||||
}
|
||||
_cleanData( elems );
|
||||
};
|
||||
|
||||
$.widget = function( name, base, prototype ) {
|
||||
var fullName, existingConstructor, constructor, basePrototype,
|
||||
// proxiedPrototype allows the provided prototype to remain unmodified
|
||||
// so that it can be used as a mixin for multiple widgets (#8876)
|
||||
proxiedPrototype = {},
|
||||
namespace = name.split( "." )[ 0 ];
|
||||
|
||||
name = name.split( "." )[ 1 ];
|
||||
fullName = namespace + "-" + name;
|
||||
|
||||
if ( !prototype ) {
|
||||
prototype = base;
|
||||
base = $.Widget;
|
||||
}
|
||||
|
||||
// create selector for plugin
|
||||
$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
|
||||
return !!$.data( elem, fullName );
|
||||
};
|
||||
|
||||
$[ namespace ] = $[ namespace ] || {};
|
||||
existingConstructor = $[ namespace ][ name ];
|
||||
constructor = $[ namespace ][ name ] = function( options, element ) {
|
||||
// allow instantiation without "new" keyword
|
||||
if ( !this._createWidget ) {
|
||||
return new constructor( options, element );
|
||||
}
|
||||
|
||||
// allow instantiation without initializing for simple inheritance
|
||||
// must use "new" keyword (the code above always passes args)
|
||||
if ( arguments.length ) {
|
||||
this._createWidget( options, element );
|
||||
}
|
||||
};
|
||||
// extend with the existing constructor to carry over any static properties
|
||||
$.extend( constructor, existingConstructor, {
|
||||
version: prototype.version,
|
||||
// copy the object used to create the prototype in case we need to
|
||||
// redefine the widget later
|
||||
_proto: $.extend( {}, prototype ),
|
||||
// track widgets that inherit from this widget in case this widget is
|
||||
// redefined after a widget inherits from it
|
||||
_childConstructors: []
|
||||
});
|
||||
|
||||
basePrototype = new base();
|
||||
// we need to make the options hash a property directly on the new instance
|
||||
// otherwise we'll modify the options hash on the prototype that we're
|
||||
// inheriting from
|
||||
basePrototype.options = $.widget.extend( {}, basePrototype.options );
|
||||
$.each( prototype, function( prop, value ) {
|
||||
if ( !$.isFunction( value ) ) {
|
||||
proxiedPrototype[ prop ] = value;
|
||||
return;
|
||||
}
|
||||
proxiedPrototype[ prop ] = (function() {
|
||||
var _super = function() {
|
||||
return base.prototype[ prop ].apply( this, arguments );
|
||||
},
|
||||
_superApply = function( args ) {
|
||||
return base.prototype[ prop ].apply( this, args );
|
||||
};
|
||||
return function() {
|
||||
var __super = this._super,
|
||||
__superApply = this._superApply,
|
||||
returnValue;
|
||||
|
||||
this._super = _super;
|
||||
this._superApply = _superApply;
|
||||
|
||||
returnValue = value.apply( this, arguments );
|
||||
|
||||
this._super = __super;
|
||||
this._superApply = __superApply;
|
||||
|
||||
return returnValue;
|
||||
};
|
||||
})();
|
||||
});
|
||||
constructor.prototype = $.widget.extend( basePrototype, {
|
||||
// TODO: remove support for widgetEventPrefix
|
||||
// always use the name + a colon as the prefix, e.g., draggable:start
|
||||
// don't prefix for widgets that aren't DOM-based
|
||||
widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
|
||||
}, proxiedPrototype, {
|
||||
constructor: constructor,
|
||||
namespace: namespace,
|
||||
widgetName: name,
|
||||
widgetFullName: fullName
|
||||
});
|
||||
|
||||
// If this widget is being redefined then we need to find all widgets that
|
||||
// are inheriting from it and redefine all of them so that they inherit from
|
||||
// the new version of this widget. We're essentially trying to replace one
|
||||
// level in the prototype chain.
|
||||
if ( existingConstructor ) {
|
||||
$.each( existingConstructor._childConstructors, function( i, child ) {
|
||||
var childPrototype = child.prototype;
|
||||
|
||||
// redefine the child widget using the same prototype that was
|
||||
// originally used, but inherit from the new version of the base
|
||||
$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
|
||||
});
|
||||
// remove the list of existing child constructors from the old constructor
|
||||
// so the old child constructors can be garbage collected
|
||||
delete existingConstructor._childConstructors;
|
||||
} else {
|
||||
base._childConstructors.push( constructor );
|
||||
}
|
||||
|
||||
$.widget.bridge( name, constructor );
|
||||
};
|
||||
|
||||
$.widget.extend = function( target ) {
|
||||
var input = slice.call( arguments, 1 ),
|
||||
inputIndex = 0,
|
||||
inputLength = input.length,
|
||||
key,
|
||||
value;
|
||||
for ( ; inputIndex < inputLength; inputIndex++ ) {
|
||||
for ( key in input[ inputIndex ] ) {
|
||||
value = input[ inputIndex ][ key ];
|
||||
if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
|
||||
// Clone objects
|
||||
if ( $.isPlainObject( value ) ) {
|
||||
target[ key ] = $.isPlainObject( target[ key ] ) ?
|
||||
$.widget.extend( {}, target[ key ], value ) :
|
||||
// Don't extend strings, arrays, etc. with objects
|
||||
$.widget.extend( {}, value );
|
||||
// Copy everything else by reference
|
||||
} else {
|
||||
target[ key ] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
};
|
||||
|
||||
$.widget.bridge = function( name, object ) {
|
||||
var fullName = object.prototype.widgetFullName || name;
|
||||
$.fn[ name ] = function( options ) {
|
||||
var isMethodCall = typeof options === "string",
|
||||
args = slice.call( arguments, 1 ),
|
||||
returnValue = this;
|
||||
|
||||
// allow multiple hashes to be passed on init
|
||||
options = !isMethodCall && args.length ?
|
||||
$.widget.extend.apply( null, [ options ].concat(args) ) :
|
||||
options;
|
||||
|
||||
if ( isMethodCall ) {
|
||||
this.each(function() {
|
||||
var methodValue,
|
||||
instance = $.data( this, fullName );
|
||||
if ( !instance ) {
|
||||
return $.error( "cannot call methods on " + name + " prior to initialization; " +
|
||||
"attempted to call method '" + options + "'" );
|
||||
}
|
||||
if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
|
||||
return $.error( "no such method '" + options + "' for " + name + " widget instance" );
|
||||
}
|
||||
methodValue = instance[ options ].apply( instance, args );
|
||||
if ( methodValue !== instance && methodValue !== undefined ) {
|
||||
returnValue = methodValue && methodValue.jquery ?
|
||||
returnValue.pushStack( methodValue.get() ) :
|
||||
methodValue;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.each(function() {
|
||||
var instance = $.data( this, fullName );
|
||||
if ( instance ) {
|
||||
instance.option( options || {} )._init();
|
||||
} else {
|
||||
$.data( this, fullName, new object( options, this ) );
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
};
|
||||
};
|
||||
|
||||
$.Widget = function( /* options, element */ ) {};
|
||||
$.Widget._childConstructors = [];
|
||||
|
||||
$.Widget.prototype = {
|
||||
widgetName: "widget",
|
||||
widgetEventPrefix: "",
|
||||
defaultElement: "<div>",
|
||||
options: {
|
||||
disabled: false,
|
||||
|
||||
// callbacks
|
||||
create: null
|
||||
},
|
||||
_createWidget: function( options, element ) {
|
||||
element = $( element || this.defaultElement || this )[ 0 ];
|
||||
this.element = $( element );
|
||||
this.uuid = uuid++;
|
||||
this.eventNamespace = "." + this.widgetName + this.uuid;
|
||||
this.options = $.widget.extend( {},
|
||||
this.options,
|
||||
this._getCreateOptions(),
|
||||
options );
|
||||
|
||||
this.bindings = $();
|
||||
this.hoverable = $();
|
||||
this.focusable = $();
|
||||
|
||||
if ( element !== this ) {
|
||||
$.data( element, this.widgetFullName, this );
|
||||
this._on( true, this.element, {
|
||||
remove: function( event ) {
|
||||
if ( event.target === element ) {
|
||||
this.destroy();
|
||||
}
|
||||
}
|
||||
});
|
||||
this.document = $( element.style ?
|
||||
// element within the document
|
||||
element.ownerDocument :
|
||||
// element is window or document
|
||||
element.document || element );
|
||||
this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
|
||||
}
|
||||
|
||||
this._create();
|
||||
this._trigger( "create", null, this._getCreateEventData() );
|
||||
this._init();
|
||||
},
|
||||
_getCreateOptions: $.noop,
|
||||
_getCreateEventData: $.noop,
|
||||
_create: $.noop,
|
||||
_init: $.noop,
|
||||
|
||||
destroy: function() {
|
||||
this._destroy();
|
||||
// we can probably remove the unbind calls in 2.0
|
||||
// all event bindings should go through this._on()
|
||||
this.element
|
||||
.unbind( this.eventNamespace )
|
||||
// 1.9 BC for #7810
|
||||
// TODO remove dual storage
|
||||
.removeData( this.widgetName )
|
||||
.removeData( this.widgetFullName )
|
||||
// support: jquery <1.6.3
|
||||
// http://bugs.jquery.com/ticket/9413
|
||||
.removeData( $.camelCase( this.widgetFullName ) );
|
||||
this.widget()
|
||||
.unbind( this.eventNamespace )
|
||||
.removeAttr( "aria-disabled" )
|
||||
.removeClass(
|
||||
this.widgetFullName + "-disabled " +
|
||||
"ui-state-disabled" );
|
||||
|
||||
// clean up events and states
|
||||
this.bindings.unbind( this.eventNamespace );
|
||||
this.hoverable.removeClass( "ui-state-hover" );
|
||||
this.focusable.removeClass( "ui-state-focus" );
|
||||
},
|
||||
_destroy: $.noop,
|
||||
|
||||
widget: function() {
|
||||
return this.element;
|
||||
},
|
||||
|
||||
option: function( key, value ) {
|
||||
var options = key,
|
||||
parts,
|
||||
curOption,
|
||||
i;
|
||||
|
||||
if ( arguments.length === 0 ) {
|
||||
// don't return a reference to the internal hash
|
||||
return $.widget.extend( {}, this.options );
|
||||
}
|
||||
|
||||
if ( typeof key === "string" ) {
|
||||
// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
|
||||
options = {};
|
||||
parts = key.split( "." );
|
||||
key = parts.shift();
|
||||
if ( parts.length ) {
|
||||
curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
|
||||
for ( i = 0; i < parts.length - 1; i++ ) {
|
||||
curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
|
||||
curOption = curOption[ parts[ i ] ];
|
||||
}
|
||||
key = parts.pop();
|
||||
if ( value === undefined ) {
|
||||
return curOption[ key ] === undefined ? null : curOption[ key ];
|
||||
}
|
||||
curOption[ key ] = value;
|
||||
} else {
|
||||
if ( value === undefined ) {
|
||||
return this.options[ key ] === undefined ? null : this.options[ key ];
|
||||
}
|
||||
options[ key ] = value;
|
||||
}
|
||||
}
|
||||
|
||||
this._setOptions( options );
|
||||
|
||||
return this;
|
||||
},
|
||||
_setOptions: function( options ) {
|
||||
var key;
|
||||
|
||||
for ( key in options ) {
|
||||
this._setOption( key, options[ key ] );
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
_setOption: function( key, value ) {
|
||||
this.options[ key ] = value;
|
||||
|
||||
if ( key === "disabled" ) {
|
||||
this.widget()
|
||||
.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
|
||||
.attr( "aria-disabled", value );
|
||||
this.hoverable.removeClass( "ui-state-hover" );
|
||||
this.focusable.removeClass( "ui-state-focus" );
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
return this._setOption( "disabled", false );
|
||||
},
|
||||
disable: function() {
|
||||
return this._setOption( "disabled", true );
|
||||
},
|
||||
|
||||
_on: function( suppressDisabledCheck, element, handlers ) {
|
||||
var delegateElement,
|
||||
instance = this;
|
||||
|
||||
// no suppressDisabledCheck flag, shuffle arguments
|
||||
if ( typeof suppressDisabledCheck !== "boolean" ) {
|
||||
handlers = element;
|
||||
element = suppressDisabledCheck;
|
||||
suppressDisabledCheck = false;
|
||||
}
|
||||
|
||||
// no element argument, shuffle and use this.element
|
||||
if ( !handlers ) {
|
||||
handlers = element;
|
||||
element = this.element;
|
||||
delegateElement = this.widget();
|
||||
} else {
|
||||
// accept selectors, DOM elements
|
||||
element = delegateElement = $( element );
|
||||
this.bindings = this.bindings.add( element );
|
||||
}
|
||||
|
||||
$.each( handlers, function( event, handler ) {
|
||||
function handlerProxy() {
|
||||
// allow widgets to customize the disabled handling
|
||||
// - disabled as an array instead of boolean
|
||||
// - disabled class as method for disabling individual parts
|
||||
if ( !suppressDisabledCheck &&
|
||||
( instance.options.disabled === true ||
|
||||
$( this ).hasClass( "ui-state-disabled" ) ) ) {
|
||||
return;
|
||||
}
|
||||
return ( typeof handler === "string" ? instance[ handler ] : handler )
|
||||
.apply( instance, arguments );
|
||||
}
|
||||
|
||||
// copy the guid so direct unbinding works
|
||||
if ( typeof handler !== "string" ) {
|
||||
handlerProxy.guid = handler.guid =
|
||||
handler.guid || handlerProxy.guid || $.guid++;
|
||||
}
|
||||
|
||||
var match = event.match( /^(\w+)\s*(.*)$/ ),
|
||||
eventName = match[1] + instance.eventNamespace,
|
||||
selector = match[2];
|
||||
if ( selector ) {
|
||||
delegateElement.delegate( selector, eventName, handlerProxy );
|
||||
} else {
|
||||
element.bind( eventName, handlerProxy );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_off: function( element, eventName ) {
|
||||
eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
|
||||
element.unbind( eventName ).undelegate( eventName );
|
||||
},
|
||||
|
||||
_delay: function( handler, delay ) {
|
||||
function handlerProxy() {
|
||||
return ( typeof handler === "string" ? instance[ handler ] : handler )
|
||||
.apply( instance, arguments );
|
||||
}
|
||||
var instance = this;
|
||||
return setTimeout( handlerProxy, delay || 0 );
|
||||
},
|
||||
|
||||
_hoverable: function( element ) {
|
||||
this.hoverable = this.hoverable.add( element );
|
||||
this._on( element, {
|
||||
mouseenter: function( event ) {
|
||||
$( event.currentTarget ).addClass( "ui-state-hover" );
|
||||
},
|
||||
mouseleave: function( event ) {
|
||||
$( event.currentTarget ).removeClass( "ui-state-hover" );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_focusable: function( element ) {
|
||||
this.focusable = this.focusable.add( element );
|
||||
this._on( element, {
|
||||
focusin: function( event ) {
|
||||
$( event.currentTarget ).addClass( "ui-state-focus" );
|
||||
},
|
||||
focusout: function( event ) {
|
||||
$( event.currentTarget ).removeClass( "ui-state-focus" );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_trigger: function( type, event, data ) {
|
||||
var prop, orig,
|
||||
callback = this.options[ type ];
|
||||
|
||||
data = data || {};
|
||||
event = $.Event( event );
|
||||
event.type = ( type === this.widgetEventPrefix ?
|
||||
type :
|
||||
this.widgetEventPrefix + type ).toLowerCase();
|
||||
// the original event may come from any element
|
||||
// so we need to reset the target on the new event
|
||||
event.target = this.element[ 0 ];
|
||||
|
||||
// copy original event properties over to the new event
|
||||
orig = event.originalEvent;
|
||||
if ( orig ) {
|
||||
for ( prop in orig ) {
|
||||
if ( !( prop in event ) ) {
|
||||
event[ prop ] = orig[ prop ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.element.trigger( event, data );
|
||||
return !( $.isFunction( callback ) &&
|
||||
callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
|
||||
event.isDefaultPrevented() );
|
||||
}
|
||||
};
|
||||
|
||||
$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
|
||||
$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
|
||||
if ( typeof options === "string" ) {
|
||||
options = { effect: options };
|
||||
}
|
||||
var hasOptions,
|
||||
effectName = !options ?
|
||||
method :
|
||||
options === true || typeof options === "number" ?
|
||||
defaultEffect :
|
||||
options.effect || defaultEffect;
|
||||
options = options || {};
|
||||
if ( typeof options === "number" ) {
|
||||
options = { duration: options };
|
||||
}
|
||||
hasOptions = !$.isEmptyObject( options );
|
||||
options.complete = callback;
|
||||
if ( options.delay ) {
|
||||
element.delay( options.delay );
|
||||
}
|
||||
if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
|
||||
element[ method ]( options );
|
||||
} else if ( effectName !== method && element[ effectName ] ) {
|
||||
element[ effectName ]( options.duration, options.easing, callback );
|
||||
} else {
|
||||
element.queue(function( next ) {
|
||||
$( this )[ method ]();
|
||||
if ( callback ) {
|
||||
callback.call( element[ 0 ] );
|
||||
}
|
||||
next();
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
}));
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,214 +0,0 @@
|
|||
/*
|
||||
* jQuery Iframe Transport Plugin 1.8.2
|
||||
* https://github.com/blueimp/jQuery-File-Upload
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
/* global define, window, document */
|
||||
|
||||
(function (factory) {
|
||||
'use strict';
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Register as an anonymous AMD module:
|
||||
define(['jquery'], factory);
|
||||
} else {
|
||||
// Browser globals:
|
||||
factory(window.jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
'use strict';
|
||||
|
||||
// Helper variable to create unique names for the transport iframes:
|
||||
var counter = 0;
|
||||
|
||||
// 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),
|
||||
// can be a string or an array of strings.
|
||||
// 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) {
|
||||
// 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 {
|
||||
send: function (_, completeCallback) {
|
||||
form = $('<form style="display:none;"></form>');
|
||||
form.attr('accept-charset', options.formAcceptCharset);
|
||||
addParamChar = /\?/.test(options.url) ? '&' : '?';
|
||||
// XDomainRequest only supports GET and POST:
|
||||
if (options.type === 'DELETE') {
|
||||
options.url = options.url + addParamChar + '_method=DELETE';
|
||||
options.type = 'POST';
|
||||
} else if (options.type === 'PUT') {
|
||||
options.url = options.url + addParamChar + '_method=PUT';
|
||||
options.type = 'POST';
|
||||
} else if (options.type === 'PATCH') {
|
||||
options.url = options.url + addParamChar + '_method=PATCH';
|
||||
options.type = 'POST';
|
||||
}
|
||||
// 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="' + initialIframeSrc +
|
||||
'" name="iframe-transport-' + counter + '"></iframe>'
|
||||
).bind('load', function () {
|
||||
var fileInputClones,
|
||||
paramNames = $.isArray(options.paramName) ?
|
||||
options.paramName : [options.paramName];
|
||||
iframe
|
||||
.unbind('load')
|
||||
.bind('load', function () {
|
||||
var response;
|
||||
// Wrap in a try/catch block to catch exceptions thrown
|
||||
// when trying to access cross-domain iframe contents:
|
||||
try {
|
||||
response = iframe.contents();
|
||||
// Google Chrome and Firefox do not throw an
|
||||
// exception when calling iframe.contents() on
|
||||
// cross-domain requests, so we unify the response:
|
||||
if (!response.length || !response[0].firstChild) {
|
||||
throw new Error();
|
||||
}
|
||||
} catch (e) {
|
||||
response = undefined;
|
||||
}
|
||||
// The complete callback returns the
|
||||
// iframe content document as response object:
|
||||
completeCallback(
|
||||
200,
|
||||
'success',
|
||||
{'iframe': response}
|
||||
);
|
||||
// Fix for IE endless progress bar activity bug
|
||||
// (happens on form submits to iframe targets):
|
||||
$('<iframe src="' + initialIframeSrc + '"></iframe>')
|
||||
.appendTo(form);
|
||||
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'))
|
||||
.prop('action', options.url)
|
||||
.prop('method', options.type);
|
||||
if (options.formData) {
|
||||
$.each(options.formData, function (index, field) {
|
||||
$('<input type="hidden"/>')
|
||||
.prop('name', field.name)
|
||||
.val(field.value)
|
||||
.appendTo(form);
|
||||
});
|
||||
}
|
||||
if (options.fileInput && options.fileInput.length &&
|
||||
options.type === 'POST') {
|
||||
fileInputClones = options.fileInput.clone();
|
||||
// Insert a clone for each file input field:
|
||||
options.fileInput.after(function (index) {
|
||||
return fileInputClones[index];
|
||||
});
|
||||
if (options.paramName) {
|
||||
options.fileInput.each(function (index) {
|
||||
$(this).prop(
|
||||
'name',
|
||||
paramNames[index] || options.paramName
|
||||
);
|
||||
});
|
||||
}
|
||||
// Appending the file input fields to the hidden form
|
||||
// removes them from their original location:
|
||||
form
|
||||
.append(options.fileInput)
|
||||
.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
|
||||
// by replacing the clones with the originals:
|
||||
if (fileInputClones && fileInputClones.length) {
|
||||
options.fileInput.each(function (index, input) {
|
||||
var clone = $(fileInputClones[index]);
|
||||
// Restore the original name and form properties:
|
||||
$(input)
|
||||
.prop('name', clone.prop('name'))
|
||||
.attr('form', clone.attr('form'));
|
||||
clone.replaceWith(input);
|
||||
});
|
||||
}
|
||||
});
|
||||
form.append(iframe).appendTo(document.body);
|
||||
},
|
||||
abort: function () {
|
||||
if (iframe) {
|
||||
// javascript:false as iframe src aborts the request
|
||||
// and prevents warning popups on HTTPS in IE6.
|
||||
// concat is used to avoid the "Script URL" JSLint error:
|
||||
iframe
|
||||
.unbind('load')
|
||||
.prop('src', initialIframeSrc);
|
||||
}
|
||||
if (form) {
|
||||
form.remove();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// The iframe transport returns the iframe content document as response.
|
||||
// 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) {
|
||||
return iframe && $(iframe[0].body).text();
|
||||
},
|
||||
'iframe json': function (iframe) {
|
||||
return iframe && $.parseJSON($(iframe[0].body).text());
|
||||
},
|
||||
'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());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}));
|
||||
|
|
@ -43,6 +43,7 @@ class FileUpload extends FormWidgetBase
|
|||
'previewNoFilesMessage',
|
||||
'backend::lang.form.preview_no_files_message'
|
||||
);
|
||||
|
||||
$this->checkUploadPostback();
|
||||
}
|
||||
|
||||
|
|
@ -246,6 +247,7 @@ class FileUpload extends FormWidgetBase
|
|||
$result = json_encode(['error' => $ex->getMessage()]);
|
||||
}
|
||||
|
||||
header('Content-Type: application/json');
|
||||
die($result);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,13 +28,13 @@
|
|||
this.editor = null
|
||||
this.dataCache = null
|
||||
this.locked = false
|
||||
this.dropzone = null
|
||||
var self = this
|
||||
|
||||
/*
|
||||
* Validate requirements
|
||||
*/
|
||||
this.isMulti = this.$el.hasClass('is-multi');
|
||||
this.inputField = $(this.options.uploadInput)
|
||||
this.templateHtml = $('#' + this.options.itemTemplate).html()
|
||||
this.uploadLink = $(this.options.uploadLink, this.$el)
|
||||
|
||||
|
|
@ -59,15 +59,6 @@
|
|||
*/
|
||||
this.progressBar = $(this.options.progressBar, this.$el).find('>.progress-bar')
|
||||
|
||||
/*
|
||||
* Find and bind upload trigger
|
||||
*/
|
||||
this.$el.on('click', this.options.uploadLink, function(){
|
||||
if (self.locked) return
|
||||
|
||||
self.inputField.val('').trigger('click')
|
||||
})
|
||||
|
||||
/*
|
||||
* Bind remove link
|
||||
*/
|
||||
|
|
@ -109,6 +100,8 @@
|
|||
|
||||
this.$el.find('ul, ol').sortable({
|
||||
itemSelector: 'li:not(.attachment-uploader)',
|
||||
vertical: false,
|
||||
tolerance: -100,
|
||||
placeholder: placeholderEl,
|
||||
onDrop: function ($item, container, _super) {
|
||||
_super($item, container)
|
||||
|
|
@ -126,40 +119,44 @@
|
|||
* Build uploader options
|
||||
*/
|
||||
var uploaderOptions = {
|
||||
start: $.proxy(self.onUploadStart, self),
|
||||
done: $.proxy(self.onUploadComplete, self),
|
||||
progressall: $.proxy(self.onUploadProgress, self),
|
||||
fail: $.proxy(self.onUploadFail, self),
|
||||
dataType: 'json',
|
||||
type: 'POST',
|
||||
url: this.options.url,
|
||||
paramName: this.inputField.attr('name')
|
||||
}
|
||||
|
||||
/*
|
||||
* Splice in extraData with any form data
|
||||
*/
|
||||
if (this.options.extraData) {
|
||||
uploaderOptions.formData = function(form) {
|
||||
if (self.dataCache)
|
||||
return self.dataCache
|
||||
|
||||
var data = form.serializeArray()
|
||||
$.each(self.options.extraData, function (name, value) {
|
||||
data.push({name: name, value: value})
|
||||
})
|
||||
|
||||
return self.dataCache = data
|
||||
}
|
||||
clickable: this.uploadLink.get(0),
|
||||
paramName: this.options.paramName,
|
||||
previewsContainer: $('<div />').get(0),
|
||||
maxFiles: !this.isMulti ? 1 : null,
|
||||
method: 'POST'
|
||||
}
|
||||
|
||||
/*
|
||||
* Bind uploader
|
||||
*/
|
||||
this.inputField.fileupload(uploaderOptions)
|
||||
this.dropzone = new Dropzone(this.$el.get(0), uploaderOptions)
|
||||
this.dropzone.on('error', $.proxy(self.onUploadFail, self))
|
||||
this.dropzone.on('success', $.proxy(self.onUploadComplete, self))
|
||||
this.dropzone.on('uploadprogress', $.proxy(self.onUploadProgress, self))
|
||||
this.dropzone.on('thumbnail', $.proxy(self.onUploadThumbnail, self))
|
||||
this.dropzone.on('sending', function(file, xhr, formData) {
|
||||
self.addExtraFormData(formData)
|
||||
self.onUploadStart()
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
FileUpload.prototype.addExtraFormData = function(formData) {
|
||||
if (this.options.extraData) {
|
||||
$.each(this.options.extraData, function (name, value) {
|
||||
formData.append(name, value)
|
||||
})
|
||||
}
|
||||
|
||||
var $form = this.$el.closest('form')
|
||||
if ($form.length > 0) {
|
||||
$.each($form.serializeArray(), function (index, field) {
|
||||
formData.append(field.name, field.value)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
FileUpload.prototype.removeItem = function(item) {
|
||||
if (this.isMulti) {
|
||||
item.closest('li').fadeOut(500, function(){
|
||||
|
|
@ -170,10 +167,14 @@
|
|||
item.find('.active-image, .active-file, .uploader-toolbar').remove()
|
||||
this.uploadLink.show()
|
||||
this.toggleLoading(false, item)
|
||||
|
||||
// Reset the file counter
|
||||
this.dropzone.removeAllFiles()
|
||||
}
|
||||
}
|
||||
|
||||
FileUpload.prototype.renderItem = function(item, replaceItem) {
|
||||
|
||||
var newItem = $(Mustache.to_html(this.templateHtml, item))
|
||||
|
||||
if (this.isMulti) {
|
||||
|
|
@ -216,20 +217,24 @@
|
|||
}
|
||||
}
|
||||
|
||||
FileUpload.prototype.onUploadStart = function(event, data) {
|
||||
FileUpload.prototype.onUploadStart = function() {
|
||||
this.locked = true
|
||||
this.toggleLoading(true, this.progressBar.closest('.attachment-item'))
|
||||
|
||||
this.options.onStart && this.options.onStart()
|
||||
}
|
||||
|
||||
FileUpload.prototype.onUploadComplete = function(event, data) {
|
||||
if (data.result.error)
|
||||
return this.onUploadFail(event, $.extend(data, { errorThrown: data.result.error }))
|
||||
FileUpload.prototype.onUploadThumbnail = function(file, thumbUrl) {
|
||||
// @todo
|
||||
}
|
||||
|
||||
FileUpload.prototype.onUploadComplete = function(file, data) {
|
||||
if (data.error)
|
||||
return this.onUploadFail(null, data.error)
|
||||
|
||||
this.options.onComplete && this.options.onComplete()
|
||||
|
||||
var newItem = this.renderItem(data.result)
|
||||
var newItem = this.renderItem(data)
|
||||
|
||||
newItem.css({ opacity: 0 })
|
||||
.animate({ opacity: 1}, 500)
|
||||
|
|
@ -237,23 +242,19 @@
|
|||
this.resetAll()
|
||||
}
|
||||
|
||||
FileUpload.prototype.onUploadFail = function(event, data) {
|
||||
alert('Error uploading file: ' + data.errorThrown)
|
||||
FileUpload.prototype.onUploadFail = function(file, error) {
|
||||
alert('Error uploading file: ' + error)
|
||||
this.options.onFail && this.options.onFail()
|
||||
this.resetAll()
|
||||
}
|
||||
|
||||
FileUpload.prototype.onUploadProgress = function(event, data) {
|
||||
var progress = parseInt(data.loaded / data.total * 100, 10)
|
||||
FileUpload.prototype.onUploadProgress = function(file, progress, bytesSent) {
|
||||
this.progressBar.css('width', progress + '%')
|
||||
}
|
||||
|
||||
FileUpload.prototype.resetAll = function() {
|
||||
this.toggleLoading(false, this.progressBar.closest('.attachment-item'))
|
||||
this.locked = false
|
||||
|
||||
// Rebind the uploader since the input has been cloned
|
||||
this.bindUploader()
|
||||
}
|
||||
|
||||
FileUpload.prototype.toggleLoading = function(isLoading, el) {
|
||||
|
|
@ -275,11 +276,10 @@
|
|||
}
|
||||
|
||||
FileUpload.DEFAULTS = {
|
||||
url: null,
|
||||
url: window.location,
|
||||
uniqueId: null,
|
||||
extraData: {},
|
||||
sortHandler: null,
|
||||
uploadInput: null,
|
||||
loadingClass: 'loading',
|
||||
removeLink: '.uploader-remove',
|
||||
uploadLink: '.uploader-link',
|
||||
|
|
@ -290,7 +290,8 @@
|
|||
onFail: null,
|
||||
imageWidth: 100,
|
||||
imageHeight: 100,
|
||||
itemTemplate: null
|
||||
itemTemplate: null,
|
||||
paramName: 'file_data'
|
||||
}
|
||||
|
||||
// FILEUPLOAD PLUGIN DEFINITION
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@import "../../../../assets/less/core/boot.less";
|
||||
|
||||
@fileupload-progress-bar-height: 5px;
|
||||
@fileupload-inactive-icon: #808b93;
|
||||
|
||||
.field-fileupload {
|
||||
|
||||
|
|
@ -290,7 +291,7 @@ html:not(.touch) {
|
|||
text-align: left;
|
||||
padding: 0 0 5px 6px;
|
||||
font-size: 16px;
|
||||
color: @color-sidebarnav-inactive-icon;
|
||||
color: @fileupload-inactive-icon;
|
||||
margin-left: 5px;
|
||||
|
||||
&:before {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
id="<?= $this->getId() ?>"
|
||||
class="field-fileupload is-multi <?= count($fileList) ? 'has-attachments' : '' ?> is-sortable"
|
||||
data-control="fileupload"
|
||||
data-upload-input="#<?= $this->getId('uploadInput') ?>"
|
||||
data-unique-id="<?= $this->getId() ?>"
|
||||
data-sort-handler="<?= $this->getEventHandler('onSortAttachments') ?>"
|
||||
data-item-template="<?= $this->getId('template') ?>">
|
||||
|
|
@ -25,14 +24,6 @@
|
|||
|
||||
</div>
|
||||
|
||||
<!-- Upload form -->
|
||||
<input
|
||||
id="<?= $this->getId('uploadInput') ?>"
|
||||
type="file"
|
||||
multiple="true"
|
||||
name="file_data"
|
||||
class="attachment-input" />
|
||||
|
||||
<!-- Populated File -->
|
||||
<script type="text/template" id="<?= $this->getId('template') ?>">
|
||||
<li>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
id="<?= $this->getId() ?>"
|
||||
class="field-fileupload <?= $singleFile ? 'has-attachments' : '' ?>"
|
||||
data-control="fileupload"
|
||||
data-upload-input="#<?= $this->getId('uploadInput') ?>"
|
||||
data-unique-id="<?= $this->getId() ?>"
|
||||
data-item-template="<?= $this->getId('template') ?>">
|
||||
|
||||
|
|
@ -21,13 +20,6 @@
|
|||
<div class="uploader-loading"></div>
|
||||
</div>
|
||||
|
||||
<!-- Upload form -->
|
||||
<input
|
||||
id="<?= $this->getId('uploadInput') ?>"
|
||||
type="file"
|
||||
name="file_data"
|
||||
class="attachment-input" />
|
||||
|
||||
<!-- Populated File -->
|
||||
<script type="text/template" id="<?= $this->getId('template') ?>">
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
id="<?= $this->getId() ?>"
|
||||
class="field-fileupload is-multi <?= count($fileList) ? 'has-attachments' : '' ?> is-sortable"
|
||||
data-control="fileupload"
|
||||
data-upload-input="#<?= $this->getId('uploadInput') ?>"
|
||||
data-unique-id="<?= $this->getId() ?>"
|
||||
data-sort-handler="<?= $this->getEventHandler('onSortAttachments') ?>"
|
||||
data-image-width="<?= $imageWidth ?>"
|
||||
|
|
@ -28,14 +27,6 @@
|
|||
<?php endif ?>
|
||||
</div>
|
||||
|
||||
<!-- Upload form -->
|
||||
<input
|
||||
id="<?= $this->getId('uploadInput') ?>"
|
||||
type="file"
|
||||
multiple="true"
|
||||
name="file_data"
|
||||
class="attachment-input" />
|
||||
|
||||
<!-- Populated Image -->
|
||||
<script type="text/template" id="<?= $this->getId('template') ?>">
|
||||
<li>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
id="<?= $this->getId() ?>"
|
||||
class="field-fileupload <?= $singleFile ? 'has-attachments' : '' ?>"
|
||||
data-control="fileupload"
|
||||
data-upload-input="#<?= $this->getId('uploadInput') ?>"
|
||||
data-unique-id="<?= $this->getId() ?>"
|
||||
data-image-width="<?= $imageWidth ?>"
|
||||
data-image-height="<?= $imageHeight ?>"
|
||||
|
|
@ -27,13 +26,6 @@
|
|||
<div class="uploader-loading"></div>
|
||||
</div>
|
||||
|
||||
<!-- Upload form -->
|
||||
<input
|
||||
id="<?= $this->getId('uploadInput') ?>"
|
||||
type="file"
|
||||
name="file_data"
|
||||
class="attachment-input" />
|
||||
|
||||
<!-- Populated Image -->
|
||||
<script type="text/template" id="<?= $this->getId('template') ?>">
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
<link href="<?= Backend::skinAsset('assets/css/october.css') ?>?v<?= System\Models\Parameters::get('system::core.build', 1) ?>" rel="stylesheet">
|
||||
|
||||
<script src="<?= Backend::skinAsset('assets/js/vendor/jquery-2.0.3.min.js') ?>"></script>
|
||||
<script src="<?= Backend::skinAsset('assets/js/vendor/jquery.ui.widget.js') ?>"></script>
|
||||
<script src="<?= URL::asset('modules/system/assets/js/framework.js') ?>"></script>
|
||||
<script src="<?= Backend::skinAsset('assets/js/vendor/modernizr.min.js') ?>"></script>
|
||||
<script src="<?= Backend::skinAsset('assets/js/vendor/mousewheel.js') ?>"></script>
|
||||
|
|
@ -23,8 +22,7 @@
|
|||
|
||||
<script src="<?= Backend::skinAsset('assets/vendor/select2/select2.js') ?>"></script>
|
||||
<script src="<?= Backend::skinAsset('assets/vendor/mustache/mustache.min.js') ?>"></script>
|
||||
<script src="<?= Backend::skinAsset('assets/vendor/fileupload/jquery.fileupload.js') ?>"></script>
|
||||
<script src="<?= Backend::skinAsset('assets/vendor/fileupload/jquery.iframe-transport.js') ?>"></script>
|
||||
<script src="<?= Backend::skinAsset('assets/vendor/dropzone/dropzone.js') ?>"></script>
|
||||
|
||||
<script src="<?= URL::asset('modules/system/assets/vendor/bootstrap/js/tooltip.js') ?>"></script>
|
||||
<script src="<?= URL::asset('modules/system/assets/vendor/bootstrap/js/modal.js') ?>"></script>
|
||||
|
|
|
|||
|
|
@ -79,23 +79,23 @@
|
|||
this.updateUi()
|
||||
}
|
||||
|
||||
AssetList.prototype.onUploadFail = function(event, data, more) {
|
||||
alert('Error uploading file: ' + data.errorThrown)
|
||||
AssetList.prototype.onUploadFail = function(file, error) {
|
||||
alert('Error uploading file: ' + error)
|
||||
this.refresh()
|
||||
}
|
||||
|
||||
AssetList.prototype.onUploadComplete = function(event, data, more) {
|
||||
if (data.result !== 'success')
|
||||
alert(data.result)
|
||||
AssetList.prototype.onUploadSuccess = function(file, data) {
|
||||
if (data !== 'success')
|
||||
alert(data)
|
||||
}
|
||||
|
||||
AssetList.prototype.onUploadStop = function(event, data, more) {
|
||||
AssetList.prototype.onUploadComplete = function(file, data) {
|
||||
$.oc.stripeLoadIndicator.hide()
|
||||
this.refresh()
|
||||
}
|
||||
|
||||
AssetList.prototype.onUploadStart = function(event, data, more) {
|
||||
$.oc.stripeLoadIndicator.show(event)
|
||||
AssetList.prototype.onUploadStart = function() {
|
||||
$.oc.stripeLoadIndicator.show()
|
||||
}
|
||||
|
||||
AssetList.prototype.onFileClick = function(event) {
|
||||
|
|
@ -133,22 +133,25 @@
|
|||
}
|
||||
|
||||
AssetList.prototype.setupUploader = function() {
|
||||
var field = $('.asset-list-upload-field', this.$form),
|
||||
var self = this,
|
||||
$link = $('[data-control="upload-assets"]', this.$form),
|
||||
uploaderOptions = {
|
||||
fail: $.proxy(this.onUploadFail, this),
|
||||
type: 'POST',
|
||||
method: 'POST',
|
||||
url: window.location,
|
||||
paramName: 'file_data',
|
||||
formData: this.$form.serializeArray(),
|
||||
replaceFileInput: false,
|
||||
stop: $.proxy(this.onUploadStop, this),
|
||||
start: $.proxy(this.onUploadStart, this),
|
||||
done: $.proxy(this.onUploadComplete, this)
|
||||
previewsContainer: $('<div />').get(0),
|
||||
clickable: $link.get(0)
|
||||
}
|
||||
|
||||
field.fileupload(uploaderOptions)
|
||||
$link.click(function(event) {
|
||||
field.trigger('click')
|
||||
var dropzone = new Dropzone($('<div />').get(0), uploaderOptions)
|
||||
dropzone.on('error', $.proxy(self.onUploadFail, self))
|
||||
dropzone.on('success', $.proxy(self.onUploadSuccess, self))
|
||||
dropzone.on('complete', $.proxy(self.onUploadComplete, self))
|
||||
dropzone.on('sending', function(file, xhr, formData) {
|
||||
$.each(self.$form.serializeArray(), function (index, field) {
|
||||
formData.append(field.name, field.value)
|
||||
})
|
||||
self.onUploadStart()
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -217,7 +217,3 @@
|
|||
|
||||
}
|
||||
}
|
||||
|
||||
input[type="file"].asset-list-upload-field {
|
||||
display: none;
|
||||
}
|
||||
|
|
@ -7,9 +7,3 @@
|
|||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="theme" value="<?= e($this->theme->getDirName()) ?>">
|
||||
|
||||
<input
|
||||
type="file"
|
||||
multiple="true"
|
||||
name="file_data"
|
||||
class="asset-list-upload-field"/>
|
||||
Loading…
Reference in New Issue