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

761 lines
14 KiB
JavaScript

(function($, undefined){
/**
* acf.newCompatibility
*
* Inserts a new __proto__ object compatibility layer
*
* @date 15/2/18
* @since 5.6.9
*
* @param object instance The object to modify.
* @param object compatibilty Optional. The compatibilty layer.
* @return object compatibilty
*/
acf.newCompatibility = function( instance, compatibilty ){
// defaults
compatibilty = compatibilty || {};
// inherit __proto_-
compatibilty.__proto__ = instance.__proto__;
// inject
instance.__proto__ = compatibilty;
// reference
instance.compatibility = compatibilty;
// return
return compatibilty;
};
/**
* acf.getCompatibility
*
* Returns the compatibility layer for a given instance
*
* @date 13/3/18
* @since 5.6.9
*
* @param object instance The object to look in.
* @return object|null compatibility The compatibility object or null on failure.
*/
acf.getCompatibility = function( instance ) {
return instance.compatibility || null;
};
/**
* acf (compatibility)
*
* Compatibility layer for the acf object
*
* @date 15/2/18
* @since 5.6.9
*
* @param void
* @return void
*/
var _acf = acf.newCompatibility(acf, {
// storage
l10n: {},
o: {},
fields: {},
// changed function names
update: acf.set,
add_action: acf.addAction,
remove_action: acf.removeAction,
do_action: acf.doAction,
add_filter: acf.addFilter,
remove_filter: acf.removeFilter,
apply_filters: acf.applyFilters,
parse_args: acf.parseArgs,
disable_el: acf.disable,
disable_form: acf.disable,
enable_el: acf.enable,
enable_form: acf.enable,
update_user_setting: acf.updateUserSetting,
prepare_for_ajax: acf.prepareForAjax,
is_ajax_success: acf.isAjaxSuccess,
remove_el: acf.remove,
remove_tr: acf.remove,
str_replace: acf.strReplace,
render_select: acf.renderSelect,
get_uniqid: acf.uniqid,
serialize_form: acf.serialize,
esc_html: acf.strEscape,
str_sanitize: acf.strSanitize,
});
_acf._e = function( k1, k2 ){
// defaults
k1 = k1 || '';
k2 = k2 || '';
// compability
var compatKey = k2 ? k1 + '.' + k2 : k1;
var compats = {
'image.select': 'Select Image',
'image.edit': 'Edit Image',
'image.update': 'Update Image'
};
if( compats[compatKey] ) {
return acf.__(compats[compatKey]);
}
// try k1
var string = this.l10n[ k1 ] || '';
// try k2
if( k2 ) {
string = string[ k2 ] || '';
}
// return
return string;
};
_acf.get_selector = function( s ) {
// vars
var selector = '.acf-field';
// bail early if no search
if( !s ) {
return selector;
}
// compatibility with object
if( $.isPlainObject(s) ) {
if( $.isEmptyObject(s) ) {
return selector;
} else {
for( var k in s ) { s = s[k]; break; }
}
}
// append
selector += '-' + s;
// replace underscores (split/join replaces all and is faster than regex!)
selector = acf.strReplace('_', '-', selector);
// remove potential double up
selector = acf.strReplace('field-field-', 'field-', selector);
// return
return selector;
};
_acf.get_fields = function( s, $el, all ){
// args
var args = {
is: s || '',
parent: $el || false,
suppressFilters: all || false,
};
// change 'field_123' to '.acf-field-123'
if( args.is ) {
args.is = this.get_selector( args.is );
}
// return
return acf.findFields(args);
};
_acf.get_field = function( s, $el ){
// get fields
var $fields = this.get_fields.apply(this, arguments);
// return
if( $fields.length ) {
return $fields.first();
} else {
return false;
}
};
_acf.get_closest_field = function( $el, s ){
return $el.closest( this.get_selector(s) );
};
_acf.get_field_wrap = function( $el ){
return $el.closest( this.get_selector() );
};
_acf.get_field_key = function( $field ){
return $field.data('key');
};
_acf.get_field_type = function( $field ){
return $field.data('type');
};
_acf.get_data = function( $el, defaults ){
return acf.parseArgs( $el.data(), defaults );
};
_acf.maybe_get = function( obj, key, value ){
// default
if( value === undefined ) {
value = null;
}
// get keys
keys = String(key).split('.');
// acf.isget
for( var i = 0; i < keys.length; i++ ) {
if( !obj.hasOwnProperty(keys[i]) ) {
return value;
}
obj = obj[ keys[i] ];
}
return obj;
};
/**
* hooks
*
* Modify add_action and add_filter functions to add compatibility with changed $field parameter
* Using the acf.add_action() or acf.add_filter() functions will interpret new field parameters as jQuery $field
*
* @date 12/5/18
* @since 5.6.9
*
* @param void
* @return void
*/
var compatibleArgument = function( arg ){
return ( arg instanceof acf.Field ) ? arg.$el : arg;
};
var compatibleArguments = function( args ){
return acf.arrayArgs( args ).map( compatibleArgument );
}
var compatibleCallback = function( origCallback ){
return function(){
// convert to compatible arguments
if( arguments.length ) {
var args = compatibleArguments(arguments);
// add default argument for 'ready', 'append' and 'load' events
} else {
var args = [ $(document) ];
}
// return
return origCallback.apply(this, args);
}
}
_acf.add_action = function( action, callback, priority, context ){
// handle multiple actions
var actions = action.split(' ');
var length = actions.length;
if( length > 1 ) {
for( var i = 0; i < length; i++) {
action = actions[i];
_acf.add_action.apply(this, arguments);
}
return this;
}
// single
var callback = compatibleCallback(callback);
return acf.addAction.apply(this, arguments);
};
_acf.add_filter = function( action, callback, priority, context ){
var callback = compatibleCallback(callback);
return acf.addFilter.apply(this, arguments);
};
/*
* acf.model
*
* This model acts as a scafold for action.event driven modules
*
* @type object
* @date 8/09/2014
* @since 5.0.0
*
* @param (object)
* @return (object)
*/
_acf.model = {
actions: {},
filters: {},
events: {},
extend: function( args ){
// extend
var model = $.extend( {}, this, args );
// setup actions
$.each(model.actions, function( name, callback ){
model._add_action( name, callback );
});
// setup filters
$.each(model.filters, function( name, callback ){
model._add_filter( name, callback );
});
// setup events
$.each(model.events, function( name, callback ){
model._add_event( name, callback );
});
// return
return model;
},
_add_action: function( name, callback ) {
// split
var model = this,
data = name.split(' ');
// add missing priority
var name = data[0] || '',
priority = data[1] || 10;
// add action
acf.add_action(name, model[ callback ], priority, model);
},
_add_filter: function( name, callback ) {
// split
var model = this,
data = name.split(' ');
// add missing priority
var name = data[0] || '',
priority = data[1] || 10;
// add action
acf.add_filter(name, model[ callback ], priority, model);
},
_add_event: function( name, callback ) {
// vars
var model = this,
i = name.indexOf(' '),
event = (i > 0) ? name.substr(0,i) : name,
selector = (i > 0) ? name.substr(i+1) : '';
// event
var fn = function( e ){
// append $el to event object
e.$el = $(this);
// append $field to event object (used in field group)
if( acf.field_group ) {
e.$field = e.$el.closest('.acf-field-object');
}
// event
if( typeof model.event === 'function' ) {
e = model.event( e );
}
// callback
model[ callback ].apply(model, arguments);
};
// add event
if( selector ) {
$(document).on(event, selector, fn);
} else {
$(document).on(event, fn);
}
},
get: function( name, value ){
// defaults
value = value || null;
// get
if( typeof this[ name ] !== 'undefined' ) {
value = this[ name ];
}
// return
return value;
},
set: function( name, value ){
// set
this[ name ] = value;
// function for 3rd party
if( typeof this[ '_set_' + name ] === 'function' ) {
this[ '_set_' + name ].apply(this);
}
// return for chaining
return this;
}
};
/*
* field
*
* This model sets up many of the field's interactions
*
* @type function
* @date 21/02/2014
* @since 3.5.1
*
* @param n/a
* @return n/a
*/
_acf.field = acf.model.extend({
type: '',
o: {},
$field: null,
_add_action: function( name, callback ) {
// vars
var model = this;
// update name
name = name + '_field/type=' + model.type;
// add action
acf.add_action(name, function( $field ){
// focus
model.set('$field', $field);
// callback
model[ callback ].apply(model, arguments);
});
},
_add_filter: function( name, callback ) {
// vars
var model = this;
// update name
name = name + '_field/type=' + model.type;
// add action
acf.add_filter(name, function( $field ){
// focus
model.set('$field', $field);
// callback
model[ callback ].apply(model, arguments);
});
},
_add_event: function( name, callback ) {
// vars
var model = this,
event = name.substr(0,name.indexOf(' ')),
selector = name.substr(name.indexOf(' ')+1),
context = acf.get_selector(model.type);
// add event
$(document).on(event, context + ' ' + selector, function( e ){
// vars
var $el = $(this);
var $field = acf.get_closest_field( $el, model.type );
// bail early if no field
if( !$field.length ) return;
// focus
if( !$field.is(model.$field) ) {
model.set('$field', $field);
}
// append to event
e.$el = $el;
e.$field = $field;
// callback
model[ callback ].apply(model, [e]);
});
},
_set_$field: function(){
// callback
if( typeof this.focus === 'function' ) {
this.focus();
}
},
// depreciated
doFocus: function( $field ){
return this.set('$field', $field);
}
});
/**
* validation
*
* description
*
* @date 15/2/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
var _validation = acf.newCompatibility(acf.validation, {
remove_error: function( $field ){
acf.getField( $field ).removeError();
},
add_warning: function( $field, message ){
acf.getField( $field ).showNotice({
text: message,
type: 'warning',
timeout: 1000
});
},
fetch: acf.validateForm,
enableSubmit: acf.enableSubmit,
disableSubmit: acf.disableSubmit,
showSpinner: acf.showSpinner,
hideSpinner: acf.hideSpinner,
unlockForm: acf.unlockForm,
lockForm: acf.lockForm
});
/**
* tooltip
*
* description
*
* @date 15/2/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
_acf.tooltip = {
tooltip: function( text, $el ){
var tooltip = acf.newTooltip({
text: text,
target: $el
});
// return
return tooltip.$el;
},
temp: function( text, $el ){
var tooltip = acf.newTooltip({
text: text,
target: $el,
timeout: 250
});
},
confirm: function( $el, callback, text, button_y, button_n ){
var tooltip = acf.newTooltip({
confirm: true,
text: text,
target: $el,
confirm: function(){
callback(true);
},
cancel: function(){
callback(false);
}
});
},
confirm_remove: function( $el, callback ){
var tooltip = acf.newTooltip({
confirmRemove: true,
target: $el,
confirm: function(){
callback(true);
},
cancel: function(){
callback(false);
}
});
},
};
/**
* tooltip
*
* description
*
* @date 15/2/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
_acf.media = new acf.Model({
activeFrame: false,
actions: {
'new_media_popup': 'onNewMediaPopup'
},
frame: function(){
return this.activeFrame;
},
onNewMediaPopup: function( popup ){
this.activeFrame = popup.frame;
},
popup: function( props ){
// update props
if( props.mime_types ) {
props.allowedTypes = props.mime_types;
}
if( props.id ) {
props.attachment = props.id;
}
// new
var popup = acf.newMediaPopup( props );
// append
/*
if( props.selected ) {
popup.selected = props.selected;
}
*/
// return
return popup.frame;
}
});
/**
* Select2
*
* description
*
* @date 11/6/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
_acf.select2 = {
init: function( $select, args, $field ){
// compatible args
if( args.allow_null ) {
args.allowNull = args.allow_null;
}
if( args.ajax_action ) {
args.ajaxAction = args.ajax_action;
}
if( $field ) {
args.field = acf.getField($field);
}
// return
return acf.newSelect2( $select, args );
},
destroy: function( $select ){
return acf.getInstance( $select ).destroy();
},
};
/**
* postbox
*
* description
*
* @date 11/6/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
_acf.postbox = {
render: function( args ){
// compatible args
if( args.edit_url ) {
args.editLink = args.edit_url;
}
if( args.edit_title ) {
args.editTitle = args.edit_title;
}
// return
return acf.newPostbox( args );
}
};
/**
* acf.screen
*
* description
*
* @date 11/6/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.newCompatibility(acf.screen, {
update: function(){
return this.set.apply(this, arguments);
},
fetch: acf.screen.check
});
_acf.ajax = acf.screen;
})(jQuery);