119 lines
2.8 KiB
React
119 lines
2.8 KiB
React
/**
|
|
* Compare 2 values
|
|
*
|
|
* @param {mixed} lval Left value.
|
|
* @param {string} operator Operator.
|
|
* @param {mixed} rval Right value.
|
|
*
|
|
* @returns {boolean}
|
|
*/
|
|
function compare( lval, operator, rval ) {
|
|
let checkResult = true;
|
|
|
|
switch ( operator ) {
|
|
case '==':
|
|
checkResult = lval == rval;
|
|
break;
|
|
case '===':
|
|
checkResult = lval === rval;
|
|
break;
|
|
case '!=':
|
|
checkResult = lval != rval;
|
|
break;
|
|
case '!==':
|
|
checkResult = lval !== rval;
|
|
break;
|
|
case '>=':
|
|
checkResult = lval >= rval;
|
|
break;
|
|
case '<=':
|
|
checkResult = lval <= rval;
|
|
break;
|
|
case '>':
|
|
checkResult = lval > rval;
|
|
break;
|
|
case '<':
|
|
checkResult = lval < rval;
|
|
break;
|
|
case 'AND':
|
|
checkResult = lval && rval;
|
|
break;
|
|
case 'OR':
|
|
checkResult = lval || rval;
|
|
break;
|
|
default:
|
|
checkResult = lval;
|
|
break;
|
|
}
|
|
|
|
return checkResult;
|
|
}
|
|
|
|
/**
|
|
* Check condition
|
|
*
|
|
* @param {Object} conditions - Conditions array.
|
|
* @param {Object} attributes - Available block attributes.
|
|
* @param {string} relation - Can be one of 'AND' or 'OR'.
|
|
*
|
|
* @returns {Boolean}
|
|
*/
|
|
function checkCondition( conditions, attributes, relation ) {
|
|
const childRelation = ( 'AND' === relation ) ? 'OR' : 'AND';
|
|
|
|
// by default result will be TRUE for relation AND
|
|
// and FALSE for relation OR.
|
|
let result = relation === 'AND';
|
|
|
|
conditions.forEach( ( data ) => {
|
|
if ( Array.isArray( data ) ) {
|
|
result = compare( result, relation, checkCondition( data, attributes, childRelation ) );
|
|
} else if ( data.field ) {
|
|
const splitValName = data.field.split( '.' );
|
|
let fieldVal = undefined;
|
|
|
|
// check for array values like:
|
|
// toggleListName['option1']
|
|
if ( 2 === splitValName.length && typeof attributes[ splitValName[ 0 ] ] !== 'undefined' && typeof attributes[ splitValName[ 0 ] ][ splitValName[ 1 ] ] !== 'undefined' ) {
|
|
fieldVal = attributes[ splitValName[ 0 ] ][ splitValName[ 1 ] ];
|
|
}
|
|
|
|
// check for normal values
|
|
if ( typeof fieldVal === 'undefined' ) {
|
|
fieldVal = attributes[ data.field ];
|
|
}
|
|
|
|
// check count
|
|
if ( typeof data.count !== 'undefined' ) {
|
|
const count = fieldVal.split( data['count'] );
|
|
fieldVal = count.length - 1;
|
|
}
|
|
|
|
if ( typeof fieldVal !== 'undefined' ) {
|
|
result = compare( result, relation, compare( fieldVal, data.operator, data.value ) );
|
|
}
|
|
}
|
|
} );
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Check field visible.
|
|
*/
|
|
function isFieldVisible(key, config, attributes) {
|
|
var visible;
|
|
|
|
// Set visible.
|
|
visible = config.attributes[key]['visible'];
|
|
|
|
// Check active_callback in fields.
|
|
if ( visible && config.attributes[key]['active_callback'] && config.attributes[key]['active_callback'].length ) {
|
|
visible = checkCondition( config.attributes[key]['active_callback'], attributes, 'AND' );
|
|
}
|
|
|
|
return visible;
|
|
}
|
|
|
|
export { isFieldVisible };
|