/* global FusionApp, FusionPageBuilderViewManager, FusionEvents, fusionAllElements, FusionPageBuilderApp, fusionBuilderText, fusionGlobalManager, fusionBuilderInsertIntoEditor, openShortcodeGenerator, awbPalette */
/* eslint no-unused-vars: 0 */
/* eslint no-alert: 0 */
/* eslint no-empty-function: 0 */
/* eslint no-shadow: 0 */
var FusionPageBuilder = FusionPageBuilder || {};
( function() {
FusionPageBuilder.ElementSettingsView = window.wp.Backbone.View.extend( {
className: 'fusion_builder_module_settings',
template: FusionPageBuilder.template( jQuery( '#fusion-builder-block-module-settings-template' ).html() ),
optionHasChanged: false,
events: {
'click [id$="fusion_shortcodes_text_mode"]': 'activateSCgenerator',
'change input:not(.fusion-skip-change-event)': 'optionChange',
'keyup input:not(.fusion-slider-input)': 'optionChange',
'change select': 'optionChange',
'keyup textarea': 'optionChange',
'change textarea': 'optionChange',
'paste textarea': 'optionChangePaste',
'fusion-change input': 'optionChange',
'click .upload-image-remove': 'removeImage',
'click .option-preview-toggle': 'previewToggle',
'click .insert-slider-video': 'addSliderVideo',
'click .fusion-panel-shortcut:not(.dialog-more-menu-item)': 'defaultPreview',
'click .fusion-panel-description': 'showHideDescription',
'click #fusion-close-element-settings': 'saveSettings',
'click .fusion-builder-go-back': 'openParent',
'click .option-dynamic-content': 'addDynamicContent',
'click .option-has-responsive': 'showResponsiveOptions',
'click .fusion-responsive-options li a': 'changeResponsiveOption',
'mouseleave .fusion-builder-option': 'hideResponsiveOptions',
'click .fusion-builder-toggle-subgroup': 'toggleSubGroup',
'click .option-has-state': 'toggleStateOptions',
'click .fusion-state-options li a': 'changeStateOption'
},
/**
* Init.
*
* @since 2.0.0
* @return {void}
*/
initialize: function() {
// Manipulate model attributes via custom function if provided by the element.
this.onSettingsCallback();
// Store element view.
this.elementView = FusionPageBuilderViewManager.getView( this.model.get( 'cid' ) );
this.loadComplete = false;
this.codeEditorOption = false;
this.changesPaused = false;
// JQuery trigger.
this._refreshJs = _.debounce( _.bind( this.refreshJs, this ), 300 );
// Fetch query_data if not present only. dont save
if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].has_ajax ) {
if ( 'undefined' === typeof this.model.get( 'query_data' ) ) {
this.elementView.triggerAjaxCallbacks( true );
}
}
// When tab is changed we init options.
this.tabsRendered = {};
this.initOptions = _.debounce( _.bind( this.debouncedInitOptions, this ), 50 );
this.listenTo( FusionEvents, 'fusion-tab-changed', this.initOptions );
this.listenTo( FusionEvents, 'fusion-inline-edited', this.forceChange );
this.childSortableView = false;
// Active states selected for element.
this.activeStates = {};
this.$targetEl = 'undefined' !== typeof this.elementView ? this.elementView.$el : false;
this._tempStateRemove = _.debounce( _.bind( this.tempStateRemove, this ), 3000 );
this.parentValues = this.getParentValues() ? this.getParentValues() : false;
this.$el.attr( 'data-cid', this.model.get( 'cid' ) );
this.$el.addClass( this.containerIsFlex() ? 'has-flex' : '' );
this.$el.addClass( this.columIsBlockLayout() ? 'has-block-column' : '' );
this.type = 'EO';
this.onInit();
this.listenTo( FusionEvents, 'fusion-element-removed', this.removeView );
this.listenTo( FusionEvents, 'fusion-preview-refreshed', this.saveSettings );
this.listenTo( FusionEvents, 'fusion-close-settings-' + this.model.get( 'cid' ), this.saveSettings );
this.listenTo( FusionEvents, 'fusion-param-changed-' + this.model.get( 'cid' ), this.paramChanged );
this.listenTo( FusionEvents, 'fusion-default-changed-' + this.model.get( 'cid' ), this.defaultChanged );
this.listenTo( FusionEvents, 'fusion-row-nested-edit', this.saveSettings );
if ( 'dialog' !== FusionApp.preferencesData.editing_mode && 'generated_element' !== this.model.get( 'type' ) && ! this.$el.hasClass( 'fusion-builder-settings-chart-table-dialog' ) ) {
this.$el.addClass( 'fusion-builder-custom-tab' );
}
if ( 'generated_element' === this.model.get( 'type' ) ) {
FusionEvents.trigger( 'fusion-history-pause-tracking' );
}
this.newElement = false;
if ( 'undefined' !== typeof this.model.get( 'added' ) ) {
this.newElement = true;
}
// Dynamic content.
this.listenTo( FusionEvents, 'fusion-dynamic-data-removed', this.removeDynamicStatus );
this.listenTo( FusionEvents, 'fusion-dynamic-data-added', this.addDynamicStatus );
this.dynamicSelection = false;
this.debouncedOptionChanges = {};
},
/**
* Renders the view.
*
* @since 2.0.0
* @return {Object} this
*/
render: function() {
this.renderOptions();
this.initOptions();
this.model.unset( 'added' );
// Check option dependencies
this.dependencies = new FusionPageBuilder.Dependencies( fusionAllElements[ this.model.get( 'element_type' ) ].params, this );
FusionApp.dialog.dialogTabs( this.$el );
this.loadComplete = true;
if ( 'undefined' !== this.model.get( 'multi' ) && 'multi_element_parent' === this.model.get( 'multi' ) ) {
this.appendChildSortables();
}
FusionEvents.trigger( 'fusion-settings-modal-open' );
if ( -1 !== this.model.get( 'element_type' ).indexOf( 'fusion_builder_column' ) ) {
this.setDirectionAttribute();
}
this.onRender();
this.checkPageTemplate();
this.inlineHistoryListener();
return this;
},
setDirectionAttribute: function() {
var $option = this.$el.find( '[data-option-id="content_layout"]' ),
value = 'column';
if ( ! $option.length ) {
return;
}
value = $option.find( '#content_layout' ).val();
$option.attr( 'data-direction', value );
},
containerIsFlex: function() {
var container = FusionPageBuilderApp.getParentContainer( this.model.get( 'cid' ) );
return container && container.isFlex();
},
columIsBlockLayout: function() {
var column = FusionPageBuilderApp.getParentColumn( this.model.get( 'cid' ) );
return column && column.isBlockLayout() && 'fusion_builder_column' !== this.model.get( 'element_type' ) && 'fusion_builder_column_inner' !== this.model.get( 'element_type' );
},
addDynamicContent: function( event ) {
var self = this,
$option = jQuery( event.target ).closest( '.fusion-builder-option' ),
param = $option.attr( 'data-option-id' ),
sameParam = false,
viewSettings;
if ( this.dynamicSelection ) {
if ( param === this.dynamicSelection.model.get( 'param' ) ) {
sameParam = true;
}
this.dynamicSelection.removeView();
}
if ( sameParam ) {
return;
}
viewSettings = {
model: new FusionPageBuilder.Element( {
param: param,
option: $option,
parent: this
} )
};
// On select or cancel or event we destroy.
this.dynamicSelection = new FusionPageBuilder.DynamicSelection( viewSettings );
$option.find( '.fusion-dynamic-selection' ).html( this.dynamicSelection.render().el );
},
removeDynamicStatus: function( param ) {
this.$el.find( '.fusion-builder-option[data-option-id="' + param + '"]' ).attr( 'data-dynamic', false );
// Needed for dependencies.
this.$el.find( '#' + param ).trigger( 'fusion-change' );
},
addDynamicStatus: function( param ) {
if ( 'undefined' !== typeof this.model.attributes.params.dynamic_params ) {
this.$el.find( '.fusion-builder-option[data-option-id="' + param + '"]' ).attr( 'data-dynamic', true );
// Needed for dependencies.
this.$el.find( '#' + param ).trigger( 'fusion-change' );
}
},
onRender: function() {
},
reRender: function() {
var $parentDialog = this.$el.closest( '.ui-dialog' ),
$dialogTopContainer;
this.tabsRendered = {};
this.destroyOptions();
this.render();
if ( $parentDialog.length ) {
$parentDialog.find( '.ui-dialog-titlebar + .fusion-builder-modal-top-container' ).remove();
$parentDialog.find( '.ui-dialog-titlebar' ).after( this.$el.find( '.fusion-builder-modal-top-container' ) );
} else {
FusionPageBuilderApp.SettingsHelpers.renderDialogMoreOptions( this );
}
},
/**
* Listens for change in parent and destroys settings view since no longer valid.
*
* @since 2.0.0
* @return {void}
*/
inlineHistoryListener: function() {
var self = this,
parentCid;
if ( this.model.get( 'inlineElement' ) && 'undefined' !== typeof this.model.parentView ) {
parentCid = this.model.parentView.model.get( 'cid' );
// Timeout so addition of inline does not trigger.
setTimeout( function() {
self.listenTo( FusionEvents, 'fusion-param-changed-' + parentCid, function() {
self.removeView( parentCid );
} );
}, 1000 );
}
},
/**
* Simply sets optionHasChanged to true.
*
* @since 2.0.0
* @return {void}
*/
forceChange: function() {
this.optionHasChanged = true;
},
/**
* Append child sortables.
*
* @since 2.0.0
* @return {void}
*/
appendChildSortables: function() {
var viewSettings = {
model: this.model,
collection: this.collection,
attributes: {
settingsView: this
}
},
view;
view = new FusionPageBuilder.ElementSettingsParent( viewSettings );
if ( this.model.attributes.params.dynamic_params ) {
let dynamicData = FusionPageBuilderApp.base64Decode( this.model.attributes.params.dynamic_params );
dynamicData = _.unescape( dynamicData );
dynamicData = JSON.parse( dynamicData );
if ( dynamicData.parent_dynamic_content ) {
this.$el.find( '.fusion-child-sortables' ).addClass( 'has-dynamic-data' );
if ( 'filebird_folder_parent' === dynamicData.parent_dynamic_content.data ) {
this.$el.find( '.fusion-child-sortables' ).addClass( 'has-dynamic-data-no-children' );
}
}
}
this.$el.find( '.fusion-child-sortables' ).html( view.render().el );
this.childSortableView = view;
},
/**
* Execute Callbacks.
*
* @since 2.0.0
* @return {void}
*/
onSettingsCallback: function() {
var functionName,
params,
processedParams;
if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_settings ) {
functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_settings;
if ( 'function' === typeof FusionPageBuilderApp[ functionName ] ) {
params = this.model.get( 'params' );
processedParams = FusionPageBuilderApp[ functionName ]( params, this );
this.model.set( 'params', processedParams );
}
}
},
/**
* Trigger optionChange when pasting.
*
* @since 2.0.0
* @return {void}
*/
optionChangePaste: function( event ) {
var self = this;
setTimeout( function() {
self.optionChange( event );
}, 200 );
},
/**
* Debounce optionChanged if no template.
*
* @since 2.0.0
* @param {Object} event - The JS event.
* @return {void}
*/
optionChange: function( event, data ) {
var $target = jQuery( event.target ),
$option = $target.closest( '.fusion-builder-option' ),
paramName = this.getParamName( $target, $option ),
$dynamicWrapper = $option.closest( '.dynamic-wrapper' ),
ajaxDynamicParam = false,
debounceTimeout = 'tinymce' === $option.data( 'option-type' ) ? 300 : 500,
element,
option;
if ( this.changesPaused ) {
return;
}
// Fix range with default value not triggering properly.
if ( $target.is( '.fusion-slider-input.fusion-with-default' ) || $target.is( '.awb-ignore' ) ) {
return;
}
// Check if it is a dynamic param being changed which will result in an ajax request.
if ( $dynamicWrapper.length && $dynamicWrapper.attr( 'data-ajax' ) && 'before' !== paramName && 'after' !== paramName && 'fallback' !== paramName ) {
ajaxDynamicParam = $option.closest( '.dynamic-wrapper' ).attr( 'data-ajax' );
if ( $target.closest( '.fusion-builder-option' ).hasClass( 'text' ) ) {
debounceTimeout = 500;
}
}
// Forced default reset on select field.
if ( 'object' === typeof data && 'undefined' !== typeof data.silent && data.silent && 'undefined' !== typeof this.elementView ) {
element = fusionAllElements[ this.elementView.model.get( 'element_type' ) ];
option = element.params[ paramName ];
// If it has a callback then just set the param value directly.
if ( 'undefined' !== typeof option.callback ) {
this.elementView.changeParam( paramName, $target.val() );
return;
}
}
if ( ! jQuery( event.target ).hasClass( 'fusion-skip-debounce' ) && ( this.model.get( 'noTemplate' ) || jQuery( event.target ).hasClass( 'fusion-debounce-change' ) || ajaxDynamicParam || 'tinymce' === $option.data( 'option-type' ) ) ) {
if ( ! this.debouncedOptionChanges[ paramName ] ) {
this.debouncedOptionChanges[ paramName ] = _.debounce( _.bind( this.optionChanged, this ), debounceTimeout );
}
this.debouncedOptionChanges[ paramName ]( event );
} else {
this.optionChanged( event );
}
},
/**
* Custom callback on option change.
*
* @since 2.0.0
* @return {void}
*/
customOnChangeCallback: function() {
var functionName;
// Manupulate model attributes via custom function if provided by element
if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_change ) {
functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_change;
if ( 'function' === typeof FusionApp.callback[ functionName ] ) {
this.model.attributes = FusionApp.callback[ functionName ]( jQuery.extend( true, {}, this.model.attributes ), this );
}
}
},
/**
* Get real param name.
*
* @since 2.0.0
* @return {void}
*/
getParamName: function( $target, $option ) {
var paramName = $option.data( 'option-id' ),
$wrapper = $target.closest( '.fusion-builder-option' );
// Non single dimension fields or font family input.
if ( $wrapper.hasClass( 'typography' ) || ( $wrapper.hasClass( 'dimension' ) && ! $target.closest( '.single-builder-dimension' ).length ) ) {
paramName = $target.attr( 'name' );
}
return paramName;
},
/**
* Get param value.
*
* @since 2.0.0
* @return {void}
*/
getParamValue: function( $target ) {
var paramValue = $target.val();
// If code block element then need to use method to get val.
if ( $target.closest( '.fusion-builder-option.code' ).length ) {
paramValue = this.codeEditorOption[ $target.closest( '.fusion-builder-option.code' ).attr( 'data-index' ) ].getValue();
// Base64 encode for Code option type.
if ( 1 === Number( FusionApp.settings.disable_code_block_encoding ) ) {
paramValue = FusionPageBuilderApp.base64Encode( paramValue );
}
}
if ( $target.hasClass( 'fusion-builder-raw-textarea' ) || $target.hasClass( 'fusion-builder-raw-text' ) ) {
paramValue = FusionPageBuilderApp.base64Encode( paramValue );
}
// Escape input fields.
if ( $target.is( 'input' ) && '' !== paramValue ) {
if ( ! $target.hasClass( 'fusion-builder-upload-field' ) && ! $target.hasClass( 'awb-typo-input' ) && ! $target.is( '#generator_element_content' ) && ! $target.is( '#generator_multi_child_content' ) && false === $target.closest( 'li' ).data( 'dynamic' ) ) {
paramValue = _.escape( paramValue );
}
}
if ( $target.closest( '.fusion-builder-option' ).hasClass( 'escape_html' ) ) {
paramValue = _.escape( paramValue );
}
if ( $target.hasClass( 'fusion-multi-select-option' ) ) {
paramValue = [];
jQuery.each( $target.parent().find( '> .fusion-multi-select-option:checked' ), function( index, elem ) {
paramValue.push( jQuery( elem ).val() );
} );
paramValue = paramValue.join( ',' );
}
// Ajax select option type.
if ( $target.closest( '.fusion-builder-option' ).hasClass( 'ajax_select' ) ) {
paramValue = [];
jQuery.each( $target.parent().find( '.fusion-select-option:checked' ), function( index, elem ) {
paramValue.push( jQuery( elem ).val() );
} );
paramValue = paramValue.join( ',' );
}
// Remove script tags from option values.
paramValue = jQuery( '
' + paramValue + '
' ).find( 'script, noscript' ).remove().end().html();
return paramValue;
},
/**
* Whether or not option change is valid.
*
* @since 2.0.0
* @return {void}
*/
shouldContinue: function( $target, paramName, paramValue, params ) {
var tabId = this.$el.find( '.fusion-tab-content.active' ).length ? this.$el.find( '.fusion-tab-content.active' ).attr( 'id' ) : false,
rowIndex,
pricing,
callbackFunction;
// Filter value being changed.
if ( $target.closest( '.fusion-builder-option.subgroup' ).length ) {
return false;
}
// Repeater value being changed.
if ( $target.closest( '.fusion-builder-option.repeater' ).length && ! $target.hasClass( 'fusion-repeater-value' ) ) {
rowIndex = $target.closest( '.repeater-row' ).index();
return this.setRepeaterValue( $target.closest( '.fusion-builder-option.repeater' ).find( '.fusion-repeater-value' ), paramName, rowIndex, paramValue );
}
// Dynamic value being changed.
if ( $target.closest( '.fusion-dynamic-content' ).length ) {
this.setDynamicParamValue( $target.closest( '.fusion-builder-option' ), paramName, paramValue );
return false;
}
if ( $target.hasClass( 'fusion-always-update' ) ) {
return true;
}
if ( $target.hasClass( 'fusion-hide-from-atts' ) ) {
return false;
}
// If its a tab and its not fully rendered yet.
if ( tabId && ( 'undefined' === typeof this.tabsRendered[ tabId ] || true !== this.tabsRendered[ tabId ] ) ) {
return false;
}
// Layout not complete.
if ( false === this.loadComplete ) {
return false;
}
if ( ! paramName ) {
return false;
}
// If value hasnt changed.
if ( paramValue === params[ paramName ] || ( '' === paramValue && 'undefined' === typeof params[ paramName ] ) ) {
if ( 'fusion_pricing_column' !== this.model.get( 'element_type' ) ) {
return false;
}
callbackFunction = FusionPageBuilderApp.getCallbackFunction( this.model.attributes, paramName, paramValue, this.elementView );
if ( 'fusionPricingTablePrice' !== callbackFunction[ 'function' ] ) {
return false;
}
pricing = this.model.get( 'priceParams' );
if ( '' === paramValue && 'undefined' === typeof pricing[ paramName ] ) {
return false;
}
}
// If its a color picker with fusion using default set but the value its trying to use is not empty, then return.
if ( $target.hasClass( 'fusion-using-default' ) && '' !== paramValue && 'undefined' !== typeof paramValue ) {
return false;
}
return true;
},
/**
* Things to do, places to go when options change.
*
* @since 2.0.0
* @param {Object} event - The event triggering the option change.
* @return {void}
*/
optionChanged: function( event ) {
var $target = jQuery( event.target ),
$option = $target.closest( '.fusion-builder-option' ),
reRender = true,
params = this.model.get( 'params' ),
modelData = jQuery.extend( this.model.attributes, {} ),
paramName,
initialVal,
MultiGlobalArgs,
paramValue,
parentView;
this.customOnChangeCallback();
paramName = this.getParamName( $target, $option );
paramValue = this.getParamValue( $target, paramName, paramValue, params );
initialVal = 'undefined' === typeof params[ paramName ] ? '' : params[ paramName ];
if ( ! this.shouldContinue( $target, paramName, paramValue, params ) ) {
return;
}
this.optionHasChanged = true;
if ( ! this.model.get( 'inlineElement' ) ) {
if ( 'undefined' !== typeof this.elementView ) {
reRender = this.elementView.updateParam( paramName, paramValue, event );
}
}
if ( 'undefined' !== typeof this.elementView && 'function' === typeof this.elementView.onOptionChange ) {
this.elementView.onOptionChange( paramName, paramValue, event );
}
// Trigger temporary active state if exists.
this.triggerTemporaryState( $option );
// Trigger Option change for any other option to listen for it.
FusionEvents.trigger( 'awb-options-change-' + paramName, paramValue, this.model.get( 'cid' ) );
if ( 'generated_element' === this.model.get( 'type' ) ) {
return;
}
// Update inline element which has no separate view.
if ( this.model.get( 'inlineElement' ) ) {
params[ paramName ] = paramValue;
this.model.set( 'params', params );
FusionPageBuilderApp.inlineEditorHelpers.processInlineElement( this.model, paramName );
}
// Re render view, right now that is auto done on model change.
if ( reRender && 'undefined' !== typeof this.elementView && ! $target.hasClass( 'skip-update' ) ) {
// Re-render if element should.
if ( -1 === this.model.get( 'element_type' ).indexOf( 'fusion_builder_column' ) || ( 'spacing' !== paramName ) ) {
this.elementView.reRender();
}
}
// JS trigger for option specific refreshes.
this._refreshJs( paramName );
// Trigger active states.
this.triggerActiveStates();
// A setting of some kind has been changed.
this.settingChanged = true;
if ( this.childSortableView ) {
this.childSortableView.render();
}
// Handle multiple global elements.
MultiGlobalArgs = {
currentModel: this.model,
handleType: 'changeOption',
Name: paramName,
Value: paramValue
};
fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs );
},
getParentValues: function() {
var parentView;
if ( 'multi_element_child' === this.model.get( 'multi' ) ) {
parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) );
if ( 'undefined' === parentView ) {
return false;
}
return parentView.model.get( 'params' );
}
return false;
},
/**
* Triggers a refresh.
*
* @since 2.0.0
* @return void
*/
refreshJs: function( paramName ) {
jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-option-change-' + paramName, this.model.attributes.cid );
},
/**
* Destroys the options.
*
* @since 2.0.0
* @return {void}
*/
destroyOptions: function() {
var self = this;
// Close colorpickers before saving
this.$el.find( '.fusion-color-created' ).each( function() {
if ( 'undefined' !== typeof jQuery( this ).awbColorPicker( 'instance' ) ) {
jQuery( this ).awbColorPicker( 'close' );
}
} );
// Destroy each CodeMirror editor instance
this.$el.find( '.fusion-builder-code-block' ).each( function( index ) {
if ( self.codeEditorOption[ index ] ) {
self.codeEditorOption[ index ].toTextArea();
}
} );
// Remove each instance of tinyMCE editor from this view if it has been init.
this.$el.find( '.fusion-editor-field' ).each( function() {
var editorID = jQuery( this ).attr( 'id' );
if ( jQuery( this ).hasClass( 'fusion-init' ) ) {
self.fusionBuilderMCEremoveEditor( editorID );
}
} );
this.onDestroyOptions();
},
/**
* Destroy options callback.
*
* @since 2.0.0
* @return {void}
*/
onDestroyOptions: function() {
},
/**
* Activate shortcode generator.
*
* @since 2.0.0
* @return {void}
*/
activateSCgenerator: function( event ) {
openShortcodeGenerator( jQuery( event.target ) );
},
/**
* Init the view options.
*
* @since 2.0.0
* @return {void}
*/
renderOptions: function() {
var thisModel = this.model,
fixSettingsLvl = false,
parentAtts,
attributes = jQuery.extend( true, {}, this.model.attributes );
// Fix for deprecated 'settings_lvl' attribute
if ( 'undefined' !== thisModel.attributes.params.settings_lvl && 'parent' === thisModel.attributes.params.settings_lvl ) {
fixSettingsLvl = true;
parentAtts = thisModel.attributes.params;
}
if ( 'object' === typeof this.elementView ) {
attributes.dynamic_params = this.elementView.dynamicParams.getAll();
}
// Set correct type param based on TO setting in case 'old' container is edited.
if ( 'fusion_builder_container' === this.model.get( 'element_type' ) && 'undefined' === typeof attributes.params.type ) {
attributes.params.type = 1 === parseInt( fusionAllElements.fusion_builder_container.extras.container_legacy_support ) ? 'legacy' : 'flex';
}
// We don't allow 'legacy' containers in header layout sections.
if ( 'fusion_builder_container' === this.model.get( 'element_type' ) && 'undefined' !== typeof FusionApp.data.template_category && 'header' === FusionApp.data.template_category ) {
attributes.params.type = 'flex';
}
if ( 'function' === typeof this.filterAttributes ) {
attributes = this.filterAttributes( attributes );
}
// if fusion gallery image ( child ) add parents value to atts.
if ( 'fusion_gallery_image' === this.model.get( 'element_type' ) ) {
attributes.parentValues = this.getParentValues();
}
this.$el.html( this.template( { atts: attributes } ) );
},
/**
* Init the view options.
*
* @since 2.0.0
* @return {void}
*/
debouncedInitOptions: function( $element ) {
var tabId = this.$el.find( '.fusion-tab-content.active' ).length ? this.$el.find( '.fusion-tab-content.active' ).attr( 'id' ) : false,
$baseEl = tabId ? this.$el.find( '.fusion-tab-content.active' ) : this.$el,
$thisEl = 'undefined' !== typeof $element && $element.length ? $element : $baseEl,
self = this;
// Check if tab has already been init.
if ( 'undefined' === typeof $element && ( ( tabId && true === this.tabsRendered ) || ( 'undefined' !== typeof this.tabsRendered[ tabId ] && this.tabsRendered[ tabId ] ) || true === this.tabsRendered ) ) {
return;
}
this.optionDynamicData( $thisEl );
this.textFieldPlaceholder( $thisEl );
this.optionDateTimePicker( $thisEl );
this.optionColorpicker( $thisEl );
this.optionColumnWidth( $thisEl );
this.optionFormOptions( $thisEl );
this.optionLogics( $thisEl );
this.optionIconpicker( $thisEl );
this.optionCodeBlock( $thisEl );
this.optionDimension( $thisEl );
this.optionSelect( $thisEl );
this.optionMultiSelect( $thisEl );
this.optionUpload( $thisEl );
this.optionMultiUpload( $thisEl );
this.optionEditor( $thisEl );
this.optionCheckboxButtonSet( $thisEl );
this.optionRadioButtonSet( $thisEl );
this.optionLinkSelector( $thisEl );
this.optionRange( $thisEl );
this.optionSortable( $thisEl );
this.optionSortableText( $thisEl );
this.optionConnectedSortable( $thisEl );
this.optionAjaxSelect( $thisEl );
this.optionFocusImage( $thisEl );
this.optionTypography( $thisEl );
this.optionNominatimSelector( $thisEl );
// TODO: fix for WooCommerce element.
if ( 'fusion_woo_shortcodes' === this.model.get( 'element_type' ) ) {
if ( true === FusionPageBuilderApp.shortcodeGenerator ) {
$thisEl.find( '#element_content' ).attr( 'id', 'generator_element_content' );
}
}
// Attachment upload alert.
$thisEl.find( '.uploadattachment .fusion-builder-upload-button' ).on( 'click', function() {
alert( fusionBuilderText.to_add_images ); // jshint ignore: line
} );
// Fusion Form label update.
if ( this.model.get( 'element_type' ).includes( 'fusion_form_' ) ) {
setTimeout( function() {
var elem = $thisEl.find( 'input[name="label"]' )[ 0 ],
elemLen,
oSel;
if ( elem ) {
elemLen = elem.value.length;
// For IE Only
if ( document.selection ) {
// Set focus
elem.focus();
// Use IE Ranges
oSel = document.selection.createRange();
// Reset position to 0 & then set at end
oSel.moveStart( 'character', -elemLen );
oSel.moveStart( 'character', elemLen );
oSel.moveEnd( 'character', 0 );
oSel.select();
} else if ( elem.selectionStart || '0' == elem.selectionStart ) {
// Firefox/Chrome
elem.selectionStart = elemLen;
elem.selectionEnd = elemLen;
elem.focus();
} // if
}
}, 200 );
$thisEl.on( 'change', '[name="label"]', function( event ) {
var label = ( event.target && event.target.value ) || '';
var $name = jQuery( this ).parents().siblings( '[data-option-id="name"]' ).find( 'input' );
if ( '' === $name.val() && label ) {
$name.val( _.fusionSanitize( label ) );
$name.trigger( 'change' );
}
} );
$thisEl.on( 'keydown', '[name="name"], [name$="field_name"]', function( e ) {
var c = e.which;
var ascii = {
'109': '45',
'173': '45',
'186': '59',
'189': '45'
};
if ( ascii.hasOwnProperty( c ) ) {
c = ascii[ c ];
}
if ( ( 65 <= c && 90 >= c ) || ( !e.shiftKey && 48 <= c && 57 >= c ) || 45 == c || ( e.shiftKey && 59 == c ) || 8 == c || ( 37 <= c && 40 >= c ) ) {
return;
}
return event.preventDefault();
} );
}
if ( 'undefined' === typeof $element ) {
this.optionRepeater( 'builder' );
}
setTimeout( function() {
$thisEl.find( 'select, input, textarea, radio' ).filter( ':eq(0)' ).not( '[data-placeholder], .awb-color-picker' ).focus();
}, 1 );
// If rendering a specific tab, save this fact to prevent reinit.
if ( tabId ) {
setTimeout( function() {
self.tabsRendered[ tabId ] = true;
}, 500 );
} else {
this.tabsRendered = true;
}
},
/**
* Inserts shortcode from generator.
*
* @since 2.0.0
* @param {Object} event - The event.
* @return {void}
*/
insertGeneratedShortcode: function( event ) {
var attributes,
functionName,
parentView,
element;
if ( event ) {
event.preventDefault();
}
// Remove activee states.
this.removeActiveStates();
attributes = this.model.attributes;
// Escapes &, <, >, ", `, and ' characters
if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].escape_html && true === fusionAllElements[ this.model.get( 'element_type' ) ].escape_html ) {
attributes.params.element_content = _.escape( attributes.params.element_content );
}
// Manupulate model attributes via custom function if provided by element
if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_save ) {
functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_save;
if ( 'function' === typeof FusionApp.callback[ functionName ] ) {
attributes = FusionApp.callback[ functionName ]( attributes, this );
}
}
element = FusionPageBuilderApp.generateElementShortcode( this.model, false, true );
FusionEvents.trigger( 'fusion-history-resume-tracking' );
this.openGeneratorTarget();
fusionBuilderInsertIntoEditor( element, FusionPageBuilderApp.shortcodeGeneratorEditorID );
// Destroy option fields
this.destroyOptions();
if ( 'multi_element_child' === this.model.get( 'multi' ) ) {
// Set element/model attributes
this.model.set( attributes );
FusionEvents.trigger( 'fusion-multi-element-edited' );
FusionEvents.trigger( 'fusion-multi-child-update-preview' );
parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) );
if ( 'undefined' !== typeof parentView ) {
parentView.updateElementContent();
}
} else if ( 'multi_element_parent' === this.model.get( 'multi' ) ) {
// TODO: this.mode.set( 'params' );
this.model.set( attributes );
}
if ( FusionPageBuilderApp.manuallyAdded ) {
FusionPageBuilderApp.shortcodeGenerator = FusionPageBuilderApp.manualGenerator;
FusionPageBuilderApp.shortcodeGeneratorEditorID = FusionPageBuilderApp.manualEditor;
FusionPageBuilderApp.manuallyAdded = false;
}
if ( 'undefined' !== typeof this.model && 'undefined' !== typeof this.model.get( 'multi' ) && 'multi_element_child' === this.model.get( 'multi' ) ) {
FusionEvents.trigger( 'fusion-child-changed' );
}
this.remove();
FusionPageBuilderApp.shortcodeGenerator = '';
FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) );
FusionEvents.trigger( 'fusion-settings-modal-save' );
},
removeView: function( cid ) {
if ( cid !== this.model.get( 'cid' ) && ( 'undefined' === typeof this.model.parentView || ! this.model.parentView || cid !== this.model.parentView.model.get( 'cid' ) ) ) {
return;
}
if ( this.dynamicSelection ) {
this.dynamicSelection.removeView();
}
// Destroy option fields
this.destroyOptions();
FusionEvents.trigger( 'fusion-settings-removed', this.model.get( 'cid' ) );
jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'fusion-dialog-ui-active' );
this.remove();
FusionApp.sidebarView.changeTabTitle();
},
/**
* Saves the settings.
*
* @since 2.0.0
* @param {Object} event - The event.
* @return {void}
*/
saveSettings: function( event ) {
var attributes,
functionName,
parentView,
MultiGlobalArgs;
if ( event ) {
event.preventDefault();
}
// Destroy option fields
this.destroyOptions();
// Remove activee states.
this.removeActiveStates();
attributes = this.model.attributes;
// Column and container spacing.
if ( 'fusion_builder_container' === this.model.get( 'element_type' ) || 'fusion_builder_column' === this.model.get( 'element_type' ) || 'fusion_builder_column_inner' === this.model.get( 'element_type' ) ) {
this.elementView.destroyResizable();
this.elementView.$el.removeClass( 'fusion-builder-element-edited' );
}
// Escapes &, <, >, ", `, and ' characters
if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].escape_html && true === fusionAllElements[ this.model.get( 'element_type' ) ].escape_html ) {
attributes.params.element_content = _.escape( attributes.params.element_content );
}
// Manipulate model attributes via custom function if provided by element
if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_save ) {
functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_save;
if ( 'function' === typeof FusionApp.callback[ functionName ] ) {
attributes = FusionApp.callback[ functionName ]( attributes, this );
}
}
if ( 'multi_element_child' === this.model.get( 'multi' ) ) {
// Set element/model attributes
this.model.set( attributes );
FusionEvents.trigger( 'fusion-multi-element-edited' );
FusionEvents.trigger( 'fusion-multi-child-update-preview' );
parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) );
if ( 'undefined' !== typeof parentView ) {
parentView.updateElementContent();
// Close parent's settings dialog.
if ( event && 'undefined' !== typeof event.currentTarget && ( jQuery( event.currentTarget ).hasClass( 'fusiona-close-fb' ) || jQuery( event.currentTarget ).hasClass( 'ui-dialog-titlebar-close' ) ) ) {
FusionEvents.trigger( 'fusion-close-settings-' + this.model.get( 'parent' ) );
}
}
this.remove();
} else if ( 'multi_element_parent' === this.model.get( 'multi' ) ) {
// TODO: this.mode.set( 'params' );
this.model.set( attributes );
this.remove();
} else { // Regular element
this.remove();
}
// Change Heading text.
FusionApp.sidebarView.changeTabTitle();
if ( 'undefined' !== typeof this.elementView ) {
this.elementView.onSettingsClose();
}
// Handle multiple global elements.
MultiGlobalArgs = {
currentModel: this.model,
handleType: 'save',
attributes: this.model.attributes
};
fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs );
if ( FusionPageBuilderApp.manuallyAdded ) {
FusionPageBuilderApp.shortcodeGenerator = FusionPageBuilderApp.manualGenerator;
FusionPageBuilderApp.shortcodeGeneratorEditorID = FusionPageBuilderApp.manualEditor;
FusionPageBuilderApp.manuallyAdded = false;
}
if ( 'undefined' !== typeof this.model && 'undefined' !== typeof this.model.get( 'multi' ) && 'multi_element_child' === this.model.get( 'multi' ) ) {
FusionEvents.trigger( 'fusion-child-changed' );
}
FusionEvents.trigger( 'fusion-settings-modal-save', this.model.get( 'cid' ) );
},
/**
* Saves the child and opens parent settings.
*
* @since 2.0.0
* @return {void}
*/
openParent: function( event ) {
var parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) );
if ( parentView ) {
parentView.settings();
}
this.saveSettings( event );
},
/**
* Opens target dialog for generator insert/cancel.
*
* @since 2.0.0
* @return {void}
*/
openGeneratorTarget: function() {
var targetView = FusionPageBuilderViewManager.getView( this.model.get( 'target' ) );
if ( targetView && 'dialog' === FusionApp.preferencesData.editing_mode ) {
targetView.settings();
}
},
/**
* Closes the generator modal.
*
* @since 2.0.0
* @return {void}
*/
closeGeneratorModal: function() {
// Destroy element model
this.model.destroy();
FusionEvents.trigger( 'fusion-history-resume-tracking' );
FusionEvents.trigger( 'fusion-settings-modal-cancel' );
this.openGeneratorTarget();
this.remove();
},
/**
* Remove an MCE Editor.
*
* @since 2.0.0
* @param {string} id - The editor ID.
* @return {void}
*/
fusionBuilderMCEremoveEditor: function( id ) {
if ( 'undefined' !== typeof window.tinyMCE ) {
window.tinyMCE.execCommand( 'mceRemoveEditor', false, id );
if ( 'undefined' !== typeof window.tinyMCE.get( id ) ) {
window.tinyMCE.remove( '#' + id );
}
}
},
/**
* Runs before we start processing element settings dependencies.
*
* @since 2.0.0
* @return {void}
*/
beforeProcessDependencies: function() {
var view = this,
thisEl = view.$el,
shortcode = view.model.get( 'element_type' ),
dividerType,
upAndDown,
centerOption;
// Special check for section separator.
if ( 'undefined' !== typeof shortcode && 'fusion_section_separator' === shortcode ) {
dividerType = thisEl.find( '#divider_type' );
upAndDown = dividerType.closest( 'ul' ).find( 'li[data-option-id="divider_candy"]' ).find( '.fusion-option-divider_candy' ).find( '.ui-button[data-value="bottom,top"]' );
centerOption = dividerType.closest( 'ul' ).find( 'li[data-option-id="divider_position"]' ).find( '.fusion-option-divider_position' ).find( '.ui-button[data-value="center"]' );
if ( 'triangle' !== dividerType.val() ) {
upAndDown.hide();
} else {
upAndDown.show();
}
if ( 'bigtriangle' !== dividerType.val() ) {
centerOption.hide();
} else {
centerOption.show();
}
dividerType.on( 'change paste keyup', function() {
if ( 'triangle' !== jQuery( this ).val() ) {
upAndDown.hide();
} else {
upAndDown.show();
}
if ( 'bigtriangle' !== jQuery( this ).val() ) {
centerOption.hide();
if ( centerOption.hasClass( 'ui-state-active' ) ) {
centerOption.prev().click();
}
} else {
centerOption.show();
}
} );
}
},
addSliderVideo: function( event ) {
var defaultParams,
elementType,
targetCid = this.model.get( 'cid' );
if ( event ) {
event.preventDefault();
}
FusionPageBuilderApp.manualGenerator = FusionPageBuilderApp.shortcodeGenerator;
FusionPageBuilderApp.manualEditor = FusionPageBuilderApp.shortcodeGeneratorEditorID;
FusionPageBuilderApp.manuallyAdded = true;
FusionPageBuilderApp.shortcodeGenerator = true;
FusionPageBuilderApp.shortcodeGeneratorEditorID = 'video';
elementType = jQuery( event.currentTarget ).data( 'type' );
// Get default options
defaultParams = fusionAllElements[ elementType ].defaults;
this.collection.add( [
{
type: 'generated_element',
added: 'manually',
element_type: elementType,
params: defaultParams,
target: targetCid
}
] );
},
defaultPreview: function( event ) {
var $element = jQuery( event.currentTarget );
if ( event ) {
event.preventDefault();
}
if ( FusionApp.sidebarView ) {
FusionApp.sidebarView.shortcutClick( $element );
}
},
showHideDescription: function( event ) {
var $element = jQuery( event.currentTarget );
$element.closest( '.fusion-builder-option' ).find( '.description' ).first().slideToggle( 250 );
$element.toggleClass( 'active' );
},
toggleSubGroup: function( event ) {
var $element = jQuery( event.currentTarget );
const $tabs = $element.closest( '.fusion-builder-option' ).find( '.fusion-builder-option-container' );
const $content = $element.closest( '.fusion-builder-option' ).next( '.fusion-subgroups-content-wrap' );
if ( $element.hasClass( 'active' ) ) {
$tabs.slideDown( 250, function() {
$content.slideDown( 500 );
} );
} else {
$content.slideUp( 500, function() {
$tabs.slideUp( 250 );
} );
}
$element.toggleClass( 'active' );
},
showResponsiveOptions: function( event ) {
var $element = jQuery( event.currentTarget ).parent();
$element.toggleClass( 'active-item' );
},
changeResponsiveOption: function( event ) {
var $element = jQuery( event.currentTarget );
var $parent = jQuery( event.currentTarget ).closest( 'li.active-item' );
jQuery( '.fusion-builder-preview-' + $element.data( 'indicator' ) ).trigger( 'click' );
$parent.removeClass( 'active-item' );
},
hideResponsiveOptions: function( event ) {
var $element = jQuery( event.currentTarget );
$element.find( '.fusion-panel-options li.active-item' ).removeClass( 'active-item' );
},
checkPageTemplate: function() {
var option = this.$el.find( 'li[data-option-id="hundred_percent"]' ),
postTypes = [ 'post', 'fusion_template', 'fusion_element', 'awb_off_canvas' ];
if ( 'fusion_builder_container' === this.model.get( 'element_type' ) ) {
option.show();
// Normal post and content override is not active.
if ( 'fusion_tb_section' !== FusionApp.data.postDetails.post_type && 'object' !== typeof FusionApp.data.template_override.content ) {
// Check the post type.
if ( 'undefined' !== typeof FusionApp.data.postMeta._fusion.blog_width_100 || postTypes.includes( FusionApp.data.postDetails.post_type ) ) {
// Blog post.
if ( 'no' === FusionApp.data.postMeta._fusion.blog_width_100 || ( 'default' === FusionApp.data.postMeta._fusion.blog_width_100 && '0' === FusionApp.settings.blog_width_100 ) ) {
option.hide();
}
} else if ( 'avada_portfolio' === FusionApp.data.postDetails.post_type ) {
// Portfolio post.
if ( 'no' === FusionApp.data.postMeta._fusion.portfolio_width_100 || ( 'default' === FusionApp.data.postMeta._fusion.portfolio_width_100 && '0' === FusionApp.settings.portfolio_width_100 ) ) {
option.hide();
}
} else if ( '100-width.php' !== FusionApp.data.postMeta._wp_page_template ) {
// Page with default template.
option.hide();
}
} else if ( 'undefined' !== typeof FusionApp.data.postMeta._fusion.fusion_tb_section_width_100 && 'no' === FusionApp.data.postMeta._fusion.fusion_tb_section_width_100 ) { // Template Builder.
option.hide();
}
}
},
toggleStateOptions: function( event ) {
var $element = jQuery( event.currentTarget ).parent();
$element.toggleClass( 'active-item' );
},
changeStateOption: function( event ) {
var $element = jQuery( event.currentTarget );
var $parent = jQuery( event.currentTarget ).closest( 'li.active-item' );
var $option = jQuery( event.currentTarget ).closest( 'li.fusion-builder-option' );
const state = $element.attr( 'data-indicator' );
const origID = $option.hasClass( 'is-option-state' ) ? $option.attr( 'data-default-state-option' ) : $option.attr( 'data-option-id' );
const param_name = $element.attr( 'data-param_name' ) ? $element.attr( 'data-param_name' ) : `${origID}_${state}`;
const $stateOption = $option.parent().find( `[data-option-id=${param_name}]` );
if ( $stateOption.attr( 'data-option-id' ) === $option.attr( 'data-option-id' ) ) {
$parent.removeClass( 'active-item' );
return;
}
$stateOption.addClass( 'state-active' );
const $stateLink = $parent.find( '.option-has-state' );
if ( $stateLink.attr( 'data-connect-state' ) ) {
const connectedOptions = $stateLink.attr( 'data-connect-state' ).split( ',' );
connectedOptions.forEach( ( option ) => {
$option.siblings( `[data-option-id=${option}], [data-default-state-option=${option}]` ).find( '.fusion-states-panel .fusion-state-options a[data-indicator= ' + state + ']' ).click();
} );
}
if ( $stateOption.find( '.fusion-panel-options .option-preview-toggle' ) ) {
$stateOption.find( '.fusion-panel-options .option-preview-toggle:not(.active)' ).click();
}
if ( 'default' === state ) {
// Trun of active preview.
$option.find( '.fusion-state-options li a' ).each( function() {
const optionName = jQuery( this ).attr( 'data-param_name' );
if ( optionName ) {
$option.parent().find( `li.fusion-builder-option[data-option-id=${optionName}] .fusion-panel-options .option-preview-toggle.active` ).click();
}
} );
}
if ( $option.hasClass( 'is-option-state' ) ) {
if ( 'default' === state ) {
this.defaultState( event );
} else {
$option.removeClass( 'state-active' );
}
} else {
// eslint-disable-next-line no-lonely-if
if ( 'default' !== state ) {
$option.addClass( 'state-inactive' );
}
}
$parent.removeClass( 'active-item' );
},
defaultState: function( event ) {
var $option = jQuery( event.currentTarget ).closest( 'li.fusion-builder-option' );
var $defaultOption = $option.parent().find( `[data-option-id=${$option.attr( 'data-default-state-option' )}]` );
$defaultOption.removeClass( 'state-inactive' );
$option.removeClass( 'state-active' );
},
onInit: function() {
},
onCancel: function() {
},
defaultChanged: function( param, value ) {
var self = this,
$option = 0 < this.$el.find( 'li[data-option-id="' + param + '"]' ).length ? this.$el.find( 'li[data-option-id="' + param + '"]' ) : this.$el.find( '#' + param ).closest( '.fusion-builder-option' ),
optionType = false,
oldValue,
$target,
validColorValue,
values,
$datePicker,
$timePicker;
if ( ! $option.length ) {
return;
}
if ( $option.attr( 'data-option-type' ) ) {
optionType = $option.attr( 'data-option-type' );
}
if ( ! optionType ) {
optionType = $option.attr( 'class' ).replace( 'fusion-builder-option', '' ).trim();
}
switch ( optionType ) {
case 'colorpicker':
case 'colorpickeralpha':
$target = $option.find( '.awb-color-picker' );
if ( $target.length ) {
if ( 'undefined' === typeof $target.awbColorPicker( 'instance' ) ) {
break;
}
$target.awbColorPicker( 'instance' ).defaultColor( value );
if ( '' === $target.val() ) {
// Refresh the preview to global color.
$target.awbColorPicker( 'color', value );
$target.awbColorPicker( 'color', '' );
}
}
break;
case 'range':
if ( 'object' === typeof self.$rangeSlider && 'undefined' !== typeof self.$rangeSlider[ $option.attr( 'data-index' ) ] ) {
if ( $option.find( '.fusion-range-default' ).length ) {
oldValue = $option.find( '.fusion-range-default' ).attr( 'data-default' );
$option.find( '.fusion-range-default' ).attr( 'data-default', value );
}
self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.options[ 'default' ] = value;
if ( oldValue === self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.get() ) {
$option.find( '.fusion-range-default' ).trigger( 'click' );
}
}
break;
}
},
paramChanged: function( param, value ) {
var self = this,
$option = 0 < this.$el.find( 'li[data-option-id="' + param + '"]' ).length ? this.$el.find( 'li[data-option-id="' + param + '"]' ) : this.$el.find( '[name=' + param + ']' ).closest( '.fusion-builder-option' ),
optionType = false,
$target,
values,
$datePicker,
$timePicker;
if ( jQuery( '.fusion-table-builder-chart' ).length ) {
jQuery( '.fusion-table-builder-chart' ).closest( '.ui-dialog-content' ).dialog( 'close' );
}
if ( ! $option.length ) {
return;
}
if ( $option.attr( 'data-option-type' ) ) {
optionType = $option.attr( 'data-option-type' );
}
this.changesPaused = true;
if ( ! optionType ) {
optionType = $option.attr( 'class' ).replace( 'fusion-builder-option', '' ).trim();
}
switch ( optionType ) {
case 'iconpicker':
$option.find( '.icon_preview.selected-element' ).removeClass( 'selected-element' );
if ( value && 2 === value.split( ' ' ).length ) {
$option.find( '.icon-' + value.split( ' ' )[ 0 ] ).addClass( 'selected-element' );
}
$option.find( '#' + param ).val( value ).trigger( 'change' );
break;
case 'upload':
$option.find( '#' + param ).val( value ).trigger( 'change' );
$option.find( '.fusion-builder-upload-preview img' ).remove();
if ( value && '' !== value ) {
$option.find( '.fusion-upload-area:not( .fusion-uploaded-image )' ).addClass( 'fusion-uploaded-image' );
$option.find( '.fusion-builder-upload-preview' ).prepend( '
' );
} else {
$option.find( '.fusion-upload-area' ).removeClass( 'fusion-uploaded-image' );
}
break;
case 'multiple_select':
$option.find( '.fusion-select-preview' ).empty();
$option.find( 'input[type="checkbox"]' ).prop( 'checked', false );
if ( value && '' !== value ) {
values = value.split( ',' );
_.each( values, function( value ) {
$option.find( 'input[value="' + value + '"]' ).prop( 'checked', true );
$option.find( '.fusion-select-preview' ).append( '' + $option.find( 'input[value="' + value + '"]' ).attr( 'data-label' ) + 'x' );
} );
}
if ( 0 === $option.find( '.fusion-select-preview .fusion-preview-selected-value' ).length ) {
$option.find( '.fusion-select-preview-wrap' ).addClass( 'fusion-select-show-placeholder' );
} else {
$option.find( '.fusion-select-preview-wrap' ).removeClass( 'fusion-select-show-placeholder' );
}
$option.find( '#' + param ).val( value ).trigger( 'change' );
break;
case 'tinymce':
if ( $option.find( '#child_' + param ).length ) {
param = 'child_' + param;
}
$option.find( '#' + param ).val( value );
if ( $option.find( '#' + param ).hasClass( 'fusion-editor-field' ) && 'undefined' !== typeof window.tinyMCE && window.tinyMCE.get( param ) && ! window.tinyMCE.get( param ).isHidden() ) {
if ( window.tinyMCE.get( param ).getParam( 'wpautop', true ) && 'undefined' !== typeof window.switchEditors ) {
value = window.switchEditors.wpautop( value );
}
window.tinyMCE.get( param ).setContent( value, { format: 'html' } );
}
break;
case 'date_time_picker':
$option.find( '#' + param ).val( value ).trigger( 'change' );
$datePicker = $option.find( '.fusion-date-picker' );
$timePicker = $option.find( '.fusion-time-picker' );
if ( -1 !== value.indexOf( ' ' ) && $datePicker.length && $timePicker.length ) {
values = value.split( ' ' );
$datePicker.val( values[ 0 ] );
$timePicker.val( values[ 1 ] );
} else if ( $datePicker.length ) {
$datePicker.val( value );
} else if ( $timePicker.length ) {
$timePicker.val( value );
}
break;
case 'raw_textarea':
case 'raw_text':
try {
value = FusionPageBuilderApp.base64Decode( value );
$option.find( '#' + param ).val( value ).trigger( 'change' );
} catch ( e ) {
console.warn( 'Something went wrong! Error triggered - ' + e );
}
break;
case 'code':
if ( 'undefined' !== typeof self.codeEditorOption[ $option.attr( 'data-index' ) ] ) {
try {
value = FusionPageBuilderApp.base64Decode( value );
self.codeEditorOption[ $option.attr( 'data-index' ) ].setValue( value );
} catch ( e ) {
console.warn( 'Something went wrong! Error triggered - ' + e );
}
}
break;
case 'range':
if ( 'undefined' !== typeof self.$rangeSlider[ $option.attr( 'data-index' ) ] ) {
if ( 'undefined' === typeof value || '' === value ) {
value = self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.options[ 'default' ];
}
self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.set( value );
}
break;
case 'checkbox_button_set':
$option.find( '.button-set-value' ).val( value ).trigger( 'change' );
$option.find( '.ui-state-active' ).removeClass( 'ui-state-active' );
if ( 'string' === typeof value && '' !== value ) {
values = value.split( ',' );
_.each( values, function( value ) {
$option.find( '[data-value="' + value + '"]' ).addClass( 'ui-state-active' );
} );
} else if ( 'hide_on_mobile' === param ) {
$option.find( '.buttonset-item' ).addClass( 'ui-state-active' );
}
break;
case 'select':
$target = $option.find( '.fusion-select-options .fusion-select-label[data-value="' + value + '"]' );
if ( $target.length ) {
$option.find( '.fusion-option-selected' ).removeClass( 'fusion-option-selected' );
$target.addClass( 'fusion-option-selected' );
$option.find( '.fusion-select-preview' ).html( $target.html() );
$option.find( '#' + param ).val( value ).trigger( 'fusion-change' );
}
break;
case 'colorpicker':
case 'colorpickeralpha':
$target = $option.find( '.fusion-builder-color-picker-hex' );
if ( $target.length ) {
$target.val( value ).trigger( 'change' );
}
break;
case 'radio_button_set':
$target = $option.find( '.buttonset-item[data-value="' + value + '"]' );
if ( $target.length ) {
$option.find( '.ui-state-active' ).removeClass( 'ui-state-active' );
$target.addClass( 'ui-state-active' );
$option.find( '#' + param ).val( value ).trigger( 'change' );
}
break;
case 'dimension':
$target = $option.find( '#' + param );
if ( $target.length ) {
$target.val( value ).trigger( 'change' );
}
break;
case 'sortable':
self.reRender();
break;
case 'sortable_text':
self.reRender();
break;
case 'connected_sortable':
self.reRender();
break;
default:
$option.find( '[name=' + param + ']' ).val( value ).trigger( 'change' );
break;
}
this.changesPaused = false;
}
} );
// Options
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionCodeBlock );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionColorPicker );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionDimensionField );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionIconPicker );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionOptionUpload );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.radioButtonSet );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionRangeField );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSelectField );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionCheckboxButtonSet );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionDateTimePicker );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionEditor );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionAjaxSelect );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionMultiSelect );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSwitchField );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionTextFieldPlaceholder );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionLinkSelector );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionRepeaterField );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSortable );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSortableText );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionConnectedSortable );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionDynamicData );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionTypographyField );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionColumnWidth );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionFormOptions );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionLogics );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionImageFocusPoint );
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionNominatimSelector );
// Active states.
_.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.fusionActiveStates );
}( jQuery ) );