372 lines
7.5 KiB
JavaScript
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); |