221 lines
6.0 KiB
JavaScript
Executable File
221 lines
6.0 KiB
JavaScript
Executable File
(function ($) {
|
|
"use strict";
|
|
|
|
var blogloDependencies = {
|
|
listenTo: {},
|
|
|
|
init: function () {
|
|
var self = this;
|
|
|
|
// Initialize visibility on load
|
|
wp.customize.control.each(function (control) {
|
|
self.showBlogloControl(control);
|
|
});
|
|
|
|
_.each(self.listenTo, function (slaves, master) {
|
|
_.each(slaves, function (slave) {
|
|
wp.customize(master, function (setting) {
|
|
var setupControl = function (control) {
|
|
var setActiveState, isDisplayed;
|
|
|
|
isDisplayed = function () {
|
|
return self.showBlogloControl(wp.customize.control(slave));
|
|
};
|
|
setActiveState = function () {
|
|
control.active.set(isDisplayed());
|
|
};
|
|
|
|
setActiveState();
|
|
setting.bind(setActiveState);
|
|
control.active.validate = isDisplayed;
|
|
};
|
|
wp.customize.control(slave, setupControl);
|
|
});
|
|
});
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Should we show the control?
|
|
*
|
|
* @since 1.0.0
|
|
* @param {string|object} control - The control-id or the control object.
|
|
* @returns {bool}
|
|
*/
|
|
showBlogloControl: function (control) {
|
|
var self = this,
|
|
show = true,
|
|
i;
|
|
|
|
if (_.isString(control)) {
|
|
control = wp.customize.control(control);
|
|
}
|
|
|
|
// Exit early if control not found or if "required" argument is not defined.
|
|
if (
|
|
"undefined" === typeof control ||
|
|
(control.params && _.isEmpty(control.params.required))
|
|
) {
|
|
return true;
|
|
}
|
|
|
|
// Loop control requirements.
|
|
for (i = 0; i < control.params.required.length; i++) {
|
|
if (!self.checkCondition(control.params.required[i], control, "AND")) {
|
|
show = false;
|
|
}
|
|
}
|
|
|
|
return show;
|
|
},
|
|
|
|
/**
|
|
* Check a condition.
|
|
*
|
|
* @since 1.0.0
|
|
* @param {Object} requirement - The requirement, inherited from showBlogloControl.
|
|
* @param {Object} control - The control object.
|
|
* @param {string} relation - Can be one of 'AND' or 'OR'.
|
|
*/
|
|
checkCondition: function (requirement, control, relation) {
|
|
var self = this,
|
|
childRelation = "AND" === relation ? "OR" : "AND",
|
|
nestedItems,
|
|
i;
|
|
|
|
// If an array of other requirements nested, we need to process them separately.
|
|
if (
|
|
"undefined" !== typeof requirement[0] &&
|
|
"undefined" === typeof requirement.control
|
|
) {
|
|
nestedItems = [];
|
|
|
|
// Loop sub-requirements.
|
|
for (i = 0; i < requirement.length; i++) {
|
|
nestedItems.push(
|
|
self.checkCondition(requirement[i], control, childRelation)
|
|
);
|
|
}
|
|
|
|
// OR relation. Check that true is part of the array.
|
|
if ("OR" === childRelation) {
|
|
return -1 !== nestedItems.indexOf(true);
|
|
}
|
|
|
|
// AND relation. Check that false is not part of the array.
|
|
return -1 === nestedItems.indexOf(false);
|
|
}
|
|
|
|
// Early exit if setting is not defined.
|
|
if ("undefined" === typeof wp.customize.control(requirement.control)) {
|
|
return true;
|
|
}
|
|
|
|
self.listenTo[requirement.control] =
|
|
self.listenTo[requirement.control] || [];
|
|
if (-1 === self.listenTo[requirement.control].indexOf(control.id)) {
|
|
self.listenTo[requirement.control].push(control.id);
|
|
}
|
|
|
|
return self.evaluate(
|
|
requirement.value,
|
|
wp.customize.control(requirement.control).setting._value,
|
|
requirement.operator
|
|
);
|
|
},
|
|
|
|
/**
|
|
* Figure out if the 2 values have the relation we want.
|
|
*
|
|
* @since 1.0.0
|
|
* @param {mixed} value1 - The 1st value.
|
|
* @param {mixed} value2 - The 2nd value.
|
|
* @param {string} operator - The comparison to use.
|
|
* @returns {bool}
|
|
*/
|
|
evaluate: function (value1, value2, operator) {
|
|
var found = false;
|
|
|
|
if ("===" === operator) {
|
|
return value1 === value2;
|
|
}
|
|
if (
|
|
"==" === operator ||
|
|
"=" === operator ||
|
|
"equals" === operator ||
|
|
"equal" === operator
|
|
) {
|
|
return value1 == value2;
|
|
}
|
|
if ("!==" === operator) {
|
|
return value1 !== value2;
|
|
}
|
|
if ("!=" === operator || "not equal" === operator) {
|
|
return value1 != value2;
|
|
}
|
|
if (
|
|
">=" === operator ||
|
|
"greater or equal" === operator ||
|
|
"equal or greater" === operator
|
|
) {
|
|
return value2 >= value1;
|
|
}
|
|
if (
|
|
"<=" === operator ||
|
|
"smaller or equal" === operator ||
|
|
"equal or smaller" === operator
|
|
) {
|
|
return value2 <= value1;
|
|
}
|
|
if (">" === operator || "greater" === operator) {
|
|
return value2 > value1;
|
|
}
|
|
if ("<" === operator || "smaller" === operator) {
|
|
return value2 < value1;
|
|
}
|
|
if ("contains" === operator || "in" === operator) {
|
|
if (_.isArray(value1) && _.isArray(value2)) {
|
|
_.each(value2, function (value) {
|
|
if (value1.includes(value)) {
|
|
found = true;
|
|
return false;
|
|
}
|
|
});
|
|
return found;
|
|
}
|
|
if (_.isArray(value2)) {
|
|
_.each(value2, function (value) {
|
|
if (value == value1) {
|
|
// jshint ignore:line
|
|
found = true;
|
|
}
|
|
});
|
|
return found;
|
|
}
|
|
if (_.isObject(value2)) {
|
|
if (!_.isUndefined(value2[value1])) {
|
|
found = true;
|
|
}
|
|
_.each(value2, function (subValue) {
|
|
if (value1 === subValue) {
|
|
found = true;
|
|
}
|
|
});
|
|
return found;
|
|
}
|
|
if (_.isString(value2)) {
|
|
if (_.isString(value1)) {
|
|
return -1 < value1.indexOf(value2) && -1 < value2.indexOf(value1);
|
|
}
|
|
return -1 < value1.indexOf(value2);
|
|
}
|
|
}
|
|
return value1 == value2;
|
|
},
|
|
}; // END var blogloDependencies
|
|
|
|
$(document).ready(function () {
|
|
blogloDependencies.init();
|
|
});
|
|
})(jQuery);
|