960 lines
26 KiB
JavaScript
960 lines
26 KiB
JavaScript
/* global FusionApp, fusionAllElements, FusionEvents, FusionPageBuilderViewManager, FusionPageBuilderApp */
|
|
/* jshint -W024, -W098*/
|
|
var FusionPageBuilder = FusionPageBuilder || {};
|
|
|
|
( function() {
|
|
|
|
FusionPageBuilder.Dependencies = Backbone.Model.extend( {
|
|
|
|
/**
|
|
* Init.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {void}
|
|
*/
|
|
initialize: function( options, view, $targetEl, repeaterFields, $parentEl ) {
|
|
var self = this,
|
|
currentOptions;
|
|
|
|
this.$targetEl = 'undefined' !== typeof $targetEl ? $targetEl : view.$el;
|
|
this.repeaterFields = 'undefined' !== typeof repeaterFields ? repeaterFields : false;
|
|
this.$parentEl = 'undefined' !== typeof $parentEl ? $parentEl : this.$targetEl;
|
|
this.type = view.type;
|
|
this.elementView = view;
|
|
|
|
// Dependency object key names
|
|
switch ( this.type ) {
|
|
|
|
case 'TO':
|
|
self.dependencyKey = 'required';
|
|
self.settingKey = 'setting';
|
|
self.operatorKey = 'operator';
|
|
currentOptions = view.options;
|
|
|
|
break;
|
|
|
|
case 'PO':
|
|
self.dependencyKey = 'dependency';
|
|
self.settingKey = 'field';
|
|
self.operatorKey = 'comparison';
|
|
currentOptions = view.options;
|
|
|
|
break;
|
|
|
|
case 'EO':
|
|
self.dependencyKey = 'dependency';
|
|
self.settingKey = 'element';
|
|
self.operatorKey = 'operator';
|
|
currentOptions = options;
|
|
|
|
break;
|
|
}
|
|
|
|
// Special case, we override view options from repeater.
|
|
if ( self.repeaterFields ) {
|
|
self.currentOptions = repeaterFields;
|
|
} else {
|
|
self.currentOptions = currentOptions;
|
|
}
|
|
|
|
self.parentValues = 'undefined' !== typeof view.parentValues ? view.parentValues : false;
|
|
|
|
self.collectDependencies();
|
|
self.collectDependencyIds();
|
|
|
|
if ( 'undefined' !== typeof self.dependencyIds && self.dependencyIds.length ) {
|
|
this.$targetEl.find( self.dependencyIds.substring( 2 ) ).on( 'change paste keyup fusion-change', function() {
|
|
self.processDependencies( jQuery( this ).attr( 'id' ), view );
|
|
} );
|
|
|
|
// Listen for TO changes, refresh dependencies for new default.
|
|
if ( 'object' === typeof self.dependencies ) {
|
|
_.each( _.keys( self.dependencies ), function( param ) {
|
|
FusionEvents.on( 'fusion-param-default-update-' + param, function() {
|
|
self.processDependencies( param, view );
|
|
} );
|
|
} );
|
|
}
|
|
}
|
|
|
|
// Repeater dependency from parent view.
|
|
if ( 'undefined' !== typeof self.parentDependencyIds && self.parentDependencyIds.length ) {
|
|
this.$parentEl.on( 'change paste keyup fusion-change', self.parentDependencyIds.substring( 2 ), function() {
|
|
self.processDependencies( jQuery( this ).attr( 'id' ), view, true );
|
|
} );
|
|
}
|
|
|
|
self.dependenciesInitialCheck( view );
|
|
|
|
// Process page option default values.
|
|
if ( 'PO' === view.type ) {
|
|
self.processPoDefaults( view );
|
|
} else if ( 'EO' === view.type && 'undefined' !== typeof avadaPanelIFrame ) {
|
|
self.processEoDefaults( view );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Initial option dependencies check.
|
|
*
|
|
* @since 2.0.0
|
|
*/
|
|
dependenciesInitialCheck: function( view ) {
|
|
var self = this;
|
|
|
|
// Check for any option dependencies that are not on this tab.
|
|
jQuery.each( _.keys( self.dependencies ), function( index, value ) { // jshint ignore: line
|
|
if ( 'undefined' === typeof self.currentOptions[ value ] ) {
|
|
self.processDependencies( value, view );
|
|
}
|
|
} );
|
|
|
|
// Check each option on this tab.
|
|
jQuery.each( self.currentOptions, function( index ) {
|
|
self.processDependencies( index, view );
|
|
} );
|
|
},
|
|
|
|
buildPassedArray: function( dependencies, gutterCheck ) {
|
|
|
|
var self = this,
|
|
$passedArray = [],
|
|
toName;
|
|
|
|
// Check each dependency for that id.
|
|
jQuery.each( dependencies, function( index, dependency ) {
|
|
|
|
var setting = dependency[ self.settingKey ],
|
|
operator = dependency[ self.operatorKey ],
|
|
value = dependency.value,
|
|
hasParent = -1 !== setting.indexOf( 'parent_' ),
|
|
element = self.repeaterFields && hasParent ? self.$parentEl.find( '.fusion-builder-module-settings' ).data( 'element' ) : self.$targetEl.find( '.fusion-builder-module-settings' ).data( 'element' ),
|
|
result = false,
|
|
poFields,
|
|
parentValue,
|
|
containerView,
|
|
containerParams;
|
|
|
|
if ( self.repeaterFields && hasParent ) {
|
|
parentValue = self.$parentEl.find( '#' + setting.replace( 'parent_', '' ) ).val();
|
|
} else if ( 0 < self.$targetEl.find( '#' + setting ).closest( '.dynamic-param-fields' ).length ) {
|
|
// Check and exclude for dynamic data fields.
|
|
parentValue = self.$targetEl.find( '#' + setting ).closest( '[data-dynamic]' ).siblings().find( '#' + setting ).val();
|
|
} else {
|
|
const input = self.$targetEl.find( '#' + setting );
|
|
// Multi Select option.
|
|
if ( input.is( 'div' ) && input.is( '.fusion-form-multiple-select' ) ) {
|
|
parentValue = [];
|
|
input.find( '.fusion-select-options input.fusion-select-option:checked' ).each( function() {
|
|
parentValue.push( jQuery( this ).val() );
|
|
} );
|
|
} else {
|
|
parentValue = input.val();
|
|
}
|
|
}
|
|
if ( 'undefined' === typeof parentValue ) {
|
|
if ( 'TO' === self.type ) {
|
|
parentValue = FusionApp.settings[ setting ];
|
|
} else if ( 'PO' === self.type ) {
|
|
if ( 'undefined' !== typeof FusionApp.data.postMeta[ setting ] ) {
|
|
parentValue = FusionApp.data.postMeta[ setting ];
|
|
}
|
|
if ( 'undefined' !== typeof FusionApp.data.postMeta._fusion && 'undefined' !== typeof FusionApp.data.postMeta._fusion[ setting ] ) {
|
|
parentValue = FusionApp.data.postMeta._fusion[ setting ];
|
|
}
|
|
|
|
// Get the default value.
|
|
if ( ( 'undefined' === typeof parentValue || '' === parentValue ) ) {
|
|
poFields = FusionApp.sidebarView.getFlatPoObject();
|
|
|
|
if ( poFields[ setting ] && poFields[ setting ][ 'default' ] ) {
|
|
parentValue = poFields[ setting ][ 'default' ];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Use fake value if dynamic data is set.
|
|
if ( '' === parentValue && ! hasParent && 'true' === self.$targetEl.find( '#' + setting ).closest( '.fusion-builder-option' ).attr( 'data-dynamic' ) ) {
|
|
parentValue = 'using-dynamic-value';
|
|
}
|
|
|
|
// Get from element defaults.
|
|
if ( ( 'undefined' === typeof parentValue || '' === parentValue ) && 'EO' === self.type && 'undefined' !== typeof fusionAllElements[ element ] && 'undefined' !== typeof fusionAllElements[ element ].defaults && 'undefined' !== typeof fusionAllElements[ element ].defaults[ setting ] ) {
|
|
parentValue = fusionAllElements[ element ].defaults[ setting ];
|
|
}
|
|
|
|
// Hide 'flex / legacy' choice for containers when Header layout section is edited.
|
|
if ( 'EO' === self.type && 'fusion_builder_container' === element && 'template_type' === setting && 'undefined' !== typeof FusionApp.data.template_category && 'header' === FusionApp.data.template_category ) {
|
|
$passedArray.push( false );
|
|
return;
|
|
}
|
|
|
|
// Hide or show 'flex / legacy' choice based on TO setting.
|
|
if ( 'EO' === self.type && 'fusion_builder_container' === element && 'template_type' === setting ) {
|
|
$passedArray.push( 'undefined' !== typeof FusionApp.settings.container_legacy_support && '1' === FusionApp.settings.container_legacy_support );
|
|
return;
|
|
}
|
|
|
|
// Special check for parent container type.
|
|
if ( 'EO' === self.type && 'fusion_builder_container' === setting && 'object' === typeof self.elementView ) {
|
|
containerView = FusionPageBuilderViewManager.getView( self.elementView.model.get( 'parent' ) );
|
|
|
|
if ( 'object' === typeof containerView ) {
|
|
containerView = FusionPageBuilderApp.getParentContainer( containerView.model.get( 'parent' ) );
|
|
if ( 'object' === typeof containerView ) {
|
|
containerParams = 'object' === typeof containerView.values ? containerView.values : containerView.model.get( 'params' );
|
|
parentValue = containerParams[ ( 'undefined' !== typeof dependency.param ? dependency.param : 'type' ) ];
|
|
$passedArray.push( self.doesTestPass( parentValue, value, operator ) );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( 'undefined' !== typeof parentValue ) {
|
|
if ( 'TO' === self.type || 'FBE' === self.type ) {
|
|
|
|
result = self.doesTestPass( parentValue, value, operator );
|
|
|
|
if ( false === gutterCheck ) {
|
|
if ( self.$targetEl.find( '[data-option-id=' + setting + ']' ).is( ':hidden' ) && ! self.$targetEl.find( '[data-option-id=' + setting + ']' ).closest( '.repeater-fields' ).length ) {
|
|
result = false;
|
|
}
|
|
}
|
|
|
|
$passedArray.push( Number( result ) );
|
|
|
|
} else { // Page Options
|
|
|
|
if ( '' === parentValue || 'default' === parentValue ) {
|
|
|
|
if ( 'undefined' !== typeof FusionApp.settingsPoTo[ setting ] ) {
|
|
|
|
// Get TO name
|
|
toName = FusionApp.settingsPoTo[ setting ];
|
|
|
|
// Get TO value
|
|
parentValue = FusionApp.settings[ toName ];
|
|
|
|
// Fix value names ( TO to PO )
|
|
parentValue = self.fixPoToValue( parentValue );
|
|
}
|
|
}
|
|
|
|
if ( 'EO' === self.type && 'undefined' !== typeof self.attributes[ setting ] && 'range' !== self.attributes[ setting ].type ) {
|
|
|
|
// Fix value names ( TO to EO )
|
|
parentValue = self.fixEoToValue( parentValue );
|
|
}
|
|
|
|
$passedArray.push( self.doesTestPass( parentValue, value, operator ) );
|
|
}
|
|
} else {
|
|
|
|
// Check parent element values. For parent to child dependencies.
|
|
if ( self.parentValues ) {
|
|
if ( 'parent_' === setting.substring( 0, 7 ) ) {
|
|
if ( 'object' === typeof self.parentValues && self.parentValues[ setting.replace( dependency.element.substring( 0, 7 ), '' ) ] ) {
|
|
parentValue = self.parentValues[ setting.replace( dependency.element.substring( 0, 7 ), '' ) ];
|
|
} else {
|
|
parentValue = '';
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check for current post type dependency.
|
|
if ( 'EO' === self.type && '_post_type_edited' === setting && 'object' === typeof self.elementView ) {
|
|
parentValue = FusionApp.data.postDetails.post_type;
|
|
}
|
|
|
|
$passedArray.push( self.doesTestPass( parentValue, value, operator ) );
|
|
}
|
|
|
|
} );
|
|
|
|
return $passedArray;
|
|
},
|
|
|
|
/**
|
|
* Collect and return all dependencies.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {void}
|
|
*/
|
|
collectDependencies: function() {
|
|
var self = this,
|
|
dependency,
|
|
optionName,
|
|
setting,
|
|
dependencies = [];
|
|
|
|
jQuery.each( self.currentOptions, function( index, value ) {
|
|
dependency = value[ self.dependencyKey ];
|
|
|
|
// Dependency found
|
|
if ( ! _.isUndefined( dependency ) ) {
|
|
optionName = index;
|
|
|
|
// Check each dependency for this option
|
|
jQuery.each( dependency, function( i, opt ) {
|
|
|
|
setting = opt[ self.settingKey ];
|
|
|
|
// If option has dependency add to check array.
|
|
if ( _.isUndefined( dependencies[ setting ] ) ) {
|
|
dependencies[ setting ] = [ { option: optionName, or: value.or } ];
|
|
} else {
|
|
dependencies[ setting ].push( { option: optionName, or: value.or } );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
|
|
self.dependencies = dependencies;
|
|
},
|
|
|
|
/**
|
|
* Collect IDs of options with dependencies.
|
|
*
|
|
* @since 2.0.0
|
|
* @return string
|
|
*/
|
|
collectDependencyIds: function() {
|
|
var self = this,
|
|
dependency,
|
|
setting,
|
|
dependencyIds = '',
|
|
parentDependencyIds = '';
|
|
|
|
jQuery.each( self.currentOptions, function( index, value ) {
|
|
dependency = value[ self.dependencyKey ];
|
|
|
|
// Dependency found
|
|
if ( ! _.isUndefined( dependency ) ) {
|
|
|
|
// Check each dependency for this option
|
|
jQuery.each( dependency, function( i, opt ) {
|
|
setting = opt[ self.settingKey ];
|
|
|
|
// Create IDs of fields to check for. ( Listeners )
|
|
if ( 'parent_' === setting.substring( 0, 7 ) && 0 > parentDependencyIds.indexOf( '#' + setting.replace( 'parent_', '' ) ) ) {
|
|
parentDependencyIds += ', #' + setting.replace( 'parent_', '' );
|
|
} else if ( 0 > dependencyIds.indexOf( '#' + setting ) ) {
|
|
dependencyIds += ', #' + setting;
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
|
|
self.dependencyIds = dependencyIds;
|
|
|
|
// Repeater, set parent dependency Ids.
|
|
if ( '' !== parentDependencyIds && self.repeaterFields ) {
|
|
self.parentDependencyIds = parentDependencyIds;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Hide or show the control for an option.
|
|
*
|
|
* @since 2.0.0
|
|
* @param {boolean} [show] Whether we want to hide or show the option.
|
|
* @param {string} [optionName] The option-name.
|
|
* @return {void}
|
|
*/
|
|
hideShowOption: function( show, optionName ) {
|
|
if ( show ) {
|
|
this.$targetEl.find( '[data-option-id="' + optionName + '"]' ).fadeIn( 300 );
|
|
this.$targetEl.find( '[data-option-id="' + optionName + '"]' ).removeClass( 'dependency-hide' );
|
|
} else {
|
|
this.$targetEl.find( '[data-option-id="' + optionName + '"]' ).hide();
|
|
this.$targetEl.find( '[data-option-id="' + optionName + '"]' ).addClass( 'dependency-hide' );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Check option for fusion-or-gutter.
|
|
*
|
|
* @since 2.0.0
|
|
* @param {Object} option
|
|
* @return {Object}
|
|
*/
|
|
toGutterCheck: function( option ) {
|
|
var singleOrGutter,
|
|
gutterSequence,
|
|
gutterCheck = false,
|
|
gutter = {};
|
|
|
|
singleOrGutter = ( ! _.isUndefined( option[ 'class' ] ) && 'fusion-or-gutter' === option[ 'class' ] ) ? option[ 'class' ] : false;
|
|
|
|
if ( ! singleOrGutter ) {
|
|
gutterSequence = ( ! _.isUndefined( option[ 'class' ] ) && 'fusion-or-gutter' !== option[ 'class' ] ) ? option[ 'class' ].replace( 'fusion-gutter-', '' ).split( '-' ) : false;
|
|
}
|
|
|
|
if ( singleOrGutter || gutterSequence ) {
|
|
gutterCheck = true;
|
|
}
|
|
|
|
gutter = {
|
|
single: singleOrGutter,
|
|
sequence: gutterSequence,
|
|
check: gutterCheck
|
|
};
|
|
|
|
return gutter;
|
|
},
|
|
|
|
/**
|
|
* Process dependencies for an option.
|
|
*
|
|
* @since 2.0.0
|
|
* @param {string} [currentId] The setting-ID.
|
|
* @return {void}
|
|
*/
|
|
processDependencies: function( currentId, view, fromParent ) {
|
|
|
|
var self = this,
|
|
gutter = {},
|
|
childGutter = {},
|
|
show = false,
|
|
optionName,
|
|
passedArray,
|
|
dependentOn,
|
|
childOptionName,
|
|
childDependencies,
|
|
childPassedArray;
|
|
|
|
if ( 'function' === typeof view.beforeProcessDependencies ) {
|
|
view.beforeProcessDependencies();
|
|
}
|
|
|
|
// If fromParent is set we need to check for ID with parent_ added.
|
|
if ( 'undefined' !== typeof fromParent && fromParent ) {
|
|
currentId = 'parent_' + currentId;
|
|
}
|
|
|
|
// Loop through each option id that is dependent on this option.
|
|
jQuery.each( self.dependencies[ currentId ], function( index, value ) {
|
|
show = false;
|
|
optionName = value.option;
|
|
dependentOn = self.currentOptions[ optionName ][ self.dependencyKey ];
|
|
passedArray = [];
|
|
gutter = {};
|
|
|
|
if ( 'TO' === self.type || 'FBE' === self.type ) {
|
|
|
|
// Check for fusion-or-gutter.
|
|
gutter = self.toGutterCheck( self.currentOptions[ optionName ] );
|
|
|
|
// Check each dependent option for that id.
|
|
passedArray = self.buildPassedArray( dependentOn, gutter.check );
|
|
|
|
// Show / Hide option.
|
|
if ( gutter.sequence || gutter.single ) {
|
|
show = self.checkGutterOptionVisibility( gutter.sequence, passedArray, gutter.single );
|
|
} else {
|
|
show = self.checkTOVisibility( passedArray );
|
|
}
|
|
|
|
self.hideShowOption( show, optionName, self.$targetEl );
|
|
|
|
// Process children
|
|
jQuery.each( self.dependencies[ optionName ], function( childIndex, childValue ) {
|
|
childOptionName = childValue.option;
|
|
childDependencies = self.currentOptions[ childOptionName ][ self.dependencyKey ];
|
|
show = false;
|
|
childGutter = {};
|
|
childPassedArray = [];
|
|
|
|
// Check for fusion-or-gutter.
|
|
childGutter = self.toGutterCheck( self.currentOptions[ childOptionName ] );
|
|
|
|
// Check each dependent option for that id.
|
|
childPassedArray = self.buildPassedArray( childDependencies, childGutter.check );
|
|
|
|
// Show / Hide option.
|
|
if ( childGutter.sequence || childGutter.single ) {
|
|
show = self.checkGutterOptionVisibility( childGutter.sequence, childPassedArray, childGutter.single );
|
|
} else {
|
|
show = self.checkTOVisibility( childPassedArray );
|
|
}
|
|
|
|
// Show / Hide option
|
|
self.hideShowOption( show, childOptionName );
|
|
} );
|
|
|
|
} else if ( 'PO' === self.type || 'EO' === self.type ) {
|
|
|
|
// Check each dependent option for that id.
|
|
passedArray = self.buildPassedArray( dependentOn, gutter.check );
|
|
|
|
// Show / Hide option.
|
|
show = self.checkOptionVisibility( passedArray, value );
|
|
self.hideShowOption( show, optionName );
|
|
}
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* Compares option value with dependency value to determine if it passes or not.
|
|
*
|
|
* @since 2.0.0
|
|
* @param {mixed} [parentValue] The first value in the check.
|
|
* @param {mixed} [checkValue] The 2nd value in the check.
|
|
* @param {string} [operation] The check we want to perform.
|
|
* @return {boolean}
|
|
*/
|
|
doesTestPass: function( parentValue, checkValue, operation ) {
|
|
var show = false,
|
|
arr,
|
|
media;
|
|
|
|
// If dependencies are disabled, always show the option.
|
|
if ( 'undefined' !== FusionApp.settings.dependencies_status && 0 === parseInt( FusionApp.settings.dependencies_status ) ) {
|
|
return true;
|
|
}
|
|
switch ( operation ) {
|
|
case '=':
|
|
case '==':
|
|
case 'equals':
|
|
|
|
if ( Array.isArray( parentValue ) ) {
|
|
jQuery( parentValue[ 0 ] ).each(
|
|
function( idx, val ) {
|
|
if ( Array.isArray( checkValue ) ) {
|
|
jQuery( checkValue ).each(
|
|
function( i, v ) {
|
|
if ( val == v ) { // jshint ignore: line
|
|
show = true;
|
|
return true;
|
|
}
|
|
}
|
|
);
|
|
} else if ( val == checkValue ) { // jshint ignore: line
|
|
show = true;
|
|
return true;
|
|
}
|
|
}
|
|
);
|
|
} else if ( Array.isArray( checkValue ) ) {
|
|
jQuery( checkValue ).each(
|
|
function( i, v ) {
|
|
if ( parentValue == v ) { // jshint ignore: line
|
|
show = true;
|
|
}
|
|
}
|
|
);
|
|
} else if ( parentValue == checkValue ) { // jshint ignore: line
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case '!=':
|
|
case 'not':
|
|
if ( Array.isArray( parentValue ) ) {
|
|
jQuery( parentValue ).each(
|
|
function( idx, val ) {
|
|
if ( Array.isArray( checkValue ) ) {
|
|
jQuery( checkValue ).each(
|
|
function( i, v ) {
|
|
if ( val != v ) { // jshint ignore: line
|
|
show = true;
|
|
return true;
|
|
}
|
|
}
|
|
);
|
|
} else if ( val != checkValue ) { // jshint ignore: line
|
|
show = true;
|
|
return true;
|
|
}
|
|
}
|
|
);
|
|
} else if ( Array.isArray( checkValue ) ) {
|
|
jQuery( checkValue ).each(
|
|
function( i, v ) {
|
|
if ( parentValue != v ) { // jshint ignore: line
|
|
show = true;
|
|
}
|
|
}
|
|
);
|
|
} else if ( parentValue != checkValue ) { // jshint ignore: line
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case '>':
|
|
case 'greater':
|
|
case 'is_larger':
|
|
if ( parseFloat( parentValue ) > parseFloat( checkValue ) ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case '>=':
|
|
case 'greater_equal':
|
|
case 'is_larger_equal':
|
|
if ( parseFloat( parentValue ) >= parseFloat( checkValue ) ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case '<':
|
|
case 'less':
|
|
case 'is_smaller':
|
|
if ( parseFloat( parentValue ) < parseFloat( checkValue ) ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case '<=':
|
|
case 'less_equal':
|
|
case 'is_smaller_equal':
|
|
if ( parseFloat( parentValue ) <= parseFloat( checkValue ) ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case 'contains':
|
|
if ( jQuery.isPlainObject( parentValue ) ) {
|
|
checkValue = Object.keys( checkValue ).map( function( key ) {
|
|
return [ key, checkValue[ key ] ];
|
|
} );
|
|
parentValue = arr;
|
|
}
|
|
|
|
if ( jQuery.isPlainObject( checkValue ) ) {
|
|
arr = Object.keys( checkValue ).map( function( key ) {
|
|
return checkValue[ key ];
|
|
} );
|
|
checkValue = arr;
|
|
}
|
|
|
|
if ( Array.isArray( checkValue ) ) {
|
|
jQuery( checkValue ).each(
|
|
function( idx, val ) {
|
|
var breakMe = false,
|
|
toFind = val[ 0 ],
|
|
findVal = val[ 1 ];
|
|
|
|
jQuery( parentValue ).each(
|
|
function( i, v ) {
|
|
var toMatch = v[ 0 ],
|
|
matchVal = v[ 1 ];
|
|
|
|
if ( toFind === toMatch ) {
|
|
if ( findVal == matchVal ) { // jshint ignore: line
|
|
show = true;
|
|
breakMe = true;
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
);
|
|
|
|
if ( true === breakMe ) {
|
|
return false;
|
|
}
|
|
}
|
|
);
|
|
} else if ( -1 !== parentValue.toString().indexOf( checkValue ) ) {
|
|
show = true;
|
|
}
|
|
|
|
break;
|
|
|
|
case 'doesnt_contain':
|
|
case 'not_contain':
|
|
if ( jQuery.isPlainObject( parentValue ) ) {
|
|
arr = Object.keys( parentValue ).map( function( key ) {
|
|
return parentValue[ key ];
|
|
} );
|
|
parentValue = arr;
|
|
}
|
|
|
|
if ( jQuery.isPlainObject( checkValue ) ) {
|
|
arr = Object.keys( checkValue ).map( function( key ) {
|
|
return checkValue[ key ];
|
|
} );
|
|
checkValue = arr;
|
|
}
|
|
|
|
if ( Array.isArray( checkValue ) ) {
|
|
jQuery( checkValue ).each(
|
|
function( idx, val ) {
|
|
if ( -1 === parentValue.toString().indexOf( val ) ) {
|
|
show = true;
|
|
}
|
|
}
|
|
);
|
|
} else if ( -1 === parentValue.toString().indexOf( checkValue ) ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case 'is_empty_or':
|
|
if ( '' === parentValue || parentValue == checkValue ) { // jshint ignore: line
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case 'not_empty_and':
|
|
if ( '' !== parentValue && parentValue != checkValue ) { // jshint ignore: line
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case 'is_empty':
|
|
case 'empty':
|
|
case '!isset':
|
|
if ( ! parentValue || '' === parentValue || null === parentValue ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case 'not_empty':
|
|
case '!empty':
|
|
case 'isset':
|
|
if ( parentValue && '' !== parentValue && null !== parentValue ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case 'is_media':
|
|
if ( parentValue ) {
|
|
media = 'string' === typeof parentValue ? JSON.parse( parentValue ) : parentValue;
|
|
if ( media && media.url ) {
|
|
show = true;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'is_transparent':
|
|
if ( parentValue && 0 === jQuery.AWB_Color( parentValue ).alpha() ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
case 'is_not_transparent':
|
|
if ( parentValue && 0 !== jQuery.AWB_Color( parentValue ).alpha() ) {
|
|
show = true;
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
return show;
|
|
|
|
},
|
|
|
|
/**
|
|
* Check page options & element options visibility.
|
|
*
|
|
* @since 2.0.0
|
|
* @return bool
|
|
*/
|
|
checkOptionVisibility: function( passedArray, value ) {
|
|
var visible = false;
|
|
|
|
if ( -1 === jQuery.inArray( false, passedArray ) && _.isUndefined( value.or ) ) {
|
|
visible = true;
|
|
} else if ( -1 !== jQuery.inArray( true, passedArray ) && ! _.isUndefined( value.or ) ) {
|
|
visible = true;
|
|
}
|
|
|
|
return visible;
|
|
},
|
|
|
|
/**
|
|
* Check Global Option visibility.
|
|
*
|
|
* @since 2.0.0
|
|
* @return bool
|
|
*/
|
|
checkTOVisibility: function( passedArray ) {
|
|
var visible = false;
|
|
|
|
if ( -1 === jQuery.inArray( 0, passedArray ) ) {
|
|
visible = true;
|
|
}
|
|
|
|
return visible;
|
|
},
|
|
|
|
/**
|
|
* Check option visibility for fusion-or-gutter options.
|
|
*
|
|
* @since 2.0.0
|
|
* @return bool
|
|
*/
|
|
checkGutterOptionVisibility: function( gutterSequence, passedArray, singleOrGutter ) {
|
|
var overallDependencies = [],
|
|
total = 0,
|
|
show = false,
|
|
i;
|
|
|
|
if ( singleOrGutter ) {
|
|
overallDependencies = passedArray;
|
|
} else if ( 0 < gutterSequence.length ) {
|
|
for ( i = 0; i < passedArray.length; i++ ) {
|
|
|
|
if ( 0 === i ) {
|
|
overallDependencies.push( passedArray[ i ] );
|
|
} else if ( 'and' === gutterSequence[ i - 1 ] ) {
|
|
overallDependencies[ overallDependencies.length - 1 ] = overallDependencies[ overallDependencies.length - 1 ] * passedArray[ i ];
|
|
} else {
|
|
overallDependencies.push( passedArray[ i ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
for ( i = 0; i < overallDependencies.length; i++ ) {
|
|
total += overallDependencies[ i ];
|
|
}
|
|
|
|
if ( 1 <= total ) {
|
|
show = true;
|
|
} else {
|
|
show = false;
|
|
}
|
|
|
|
show = Boolean( show );
|
|
|
|
return show;
|
|
},
|
|
|
|
/**
|
|
* Convert option values.
|
|
*
|
|
* @since 2.0.0
|
|
* @return string
|
|
*/
|
|
fixPoToValue: function( value ) {
|
|
switch ( value ) {
|
|
|
|
case 'hide':
|
|
case '0':
|
|
value = 'no';
|
|
|
|
break;
|
|
|
|
case 'show':
|
|
case '1':
|
|
value = 'yes';
|
|
|
|
break;
|
|
}
|
|
|
|
return value;
|
|
},
|
|
|
|
/**
|
|
* Convert option values.
|
|
*
|
|
* @since 3.7.0
|
|
* @return string
|
|
*/
|
|
fixEoToValue: function( value ) {
|
|
switch ( value ) {
|
|
|
|
case '0':
|
|
value = 'no';
|
|
|
|
break;
|
|
|
|
case '1':
|
|
value = 'yes';
|
|
|
|
break;
|
|
}
|
|
|
|
return value;
|
|
},
|
|
|
|
/**
|
|
* Process element option default values.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {void}
|
|
*/
|
|
processEoDefaults: function( view ) {
|
|
var elementType = view.model.get( 'element_type' ),
|
|
elementDefaults = FusionApp.elementDefaults[ elementType ],
|
|
toValue;
|
|
|
|
if ( 'object' === typeof elementDefaults && 'object' === typeof elementDefaults.settings_to_params ) {
|
|
_.each( elementDefaults.settings_to_params, function( eo, to ) {
|
|
var option,
|
|
type = '',
|
|
subset = '';
|
|
|
|
toValue = FusionApp.settings[ to ];
|
|
|
|
// Looking for sub value, get parent only.
|
|
if ( -1 !== to.indexOf( '[' ) ) {
|
|
toValue = to.split( '[' )[ 0 ];
|
|
subset = to.split( '[' )[ 1 ].replace( ']', '' );
|
|
|
|
toValue = FusionApp.settings[ toValue ];
|
|
}
|
|
|
|
// Get param if its an object.
|
|
if ( 'object' === typeof eo ) {
|
|
eo = eo.param;
|
|
}
|
|
|
|
option = view.$el.find( '#' + eo ).closest( '.fusion-builder-option' );
|
|
|
|
if ( option.length ) {
|
|
type = jQuery( option ).attr( 'class' ).split( ' ' ).pop();
|
|
}
|
|
|
|
if ( ! jQuery( option ).hasClass( 'fusion-builder-option range' ) ) {
|
|
toValue = FusionApp.sidebarView.fixToValueName( to, toValue, type, subset );
|
|
view.$el.find( '.description [data-fusion-option="' + to + '"]' ).html( toValue );
|
|
}
|
|
} );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Process page option default values.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {void}
|
|
*/
|
|
processPoDefaults: function( view ) {
|
|
var thisEl = view.$el,
|
|
toValue,
|
|
poValue,
|
|
subset,
|
|
type = '',
|
|
option;
|
|
|
|
_.each( FusionApp.settingsPoTo, function( to, po ) {
|
|
toValue = FusionApp.settings[ to ];
|
|
|
|
if ( ! _.isUndefined( toValue ) ) {
|
|
option = thisEl.find( '[data-option-id="' + po + '"]' );
|
|
poValue = option.val();
|
|
|
|
if ( option.length ) {
|
|
type = jQuery( option ).attr( 'class' ).replace( /\s+$/, '' ).split( ' ' ).pop();
|
|
}
|
|
|
|
subset = jQuery( option ).data( 'subset' );
|
|
|
|
if ( 'default' !== poValue ) {
|
|
|
|
toValue = FusionApp.sidebarView.fixToValueName( to, toValue, type, subset );
|
|
|
|
option.find( '.description a' ).html( toValue );
|
|
}
|
|
}
|
|
} );
|
|
}
|
|
|
|
} );
|
|
|
|
}( jQuery ) );
|