You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
3.9 KiB
151 lines
3.9 KiB
9 months ago
|
( function ( $, rwmb ) {
|
||
|
'use strict';
|
||
|
|
||
|
var file = {};
|
||
|
|
||
|
/**
|
||
|
* Handles a click on add new file.
|
||
|
* Expects `this` to equal the clicked element.
|
||
|
*
|
||
|
* @param event Click event.
|
||
|
*/
|
||
|
file.addHandler = function ( event ) {
|
||
|
event.preventDefault();
|
||
|
|
||
|
var $this = $( this ),
|
||
|
$clone = $this.prev().clone();
|
||
|
|
||
|
$clone.insertBefore( this ).val( '' );
|
||
|
|
||
|
var $fieldInput = $this.closest( '.rwmb-input' );
|
||
|
file.updateVisibility.call( $fieldInput.find( '.rwmb-files' ) );
|
||
|
file.setRequired.call( $fieldInput );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Handles a click on delete new file.
|
||
|
* Expects `this` to equal the clicked element.
|
||
|
*
|
||
|
* @param event Click event.
|
||
|
*/
|
||
|
file.deleteHandler = function ( event ) {
|
||
|
event.preventDefault();
|
||
|
|
||
|
var $this = $( this ),
|
||
|
$item = $this.closest( 'li' ),
|
||
|
$uploaded = $this.closest( '.rwmb-files' ),
|
||
|
$metaBox = $uploaded.closest( '.rwmb-meta-box' );
|
||
|
|
||
|
$item.remove();
|
||
|
file.updateVisibility.call( $uploaded );
|
||
|
|
||
|
file.setRequired.call( $uploaded.parent() );
|
||
|
|
||
|
if ( 1 > $uploaded.data( 'force_delete' ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$.post( ajaxurl, {
|
||
|
action: 'rwmb_delete_file',
|
||
|
_ajax_nonce: $uploaded.data( 'delete_nonce' ),
|
||
|
field_id: $uploaded.data( 'field_id' ),
|
||
|
field_name: $uploaded.data( 'field_name' ),
|
||
|
object_type: $metaBox.data( 'object-type' ),
|
||
|
object_id: $metaBox.data( 'object-id' ),
|
||
|
attachment_id: $this.data( 'attachment_id' )
|
||
|
}, function ( response ) {
|
||
|
if ( !response.success ) {
|
||
|
alert( response.data );
|
||
|
}
|
||
|
}, 'json' );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Sort uploaded files.
|
||
|
* Expects `this` to equal the uploaded file list.
|
||
|
*/
|
||
|
file.sort = function () {
|
||
|
$( this ).sortable( {
|
||
|
items: 'li',
|
||
|
start: function ( event, ui ) {
|
||
|
ui.placeholder.height( ui.helper.outerHeight() );
|
||
|
ui.placeholder.width( ui.helper.outerWidth() );
|
||
|
},
|
||
|
update: function ( event, ui ) {
|
||
|
ui.item.find( rwmb.inputSelectors ).first().trigger( 'mb_change' );
|
||
|
}
|
||
|
} );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Update visibility of upload inputs and Add new file link.
|
||
|
* Expect this equal to the uploaded file list.
|
||
|
*/
|
||
|
file.updateVisibility = function () {
|
||
|
var $uploaded = $( this ),
|
||
|
max = parseInt( $uploaded.data( 'max_file_uploads' ), 10 ),
|
||
|
$new = $uploaded.siblings( '.rwmb-file-new' ),
|
||
|
$add = $new.find( '.rwmb-file-add' ),
|
||
|
numFiles = $uploaded.children().length,
|
||
|
numInputs = $new.find( '.rwmb-file-input' ).length;
|
||
|
|
||
|
$uploaded.toggle( 0 < numFiles );
|
||
|
if ( 0 === max ) {
|
||
|
return;
|
||
|
}
|
||
|
$new.toggle( numFiles < max );
|
||
|
$add.toggle( numFiles + numInputs < max );
|
||
|
};
|
||
|
|
||
|
// Reset field when cloning.
|
||
|
file.resetClone = function () {
|
||
|
var $this = $( this ),
|
||
|
$clone = $this.closest( '.rwmb-clone' ),
|
||
|
$list = $clone.find( '.rwmb-files' );
|
||
|
|
||
|
$list.empty();
|
||
|
|
||
|
$clone.find( '.rwmb-file-new' ).each( function () {
|
||
|
var inputName = '_file_' + rwmb.uniqid(),
|
||
|
$key = $( this ).siblings( '.rwmb-file-index' );
|
||
|
$( this ).find( '.rwmb-file-input' ).attr( 'name', inputName + '[]' ).not( ':first' ).remove();
|
||
|
$key.val( inputName );
|
||
|
} );
|
||
|
|
||
|
file.updateVisibility.call( $list );
|
||
|
};
|
||
|
|
||
|
// Set 'required' attribute. 'this' is the wrapper field input.
|
||
|
file.setRequired = function () {
|
||
|
var $this = $( this ),
|
||
|
$uploaded = $this.find( '.rwmb-files' ),
|
||
|
$inputs = $this.find( '.rwmb-file-new input' );
|
||
|
$inputs.prop( 'required', false );
|
||
|
|
||
|
if ( $uploaded.children().length ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var $firstInput = $inputs.first();
|
||
|
if ( 1 === $firstInput.data( 'required' ) ) {
|
||
|
$firstInput.prop( 'required', true );
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function init( e ) {
|
||
|
var $el = $( e.target ),
|
||
|
$uploaded = $el.find( '.rwmb-files' );
|
||
|
|
||
|
$uploaded.each( file.sort );
|
||
|
$uploaded.each( file.updateVisibility );
|
||
|
|
||
|
$el.find( '.rwmb-file-wrapper, .rwmb-image-wrapper' ).each( file.setRequired );
|
||
|
}
|
||
|
|
||
|
rwmb.$document
|
||
|
.on( 'mb_ready', init )
|
||
|
.on( 'click', '.rwmb-file-add', file.addHandler )
|
||
|
.on( 'click', '.rwmb-file-delete', file.deleteHandler )
|
||
|
.on( 'clone', '.rwmb-file-input', file.resetClone );
|
||
|
} )( jQuery, rwmb );
|