Files
wordpress-preseed/wp-content/plugins/advanced-custom-fields/assets/build/js/_acf-fields.js
2019-09-11 19:08:46 +02:00

372 lines
7.5 KiB
JavaScript

(function($, undefined){
/**
* findFields
*
* Returns a jQuery selection object of acf fields.
*
* @date 14/12/17
* @since 5.6.5
*
* @param object $args {
* Optional. Arguments to find fields.
*
* @type string key The field's key (data-attribute).
* @type string name The field's name (data-attribute).
* @type string type The field's type (data-attribute).
* @type string is jQuery selector to compare against.
* @type jQuery parent jQuery element to search within.
* @type jQuery sibling jQuery element to search alongside.
* @type limit int The number of fields to find.
* @type suppressFilters bool Whether to allow filters to add/remove results. Default behaviour will ignore clone fields.
* }
* @return jQuery
*/
acf.findFields = function( args ){
// vars
var selector = '.acf-field';
var $fields = false;
// args
args = acf.parseArgs(args, {
key: '',
name: '',
type: '',
is: '',
parent: false,
sibling: false,
limit: false,
visible: false,
suppressFilters: false,
});
// filter args
if( !args.suppressFilters ) {
args = acf.applyFilters('find_fields_args', args);
}
// key
if( args.key ) {
selector += '[data-key="' + args.key + '"]';
}
// type
if( args.type ) {
selector += '[data-type="' + args.type + '"]';
}
// name
if( args.name ) {
selector += '[data-name="' + args.name + '"]';
}
// is
if( args.is ) {
selector += args.is;
}
// visibility
if( args.visible ) {
selector += ':visible';
}
// query
if( args.parent ) {
$fields = args.parent.find( selector );
} else if( args.sibling ) {
$fields = args.sibling.siblings( selector );
} else {
$fields = $( selector );
}
// filter
if( !args.suppressFilters ) {
$fields = $fields.not('.acf-clone .acf-field');
$fields = acf.applyFilters('find_fields', $fields);
}
// limit
if( args.limit ) {
$fields = $fields.slice( 0, args.limit );
}
// return
return $fields;
};
/**
* findField
*
* Finds a specific field with jQuery
*
* @date 14/12/17
* @since 5.6.5
*
* @param string key The field's key.
* @param jQuery $parent jQuery element to search within.
* @return jQuery
*/
acf.findField = function( key, $parent ){
return acf.findFields({
key: key,
limit: 1,
parent: $parent,
suppressFilters: true
});
};
/**
* getField
*
* Returns a field instance
*
* @date 14/12/17
* @since 5.6.5
*
* @param jQuery|string $field jQuery element or field key.
* @return object
*/
acf.getField = function( $field ){
// allow jQuery
if( $field instanceof jQuery ) {
// find fields
} else {
$field = acf.findField( $field );
}
// instantiate
var field = $field.data('acf');
if( !field ) {
field = acf.newField( $field );
}
// return
return field;
};
/**
* getFields
*
* Returns multiple field instances
*
* @date 14/12/17
* @since 5.6.5
*
* @param jQuery|object $fields jQuery elements or query args.
* @return array
*/
acf.getFields = function( $fields ){
// allow jQuery
if( $fields instanceof jQuery ) {
// find fields
} else {
$fields = acf.findFields( $fields );
}
// loop
var fields = [];
$fields.each(function(){
var field = acf.getField( $(this) );
fields.push( field );
});
// return
return fields;
};
/**
* findClosestField
*
* Returns the closest jQuery field element
*
* @date 9/4/18
* @since 5.6.9
*
* @param jQuery $el
* @return jQuery
*/
acf.findClosestField = function( $el ){
return $el.closest('.acf-field');
};
/**
* getClosestField
*
* Returns the closest field instance
*
* @date 22/1/18
* @since 5.6.5
*
* @param jQuery $el
* @return object
*/
acf.getClosestField = function( $el ){
var $field = acf.findClosestField( $el );
return this.getField( $field );
};
/**
* addGlobalFieldAction
*
* Sets up callback logic for global field actions
*
* @date 15/6/18
* @since 5.6.9
*
* @param string action
* @return void
*/
var addGlobalFieldAction = function( action ){
// vars
var globalAction = action;
var pluralAction = action + '_fields'; // ready_fields
var singleAction = action + '_field'; // ready_field
// global action
var globalCallback = function( $el /*, arg1, arg2, etc*/ ){
//console.log( action, arguments );
// get args [$el, ...]
var args = acf.arrayArgs( arguments );
var extraArgs = args.slice(1);
// find fields
var fields = acf.getFields({ parent: $el });
// check
if( fields.length ) {
// pluralAction
var pluralArgs = [ pluralAction, fields ].concat( extraArgs );
acf.doAction.apply(null, pluralArgs);
}
};
// plural action
var pluralCallback = function( fields /*, arg1, arg2, etc*/ ){
//console.log( pluralAction, arguments );
// get args [fields, ...]
var args = acf.arrayArgs( arguments );
var extraArgs = args.slice(1);
// loop
fields.map(function( field, i ){
//setTimeout(function(){
// singleAction
var singleArgs = [ singleAction, field ].concat( extraArgs );
acf.doAction.apply(null, singleArgs);
//}, i * 100);
});
};
// add actions
acf.addAction(globalAction, globalCallback);
acf.addAction(pluralAction, pluralCallback);
// also add single action
addSingleFieldAction( action );
}
/**
* addSingleFieldAction
*
* Sets up callback logic for single field actions
*
* @date 15/6/18
* @since 5.6.9
*
* @param string action
* @return void
*/
var addSingleFieldAction = function( action ){
// vars
var singleAction = action + '_field'; // ready_field
var singleEvent = action + 'Field'; // readyField
// single action
var singleCallback = function( field /*, arg1, arg2, etc*/ ){
//console.log( singleAction, arguments );
// get args [field, ...]
var args = acf.arrayArgs( arguments );
var extraArgs = args.slice(1);
// action variations (ready_field/type=image)
var variations = ['type', 'name', 'key'];
variations.map(function( variation ){
// vars
var prefix = '/' + variation + '=' + field.get(variation);
// singleAction
args = [ singleAction + prefix , field ].concat( extraArgs );
acf.doAction.apply(null, args);
});
// event
if( singleFieldEvents.indexOf(action) > -1 ) {
field.trigger(singleEvent, extraArgs);
}
};
// add actions
acf.addAction(singleAction, singleCallback);
}
// vars
var globalFieldActions = [ 'prepare', 'ready', 'load', 'append', 'remove', 'unmount', 'remount', 'sortstart', 'sortstop', 'show', 'hide', 'unload' ];
var singleFieldActions = [ 'valid', 'invalid', 'enable', 'disable', 'new' ];
var singleFieldEvents = [ 'remove', 'unmount', 'remount', 'sortstart', 'sortstop', 'show', 'hide', 'unload', 'valid', 'invalid', 'enable', 'disable' ];
// add
globalFieldActions.map( addGlobalFieldAction );
singleFieldActions.map( addSingleFieldAction );
/**
* fieldsEventManager
*
* Manages field actions and events
*
* @date 15/12/17
* @since 5.6.5
*
* @param void
* @param void
*/
var fieldsEventManager = new acf.Model({
id: 'fieldsEventManager',
events: {
'click .acf-field a[href="#"]': 'onClick',
'change .acf-field': 'onChange'
},
onClick: function( e ){
// prevent default of any link with an href of #
e.preventDefault();
},
onChange: function(){
// preview hack allows post to save with no title or content
$('#_acf_changed').val(1);
}
});
})(jQuery);