4480 lines
102 KiB
JavaScript
4480 lines
102 KiB
JavaScript
/******/ (() => { // 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 (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 ($, 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 ($, 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 ($, 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 () {
|
||
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 ($, 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 ($, 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 ($, 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 ($, 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 = {
|
||
'&': '&',
|
||
'<': '<',
|
||
'>': '>',
|
||
'"': '"',
|
||
"'": '''
|
||
};
|
||
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 & 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 = {
|
||
'&': '&',
|
||
'<': '<',
|
||
'>': '>',
|
||
'"': '"',
|
||
''': "'"
|
||
};
|
||
return ('' + string).replace(/&|<|>|"|'/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 & 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.
|
||
*
|
||
* @since 5.8.0
|
||
*
|
||
* @return bool
|
||
*/
|
||
acf.isGutenberg = function () {
|
||
return !!(window.wp && wp.data && wp.data.select && wp.data.select('core/editor'));
|
||
};
|
||
|
||
/**
|
||
* acf.isGutenbergPostEditor
|
||
*
|
||
* Returns true if the Gutenberg post editor is being used.
|
||
*
|
||
* @since 6.2.2
|
||
*
|
||
* @return bool
|
||
*/
|
||
acf.isGutenbergPostEditor = function () {
|
||
return !!(window.wp && wp.data && wp.data.select && wp.data.select('core/edit-post'));
|
||
};
|
||
|
||
/**
|
||
* 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);
|
||
};
|
||
|
||
/**
|
||
* Disable form submit buttons
|
||
*
|
||
* @since 6.2.3
|
||
*
|
||
* @param event e
|
||
* @returns void
|
||
*/
|
||
acf.disableForm = function (e) {
|
||
// Disable submit button.
|
||
if (e.submitter) e.submitter.classList.add('disabled');
|
||
};
|
||
|
||
/*
|
||
* 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 */
|
||
/******/ (() => {
|
||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||
/******/ __webpack_require__.n = (module) => {
|
||
/******/ var getter = module && module.__esModule ?
|
||
/******/ () => (module['default']) :
|
||
/******/ () => (module);
|
||
/******/ __webpack_require__.d(getter, { a: getter });
|
||
/******/ return getter;
|
||
/******/ };
|
||
/******/ })();
|
||
/******/
|
||
/******/ /* webpack/runtime/define property getters */
|
||
/******/ (() => {
|
||
/******/ // define getter functions for harmony exports
|
||
/******/ __webpack_require__.d = (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 */
|
||
/******/ (() => {
|
||
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
||
/******/ })();
|
||
/******/
|
||
/******/ /* webpack/runtime/make namespace object */
|
||
/******/ (() => {
|
||
/******/ // define __esModule on exports
|
||
/******/ __webpack_require__.r = (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.
|
||
(() => {
|
||
"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
|