| | |
| |
|
| | |
| | |
| | |
| | window.wp = window.wp || {}; |
| |
|
| | ( function( exports, $ ) { |
| | var Uploader; |
| |
|
| | if ( typeof _wpPluploadSettings === 'undefined' ) { |
| | return; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | Uploader = function( options ) { |
| | var self = this, |
| | isIE, |
| | elements = { |
| | container: 'container', |
| | browser: 'browse_button', |
| | dropzone: 'drop_element' |
| | }, |
| | tryAgainCount = {}, |
| | tryAgain, |
| | key, |
| | error, |
| | fileUploaded; |
| |
|
| | this.supports = { |
| | upload: Uploader.browser.supported |
| | }; |
| |
|
| | this.supported = this.supports.upload; |
| |
|
| | if ( ! this.supported ) { |
| | return; |
| | } |
| |
|
| | |
| | |
| | this.plupload = $.extend( true, { multipart_params: {} }, Uploader.defaults ); |
| | this.container = document.body; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | $.extend( true, this, options ); |
| |
|
| | |
| | for ( key in this ) { |
| | if ( typeof this[ key ] === 'function' ) { |
| | this[ key ] = $.proxy( this[ key ], this ); |
| | } |
| | } |
| |
|
| | |
| | |
| | for ( key in elements ) { |
| | if ( ! this[ key ] ) { |
| | continue; |
| | } |
| |
|
| | this[ key ] = $( this[ key ] ).first(); |
| |
|
| | if ( ! this[ key ].length ) { |
| | delete this[ key ]; |
| | continue; |
| | } |
| |
|
| | if ( ! this[ key ].prop('id') ) { |
| | this[ key ].prop( 'id', '__wp-uploader-id-' + Uploader.uuid++ ); |
| | } |
| |
|
| | this.plupload[ elements[ key ] ] = this[ key ].prop('id'); |
| | } |
| |
|
| | |
| | if ( ! ( this.browser && this.browser.length ) && ! ( this.dropzone && this.dropzone.length ) ) { |
| | return; |
| | } |
| |
|
| | |
| | this.uploader = new plupload.Uploader( this.plupload ); |
| | delete this.plupload; |
| |
|
| | |
| | this.param( this.params || {} ); |
| | delete this.params; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | tryAgain = function( message, data, file ) { |
| | var times, id; |
| |
|
| | if ( ! data || ! data.responseHeaders ) { |
| | error( pluploadL10n.http_error_image, data, file, 'no-retry' ); |
| | return; |
| | } |
| |
|
| | id = data.responseHeaders.match( /x-wp-upload-attachment-id:\s*(\d+)/i ); |
| |
|
| | if ( id && id[1] ) { |
| | id = id[1]; |
| | } else { |
| | error( pluploadL10n.http_error_image, data, file, 'no-retry' ); |
| | return; |
| | } |
| |
|
| | times = tryAgainCount[ file.id ]; |
| |
|
| | if ( times && times > 4 ) { |
| | |
| | |
| | |
| | |
| | |
| | $.ajax({ |
| | type: 'post', |
| | url: ajaxurl, |
| | dataType: 'json', |
| | data: { |
| | action: 'media-create-image-subsizes', |
| | _wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce, |
| | attachment_id: id, |
| | _wp_upload_failed_cleanup: true, |
| | } |
| | }); |
| |
|
| | error( message, data, file, 'no-retry' ); |
| | return; |
| | } |
| |
|
| | if ( ! times ) { |
| | tryAgainCount[ file.id ] = 1; |
| | } else { |
| | tryAgainCount[ file.id ] = ++times; |
| | } |
| |
|
| | |
| | $.ajax({ |
| | type: 'post', |
| | url: ajaxurl, |
| | dataType: 'json', |
| | data: { |
| | action: 'media-create-image-subsizes', |
| | _wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce, |
| | attachment_id: id, |
| | } |
| | }).done( function( response ) { |
| | if ( response.success ) { |
| | fileUploaded( self.uploader, file, response ); |
| | } else { |
| | if ( response.data && response.data.message ) { |
| | message = response.data.message; |
| | } |
| |
|
| | error( message, data, file, 'no-retry' ); |
| | } |
| | }).fail( function( jqXHR ) { |
| | |
| | if ( jqXHR.status >= 500 && jqXHR.status < 600 ) { |
| | tryAgain( message, data, file ); |
| | return; |
| | } |
| |
|
| | error( message, data, file, 'no-retry' ); |
| | }); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | error = function( message, data, file, retry ) { |
| | var isImage = file.type && file.type.indexOf( 'image/' ) === 0, |
| | status = data && data.status; |
| |
|
| | |
| | if ( retry !== 'no-retry' && isImage && status >= 500 && status < 600 ) { |
| | tryAgain( message, data, file ); |
| | return; |
| | } |
| |
|
| | if ( file.attachment ) { |
| | file.attachment.destroy(); |
| | } |
| |
|
| | Uploader.errors.unshift({ |
| | message: message || pluploadL10n.default_error, |
| | data: data, |
| | file: file |
| | }); |
| |
|
| | self.error( message, data, file ); |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | fileUploaded = function( up, file, response ) { |
| | var complete; |
| |
|
| | |
| | _.each( ['file','loaded','size','percent'], function( key ) { |
| | file.attachment.unset( key ); |
| | } ); |
| |
|
| | file.attachment.set( _.extend( response.data, { uploading: false } ) ); |
| |
|
| | wp.media.model.Attachment.get( response.data.id, file.attachment ); |
| |
|
| | complete = Uploader.queue.all( function( attachment ) { |
| | return ! attachment.get( 'uploading' ); |
| | }); |
| |
|
| | if ( complete ) { |
| | Uploader.queue.reset(); |
| | } |
| |
|
| | self.success( file.attachment ); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | this.uploader.bind( 'init', function( uploader ) { |
| | var timer, active, dragdrop, |
| | dropzone = self.dropzone; |
| |
|
| | dragdrop = self.supports.dragdrop = uploader.features.dragdrop && ! Uploader.browser.mobile; |
| |
|
| | |
| | if ( ! dropzone ) { |
| | return; |
| | } |
| |
|
| | dropzone.toggleClass( 'supports-drag-drop', !! dragdrop ); |
| |
|
| | if ( ! dragdrop ) { |
| | return dropzone.unbind('.wp-uploader'); |
| | } |
| |
|
| | |
| | dropzone.on( 'dragover.wp-uploader', function() { |
| | if ( timer ) { |
| | clearTimeout( timer ); |
| | } |
| |
|
| | if ( active ) { |
| | return; |
| | } |
| |
|
| | dropzone.trigger('dropzone:enter').addClass('drag-over'); |
| | active = true; |
| | }); |
| |
|
| | dropzone.on('dragleave.wp-uploader, drop.wp-uploader', function() { |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | timer = setTimeout( function() { |
| | active = false; |
| | dropzone.trigger('dropzone:leave').removeClass('drag-over'); |
| | }, 0 ); |
| | }); |
| |
|
| | self.ready = true; |
| | $(self).trigger( 'uploader:ready' ); |
| | }); |
| |
|
| | this.uploader.bind( 'postinit', function( up ) { |
| | up.refresh(); |
| | self.init(); |
| | }); |
| |
|
| | this.uploader.init(); |
| |
|
| | if ( this.browser ) { |
| | this.browser.on( 'mouseenter', this.refresh ); |
| | } else { |
| | this.uploader.disableBrowse( true ); |
| | } |
| |
|
| | $( self ).on( 'uploader:ready', function() { |
| | $( '.moxie-shim-html5 input[type="file"]' ) |
| | .attr( { |
| | tabIndex: '-1', |
| | 'aria-hidden': 'true' |
| | } ); |
| | } ); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | this.uploader.bind( 'FilesAdded', function( up, files ) { |
| | _.each( files, function( file ) { |
| | var attributes, image; |
| |
|
| | |
| | if ( plupload.FAILED === file.status ) { |
| | return; |
| | } |
| |
|
| | if ( file.type === 'image/heic' && up.settings.heic_upload_error ) { |
| | |
| | Uploader.errors.unshift({ |
| | message: pluploadL10n.unsupported_image, |
| | data: {}, |
| | file: file |
| | }); |
| | } else if ( file.type === 'image/webp' && up.settings.webp_upload_error ) { |
| | |
| | error( pluploadL10n.noneditable_image, {}, file, 'no-retry' ); |
| | up.removeFile( file ); |
| | return; |
| | } else if ( file.type === 'image/avif' && up.settings.avif_upload_error ) { |
| | |
| | error( pluploadL10n.noneditable_image, {}, file, 'no-retry' ); |
| | up.removeFile( file ); |
| | return; |
| | } |
| |
|
| | |
| | attributes = _.extend({ |
| | file: file, |
| | uploading: true, |
| | date: new Date(), |
| | filename: file.name, |
| | menuOrder: 0, |
| | uploadedTo: wp.media.model.settings.post.id |
| | }, _.pick( file, 'loaded', 'size', 'percent' ) ); |
| |
|
| | |
| | image = /(?:jpe?g|png|gif)$/i.exec( file.name ); |
| |
|
| | |
| | if ( image ) { |
| | attributes.type = 'image'; |
| |
|
| | |
| | |
| | attributes.subtype = ( 'jpg' === image[0] ) ? 'jpeg' : image[0]; |
| | } |
| |
|
| | |
| | |
| | file.attachment = wp.media.model.Attachment.create( attributes ); |
| | Uploader.queue.add( file.attachment ); |
| |
|
| | self.added( file.attachment ); |
| | }); |
| |
|
| | up.refresh(); |
| | up.start(); |
| | }); |
| |
|
| | this.uploader.bind( 'UploadProgress', function( up, file ) { |
| | file.attachment.set( _.pick( file, 'loaded', 'percent' ) ); |
| | self.progress( file.attachment ); |
| | }); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | this.uploader.bind( 'FileUploaded', function( up, file, response ) { |
| |
|
| | try { |
| | response = JSON.parse( response.response ); |
| | } catch ( e ) { |
| | return error( pluploadL10n.default_error, e, file ); |
| | } |
| |
|
| | if ( ! _.isObject( response ) || _.isUndefined( response.success ) ) { |
| | return error( pluploadL10n.default_error, null, file ); |
| | } else if ( ! response.success ) { |
| | return error( response.data && response.data.message, response.data, file ); |
| | } |
| |
|
| | |
| | fileUploaded( up, file, response ); |
| | }); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | this.uploader.bind( 'Error', function( up, pluploadError ) { |
| | var message = pluploadL10n.default_error, |
| | key; |
| |
|
| | |
| | for ( key in Uploader.errorMap ) { |
| | if ( pluploadError.code === plupload[ key ] ) { |
| | message = Uploader.errorMap[ key ]; |
| |
|
| | if ( typeof message === 'function' ) { |
| | message = message( pluploadError.file, pluploadError ); |
| | } |
| |
|
| | break; |
| | } |
| | } |
| |
|
| | error( message, pluploadError, pluploadError.file ); |
| | up.refresh(); |
| | }); |
| |
|
| | }; |
| |
|
| | |
| | $.extend( Uploader, _wpPluploadSettings ); |
| |
|
| | Uploader.uuid = 0; |
| |
|
| | |
| | Uploader.errorMap = { |
| | 'FAILED': pluploadL10n.upload_failed, |
| | 'FILE_EXTENSION_ERROR': pluploadL10n.invalid_filetype, |
| | 'IMAGE_FORMAT_ERROR': pluploadL10n.not_an_image, |
| | 'IMAGE_MEMORY_ERROR': pluploadL10n.image_memory_exceeded, |
| | 'IMAGE_DIMENSIONS_ERROR': pluploadL10n.image_dimensions_exceeded, |
| | 'GENERIC_ERROR': pluploadL10n.upload_failed, |
| | 'IO_ERROR': pluploadL10n.io_error, |
| | 'SECURITY_ERROR': pluploadL10n.security_error, |
| |
|
| | 'FILE_SIZE_ERROR': function( file ) { |
| | return pluploadL10n.file_exceeds_size_limit.replace( '%s', file.name ); |
| | }, |
| |
|
| | 'HTTP_ERROR': function( file ) { |
| | if ( file.type && file.type.indexOf( 'image/' ) === 0 ) { |
| | return pluploadL10n.http_error_image; |
| | } |
| |
|
| | return pluploadL10n.http_error; |
| | }, |
| | }; |
| |
|
| | $.extend( Uploader.prototype, { |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | param: function( key, value ) { |
| | if ( arguments.length === 1 && typeof key === 'string' ) { |
| | return this.uploader.settings.multipart_params[ key ]; |
| | } |
| |
|
| | if ( arguments.length > 1 ) { |
| | this.uploader.settings.multipart_params[ key ] = value; |
| | } else { |
| | $.extend( this.uploader.settings.multipart_params, key ); |
| | } |
| | }, |
| |
|
| | |
| | |
| | |
| | |
| | init: function() {}, |
| | error: function() {}, |
| | success: function() {}, |
| | added: function() {}, |
| | progress: function() {}, |
| | complete: function() {}, |
| | refresh: function() { |
| | var node, attached, container, id; |
| |
|
| | if ( this.browser ) { |
| | node = this.browser[0]; |
| |
|
| | |
| | while ( node ) { |
| | if ( node === document.body ) { |
| | attached = true; |
| | break; |
| | } |
| | node = node.parentNode; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | if ( ! attached ) { |
| | id = 'wp-uploader-browser-' + this.uploader.id; |
| |
|
| | container = $( '#' + id ); |
| | if ( ! container.length ) { |
| | container = $('<div class="wp-uploader-browser" />').css({ |
| | position: 'fixed', |
| | top: '-1000px', |
| | left: '-1000px', |
| | height: 0, |
| | width: 0 |
| | }).attr( 'id', 'wp-uploader-browser-' + this.uploader.id ).appendTo('body'); |
| | } |
| |
|
| | container.append( this.browser ); |
| | } |
| | } |
| |
|
| | this.uploader.refresh(); |
| | } |
| | }); |
| |
|
| | |
| | |
| | Uploader.queue = new wp.media.model.Attachments( [], { query: false }); |
| |
|
| | |
| | Uploader.errors = new Backbone.Collection(); |
| |
|
| | exports.Uploader = Uploader; |
| | })( wp, jQuery ); |
| |
|