wp_back/wp-content/plugins/advanced-custom-fields/assets/build/js/acf.js

4459 lines
102 KiB
JavaScript
Raw Normal View History

2024-05-20 15:37:46 +03:00
/******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf-hooks.js":
/*!********************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf-hooks.js ***!
\********************************************************************/
/***/ (function() {
(function (window, undefined) {
'use strict';
/**
* Handles managing all events for whatever you plug it into. Priorities for hooks are based on lowest to highest in
* that, lowest priority hooks are fired first.
*/
var EventManager = function () {
/**
* Maintain a reference to the object scope so our public methods never get confusing.
*/
var MethodsAvailable = {
removeFilter: removeFilter,
applyFilters: applyFilters,
addFilter: addFilter,
removeAction: removeAction,
doAction: doAction,
addAction: addAction,
storage: getStorage
};
/**
* Contains the hooks that get registered with this EventManager. The array for storage utilizes a "flat"
* object literal such that looking up the hook utilizes the native object literal hash.
*/
var STORAGE = {
actions: {},
filters: {}
};
function getStorage() {
return STORAGE;
}
/**
* Adds an action to the event manager.
*
* @param action Must contain namespace.identifier
* @param callback Must be a valid callback function before this action is added
* @param [priority=10] Used to control when the function is executed in relation to other callbacks bound to the same hook
* @param [context] Supply a value to be used for this
*/
function addAction(action, callback, priority, context) {
if (typeof action === 'string' && typeof callback === 'function') {
priority = parseInt(priority || 10, 10);
_addHook('actions', action, callback, priority, context);
}
return MethodsAvailable;
}
/**
* Performs an action if it exists. You can pass as many arguments as you want to this function; the only rule is
* that the first argument must always be the action.
*/
function doAction( /* action, arg1, arg2, ... */
) {
var args = Array.prototype.slice.call(arguments);
var action = args.shift();
if (typeof action === 'string') {
_runHook('actions', action, args);
}
return MethodsAvailable;
}
/**
* Removes the specified action if it contains a namespace.identifier & exists.
*
* @param action The action to remove
* @param [callback] Callback function to remove
*/
function removeAction(action, callback) {
if (typeof action === 'string') {
_removeHook('actions', action, callback);
}
return MethodsAvailable;
}
/**
* Adds a filter to the event manager.
*
* @param filter Must contain namespace.identifier
* @param callback Must be a valid callback function before this action is added
* @param [priority=10] Used to control when the function is executed in relation to other callbacks bound to the same hook
* @param [context] Supply a value to be used for this
*/
function addFilter(filter, callback, priority, context) {
if (typeof filter === 'string' && typeof callback === 'function') {
priority = parseInt(priority || 10, 10);
_addHook('filters', filter, callback, priority, context);
}
return MethodsAvailable;
}
/**
* Performs a filter if it exists. You should only ever pass 1 argument to be filtered. The only rule is that
* the first argument must always be the filter.
*/
function applyFilters( /* filter, filtered arg, arg2, ... */
) {
var args = Array.prototype.slice.call(arguments);
var filter = args.shift();
if (typeof filter === 'string') {
return _runHook('filters', filter, args);
}
return MethodsAvailable;
}
/**
* Removes the specified filter if it contains a namespace.identifier & exists.
*
* @param filter The action to remove
* @param [callback] Callback function to remove
*/
function removeFilter(filter, callback) {
if (typeof filter === 'string') {
_removeHook('filters', filter, callback);
}
return MethodsAvailable;
}
/**
* Removes the specified hook by resetting the value of it.
*
* @param type Type of hook, either 'actions' or 'filters'
* @param hook The hook (namespace.identifier) to remove
* @private
*/
function _removeHook(type, hook, callback, context) {
if (!STORAGE[type][hook]) {
return;
}
if (!callback) {
STORAGE[type][hook] = [];
} else {
var handlers = STORAGE[type][hook];
var i;
if (!context) {
for (i = handlers.length; i--;) {
if (handlers[i].callback === callback) {
handlers.splice(i, 1);
}
}
} else {
for (i = handlers.length; i--;) {
var handler = handlers[i];
if (handler.callback === callback && handler.context === context) {
handlers.splice(i, 1);
}
}
}
}
}
/**
* Adds the hook to the appropriate storage container
*
* @param type 'actions' or 'filters'
* @param hook The hook (namespace.identifier) to add to our event manager
* @param callback The function that will be called when the hook is executed.
* @param priority The priority of this hook. Must be an integer.
* @param [context] A value to be used for this
* @private
*/
function _addHook(type, hook, callback, priority, context) {
var hookObject = {
callback: callback,
priority: priority,
context: context
};
// Utilize 'prop itself' : http://jsperf.com/hasownproperty-vs-in-vs-undefined/19
var hooks = STORAGE[type][hook];
if (hooks) {
hooks.push(hookObject);
hooks = _hookInsertSort(hooks);
} else {
hooks = [hookObject];
}
STORAGE[type][hook] = hooks;
}
/**
* Use an insert sort for keeping our hooks organized based on priority. This function is ridiculously faster
* than bubble sort, etc: http://jsperf.com/javascript-sort
*
* @param hooks The custom array containing all of the appropriate hooks to perform an insert sort on.
* @private
*/
function _hookInsertSort(hooks) {
var tmpHook, j, prevHook;
for (var i = 1, len = hooks.length; i < len; i++) {
tmpHook = hooks[i];
j = i;
while ((prevHook = hooks[j - 1]) && prevHook.priority > tmpHook.priority) {
hooks[j] = hooks[j - 1];
--j;
}
hooks[j] = tmpHook;
}
return hooks;
}
/**
* Runs the specified hook. If it is an action, the value is not modified but if it is a filter, it is.
*
* @param type 'actions' or 'filters'
* @param hook The hook ( namespace.identifier ) to be ran.
* @param args Arguments to pass to the action/filter. If it's a filter, args is actually a single parameter.
* @private
*/
function _runHook(type, hook, args) {
var handlers = STORAGE[type][hook];
if (!handlers) {
return type === 'filters' ? args[0] : false;
}
var i = 0,
len = handlers.length;
if (type === 'filters') {
for (; i < len; i++) {
args[0] = handlers[i].callback.apply(handlers[i].context, args);
}
} else {
for (; i < len; i++) {
handlers[i].callback.apply(handlers[i].context, args);
}
}
return type === 'filters' ? args[0] : true;
}
// return all of the publicly available methods
return MethodsAvailable;
};
// instantiate
acf.hooks = new EventManager();
})(window);
/***/ }),
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf-modal.js":
/*!********************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf-modal.js ***!
\********************************************************************/
/***/ (function() {
(function ($, undefined) {
acf.models.Modal = acf.Model.extend({
data: {
title: '',
content: '',
toolbar: ''
},
events: {
'click .acf-modal-close': 'onClickClose'
},
setup: function (props) {
$.extend(this.data, props);
this.$el = $();
this.render();
},
initialize: function () {
this.open();
},
render: function () {
// Extract vars.
var title = this.get('title');
var content = this.get('content');
var toolbar = this.get('toolbar');
// Create element.
var $el = $(['<div>', '<div class="acf-modal">', '<div class="acf-modal-title">', '<h2>' + title + '</h2>', '<button class="acf-modal-close" type="button"><span class="dashicons dashicons-no"></span></button>', '</div>', '<div class="acf-modal-content">' + content + '</div>', '<div class="acf-modal-toolbar">' + toolbar + '</div>', '</div>', '<div class="acf-modal-backdrop acf-modal-close"></div>', '</div>'].join(''));
// Update DOM.
if (this.$el) {
this.$el.replaceWith($el);
}
this.$el = $el;
// Trigger action.
acf.doAction('append', $el);
},
update: function (props) {
this.data = acf.parseArgs(props, this.data);
this.render();
},
title: function (title) {
this.$('.acf-modal-title h2').html(title);
},
content: function (content) {
this.$('.acf-modal-content').html(content);
},
toolbar: function (toolbar) {
this.$('.acf-modal-toolbar').html(toolbar);
},
open: function () {
$('body').append(this.$el);
},
close: function () {
this.remove();
},
onClickClose: function (e, $el) {
e.preventDefault();
this.close();
},
/**
* Places focus within the popup.
*/
focus: function () {
this.$el.find('.acf-icon').first().trigger('focus');
},
/**
* Locks focus within the modal.
*
* @param {boolean} locked True to lock focus, false to unlock.
*/
lockFocusToModal: function (locked) {
let inertElement = $('#wpwrap');
if (!inertElement.length) {
return;
}
inertElement[0].inert = locked;
inertElement.attr('aria-hidden', locked);
},
/**
* Returns focus to the element that opened the popup
* if it still exists in the DOM.
*/
returnFocusToOrigin: function () {
if (this.data.openedBy instanceof $ && this.data.openedBy.closest('body').length > 0) {
this.data.openedBy.trigger('focus');
}
}
});
/**
* Returns a new modal.
*
* @date 21/4/20
* @since 5.9.0
*
* @param object props The modal props.
* @return object
*/
acf.newModal = function (props) {
return new acf.models.Modal(props);
};
})(jQuery);
/***/ }),
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf-model.js":
/*!********************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf-model.js ***!
\********************************************************************/
/***/ (function() {
(function ($, undefined) {
// Cached regex to split keys for `addEvent`.
var delegateEventSplitter = /^(\S+)\s*(.*)$/;
/**
* extend
*
* Helper function to correctly set up the prototype chain for subclasses
* Heavily inspired by backbone.js
*
* @date 14/12/17
* @since 5.6.5
*
* @param object protoProps New properties for this object.
* @return function.
*/
var extend = function (protoProps) {
// vars
var Parent = this;
var Child;
// The constructor function for the new subclass is either defined by you
// (the "constructor" property in your `extend` definition), or defaulted
// by us to simply call the parent constructor.
if (protoProps && protoProps.hasOwnProperty('constructor')) {
Child = protoProps.constructor;
} else {
Child = function () {
return Parent.apply(this, arguments);
};
}
// Add static properties to the constructor function, if supplied.
$.extend(Child, Parent);
// Set the prototype chain to inherit from `parent`, without calling
// `parent`'s constructor function and add the prototype properties.
Child.prototype = Object.create(Parent.prototype);
$.extend(Child.prototype, protoProps);
Child.prototype.constructor = Child;
// Set a convenience property in case the parent's prototype is needed later.
//Child.prototype.__parent__ = Parent.prototype;
// return
return Child;
};
/**
* Model
*
* Base class for all inheritence
*
* @date 14/12/17
* @since 5.6.5
*
* @param object props
* @return function.
*/
var Model = acf.Model = function () {
// generate uique client id
this.cid = acf.uniqueId('acf');
// set vars to avoid modifying prototype
this.data = $.extend(true, {}, this.data);
// pass props to setup function
this.setup.apply(this, arguments);
// store on element (allow this.setup to create this.$el)
if (this.$el && !this.$el.data('acf')) {
this.$el.data('acf', this);
}
// initialize
var initialize = function () {
this.initialize();
this.addEvents();
this.addActions();
this.addFilters();
};
// initialize on action
if (this.wait && !acf.didAction(this.wait)) {
this.addAction(this.wait, initialize);
// initialize now
} else {
initialize.apply(this);
}
};
// Attach all inheritable methods to the Model prototype.
$.extend(Model.prototype, {
// Unique model id
id: '',
// Unique client id
cid: '',
// jQuery element
$el: null,
// Data specific to this instance
data: {},
// toggle used when changing data
busy: false,
changed: false,
// Setup events hooks
events: {},
actions: {},
filters: {},
// class used to avoid nested event triggers
eventScope: '',
// action to wait until initialize
wait: false,
// action priority default
priority: 10,
/**
* get
*
* Gets a specific data value
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @return mixed
*/
get: function (name) {
return this.data[name];
},
/**
* has
*
* Returns `true` if the data exists and is not null
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @return boolean
*/
has: function (name) {
return this.get(name) != null;
},
/**
* set
*
* Sets a specific data value
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param mixed value
* @return this
*/
set: function (name, value, silent) {
// bail if unchanged
var prevValue = this.get(name);
if (prevValue == value) {
return this;
}
// set data
this.data[name] = value;
// trigger events
if (!silent) {
this.changed = true;
this.trigger('changed:' + name, [value, prevValue]);
this.trigger('changed', [name, value, prevValue]);
}
// return
return this;
},
/**
* inherit
*
* Inherits the data from a jQuery element
*
* @date 14/12/17
* @since 5.6.5
*
* @param jQuery $el
* @return this
*/
inherit: function (data) {
// allow jQuery
if (data instanceof jQuery) {
data = data.data();
}
// extend
$.extend(this.data, data);
// return
return this;
},
/**
* prop
*
* mimics the jQuery prop function
*
* @date 4/6/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
prop: function () {
return this.$el.prop.apply(this.$el, arguments);
},
/**
* setup
*
* Run during constructor function
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return n/a
*/
setup: function (props) {
$.extend(this, props);
},
/**
* initialize
*
* Also run during constructor function
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return n/a
*/
initialize: function () {},
/**
* addElements
*
* Adds multiple jQuery elements to this object
*
* @date 9/5/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
addElements: function (elements) {
elements = elements || this.elements || null;
if (!elements || !Object.keys(elements).length) return false;
for (var i in elements) {
this.addElement(i, elements[i]);
}
},
/**
* addElement
*
* description
*
* @date 9/5/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
addElement: function (name, selector) {
this['$' + name] = this.$(selector);
},
/**
* addEvents
*
* Adds multiple event handlers
*
* @date 14/12/17
* @since 5.6.5
*
* @param object events {event1 : callback, event2 : callback, etc }
* @return n/a
*/
addEvents: function (events) {
events = events || this.events || null;
if (!events) return false;
for (var key in events) {
var match = key.match(delegateEventSplitter);
this.on(match[1], match[2], events[key]);
}
},
/**
* removeEvents
*
* Removes multiple event handlers
*
* @date 14/12/17
* @since 5.6.5
*
* @param object events {event1 : callback, event2 : callback, etc }
* @return n/a
*/
removeEvents: function (events) {
events = events || this.events || null;
if (!events) return false;
for (var key in events) {
var match = key.match(delegateEventSplitter);
this.off(match[1], match[2], events[key]);
}
},
/**
* getEventTarget
*
* Returns a jQuery element to trigger an event on.
*
* @date 5/6/18
* @since 5.6.9
*
* @param jQuery $el The default jQuery element. Optional.
* @param string event The event name. Optional.
* @return jQuery
*/
getEventTarget: function ($el, event) {
return $el || this.$el || $(document);
},
/**
* validateEvent
*
* Returns true if the event target's closest $el is the same as this.$el
* Requires both this.el and this.$el to be defined
*
* @date 5/6/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
validateEvent: function (e) {
if (this.eventScope) {
return $(e.target).closest(this.eventScope).is(this.$el);
} else {
return true;
}
},
/**
* proxyEvent
*
* Returns a new event callback function scoped to this model
*
* @date 29/3/18
* @since 5.6.9
*
* @param function callback
* @return function
*/
proxyEvent: function (callback) {
return this.proxy(function (e) {
// validate
if (!this.validateEvent(e)) {
return;
}
// construct args
var args = acf.arrayArgs(arguments);
var extraArgs = args.slice(1);
var eventArgs = [e, $(e.currentTarget)].concat(extraArgs);
// callback
callback.apply(this, eventArgs);
});
},
/**
* on
*
* Adds an event handler similar to jQuery
* Uses the instance 'cid' to namespace event
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param string callback
* @return n/a
*/
on: function (a1, a2, a3, a4) {
// vars
var $el, event, selector, callback, args;
// find args
if (a1 instanceof jQuery) {
// 1. args( $el, event, selector, callback )
if (a4) {
$el = a1;
event = a2;
selector = a3;
callback = a4;
// 2. args( $el, event, callback )
} else {
$el = a1;
event = a2;
callback = a3;
}
} else {
// 3. args( event, selector, callback )
if (a3) {
event = a1;
selector = a2;
callback = a3;
// 4. args( event, callback )
} else {
event = a1;
callback = a2;
}
}
// element
$el = this.getEventTarget($el);
// modify callback
if (typeof callback === 'string') {
callback = this.proxyEvent(this[callback]);
}
// modify event
event = event + '.' + this.cid;
// args
if (selector) {
args = [event, selector, callback];
} else {
args = [event, callback];
}
// on()
$el.on.apply($el, args);
},
/**
* off
*
* Removes an event handler similar to jQuery
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param string callback
* @return n/a
*/
off: function (a1, a2, a3) {
// vars
var $el, event, selector, args;
// find args
if (a1 instanceof jQuery) {
// 1. args( $el, event, selector )
if (a3) {
$el = a1;
event = a2;
selector = a3;
// 2. args( $el, event )
} else {
$el = a1;
event = a2;
}
} else {
// 3. args( event, selector )
if (a2) {
event = a1;
selector = a2;
// 4. args( event )
} else {
event = a1;
}
}
// element
$el = this.getEventTarget($el);
// modify event
event = event + '.' + this.cid;
// args
if (selector) {
args = [event, selector];
} else {
args = [event];
}
// off()
$el.off.apply($el, args);
},
/**
* trigger
*
* Triggers an event similar to jQuery
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param string callback
* @return n/a
*/
trigger: function (name, args, bubbles) {
var $el = this.getEventTarget();
if (bubbles) {
$el.trigger.apply($el, arguments);
} else {
$el.triggerHandler.apply($el, arguments);
}
return this;
},
/**
* addActions
*
* Adds multiple action handlers
*
* @date 14/12/17
* @since 5.6.5
*
* @param object actions {action1 : callback, action2 : callback, etc }
* @return n/a
*/
addActions: function (actions) {
actions = actions || this.actions || null;
if (!actions) return false;
for (var i in actions) {
this.addAction(i, actions[i]);
}
},
/**
* removeActions
*
* Removes multiple action handlers
*
* @date 14/12/17
* @since 5.6.5
*
* @param object actions {action1 : callback, action2 : callback, etc }
* @return n/a
*/
removeActions: function (actions) {
actions = actions || this.actions || null;
if (!actions) return false;
for (var i in actions) {
this.removeAction(i, actions[i]);
}
},
/**
* addAction
*
* Adds an action using the wp.hooks library
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param string callback
* @return n/a
*/
addAction: function (name, callback, priority) {
//console.log('addAction', name, priority);
// defaults
priority = priority || this.priority;
// modify callback
if (typeof callback === 'string') {
callback = this[callback];
}
// add
acf.addAction(name, callback, priority, this);
},
/**
* removeAction
*
* Remove an action using the wp.hooks library
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param string callback
* @return n/a
*/
removeAction: function (name, callback) {
acf.removeAction(name, this[callback]);
},
/**
* addFilters
*
* Adds multiple filter handlers
*
* @date 14/12/17
* @since 5.6.5
*
* @param object filters {filter1 : callback, filter2 : callback, etc }
* @return n/a
*/
addFilters: function (filters) {
filters = filters || this.filters || null;
if (!filters) return false;
for (var i in filters) {
this.addFilter(i, filters[i]);
}
},
/**
* addFilter
*
* Adds a filter using the wp.hooks library
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param string callback
* @return n/a
*/
addFilter: function (name, callback, priority) {
// defaults
priority = priority || this.priority;
// modify callback
if (typeof callback === 'string') {
callback = this[callback];
}
// add
acf.addFilter(name, callback, priority, this);
},
/**
* removeFilters
*
* Removes multiple filter handlers
*
* @date 14/12/17
* @since 5.6.5
*
* @param object filters {filter1 : callback, filter2 : callback, etc }
* @return n/a
*/
removeFilters: function (filters) {
filters = filters || this.filters || null;
if (!filters) return false;
for (var i in filters) {
this.removeFilter(i, filters[i]);
}
},
/**
* removeFilter
*
* Remove a filter using the wp.hooks library
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param string callback
* @return n/a
*/
removeFilter: function (name, callback) {
acf.removeFilter(name, this[callback]);
},
/**
* $
*
* description
*
* @date 16/12/17
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
$: function (selector) {
return this.$el.find(selector);
},
/**
* remove
*
* Removes the element and listenters
*
* @date 19/12/17
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
remove: function () {
this.removeEvents();
this.removeActions();
this.removeFilters();
this.$el.remove();
},
/**
* setTimeout
*
* description
*
* @date 16/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
setTimeout: function (callback, milliseconds) {
return setTimeout(this.proxy(callback), milliseconds);
},
/**
* time
*
* used for debugging
*
* @date 7/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
time: function () {
console.time(this.id || this.cid);
},
/**
* timeEnd
*
* used for debugging
*
* @date 7/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
timeEnd: function () {
console.timeEnd(this.id || this.cid);
},
/**
* show
*
* description
*
* @date 15/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
show: function () {
acf.show(this.$el);
},
/**
* hide
*
* description
*
* @date 15/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
hide: function () {
acf.hide(this.$el);
},
/**
* proxy
*
* Returns a new function scoped to this model
*
* @date 29/3/18
* @since 5.6.9
*
* @param function callback
* @return function
*/
proxy: function (callback) {
return $.proxy(callback, this);
}
});
// Set up inheritance for the model
Model.extend = extend;
// Global model storage
acf.models = {};
/**
* acf.getInstance
*
* This function will get an instance from an element
*
* @date 5/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.getInstance = function ($el) {
return $el.data('acf');
};
/**
* acf.getInstances
*
* This function will get an array of instances from multiple elements
*
* @date 5/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.getInstances = function ($el) {
var instances = [];
$el.each(function () {
instances.push(acf.getInstance($(this)));
});
return instances;
};
})(jQuery);
/***/ }),
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf-notice.js":
/*!*********************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf-notice.js ***!
\*********************************************************************/
/***/ (function() {
(function ($, undefined) {
var Notice = acf.Model.extend({
data: {
text: '',
type: '',
timeout: 0,
dismiss: true,
target: false,
close: function () {}
},
events: {
'click .acf-notice-dismiss': 'onClickClose'
},
tmpl: function () {
return '<div class="acf-notice"></div>';
},
setup: function (props) {
$.extend(this.data, props);
this.$el = $(this.tmpl());
},
initialize: function () {
// render
this.render();
// show
this.show();
},
render: function () {
// class
this.type(this.get('type'));
// text
this.html('<p>' + this.get('text') + '</p>');
// close
if (this.get('dismiss')) {
this.$el.append('<a href="#" class="acf-notice-dismiss acf-icon -cancel small"></a>');
this.$el.addClass('-dismiss');
}
// timeout
var timeout = this.get('timeout');
if (timeout) {
this.away(timeout);
}
},
update: function (props) {
// update
$.extend(this.data, props);
// re-initialize
this.initialize();
// refresh events
this.removeEvents();
this.addEvents();
},
show: function () {
var $target = this.get('target');
if ($target) {
$target.prepend(this.$el);
}
},
hide: function () {
this.$el.remove();
},
away: function (timeout) {
this.setTimeout(function () {
acf.remove(this.$el);
}, timeout);
},
type: function (type) {
// remove prev type
var prevType = this.get('type');
if (prevType) {
this.$el.removeClass('-' + prevType);
}
// add new type
this.$el.addClass('-' + type);
// backwards compatibility
if (type == 'error') {
this.$el.addClass('acf-error-message');
}
},
html: function (html) {
this.$el.html(acf.escHtml(html));
},
text: function (text) {
this.$('p').html(acf.escHtml(text));
},
onClickClose: function (e, $el) {
e.preventDefault();
this.get('close').apply(this, arguments);
this.remove();
}
});
acf.newNotice = function (props) {
// ensure object
if (typeof props !== 'object') {
props = {
text: props
};
}
// instantiate
return new Notice(props);
};
var noticeManager = new acf.Model({
wait: 'prepare',
priority: 1,
initialize: function () {
const $notices = $('.acf-admin-notice');
$notices.each(function () {
// Move to avoid WP flicker.
if ($(this).length) {
$('h1:first').after($(this));
}
if ($(this).data('persisted')) {
let dismissed = acf.getPreference('dismissed-notices');
if (dismissed && typeof dismissed == 'object' && dismissed.includes($(this).data('persist-id'))) {
$(this).remove();
} else {
$(this).show();
$(this).on('click', '.notice-dismiss', function (e) {
dismissed = acf.getPreference('dismissed-notices');
if (!dismissed || typeof dismissed != 'object') {
dismissed = [];
}
dismissed.push($(this).closest('.acf-admin-notice').data('persist-id'));
acf.setPreference('dismissed-notices', dismissed);
});
}
}
});
}
});
})(jQuery);
/***/ }),
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf-panel.js":
/*!********************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf-panel.js ***!
\********************************************************************/
/***/ (function() {
(function ($, undefined) {
var panel = new acf.Model({
events: {
'click .acf-panel-title': 'onClick'
},
onClick: function (e, $el) {
e.preventDefault();
this.toggle($el.parent());
},
isOpen: function ($el) {
return $el.hasClass('-open');
},
toggle: function ($el) {
this.isOpen($el) ? this.close($el) : this.open($el);
},
open: function ($el) {
$el.addClass('-open');
$el.find('.acf-panel-title i').attr('class', 'dashicons dashicons-arrow-down');
},
close: function ($el) {
$el.removeClass('-open');
$el.find('.acf-panel-title i').attr('class', 'dashicons dashicons-arrow-right');
}
});
})(jQuery);
/***/ }),
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf-popup.js":
/*!********************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf-popup.js ***!
\********************************************************************/
/***/ (function() {
(function ($, undefined) {
acf.models.Popup = acf.Model.extend({
data: {
title: '',
content: '',
width: 0,
height: 0,
loading: false,
openedBy: null
},
events: {
'click [data-event="close"]': 'onClickClose',
'click .acf-close-popup': 'onClickClose',
'keydown': 'onPressEscapeClose'
},
setup: function (props) {
$.extend(this.data, props);
this.$el = $(this.tmpl());
},
initialize: function () {
this.render();
this.open();
this.focus();
this.lockFocusToPopup(true);
},
tmpl: function () {
return ['<div id="acf-popup" role="dialog" tabindex="-1">', '<div class="acf-popup-box acf-box">', '<div class="title"><h3></h3><a href="#" class="acf-icon -cancel grey" data-event="close" aria-label="' + acf.__('Close modal') + '"></a></div>', '<div class="inner"></div>', '<div class="loading"><i class="acf-loading"></i></div>', '</div>', '<div class="bg" data-event="close"></div>', '</div>'].join('');
},
render: function () {
// Extract Vars.
var title = this.get('title');
var content = this.get('content');
var loading = this.get('loading');
var width = this.get('width');
var height = this.get('height');
// Update.
this.title(title);
this.content(content);
if (width) {
this.$('.acf-popup-box').css('width', width);
}
if (height) {
this.$('.acf-popup-box').css('min-height', height);
}
this.loading(loading);
// Trigger action.
acf.doAction('append', this.$el);
},
/**
* Places focus within the popup.
*/
focus: function () {
this.$el.find('.acf-icon').first().trigger('focus');
},
/**
* Locks focus within the popup.
*
* @param {boolean} locked True to lock focus, false to unlock.
*/
lockFocusToPopup: function (locked) {
let inertElement = $('#wpwrap');
if (!inertElement.length) {
return;
}
inertElement[0].inert = locked;
inertElement.attr('aria-hidden', locked);
},
update: function (props) {
this.data = acf.parseArgs(props, this.data);
this.render();
},
title: function (title) {
this.$('.title:first h3').html(title);
},
content: function (content) {
this.$('.inner:first').html(content);
},
loading: function (show) {
var $loading = this.$('.loading:first');
show ? $loading.show() : $loading.hide();
},
open: function () {
$('body').append(this.$el);
},
close: function () {
this.lockFocusToPopup(false);
this.returnFocusToOrigin();
this.remove();
},
onClickClose: function (e, $el) {
e.preventDefault();
this.close();
},
/**
* Closes the popup when the escape key is pressed.
*
* @param {KeyboardEvent} e
*/
onPressEscapeClose: function (e) {
if (e.key === 'Escape') {
this.close();
}
},
/**
* Returns focus to the element that opened the popup
* if it still exists in the DOM.
*/
returnFocusToOrigin: function () {
if (this.data.openedBy instanceof $ && this.data.openedBy.closest('body').length > 0) {
this.data.openedBy.trigger('focus');
}
}
});
/**
* newPopup
*
* Creates a new Popup with the supplied props
*
* @date 17/12/17
* @since 5.6.5
*
* @param object props
* @return object
*/
acf.newPopup = function (props) {
return new acf.models.Popup(props);
};
})(jQuery);
/***/ }),
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf-tooltip.js":
/*!**********************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf-tooltip.js ***!
\**********************************************************************/
/***/ (function() {
(function ($, undefined) {
acf.newTooltip = function (props) {
// ensure object
if (typeof props !== 'object') {
props = {
text: props
};
}
// confirmRemove
if (props.confirmRemove !== undefined) {
props.textConfirm = acf.__('Remove');
props.textCancel = acf.__('Cancel');
return new TooltipConfirm(props);
// confirm
} else if (props.confirm !== undefined) {
return new TooltipConfirm(props);
// default
} else {
return new Tooltip(props);
}
};
var Tooltip = acf.Model.extend({
data: {
text: '',
timeout: 0,
target: null
},
tmpl: function () {
return '<div class="acf-tooltip"></div>';
},
setup: function (props) {
$.extend(this.data, props);
this.$el = $(this.tmpl());
},
initialize: function () {
// render
this.render();
// append
this.show();
// position
this.position();
// timeout
var timeout = this.get('timeout');
if (timeout) {
setTimeout($.proxy(this.fade, this), timeout);
}
},
update: function (props) {
$.extend(this.data, props);
this.initialize();
},
render: function () {
this.html(this.get('text'));
},
show: function () {
$('body').append(this.$el);
},
hide: function () {
this.$el.remove();
},
fade: function () {
// add class
this.$el.addClass('acf-fade-up');
// remove
this.setTimeout(function () {
this.remove();
}, 250);
},
html: function (html) {
this.$el.html(html);
},
position: function () {
// vars
var $tooltip = this.$el;
var $target = this.get('target');
if (!$target) return;
// Reset position.
$tooltip.removeClass('right left bottom top').css({
top: 0,
left: 0
});
// Declare tollerance to edge of screen.
var tolerance = 10;
// Find target position.
var targetWidth = $target.outerWidth();
var targetHeight = $target.outerHeight();
var targetTop = $target.offset().top;
var targetLeft = $target.offset().left;
// Find tooltip position.
var tooltipWidth = $tooltip.outerWidth();
var tooltipHeight = $tooltip.outerHeight();
var tooltipTop = $tooltip.offset().top; // Should be 0, but WP media grid causes this to be 32 (toolbar padding).
// Assume default top alignment.
var top = targetTop - tooltipHeight - tooltipTop;
var left = targetLeft + targetWidth / 2 - tooltipWidth / 2;
// Check if too far left.
if (left < tolerance) {
$tooltip.addClass('right');
left = targetLeft + targetWidth;
top = targetTop + targetHeight / 2 - tooltipHeight / 2 - tooltipTop;
// Check if too far right.
} else if (left + tooltipWidth + tolerance > $(window).width()) {
$tooltip.addClass('left');
left = targetLeft - tooltipWidth;
top = targetTop + targetHeight / 2 - tooltipHeight / 2 - tooltipTop;
// Check if too far up.
} else if (top - $(window).scrollTop() < tolerance) {
$tooltip.addClass('bottom');
top = targetTop + targetHeight - tooltipTop;
// No colision with edges.
} else {
$tooltip.addClass('top');
}
// update css
$tooltip.css({
top: top,
left: left
});
}
});
var TooltipConfirm = Tooltip.extend({
data: {
text: '',
textConfirm: '',
textCancel: '',
target: null,
targetConfirm: true,
confirm: function () {},
cancel: function () {},
context: false
},
events: {
'click [data-event="cancel"]': 'onCancel',
'click [data-event="confirm"]': 'onConfirm'
},
addEvents: function () {
// add events
acf.Model.prototype.addEvents.apply(this);
// vars
var $document = $(document);
var $target = this.get('target');
// add global 'cancel' click event
// - use timeout to avoid the current 'click' event triggering the onCancel function
this.setTimeout(function () {
this.on($document, 'click', 'onCancel');
});
// add target 'confirm' click event
// - allow setting to control this feature
if (this.get('targetConfirm')) {
this.on($target, 'click', 'onConfirm');
}
},
removeEvents: function () {
// remove events
acf.Model.prototype.removeEvents.apply(this);
// vars
var $document = $(document);
var $target = this.get('target');
// remove custom events
this.off($document, 'click');
this.off($target, 'click');
},
render: function () {
// defaults
var text = this.get('text') || acf.__('Are you sure?');
var textConfirm = this.get('textConfirm') || acf.__('Yes');
var textCancel = this.get('textCancel') || acf.__('No');
// html
var html = [text, '<a href="#" data-event="confirm">' + textConfirm + '</a>', '<a href="#" data-event="cancel">' + textCancel + '</a>'].join(' ');
// html
this.html(html);
// class
this.$el.addClass('-confirm');
},
onCancel: function (e, $el) {
// prevent default
e.preventDefault();
e.stopImmediatePropagation();
// callback
var callback = this.get('cancel');
var context = this.get('context') || this;
callback.apply(context, arguments);
//remove
this.remove();
},
onConfirm: function (e, $el) {
// Prevent event from propagating completely to allow "targetConfirm" to be clicked.
e.preventDefault();
e.stopImmediatePropagation();
// callback
var callback = this.get('confirm');
var context = this.get('context') || this;
callback.apply(context, arguments);
//remove
this.remove();
}
});
// storage
acf.models.Tooltip = Tooltip;
acf.models.TooltipConfirm = TooltipConfirm;
/**
* tooltipManager
*
* description
*
* @date 17/4/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
var tooltipHoverHelper = new acf.Model({
tooltip: false,
events: {
'mouseenter .acf-js-tooltip': 'showTitle',
'mouseup .acf-js-tooltip': 'hideTitle',
'mouseleave .acf-js-tooltip': 'hideTitle',
'focus .acf-js-tooltip': 'showTitle',
'blur .acf-js-tooltip': 'hideTitle',
'keyup .acf-js-tooltip': 'onKeyUp'
},
showTitle: function (e, $el) {
// vars
var title = $el.attr('title');
// bail early if no title
if (!title) {
return;
}
// clear title to avoid default browser tooltip
$el.attr('title', '');
// create
if (!this.tooltip) {
this.tooltip = acf.newTooltip({
text: title,
target: $el
});
// update
} else {
this.tooltip.update({
text: title,
target: $el
});
}
},
hideTitle: function (e, $el) {
// hide tooltip
this.tooltip.hide();
// restore title
$el.attr('title', this.tooltip.get('text'));
},
onKeyUp: function (e, $el) {
if ('Escape' === e.key) {
this.hideTitle(e, $el);
}
}
});
})(jQuery);
/***/ }),
/***/ "./src/advanced-custom-fields-pro/assets/src/js/_acf.js":
/*!**************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/_acf.js ***!
\**************************************************************/
/***/ (function() {
(function ($, undefined) {
/**
* acf
*
* description
*
* @date 14/12/17
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
// The global acf object
var acf = {};
// Set as a browser global
window.acf = acf;
/** @var object Data sent from PHP */
acf.data = {};
/**
* get
*
* Gets a specific data value
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @return mixed
*/
acf.get = function (name) {
return this.data[name] || null;
};
/**
* has
*
* Returns `true` if the data exists and is not null
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @return boolean
*/
acf.has = function (name) {
return this.get(name) !== null;
};
/**
* set
*
* Sets a specific data value
*
* @date 14/12/17
* @since 5.6.5
*
* @param string name
* @param mixed value
* @return this
*/
acf.set = function (name, value) {
this.data[name] = value;
return this;
};
/**
* uniqueId
*
* Returns a unique ID
*
* @date 9/11/17
* @since 5.6.3
*
* @param string prefix Optional prefix.
* @return string
*/
var idCounter = 0;
acf.uniqueId = function (prefix) {
var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
/**
* acf.uniqueArray
*
* Returns a new array with only unique values
* Credit: https://stackoverflow.com/questions/1960473/get-all-unique-values-in-an-array-remove-duplicates
*
* @date 23/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.uniqueArray = function (array) {
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
return array.filter(onlyUnique);
};
/**
* uniqid
*
* Returns a unique ID (PHP version)
*
* @date 9/11/17
* @since 5.6.3
* @source http://locutus.io/php/misc/uniqid/
*
* @param string prefix Optional prefix.
* @return string
*/
var uniqidSeed = '';
acf.uniqid = function (prefix, moreEntropy) {
// discuss at: http://locutus.io/php/uniqid/
// original by: Kevin van Zonneveld (http://kvz.io)
// revised by: Kankrelune (http://www.webfaktory.info/)
// note 1: Uses an internal counter (in locutus global) to avoid collision
// example 1: var $id = uniqid()
// example 1: var $result = $id.length === 13
// returns 1: true
// example 2: var $id = uniqid('foo')
// example 2: var $result = $id.length === (13 + 'foo'.length)
// returns 2: true
// example 3: var $id = uniqid('bar', true)
// example 3: var $result = $id.length === (23 + 'bar'.length)
// returns 3: true
if (typeof prefix === 'undefined') {
prefix = '';
}
var retId;
var formatSeed = function (seed, reqWidth) {
seed = parseInt(seed, 10).toString(16); // to hex str
if (reqWidth < seed.length) {
// so long we split
return seed.slice(seed.length - reqWidth);
}
if (reqWidth > seed.length) {
// so short we pad
return Array(1 + (reqWidth - seed.length)).join('0') + seed;
}
return seed;
};
if (!uniqidSeed) {
// init seed with big random int
uniqidSeed = Math.floor(Math.random() * 0x75bcd15);
}
uniqidSeed++;
retId = prefix; // start with prefix, add current milliseconds hex string
retId += formatSeed(parseInt(new Date().getTime() / 1000, 10), 8);
retId += formatSeed(uniqidSeed, 5); // add seed hex string
if (moreEntropy) {
// for more entropy we add a float lower to 10
retId += (Math.random() * 10).toFixed(8).toString();
}
return retId;
};
/**
* strReplace
*
* Performs a string replace
*
* @date 14/12/17
* @since 5.6.5
*
* @param string search
* @param string replace
* @param string subject
* @return string
*/
acf.strReplace = function (search, replace, subject) {
return subject.split(search).join(replace);
};
/**
* strCamelCase
*
* Converts a string into camelCase
* Thanks to https://stackoverflow.com/questions/2970525/converting-any-string-into-camel-case
*
* @date 14/12/17
* @since 5.6.5
*
* @param string str
* @return string
*/
acf.strCamelCase = function (str) {
var matches = str.match(/([a-zA-Z0-9]+)/g);
return matches ? matches.map(function (s, i) {
var c = s.charAt(0);
return (i === 0 ? c.toLowerCase() : c.toUpperCase()) + s.slice(1);
}).join('') : '';
};
/**
* strPascalCase
*
* Converts a string into PascalCase
* Thanks to https://stackoverflow.com/questions/1026069/how-do-i-make-the-first-letter-of-a-string-uppercase-in-javascript
*
* @date 14/12/17
* @since 5.6.5
*
* @param string str
* @return string
*/
acf.strPascalCase = function (str) {
var camel = acf.strCamelCase(str);
return camel.charAt(0).toUpperCase() + camel.slice(1);
};
/**
* acf.strSlugify
*
* Converts a string into a HTML class friendly slug
*
* @date 21/3/18
* @since 5.6.9
*
* @param string str
* @return string
*/
acf.strSlugify = function (str) {
return acf.strReplace('_', '-', str.toLowerCase());
};
acf.strSanitize = function (str) {
// chars (https://jsperf.com/replace-foreign-characters)
var map = {
À: 'A',
Á: 'A',
Â: 'A',
Ã: 'A',
Ä: 'A',
Å: 'A',
Æ: 'AE',
Ç: 'C',
È: 'E',
É: 'E',
Ê: 'E',
Ë: 'E',
Ì: 'I',
Í: 'I',
Î: 'I',
Ï: 'I',
Ð: 'D',
Ñ: 'N',
Ò: 'O',
Ó: 'O',
Ô: 'O',
Õ: 'O',
Ö: 'O',
Ø: 'O',
Ù: 'U',
Ú: 'U',
Û: 'U',
Ü: 'U',
Ý: 'Y',
ß: 's',
à: 'a',
á: 'a',
â: 'a',
ã: 'a',
ä: 'a',
å: 'a',
æ: 'ae',
ç: 'c',
è: 'e',
é: 'e',
ê: 'e',
ë: 'e',
ì: 'i',
í: 'i',
î: 'i',
ï: 'i',
ñ: 'n',
ò: 'o',
ó: 'o',
ô: 'o',
õ: 'o',
ö: 'o',
ø: 'o',
ù: 'u',
ú: 'u',
û: 'u',
ü: 'u',
ý: 'y',
ÿ: 'y',
Ā: 'A',
ā: 'a',
Ă: 'A',
ă: 'a',
Ą: 'A',
ą: 'a',
Ć: 'C',
ć: 'c',
Ĉ: 'C',
ĉ: 'c',
Ċ: 'C',
ċ: 'c',
Č: 'C',
č: 'c',
Ď: 'D',
ď: 'd',
Đ: 'D',
đ: 'd',
Ē: 'E',
ē: 'e',
Ĕ: 'E',
ĕ: 'e',
Ė: 'E',
ė: 'e',
Ę: 'E',
ę: 'e',
Ě: 'E',
ě: 'e',
Ĝ: 'G',
ĝ: 'g',
Ğ: 'G',
ğ: 'g',
Ġ: 'G',
ġ: 'g',
Ģ: 'G',
ģ: 'g',
Ĥ: 'H',
ĥ: 'h',
Ħ: 'H',
ħ: 'h',
Ĩ: 'I',
ĩ: 'i',
Ī: 'I',
ī: 'i',
Ĭ: 'I',
ĭ: 'i',
Į: 'I',
į: 'i',
İ: 'I',
ı: 'i',
IJ: 'IJ',
ij: 'ij',
Ĵ: 'J',
ĵ: 'j',
Ķ: 'K',
ķ: 'k',
Ĺ: 'L',
ĺ: 'l',
Ļ: 'L',
ļ: 'l',
Ľ: 'L',
ľ: 'l',
Ŀ: 'L',
ŀ: 'l',
Ł: 'l',
ł: 'l',
Ń: 'N',
ń: 'n',
Ņ: 'N',
ņ: 'n',
Ň: 'N',
ň: 'n',
ʼn: 'n',
Ō: 'O',
ō: 'o',
Ŏ: 'O',
ŏ: 'o',
Ő: 'O',
ő: 'o',
Œ: 'OE',
œ: 'oe',
Ŕ: 'R',
ŕ: 'r',
Ŗ: 'R',
ŗ: 'r',
Ř: 'R',
ř: 'r',
Ś: 'S',
ś: 's',
Ŝ: 'S',
ŝ: 's',
Ş: 'S',
ş: 's',
Š: 'S',
š: 's',
Ţ: 'T',
ţ: 't',
Ť: 'T',
ť: 't',
Ŧ: 'T',
ŧ: 't',
Ũ: 'U',
ũ: 'u',
Ū: 'U',
ū: 'u',
Ŭ: 'U',
ŭ: 'u',
Ů: 'U',
ů: 'u',
Ű: 'U',
ű: 'u',
Ų: 'U',
ų: 'u',
Ŵ: 'W',
ŵ: 'w',
Ŷ: 'Y',
ŷ: 'y',
Ÿ: 'Y',
Ź: 'Z',
ź: 'z',
Ż: 'Z',
ż: 'z',
Ž: 'Z',
ž: 'z',
ſ: 's',
ƒ: 'f',
Ơ: 'O',
ơ: 'o',
Ư: 'U',
ư: 'u',
Ǎ: 'A',
ǎ: 'a',
Ǐ: 'I',
ǐ: 'i',
Ǒ: 'O',
ǒ: 'o',
Ǔ: 'U',
ǔ: 'u',
Ǖ: 'U',
ǖ: 'u',
Ǘ: 'U',
ǘ: 'u',
Ǚ: 'U',
ǚ: 'u',
Ǜ: 'U',
ǜ: 'u',
Ǻ: 'A',
ǻ: 'a',
Ǽ: 'AE',
ǽ: 'ae',
Ǿ: 'O',
ǿ: 'o',
// extra
' ': '_',
"'": '',
'?': '',
'/': '',
'\\': '',
'.': '',
',': '',
'`': '',
'>': '',
'<': '',
'"': '',
'[': '',
']': '',
'|': '',
'{': '',
'}': '',
'(': '',
')': ''
};
// vars
var nonWord = /\W/g;
var mapping = function (c) {
return map[c] !== undefined ? map[c] : c;
};
// replace
str = str.replace(nonWord, mapping);
// lowercase
str = str.toLowerCase();
// return
return str;
};
/**
* acf.strMatch
*
* Returns the number of characters that match between two strings
*
* @date 1/2/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.strMatch = function (s1, s2) {
// vars
var val = 0;
var min = Math.min(s1.length, s2.length);
// loop
for (var i = 0; i < min; i++) {
if (s1[i] !== s2[i]) {
break;
}
val++;
}
// return
return val;
};
/**
* Escapes HTML entities from a string.
*
* @date 08/06/2020
* @since 5.9.0
*
* @param string string The input string.
* @return string
*/
acf.strEscape = function (string) {
var htmlEscapes = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;'
};
return ('' + string).replace(/[&<>"']/g, function (chr) {
return htmlEscapes[chr];
});
};
// Tests.
//console.log( acf.strEscape('Test 1') );
//console.log( acf.strEscape('Test & 1') );
//console.log( acf.strEscape('Test\'s &amp; 1') );
//console.log( acf.strEscape('<script>js</script>') );
/**
* Unescapes HTML entities from a string.
*
* @date 08/06/2020
* @since 5.9.0
*
* @param string string The input string.
* @return string
*/
acf.strUnescape = function (string) {
var htmlUnescapes = {
'&amp;': '&',
'&lt;': '<',
'&gt;': '>',
'&quot;': '"',
'&#39;': "'"
};
return ('' + string).replace(/&amp;|&lt;|&gt;|&quot;|&#39;/g, function (entity) {
return htmlUnescapes[entity];
});
};
// Tests.
//console.log( acf.strUnescape( acf.strEscape('Test 1') ) );
//console.log( acf.strUnescape( acf.strEscape('Test & 1') ) );
//console.log( acf.strUnescape( acf.strEscape('Test\'s &amp; 1') ) );
//console.log( acf.strUnescape( acf.strEscape('<script>js</script>') ) );
/**
* Escapes HTML entities from a string.
*
* @date 08/06/2020
* @since 5.9.0
*
* @param string string The input string.
* @return string
*/
acf.escAttr = acf.strEscape;
/**
* Encodes <script> tags for safe HTML output.
*
* @date 08/06/2020
* @since 5.9.0
*
* @param string string The input string.
* @return string
*/
acf.escHtml = function (string) {
return ('' + string).replace(/<script|<\/script/g, function (html) {
return acf.strEscape(html);
});
};
// Tests.
//console.log( acf.escHtml('<script>js</script>') );
//console.log( acf.escHtml( acf.strEscape('<script>js</script>') ) );
//console.log( acf.escHtml( '<script>js1</script><script>js2</script>' ) );
/**
* acf.decode
*
* description
*
* @date 13/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.decode = function (string) {
return $('<textarea/>').html(string).text();
};
/**
* parseArgs
*
* Merges together defaults and args much like the WP wp_parse_args function
*
* @date 14/12/17
* @since 5.6.5
*
* @param object args
* @param object defaults
* @return object
*/
acf.parseArgs = function (args, defaults) {
if (typeof args !== 'object') args = {};
if (typeof defaults !== 'object') defaults = {};
return $.extend({}, defaults, args);
};
/**
* __
*
* Retrieve the translation of $text.
*
* @date 16/4/18
* @since 5.6.9
*
* @param string text Text to translate.
* @return string Translated text.
*/
if (window.acfL10n == undefined) {
acfL10n = {};
}
acf.__ = function (text) {
return acfL10n[text] || text;
};
/**
* _x
*
* Retrieve translated string with gettext context.
*
* @date 16/4/18
* @since 5.6.9
*
* @param string text Text to translate.
* @param string context Context information for the translators.
* @return string Translated text.
*/
acf._x = function (text, context) {
return acfL10n[text + '.' + context] || acfL10n[text] || text;
};
/**
* _n
*
* Retrieve the plural or single form based on the amount.
*
* @date 16/4/18
* @since 5.6.9
*
* @param string single Single text to translate.
* @param string plural Plural text to translate.
* @param int number The number to compare against.
* @return string Translated text.
*/
acf._n = function (single, plural, number) {
if (number == 1) {
return acf.__(single);
} else {
return acf.__(plural);
}
};
acf.isArray = function (a) {
return Array.isArray(a);
};
acf.isObject = function (a) {
return typeof a === 'object';
};
/**
* serialize
*
* description
*
* @date 24/12/17
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
var buildObject = function (obj, name, value) {
// replace [] with placeholder
name = name.replace('[]', '[%%index%%]');
// vars
var keys = name.match(/([^\[\]])+/g);
if (!keys) return;
var length = keys.length;
var ref = obj;
// loop
for (var i = 0; i < length; i++) {
// vars
var key = String(keys[i]);
// value
if (i == length - 1) {
// %%index%%
if (key === '%%index%%') {
ref.push(value);
// default
} else {
ref[key] = value;
}
// path
} else {
// array
if (keys[i + 1] === '%%index%%') {
if (!acf.isArray(ref[key])) {
ref[key] = [];
}
// object
} else {
if (!acf.isObject(ref[key])) {
ref[key] = {};
}
}
// crawl
ref = ref[key];
}
}
};
acf.serialize = function ($el, prefix) {
// vars
var obj = {};
var inputs = acf.serializeArray($el);
// prefix
if (prefix !== undefined) {
// filter and modify
inputs = inputs.filter(function (item) {
return item.name.indexOf(prefix) === 0;
}).map(function (item) {
item.name = item.name.slice(prefix.length);
return item;
});
}
// loop
for (var i = 0; i < inputs.length; i++) {
buildObject(obj, inputs[i].name, inputs[i].value);
}
// return
return obj;
};
/**
* acf.serializeArray
*
* Similar to $.serializeArray() but works with a parent wrapping element.
*
* @date 19/8/18
* @since 5.7.3
*
* @param jQuery $el The element or form to serialize.
* @return array
*/
acf.serializeArray = function ($el) {
return $el.find('select, textarea, input').serializeArray();
};
/**
* acf.serializeForAjax
*
* Returns an object containing name => value data ready to be encoded for Ajax.
*
* @date 17/12/18
* @since 5.8.0
*
* @param jQUery $el The element or form to serialize.
* @return object
*/
acf.serializeForAjax = function ($el) {
// vars
var data = {};
var index = {};
// Serialize inputs.
var inputs = acf.serializeArray($el);
// Loop over inputs and build data.
inputs.map(function (item) {
// Append to array.
if (item.name.slice(-2) === '[]') {
data[item.name] = data[item.name] || [];
data[item.name].push(item.value);
// Append
} else {
data[item.name] = item.value;
}
});
// return
return data;
};
/**
* addAction
*
* Wrapper for acf.hooks.addAction
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
/*
var prefixAction = function( action ){
return 'acf_' + action;
}
*/
acf.addAction = function (action, callback, priority, context) {
//action = prefixAction(action);
acf.hooks.addAction.apply(this, arguments);
return this;
};
/**
* removeAction
*
* Wrapper for acf.hooks.removeAction
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
acf.removeAction = function (action, callback) {
//action = prefixAction(action);
acf.hooks.removeAction.apply(this, arguments);
return this;
};
/**
* doAction
*
* Wrapper for acf.hooks.doAction
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
var actionHistory = {};
//var currentAction = false;
acf.doAction = function (action) {
//action = prefixAction(action);
//currentAction = action;
actionHistory[action] = 1;
acf.hooks.doAction.apply(this, arguments);
actionHistory[action] = 0;
return this;
};
/**
* doingAction
*
* Return true if doing action
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
acf.doingAction = function (action) {
//action = prefixAction(action);
return actionHistory[action] === 1;
};
/**
* didAction
*
* Wrapper for acf.hooks.doAction
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
acf.didAction = function (action) {
//action = prefixAction(action);
return actionHistory[action] !== undefined;
};
/**
* currentAction
*
* Wrapper for acf.hooks.doAction
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
acf.currentAction = function () {
for (var k in actionHistory) {
if (actionHistory[k]) {
return k;
}
}
return false;
};
/**
* addFilter
*
* Wrapper for acf.hooks.addFilter
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
acf.addFilter = function (action) {
//action = prefixAction(action);
acf.hooks.addFilter.apply(this, arguments);
return this;
};
/**
* removeFilter
*
* Wrapper for acf.hooks.removeFilter
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
acf.removeFilter = function (action) {
//action = prefixAction(action);
acf.hooks.removeFilter.apply(this, arguments);
return this;
};
/**
* applyFilters
*
* Wrapper for acf.hooks.applyFilters
*
* @date 14/12/17
* @since 5.6.5
*
* @param n/a
* @return this
*/
acf.applyFilters = function (action) {
//action = prefixAction(action);
return acf.hooks.applyFilters.apply(this, arguments);
};
/**
* getArgs
*
* description
*
* @date 15/12/17
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.arrayArgs = function (args) {
return Array.prototype.slice.call(args);
};
/**
* extendArgs
*
* description
*
* @date 15/12/17
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
/*
acf.extendArgs = function( ){
var args = Array.prototype.slice.call( arguments );
var realArgs = args.shift();
Array.prototype.push.call(arguments, 'bar')
return Array.prototype.push.apply( args, arguments );
};
*/
// Preferences
// - use try/catch to avoid JS error if cookies are disabled on front-end form
try {
var preferences = JSON.parse(localStorage.getItem('acf')) || {};
} catch (e) {
var preferences = {};
}
/**
* getPreferenceName
*
* Gets the true preference name.
* Converts "this.thing" to "thing-123" if editing post 123.
*
* @date 11/11/17
* @since 5.6.5
*
* @param string name
* @return string
*/
var getPreferenceName = function (name) {
if (name.substr(0, 5) === 'this.') {
name = name.substr(5) + '-' + acf.get('post_id');
}
return name;
};
/**
* acf.getPreference
*
* Gets a preference setting or null if not set.
*
* @date 11/11/17
* @since 5.6.5
*
* @param string name
* @return mixed
*/
acf.getPreference = function (name) {
name = getPreferenceName(name);
return preferences[name] || null;
};
/**
* acf.setPreference
*
* Sets a preference setting.
*
* @date 11/11/17
* @since 5.6.5
*
* @param string name
* @param mixed value
* @return n/a
*/
acf.setPreference = function (name, value) {
name = getPreferenceName(name);
if (value === null) {
delete preferences[name];
} else {
preferences[name] = value;
}
localStorage.setItem('acf', JSON.stringify(preferences));
};
/**
* acf.removePreference
*
* Removes a preference setting.
*
* @date 11/11/17
* @since 5.6.5
*
* @param string name
* @return n/a
*/
acf.removePreference = function (name) {
acf.setPreference(name, null);
};
/**
* remove
*
* Removes an element with fade effect
*
* @date 1/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.remove = function (props) {
// allow jQuery
if (props instanceof jQuery) {
props = {
target: props
};
}
// defaults
props = acf.parseArgs(props, {
target: false,
endHeight: 0,
complete: function () {}
});
// action
acf.doAction('remove', props.target);
// tr
if (props.target.is('tr')) {
removeTr(props);
// div
} else {
removeDiv(props);
}
};
/**
* removeDiv
*
* description
*
* @date 16/2/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
var removeDiv = function (props) {
// vars
var $el = props.target;
var height = $el.height();
var width = $el.width();
var margin = $el.css('margin');
var outerHeight = $el.outerHeight(true);
var style = $el.attr('style') + ''; // needed to copy
// wrap
$el.wrap('<div class="acf-temp-remove" style="height:' + outerHeight + 'px"></div>');
var $wrap = $el.parent();
// set pos
$el.css({
height: height,
width: width,
margin: margin,
position: 'absolute'
});
// fade wrap
setTimeout(function () {
$wrap.css({
opacity: 0,
height: props.endHeight
});
}, 50);
// remove
setTimeout(function () {
$el.attr('style', style);
$wrap.remove();
props.complete();
}, 301);
};
/**
* removeTr
*
* description
*
* @date 16/2/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
var removeTr = function (props) {
// vars
var $tr = props.target;
var height = $tr.height();
var children = $tr.children().length;
// create dummy td
var $td = $('<td class="acf-temp-remove" style="padding:0; height:' + height + 'px" colspan="' + children + '"></td>');
// fade away tr
$tr.addClass('acf-remove-element');
// update HTML after fade animation
setTimeout(function () {
$tr.html($td);
}, 251);
// allow .acf-temp-remove to exist before changing CSS
setTimeout(function () {
// remove class
$tr.removeClass('acf-remove-element');
// collapse
$td.css({
height: props.endHeight
});
}, 300);
// remove
setTimeout(function () {
$tr.remove();
props.complete();
}, 451);
};
/**
* duplicate
*
* description
*
* @date 3/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.duplicate = function (args) {
// allow jQuery
if (args instanceof jQuery) {
args = {
target: args
};
}
// defaults
args = acf.parseArgs(args, {
target: false,
search: '',
replace: '',
rename: true,
before: function ($el) {},
after: function ($el, $el2) {},
append: function ($el, $el2) {
$el.after($el2);
}
});
// compatibility
args.target = args.target || args.$el;
// vars
var $el = args.target;
// search
args.search = args.search || $el.attr('data-id');
args.replace = args.replace || acf.uniqid();
// before
// - allow acf to modify DOM
// - fixes bug where select field option is not selected
args.before($el);
acf.doAction('before_duplicate', $el);
// clone
var $el2 = $el.clone();
// rename
if (args.rename) {
acf.rename({
target: $el2,
search: args.search,
replace: args.replace,
replacer: typeof args.rename === 'function' ? args.rename : null
});
}
// remove classes
$el2.removeClass('acf-clone');
$el2.find('.ui-sortable').removeClass('ui-sortable');
// remove any initialised select2s prevent the duplicated object stealing the previous select2.
$el2.find('[data-select2-id]').removeAttr('data-select2-id');
$el2.find('.select2').remove();
// subfield select2 renames happen after init and contain a duplicated ID. force change those IDs to prevent this.
$el2.find('.acf-is-subfields select[data-ui="1"]').each(function () {
$(this).prop('id', $(this).prop('id').replace('acf_fields', acf.uniqid('duplicated_') + '_acf_fields'));
});
// remove tab wrapper to ensure proper init
$el2.find('.acf-field-settings > .acf-tab-wrap').remove();
// after
// - allow acf to modify DOM
args.after($el, $el2);
acf.doAction('after_duplicate', $el, $el2);
// append
args.append($el, $el2);
/**
* Fires after an element has been duplicated and appended to the DOM.
*
* @date 30/10/19
* @since 5.8.7
*
* @param jQuery $el The original element.
* @param jQuery $el2 The duplicated element.
*/
acf.doAction('duplicate', $el, $el2);
// append
acf.doAction('append', $el2);
// return
return $el2;
};
/**
* rename
*
* description
*
* @date 7/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.rename = function (args) {
// Allow jQuery param.
if (args instanceof jQuery) {
args = {
target: args
};
}
// Apply default args.
args = acf.parseArgs(args, {
target: false,
destructive: false,
search: '',
replace: '',
replacer: null
});
// Extract args.
var $el = args.target;
// Provide backup for empty args.
if (!args.search) {
args.search = $el.attr('data-id');
}
if (!args.replace) {
args.replace = acf.uniqid('acf');
}
if (!args.replacer) {
args.replacer = function (name, value, search, replace) {
return value.replace(search, replace);
};
}
// Callback function for jQuery replacing.
var withReplacer = function (name) {
return function (i, value) {
return args.replacer(name, value, args.search, args.replace);
};
};
// Destructive Replace.
if (args.destructive) {
var html = acf.strReplace(args.search, args.replace, $el.outerHTML());
$el.replaceWith(html);
// Standard Replace.
} else {
$el.attr('data-id', args.replace);
$el.find('[id*="' + args.search + '"]').attr('id', withReplacer('id'));
$el.find('[for*="' + args.search + '"]').attr('for', withReplacer('for'));
$el.find('[name*="' + args.search + '"]').attr('name', withReplacer('name'));
}
// return
return $el;
};
/**
* acf.prepareForAjax
*
* description
*
* @date 4/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.prepareForAjax = function (data) {
// required
data.nonce = acf.get('nonce');
data.post_id = acf.get('post_id');
// language
if (acf.has('language')) {
data.lang = acf.get('language');
}
// filter for 3rd party customization
data = acf.applyFilters('prepare_for_ajax', data);
// return
return data;
};
/**
* acf.startButtonLoading
*
* description
*
* @date 5/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.startButtonLoading = function ($el) {
$el.prop('disabled', true);
$el.after(' <i class="acf-loading"></i>');
};
acf.stopButtonLoading = function ($el) {
$el.prop('disabled', false);
$el.next('.acf-loading').remove();
};
/**
* acf.showLoading
*
* description
*
* @date 12/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.showLoading = function ($el) {
$el.append('<div class="acf-loading-overlay"><i class="acf-loading"></i></div>');
};
acf.hideLoading = function ($el) {
$el.children('.acf-loading-overlay').remove();
};
/**
* acf.updateUserSetting
*
* description
*
* @date 5/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.updateUserSetting = function (name, value) {
var ajaxData = {
action: 'acf/ajax/user_setting',
name: name,
value: value
};
$.ajax({
url: acf.get('ajaxurl'),
data: acf.prepareForAjax(ajaxData),
type: 'post',
dataType: 'html'
});
};
/**
* acf.val
*
* description
*
* @date 8/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.val = function ($input, value, silent) {
// vars
var prevValue = $input.val();
// bail if no change
if (value === prevValue) {
return false;
}
// update value
$input.val(value);
// prevent select elements displaying blank value if option doesn't exist
if ($input.is('select') && $input.val() === null) {
$input.val(prevValue);
return false;
}
// update with trigger
if (silent !== true) {
$input.trigger('change');
}
// return
return true;
};
/**
* acf.show
*
* description
*
* @date 9/2/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.show = function ($el, lockKey) {
// unlock
if (lockKey) {
acf.unlock($el, 'hidden', lockKey);
}
// bail early if $el is still locked
if (acf.isLocked($el, 'hidden')) {
//console.log( 'still locked', getLocks( $el, 'hidden' ));
return false;
}
// $el is hidden, remove class and return true due to change in visibility
if ($el.hasClass('acf-hidden')) {
$el.removeClass('acf-hidden');
return true;
// $el is visible, return false due to no change in visibility
} else {
return false;
}
};
/**
* acf.hide
*
* description
*
* @date 9/2/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.hide = function ($el, lockKey) {
// lock
if (lockKey) {
acf.lock($el, 'hidden', lockKey);
}
// $el is hidden, return false due to no change in visibility
if ($el.hasClass('acf-hidden')) {
return false;
// $el is visible, add class and return true due to change in visibility
} else {
$el.addClass('acf-hidden');
return true;
}
};
/**
* acf.isHidden
*
* description
*
* @date 9/2/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.isHidden = function ($el) {
return $el.hasClass('acf-hidden');
};
/**
* acf.isVisible
*
* description
*
* @date 9/2/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.isVisible = function ($el) {
return !acf.isHidden($el);
};
/**
* enable
*
* description
*
* @date 12/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
var enable = function ($el, lockKey) {
// check class. Allow .acf-disabled to overrule all JS
if ($el.hasClass('acf-disabled')) {
return false;
}
// unlock
if (lockKey) {
acf.unlock($el, 'disabled', lockKey);
}
// bail early if $el is still locked
if (acf.isLocked($el, 'disabled')) {
return false;
}
// $el is disabled, remove prop and return true due to change
if ($el.prop('disabled')) {
$el.prop('disabled', false);
return true;
// $el is enabled, return false due to no change
} else {
return false;
}
};
/**
* acf.enable
*
* description
*
* @date 9/2/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.enable = function ($el, lockKey) {
// enable single input
if ($el.attr('name')) {
return enable($el, lockKey);
}
// find and enable child inputs
// return true if any inputs have changed
var results = false;
$el.find('[name]').each(function () {
var result = enable($(this), lockKey);
if (result) {
results = true;
}
});
return results;
};
/**
* disable
*
* description
*
* @date 12/3/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
var disable = function ($el, lockKey) {
// lock
if (lockKey) {
acf.lock($el, 'disabled', lockKey);
}
// $el is disabled, return false due to no change
if ($el.prop('disabled')) {
return false;
// $el is enabled, add prop and return true due to change
} else {
$el.prop('disabled', true);
return true;
}
};
/**
* acf.disable
*
* description
*
* @date 9/2/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.disable = function ($el, lockKey) {
// disable single input
if ($el.attr('name')) {
return disable($el, lockKey);
}
// find and enable child inputs
// return true if any inputs have changed
var results = false;
$el.find('[name]').each(function () {
var result = disable($(this), lockKey);
if (result) {
results = true;
}
});
return results;
};
/**
* acf.isset
*
* description
*
* @date 10/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.isset = function (obj /*, level1, level2, ... */) {
for (var i = 1; i < arguments.length; i++) {
if (!obj || !obj.hasOwnProperty(arguments[i])) {
return false;
}
obj = obj[arguments[i]];
}
return true;
};
/**
* acf.isget
*
* description
*
* @date 10/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.isget = function (obj /*, level1, level2, ... */) {
for (var i = 1; i < arguments.length; i++) {
if (!obj || !obj.hasOwnProperty(arguments[i])) {
return null;
}
obj = obj[arguments[i]];
}
return obj;
};
/**
* acf.getFileInputData
*
* description
*
* @date 10/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.getFileInputData = function ($input, callback) {
// vars
var value = $input.val();
// bail early if no value
if (!value) {
return false;
}
// data
var data = {
url: value
};
// modern browsers
var file = $input[0].files.length ? acf.isget($input[0].files, 0) : false;
if (file) {
// update data
data.size = file.size;
data.type = file.type;
// image
if (file.type.indexOf('image') > -1) {
// vars
var windowURL = window.URL || window.webkitURL;
var img = new Image();
img.onload = function () {
// update
data.width = this.width;
data.height = this.height;
callback(data);
};
img.src = windowURL.createObjectURL(file);
} else {
callback(data);
}
} else {
callback(data);
}
};
/**
* acf.isAjaxSuccess
*
* description
*
* @date 18/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.isAjaxSuccess = function (json) {
return json && json.success;
};
/**
* acf.getAjaxMessage
*
* description
*
* @date 18/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.getAjaxMessage = function (json) {
return acf.isget(json, 'data', 'message');
};
/**
* acf.getAjaxError
*
* description
*
* @date 18/1/18
* @since 5.6.5
*
* @param type $var Description. Default.
* @return type Description.
*/
acf.getAjaxError = function (json) {
return acf.isget(json, 'data', 'error');
};
/**
* Returns the error message from an XHR object.
*
* @date 17/3/20
* @since 5.8.9
*
* @param object xhr The XHR object.
* @return (string)
*/
acf.getXhrError = function (xhr) {
if (xhr.responseJSON) {
// Responses via `return new WP_Error();`
if (xhr.responseJSON.message) {
return xhr.responseJSON.message;
}
// Responses via `wp_send_json_error();`.
if (xhr.responseJSON.data && xhr.responseJSON.data.error) {
return xhr.responseJSON.data.error;
}
} else if (xhr.statusText) {
return xhr.statusText;
}
return '';
};
/**
* acf.renderSelect
*
* Renders the innter html for a select field.
*
* @date 19/2/18
* @since 5.6.9
*
* @param jQuery $select The select element.
* @param array choices An array of choices.
* @return void
*/
acf.renderSelect = function ($select, choices) {
// vars
var value = $select.val();
var values = [];
// callback
var crawl = function (items) {
// vars
var itemsHtml = '';
// loop
items.map(function (item) {
// vars
var text = item.text || item.label || '';
var id = item.id || item.value || '';
// append
values.push(id);
// optgroup
if (item.children) {
itemsHtml += '<optgroup label="' + acf.escAttr(text) + '">' + crawl(item.children) + '</optgroup>';
// option
} else {
itemsHtml += '<option value="' + acf.escAttr(id) + '"' + (item.disabled ? ' disabled="disabled"' : '') + '>' + acf.strEscape(text) + '</option>';
}
});
// return
return itemsHtml;
};
// update HTML
$select.html(crawl(choices));
// update value
if (values.indexOf(value) > -1) {
$select.val(value);
}
// return selected value
return $select.val();
};
/**
* acf.lock
*
* Creates a "lock" on an element for a given type and key
*
* @date 22/2/18
* @since 5.6.9
*
* @param jQuery $el The element to lock.
* @param string type The type of lock such as "condition" or "visibility".
* @param string key The key that will be used to unlock.
* @return void
*/
var getLocks = function ($el, type) {
return $el.data('acf-lock-' + type) || [];
};
var setLocks = function ($el, type, locks) {
$el.data('acf-lock-' + type, locks);
};
acf.lock = function ($el, type, key) {
var locks = getLocks($el, type);
var i = locks.indexOf(key);
if (i < 0) {
locks.push(key);
setLocks($el, type, locks);
}
};
/**
* acf.unlock
*
* Unlocks a "lock" on an element for a given type and key
*
* @date 22/2/18
* @since 5.6.9
*
* @param jQuery $el The element to lock.
* @param string type The type of lock such as "condition" or "visibility".
* @param string key The key that will be used to unlock.
* @return void
*/
acf.unlock = function ($el, type, key) {
var locks = getLocks($el, type);
var i = locks.indexOf(key);
if (i > -1) {
locks.splice(i, 1);
setLocks($el, type, locks);
}
// return true if is unlocked (no locks)
return locks.length === 0;
};
/**
* acf.isLocked
*
* Returns true if a lock exists for a given type
*
* @date 22/2/18
* @since 5.6.9
*
* @param jQuery $el The element to lock.
* @param string type The type of lock such as "condition" or "visibility".
* @return void
*/
acf.isLocked = function ($el, type) {
return getLocks($el, type).length > 0;
};
/**
* acf.isGutenberg
*
* Returns true if the Gutenberg editor is being used.
*
* @date 14/11/18
* @since 5.8.0
*
* @param vois
* @return bool
*/
acf.isGutenberg = function () {
return !!(window.wp && wp.data && wp.data.select && wp.data.select('core/editor'));
};
/**
* acf.objectToArray
*
* Returns an array of items from the given object.
*
* @date 20/11/18
* @since 5.8.0
*
* @param object obj The object of items.
* @return array
*/
acf.objectToArray = function (obj) {
return Object.keys(obj).map(function (key) {
return obj[key];
});
};
/**
* acf.debounce
*
* Returns a debounced version of the passed function which will postpone its execution until after `wait` milliseconds have elapsed since the last time it was invoked.
*
* @date 28/8/19
* @since 5.8.1
*
* @param function callback The callback function.
* @return int wait The number of milliseconds to wait.
*/
acf.debounce = function (callback, wait) {
var timeout;
return function () {
var context = this;
var args = arguments;
var later = function () {
callback.apply(context, args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
/**
* acf.throttle
*
* Returns a throttled version of the passed function which will allow only one execution per `limit` time period.
*
* @date 28/8/19
* @since 5.8.1
*
* @param function callback The callback function.
* @return int wait The number of milliseconds to wait.
*/
acf.throttle = function (callback, limit) {
var busy = false;
return function () {
if (busy) return;
busy = true;
setTimeout(function () {
busy = false;
}, limit);
callback.apply(this, arguments);
};
};
/**
* acf.isInView
*
* Returns true if the given element is in view.
*
* @date 29/8/19
* @since 5.8.1
*
* @param elem el The dom element to inspect.
* @return bool
*/
acf.isInView = function (el) {
if (el instanceof jQuery) {
el = el[0];
}
var rect = el.getBoundingClientRect();
return rect.top !== rect.bottom && rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth);
};
/**
* acf.onceInView
*
* Watches for a dom element to become visible in the browser and then excecutes the passed callback.
*
* @date 28/8/19
* @since 5.8.1
*
* @param dom el The dom element to inspect.
* @param function callback The callback function.
*/
acf.onceInView = function () {
// Define list.
var items = [];
var id = 0;
// Define check function.
var check = function () {
items.forEach(function (item) {
if (acf.isInView(item.el)) {
item.callback.apply(this);
pop(item.id);
}
});
};
// And create a debounced version.
var debounced = acf.debounce(check, 300);
// Define add function.
var push = function (el, callback) {
// Add event listener.
if (!items.length) {
$(window).on('scroll resize', debounced).on('acfrefresh orientationchange', check);
}
// Append to list.
items.push({
id: id++,
el: el,
callback: callback
});
};
// Define remove function.
var pop = function (id) {
// Remove from list.
items = items.filter(function (item) {
return item.id !== id;
});
// Clean up listener.
if (!items.length) {
$(window).off('scroll resize', debounced).off('acfrefresh orientationchange', check);
}
};
// Define returned function.
return function (el, callback) {
// Allow jQuery object.
if (el instanceof jQuery) el = el[0];
// Execute callback if already in view or add to watch list.
if (acf.isInView(el)) {
callback.apply(this);
} else {
push(el, callback);
}
};
}();
/**
* acf.once
*
* Creates a function that is restricted to invoking `func` once.
*
* @date 2/9/19
* @since 5.8.1
*
* @param function func The function to restrict.
* @return function
*/
acf.once = function (func) {
var i = 0;
return function () {
if (i++ > 0) {
return func = undefined;
}
return func.apply(this, arguments);
};
};
/**
* Focuses attention to a specific element.
*
* @date 05/05/2020
* @since 5.9.0
*
* @param jQuery $el The jQuery element to focus.
* @return void
*/
acf.focusAttention = function ($el) {
var wait = 1000;
// Apply class to focus attention.
$el.addClass('acf-attention -focused');
// Scroll to element if needed.
var scrollTime = 500;
if (!acf.isInView($el)) {
$('body, html').animate({
scrollTop: $el.offset().top - $(window).height() / 2
}, scrollTime);
wait += scrollTime;
}
// Remove class after $wait amount of time.
var fadeTime = 250;
setTimeout(function () {
$el.removeClass('-focused');
setTimeout(function () {
$el.removeClass('acf-attention');
}, fadeTime);
}, wait);
};
/**
* Description
*
* @date 05/05/2020
* @since 5.9.0
*
* @param type Var Description.
* @return type Description.
*/
acf.onFocus = function ($el, callback) {
// Only run once per element.
// if( $el.data('acf.onFocus') ) {
// return false;
// }
// Vars.
var ignoreBlur = false;
var focus = false;
// Functions.
var onFocus = function () {
ignoreBlur = true;
setTimeout(function () {
ignoreBlur = false;
}, 1);
setFocus(true);
};
var onBlur = function () {
if (!ignoreBlur) {
setFocus(false);
}
};
var addEvents = function () {
$(document).on('click', onBlur);
//$el.on('acfBlur', onBlur);
$el.on('blur', 'input, select, textarea', onBlur);
};
var removeEvents = function () {
$(document).off('click', onBlur);
//$el.off('acfBlur', onBlur);
$el.off('blur', 'input, select, textarea', onBlur);
};
var setFocus = function (value) {
if (focus === value) {
return;
}
if (value) {
addEvents();
} else {
removeEvents();
}
focus = value;
callback(value);
};
// Add events and set data.
$el.on('click', onFocus);
//$el.on('acfFocus', onFocus);
$el.on('focus', 'input, select, textarea', onFocus);
//$el.data('acf.onFocus', true);
};
/*
* exists
*
* This function will return true if a jQuery selection exists
*
* @type function
* @date 8/09/2014
* @since 5.0.0
*
* @param n/a
* @return (boolean)
*/
$.fn.exists = function () {
return $(this).length > 0;
};
/*
* outerHTML
*
* This function will return a string containing the HTML of the selected element
*
* @type function
* @date 19/11/2013
* @since 5.0.0
*
* @param $.fn
* @return (string)
*/
$.fn.outerHTML = function () {
return $(this).get(0).outerHTML;
};
/*
* indexOf
*
* This function will provide compatibility for ie8
*
* @type function
* @date 5/3/17
* @since 5.5.10
*
* @param n/a
* @return n/a
*/
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (val) {
return $.inArray(val, this);
};
}
/**
* Returns true if value is a number or a numeric string.
*
* @date 30/11/20
* @since 5.9.4
* @link https://stackoverflow.com/questions/9716468/pure-javascript-a-function-like-jquerys-isnumeric/9716488#9716488
*
* @param mixed n The variable being evaluated.
* @return bool.
*/
acf.isNumeric = function (n) {
return !isNaN(parseFloat(n)) && isFinite(n);
};
/**
* Triggers a "refresh" action used by various Components to redraw the DOM.
*
* @date 26/05/2020
* @since 5.9.0
*
* @param void
* @return void
*/
acf.refresh = acf.debounce(function () {
$(window).trigger('acfrefresh');
acf.doAction('refresh');
}, 0);
// Set up actions from events
$(document).ready(function () {
acf.doAction('ready');
});
$(window).on('load', function () {
// Use timeout to ensure action runs after Gutenberg has modified DOM elements during "DOMContentLoaded".
setTimeout(function () {
acf.doAction('load');
});
});
$(window).on('beforeunload', function () {
acf.doAction('unload');
});
$(window).on('resize', function () {
acf.doAction('resize');
});
$(document).on('sortstart', function (event, ui) {
acf.doAction('sortstart', ui.item, ui.placeholder);
});
$(document).on('sortstop', function (event, ui) {
acf.doAction('sortstop', ui.item, ui.placeholder);
});
})(jQuery);
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
!function() {
"use strict";
/*!*************************************************************!*\
!*** ./src/advanced-custom-fields-pro/assets/src/js/acf.js ***!
\*************************************************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _acf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_acf.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf.js");
/* harmony import */ var _acf_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_acf_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _acf_hooks_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_acf-hooks.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf-hooks.js");
/* harmony import */ var _acf_hooks_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_acf_hooks_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _acf_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_acf-model.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf-model.js");
/* harmony import */ var _acf_model_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_acf_model_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _acf_popup_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_acf-popup.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf-popup.js");
/* harmony import */ var _acf_popup_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_acf_popup_js__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _acf_modal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_acf-modal.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf-modal.js");
/* harmony import */ var _acf_modal_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_acf_modal_js__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _acf_panel_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_acf-panel.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf-panel.js");
/* harmony import */ var _acf_panel_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_acf_panel_js__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _acf_notice_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_acf-notice.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf-notice.js");
/* harmony import */ var _acf_notice_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_acf_notice_js__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var _acf_tooltip_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./_acf-tooltip.js */ "./src/advanced-custom-fields-pro/assets/src/js/_acf-tooltip.js");
/* harmony import */ var _acf_tooltip_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_acf_tooltip_js__WEBPACK_IMPORTED_MODULE_7__);
}();
/******/ })()
;
//# sourceMappingURL=acf.js.map