306 lines
5.4 KiB
JavaScript
306 lines
5.4 KiB
JavaScript
(function($, undefined){
|
|
|
|
// vars
|
|
var CONTEXT = 'conditional_logic';
|
|
|
|
/**
|
|
* conditionsManager
|
|
*
|
|
* description
|
|
*
|
|
* @date 1/2/18
|
|
* @since 5.6.5
|
|
*
|
|
* @param type $var Description. Default.
|
|
* @return type Description.
|
|
*/
|
|
|
|
var conditionsManager = new acf.Model({
|
|
|
|
id: 'conditionsManager',
|
|
|
|
priority: 20, // run actions later
|
|
|
|
actions: {
|
|
'new_field': 'onNewField',
|
|
},
|
|
|
|
onNewField: function( field ){
|
|
if( field.has('conditions') ) {
|
|
field.getConditions().render();
|
|
}
|
|
},
|
|
});
|
|
|
|
/**
|
|
* acf.Field.prototype.getField
|
|
*
|
|
* Finds a field that is related to another field
|
|
*
|
|
* @date 1/2/18
|
|
* @since 5.6.5
|
|
*
|
|
* @param type $var Description. Default.
|
|
* @return type Description.
|
|
*/
|
|
|
|
var getSiblingField = function( field, key ){
|
|
|
|
// find sibling (very fast)
|
|
var fields = acf.getFields({
|
|
key: key,
|
|
sibling: field.$el,
|
|
suppressFilters: true,
|
|
});
|
|
|
|
// find sibling-children (fast)
|
|
// needed for group fields, accordions, etc
|
|
if( !fields.length ) {
|
|
fields = acf.getFields({
|
|
key: key,
|
|
parent: field.$el.parent(),
|
|
suppressFilters: true,
|
|
});
|
|
}
|
|
|
|
// return
|
|
if( fields.length ) {
|
|
return fields[0];
|
|
}
|
|
return false;
|
|
};
|
|
|
|
acf.Field.prototype.getField = function( key ){
|
|
|
|
// get sibling field
|
|
var field = getSiblingField( this, key );
|
|
|
|
// return early
|
|
if( field ) {
|
|
return field;
|
|
}
|
|
|
|
// move up through each parent and try again
|
|
var parents = this.parents();
|
|
for( var i = 0; i < parents.length; i++ ) {
|
|
|
|
// get sibling field
|
|
field = getSiblingField( parents[i], key );
|
|
|
|
// return early
|
|
if( field ) {
|
|
return field;
|
|
}
|
|
}
|
|
|
|
// return
|
|
return false;
|
|
};
|
|
|
|
|
|
/**
|
|
* acf.Field.prototype.getConditions
|
|
*
|
|
* Returns the field's conditions instance
|
|
*
|
|
* @date 1/2/18
|
|
* @since 5.6.5
|
|
*
|
|
* @param type $var Description. Default.
|
|
* @return type Description.
|
|
*/
|
|
|
|
acf.Field.prototype.getConditions = function(){
|
|
|
|
// instantiate
|
|
if( !this.conditions ) {
|
|
this.conditions = new Conditions( this );
|
|
}
|
|
|
|
// return
|
|
return this.conditions;
|
|
};
|
|
|
|
|
|
/**
|
|
* Conditions
|
|
*
|
|
* description
|
|
*
|
|
* @date 1/2/18
|
|
* @since 5.6.5
|
|
*
|
|
* @param type $var Description. Default.
|
|
* @return type Description.
|
|
*/
|
|
var timeout = false;
|
|
var Conditions = acf.Model.extend({
|
|
|
|
id: 'Conditions',
|
|
|
|
data: {
|
|
field: false, // The field with "data-conditions" (target).
|
|
timeStamp: false, // Reference used during "change" event.
|
|
groups: [], // The groups of condition instances.
|
|
},
|
|
|
|
setup: function( field ){
|
|
|
|
// data
|
|
this.data.field = field;
|
|
|
|
// vars
|
|
var conditions = field.get('conditions');
|
|
|
|
// detect groups
|
|
if( conditions instanceof Array ) {
|
|
|
|
// detect groups
|
|
if( conditions[0] instanceof Array ) {
|
|
|
|
// loop
|
|
conditions.map(function(rules, i){
|
|
this.addRules( rules, i );
|
|
}, this);
|
|
|
|
// detect rules
|
|
} else {
|
|
this.addRules( conditions );
|
|
}
|
|
|
|
// detect rule
|
|
} else {
|
|
this.addRule( conditions );
|
|
}
|
|
},
|
|
|
|
change: function( e ){
|
|
|
|
// this function may be triggered multiple times per event due to multiple condition classes
|
|
// compare timestamp to allow only 1 trigger per event
|
|
if( this.get('timeStamp') === e.timeStamp ) {
|
|
return false;
|
|
} else {
|
|
this.set('timeStamp', e.timeStamp, true);
|
|
}
|
|
|
|
// render condition and store result
|
|
var changed = this.render();
|
|
},
|
|
|
|
render: function(){
|
|
return this.calculate() ? this.show() : this.hide();
|
|
},
|
|
|
|
show: function(){
|
|
return this.get('field').showEnable(this.cid, CONTEXT);
|
|
},
|
|
|
|
hide: function(){
|
|
return this.get('field').hideDisable(this.cid, CONTEXT);
|
|
},
|
|
|
|
calculate: function(){
|
|
|
|
// vars
|
|
var pass = false;
|
|
|
|
// loop
|
|
this.getGroups().map(function( group ){
|
|
|
|
// igrnore this group if another group passed
|
|
if( pass ) return;
|
|
|
|
// find passed
|
|
var passed = group.filter(function(condition){
|
|
return condition.calculate();
|
|
});
|
|
|
|
// if all conditions passed, update the global var
|
|
if( passed.length == group.length ) {
|
|
pass = true;
|
|
}
|
|
});
|
|
|
|
return pass;
|
|
},
|
|
|
|
hasGroups: function(){
|
|
return this.data.groups != null;
|
|
},
|
|
|
|
getGroups: function(){
|
|
return this.data.groups;
|
|
},
|
|
|
|
addGroup: function(){
|
|
var group = [];
|
|
this.data.groups.push( group );
|
|
return group;
|
|
},
|
|
|
|
hasGroup: function( i ){
|
|
return this.data.groups[i] != null;
|
|
},
|
|
|
|
getGroup: function( i ){
|
|
return this.data.groups[i];
|
|
},
|
|
|
|
removeGroup: function( i ){
|
|
this.data.groups[i].delete;
|
|
return this;
|
|
},
|
|
|
|
addRules: function( rules, group ){
|
|
rules.map(function( rule ){
|
|
this.addRule( rule, group );
|
|
}, this);
|
|
},
|
|
|
|
addRule: function( rule, group ){
|
|
|
|
// defaults
|
|
group = group || 0;
|
|
|
|
// vars
|
|
var groupArray;
|
|
|
|
// get group
|
|
if( this.hasGroup(group) ) {
|
|
groupArray = this.getGroup(group);
|
|
} else {
|
|
groupArray = this.addGroup();
|
|
}
|
|
|
|
// instantiate
|
|
var condition = acf.newCondition( rule, this );
|
|
|
|
// bail ealry if condition failed (field did not exist)
|
|
if( !condition ) {
|
|
return false;
|
|
}
|
|
|
|
// add rule
|
|
groupArray.push(condition);
|
|
},
|
|
|
|
hasRule: function(){
|
|
|
|
},
|
|
|
|
getRule: function( rule, group ){
|
|
|
|
// defaults
|
|
rule = rule || 0;
|
|
group = group || 0;
|
|
|
|
return this.data.groups[ group ][ rule ];
|
|
},
|
|
|
|
removeRule: function(){
|
|
|
|
}
|
|
});
|
|
|
|
})(jQuery); |