Skip to content

Instantly share code, notes, and snippets.

@FinalDestiny
Created December 10, 2017 21:58
Show Gist options
  • Save FinalDestiny/cc1d125c1cb6ce9d017220e3fad34aa3 to your computer and use it in GitHub Desktop.
Save FinalDestiny/cc1d125c1cb6ce9d017220e3fad34aa3 to your computer and use it in GitHub Desktop.
var ET_PageBuilder = ET_PageBuilder || {};
window.wp = window.wp || {};
/**
* The builder version and product name will be updated by grunt release task. Do not edit!
*/
window.et_builder_version = '3.0.91';
window.et_builder_product_name = 'Divi';
( function($) {
var et_error_modal_shown = window.et_error_modal_shown,
et_is_loading_missing_modules = false,
et_pb_bulder_loading_attempts = 0,
et_ls_prefix = 'et_pb_templates_',
et_pb_hovered_item_buffer = {},
et_pb_all_unsynced_options = {},
et_pb_all_legacy_synced_options = [],
et_pb_key_pressed = {
's' : false,
'r' : false,
'c' : false
};
// Rebuild BB template
function et_pb_template_rebuild(template, map) {
// If we don't have a map, do nothing
if (_.isUndefined(map)) {
return template;
}
var placeholder = /<!-- (\d+) -->/g;
function unique(match, key) {
return map[key];
}
return template.replace(placeholder, unique);
}
function et_builder_maybe_clear_localstorage() {
var settings_product_version = et_pb_options.product_version,
forced_clear_setting_name,
forced_clear;
forced_clear_setting_name = 'et_forced_localstorage_clear';
forced_clear = localStorage.getItem( forced_clear_setting_name );
if ( ! forced_clear ) {
forced_clear = wpCookies.get( forced_clear_setting_name );
}
// attempt to clear localStorage only once
if ( forced_clear !== settings_product_version ) {
localStorage.clear();
wpCookies.set( forced_clear_setting_name, settings_product_version );
localStorage.setItem( forced_clear_setting_name, settings_product_version );
setTimeout( function() {
window.location.reload();
}, 100 );
}
}
function et_builder_load_backbone_templates( reload_template ) {
// run et_pb_append_templates as many times as needed
var et_pb_templates_count = 0,
date_now = new Date(),
today_date = date_now.getYear() + '_' + date_now.getMonth() + '_' + date_now.getDate(),
et_ls_all_modules = ( et_pb_options['et_builder_module_parent_shortcodes'] + '|' + et_pb_options['et_builder_module_child_shortcodes'] ).split( '|' ),
product_version = et_pb_options.product_version,
active_plugins = et_pb_options.active_plugins.join('|'),
local_storage_buffer = '',
processed_modules_count = 0,
missing_modules = {
missing_modules_array: []
},
et_pb_templates_interval;
reload_template = _.isUndefined( reload_template ) ? false : reload_template;
if ( ! reload_template ) {
if ( ! $( 'script[src="' + et_pb_options.builder_js_src + '"]' ).length ) {
$( '.et-pb-cache-update' ).show();
}
$( 'body' ).on( 'click', '.et_builder_increase_memory', function() {
var $this_button = $(this);
$.ajax({
type: "POST",
dataType: 'json',
url: et_pb_options.ajaxurl,
data: {
action : 'et_pb_increase_memory_limit',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce
},
success: function( data ) {
if ( ! _.isUndefined( data.success ) ) {
$this_button.addClass( 'et_builder_modal_action_button_success' ).text( et_pb_options.memory_limit_increased );
} else {
$this_button.addClass( 'et_builder_modal_action_button_fail' ).prop( 'disabled', true ).text( et_pb_options.memory_limit_not_increased );
}
}
});
return false;
} );
$( 'body' ).on( 'click', '.et_pb_reload_builder', function() {
location.reload();
return false;
} );
}
if ( et_should_load_from_local_storage() ) {
for ( et_ls_module_index in et_ls_all_modules ) {
var et_ls_module_slug = et_ls_all_modules[ et_ls_module_index ],
et_ls_template_slug = et_ls_prefix + et_ls_module_slug,
et_ls_template_content = LZString.decompressFromUTF16( localStorage.getItem( et_ls_template_slug ) );
// count the processed modules
processed_modules_count++;
if ( _.isUndefined( et_ls_template_content ) || _.isNull( et_ls_template_content ) || '' === et_ls_template_content ) {
missing_modules['missing_modules_array'].push( et_ls_module_slug );
} else {
local_storage_buffer += LZString.decompressFromUTF16( localStorage.getItem( et_ls_template_slug ) );
}
// perform ajax request if missing_modules_array length equals to the templates amount setting or if all the modules processed and we need to retrieve something
if ( ! et_is_loading_missing_modules && ( ( missing_modules['missing_modules_array'].length === parseInt( et_pb_options.et_builder_templates_amount ) ) || ( missing_modules['missing_modules_array'].length && ( et_ls_all_modules.length === processed_modules_count ) ) ) ) {
et_is_loading_missing_modules = true;
$.ajax({
type: "POST",
dataType: 'json',
url: et_pb_options.ajaxurl,
data: {
action : 'et_pb_get_backbone_template',
et_post_type : et_pb_options.post_type,
et_modules_slugs : JSON.stringify( missing_modules ),
et_admin_load_nonce : et_pb_options.et_admin_load_nonce
},
success: function( data ) {
et_is_loading_missing_modules = false;
var template;
// Backend always returns an array of templates, even for a single module.
if ( !_.isUndefined(data.templates) && data.templates.length ) {
_.each( data.templates, function( single_module ) {
template = et_pb_template_rebuild(single_module['template'], data.unique);
try {
localStorage.setItem( et_ls_prefix + single_module['slug'], LZString.compressToUTF16( template ) );
} catch(e) {
// do not use localStorage if it full or any other error occurs
et_builder_maybe_clear_localstorage();
}
$( 'body' ).append( template );
} );
}
}
});
// reset the array of missing modules
missing_modules['missing_modules_array'] = [];
}
}
$( 'body' ).append( local_storage_buffer );
} else {
// run et_pb_append_templates as many times as needed
et_pb_templates_interval = setInterval( function() {
if ( et_pb_templates_count === Math.ceil( et_pb_options.et_builder_modules_count/et_pb_options.et_builder_templates_amount ) ) {
clearInterval( et_pb_templates_interval );
return false;
}
et_pb_append_templates( et_pb_templates_count * et_pb_options.et_builder_templates_amount );
et_pb_templates_count++;
}, 800);
et_ls_set_transient();
}
function et_builder_has_storage_support() {
try {
return 'localStorage' in window && window.localStorage !== null;
} catch (e) {
return false;
}
}
function et_ls_set_transient() {
if ( ! et_builder_has_storage_support() ) {
return false;
}
try {
localStorage.setItem( et_ls_prefix + 'settings_date', today_date );
localStorage.setItem( et_ls_prefix + 'settings_product_version', product_version );
localStorage.setItem( et_ls_prefix + 'settings_active_plugins', active_plugins );
} catch(e) {
// do not use localStorage if it full or any other error occurs
}
}
function et_should_load_from_local_storage() {
if ( ! et_builder_has_storage_support() ) {
return false;
}
if ( ! _.isUndefined( et_pb_options.force_cache_purge ) && 'true' === et_pb_options.force_cache_purge ) {
return false;
}
var et_ls_settings_date = localStorage.getItem( et_ls_prefix + 'settings_date' ),
et_ls_settings_product_version = localStorage.getItem( et_ls_prefix + 'settings_product_version' ),
et_ls_settings_active_plugins = localStorage.getItem( et_ls_prefix + 'settings_active_plugins' );
if ( _.isUndefined( et_ls_settings_date ) || _.isNull( et_ls_settings_date ) ) {
return false;
}
if ( _.isUndefined( et_ls_settings_product_version ) || _.isNull( et_ls_settings_product_version ) ) {
return false;
}
if ( et_ls_settings_active_plugins !== active_plugins ) {
return false;
}
if ( today_date != et_ls_settings_date || product_version != et_ls_settings_product_version ) {
et_remove_ls_templates();
return false;
}
return true;
}
function et_remove_ls_templates() {
if ( ! et_builder_has_storage_support() ) {
return false;
}
_.forEach( _.keys( localStorage ), function( key ) {
if ( startsWith( key, 'et_pb_templates_' ) ) {
localStorage.removeItem( key );
}
} );
}
function et_pb_append_templates( start_from ) {
$.ajax({
type: "POST",
dataType: 'json',
url: et_pb_options.ajaxurl,
data: {
action : 'et_pb_get_backbone_templates',
et_post_type : et_pb_options.post_type,
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_templates_start_from : start_from
},
error: function() {
var $failure_notice_template = $( '#et-builder-failure-notice-template' );
if ( et_error_modal_shown ) {
return;
}
if ( ! $failure_notice_template.length ) {
return;
}
if ( $( '.et_pb_failure_notification_modal' ).length ) {
return;
}
if ( et_builder_has_storage_support() ) {
localStorage.removeItem( et_ls_prefix + 'settings_date' );
localStorage.removeItem( et_ls_prefix + 'settings_product_version' );
localStorage.removeItem( et_ls_prefix + 'settings_active_plugins' );
}
$( 'body' ).addClass( 'et_pb_stop_scroll' ).append( $failure_notice_template.html() );
},
success: function( data ) {
//append retrieved templates to body
var template;
for ( var name in data.templates ) {
template = et_pb_template_rebuild(data.templates[name], data.unique);
if ( et_builder_has_storage_support() ) {
try {
localStorage.setItem( 'et_pb_templates_' + name, LZString.compressToUTF16( template ) );
} catch(e) {
// do not use localStorage if it full or any other error occurs
et_builder_maybe_clear_localstorage();
}
}
$( 'body' ).append( template );
}
}
});
}
}
et_builder_load_backbone_templates();
/**
* Get value from object located at path.
*
* @see https://stackoverflow.com/a/15643385/2639936
*
* @param obj
* @param path
* @return {*}
*/
function get( obj, path ) {
return _.reduce( path.split( '.' ), function ( prev, curr ) {
return prev ? prev[curr] : undefined;
}, obj );
}
/**
* Check if path exists in object.
*
* @see https://stackoverflow.com/a/42042678/2639936
*
* @param obj
* @param path
* @return {boolean}
*/
function has( obj, path ) {
if ( ! path ) {
return true;
}
var path_parts = path.split( '.' );
var first_part = _.first( path_parts );
return _.has( obj, first_part ) && has( obj[first_part], _.rest( path_parts ).join( '.' ) );
}
/**
* Determine whether or not a string ends with another string.
*
* @param string
* @param substring
* @return {boolean}
*/
function endsWith( string, substring ) {
return string.substr( string.length - substring.length, string.length ) === substring;
}
/**
* Determine whether or not a string starts with another string.
*
* @param string
* @param substring
* @return {boolean}
*/
function startsWith( string, substring ) {
return string.substr( 0, string.length ) === substring;
}
$( document ).ready( function() {
// Explicitly define ERB-style template delimiters to prevent
// template delimiters being overwritten by 3rd party plugin
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate: /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
//Helpers
ET_PageBuilder.Helpers = {};
ET_PageBuilder.Helpers.getSettingValue = function($setting) {
var setting_value;
var checked_values = [];
var custom_css_option_value;
var name = $setting.is('#et_pb_content_main') ? 'et_pb_content_new' : $setting.attr('id');
// Process all checkboxex for the current setting at once
if ($setting.is(':checkbox')) {
// name attribute is used in normal html checkboxes, use it instead of ID
name = $setting.attr('name');
$setting.closest('.et-pb-option-container').find('[name="' + name + '"]:checked').each(function () {
checked_values.push($(this).val());
});
setting_value = checked_values.join(",");
} else if ($setting.is('#et_pb_content_main')) {
// Process main content
setting_value = $setting.html();
// Replace temporary ^^ signs with double quotes
setting_value = setting_value.replace( /\^\^/g, '%22' );
} else if ( $setting.closest( '.et-pb-custom-css-option' ).length ) {
// Custom CSS settings content should be modified before it is added to the shortcode attribute
custom_css_option_value = $setting.val();
// replace new lines with || and backlash \ with %92 in Custom CSS settings
setting_value = '' !== custom_css_option_value ? custom_css_option_value.replace( /(?:\r\n|\r|\n)/g, '\|\|' ).replace( /\\/g, '%92' ) : '';
} else if ( $setting.hasClass( 'et-pb-range-input' ) ) {
// Get range input value
setting_value = et_pb_get_range_input_value($setting);
if ($setting.hasClass('et-pb-validate-unit')) {
setting_value = et_pb_sanitize_input_unit_value(setting_value.toString(), false, 'no_default_unit');
}
} else if ($setting.hasClass('et-pb-range')) {
var $real_setting = $setting.siblings('.et-pb-range-input');
setting_value = et_pb_get_range_input_value($real_setting);
if ($real_setting.hasClass('et-pb-validate-unit')) {
setting_value = et_pb_sanitize_input_unit_value(setting_value.toString(), false, 'no_default_unit');
}
} else if ( $setting.hasClass( 'et-pb-validate-unit' ) ) {
// Process validated unit
setting_value = et_pb_sanitize_input_unit_value( $setting.val(), false, '' );
} else if ( $setting.hasClass( 'et-pb-text-align-select') ) {
// Process text alignment option. Check for button's et_text_align_active class name to ensure that an option is selected.
// This prevents the builder unwantedly treats first option as selected option
if ( $setting.closest( '.et-pb-option-container' ).find( '.et_text_align_active' ).length ) {
setting_value = $setting.val();
}
} else if ( ! $setting.is( ':checkbox' ) ) {
// Process all other settings: inputs, textarea#et_pb_content_new, range sliders etc.
setting_value = $setting.is('textarea#et_pb_content_new')
? et_pb_get_content( 'et_pb_content_new' )
: $setting.val();
if ( $setting.hasClass( 'et-pb-range-input' ) && setting_value === 'px' ) {
setting_value = '';
}
}
if (_.isNull(setting_value)) {
setting_value = '';
}
return setting_value;
};
// Models
ET_PageBuilder.Module = Backbone.Model.extend( {
defaults: {
type : 'element',
_builder_version : et_pb_options.product_version
}
} );
ET_PageBuilder.SavedTemplate = Backbone.Model.extend( {
defaults: {
title : 'template',
ID : 0,
shortcode : '',
is_global : 'false',
layout_type : '',
module_type : '',
categories : [],
unsynced_options : []
}
} );
ET_PageBuilder.History = Backbone.Model.extend( {
defaults : {
timestamp : _.now(),
shortcode : '',
current_active_history : false,
verb : 'did',
noun : 'something'
},
max_history_limit : 100,
validate : function( attributes, options ) {
var histories_count = options.collection.length,
active_history_model = options.collection.findWhere({ current_active_history : true }),
shortcode = attributes.shortcode,
last_model = _.isUndefined( active_history_model ) ? options.collection.at( ( options.collection.length - 1 ) ) : active_history_model,
last_shortcode = _.isUndefined( last_model ) ? false : last_model.get( 'shortcode' ),
previous_active_histories;
if ( shortcode === last_shortcode ) {
return 'duplicate';
}
// Turn history tracking off
ET_PageBuilder_App.enable_history = false;
// Limit number of history limit
var histories_count = options.collection.models.length,
remove_limit = histories_count - ( this.max_history_limit - 1 ),
ranges,
deleted_model;
// Some models are need to be removed
if ( remove_limit > 0 ) {
// Loop and shift (remove first model in collection) n-times
for (var i = 1; i <= remove_limit; i++) {
options.collection.shift();
};
}
}
} );
// helper module
ET_PageBuilder.Layout = Backbone.Model.extend( {
defaults: {
moduleNumber : 0,
forceRemove : false,
modules : $.parseJSON( et_pb_options.et_builder_modules ),
views : [
]
},
initialize : function() {
// Single and double quotes are replaced with %% in et_builder_modules
// to avoid js conflicts.
// Replace them with appropriate signs.
_.each( this.get( 'modules' ), function( module ) {
module['title'] = module['title'].replace( /%%/g, '"' );
module['title'] = module['title'].replace( /\|\|/g, "'" );
} );
},
addView : function( module_cid, view ) {
var views = this.get( 'views' );
views[module_cid] = view;
this.set( { 'views' : views } );
},
getView : function( cid ) {
return this.get( 'views' )[cid];
},
getChildViews : function( parent_id ) {
var views = this.get( 'views' ),
child_views = {};
_.each( views, function( view, key ) {
if ( typeof view !== 'undefined' && view['model']['attributes']['parent'] === parent_id )
child_views[key] = view;
} );
return child_views;
},
getChildrenViews : function( parent_id ) {
var this_el = this,
views = this_el.get( 'views' ),
child_views = {},
grand_children;
_.each( views, function( view, key ) {
if ( typeof view !== 'undefined' && view['model']['attributes']['parent'] === parent_id ) {
grand_children = this_el.getChildrenViews( view['model']['attributes']['cid'] );
if ( ! _.isEmpty( grand_children ) ) {
_.extend( child_views, grand_children );
}
child_views[key] = view;
}
} );
return child_views;
},
getParentViews : function( parent_cid ) {
var parent_view = this.getView( parent_cid ),
parent_views = {};
while( ! _.isUndefined( parent_view ) ) {
parent_views[parent_view['model']['attributes']['cid']] = parent_view;
parent_view = this.getView( parent_view['model']['attributes']['parent'] );
}
return parent_views;
},
getSectionView : function( parent_cid ) {
var views = this.getParentViews( parent_cid ),
section_view;
section_view = _.filter( views, function( item ) {
if ( item.model.attributes.type === "section" ) {
return true;
} else {
return false;
}
} );
if ( _.isUndefined( section_view[0] ) ) {
return false;
} else {
return section_view[0];
}
},
setNewParentID : function( cid, new_parent_id ) {
var views = this.get( 'views' );
views[cid]['model']['attributes']['parent'] = new_parent_id;
this.set( { 'views' : views } );
},
removeView : function( cid ) {
var views = this.get( 'views' ),
new_views = {};
_.each( views, function( value, key ) {
if ( key != cid )
new_views[key] = value;
} );
this.set( { 'views' : new_views } );
},
generateNewId : function() {
var moduleNumber = this.get( 'moduleNumber' ) + 1;
this.set( { 'moduleNumber' : moduleNumber } );
return moduleNumber;
},
generateTemplateName : function( name ) {
var default_elements = [ 'row', 'row_inner', 'section', 'column', 'column_inner'];
if ( -1 !== $.inArray( name, default_elements ) ) {
name = 'et_pb_' + name;
}
return '#et-builder-' + name + '-module-template';
},
getModuleOptionsNames : function( module_type ) {
var modules = this.get('modules');
return this.addAdminLabel( _.findWhere( modules, { label : module_type } )['options'] );
},
getNumberOf : function( element_name, module_cid ) {
var views = this.get( 'views' ),
num = 0;
_.each( views, function( view ) {
if ( typeof view !== 'undefined' ) {
var type = view['model']['attributes']['type'];
if ( view['model']['attributes']['parent'] === module_cid && ( type === element_name || type === ( element_name + '_inner' ) ) )
num++;
}
} );
return num;
},
getNumberOfModules : function( module_name ) {
var views = this.get( 'views' ),
num = 0;
_.each( views, function( view ) {
if ( typeof view !== 'undefined' ) {
if ( view['model']['attributes']['type'] === module_name )
num++;
}
} );
return num;
},
getTitleByShortcodeTag : function ( tag ) {
var modules = this.get('modules');
return _.findWhere( modules, { label : tag } )['title'];
},
getDefaultAdminLabel : function( module_type ) {
var is_structure_element = $.inArray( module_type, [ 'section', 'row', 'column', 'row_inner', 'column_inner' ] ) > -1;
if ( is_structure_element ) {
return typeof et_pb_options.noun[ module_type ] !== 'undefined' ? et_pb_options.noun[ module_type ] : module_type;
}
return this.getTitleByShortcodeTag( module_type );
},
isModuleFullwidth : function ( module_type ) {
var modules = this.get('modules');
return 'on' === _.findWhere( modules, { label : module_type } )['fullwidth_only'] ? true : false;
},
isChildrenLocked : function ( module_cid ) {
var children_views = this.getChildrenViews( module_cid ),
children_locked = false;
_.each( children_views, function( child ) {
if ( child.model.get( 'et_pb_locked' ) === 'on' || child.model.get( 'et_pb_parent_locked' ) === 'on' ) {
children_locked = true;
}
} );
return children_locked;
},
addAdminLabel : function ( optionsNames ) {
return _.union( optionsNames, ['admin_label'] );
},
removeGlobalAttributes : function ( view, keep_attributes ) {
var this_class = this,
keep_attributes = _.isUndefined( keep_attributes ) ? false : keep_attributes,
global_item_cid = _.isUndefined( view.model.attributes.global_parent_cid ) ? view.model.attributes.cid : view.model.attributes.global_parent_cid,
global_item_view = this.getView( global_item_cid );
global_item_children_views = this.getChildrenViews( global_item_cid );
// Modify global item's attributes
if ( this.is_global( global_item_view.model ) ) {
if ( keep_attributes ) {
global_item_view.model.set( 'et_pb_temp_global_module', global_item_view.model.get( 'et_pb_global_module' ) );
}
global_item_view.model.unset( 'et_pb_global_module' );
}
// Modify global item children's attributes
_.each( global_item_children_views, function( global_item_children_view ) {
if ( this_class.is_global_children( global_item_children_view.model ) ) {
if ( keep_attributes ) {
global_item_children_view.model.set( 'et_pb_temp_global_parent', global_item_children_view.model.get( 'et_pb_global_parent' ) );
}
global_item_children_view.model.unset( 'et_pb_global_parent' );
}
if ( this_class.has_global_parent_cid( global_item_children_view.model ) ) {
if ( keep_attributes ) {
global_item_children_view.model.set( 'et_pb_temp_global_parent_cid', global_item_children_view.model.get( 'global_parent_cid' ) );
}
global_item_children_view.model.unset( 'global_parent_cid' );
}
});
},
removeTemporaryGlobalAttributes : function ( view, restore_attributes ) {
var this_class = this,
restore_attributes = _.isUndefined( restore_attributes ) ? false : restore_attributes,
global_item_model = _.isUndefined( view.model.attributes.et_pb_temp_global_module ) ? ET_PageBuilder_Modules.findWhere({ et_pb_temp_global_module : view.model.attributes.et_pb_temp_global_parent }) : view.model,
global_item_cid = global_item_model.attributes.cid,
global_item_view = ET_PageBuilder_Layout.getView( global_item_cid );
global_item_children_views = ET_PageBuilder_Layout.getChildrenViews( global_item_cid );
if ( this.is_temp_global( global_item_view.model ) ) {
if ( restore_attributes ) {
global_item_view.model.set( 'et_pb_global_module', global_item_view.model.get( 'et_pb_temp_global_module' ) );
}
global_item_view.model.unset( 'et_pb_temp_global_module' );
}
_.each( global_item_children_views, function( global_item_children_view ) {
if ( this_class.is_temp_global_children( global_item_children_view.model ) ) {
if ( restore_attributes ) {
global_item_children_view.model.set( 'et_pb_global_parent', global_item_children_view.model.get( 'et_pb_temp_global_parent' ) );
}
global_item_children_view.model.unset( 'et_pb_temp_global_parent' );
}
if ( this_class.has_temp_global_parent_cid( global_item_children_view.model ) ) {
if ( restore_attributes ) {
global_item_children_view.model.set( 'global_parent_cid', global_item_children_view.model.get( 'et_pb_temp_global_parent_cid' ) );
}
global_item_children_view.model.unset( 'et_pb_temp_global_parent_cid' );
}
});
if ( restore_attributes ) {
// Update global template
et_pb_update_global_template( global_item_cid );
}
},
is_app : function( model ) {
if ( model.attributes.type === 'app' ) {
return true;
}
return false;
},
is_global : function( model ) {
// App cannot be global module. Its model.get() returns error
if ( this.is_app( model ) ) {
return false;
}
return model.has( 'et_pb_global_module' ) && model.get( 'et_pb_global_module' ) !== '' ? true : false;
},
is_global_children : function( model ) {
// App cannot be global module. Its model.get() returns error
if ( this.is_app( model ) ) {
return false;
}
return model.has( 'et_pb_global_parent' ) && model.get( 'et_pb_global_parent' ) !== '' ? true : false;
},
has_global_parent_cid : function( model ) {
return model.has( 'global_parent_cid' ) && model.get( 'global_parent_cid' ) !== '' ? true : false;
},
is_temp_global : function( model ) {
return model.has( 'et_pb_temp_global_module' ) && model.get( 'et_pb_temp_global_module' ) !== '' ? true : false;
},
is_temp_global_children : function( model ) {
return model.has( 'et_pb_temp_global_parent' ) && model.get( 'et_pb_temp_global_parent' ) !== '' ? true : false;
},
has_temp_global_parent_cid : function( model ) {
return model.has( 'et_pb_temp_global_parent_cid' ) && model.get( 'et_pb_temp_global_parent_cid' ) !== '' ? true : false;
},
changeColumnStructure: function( that, options, skip_reinit, skip_history ) {
var layout = options.layout.split(','),
specialty_columns = options.specialty_columns,
layout_specialty = options.layout_specialty,
layout_elements_num = _.size( layout ),
this_view = that.options.view;
global_module_cid = et_pb_get_global_parent_cid( that );
if ( options.is_structure_change ) {
var row_columns = ET_PageBuilder_Layout.getChildViews( that.model.get( 'cid' ) ),
columns_structure_old = [],
index_count = 0;
_.each( row_columns, function( row_column ) {
columns_structure_old[index_count] = row_column.model.get( 'cid' );
index_count = index_count + 1;
} );
}
_.each( layout, function( element, index ) {
var update_content = layout_elements_num == ( index + 1 )
? 'true'
: 'false',
column_attributes = {
type : 'column',
cid : ET_PageBuilder_Layout.generateNewId(),
parent : that.model.get( 'cid' ),
layout : element,
view : this_view
};
if ( typeof that.model.get( 'et_pb_global_parent' ) !== 'undefined' && '' !== that.model.get( 'et_pb_global_parent' ) ) {
column_attributes.et_pb_global_parent = that.model.get( 'et_pb_global_parent' );
column_attributes.global_parent_cid = that.model.get( 'global_parent_cid' );
}
if ( typeof layout_specialty[index] !== 'undefined' && layout_specialty[index] === '1' ) {
column_attributes.layout_specialty = layout_specialty[index];
column_attributes.specialty_columns = parseInt( specialty_columns );
}
if ( typeof that.model.get( 'specialty_row' ) !== 'undefined' ) {
that.model.set( 'module_type', 'row_inner', { silent : true } );
that.model.set( 'type', 'row_inner', { silent : true } );
}
that.collection.add( [ column_attributes ], { update_shortcodes : update_content } );
} );
if ( options.is_structure_change ) {
var columns_structure_new = [];
row_columns = ET_PageBuilder_Layout.getChildViews( that.model.get( 'cid' ) );
index_count = 0;
_.each( row_columns, function( row_column ) {
columns_structure_new[index_count] = row_column.model.get( 'cid' );
index_count = index_count + 1;
} );
// delete old columns IDs
columns_structure_new.splice( 0, columns_structure_old.length );
for ( index = 0; index < columns_structure_old.length; index++ ) {
var is_extra_column = ( columns_structure_old.length > columns_structure_new.length ) && ( index > ( columns_structure_new.length - 1 ) ) ? true : false,
old_column_cid = columns_structure_old[index],
new_column_cid = is_extra_column ? columns_structure_new[columns_structure_new.length-1] : columns_structure_new[index],
column_html = ET_PageBuilder_Layout.getView( old_column_cid ).$el.html(),
modules = ET_PageBuilder_Layout.getChildViews( old_column_cid ),
$updated_column,
column_html_old = '';
ET_PageBuilder_Layout.getView( old_column_cid ).model.destroy();
ET_PageBuilder_Layout.getView( old_column_cid ).remove();
ET_PageBuilder_Layout.removeView( old_column_cid );
$updated_column = $('.et-pb-column[data-cid="' + new_column_cid + '"]');
if ( ! is_extra_column ) {
$updated_column.html( column_html );
} else {
$updated_column.find( '.et-pb-insert-module' ).remove();
column_html_old = $updated_column.html();
$updated_column.html( column_html_old + column_html );
}
_.each( modules, function( module ) {
module.model.set( 'parent', new_column_cid, { silent : true } );
} );
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'edited', 'column' );
if ( ! skip_reinit ) {
et_reinitialize_builder_layout();
}
}
if ( typeof that.model.get( 'template_type' ) !== 'undefined' && 'section' === that.model.get( 'template_type' ) && 'on' === that.model.get( 'et_pb_specialty' ) ) {
et_reinitialize_builder_layout();
}
if ( typeof that.model.get( 'et_pb_template_type' ) !== 'undefined' && 'row' === that.model.get( 'et_pb_template_type' ) ) {
et_add_template_meta( '_et_pb_row_layout', options.layout );
}
if ( typeof global_module_cid !== 'undefined' && '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
if ( ! skip_history ) {
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', 'column' );
}
ET_PageBuilder_Events.trigger( 'et-add:columns' );
},
} );
// Collections
ET_PageBuilder.Modules = Backbone.Collection.extend( {
model : ET_PageBuilder.Module
} );
ET_PageBuilder.SavedTemplates = Backbone.Collection.extend( {
model : ET_PageBuilder.SavedTemplate
} );
ET_PageBuilder.Histories = Backbone.Collection.extend( {
model : ET_PageBuilder.History
} );
//Views
ET_PageBuilder.TemplatesView = window.wp.Backbone.View.extend( {
className : 'et_pb_saved_layouts_list',
tagName : 'ul',
render: function() {
var global_class = '',
layout_category = typeof this.options.category === 'undefined' ? 'all' : this.options.category;
this.collection.each( function( single_template ) {
if ( 'all' === layout_category || ( -1 !== $.inArray( layout_category, single_template.get( 'categories' ) ) ) ) {
var single_template_view = new ET_PageBuilder.SingleTemplateView( { model: single_template } );
this.$el.append( single_template_view.el );
global_class = typeof single_template_view.model.get( 'is_global' ) !== 'undefined' && 'global' === single_template_view.model.get( 'is_global' ) ? 'global' : '';
}
}, this );
if ( 'global' === global_class ) {
this.$el.addClass( 'et_pb_global' );
}
return this;
}
} );
ET_PageBuilder.SingleTemplateView = window.wp.Backbone.View.extend( {
tagName : 'li',
template: _.template( $( '#et-builder-saved-entry' ).html() ),
events: {
'click' : 'insertSection',
},
initialize: function(){
this.render();
},
render: function() {
this.$el.html( this.template( this.model.toJSON() ) );
if ( typeof this.model.get( 'module_type' ) !== 'undefined' && '' !== this.model.get( 'module_type' ) && 'module' === this.model.get( 'layout_type' ) ) {
this.$el.addClass( this.model.get( 'module_type' ) );
}
},
insertSection : function( event ) {
var clicked_button = $( event.target ),
parent_id = typeof clicked_button.closest( '.et_pb_modal_settings' ).data( 'parent_cid' ) !== 'undefined' ? clicked_button.closest( '.et_pb_modal_settings' ).data( 'parent_cid' ) : '',
current_row = typeof $( '.et-pb-settings-heading' ).data( 'current_row' ) !== 'undefined' ? $( '.et-pb-settings-heading' ).data( 'current_row' ) : '',
global_id = 'global' === this.model.get( 'is_global' ) ? this.model.get( 'ID' ) : '',
specialty_row = typeof $( '.et-pb-saved-modules-switcher' ).data( 'specialty_columns' ) !== 'undefined' ? 'on' : 'off',
shortcode = this.model.get( 'shortcode' ),
unsynced_options = this.model.get( 'unsynced_options' ),
update_global = false,
global_holder_id = 'row' === this.model.get( 'layout_type' ) ? current_row : parent_id,
global_holder_view = ET_PageBuilder_Layout.getView( global_holder_id ),
history_noun = this.options.model.get( 'layout_type' ) === 'row_inner' ? 'saved_row' : 'saved_' + this.options.model.get( 'layout_type' ),
$modal_container = clicked_button.closest( '.et_pb_modal_settings_container' ),
global_parent_cid = et_pb_get_global_parent_cid( global_holder_view );
if ( 'on' === specialty_row ) {
global_holder_id = global_holder_view.model.get( 'parent' );
global_holder_view = ET_PageBuilder_Layout.getView( global_holder_id );
}
if ( 'section' !== this.model.get( 'layout_type' ) && ( '' !== global_parent_cid ) ) {
update_global = true;
// reset global id when adding global module into global section or row.
global_id = '';
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', history_noun );
event.preventDefault();
// apply wpautop to the shortcode to make sure all the line breaks inserted correctly
if ( typeof window.switchEditors !== 'undefined' ) {
shortcode = et_pb_fix_shortcodes( window.switchEditors.wpautop( shortcode ) );
}
ET_PageBuilder_App.createLayoutFromContent( shortcode , parent_id, '', { ignore_template_tag : 'ignore_template', current_row_cid : current_row, global_id : global_id, after_section : parent_id, is_reinit : 'reinit', 'unsynced_options' : unsynced_options } );
et_reinitialize_builder_layout();
if ( true === update_global ) {
et_pb_update_global_template( global_parent_cid );
}
if ( $modal_container.length ) {
$modal_container.find( '.et-pb-modal-close' ).click();
}
}
} );
ET_PageBuilder.TemplatesModal = window.wp.Backbone.View.extend( {
className : 'et_pb_modal_settings',
template : _.template( $( '#et-builder-load_layout-template' ).html() ),
events : {
'click .et-pb-options-tabs-links li a' : 'switchTab'
},
render: function() {
this.$el.html( this.template( { "display_switcher" : "off" } ) );
this.$el.addClass( 'et_pb_modal_no_tabs' );
return this;
},
switchTab: function( event ) {
var $this_el = $( event.currentTarget ).parent();
event.preventDefault();
et_handle_templates_switching( $this_el, 'section', '' );
}
} );
ET_PageBuilder.SectionView = window.wp.Backbone.View.extend( {
className : 'et_pb_section',
template : _.template( $('#et-builder-section-template').html() ),
events: {
'click .et-pb-settings-section' : 'showSettings',
'click .et-pb-clone-section' : 'cloneSection',
'click .et-pb-remove-section' : 'removeSection',
'click .et-pb-section-add-main' : 'addSection',
'click .et-pb-section-add-fullwidth' : 'addFullwidthSection',
'click .et-pb-section-add-specialty' : 'addSpecialtySection',
'click .et-pb-section-add-saved' : 'addSavedSection',
'click .et-pb-expand' : 'expandSection',
'click .et-pb-insert-row' : 'addFirstRow',
'contextmenu .et-pb-section-add' : 'showRightClickOptions',
'click.et_pb_section > .et-pb-controls .et-pb-unlock' : 'unlockSection',
'contextmenu.et_pb_section > .et-pb-controls' : 'showRightClickOptions',
'contextmenu.et_pb_row > .et-pb-right-click-trigger-overlay' : 'showRightClickOptions',
'click.et_pb_section > .et-pb-controls' : 'hideRightClickOptions',
'click.et_pb_row > .et-pb-right-click-trigger-overlay' : 'hideRightClickOptions',
'click > .et-pb-locked-overlay' : 'showRightClickOptions',
'contextmenu > .et-pb-locked-overlay' : 'showRightClickOptions',
'click' : 'setABTesting',
},
initialize : function() {
this.child_views = [];
this.listenTo( this.model, 'change:admin_label', this.renameModule );
this.listenTo( this.model, 'change:et_pb_disabled', this.toggleDisabledClass );
},
render : function() {
this.$el.html( this.template( this.model.toJSON() ) );
if ( this.model.get( 'et_pb_specialty' ) === 'on' ) {
this.$el.addClass( 'et_pb_section_specialty' );
if ( this.model.get( 'et_pb_specialty_placeholder' ) === 'true' ) {
this.$el.addClass( 'et_pb_section_placeholder' );
}
}
if ( this.model.get( 'et_pb_specialty' ) === 'on' || this.model.get( 'et_pb_fullwidth' ) === 'on' ) {
this.$el.find( '.et-pb-insert-row' ).remove();
}
if ( typeof this.model.get( 'et_pb_global_module' ) !== 'undefined' || ( typeof this.model.get( 'et_pb_template_type' ) !== 'undefined' && 'section' === this.model.get( 'et_pb_template_type' ) && 'global' === et_pb_options.is_global_template ) ) {
this.$el.addClass( 'et_pb_global' );
}
if ( typeof this.model.get( 'et_pb_disabled' ) !== 'undefined' && this.model.get( 'et_pb_disabled' ) === 'on' ) {
this.$el.addClass( 'et_pb_disabled' );
}
if ( typeof this.model.get( 'et_pb_locked' ) !== 'undefined' && this.model.get( 'et_pb_locked' ) === 'on' ) {
this.$el.addClass( 'et_pb_locked' );
}
if ( typeof this.model.get( 'et_pb_collapsed' ) !== 'undefined' && this.model.get( 'et_pb_collapsed' ) === 'on' ) {
this.$el.addClass( 'et_pb_collapsed' );
}
if ( typeof this.model.get( 'pasted_module' ) !== 'undefined' && this.model.get( 'pasted_module' ) ) {
et_pb_handle_clone_class( this.$el );
}
if ( ! _.isUndefined( this.model.get( 'et_pb_temp_global_module' ) ) ) {
this.$el.addClass( 'et_pb_global_temp' );
}
// Split Testing related class
if ( ET_PageBuilder_AB_Testing.is_active() ) {
if ( ET_PageBuilder_AB_Testing.is_subject( this.model ) ) {
this.$el.addClass( 'et_pb_ab_subject' );
// Apply subject rank coloring
ET_PageBuilder_AB_Testing.set_subject_rank_coloring( this );
}
if ( ET_PageBuilder_AB_Testing.is_goal( this.model ) ) {
this.$el.addClass( 'et_pb_ab_goal' );
}
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'section' ) ) {
this.$el.addClass( 'et_pb_ab_no_permission' );
}
}
this.makeRowsSortable();
return this;
},
showSettings : function( event ) {
var that = this,
$current_target = typeof event !== 'undefined' ? $( event.currentTarget ) : '',
modal_view,
view_settings = {
model : this.model,
collection : this.collection,
attributes : {
'data-open_view' : 'module_settings'
},
triggered_by_right_click : this.triggered_by_right_click,
do_preview : this.do_preview
};
if ( typeof event !== 'undefined' ) {
event.preventDefault();
}
if ( this.isSectionLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'section' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
if ( '' !== $current_target && $current_target.closest( '.et_pb_section_specialty' ).length ) {
var $specialty_section_columns = $current_target.closest( '.et_pb_section_specialty' ).find( '.et-pb-section-content > .et-pb-column' ),
columns_layout = '';
if ( $specialty_section_columns.length ) {
$specialty_section_columns.each( function() {
columns_layout += '' === columns_layout ? '1_1' : ',1_1';
});
}
view_settings.model.attributes.columns_layout = columns_layout;
}
modal_view = new ET_PageBuilder.ModalView( view_settings );
et_modal_view_rendered = modal_view.render();
if ( false === et_modal_view_rendered ) {
et_builder_load_backbone_templates( true );
setTimeout( function() {
that.showSettings();
}, 500 );
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
return;
}
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
$('body').append( et_modal_view_rendered.el );
if ( ( typeof modal_view.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== modal_view.model.get( 'et_pb_global_module' ) ) || ( typeof this.model.get( 'et_pb_template_type' ) !== 'undefined' && 'section' === this.model.get( 'et_pb_template_type' ) && 'global' === et_pb_options.is_global_template ) ) {
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_saved_global_modal' );
}
if ( typeof this.model.get( 'et_pb_specialty' ) !== 'undefined' && 'on' === this.model.get( 'et_pb_specialty' ) ) {
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_specialty_section_settings' );
}
et_pb_open_current_tab();
},
addSection : function( event ) {
var module_id = ET_PageBuilder_Layout.generateNewId();
event.preventDefault();
et_pb_close_all_right_click_options();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', 'section' );
this.collection.add( [ {
type : 'section',
module_type : 'section',
et_pb_fullwidth : 'off',
et_pb_specialty : 'off',
cid : module_id,
view : this,
created : 'auto',
admin_label : et_pb_options.noun['section']
} ] );
},
addFullwidthSection : function( event ) {
var module_id = ET_PageBuilder_Layout.generateNewId();
event.preventDefault();
et_pb_close_all_right_click_options();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', 'fullwidth_section' );
this.collection.add( [ {
type : 'section',
module_type : 'section',
et_pb_fullwidth : 'on',
et_pb_specialty : 'off',
cid : module_id,
view : this,
created : 'auto',
admin_label : et_pb_options.noun['section']
} ] );
},
addSpecialtySection : function( event ) {
var module_id = ET_PageBuilder_Layout.generateNewId(),
$event_target = $(event.target),
template_type = typeof $event_target !== 'undefined' && typeof $event_target.data( 'is_template' ) !== 'undefined' ? 'section' : '';
event.preventDefault();
et_pb_close_all_right_click_options();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', 'specialty_section' );
this.collection.add( [ {
type : 'section',
module_type : 'section',
et_pb_fullwidth : 'off',
et_pb_specialty : 'on',
cid : module_id,
template_type : template_type,
view : this,
created : 'auto',
admin_label : et_pb_options.noun['section']
} ] );
},
addSavedSection : function( event ) {
var parent_cid = this.model.get( 'cid' ),
view_settings = {
attributes : {
'data-open_view' : 'saved_templates',
'data-parent_cid' : parent_cid
},
view : this
},
main_view = new ET_PageBuilder.ModalView( view_settings );
et_pb_close_all_right_click_options();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
$( 'body' ).append( main_view.render().el );
generate_templates_view( 'include_global', '', 'section', $( '.et-pb-saved-modules-tab' ), 'regular', 0, 'all' );
event.preventDefault();
},
expandSection : function( event ) {
event.preventDefault();
var $parent = this.$el.closest('.et_pb_section');
$parent.removeClass('et_pb_collapsed');
// Add attribute to shortcode
this.options.model.attributes.et_pb_collapsed = 'off';
// Carousel effect for split testing subject
if ( ET_PageBuilder_AB_Testing.is_active() && this.model.get( 'et_pb_ab_subject' ) === 'on' ) {
ET_PageBuilder_AB_Testing.subject_carousel( this.model.get( 'cid' ) );
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'expanded', 'section' );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
},
unlockSection : function( event ) {
event.preventDefault();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
var this_el = this,
$parent = this_el.$el.closest('.et_pb_section'),
request = et_pb_user_lock_permissions(),
children_views;
request.done( function ( response ) {
if ( true === response ) {
$parent.removeClass('et_pb_locked');
// Add attribute to shortcode
this_el.options.model.attributes.et_pb_locked = 'off';
children_views = ET_PageBuilder_Layout.getChildrenViews( this_el.model.get('cid') );
_.each( children_views, function( view, key ) {
view.$el.removeClass('et_pb_parent_locked');
view.model.set( 'et_pb_parent_locked', 'off', { silent : true } );
} );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'unlocked', 'section' );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
} else {
alert( et_pb_options.locked_section_permission_alert );
}
});
},
addFirstRow: function() {
if ( ET_PageBuilder_App.isLoading ) {
return;
}
var module_id = ET_PageBuilder_Layout.generateNewId(),
global_parent = typeof this.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== this.model.get( 'et_pb_global_module' ) ? this.model.get( 'et_pb_global_module' ) : '',
global_parent_cid = '' !== global_parent ? this.model.get( 'cid' ) : '',
new_row_view;
this.collection.add( [ {
type : 'row',
module_type : 'row',
cid : module_id,
parent : this.model.get( 'cid' ),
view : this,
et_pb_global_parent : global_parent,
global_parent_cid : global_parent_cid,
admin_label : et_pb_options.noun['row']
} ] );
new_row_view = ET_PageBuilder_Layout.getView( module_id );
new_row_view.displayColumnsOptions();
},
addRow : function( appendAfter ) {
if ( ET_PageBuilder_App.isLoading ) {
return;
}
var module_id = ET_PageBuilder_Layout.generateNewId(),
global_parent = typeof this.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== this.model.get( 'et_pb_global_module' ) ? this.model.get( 'et_pb_global_module' ) : '',
global_parent_cid = '' !== global_parent ? this.model.get( 'cid' ) : '',
new_row_view;
this.collection.add( [ {
type : 'row',
module_type : 'row',
cid : module_id,
parent : this.model.get( 'cid' ),
view : this,
appendAfter : appendAfter,
et_pb_global_parent : global_parent,
global_parent_cid : global_parent_cid,
admin_label : et_pb_options.noun['row']
} ] );
new_row_view = ET_PageBuilder_Layout.getView( module_id );
new_row_view.displayColumnsOptions();
},
cloneSection : function( event ) {
event.preventDefault();
if ( this.isSectionLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'section' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
if ( ET_PageBuilder_AB_Testing.has_goal( this.model ) && ! ET_PageBuilder_AB_Testing.is_subject( this.model ) ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_clone_section_has_goal' );
return;
}
}
var $cloned_element = this.$el.clone(),
content,
clone_section,
view_settings = {
model : this.model,
view : this.$el,
view_event : event
};
clone_section = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'cloned', 'section' );
clone_section.copy( event );
clone_section.pasteAfter( event );
},
makeRowsSortable : function() {
var this_el = this,
sortable_el = this_el.model.get( 'et_pb_fullwidth' ) !== 'on'
? '.et-pb-section-content'
: '.et_pb_fullwidth_sortable_area',
connectWith = ':not(.et_pb_locked) > ' + sortable_el;
if ( this_el.model.get( 'et_pb_specialty' ) === 'on' ) {
return;
}
// Split Testing adjustment
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Disable sortable of Split testing item for user with no ab_testing permission
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'section' ) ) {
return;
}
}
this_el.$el.find( sortable_el ).sortable( {
connectWith: connectWith,
delay: 100,
cancel : '.et-pb-settings, .et-pb-clone, .et-pb-remove, .et-pb-row-add, .et-pb-insert-module, .et-pb-insert-column, .et-pb-insert-row, .et_pb_locked, .et-pb-disable-sort',
update : function( event, ui ) {
var $sortable_el = this_el.$el.find( sortable_el );
// Loading process occurs. Dragging is temporarily disabled
if ( ET_PageBuilder_App.isLoading ) {
$sortable_el.sortable('cancel');
return;
}
// Split Testing adjustment
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for permission user first
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( $( ui.item ).children('.et-pb-row-content').attr( 'data-cid' ), 'row' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
$sortable_el.sortable('cancel');
et_reinitialize_builder_layout();
return;
} else {
// User has proper permission. Verify whether the action is permissible or not
// IMPORTANT: update event is fired twice, once when the module is moved from its origin and once when the
// module is landed on its destination. This causes two different way in deciding $sender and $target
var $item = $( ui.item ),
$sender = _.isEmpty( $( ui.sender ) ) ? $( event.target ).parents('.et_pb_section') : $( ui.sender ).parents('.et_pb_section'),
$target = _.isEmpty( $( ui.sender ) ) ? $( event.toElement ).parents('.et_pb_section') : $( event.target ).parents('.et_pb_section'),
is_subject = $item.hasClass('et_pb_ab_subject'),
is_goal = $item.hasClass('et_pb_ab_goal'),
has_subject = $item.find('.et_pb_ab_subject').length,
has_goal = $item.find('.et_pb_ab_goal').length,
is_sender_inside_subject = $sender.closest('.et_pb_ab_subject').length,
is_target_inside_subject = $target.closest('.et_pb_ab_subject').length,
is_target_inside_goal = $target.closest('.et_pb_ab_goal').length;
// Row is goal, being moved to subject-section
if ( is_goal && ! is_subject && is_target_inside_subject ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_goal_into_subject');
$sortable_el.sortable('cancel');
et_reinitialize_builder_layout();
return;
}
// Row has goal, being moved to subject-section
if ( has_goal && is_target_inside_subject ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_goal_into_subject' );
$sortable_el.sortable('cancel');
et_reinitialize_builder_layout();
return;
}
// Row is subject, being moved to goal-section
if ( is_subject && ! is_goal && is_target_inside_goal ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_subject_into_goal');
$sortable_el.sortable('cancel');
et_reinitialize_builder_layout();
return;
}
// Row has subject, being moved to goal-section
if ( has_subject && is_target_inside_goal ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_subject_into_goal');
$sortable_el.sortable('cancel');
et_reinitialize_builder_layout();
return;
}
// Row is a goal inside subject, being moved to anywhere
if ( is_goal && is_sender_inside_subject ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_row_goal_out_from_subject');
$sortable_el.sortable('cancel');
et_reinitialize_builder_layout();
}
}
}
if ( ! $( ui.item ).closest( event.target ).length ) {
// don't allow to move the row to another section if the section has only one row
if ( ! $( event.target ).find( '.et_pb_row' ).length ) {
$(this).sortable( 'cancel' );
alert( et_pb_options.section_only_row_dragged_away );
}
// do not allow to drag rows into sections where sorting is disabled
if ( $( ui.item ).closest( '.et-pb-disable-sort').length ) {
$( event.target ).sortable( 'cancel' );
}
// makes sure the code runs one time, if row is dragged into another section
return;
}
var module_cid = $( ui.item ).find( '.et-pb-row-content' ).data( 'cid' );
var model = this_el.collection.find( function( model ) {
return model.get('cid') == module_cid;
} );
if ( $( ui.item ).closest( '.et_pb_section.et_pb_global' ).length && $( ui.item ).hasClass( 'et_pb_global' ) ) {
$( ui.sender ).sortable( 'cancel' );
alert( et_pb_options.global_row_alert );
} else if ( ( $( ui.item ).closest( '.et_pb_section.et_pb_global' ).length || $( ui.sender ).closest( '.et_pb_section.et_pb_global' ).length ) && '' === et_pb_options.template_post_id ) {
var global_module_cid,
$moving_from,
$moving_to;
$moving_from = $( ui.sender ).closest( '.et_pb_section.et_pb_global' );
$moving_to = $( ui.item ).closest( '.et_pb_section.et_pb_global' );
if ( $moving_from === $moving_to ) {
global_module_cid = model.get( 'global_parent_cid' );
et_pb_update_global_template( global_module_cid );
et_reinitialize_builder_layout();
} else {
var $global_element = $moving_from;
// remove global parent attributes if moved not to global parent.
if ( $moving_to.length === 0 && ( ( ! _.isUndefined( model.get( 'et_pb_global_parent' ) ) && '' !== model.get( 'et_pb_global_parent' ) ) || ! _.isUndefined( model.get( 'global_parent_cid' ) ) ) ) {
model.unset( 'et_pb_global_parent' );
model.unset( 'global_parent_cid' );
// remove global attributes from all the child components
ET_PageBuilder_Layout.removeGlobalAttributes( ET_PageBuilder_Layout.getView( model.get( 'cid' ) ) );
}
for ( var i = 1; i <= 2; i++ ) {
global_module_cid = $global_element.find( '.et-pb-section-content' ).data( 'cid' );
if ( typeof global_module_cid !== 'undefined' && '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
et_reinitialize_builder_layout();
}
$global_element = $moving_to;
}
}
}
ET_PageBuilder_Layout.setNewParentID( ui.item.find( '.et-pb-row-content' ).data( 'cid' ), this_el.model.attributes.cid );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'moved', 'row' );
ET_PageBuilder_Events.trigger( 'et-sortable:update' );
// Prepare collection sorting based on layout position
var section_cid = parseInt( $(this).attr( 'data-cid') ),
sibling_row_index = 0;
// Loop row block based on DOM position to ensure its index order
$(this).find('.et-pb-row-content').each(function(){
sibling_row_index++;
var sibling_row_cid = parseInt( $(this).data('cid') ),
layout_index = section_cid + sibling_row_index,
sibling_model = ET_PageBuilder_Modules.findWhere({ cid : sibling_row_cid });
// Set layout_index
sibling_model.set({ layout_index : layout_index });
});
// Sort collection based on layout_index
ET_PageBuilder_Modules.comparator = 'layout_index';
ET_PageBuilder_Modules.sort();
},
start : function( event, ui ) {
et_pb_close_all_right_click_options();
// copy row if Alt key pressed
if ( event.altKey ) {
var movedRow = ET_PageBuilder_Layout.getView( $( ui.item ).children('.et-pb-row-content').data( 'cid' ) );
var view_settings = {
model : movedRow.model,
view : movedRow.$el,
view_event : event
};
var clone_row = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
clone_row.copy( event, true );
clone_row.pasteAfter( event, undefined, undefined, undefined, true, true );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'cloned', 'row' );
}
}
} );
},
addChildView : function( view ) {
this.child_views.push( view );
},
removeChildViews : function() {
var child_views = ET_PageBuilder_Layout.getChildViews( this.model.attributes.cid );
_.each( child_views, function( view ) {
if ( typeof view.model !== 'undefined' )
view.model.destroy();
view.remove();
} );
},
removeSection : function( event, remove_all ) {
var rows,
remove_last_specialty_section = false;
if ( event ) event.preventDefault();
if ( this.isSectionLocked() || ET_PageBuilder_Layout.isChildrenLocked( this.model.get( 'cid' ) ) ) {
return;
}
if ( ET_PageBuilder_App.isLoading && _.isUndefined( remove_all ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() && _.isUndefined( remove_all ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'section' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_unremovable_subject( this.model ) && _.isUndefined( remove_all ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
return;
}
if ( ET_PageBuilder_AB_Testing.has_goal( this.model ) && ! ET_PageBuilder_AB_Testing.is_subject( this.model ) && _.isUndefined( remove_all ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_remove_section_has_goal' );
return;
}
if ( ET_PageBuilder_AB_Testing.has_unremovable_subject( this.model ) && _.isUndefined( remove_all ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_remove_section_has_unremovable_subject' );
return;
}
}
if ( this.model.get( 'et_pb_fullwidth' ) === 'on' ) {
this.removeChildViews();
} else {
rows = ET_PageBuilder_Layout.getChildViews( this.model.get('cid') );
_.each( rows, function( row ) {
if ( row.model.get( 'type' ) === 'column' ) {
// remove column in specialty section
row.removeColumn();
} else {
row.removeRow( false, true );
}
} );
}
// the only section left is specialty or fullwidth section
if ( ! ET_PageBuilder_Layout.get( 'forceRemove' ) && ( this.model.get( 'et_pb_specialty' ) === 'on' || this.model.get( 'et_pb_fullwidth' ) === 'on' ) && ET_PageBuilder_Layout.getNumberOfModules( 'section' ) === 1 ) {
remove_last_specialty_section = true;
}
// if there is only one section, don't remove it
// allow to remove all sections if removeSection function is called directly
// remove the specialty section even if it's the last one on the page
if ( ET_PageBuilder_Layout.get( 'forceRemove' ) || remove_last_specialty_section || ET_PageBuilder_Layout.getNumberOfModules( 'section' ) > 1 ) {
this.model.destroy();
ET_PageBuilder_Layout.removeView( this.model.get('cid') );
this.remove();
}
// start with the clean layout if the user removed the last specialty section on the page
if ( remove_last_specialty_section ) {
ET_PageBuilder_App.removeAllSections( true );
return;
}
// Enable history saving and set meta for history
if ( _.isUndefined( remove_all ) ) {
ET_PageBuilder_App.allowHistorySaving( 'removed', 'section' );
} else {
ET_PageBuilder_App.allowHistorySaving( 'cleared', 'layout' );
}
// trigger remove event if the row was removed manually ( using a button )
if ( event ) {
ET_PageBuilder_Events.trigger( 'et-module:removed' );
}
// Run Split Testing updater
ET_PageBuilder_AB_Testing.update();
},
isSectionLocked : function() {
if ( 'on' === this.model.get( 'et_pb_locked' ) ) {
return true;
}
return false;
},
showRightClickOptions : function( event ) {
event.preventDefault();
var et_right_click_options_view,
view_settings = {
model : this.model,
view : this.$el,
view_event : event
};
et_right_click_options_view = new ET_PageBuilder.RightClickOptionsView( view_settings );
},
hideRightClickOptions : function( event ) {
event.preventDefault();
et_pb_close_all_right_click_options();
},
renameModule : function() {
this.$( '.et-pb-section-title' ).html( this.model.get( 'admin_label' ) );
},
toggleDisabledClass : function() {
if ( typeof this.model.get( 'et_pb_disabled' ) !== 'undefined' && 'on' === this.model.get( 'et_pb_disabled' ) ) {
this.$el.addClass( 'et_pb_disabled' );
} else {
this.$el.removeClass( 'et_pb_disabled' );
}
},
setABTesting : function ( event ) {
event.preventDefault();
event.stopPropagation();
ET_PageBuilder_AB_Testing.set( this, event );
}
} );
ET_PageBuilder.RowView = window.wp.Backbone.View.extend( {
className : 'et_pb_row',
template : _.template( $('#et-builder-row-template').html() ),
events : {
'click .et-pb-settings-row' : 'showSettings',
'click .et-pb-insert-column' : 'displayColumnsOptions',
'click .et-pb-clone-row' : 'cloneRow',
'click .et-pb-row-add' : 'addNewRow',
'click .et-pb-remove-row' : 'removeRow',
'click .et-pb-change-structure' : 'changeStructure',
'click .et-pb-expand' : 'expandRow',
'contextmenu .et-pb-row-add' : 'showRightClickOptions',
'click.et_pb_row > .et-pb-controls .et-pb-unlock' : 'unlockRow',
'contextmenu.et_pb_row > .et-pb-controls' : 'showRightClickOptions',
'contextmenu.et_pb_row > .et-pb-right-click-trigger-overlay' : 'showRightClickOptions',
'contextmenu .et-pb-column' : 'showRightClickOptions',
'click.et_pb_row > .et-pb-controls' : 'hideRightClickOptions',
'click.et_pb_row > .et-pb-right-click-trigger-overlay' : 'hideRightClickOptions',
'click > .et-pb-locked-overlay' : 'showRightClickOptions',
'contextmenu > .et-pb-locked-overlay' : 'showRightClickOptions',
'click' : 'setABTesting',
},
initialize : function() {
this.listenTo( ET_PageBuilder_Events, 'et-add:columns', this.toggleInsertColumnButton );
this.listenTo( this.model, 'change:admin_label', this.renameModule );
this.listenTo( this.model, 'change:et_pb_disabled', this.toggleDisabledClass );
},
render : function() {
var parent_views = ET_PageBuilder_Layout.getParentViews( this.model.get( 'parent' ) );
if ( typeof this.model.get( 'view' ) !== 'undefined' && typeof this.model.get( 'view' ).model.get( 'layout_specialty' ) !== 'undefined' ) {
this.model.set( 'specialty_row', '1', { silent : true } );
}
this.$el.html( this.template( this.model.toJSON() ) );
if ( typeof this.model.get( 'et_pb_global_module' ) !== 'undefined' || ( typeof this.model.get( 'et_pb_template_type' ) !== 'undefined' && 'row' === this.model.get( 'et_pb_template_type' ) && 'global' === et_pb_options.is_global_template ) ) {
this.$el.addClass( 'et_pb_global' );
}
if ( typeof this.model.get( 'et_pb_disabled' ) !== 'undefined' && this.model.get( 'et_pb_disabled' ) === 'on' ) {
this.$el.addClass( 'et_pb_disabled' );
}
if ( typeof this.model.get( 'et_pb_locked' ) !== 'undefined' && this.model.get( 'et_pb_locked' ) === 'on' ) {
this.$el.addClass( 'et_pb_locked' );
_.each( parent_views, function( parent ) {
parent.$el.addClass( 'et_pb_children_locked' );
} );
}
if ( typeof this.model.get( 'et_pb_parent_locked' ) !== 'undefined' && this.model.get( 'et_pb_parent_locked' ) === 'on' ) {
this.$el.addClass( 'et_pb_parent_locked' );
}
if ( typeof this.model.get( 'et_pb_collapsed' ) !== 'undefined' && this.model.get( 'et_pb_collapsed' ) === 'on' ) {
this.$el.addClass( 'et_pb_collapsed' );
}
if ( typeof this.model.get( 'pasted_module' ) !== 'undefined' && this.model.get( 'pasted_module' ) ) {
et_pb_handle_clone_class( this.$el );
}
if ( ET_PageBuilder_Layout.is_temp_global( this.model ) ) {
this.$el.addClass( 'et_pb_global_temp' );
}
// Split Testing related class
if ( ET_PageBuilder_AB_Testing.is_active() ) {
if ( ET_PageBuilder_AB_Testing.is_subject( this.model ) ) {
this.$el.addClass( 'et_pb_ab_subject' );
// Apply subject rank coloring
ET_PageBuilder_AB_Testing.set_subject_rank_coloring( this );
}
if ( ET_PageBuilder_AB_Testing.is_goal( this.model ) ) {
this.$el.addClass( 'et_pb_ab_goal' );
}
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'row' ) ) {
this.$el.addClass( 'et_pb_ab_no_permission' );
}
}
return this;
},
showSettings : function( event ) {
var that = this,
modal_view,
view_settings = {
model : this.model,
collection : this.collection,
attributes : {
'data-open_view' : 'module_settings'
},
triggered_by_right_click : this.triggered_by_right_click,
do_preview : this.do_preview
};
if ( typeof event !== 'undefined' ) {
event.preventDefault();
}
if ( this.isRowLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'row' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
modal_view = new ET_PageBuilder.ModalView( view_settings );
et_modal_view_rendered = modal_view.render();
if ( false === et_modal_view_rendered ) {
et_builder_load_backbone_templates( true );
setTimeout( function() {
that.showSettings();
}, 500 );
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
return;
}
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
$('body').append( et_modal_view_rendered.el );
if ( ( typeof modal_view.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== modal_view.model.get( 'et_pb_global_module' ) ) || ( ET_PageBuilder_Layout.getView( modal_view.model.get('cid') ).$el.closest( '.et_pb_global' ).length ) || ( typeof this.model.get( 'et_pb_template_type' ) !== 'undefined' && 'row' === this.model.get( 'et_pb_template_type' ) && 'global' === et_pb_options.is_global_template ) ) {
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_saved_global_modal' );
}
},
displayColumnsOptions : function( event ) {
if ( event ) {
event.preventDefault();
}
if ( this.isRowLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
var view,
this_view = this;
this.model.set( 'open_view', 'column_settings', { silent : true } );
view = new ET_PageBuilder.ModalView( {
model : this.model,
collection : this.collection,
attributes : {
'data-open_view' : 'column_settings'
},
view : this_view
} );
$('body').append( view.render().el );
this.toggleInsertColumnButton();
},
changeStructure : function( event ) {
event.preventDefault();
var view,
this_view = this;
if ( this.isRowLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'row' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
this.model.set( 'change_structure', 'true', { silent : true } );
this.model.set( 'open_view', 'column_settings', { silent : true } );
ET_PageBuilder.Events = ET_PageBuilder_Events;
view = new ET_PageBuilder.ModalView( {
model : this.model,
collection : this.collection,
attributes : {
'data-open_view' : 'column_settings'
},
view : this_view
} );
$('body').append( view.render().el );
},
expandRow : function( event ) {
event.preventDefault();
var $parent = this.$el.closest('.et_pb_row');
$parent.removeClass('et_pb_collapsed');
// Add attribute to shortcode
this.options.model.attributes.et_pb_collapsed = 'off';
// Carousel effect for split testing subject
if ( ET_PageBuilder_AB_Testing.is_active() && this.model.get( 'et_pb_ab_subject' ) === 'on' ) {
ET_PageBuilder_AB_Testing.subject_carousel( this.model.get( 'cid' ) );
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'expanded', 'row' );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
},
unlockRow : function( event ) {
event.preventDefault();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
var this_el = this,
$parent = this_el.$el.closest('.et_pb_row'),
request = et_pb_user_lock_permissions(),
children_views,
parent_views;
request.done( function ( response ) {
if ( true === response ) {
$parent.removeClass('et_pb_locked');
// Add attribute to shortcode
this_el.options.model.attributes.et_pb_locked = 'off';
children_views = ET_PageBuilder_Layout.getChildrenViews( this_el.model.get('cid') );
_.each( children_views, function( view, key ) {
view.$el.removeClass('et_pb_parent_locked');
view.model.set( 'et_pb_parent_locked', 'off', { silent : true } );
} );
parent_views = ET_PageBuilder_Layout.getParentViews( this_el.model.get('parent') );
_.each( parent_views, function( view, key ) {
if ( ! ET_PageBuilder_Layout.isChildrenLocked( view.model.get( 'cid' ) ) ) {
view.$el.removeClass('et_pb_children_locked');
}
} );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'unlocked', 'row' );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
} else {
alert( et_pb_options.locked_row_permission_alert );
}
});
},
toggleInsertColumnButton : function() {
// Manually added row inner (ie empty specialty section's specialty column) has no model
if (typeof this.model === 'undefined') {
return;
}
var model_id = this.model.get( 'cid' ),
columnsInRow;
// check if the current row has at least one column
columnsInRow = this.collection.find( function( model ) {
return ( model.get( 'type' ) === 'column' || model.get( 'type' ) === 'column_inner' ) && model.get( 'parent' ) === model_id;
} );
if ( ! _.isUndefined( columnsInRow ) ) {
this.$( '.et-pb-insert-column' ).hide();
// show "change columns structure" icon, if current row's column layout is set
this.$( '.et-pb-change-structure' ).show();
}
},
addNewRow : function( event ) {
var $parent_section = this.$el.closest( '.et-pb-section-content' ),
$current_target = $( event.currentTarget ),
parent_view_cid = $current_target.closest( '.et-pb-column-specialty' ).length ? $current_target.closest( '.et-pb-column-specialty' ).data( 'cid' ) : $parent_section.data( 'cid' ),
parent_view = ET_PageBuilder_Layout.getView( parent_view_cid ),
global_module_cid = '';
event.preventDefault();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
et_pb_close_all_right_click_options();
if ( 'on' === this.model.get( 'et_pb_parent_locked' ) ) {
return;
}
if ( this.$el.closest( '.et_pb_section.et_pb_global' ).length && typeof parent_view.model.get( 'et_pb_template_type' ) === 'undefined' ) {
global_module_cid = et_pb_get_global_parent_cid( this );
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'add_row' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', 'row' );
parent_view.addRow( this.$el );
if ( '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
},
cloneRow : function( event ) {
var global_module_cid = '',
parent_view = ET_PageBuilder_Layout.getView( this.model.get( 'parent' ) ),
clone_row,
view_settings = {
model : this.model,
view : this.$el,
view_event : event
};
event.preventDefault();
if ( this.isRowLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ) ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
// Row with goal (unless the row is subject) cannot be cloned
if ( ET_PageBuilder_AB_Testing.has_goal( this.model ) && ! ET_PageBuilder_AB_Testing.is_subject( this.model ) ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_clone_row_has_goal' );
return;
}
}
if ( this.$el.closest( '.et_pb_section.et_pb_global' ).length && typeof parent_view.model.get( 'et_pb_template_type' ) === 'undefined' ) {
global_module_cid = et_pb_get_global_parent_cid( this );
}
clone_row = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'cloned', 'row' );
clone_row.copy( event );
clone_row.pasteAfter( event );
if ( '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
},
removeRow : function( event, force ) {
var columns,
global_module_cid = '',
parent_view = ET_PageBuilder_Layout.getView( this.model.get( 'parent' ) );
if ( this.isRowLocked() || ET_PageBuilder_Layout.isChildrenLocked( this.model.get( 'cid' ) ) ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() && _.isUndefined( force ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ) ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_unremovable_subject( this.model ) && _.isUndefined( force ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
return;
}
if ( ET_PageBuilder_AB_Testing.has_goal( this.model ) && ! ET_PageBuilder_AB_Testing.is_subject( this.model ) && _.isUndefined( force ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_remove_row_has_goal' );
return;
}
if ( ET_PageBuilder_AB_Testing.has_unremovable_subject( this.model ) && _.isUndefined( force ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_remove_row_has_unremovable_subject' );
return;
}
}
if ( event ) {
event.preventDefault();
// don't allow to remove a specialty section, even if there is only one row in it
if ( this.$el.closest( '.et-pb-column-specialty' ).length ) {
event.stopPropagation();
}
if ( this.$el.closest( '.et_pb_section.et_pb_global' ).length && typeof parent_view.model.get( 'et_pb_template_type' ) === 'undefined' ) {
global_module_cid = et_pb_get_global_parent_cid( this );
}
}
columns = ET_PageBuilder_Layout.getChildViews( this.model.get('cid') );
_.each( columns, function( column ) {
column.removeColumn();
} );
// if there is only one row in the section, don't remove it
if ( ET_PageBuilder_Layout.get( 'forceRemove' ) || ET_PageBuilder_Layout.getNumberOf( 'row', this.model.get('parent') ) > 1 ) {
this.model.destroy();
ET_PageBuilder_Layout.removeView( this.model.get('cid') );
this.remove();
} else {
this.$( '.et-pb-insert-column' ).show();
// hide "change columns structure" icon, column layout can be re-applied using "Insert column(s)" button
this.$( '.et-pb-change-structure' ).hide();
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'removed', 'row' );
// trigger remove event if the row was removed manually ( using a button )
if ( event ) {
ET_PageBuilder_Events.trigger( 'et-module:removed' );
}
if ( '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
// Run Split Testing updater
ET_PageBuilder_AB_Testing.update();
},
isRowLocked : function() {
if ( 'on' === this.model.get( 'et_pb_locked' ) || 'on' === this.model.get( 'et_pb_parent_locked' ) ) {
return true;
}
return false;
},
showRightClickOptions : function( event ) {
event.preventDefault();
var $event_target = $( event.target ),
et_right_click_options_view,
view_settings;
// Do nothing if Module or "Insert Module" clicked
if ( $event_target.closest( '.et-pb-insert-module' ).length || $event_target.closest('.et-pb-insert-row').length || $event_target.hasClass( 'et_pb_module_block' ) || $event_target.closest( '.et_pb_module_block' ).length ) {
return;
}
et_right_click_options_view,
view_settings = {
model : this.model,
view : this.$el,
view_event : event
};
et_right_click_options_view = new ET_PageBuilder.RightClickOptionsView( view_settings );
},
hideRightClickOptions : function( event ) {
event.preventDefault();
et_pb_close_all_right_click_options();
},
renameModule : function() {
this.$( '.et-pb-row-title' ).html( this.model.get( 'admin_label' ) );
},
toggleDisabledClass : function() {
if ( typeof this.model.get( 'et_pb_disabled' ) !== 'undefined' && 'on' === this.model.get( 'et_pb_disabled' ) ) {
this.$el.addClass( 'et_pb_disabled' );
} else {
this.$el.removeClass( 'et_pb_disabled' );
}
},
setABTesting : function ( event ) {
event.preventDefault();
event.stopPropagation();
ET_PageBuilder_AB_Testing.set( this, event );
}
} );
ET_PageBuilder.ModalView = window.wp.Backbone.View.extend( {
className : 'et_pb_modal_settings_container',
template : _.template( $('#et-builder-modal-template').html() ),
events : {
'click .et-pb-modal-save' : 'saveSettings',
'click .et-pb-modal-preview-template' : 'preview',
'click .et-pb-preview-mobile' : 'resizePreviewScreen',
'click .et-pb-preview-tablet' : 'resizePreviewScreen',
'click .et-pb-preview-desktop' : 'resizePreviewScreen',
'click .et-pb-modal-close' : 'closeModal',
'click .et-pb-modal-save-template' : 'saveTemplate',
'change #et_pb_select_category' : 'applyFilter'
},
initialize : function( attributes ) {
this.listenTo( ET_PageBuilder_Events, 'et-add:columns', this.removeView );
// listen to module settings box that is created after the user selects new module to add
this.listenTo( ET_PageBuilder_Events, 'et-new_module:show_settings', this.removeView );
this.listenTo( ET_PageBuilder_Events, 'et-saved_layout:loaded', this.removeView );
this.options = attributes;
},
render : function() {
var view,
view_settings = {
model : this.model,
collection : this.collection,
view : this.options.view
},
fake_value = false;
this.$el.attr( 'tabindex', 0 ); // set tabindex to make the div focusable
// update the row view if it has been dragged into another column
if ( typeof this.model !== 'undefined' && typeof this.model.get( 'view' ) !== 'undefined' && ( this.model.get( 'module_type' ) === 'row_inner' || this.model.get( 'module_type' ) === 'row' ) && this.model.get( 'parent' ) !== this.model.get( 'view' ).$el.data( 'cid' ) ) {
this.model.set( 'view', ET_PageBuilder_Layout.getView( this.model.get( 'parent' ) ), { silent : true } );
}
if ( this.attributes['data-open_view'] === 'all_modules' && this.model.get( 'module_type' ) === 'section' && this.model.get( 'et_pb_fullwidth' ) === 'on' ) {
this.model.set( 'type', 'column', { silent : true } );
fake_value = true;
}
if ( typeof this.model !== 'undefined' ) {
var this_parent_view = ET_PageBuilder_Layout.getView( this.model.get( 'parent' ) );
if ( this.attributes['data-open_view'] === 'column_specialty_settings' ) {
this.model.set( 'open_view', 'column_specialty_settings', { silent : true } );
}
this.$el.html( this.template( this.model.toJSON() ) );
if ( this.attributes['data-open_view'] === 'column_specialty_settings' ) {
this.model.unset( 'open_view', 'column_specialty_settings', { silent : true } );
}
}
else
this.$el.html( this.template() );
if ( fake_value )
this.model.set( 'type', 'section', { silent : true } );
this.container = this.$('.et-pb-modal-container');
if ( this.attributes['data-open_view'] === 'column_settings' ) {
view = new ET_PageBuilder.ColumnSettingsView( view_settings );
} else if ( this.attributes['data-open_view'] === 'all_modules' ) {
view_settings['attributes'] = {
'data-parent_cid' : this.model.get( 'cid' )
}
view = new ET_PageBuilder.ModulesView( view_settings );
} else if ( this.attributes['data-open_view'] === 'module_settings' ) {
var this_module_type = this.model.get( 'module_type' );
// check the Row parent and if it's inside the column then change the type Row to Row Inner.
if ( 'row' === this_module_type && ! _.isUndefined( this_parent_view ) && 'column' === this_parent_view.model.get('type') ) {
this_module_type = 'row_inner';
}
view_settings['attributes'] = {
'data-module_type' : this_module_type
}
view_settings['view'] = this;
view = new ET_PageBuilder.ModuleSettingsView( view_settings );
} else if ( this.attributes['data-open_view'] === 'save_layout' ) {
view = new ET_PageBuilder.SaveLayoutSettingsView( view_settings );
} else if ( this.attributes['data-open_view'] === 'column_specialty_settings' ) {
view = new ET_PageBuilder.ColumnSettingsView( view_settings );
} else if ( this.attributes['data-open_view'] === 'saved_templates' ) {
view = new ET_PageBuilder.TemplatesModal( { attributes: { 'data-parent_cid' : this.attributes['data-parent_cid'] } } );
} else if ( this.attributes['data-open_view'] === 'help' ) {
view = new ET_PageBuilder.HelpView();
}
// do not proceed and return false if no template for this module exist yet
if ( typeof view.attributes !== 'undefined' && 'no_template' === view.attributes['data-no_template'] ) {
return false;
}
this.container.append( view.render().el );
if ( this.attributes['data-open_view'] === 'column_settings' ) {
// if column settings layout was generated, remove open_view attribute from a row
// the row module modal window shouldn't have this attribute attached
this.model.unset( 'open_view', { silent : true } );
}
// show only modules that the current element can contain
if ( this.attributes['data-open_view'] === 'all_modules' ) {
if ( this.model.get( 'module_type' ) === 'section' && typeof( this.model.get( 'et_pb_fullwidth' ) !== 'undefined' ) && this.model.get( 'et_pb_fullwidth' ) === 'on' ) {
$( view.render().el ).find( '.et-pb-all-modules li:not(.et_pb_fullwidth_only_module)' ).remove();
} else {
$( view.render().el ).find( 'li.et_pb_fullwidth_only_module' ).remove();
}
}
if ( $( '.et_pb_modal_overlay' ).length ) {
$( '.et_pb_modal_overlay' ).remove();
$( 'body' ).removeClass( 'et_pb_stop_scroll' );
}
if ( $( 'body' ).hasClass( 'et_pb_modal_fade_in' ) ) {
$( 'body' ).append( '<div class="et_pb_modal_overlay et_pb_no_animation"></div>' );
} else {
$( 'body' ).append( '<div class="et_pb_modal_overlay"></div>' );
}
$( 'body' ).addClass( 'et_pb_stop_scroll' );
return this;
},
closeModal : function( event ) {
event.preventDefault();
if ( $( '.et_modal_on_top' ).length ) {
$( '.et_modal_on_top' ).remove();
} else {
if ( typeof this.model !== 'undefined' && this.model.get( 'type' ) === 'module' && this.$( '#et_pb_content_new' ).length )
et_pb_tinymce_remove_control( 'et_pb_content_new' );
et_pb_hide_active_color_picker( this );
et_pb_close_modal_view( this, 'trigger_event' );
}
},
removeView : function() {
if ( typeof this.model === 'undefined' || ( this.model.get( 'type' ) === 'row' || this.model.get( 'type' ) === 'column' || this.model.get( 'type' ) === 'row_inner' || this.model.get( 'type' ) === 'column_inner' || ( this.model.get( 'type' ) === 'section' && ( this.model.get( 'et_pb_fullwidth' ) === 'on' || this.model.get( 'et_pb_specialty' ) === 'on' ) ) ) ) {
if ( typeof this.model !== 'undefined' && typeof this.model.get( 'type' ) !== 'undefined' && ( this.model.get( 'type' ) === 'column' || this.model.get( 'type' ) === 'column_inner' || ( this.model.get( 'type' ) === 'section' && this.model.get( 'et_pb_fullwidth' ) === 'on' ) ) ) {
var that = this,
$opened_tab = $( that.el ).find( '.et-pb-main-settings.active-container' );
// if we're adding module from library, then close everything. Otherwise leave overlay in place and add specific classes
if ( $opened_tab.hasClass( 'et-pb-saved-modules-tab' ) ) {
et_pb_close_modal_view( that );
} else {
that.remove();
$( 'body' ).addClass( 'et_pb_modal_fade_in' );
$( '.et_pb_modal_overlay' ).addClass( 'et_pb_no_animation' );
setTimeout( function() {
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_no_animation' );
$( 'body' ).removeClass( 'et_pb_modal_fade_in' );
}, 500);
}
} else {
et_pb_close_modal_view( this );
}
} else {
this.removeOverlay();
}
},
saveSettings : function( event, close_modal ) {
var that = this,
global_module_cid = '',
this_view = ET_PageBuilder_Layout.getView( that.model.get( 'cid' ) ),
this_parent_view = ! _.isUndefined( that.model.get( 'parent' ) ) ? ET_PageBuilder_Layout.getView( that.model.get( 'parent' ) ) : '',
global_holder_view = this_view,
update_template_only = false,
close_modal = _.isUndefined( close_modal ) ? true : close_modal,
is_disabled = 'not-allowed' === $( event.target ).css( 'cursor' );
// get the global module ID if exists.
if ( ! _.isUndefined( global_holder_view.model.get( 'et_pb_global_module' ) ) ) {
// if the module is global
global_module_cid = global_holder_view.model.get( 'cid' );
} else {
// check all parents to find the global parent if exists
while ( ! _.isUndefined( global_holder_view.model.get( 'parent' ) ) && '' === global_module_cid ) {
// Refresh global holder for new loop
global_holder_view = ET_PageBuilder_Layout.getView( global_holder_view.model.get( 'parent' ) );
global_module_cid = '' === global_module_cid && ! _.isUndefined( global_holder_view.model.get( 'et_pb_global_module' ) ) ? global_holder_view.model.get( 'cid' ) : global_module_cid;
}
}
event.preventDefault();
if ( is_disabled ) {
return;
}
// Disabling state and mark it. It takes a while for generating shortcode,
// so ensure that user doesn't update the page before shortcode generation has completed
$('#publish').addClass( 'disabled' );
ET_PageBuilder_App.disable_publish = true;
if ( ( typeof global_holder_view.model.get( 'global_parent_cid' ) !== 'undefined' && '' !== global_holder_view.model.get( 'global_parent_cid' ) ) || ( typeof global_holder_view.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== global_holder_view.model.get( 'et_pb_global_module' ) ) ) {
global_module_cid = typeof global_holder_view.model.get( 'global_parent_cid' ) !== 'undefined' ? global_holder_view.model.get( 'global_parent_cid' ) : global_holder_view.model.get( 'cid' );
}
that.performSaving();
if ( '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'edited', that.model.get( 'type' ), that.model.get( 'admin_label' ) );
// In some contexts, closing modal view isn't needed & only settings saving needed
if ( ! close_modal ) {
return;
}
et_pb_tinymce_remove_control( 'et_pb_content_new' );
et_pb_hide_active_color_picker( that );
et_pb_close_modal_view( that, 'trigger_event' );
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Update subject rank coloring and subject ID
ET_PageBuilder_AB_Testing.set_subject_rank_coloring( this_view );
}
},
preview : function( event ) {
var cid = this.model.get( 'cid' ) ,
shortcode,
$button = $( event.target ).is( 'a' ) ? $( event.target ) : $( event.target ).parent( 'a' ),
$container = $( event.target ).parents( '.et-pb-modal-container' ),
request_data,
section_view,
msie = document.documentMode;
event.preventDefault();
// Save modified settings, if it is necesarry. Direct preview from right click doesn't need to be saved
if ( _.isUndefined( this.options.triggered_by_right_click ) ) {
this.saveSettings( event, false );
} else {
// Triggered by right click is one time thing. Remove it as soon as it has been used
delete this.options.triggered_by_right_click;
}
if ( ! _.isUndefined( this.options.do_preview ) ) {
// Do preview is one time thing. Remove it as soon as it has been used
delete this.options.do_preview;
}
if ( et_pb_options.is_divi_library === "1" && $.inArray( et_pb_options.layout_type, [ "row", "module" ] ) > -1 ) {
// Divi Library's layout editor auto generates section and row in module and row layout type
// The auto generates item cause cause an issue during shortcode generation
// Removing its cid will force ET_PageBuilder_App.generateCompleteShortcode to generate the whole page's layout shortcode which solves the preview issue
cid = undefined;
} else if ( this.model.get( 'type' ) !== 'section' ) {
// Module's layout depends on the column it belongs. Hence, always preview the item in context of section
section_view = ET_PageBuilder_Layout.getSectionView( this.model.get( 'parent' ) );
if ( ! _.isUndefined( section_view ) ) {
cid = section_view.model.attributes.cid;
}
}
// Get shortcode based on section's cid
shortcode = ET_PageBuilder_App.generateCompleteShortcode( cid );
request_data = {
et_pb_preview_nonce : et_pb_options.et_pb_preview_nonce,
shortcode : shortcode,
post_title : $('#title').val()
};
// Toggle button state
$button.toggleClass( 'active' );
// Toggle container state
$container.toggleClass( 'et-pb-item-previewing' );
if ( $button.hasClass( 'active' ) ) {
// Create the iFrame on the fly. This will speed up modalView init
var $iframe = $('<iframe />', {
id : 'et-pb-preview-screen',
src : et_pb_options.preview_url + '&et_pb_preview_nonce=' + et_pb_options.et_pb_preview_nonce
} ),
has_render_page = false;
// Add the iframe into preview tab
$('.et-pb-preview-tab' ).html( $iframe );
// Pass the item's setup to the screen
$('#et-pb-preview-screen').load( function(){
if ( has_render_page ) {
return;
}
// Get iFrame
preview = document.getElementById( 'et-pb-preview-screen' );
// IE9 below fix. They have postMessage, but it has to be in string
if ( ! _.isUndefined( msie ) && msie < 10 ) {
request_data = JSON.stringify( request_data );
}
// Pass shortcode structure to iFrame to be displayed
preview.contentWindow.postMessage( request_data, et_pb_options.preview_url );
has_render_page = true;
});
} else {
$( '.et-pb-preview-tab' ).empty();
// Reset active state
$('.et-pb-preview-screensize-switcher a').removeClass( 'active' );
// Set desktop as active
$('.et-pb-preview-desktop').addClass( 'active' );
}
},
resizePreviewScreen : function( event ) {
event.preventDefault();
var $link = $( event.target ),
width = _.isUndefined( $link.data( 'width' ) ) ? '100%' : $link.data( 'width' );
// Reset active state
$('.et-pb-preview-screensize-switcher a').removeClass( 'active' );
// Set current as active
$link.addClass( 'active' );
// Set iFrame width
$('#et-pb-preview-screen').animate({
'width' : width
});
},
getAttr: function( object, name ) {
return _.isUndefined( object[ name ] ) ? '' : object[ name ];
},
performSaving : function( option_tabs_selector ) {
var thisClass = this;
var attributes = {};
var unsetAttrs = [];
var defaults = {};
var options_selector = typeof option_tabs_selector !== 'undefined' && '' !== option_tabs_selector ? option_tabs_selector : 'input, select, textarea, #et_pb_content_main';
var shortcode_name = thisClass.model.get( 'module_type' );
var $et_form_validation;
shortcode_name = shortcode_name.indexOf( 'et_pb_' ) === -1 ? ( 'et_pb_' + shortcode_name ) : shortcode_name;
$et_form_validation = $(this)[0].$el.find('form.validate');
if ( $et_form_validation.length ) {
validator = $et_form_validation.validate();
if ( !validator.form() ) {
et_builder_debug_message('failed form validation');
et_builder_debug_message('failed elements: ');
et_builder_debug_message( validator.errorList );
validator.focusInvalid();
return;
}
et_builder_debug_message('passed form validation');
}
var global_module_id = 'global' === et_pb_options.is_global_template ? et_pb_options.template_post_id : this.model.get( 'et_pb_global_module' );
// update the unsynced options for the module
if ( $( '.et_pb_global_sync_switcher' ).length > 0 && typeof global_module_id !== 'undefined' && '' !== global_module_id ) {
var unsynced_options_array = [];
if ( $( '.et_pb_global_unsynced' ).length > 0 ) {
$( '.et_pb_global_unsynced' ).each( function() {
var $this_el = $( this );
var this_option_name = $this_el.data( 'option_name' );
// transform 'content_new' and 'raw_content' to 'et_pb_content_field'
this_option_name = _.includes( ['content_new', 'raw_content'], this_option_name ) ? 'et_pb_content_field' : this_option_name;
unsynced_options_array.push( this_option_name );
// unsync mobile options if exist
if ( ! _.isUndefined( $this_el.data( 'additional_options' ) ) && 'mobile' === $this_el.data( 'additional_options' ) ) {
unsynced_options_array.push( this_option_name + '_tablet' );
unsynced_options_array.push( this_option_name + '_phone' );
}
});
}
// Automatically sync/unsync gallery_ids and gallery_orderby on gallery module if src is synced/unsynced
if ( 'et_pb_gallery' === shortcode_name ) {
if ( _.contains( unsynced_options_array, 'src' ) ) {
unsynced_options_array = _.union( unsynced_options_array, [ 'gallery_ids', 'gallery_orderby' ] );
} else {
unsynced_options_array = _.without( unsynced_options_array, 'gallery_ids', 'gallery_orderby' );
}
}
et_pb_all_unsynced_options[ global_module_id ] = unsynced_options_array;
// update the value in hidden option so unsynced options will be saved on post Update.
if ( 'global' === et_pb_options.is_global_template && $( '#et_pb_unsynced_global_attrs' ).length !== 0 ) {
$( '#et_pb_unsynced_global_attrs' ).val( JSON.stringify( unsynced_options_array ) );
}
}
ET_PageBuilder.Events.trigger( 'et-modal-settings:save', this );
var migrations = _.isUndefined( et_pb_options.et_pb_module_settings_migrations ) ? false : et_pb_options.et_pb_module_settings_migrations;
var name_changes = _.isUndefined( migrations.name_changes ) ? false : migrations.name_changes;
// Delete migrated attributes to avoid unwanted value re-assignment
// Their values were migrated to new attributes at this point
if ( name_changes && ! _.isUndefined( name_changes[shortcode_name] ) ) {
_.forEach( name_changes[shortcode_name], function( new_name, old_name ) {
unsetAttrs.push( 'et_pb_' + old_name );
});
}
this.$( options_selector ).each( function() {
var $this_el = $(this);
var default_value = et_pb_get_default_setting_value($this_el) || '';
var name = $this_el.is('#et_pb_content_main') ? 'et_pb_content_new' : $this_el.attr('id');
var isEqualToDefault = function (v1, v2) {
return $this_el.hasClass('et-pb-range-input')
? _.isEqual(parseFloat(v1), parseFloat(v2))
: _.isEqual(v1, v2);
};
// name attribute is used in normal html checkboxes, use it instead of ID
if ( $this_el.is( ':checkbox' ) ) {
name = $this_el.attr('name');
}
if ( typeof name === 'undefined' || ( -1 !== name.indexOf( 'qt_' ) && 'button' === $this_el.attr( 'type' ) ) ) {
// settings should have an ID and shouldn't be a Quick Tag button from the tinyMCE in order to be saved
return true;
}
if ( $this_el.hasClass( 'et-pb-helper-field' ) ) {
// don't process helper fields
return true;
}
// All checkbox values are saved at once on the next step, so if the attribute name
// already exists, do nothing
if ( $this_el.is( ':checkbox' ) && typeof attributes[name] !== 'undefined' ) {
return true;
}
// Validate colorpicker - if invalid color given, return to default color
if ( $this_el.hasClass( 'et-pb-color-picker-hex' ) && new Color( $this_el.val() ).error && ! $this_el.hasClass( 'et-pb-is-cleared' ) ) {
$this_el.val( $this_el.data( 'selected-value') );
}
// convert default value to string to make sure current and default values have the same type
default_value = default_value + '';
// if default value is set, add it to the defaults object
if ( default_value !== '' ) {
defaults[ name ] = default_value;
}
// save the attribute value
var setting_value = ET_PageBuilder.Helpers.getSettingValue($this_el);
if ( ! isEqualToDefault(setting_value, default_value) ) {
attributes[name] = setting_value;
} else {
unsetAttrs.push(name);
}
} );
// add defaults object
attributes['module_defaults'] = defaults;
// remove padding_mobile based on last_edited value to remove dependency to padding_mobile and rely on responsive padding
var module_attributes = this.model.attributes,
module_previous_attributes = this.model._previousAttributes,
module_type = module_attributes.type,
custom_padding_last_edited = _.isUndefined(attributes.et_pb_custom_padding_last_edited) ? [] : attributes.et_pb_custom_padding_last_edited.split('|'),
responsive_padding_active = typeof custom_padding_last_edited === 'object' && custom_padding_last_edited[0] === 'on',
is_custom_padding_updated = thisClass.getAttr( attributes, 'et_pb_custom_padding' ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_custom_padding' ),
is_custom_padding_tablet_updated = responsive_padding_active && thisClass.getAttr( attributes, 'et_pb_custom_padding_tablet' ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_custom_padding_tablet' ),
is_custom_padding_phone_updated = responsive_padding_active && thisClass.getAttr( attributes, 'et_pb_custom_padding_phone' ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_custom_padding_phone' ),
is_custom_padding_field_updated = is_custom_padding_updated || is_custom_padding_tablet_updated || is_custom_padding_phone_updated;
// remove padding_mobile on section if responsive padding is active
if ( module_type === 'section' && ( responsive_padding_active || is_custom_padding_field_updated ) ) {
attributes.et_pb_padding_mobile = '';
}
if ( module_type === 'row' || module_type === 'row_inner' ) {
// remove padding_mobile on row if responsive padding is active
if ( ( responsive_padding_active || is_custom_padding_field_updated ) ) {
attributes.et_pb_padding_mobile = '';
}
// remove column_padding
var column_count = typeof module_attributes.columns_layout === 'undefined' ? 0 : module_attributes.columns_layout.split(',').length;
for (var column_index = 1; column_index <= column_count; column_index++) {
var column_padding_last_edited_value = attributes['et_pb_padding_' + column_index + '_last_edited'],
column_padding_last_edited = typeof column_padding_last_edited_value === 'undefined' ? [] : column_padding_last_edited_value.split('|'),
column_responsive_padding_active = typeof column_padding_last_edited === 'object' && column_padding_last_edited[0] === 'on',
is_column_padding_top_updated = thisClass.getAttr( attributes, 'et_pb_padding_top_' + column_index ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_padding_top_' + column_index ),
is_column_padding_right_updated = thisClass.getAttr( attributes, 'et_pb_padding_right_' + column_index ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_padding_right_' + column_index ),
is_column_padding_bottom_updated = thisClass.getAttr( attributes, 'et_pb_padding_bottom_' + column_index ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_padding_bottom_' + column_index ),
is_column_padding_left_updated = thisClass.getAttr( attributes, 'et_pb_padding_left_' + column_index ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_padding_left_' + column_index ),
is_column_padding_updated = is_column_padding_top_updated || is_column_padding_right_updated || is_column_padding_bottom_updated || is_column_padding_left_updated,
is_column_padding_tablet_updated = column_responsive_padding_active && thisClass.getAttr( attributes, 'et_pb_padding_' + column_index + '_tablet' ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_padding_' + column_index + '_tablet' ),
is_column_padding_phone_updated = column_responsive_padding_active && thisClass.getAttr( attributes, 'et_pb_padding_' + column_index + '_phone' ) !== thisClass.getAttr( module_previous_attributes, 'et_pb_padding_' + column_index + '_phone'),
is_column_padding_field_updated = is_column_padding_updated || is_column_padding_tablet_updated || is_column_padding_phone_updated;
if ( column_responsive_padding_active || is_column_padding_field_updated ) {
attributes.et_pb_column_padding_mobile = '';
break;
}
}
}
// set model attributes
this.model.set( attributes );
unsetAttrs.map(this.model.unset.bind(this.model));
},
saveTemplate : function( event ) {
var module_width = -1 !== this.model.get( 'module_type' ).indexOf( 'fullwidth' ) ? 'fullwidth' : 'regular',
columns_layout = typeof this.model.get( 'columns_layout' ) !== 'undefined' ? this.model.get( 'columns_layout' ) : '0',
is_disabled = 'not-allowed' === $( event.target ).css( 'cursor' );
event.preventDefault();
if ( is_disabled ) {
return;
}
et_pb_create_prompt_modal( 'save_template', this, module_width, columns_layout );
},
removeOverlay : function() {
var $overlay = $( '.et_pb_modal_overlay' );
if ( $overlay.length ) {
$overlay.addClass( 'et_pb_overlay_closing' );
setTimeout( function() {
$overlay.remove();
$( 'body' ).removeClass( 'et_pb_stop_scroll' );
}, 600 );
}
// Check for existence of disable_publish element, don't do auto enable publish
// if not necesarry. Example: opening Modal View, then close it without further action
if ( ! _.isUndefined( ET_PageBuilder_App.disable_publish ) ) {
var auto_enable_publishing = setTimeout( function() {
// Check for disable_publish state, auto enable after three seconds
// This means no et_pb_set_content triggered
if ( ! _.isUndefined( ET_PageBuilder_App.disable_publish ) ) {
$('#publish').removeClass( 'disabled' );
delete ET_PageBuilder_App.disable_publish;
}
}, 3000 );
}
},
applyFilter : function(event) {
var $event_target = $(event.target),
all_data = $event_target.data( 'attr' ),
selected_category = $event_target.val();
all_data.append_to.html( '' );
generate_templates_view( all_data.include_global, '', all_data.layout_type, all_data.append_to, all_data.module_width, all_data.specialty_cols, selected_category );
}
} );
ET_PageBuilder.ColumnView = window.wp.Backbone.View.extend( {
template : _.template( $('#et-builder-column-template').html() ),
templateAddRow : _.template( $('#et-builder-specialty-column-template').html() ),
events : {
'click .et-pb-insert-module' : 'addModule',
'click .et-pb-insert-row' : 'addModule',
'contextmenu > .et-pb-insert-module' : 'showRightClickOptions',
'click' : 'hideRightClickOptions'
},
initialize : function() {
this.$el.attr( 'data-cid', this.model.get( 'cid' ) );
},
render : function() {
var this_el = this,
is_fullwidth_section = this.model.get( 'module_type' ) === 'section' && this.model.get( 'et_pb_fullwidth' ) === 'on',
connect_with = ( ! is_fullwidth_section ? ".et-pb-column:not(.et-pb-column-specialty, .et_pb_parent_locked)" : ".et_pb_fullwidth_sortable_area" );
this.$el.html( this.template( this.model.toJSON() ) );
// Specialty section's column button displays add row instead of add module
if (typeof this.model.attributes.specialty_columns !== 'undefined' ) {
this.$el.html( this.templateAddRow( this.model.toJSON() ) );
}
if ( is_fullwidth_section )
this.$el.addClass( 'et_pb_fullwidth_sortable_area' );
if ( this.model.get( 'layout_specialty' ) === '1' ) {
connect_with = '.et-pb-column-specialty:not(.et_pb_parent_locked)';
}
if ( this.model.get( 'created' ) === 'manually' && ! _.isUndefined( this.model.get( 'et_pb_specialty_columns' ) ) ) {
this.$el.addClass( 'et-pb-column-specialty' );
}
if ( this.isColumnParentLocked( this.model.get( 'parent' ) ) ) {
this.$el.addClass( 'et_pb_parent_locked' );
this.model.set( 'et_pb_parent_locked', 'on', { silent : true } );
}
// Split Testing adjustment
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Disable sortable of Split testing item for user with no ab_testing permission
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'column' ) ) {
return this;
}
}
this.$el.sortable( {
cancel : '.et-pb-settings, .et-pb-clone, .et-pb-remove, .et-pb-insert-module, .et-pb-insert-column, .et-pb-insert-row, .et_pb_locked, .et-pb-disable-sort',
connectWith: connect_with,
delay: 100,
items : ( this.model.get( 'layout_specialty' ) !== '1' ? '.et_pb_module_block' : '.et_pb_row' ),
receive: function(event, ui) {
var $this = $(this),
columns_number,
cancel_action = false;
if ( $this.hasClass( 'et-pb-column-specialty' ) ) {
// revert if the last row is being dragged out of the specialty section
// or the module block is placed directly into the section
// or 3-column row is placed into the row that can't handle it
if ( ! $( ui.sender ).find( '.et_pb_row' ).length || $( ui.item ).is( '.et_pb_module_block' ) ) {
alert( et_pb_options.section_only_row_dragged_away );
cancel_action = true;
} else {
columns_number = $(ui.item).find( '.et-pb-row-container > .et-pb-column' ).length;
if ( columns_number === 3 && parseInt( ET_PageBuilder_Layout.getView( $this.data( 'cid' ) ).model.get( 'specialty_columns' ) ) !== 3 ) {
alert( et_pb_options.stop_dropping_3_col_row );
cancel_action = true;
}
}
}
// do not allow to drag modules into sections and rows where sorting is disabled
if ( $( ui.item ).closest( '.et-pb-disable-sort').length ) {
cancel_action = true;
}
if ( ( $( ui.item ).closest( '.et_pb_section.et_pb_global' ).length || $( ui.item ).closest( '.et_pb_row.et_pb_global' ).length ) && $( ui.item ).hasClass( 'et_pb_global' ) ) {
alert( et_pb_options.global_module_alert );
cancel_action = true;
}
if ( cancel_action ) {
$(ui.sender).sortable('cancel');
et_reinitialize_builder_layout();
}
// Remove insert row button if a row is pasted into specialty's column
if ($this.is('.et-pb-column-specialty') && $this.find('.et_pb_row').length <= 1 && $this.find('.et-pb-insert-row').length) {
$this.find('.et-pb-insert-row').remove();
}
},
update : function( event, ui ) {
// Loading process occurs. Dragging is temporarily disabled
if ( ET_PageBuilder_App.isLoading ) {
this_el.$el.sortable( 'cancel' );
return;
}
// Split Testing adjustment :: module as subject / goal
if ( ET_PageBuilder_AB_Testing.is_active() ) {
var is_row_inner = $( ui.item ).hasClass( 'et_pb_row' ),
cid = is_row_inner ? $( ui.item ).children( '.et-pb-row-content' ).attr( 'data-cid' ) : $( ui.item ).attr( 'data-cid' );
// Check for permission user first
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( cid ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
this_el.$el.sortable('cancel');
et_reinitialize_builder_layout();
return;
} else {
// User has proper permission. Verify whether the action is permissible or not
// IMPORTANT: update event is fired twice, once when the module is moved from its origin and once when the
// module is landed on its destination. This causes two different way in deciding $sender and $target
var $item = $( ui.item ),
$sender = _.isEmpty( $( ui.sender ) ) ? $( event.target ) : $( ui.sender ),
$target = _.isEmpty( $( ui.sender ) ) ? $( event.toElement ).parent() : $( event.target ),
is_subject = $item.hasClass('et_pb_ab_subject'),
is_goal = $item.hasClass('et_pb_ab_goal'),
is_sender_inside_subject = $sender.closest('.et_pb_ab_subject').length,
is_target_inside_subject = $target.closest('.et_pb_ab_subject').length,
is_target_inside_goal = $target.closest('.et_pb_ab_goal').length;
// Goal inside subject cannot be moved outside subject
if ( is_goal && ! is_subject && is_sender_inside_subject ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_module_goal_out_from_subject' );
$( this_el.$el ).sortable('cancel');
et_reinitialize_builder_layout();
return;
}
// Goal outside subject cannot be moved inside subject
if ( is_goal && ! is_subject && ! is_sender_inside_subject && is_target_inside_subject ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_goal_into_subject' );
$( this_el.$el ).sortable('cancel');
et_reinitialize_builder_layout();
return;
}
// Subject cannot be moved into goal (assuming goal is row or section)
if ( is_subject && ! is_goal && is_target_inside_goal ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_move_subject_into_goal' );
$( this_el.$el ).sortable('cancel');
et_reinitialize_builder_layout();
return;
}
}
}
var model,
$module_block,
module_cid = ui.item.data( 'cid' );
$module_block = $( ui.item );
if ( typeof module_cid === 'undefined' && $(event.target).is('.et-pb-column-specialty') ) {
$module_block = $( ui.item ).closest( '.et_pb_row' ).find( '.et-pb-row-content' );
module_cid = $module_block.data( 'cid' );
}
// if the column doesn't have modules, add the dragged module before 'Insert Module' button or append to column
if ( ! $(event.target).is('.et-pb-column-specialty') && $( ui.item ).closest( event.target ).length && $( event.target ).find( '.et_pb_module_block' ).length === 1 ) {
// if .et-pb-insert-module button exists, then add the module before that button. Otherwise append to column
if ( $( event.target ).find( '.et-pb-insert-module' ).length ) {
$module_block.insertBefore( $( event.target ).find( '.et-pb-insert-module' ) );
} else {
$( event.target ).append( $module_block );
}
}
model = this_el.collection.find( function( model ) {
return model.get('cid') == module_cid;
} );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'moved', 'module', model.get( 'admin_label' ) );
if ( model.get( 'parent' ) === this_el.model.attributes.cid && $( ui.item ).closest( event.target ).length ) {
// order of items have been changed within the same row
ET_PageBuilder_Events.trigger( 'et-model-changed-position-within-column' );
} else {
model.set( 'parent', this_el.model.attributes.cid );
}
// Prepare collection sorting based on layout position
var column_cid = parseInt( $(this).attr( 'data-cid') ),
sibling_module_index = 0;
// Loop module block based on DOM position to ensure its index order
$(this).find('.et_pb_module_block').each(function(){
sibling_module_index++;
var sibling_module_cid = parseInt( $(this).data('cid') ),
layout_index = column_cid + sibling_module_index,
sibling_model = ET_PageBuilder_Modules.findWhere({ cid : sibling_module_cid });
// Set layout_index
sibling_model.set({ layout_index : layout_index });
});
// Sort collection based on layout_index
ET_PageBuilder_Modules.comparator = 'layout_index';
ET_PageBuilder_Modules.sort();
if ( ( $( ui.item ).closest( '.et_pb_section.et_pb_global' ).length || $( ui.item ).closest( '.et_pb_row.et_pb_global' ).length || $( ui.sender ).closest( '.et_pb_row.et_pb_global' ).length || $( ui.sender ).closest( '.et_pb_section.et_pb_global' ).length ) && '' === et_pb_options.template_post_id ) {
var module_cid = ui.item.data( 'cid' ),
$from_global_row = $( ui.sender ).closest( '.et_pb_row.et_pb_global' ),
$to_global_row = $( ui.item ).closest( '.et_pb_row.et_pb_global' ),
global_module_cid,
$moving_from,
$moving_to;
$moving_from = $from_global_row.length > 0 ? $from_global_row : $( ui.sender ).closest( '.et_pb_section.et_pb_global' );
$moving_to = $to_global_row.length > 0 ? $to_global_row : $( ui.item ).closest( '.et_pb_section.et_pb_global' );
if ( $moving_from === $moving_to ) {
var global_module_cid = $from_global_row.length > 0 ? $( ui.sender ).closest( '.et-pb-row-content' ).data( 'cid' ) : $( ui.sender ).closest( '.et-pb-section-content' ).data( 'cid' );
et_pb_update_global_template( global_module_cid );
et_reinitialize_builder_layout();
} else {
var $global_element = $moving_from;
// remove global parent attributes if moved not to global parent.
if ( $moving_to.length === 0 && ( ( ! _.isUndefined( model.get( 'et_pb_global_parent' ) ) && '' !== model.get( 'et_pb_global_parent' ) ) || ! _.isUndefined( model.get( 'global_parent_cid' ) ) ) ) {
model.unset( 'et_pb_global_parent' );
model.unset( 'global_parent_cid' );
// remove global attributes from all the child components
ET_PageBuilder_Layout.removeGlobalAttributes( ET_PageBuilder_Layout.getView( model.get( 'cid' ) ) );
}
for ( var i = 1; i <= 2; i++ ) {
global_module_cid = typeof $global_element.find( '.et-pb-section-content' ).data( 'cid' ) !== 'undefined' ? $global_element.find( '.et-pb-section-content' ).data( 'cid' ) : $global_element.find( '.et-pb-row-content' ).data( 'cid' );
if ( typeof global_module_cid !== 'undefined' && '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
et_reinitialize_builder_layout();
}
$global_element = $moving_to;
}
}
}
},
start : function( event, ui ) {
et_pb_close_all_right_click_options();
// copy module if Alt key pressed
if ( event.altKey ) {
var is_row_inner = $( ui.item ).hasClass( 'et_pb_row' );
var cid = is_row_inner ? $( ui.item ).children( '.et-pb-row-content' ).attr( 'data-cid' ) : $( ui.item ).attr( 'data-cid' );
var movedModule = ET_PageBuilder_Layout.getView( cid );
var view_settings = {
model : movedModule.model,
view : movedModule.$el,
view_event : event
};
var clone_module = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
clone_module.copy( event, true );
clone_module.pasteAfter( event, undefined, undefined, undefined, true, true );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'cloned', 'module', movedModule.model.get( 'admin_label' ) );
}
}
} );
return this;
},
addModule : function( event ) {
var $event_target = $(event.target),
$add_module_button = $event_target.is( 'span' ) ? $event_target.parent('.et-pb-insert-module') : $event_target;
event.preventDefault();
event.stopPropagation();
if ( this.isColumnLocked() )
return;
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'add_module' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
if ( ! $add_module_button.parent().is( event.delegateTarget ) ) {
return;
}
et_pb_close_all_right_click_options();
if ($(event.target).is('.et-pb-insert-row')) {
this.addRow();
} else {
var view;
view = new ET_PageBuilder.ModalView( {
model : this.model,
collection : this.collection,
attributes : {
'data-open_view' : 'all_modules'
},
view : this
} );
$('body').append( view.render().el );
}
},
// Add New Row functionality for the specialty section column
addRow : function( appendAfter ) {
var module_id = ET_PageBuilder_Layout.generateNewId(),
global_parent = typeof this.model.get( 'et_pb_global_parent' ) !== 'undefined' && '' !== this.model.get( 'et_pb_global_parent' ) ? this.model.get( 'et_pb_global_parent' ) : '',
global_parent_cid = '' !== global_parent ? this.model.get( 'global_parent_cid' ) : '',
new_row_view;
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( this.isColumnLocked() ) {
return;
}
this.collection.add( [ {
type : 'row',
module_type : 'row',
cid : module_id,
parent : this.model.get( 'cid' ),
view : this,
appendAfter : appendAfter,
et_pb_global_parent : global_parent,
global_parent_cid : global_parent_cid,
admin_label : et_pb_options.noun['row']
} ] );
new_row_view = ET_PageBuilder_Layout.getView( module_id );
new_row_view.displayColumnsOptions();
},
removeColumn : function() {
var modules;
modules = ET_PageBuilder_Layout.getChildViews( this.model.get('cid') );
_.each( modules, function( module ) {
if ( module.model.get( 'type' ) === 'row' || module.model.get( 'type' ) === 'row_inner' ) {
module.removeRow();
} else {
module.removeModule();
}
} );
ET_PageBuilder_Layout.removeView( this.model.get('cid') );
this.model.destroy();
this.remove();
},
isColumnLocked : function() {
if ( 'on' === this.model.get( 'et_pb_locked' ) || 'on' === this.model.get( 'et_pb_parent_locked' ) ) {
return true;
}
return false;
},
isColumnParentLocked : function( cid ) {
var parent_view = ET_PageBuilder_Layout.getView( cid );
if ( ! _.isUndefined( parent_view ) && ( 'on' === parent_view.model.get('et_pb_locked' ) || 'on' === parent_view.model.get('et_pb_parent_locked' ) ) ) {
return true;
}
return false;
},
showRightClickOptions : function( event ) {
event.preventDefault();
var et_right_click_options_view,
view_settings = {
model : this.model,
view : this.$el,
view_event : event
};
// Fullwidth and regular section uses different type for column ( section vs column )
// Add marker so it can be identified
view_settings.model.attributes.is_insert_module = true;
et_right_click_options_view = new ET_PageBuilder.RightClickOptionsView( view_settings );
return;
},
hideRightClickOptions : function( event ) {
event.preventDefault();
et_pb_close_all_right_click_options();
}
} );
ET_PageBuilder.ColumnSettingsView = window.wp.Backbone.View.extend( {
className : 'et_pb_modal_settings',
template : _.template( $('#et-builder-column-settings-template').html() ),
events : {
'click .et-pb-column-layouts li' : 'addColumns',
'click .et-pb-options-tabs-links li a' : 'switchTab'
},
initialize : function( attributes ) {
this.listenTo( ET_PageBuilder_Events, 'et-add:columns', this.removeView );
this.listenTo( ET_PageBuilder_Events, 'et-modal-view-removed', this.removeViewAndEmptySection );
this.options = attributes;
},
render : function() {
this.$el.html( this.template( this.model.toJSON() ) );
if ( ET_PageBuilder_Layout.getView( this.model.get('cid') ).$el.closest( '.et_pb_global' ).length ) {
this.$el.addClass( 'et_pb_no_global' );
}
if ( typeof this.model.get( 'et_pb_specialty' ) !== 'undefined' && 'on' === this.model.get( 'et_pb_specialty' ) || typeof this.model.get( 'change_structure' ) !== 'undefined' && 'true' === this.model.get( 'change_structure' ) ) {
this.$el.addClass( 'et_pb_modal_no_tabs' );
}
return this;
},
addColumns : function( event ) {
event.preventDefault();
var that = this,
$layout_el = $(event.target).is( 'li' ) ? $(event.target) : $(event.target).closest( 'li' ),
layout = $layout_el.data('layout'),
layout_specialty = 'section' === that.model.get( 'type' ) && 'on' === that.model.get( 'et_pb_specialty' )
? $layout_el.data('specialty').split(',')
: '',
column_settings = {
'layout' : layout,
'layout_specialty' : layout_specialty,
'is_structure_change' : typeof that.model.get( 'change_structure' ) !== 'undefined' && 'true' === that.model.get( 'change_structure' ),
'specialty_columns' : $layout_el.data('specialty_columns')
};
ET_PageBuilder_Layout.changeColumnStructure( that, column_settings );
},
removeView : function() {
var that = this;
// remove it with some delay to make sure animation applied to modal before removal
setTimeout( function() {
that.remove();
}, 300 );
},
switchTab : function( event ) {
var $this_el = $( event.currentTarget ).parent();
event.preventDefault();
et_handle_templates_switching( $this_el, 'row', '' );
},
/**
* Remove modal view and empty specialty section, if the user hasn't selected a section layout
* and closed a modal window
*/
removeViewAndEmptySection : function() {
if ( this.model.get( 'et_pb_specialty' ) === 'on' ) {
this.options.view.model.destroy();
ET_PageBuilder_Layout.removeView( this.options.view.model.get('cid') );
this.options.view.remove();
}
this.remove();
}
} );
ET_PageBuilder.SaveLayoutSettingsView = window.wp.Backbone.View.extend( {
className : 'et_pb_modal_settings',
template : _.template( $('#et-builder-load_layout-template').html() ),
events : {
'click .et_pb_layout_button_load' : 'loadLayout',
'click .et_pb_layout_button_delete' : 'deleteLayout',
'click .et-pb-options-tabs-links li a' : 'switchTab'
},
initialize : function( attributes ) {
this.options = attributes;
this.layoutIsLoading = false;
this.listenTo( ET_PageBuilder_Events, 'et-modal-view-removed', this.remove );
},
render : function() {
var $this_el = this.$el,
post_type = $('#post_type').val();
$this_el.html( this.template( { "display_switcher" : "on" } ) );
et_load_saved_layouts( 'predefined', 'et-pb-all-modules-tab', $this_el, post_type );
et_load_saved_layouts( 'not_predefined', 'et-pb-saved-modules-tab', $this_el, post_type );
return this;
},
deleteLayout : function( event ) {
event.preventDefault();
var $layout = $( event.currentTarget ).closest( 'li' );
if ( $layout.hasClass( 'et_pb_deleting_layout' ) )
return;
else
$layout.addClass( 'et_pb_deleting_layout' );
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_delete_layout',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_layout_id : $layout.data( 'layout_id' )
},
beforeSend : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
$layout.css( 'opacity', '0.5' );
},
complete : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
},
success: function( data ){
if ( $layout.closest( 'ul' ).find( '> li' ).length == 1 )
$layout.closest( 'ul' ).prev( 'h3' ).hide();
$layout.remove();
}
} );
},
loadLayout : function( event ) {
event.preventDefault();
if ( this.layoutIsLoading ) {
return;
} else {
this.layoutIsLoading = true;
this.$el.find( '.et-pb-main-settings' ).css( { 'opacity' : '0.5' } );
}
var $layout = $( event.currentTarget ).closest( 'li' ),
replace_content = $layout.closest( '.et-pb-main-settings' ).find( '#et_pb_load_layout_replace' ).is( ':checked' ),
content = et_pb_get_content( 'content' ),
this_el = this;
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_load_layout',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_layout_id : $layout.data( 'layout_id' ),
et_replace_content : ( replace_content ? 'on' : 'off' )
},
beforeSend : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
},
complete : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
ET_PageBuilder_Events.trigger( 'et-saved_layout:loaded' );
},
success: function( data ){
content = replace_content ? data : data + content;
ET_PageBuilder_App.removeAllSections();
if ( content !== '' ) {
ET_PageBuilder_App.allowHistorySaving( 'loaded', 'layout' );
}
ET_PageBuilder_App.createNewLayout( content, 'load_layout' );
}
} );
},
switchTab: function( event ) {
var $this_el = $( event.currentTarget ).parent();
event.preventDefault();
et_handle_templates_switching( $this_el, 'layout', '' );
}
} );
ET_PageBuilder.ModulesView = window.wp.Backbone.View.extend( {
className : 'et_pb_modal_settings',
template : _.template( $('#et-builder-modules-template').html() ),
events : {
'click .et-pb-all-modules li' : 'addModule',
'click .et-pb-options-tabs-links li a' : 'switchTab'
},
initialize : function( attributes ) {
this.options = attributes;
this.listenTo( ET_PageBuilder_Events, 'et-modal-view-removed', this.remove );
},
render : function() {
var template_type_holder = typeof ET_PageBuilder_Layout.getView( this.model.get('parent') ) !== 'undefined' ? ET_PageBuilder_Layout.getView( this.model.get('parent') ) : this;
this.$el.html( this.template( ET_PageBuilder_Layout.toJSON() ) );
if ( ET_PageBuilder_Layout.getView( this.model.get('cid') ).$el.closest( '.et_pb_global' ).length || typeof template_type_holder.model.get('et_pb_template_type') !== 'undefined' && 'module' === template_type_holder.model.get('et_pb_template_type') ) {
this.$el.addClass( 'et_pb_no_global' );
}
return this;
},
addModule : function( event ) {
var $this_el = $( event.currentTarget ),
label = $this_el.find( '.et_module_title' ).text(),
type = $this_el.attr( 'class' ).replace( ' et_pb_fullwidth_only_module', '' ),
global_module_cid = '',
parent_view = ET_PageBuilder_Layout.getView( this.model.get('parent') ),
template_type_holder = typeof parent_view !== 'undefined' ? parent_view : this
event.preventDefault();
if ( typeof this.model.get( 'et_pb_global_parent' ) !== 'undefined' && typeof this.model.get( 'et_pb_global_parent' ) !== '' ) {
global_module_cid = this.model.get( 'global_parent_cid' );
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', 'module', label );
this.collection.add( [ {
type : 'module',
cid : ET_PageBuilder_Layout.generateNewId(),
module_type : type,
admin_label : label,
parent : this.attributes['data-parent_cid'],
view : this.options.view,
global_parent_cid : global_module_cid
} ] );
this.remove();
if ( '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
if ( typeof template_type_holder.model.get( 'et_pb_template_type' ) !== 'undefined' && 'module' === template_type_holder.model.get( 'et_pb_template_type' ) ) {
et_add_template_meta( '_et_pb_module_type', type );
}
et_pb_open_current_tab();
},
switchTab : function( event ) {
var $this_el = $( event.currentTarget ).parent(),
module_width = typeof this.model.get( 'et_pb_fullwidth' ) && 'on' === this.model.get( 'et_pb_fullwidth' ) ? 'fullwidth' : 'regular';
event.preventDefault();
et_handle_templates_switching( $this_el, 'module', module_width );
}
} );
ET_PageBuilder.ModuleSettingsView = window.wp.Backbone.View.extend( {
className : 'et_pb_module_settings',
initialize : function() {
if ( ! $( ET_PageBuilder_Layout.generateTemplateName( this.attributes['data-module_type'] ) ).length ) {
this.attributes['data-no_template'] = 'no_template';
return;
}
this.template = _.template( $( ET_PageBuilder_Layout.generateTemplateName( this.attributes['data-module_type'] ) ).html() );
this.listenTo( ET_PageBuilder_Events, 'et-modal-view-removed', this.removeModule );
this.listenTo( ET_PageBuilder_Events, 'et-advanced-module:saved', this.renderMap );
},
events : {
},
render : function() {
var thisClass = this,
$this_el = this.$el,
content = '',
this_module_cid = this.model.attributes.cid,
$content_textarea,
$content_textarea_container,
$content_textarea_option,
advanced_mode = false,
view,
$color_picker,
$upload_button,
$video_image_button,
$gallery_button,
$icon_font_list,
$et_affect_fields,
$et_form_validation,
$icon_font_options = [ "et_pb_font_icon", "et_pb_button_one_icon", "et_pb_button_two_icon", "et_pb_button_icon" ],
$add_email_account_buttons,
$preview_panel,
$previewable_upload_button_add,
$previewable_upload_button_edit,
$previewable_upload_button_delete;
// Update module's _builder_version to current builder's version
thisClass.model.set( 'et_pb__builder_version', et_pb_options.product_version );
// Replace encoded double quotes with normal quotes,
// escaping is applied in modules templates
_.each( this.model.attributes, function( value, key, list ) {
if ( typeof value === 'string' && key !== 'et_pb_content_new' && -1 === $.inArray( key, $icon_font_options ) && ! /^\%\%\d+\%\%$/.test( $.trim( value ) ) ) {
return list[ key ] = value.replace( /%22/g, '"' );
}
} );
this.$el.html( this.template( this.model.attributes ) );
$content_textarea = this.$el.find( '#et_pb_content_new' );
$color_picker = this.$el.find('.et-pb-color-picker-hex');
$color_picker_alpha = this.$el.find('.et-builder-color-picker-alpha');
$upload_button = this.$el.find('.et-pb-upload-button');
$preview_panel = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview');
$previewable_upload_button_add = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview-button--add');
$previewable_upload_button_edit = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview-button--edit');
$previewable_upload_button_delete = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview-button--delete');
$video_image_button = this.$el.find('.et-pb-video-image-button');
$gallery_button = this.$el.find('.et-pb-gallery-button');
$time_picker = this.$el.find('.et-pb-date-time-picker');
$icon_font_list = this.$el.find('.et_font_icon');
$validation_element = $this_el.find('.et-validate-number');
$et_form_validation = $this_el.find('form.validate');
$warning = $this_el.find('.et-pb-option--warning');
$add_email_account_buttons = $this_el.find('.et_pb_email_add_account');
// validation
if ( $et_form_validation.length ) {
et_builder_debug_message('validation enabled');
$et_form_validation.validate({
debug: true
});
}
if ( $color_picker.length ) {
var draggingID,
changeID;
$color_picker.each( function() {
var $this = $(this);
$this.wpColorPicker({
defaultColor : $this.data('default-color'),
palettes : '' !== et_pb_options.page_color_palette ? et_pb_options.page_color_palette.split( '|' ) : et_pb_options.default_color_palette.split( '|' ),
change : function( event, ui ) {
var $this_el = $(this);
var $option_container = $this_el.closest( '.et-pb-option-container' );
var $reset_button = $option_container.find( '.et-pb-reset-setting' );
var $custom_color_container = $this_el.closest( '.et-pb-custom-color-container' );
var $preview = $option_container.find( '.et-pb-option-preview' );
var has_preview = $this_el.hasClass('et-pb-color-picker-hex-has-preview');
var is_gradient_colorpicker = $this_el.closest('.et_pb_background-tab--gradient').length > 0;
var current_value = ui.color.toString().toLowerCase();
var default_value;
if ( $custom_color_container.length ) {
$custom_color_container.find( '.et-pb-custom-color-picker' ).val( ui.color.toString() );
// trigger change event if color picker inside font option for further processing
if ( $option_container.hasClass('et-pb-option-container--font') ) {
$custom_color_container.find( '.et-pb-custom-color-picker' ).trigger('change');
}
}
default_value = et_pb_get_default_setting_value( $this_el ).toLowerCase();
// do not apply default rules for reset button inside the font option. It has specific rules
if ( ! $option_container.hasClass('et-pb-option-container--font') ) {
if ( current_value !== default_value ) {
if ( $reset_button.length ) {
$reset_button.addClass( 'et-pb-reset-icon-visible' );
}
if ( has_preview ) {
$preview.removeClass('et-pb-option-preview--empty');
}
} else {
if ( $reset_button.length ) {
$reset_button.removeClass( 'et-pb-reset-icon-visible' );
}
if ( has_preview ) {
$preview.addClass('et-pb-option-preview--empty');
}
}
}
if ( has_preview) {
$preview.css( {
backgroundColor: current_value
} );
}
if ( is_gradient_colorpicker ) {
et_pb_update_gradient_preview( $this_el );
}
if ( _.has( event, 'originalEvent' ) && _.has( event.originalEvent, 'type' ) && event.originalEvent.type === 'square' ) {
$option_container.find( '.button-confirm' ).css( 'backgroundColor', current_value + ' !important' );
if ( ! $option_container.hasClass( 'is-dragging' ) ) {
$option_container.addClass( 'is-dragging' );
}
clearTimeout( draggingID );
draggingID = setTimeout( function() {
et_pb_reposition_colorpicker_element( $this_el );
$option_container.find( '.button-confirm' ).css( 'backgroundColor', '' );
$option_container.removeClass( 'is-dragging' );
}, 300 );
}
// Set focus back to clearpicker input after color change so enter could close the colorpicker
clearTimeout( changeID );
changeID = setTimeout( function() {
$this_el.focus();
}, 300 );
// Remove clear marker class name to make color validation works again
if ( $this_el.hasClass( 'et-pb-is-cleared' ) ) {
$this_el.removeClass( 'et-pb-is-cleared' )
}
//Since this event is triggered before the input value is changed we can't use 'et_pb_setting:change'
$this_el.trigger('et_pb_setting:color_picker:change', [current_value]);
},
clear: function() {
$(this).val( et_pb_options.invalid_color );
$(this).closest( '.et-pb-option-container' ).find( '.et-pb-main-setting' ).val( '' );
$(this).siblings('.et-pb-color-picker-hex').trigger('et_pb_setting:color_picker:change', ['']);
},
width : $this.closest( '.et-pb-option--background' ).length ? 660 : 300,
height : 190,
diviColorpicker : $this.closest( '.et-pb-option--background' ).length ? true : false
});
var default_color = $this.data('default-color') || '',
$reset_button = $this.closest( '.et-pb-option-container' ).find( '.et-pb-reset-setting' );
if ( $this.hasClass('et-pb-color-picker-hex-has-preview') ) {
var $option_container = $this.closest('.et-pb-option-container');
$option_container.find('.et-pb-option-preview-button--add, .et-pb-option-preview-button--edit, .et-pb-option-preview').click( function(e) {
e.stopPropagation();
$this.wpColorPicker('open');
});
$option_container.find('.et-pb-option-preview-button--delete').click( function(e) {
e.stopPropagation();
// Clear color value on DOM and colorpicker then add cleared class name to bypass color validation
$this.wpColorPicker( 'color', '' ).val( '' ).addClass( 'et-pb-is-cleared' );
$option_container.find('.et-pb-option-preview').removeAttr('style').addClass('et-pb-option-preview--empty');
});
}
if ( ! $reset_button.length ) {
return true;
}
var value = $this.val() + '';
if ( default_color.toLowerCase() !== value.toLowerCase() ) {
$reset_button.addClass( 'et-pb-reset-icon-visible' );
}
} );
}
if ( $color_picker_alpha.length ) {
$color_picker_alpha.each(function(){
var $this_color_picker_alpha = $(this),
color_picker_alpha_val = $this_color_picker_alpha.data('value').split('|'),
color_picker_alpha_hex = color_picker_alpha_val[0] || '#444444',
color_picker_alpha_opacity = color_picker_alpha_val[2] || 1.0;
$this_color_picker_alpha.attr('data-opacity', color_picker_alpha_opacity );
$this_color_picker_alpha.val( color_picker_alpha_hex );
$this_color_picker_alpha.minicolors({
control: 'hue',
defaultValue: $(this).data('default-color') || '',
opacity: true,
changeDelay: 200,
show: function() {
$this_color_picker_alpha.minicolors('opacity', $this_color_picker_alpha.data('opacity') );
},
change: function(hex, opacity) {
if( !hex ) {
return;
}
var rgba_object = $this_color_picker_alpha.minicolors('rgbObject'),
$field = $( $this_color_picker_alpha.data('field') ),
values = [],
values_string;
values.push( hex );
values.push( rgba_object.r + ', ' + rgba_object.g + ', ' + rgba_object.b );
values.push( opacity );
values_string = values.join('|');
if ( $field.length ) {
$field.val( values_string );
}
},
theme: 'bootstrap'
});
});
}
if ( $upload_button.length ) {
et_pb_activate_upload( $upload_button );
}
if ( $previewable_upload_button_add.length || $previewable_upload_button_edit.length || $preview_panel ) {
function et_pb_trigger_upload_button( e ) {
e.preventDefault();
e.stopPropagation();
if ( $(this).hasClass( 'et-pb-option-preview' ) && ! $(this).hasClass( 'et-pb-option-preview--empty' ) && $(this).siblings( '.button' ).attr( 'data-type' ) === 'video' ) {
return;
}
// If current background image preview is overwritten by featured image, image editing should be disabled
if ( et_pb_is_featured_image_background( $(this) ) ) {
return;
}
$(this).closest( '.et-pb-option' ).find( '.et-pb-upload-button' ).trigger( 'click' );
}
$preview_panel.click( et_pb_trigger_upload_button );
$previewable_upload_button_add.click( et_pb_trigger_upload_button );
$previewable_upload_button_edit.click( et_pb_trigger_upload_button );
}
if ( $previewable_upload_button_delete.length ) {
$previewable_upload_button_delete.click( function( e ) {
e.preventDefault();
e.stopPropagation();
// If current background image preview is overwritten by featured image, image removal should be disabled
if ( et_pb_is_featured_image_background( $(this) ) ) {
return;
}
var $option = $( this ).closest( '.et-pb-option' ),
$input = $option.find( '.et-pb-upload-field' ),
$preview = $option.find( '.et-pb-option-preview' );
$input.val( '' );
$preview.addClass( 'et-pb-option-preview--empty' ).find('.et-pb-preview-content').remove();
} );
}
if ( $video_image_button.length ) {
et_pb_generate_video_image( $video_image_button );
}
if ( $gallery_button.length ) {
et_pb_activate_gallery( $gallery_button );
}
if ( $add_email_account_buttons.length ) {
et_pb_email_lists_buttons_setup( $add_email_account_buttons, this );
}
if ( $time_picker.length ) {
// use the specified date format to avoid issues with date translation to different languages
$time_picker.datetimepicker({'dateFormat':'yy-mm-dd'});
}
if( $validation_element.length ){
$validation_element.keyup( function() {
var $this_el = $( this );
if ( $this_el.val() < 0 || ( !$.isNumeric( $this_el.val() ) && $this_el.val() !== '' ) ) {
$this_el.val( 0 );
}
if ( $this_el.val() > 100 ) {
$this_el.val( 100 );
}
if ( $this_el.val() !=='' ) {
$this_el.val( Math.round( $this_el.val() ) );
}
});
}
if ( $icon_font_list.length ) {
var that = this;
$icon_font_list.each( function() {
var $this_icon_list = $( this ),
$icon_font_field = $this_icon_list.siblings('.et-pb-font-icon'),
current_symbol_val = $.trim( $icon_font_field.val() ),
$icon_font_symbols = $this_icon_list.find( 'li' ),
active_symbol_class = 'et_active',
$current_symbol,
top_offset,
icon_index_number;
function et_pb_icon_font_init() {
if ( current_symbol_val !== '' ) {
current_symbol_val = current_symbol_val.replace('[', '%91');
current_symbol_val = current_symbol_val.replace(']', '%93');
// font icon index is used now in the following format: %%index_number%%
if ( current_symbol_val.search( /^%%/ ) !== -1 ) {
icon_index_number = parseInt( current_symbol_val.replace( /%/g, '' ) );
$current_symbol = $this_icon_list.find( 'li' ).eq( icon_index_number );
} else {
// set the 1st icon as active if wrong value saved for current_symbol_val
if ( '"' === current_symbol_val ) {
$current_symbol = $this_icon_list.find( 'li' ).eq( 0 );
} else {
$current_symbol = $this_icon_list.find( 'li[data-icon="' + current_symbol_val + '"]' );
}
}
$current_symbol.addClass( active_symbol_class );
if ( $this_icon_list.is( ':visible' ) ) {
setTimeout( function() {
top_offset = $current_symbol.offset().top - $this_icon_list.offset().top;
if ( top_offset > 0 ) {
$this_icon_list.animate( { scrollTop : top_offset }, 0 );
}
}, 110 );
}
}
}
et_pb_icon_font_init();
that.$el.find( '.et-pb-options-tabs-links' ).on( 'et_pb_main_tab:changed', et_pb_icon_font_init );
$icon_font_symbols.click( function() {
var $this_element = $(this),
this_symbol = $this_element.index();
if ( $this_element.hasClass( active_symbol_class ) ) {
return false;
}
$this_element.siblings( '.' + active_symbol_class ).removeClass( active_symbol_class ).end().addClass( active_symbol_class );
this_symbol = '%%' + this_symbol + '%%';
$icon_font_field.val( this_symbol );
} );
});
}
if ( $content_textarea.length ) {
$content_textarea_option = $content_textarea.closest( '.et-pb-option' );
if ( $content_textarea_option.hasClass( 'et-pb-option-advanced-module' ) )
advanced_mode = true;
if ( ! advanced_mode ) {
$content_textarea_container = $content_textarea.closest( '.et-pb-option-container' );
content = $content_textarea.html();
$content_textarea.remove();
$content_textarea_container.prepend( et_pb_content_html );
setTimeout( function() {
if ( typeof window.switchEditors !== 'undefined' ) {
window.switchEditors.go( 'et_pb_content_new', et_get_editor_mode() );
}
et_pb_set_content( 'et_pb_content_new', content );
window.wpActiveEditor = 'et_pb_content_new';
}, 100 );
} else {
var view_cid = ET_PageBuilder_Layout.generateNewId();
this.view_cid = view_cid;
$content_textarea_option.hide();
$content_textarea.attr( 'id', 'et_pb_content_main' );
view = new ET_PageBuilder.AdvancedModuleSettingsView( {
model : this,
el : this.$el.find( '.et-pb-option-advanced-module-settings' ),
attributes : {
cid : view_cid,
value_changes : thisClass.model.get( 'value_changes' ),
}
} );
ET_PageBuilder_Layout.addView( view_cid, view );
$content_textarea_option.before( view.render() );
if ( $content_textarea.html() !== '' ) {
view.generateAdvancedSortableItems( $content_textarea.html(), this.$el.find( '.et-pb-option-advanced-module-settings' ).data( 'module_type' ) );
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated_order', this.$el );
}
}
}
if ( $warning.length ) {
$warning.each(function() {
var $warning_option = $(this);
var $warning_field = $warning_option.find('.et-pb-option-warning');
var display_if = $warning_field.attr('data-display_if');
var name = $warning_field.attr('data-name');
if ( et_pb_options[name] === display_if ) {
$warning_option.addClass('et-pb-option--warning-active');
}
});
}
this.renderMap();
et_pb_init_main_settings( this.$el, this_module_cid );
if ( ! advanced_mode ) {
setTimeout( function() {
$this_el.find('select, input, textarea, radio').filter(':eq(0)').focus();
}, 1 );
}
return this;
},
removeModule : function() {
// remove Module settings, when modal window is closed or saved
this.remove();
},
is_latlng : function( address ) {
var latlng = address.split( ',' ),
lat = ! _.isUndefined( latlng[0] ) ? parseFloat( latlng[0] ) : false,
lng = ! _.isUndefined( latlng[1] ) ? parseFloat( latlng[1] ) : false;
if ( typeof google !== 'undefined' && lat && ! _.isNaN( lat ) && lng && ! _.isNaN( lng ) ) {
return new google.maps.LatLng( lat, lng );
}
return false;
},
renderMap: function() {
this_el = this,
$map = this.$el.find('.et-pb-map');
if ( typeof google !== 'undefined' && $map.length ) {
view_cid = this.view_cid;
var $address = this.$el.find('.et_pb_address'),
$address_lat = this.$el.find('.et_pb_address_lat'),
$address_lng = this.$el.find('.et_pb_address_lng'),
$find_address = this.$el.find('.et_pb_find_address'),
$zoom_level = this.$el.find('.et_pb_zoom_level'),
geocoder = new google.maps.Geocoder(),
markers = {};
var geocode_address = function() {
var address = $address.val();
if ( address.length <= 0 ) {
return;
}
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var result = results[0],
location = result.geometry.location,
address_is_latlng = this_el.is_latlng( address );
// If user passes valid lat lng instead of address, override geocode with given lat & lng
if ( address_is_latlng ) {
location = address_is_latlng;
}
if ( ! isNaN( location.lat() ) && ! isNaN( location.lng() ) ) {
$address.val( result.formatted_address);
$address_lat.val(location.lat());
$address_lng.val(location.lng());
update_center( location );
} else {
alert( et_pb_options.map_pin_address_invalid );
}
} else {
alert( et_pb_options.geocode_error + ': ' + status);
}
});
}
var update_center = function( LatLng ) {
$map.map.setCenter( LatLng );
}
var update_zoom = function () {
$map.map.setZoom( parseInt( $zoom_level.val() ) );
}
$address.on('blur', geocode_address );
$find_address.on('click', function(e){
e.preventDefault();
});
$zoom_level.on('blur', update_zoom );
setTimeout( function() {
$map.map = new google.maps.Map( $map[0], {
zoom: parseInt( $zoom_level.val() ),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
if ( '' != $address_lat.val() && '' != $address_lng.val() ) {
update_center( new google.maps.LatLng( $address_lat.val(), $address_lng.val() ) );
}
if ( '' != $zoom_level ) {
update_zoom();
}
setTimeout( function() {
var map_pins = ET_PageBuilder_Layout.getChildViews( view_cid );
if ( _.size( map_pins ) ) {
_.each( map_pins, function( map_pin, key ) {
// Skip current map pin if it has no lat or lng, as it will trigger maximum call stack exceeded
if ( _.isUndefined( map_pin.model.get('et_pb_pin_address_lat') ) || _.isUndefined( map_pin.model.get('et_pb_pin_address_lng') ) ) {
return;
}
markers[key] = new google.maps.Marker({
map: $map.map,
position: new google.maps.LatLng( parseFloat( map_pin.model.get('et_pb_pin_address_lat') ) , parseFloat( map_pin.model.get('et_pb_pin_address_lng') ) ),
title: map_pin.model.get('et_pb_title'),
icon: { url: et_pb_options.images_uri + '/marker.png', size: new google.maps.Size( 46, 43 ), anchor: new google.maps.Point( 16, 43 ) },
shape: { coord: [1, 1, 46, 43], type: 'rect' }
});
});
}
}, 500 );
google.maps.event.addListener( $map.map, 'center_changed', function() {
var center = $map.map.getCenter();
$address_lat.val( center.lat() );
$address_lng.val( center.lng() );
});
google.maps.event.addListener( $map.map, 'zoom_changed', function() {
var zoom_level = $map.map.getZoom();
$zoom_level.val( zoom_level );
});
}, 200 );
}
}
} );
ET_PageBuilder.AdvancedModuleSettingsView = window.wp.Backbone.View.extend( {
initialize : function() {
this.listenTo( ET_PageBuilder_Events, 'et-advanced-module:updated', this.generateContent );
this.listenTo( ET_PageBuilder_Events, 'et-modal-view-removed', this.removeModule );
this.module_type = this.$el.data( 'module_type' );
ET_PageBuilder.Events = ET_PageBuilder_Events;
this.child_views = [];
this.$el.attr( 'data-cid', this.attributes['cid'] );
this.$sortable_options = this.$el.find('.et-pb-sortable-options');
this.$content_textarea = this.$el.siblings('.et-pb-option-main-content').find('#et_pb_content_main');
this.$sortable_options.sortable( {
axis : 'y',
cancel : '.et-pb-advanced-setting-remove, .et-pb-advanced-setting-options',
update : function( event, ui ) {
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated' );
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated_order' );
}
} );
this.$add_sortable_item = this.$el.find( '.et-pb-add-sortable-option' ).addClass( 'et-pb-add-sortable-initial' );
},
events : {
'click .et-pb-add-sortable-option' : 'addModule',
'click .et-pb-advanced-setting-clone' : 'cloneModule'
},
render : function() {
return this;
},
addModule : function( event ) {
event.preventDefault();
this.model.collection.add( [ {
type : 'module',
module_type : this.module_type,
cid : ET_PageBuilder_Layout.generateNewId(),
view : this,
created : 'manually',
mode : 'advanced',
parent : this.attributes['cid'],
parent_cid : this.model.model.attributes['cid']
} ], { update_shortcodes : 'false' } );
this.$add_sortable_item.removeClass( 'et-pb-add-sortable-initial' );
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated_order' );
},
cloneModule : function( event ) {
event.preventDefault();
var cloned_cid = $( event.target ).closest( 'li' ).data( 'cid' ),
cloned_model = ET_PageBuilder_App.collection.find( function( model ) {
return model.get('cid') == cloned_cid;
} ),
module_attributes = _.clone( cloned_model.attributes );
module_attributes.created = 'manually';
module_attributes.cloned_cid = cloned_cid;
module_attributes.cid = ET_PageBuilder_Layout.generateNewId();
this.model.collection.add( module_attributes );
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated' );
ET_PageBuilder_Events.trigger( 'et-advanced-module:saved' );
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated_order' );
},
generateContent : function() {
var content = '';
this.$sortable_options.find( 'li' ).each( function() {
var $this_el = $(this);
content += ET_PageBuilder_App.generateModuleShortcode( $this_el, false );
} );
// Replace double quotes with ^^ in temporary shortcodes
content = content.replace( /%22/g, '^^' );
this.$content_textarea.html( content );
if ( ! this.$sortable_options.find( 'li' ).length )
this.$add_sortable_item.addClass( 'et-pb-add-sortable-initial' );
else
this.$add_sortable_item.removeClass( 'et-pb-add-sortable-initial' );
},
generateAdvancedSortableItems : function( content, module_type ) {
var this_el = this,
et_pb_shortcodes_tags = ET_PageBuilder_App.getShortCodeChildTags(),
reg_exp = window.wp.shortcode.regexp( et_pb_shortcodes_tags ),
inner_reg_exp = ET_PageBuilder_App.wp_regexp_not_global( et_pb_shortcodes_tags ),
matches = content.match( reg_exp );
if ( content !== '' )
this.$add_sortable_item.removeClass( 'et-pb-add-sortable-initial' );
_.each( matches, function ( shortcode, shortcode_index ) {
var shortcode_element = shortcode.match( inner_reg_exp ),
shortcode_name = shortcode_element[2],
shortcode_attributes = shortcode_element[3] !== ''
? window.wp.shortcode.attrs( shortcode_element[3] )
: '',
shortcode_content = shortcode_element[5],
module_cid = ET_PageBuilder_Layout.generateNewId(),
module_settings,
prefixed_attributes = {},
found_inner_shortcodes = typeof shortcode_content !== 'undefined' && shortcode_content !== '' && shortcode_content.match( reg_exp ),
name_changes = et_pb_options.et_pb_module_settings_migrations.name_changes;
module_settings = {
type : 'module',
module_type : module_type,
cid : ET_PageBuilder_Layout.generateNewId(),
view : this_el,
created : 'auto',
mode : 'advanced',
parent : this_el.attributes['cid'],
parent_cid : this_el.model.model.attributes['cid']
};
if ( _.isObject( shortcode_attributes['named'] ) ) {
for ( var key in shortcode_attributes['named'] ) {
var prefixed_key = key !== 'admin_label' ? 'et_pb_' + key : key,
setting_value;
if ( shortcode_name === 'column' && prefixed_key === 'et_pb_type' )
prefixed_key = 'layout';
setting_value = shortcode_attributes['named'][key];
// Replace temporary ^^ signs with double quotes
setting_value = setting_value.replace( /\^\^/g, '"' );
prefixed_attributes[prefixed_key] = setting_value;
}
module_settings['et_pb_content_new'] = shortcode_content;
module_settings = _.extend( module_settings, prefixed_attributes );
}
if ( ! found_inner_shortcodes ) {
module_settings['et_pb_content_new'] = shortcode_content;
}
// BEGIN Settings Migrations
// Applying attribute name migration for current module item
if ( ! _.isEmpty( name_changes ) && ! _.isEmpty( name_changes[ this_el.module_type ] ) ) {
_.forEach( name_changes[ this_el.module_type ], function( new_attr_name, old_attr_name ) {
if ( ! _.isUndefined( module_settings[ 'et_pb_' + old_attr_name ] ) ) {
module_settings[ 'et_pb_' + new_attr_name ] = module_settings[ 'et_pb_' + old_attr_name ];
// Delete migrated name to avoid unwanted value re-assignment when module item is re-opened
delete module_settings[ 'et_pb_' + old_attr_name ];
}
} );
}
// Applying value migration for current module item
if ( ! _.isUndefined( this_el.attributes.value_changes ) && ! _.isUndefined( this_el.attributes.value_changes[ shortcode_index ] ) ) {
_.forEach( this_el.attributes.value_changes[ shortcode_index ], function( value, attribute_name ) {
module_settings[ 'et_pb_' + attribute_name ] = value;
} );
}
// END Settings Migrations
this_el.model.collection.add( [ module_settings ], { update_shortcodes : 'false' } );
} );
},
removeModule : function() {
// remove Module settings, when modal window is closed or saved
_.each( this.child_views, function( view ) {
view.removeView();
} );
this.remove();
}
} );
ET_PageBuilder.AdvancedModuleSettingView = window.wp.Backbone.View.extend( {
tagName : 'li',
initialize : function() {
this.template = _.template( $( '#et-builder-advanced-setting' ).html() );
},
events : {
'click .et-pb-advanced-setting-options' : 'showSettings',
'click .et-pb-advanced-setting-remove' : 'removeView'
},
render : function() {
var view;
this.$el.html( this.template( this.model.attributes ) );
view = new ET_PageBuilder.AdvancedModuleSettingTitleView( {
model : this.model,
view : this
} );
this.$el.prepend( view.render().el );
this.child_view = view;
if ( typeof this.model.get( 'cloned_cid' ) === 'undefined' || '' === this.model.get( 'cloned_cid' ) ) {
this.showSettings();
}
return this;
},
showSettings : function( event ) {
var view;
if ( event ) event.preventDefault();
view = new ET_PageBuilder.AdvancedModuleSettingEditViewContainer( {
view : this,
attributes : {
show_settings_clicked : ( event ? true : false )
}
} );
$('.et_pb_modal_settings_container').after( view.render().el );
},
removeView : function( event ) {
if ( event ) event.preventDefault();
this.child_view.remove();
this.remove();
this.model.destroy();
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated' );
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated_order' );
}
} );
ET_PageBuilder.AdvancedModuleSettingTitleView = window.wp.Backbone.View.extend( {
tagName : 'span',
className : 'et-sortable-title',
initialize : function() {
template_name = '#et-builder-advanced-setting-' + this.model.get( 'module_type' ) + '-title';
this.template = _.template( $( template_name ).html() );
this.listenTo( ET_PageBuilder_Events, 'et-advanced-module:updated', this.render );
},
render : function() {
var view;
// If admin label is empty, delete it so builder will use heading value instead
if ( ! _.isUndefined( this.model.attributes.et_pb_admin_title ) && this.model.attributes.et_pb_admin_title === '' ) {
delete this.model.attributes.et_pb_admin_title;
}
this.$el.html( this.template( this.model.attributes ) );
return this;
}
} );
ET_PageBuilder.AdvancedModuleSettingEditViewContainer = window.wp.Backbone.View.extend( {
className : 'et_pb_modal_settings_container',
initialize : function() {
this.template = _.template( $( '#et-builder-advanced-setting-edit' ).html() );
this.model = this.options.view.model;
this.listenTo( ET_PageBuilder_Events, 'et-modal-view-removed', this.removeView );
},
events : {
'click .et-pb-modal-save' : 'saveSettings',
'click .et-pb-modal-close' : 'removeView'
},
is_latlng : function( address ) {
var latlng = address.split( ',' ),
lat = ! _.isUndefined( latlng[0] ) ? parseFloat( latlng[0] ) : false,
lng = ! _.isUndefined( latlng[1] ) ? parseFloat( latlng[1] ) : false;
if ( lat && ! _.isNaN( lat ) && lng && ! _.isNaN( lng ) ) {
return new google.maps.LatLng( lat, lng );
}
return false;
},
render : function() {
var this_module_cid = this.model.attributes.cid,
view,
$color_picker,
$upload_button,
$video_image_button,
$map,
$social_network_picker,
$icon_font_list,
this_el = this,
$preview_panel,
$previewable_upload_button_add,
$previewable_upload_button_edit,
$previewable_upload_button_delete;
this.$el.html( this.template() );
this.$el.addClass( 'et_pb_modal_settings_container_step2' );
this.$el.attr( 'data-parent-cid', this_module_cid );
if ( this.model.get( 'created' ) !== 'auto' || this.attributes['show_settings_clicked'] ) {
view = new ET_PageBuilder.AdvancedModuleSettingEditView( { view : this } );
this.$el.append( view.render().el );
this.child_view = view;
}
// Update module's _builder_version to current builder's version
this.model.set( 'et_pb__builder_version', et_pb_options.product_version );
ET_PageBuilder.Events.trigger( 'et-advanced-module-settings:render', this );
$color_picker = this.$el.find('.et-pb-color-picker-hex');
$color_picker_alpha = this.$el.find('.et-builder-color-picker-alpha');
if ( $color_picker.length ) {
var draggingID,
changeID;
$color_picker.each( function() {
var $this = $(this);
$this.wpColorPicker({
defaultColor : $this.data('default-color'),
palettes : '' !== et_pb_options.page_color_palette ? et_pb_options.page_color_palette.split( '|' ) : et_pb_options.default_color_palette.split( '|' ),
change : function( event, ui ) {
var $this_el = $(this);
var $option_container = $this_el.closest( '.et-pb-option-container' );
var $reset_button = $option_container.find( '.et-pb-reset-setting' );
var $custom_color_container = $this_el.closest( '.et-pb-custom-color-container' );
var $preview = $option_container.find( '.et-pb-option-preview' );
var has_preview = $this_el.hasClass('et-pb-color-picker-hex-has-preview');
var is_gradient_colorpicker = $this_el.closest('.et_pb_background-tab--gradient').length > 0;
var current_value = ui.color.toString().toLowerCase();
var default_value;
if ( $custom_color_container.length ) {
$custom_color_container.find( '.et-pb-custom-color-picker' ).val( ui.color.toString() );
}
if ( ! $reset_button.length && ( ! has_preview && ! is_gradient_colorpicker ) ) {
return;
}
default_value = et_pb_get_default_setting_value( $this_el ).toLowerCase();
if ( current_value !== default_value ) {
$reset_button.addClass( 'et-pb-reset-icon-visible' );
if ( has_preview ) {
$preview.removeClass('et-pb-option-preview--empty');
}
} else {
$reset_button.removeClass( 'et-pb-reset-icon-visible' );
if ( has_preview ) {
$preview.addClass('et-pb-option-preview--empty');
}
}
if ( has_preview) {
$preview.css( {
backgroundColor: current_value
} );
}
if ( is_gradient_colorpicker ) {
et_pb_update_gradient_preview( $this_el );
}
if ( has_preview || is_gradient_colorpicker ) {
if ( _.has( event, 'originalEvent' ) && _.has( event.originalEvent, 'type' ) && event.originalEvent.type === 'square' ) {
$option_container.find( '.button-confirm' ).css( 'backgroundColor', current_value + ' !important' );
if ( ! $option_container.hasClass( 'is-dragging' ) ) {
$option_container.addClass( 'is-dragging' );
}
clearTimeout( draggingID );
draggingID = setTimeout( function() {
et_pb_reposition_colorpicker_element( $this_el );
$option_container.find( '.button-confirm' ).css( 'backgroundColor', '' );
$option_container.removeClass( 'is-dragging' );
}, 300 );
}
// Set focus back to clearpicker input after color change so enter could close the colorpicker
clearTimeout( changeID );
changeID = setTimeout( function() {
$this_el.focus();
}, 300 );
}
// Remove clear marker class name to make color validation works again
if ( $this_el.hasClass( 'et-pb-is-cleared' ) ) {
$this_el.removeClass( 'et-pb-is-cleared' )
}
// Since this event is triggered before the input value is changed we can't use 'et_pb_setting:change'
$this_el.trigger('et_pb_setting:color_picker:change', [current_value]);
},
width : $this.closest( '.et-pb-option--background' ).length ? 660 : 300,
height : 190,
diviColorpicker : $this.closest( '.et-pb-option--background' ).length ? true : false
});
if ( $this.hasClass('et-pb-color-picker-hex-has-preview') ) {
var $option_container = $this.closest('.et-pb-option-container');
$option_container.find('.et-pb-option-preview-button--add, .et-pb-option-preview-button--edit, .et-pb-option-preview').click( function(e) {
e.stopPropagation();
$this.wpColorPicker('open');
});
$option_container.find('.et-pb-option-preview-button--delete').click( function(e) {
e.stopPropagation();
// Remove clear marker class name to make color validation works again
$this.wpColorPicker( 'color', '' ).val( '' ).addClass( 'et-pb-is-cleared' );
$option_container.find('.et-pb-option-preview').removeAttr('style').addClass('et-pb-option-preview--empty');
});
}
} );
}
if ( $color_picker_alpha.length ) {
$color_picker_alpha.each(function(){
var $this_color_picker_alpha = $(this),
color_picker_alpha_val = $this_color_picker_alpha.data('value').split('|'),
color_picker_alpha_hex = color_picker_alpha_val[0] || '#444444',
color_picker_alpha_opacity = color_picker_alpha_val[2] || 1.0;
$this_color_picker_alpha.attr('data-opacity', color_picker_alpha_opacity );
$this_color_picker_alpha.val( color_picker_alpha_hex );
$this_color_picker_alpha.minicolors({
control: 'hue',
defaultValue: $(this).data('default-color') || '',
opacity: true,
changeDelay: 200,
show: function() {
$this_color_picker_alpha.minicolors('opacity', $this_color_picker_alpha.data('opacity') );
},
change: function(hex, opacity) {
if( !hex ) {
return;
}
var rgba_object = $this_color_picker_alpha.minicolors('rgbObject'),
$field = $( $this_color_picker_alpha.data('field') ),
values = [],
values_string;
values.push( hex );
values.push( rgba_object.r + ', ' + rgba_object.g + ', ' + rgba_object.b );
values.push( opacity );
values_string = values.join('|');
if ( $field.length ) {
$field.val( values_string );
}
},
theme: 'bootstrap'
});
});
}
$upload_button = this.$el.find('.et-pb-upload-button');
$preview_panel = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview');
$previewable_upload_button_add = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview-button--add');
$previewable_upload_button_edit = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview-button--edit');
$previewable_upload_button_delete = this.$el.find('.et-pb-option-container--upload .et-pb-option-preview-button--delete');
if ( $upload_button.length ) {
et_pb_activate_upload( $upload_button );
}
if ( $previewable_upload_button_add.length || $previewable_upload_button_edit.length || $preview_panel.length ) {
function et_pb_trigger_upload_button( e ) {
e.preventDefault();
e.stopPropagation();
if ( $(this).hasClass( 'et-pb-option-preview' ) && ! $(this).hasClass( 'et-pb-option-preview--empty' ) ) {
return;
}
$(this).closest( '.et-pb-option' ).find( '.et-pb-upload-button' ).trigger( 'click' );
}
$preview_panel.click( et_pb_trigger_upload_button );
$previewable_upload_button_add.click( et_pb_trigger_upload_button );
$previewable_upload_button_edit.click( et_pb_trigger_upload_button );
}
if ( $previewable_upload_button_delete.length ) {
$previewable_upload_button_delete.click( function( e ) {
e.preventDefault();
e.stopPropagation();
var $option = $( this ).closest( '.et-pb-option' ),
$input = $option.find( '.et-pb-upload-field' ),
$preview = $option.find( '.et-pb-option-preview' );
$input.val( '' );
$preview.addClass( 'et-pb-option-preview--empty' ).find('.et-pb-preview-content').remove();
} );
}
$video_image_button = this.$el.find('.et-pb-video-image-button');
if ( $video_image_button.length ) {
et_pb_generate_video_image( $video_image_button );
}
$map = this.$el.find('.et-pb-map');
if ( typeof google !== 'undefined' && $map.length ) {
var map,
marker,
$address = this.$el.find('.et_pb_pin_address'),
$address_lat = this.$el.find('.et_pb_pin_address_lat'),
$address_lng = this.$el.find('.et_pb_pin_address_lng'),
$find_address = this.$el.find('.et_pb_find_address'),
$zoom_level = this.$el.find('.et_pb_zoom_level'),
geocoder = new google.maps.Geocoder();
var geocode_address = function() {
var address = $address.val().trim();
if ( address.length <= 0 ) {
return;
}
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var result = results[0],
location = result.geometry.location,
address_is_latlng = this_el.is_latlng( address );
// If user passes valid lat lng instead of address, override geocode with given lat & lng
if ( address_is_latlng ) {
location = address_is_latlng;
}
if ( ! isNaN( location.lat() ) && ! isNaN( location.lng() ) ) {
$address.val( result.formatted_address);
$address_lat.val(location.lat());
$address_lng.val(location.lng());
update_map( location );
} else {
alert( et_pb_options.map_pin_address_invalid );
}
} else {
alert( et_pb_options.geocode_error + ': ' + status);
}
});
}
var update_map = function( LatLng ) {
marker.setPosition( LatLng );
map.setCenter( LatLng );
}
$address.on('change', geocode_address );
$find_address.on('click', function(e){
e.preventDefault();
});
setTimeout( function() {
map = new google.maps.Map( $map[0], {
zoom: parseInt( $zoom_level.val() ),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
marker = new google.maps.Marker({
map: map,
draggable: true,
icon: { url: et_pb_options.images_uri + '/marker.png', size: new google.maps.Size( 46, 43 ), anchor: new google.maps.Point( 16, 43 ) },
shape: { coord: [1, 1, 46, 43], type: 'rect' },
});
google.maps.event.addListener(marker, 'dragend', function() {
var drag_position = marker.getPosition();
$address_lat.val(drag_position.lat());
$address_lng.val(drag_position.lng());
update_map(drag_position);
latlng = new google.maps.LatLng( drag_position.lat(), drag_position.lng() );
geocoder.geocode({'latLng': latlng }, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if ( results[0] ) {
$address.val( results[0].formatted_address );
} else {
alert( et_pb_options.no_results );
}
} else {
alert( et_pb_options.geocode_error_2 + ': ' + status);
}
});
});
if ( '' != $address_lat.val() && '' != $address_lng.val() ) {
update_map( new google.maps.LatLng( $address_lat.val(), $address_lng.val() ) );
}
}, 200 );
}
$gallery_button = this.$el.find('.et-pb-gallery-button');
if ( $gallery_button.length ) {
et_pb_activate_gallery( $gallery_button );
}
$social_network_picker = this.$el.find('.et-pb-social-network');
if ( $social_network_picker.length ) {
var $color_reset = this.$el.find('.reset-default-color'),
$social_network_icon_color = this.$el.find('#et_pb_background_color');
if ( $color_reset.length ){
$color_reset.click(function(){
$main_settings = $color_reset.parents('.et-pb-main-settings');
$social_network_picker = $main_settings.find('.et-pb-social-network');
$social_network_icon_color = $main_settings.find('#et_pb_background_color');
if ( $social_network_icon_color.length ) {
$social_network_icon_color.wpColorPicker('color', $social_network_picker.find( 'option:selected' ).data('color') );
$color_reset.css( 'display', 'none' );
}
});
}
$social_network_picker.change(function(){
$main_settings = $social_network_picker.parents('.et-pb-main-settings');
// If $social_network_picker.change() is triggered during setting view render, ignore it
// Continuing will cause saved background_color being overwrite by selected social_network's pre-defined color
if ( $social_network_picker.data( 'is_rendering_setting_view' ) ) {
return;
}
if ( $social_network_picker.val().length ) {
var $social_network_title = $main_settings.find('#et_pb_content_new'),
$social_network_icon_color = $main_settings.find('#et_pb_background_color');
if ( $social_network_title.length ) {
$social_network_title.val( $social_network_picker.find( 'option:selected' ).text() );
}
if ( $social_network_icon_color.length ) {
var selectedColor = $social_network_picker.find( 'option:selected' ).data('color');
$social_network_icon_color.val( selectedColor ).wpColorPicker('color', selectedColor );
$social_network_icon_color.closest( '.et-pb-option-container' ).find( '.et-pb-option-preview' ).css({
backgroundColor: selectedColor,
});
}
}
});
if ( $social_network_icon_color.val() !== $social_network_picker.find( 'option:selected' ).data('color') ) {
$color_reset.css( 'display', 'inline' );
}
}
$icon_font_list = this.$el.find('.et_font_icon');
if ( $icon_font_list.length ) {
var that = this;
$icon_font_list.each( function() {
var $this_icon_list = $( this ),
$icon_font_field = $this_icon_list.siblings('.et-pb-font-icon'),
current_symbol_val = $.trim( $icon_font_field.val() ),
$icon_font_symbols = $this_icon_list.find( 'li' ),
active_symbol_class = 'et_active',
$current_symbol,
top_offset,
icon_index_number;
function et_pb_icon_font_init() {
if ( current_symbol_val !== '' ) {
// font icon index is used now in the following format: %%index_number%%
if ( current_symbol_val.search( /^%%/ ) !== -1 ) {
icon_index_number = parseInt( current_symbol_val.replace( /%/g, '' ) );
$current_symbol = $this_icon_list.find( 'li' ).eq( icon_index_number );
} else {
$current_symbol = $this_icon_list.find( 'li[data-icon="' + current_symbol_val + '"]' );
}
$current_symbol.addClass( active_symbol_class );
if ( $this_icon_list.is( ':visible' ) ) {
setTimeout( function() {
top_offset = $current_symbol.offset().top - $this_icon_list.offset().top;
if ( top_offset > 0 ) {
$this_icon_list.animate( { scrollTop : top_offset }, 0 );
}
}, 110 );
}
}
}
et_pb_icon_font_init();
that.$el.find( '.et-pb-options-tabs-links' ).on( 'et_pb_main_tab:changed', et_pb_icon_font_init );
$icon_font_symbols.click( function() {
var $this_element = $(this),
this_symbol = $this_element.index();
if ( $this_element.hasClass( active_symbol_class ) ) {
return false;
}
$this_element.siblings( '.' + active_symbol_class ).removeClass( active_symbol_class ).end().addClass( active_symbol_class );
this_symbol = '%%' + this_symbol + '%%';
$icon_font_field.val( this_symbol );
} );
});
}
et_pb_set_child_defaults( this.$el, this_module_cid );
et_pb_init_main_settings( this.$el, this_module_cid );
return this;
},
removeView : function( event ) {
if ( event ) event.preventDefault();
// remove advanced tab WYSIWYG, only if the close button is clicked
if ( this.$el.find( '#et_pb_content_new' ) && event )
et_pb_tinymce_remove_control( 'et_pb_content_new' );
et_pb_hide_active_color_picker( this );
if ( this.child_view )
this.child_view.remove();
this.remove();
},
saveSettings : function( event ) {
var this_view = this,
attributes = {},
this_model_defaults = this.model.get( 'module_defaults' ) || '';
event.preventDefault();
this.$( 'input, select, textarea' ).each( function() {
var $this_el = $(this),
id = $this_el.attr('id'),
setting_value,
checked_values = [];
// name attribute is used in normal html checkboxes, use it instead of ID
if ( $this_el.is( ':checkbox' ) ) {
id = $this_el.attr('name');
}
if ( typeof id === 'undefined' || ( -1 !== id.indexOf( 'qt_' ) && 'button' === $this_el.attr( 'type' ) ) ) {
// settings should have an ID and shouldn't be a Quick Tag button from the tinyMCE in order to be saved
return true;
}
if ( ! $this_el.is( ':checkbox' ) ) {
id = $this_el.attr('id').replace( 'data.', '' );
}
// All checkbox values are saved at once on the next step, so if the attribute name
// already exists, do nothing
if ( $this_el.is( ':checkbox' ) && typeof attributes[id] !== 'undefined' ) {
return true;
}
setting_value = $this_el.is('#et_pb_content_new')
? et_pb_get_content( 'et_pb_content_new' )
: $this_el.val();
// Text align specific issue: $('select').val() chooses first value if there is no selected option found.
// This causes innacuracy in form of first <option> (left) is automatically selected when there is no selected alignment
// Cross-check .et_text_align_activec class-name existence to verify text align's setting_value accuracy
if ( $this_el.is( '.et-pb-text-align-select' ) && ! $this_el.parent().find( '.et_text_align_active' ).length ) {
return true;
}
// do not save the default values into module attributes
//if 'check_attr_default' flag presented use 'default' html data attribute to compare
if (!_.isEmpty($this_el.data('check_attr_default')) && ($this_el.data('check_attr_default') === 'yes')) {
if (et_pb_is_setting_value_default($this_el)) {
this_view.model.unset( id );
return true;
}
} else {
if ( '' !== this_model_defaults && typeof this_model_defaults[id] !== 'undefined' && this_model_defaults[id] === setting_value ) {
this_view.model.unset( id );
return true;
}
}
// Process all checkboxex for the current setting at once
if ( $this_el.is( ':checkbox' ) && typeof attributes[id] === 'undefined' ) {
$this_el.closest( '.et-pb-option-container' ).find( '[name="' + id + '"]:checked' ).each( function() {
checked_values.push( $(this).val() );
} );
setting_value = checked_values.join( "," );
}
if ( $this_el.closest( '.et-pb-custom-css-option' ).length ) {
// Custom CSS settings content should be modified before it is added to the shortcode attribute
// replace new lines with || in Custom CSS settings
setting_value = '' !== setting_value ? setting_value.replace( /(?:\r\n|\r|\n)/g, '\|\|' ) : '';
}
attributes[ id ] = setting_value;
} );
// Check if this is map module's pin view
if ( ! _.isUndefined( attributes.et_pb_pin_address ) && ! _.isUndefined( attributes.et_pb_pin_address_lat ) && ! _.isUndefined( attributes.et_pb_pin_address_lng ) ) {
// None of et_pb_pin_address, et_pb_pin_address_lat, and et_pb_pin_address_lng fields can be empty
// If one of them is empty, it'll trigger Uncaught RangeError: Maximum call stack size exceeded message
if ( attributes.et_pb_pin_address === '' || attributes.et_pb_pin_address_lat === '' || attributes.et_pb_pin_address_lng === '' ) {
alert( et_pb_options.map_pin_address_error );
return;
}
}
// Get parent module's view
var parent_view = ET_PageBuilder_Layout.getView( this_view.model.attributes.view.model.model.attributes.cid );
// Remove remaining value_changes so migration value won't accidentally applied again when module item's setting modal is re-opened
if ( ! _.isUndefined( parent_view.model.get('value_changes') ) ) {
parent_view.model.unset( 'value_changes' );
}
this.model.set( attributes, { silent : true } );
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated' );
ET_PageBuilder_Events.trigger( 'et-advanced-module:saved' );
et_pb_tinymce_remove_control( 'et_pb_content_new' );
this.removeView();
}
} );
ET_PageBuilder.AdvancedModuleSettingEditView = window.wp.Backbone.View.extend( {
className : 'et_pb_module_settings',
initialize : function() {
this.model = this.options.view.options.view.model;
this.template = _.template( $( '#et-builder-advanced-setting-' + this.model.get( 'module_type' ) ).html() );
},
events : {
},
render : function() {
var $this_el = this.$el,
$content_textarea,
$content_textarea_container;
this.$el.html( this.template( { data : this.model.toJSON() } ) );
this.$el.find( '.et-pb-main-settings' ).addClass( 'et-pb-main-settings-advanced' );
$content_textarea = this.$el.find( 'div#et_pb_content_new' );
if ( $content_textarea.length ) {
$content_textarea_container = $content_textarea.closest( '.et-pb-option-container' );
content = $content_textarea.html();
$content_textarea.remove();
$content_textarea_container.prepend( et_pb_content_html );
setTimeout( function() {
if ( typeof window.switchEditors !== 'undefined' )
window.switchEditors.go( 'et_pb_content_new', et_get_editor_mode() );
et_pb_set_content( 'et_pb_content_new', content );
window.wpActiveEditor = 'et_pb_content_new';
}, 300 );
}
setTimeout( function() {
$this_el.find('select, input, textarea, radio').filter(':eq(0)').focus();
}, 1 );
return this;
}
} );
ET_PageBuilder.BlockModuleView = window.wp.Backbone.View.extend( {
className : function() {
var className = 'et_pb_module_block';
if ( typeof this.model.attributes.className !== 'undefined' ) {
className += this.model.attributes.className;
}
return className;
},
template : _.template( $( '#et-builder-block-module-template' ).html() ),
initialize : function() {
this.listenTo( this.model, 'change:admin_label', this.renameModule );
this.listenTo( this.model, 'change:et_pb_disabled', this.toggleDisabledClass );
this.listenTo( this.model, 'change:et_pb_global_module', this.removeGlobal );
},
events : {
'click .et-pb-settings' : 'showSettings',
'click .et-pb-clone-module' : 'cloneModule',
'click .et-pb-remove-module' : 'removeModule',
'click .et-pb-unlock' : 'unlockModule',
'contextmenu' : 'showRightClickOptions',
'click' : 'hideRightClickOptions',
'click' : 'setABTesting',
},
render : function() {
var parent_views = ET_PageBuilder_Layout.getParentViews( this.model.get( 'parent' ) );
this.$el.html( this.template( this.model.attributes ) );
if ( typeof this.model.attributes.et_pb_global_module !== 'undefined' || ( typeof this.model.attributes.et_pb_template_type !== 'undefined' && 'module' === this.model.attributes.et_pb_template_type && 'global' === et_pb_options.is_global_template ) ) {
this.$el.addClass( 'et_pb_global' );
}
if ( typeof this.model.get( 'et_pb_locked' ) !== 'undefined' && this.model.get( 'et_pb_locked' ) === 'on' ) {
_.each( parent_views, function( parent ) {
parent.$el.addClass( 'et_pb_children_locked' );
} );
}
if ( typeof this.model.get( 'et_pb_parent_locked' ) !== 'undefined' && this.model.get( 'et_pb_parent_locked' ) === 'on' ) {
this.$el.addClass( 'et_pb_parent_locked' );
}
if ( ET_PageBuilder_Layout.isModuleFullwidth( this.model.get( 'module_type' ) ) )
this.$el.addClass( 'et_pb_fullwidth_module' );
if ( typeof this.model.get( 'pasted_module' ) !== 'undefined' && this.model.get( 'pasted_module' ) ) {
et_pb_handle_clone_class( this.$el );
}
if ( ET_PageBuilder_AB_Testing.is_active() ) {
if ( ET_PageBuilder_AB_Testing.is_subject( this.model ) ) {
this.$el.addClass( 'et_pb_ab_subject' );
// Apply subject rank coloring
ET_PageBuilder_AB_Testing.set_subject_rank_coloring( this );
}
if ( ET_PageBuilder_AB_Testing.is_goal( this.model ) ) {
this.$el.addClass( 'et_pb_ab_goal' );
}
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'module', this.model ) ) {
this.$el.addClass( 'et_pb_ab_no_permission' )
}
}
return this;
},
cloneModule : function( event ) {
var global_module_cid = '',
clone_module,
view_settings = {
model : this.model,
view : this.$el,
view_event : event
};
event.preventDefault();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
if ( this.isModuleLocked() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'module' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
if ( ( this.$el.closest( '.et_pb_section.et_pb_global' ).length || this.$el.closest( '.et_pb_row.et_pb_global' ).length ) && '' === et_pb_options.template_post_id ) {
global_module_cid = et_pb_get_global_parent_cid( this );
}
clone_module = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'cloned', 'module', this.model.get( 'admin_label' ) );
clone_module.copy( event );
clone_module.pasteAfter( event );
if ( '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
},
renameModule : function() {
this.$( '.et-pb-module-title' ).html( this.model.get( 'admin_label' ) );
},
removeGlobal : function() {
if ( this.isModuleLocked() ) {
return;
}
if ( typeof this.model.get( 'et_pb_global_module' ) === 'undefined' ) {
this.$el.removeClass( 'et_pb_global' );
}
},
toggleDisabledClass : function() {
if ( typeof this.model.get( 'et_pb_disabled' ) !== 'undefined' && 'on' === this.model.get( 'et_pb_disabled' ) ) {
this.$el.addClass( 'et_pb_disabled' );
} else {
this.$el.removeClass( 'et_pb_disabled' );
}
},
showSettings : function( event ) {
var that = this,
modal_view,
view_settings = {
model : this.model,
collection : this.collection,
attributes : {
'data-open_view' : 'module_settings'
},
triggered_by_right_click : this.triggered_by_right_click,
do_preview : this.do_preview
};
if ( typeof event !== 'undefined' ) {
event.preventDefault();
}
et_pb_close_all_right_click_options();
if ( this.isModuleLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'module' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
if ( typeof this.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== this.model.get( 'et_pb_global_module' ) ) {
et_builder_get_global_module( view_settings );
// Set marker variable to undefined after being used to prevent unwanted preview
this.triggered_by_right_click = undefined;
this.do_preview = undefined;
} else {
modal_view = new ET_PageBuilder.ModalView( view_settings );
et_modal_view_rendered = modal_view.render();
if ( false === et_modal_view_rendered ) {
et_builder_load_backbone_templates( true );
setTimeout( function() {
that.showSettings();
}, 500 );
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
return;
}
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
$('body').append( et_modal_view_rendered.el );
}
// set initial active tab for partially saved module templates.
et_pb_open_current_tab();
if ( ( typeof this.model.get( 'et_pb_global_parent' ) !== 'undefined' && '' !== this.model.get( 'et_pb_global_parent' ) ) || ( ET_PageBuilder_Layout.getView( this.model.get('cid') ).$el.closest( '.et_pb_global' ).length ) ) {
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_saved_global_modal' );
if ( 'module' === et_pb_options.global_module_type ) {
et_pb_add_selective_sync_buttons( $( '.et_pb_modal_settings_container' ), et_pb_options.template_post_id );
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_modal_selective_sync' );
}
}
},
removeModule : function( event ) {
var global_module_cid = '';
if ( this.isModuleLocked() ) {
return;
}
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( this.model.get( 'cid' ), 'module' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
// Check for unremovable subject status
if ( ET_PageBuilder_AB_Testing.is_unremovable_subject( this.model ) && ! ET_PageBuilder_Layout.get( 'forceRemove' ) ) {
return;
}
}
if ( event ) {
event.preventDefault();
if ( ( this.$el.closest( '.et_pb_section.et_pb_global' ).length || this.$el.closest( '.et_pb_row.et_pb_global' ).length ) && '' === et_pb_options.template_post_id ) {
global_module_cid = et_pb_get_global_parent_cid( this );
}
}
this.model.destroy();
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'removed', 'module', this.model.get( 'admin_label' ) );
ET_PageBuilder_Layout.removeView( this.model.get('cid') );
this.remove();
// if single module is removed from the builder
if ( event ) {
ET_PageBuilder_Events.trigger( 'et-module:removed' );
}
if ( '' !== global_module_cid ) {
et_pb_update_global_template( global_module_cid );
}
// Run Split Testing updater
ET_PageBuilder_AB_Testing.update();
},
unlockModule : function( event ) {
event.preventDefault();
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
var this_el = this,
$parent = this_el.$el.closest('.et_pb_module_block'),
request = et_pb_user_lock_permissions(),
parent_views;
request.done( function ( response ) {
if ( true === response ) {
$parent.removeClass('et_pb_locked');
// Add attribute to shortcode
this_el.options.model.attributes.et_pb_locked = 'off';
parent_views = ET_PageBuilder_Layout.getParentViews( this_el.model.get('parent') );
_.each( parent_views, function( view, key ) {
if ( ! ET_PageBuilder_Layout.isChildrenLocked( view.model.get( 'cid' ) ) ) {
view.$el.removeClass('et_pb_children_locked');
}
} );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'unlocked', 'module', this_el.options.model.get( 'admin_label' ) );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
} else {
alert( et_pb_options.locked_module_permission_alert );
}
});
},
isModuleLocked : function() {
if ( 'on' === this.model.get( 'et_pb_locked' ) || 'on' === this.model.get( 'et_pb_parent_locked' ) ) {
return true;
}
return false;
},
showRightClickOptions : function( event ) {
event.preventDefault();
var et_right_click_options_view,
view_settings = {
model : this.model,
view : this.$el,
view_event : event
};
et_right_click_options_view = new ET_PageBuilder.RightClickOptionsView( view_settings );
},
hideRightClickOptions : function( event ) {
event.preventDefault();
et_pb_close_all_right_click_options();
},
setABTesting : function ( event ) {
event.preventDefault();
event.stopPropagation();
ET_PageBuilder_AB_Testing.set( this, event );
}
} );
ET_PageBuilder.HelpView = window.wp.Backbone.View.extend({
tagName: 'div',
id: 'et-builder-help',
className: 'et_pb_modal_settings',
template : _.template( $( '#et-builder-help-template' ).html() ),
isOSX: navigator.userAgent.indexOf('Mac OS X') != -1,
renderKbd: function(kbd) {
var key = kbd;
if (key === 'super') {
if (this.isOSX) {
key = 'cmd';
} else {
key = 'ctrl';
}
}
return $('<kbd />', {
class: 'key-' + key,
}).html(key);
},
render: function() {
var thisClass = this;
var $thisModal = this.$el;
et_pb_close_all_right_click_options();
$thisModal.html( this.template() );
var $shortcutTab = $thisModal.find('.et-pb-shortcuts-tab');
_.each(et_pb_help_options.shortcuts, function(shortcutSets){
_.each(shortcutSets, function(shortcutSet) {
if (_.isUndefined(shortcutSet.title)) {
// Define item
var $shortcutItem = $('<p />', {
class: 'et-pb-shortcut-item'
});
// Build shortcut keys
var $shortcutKeys = $('<span />', {
class: 'et-pb-shortcut-keys'
});
_.each(shortcutSet.kbd, function(shortcutKey, shortcutKeyIndex) {
// Append + divider
if (shortcutKeyIndex > 0) {
$shortcutKeys.append(' + ');
}
if (_.isArray(shortcutKey)) {
_.each(shortcutKey, function(shortcutOption, shortcutOptionIndex) {
if (shortcutOptionIndex > 0) {
$shortcutKeys.append(' / ');
}
$shortcutKeys.append(
$('<kbd />').html(shortcutOption)
);
});
} else {
$shortcutKeys.append(
// $('<kbd />').html(shortcutKey)
thisClass.renderKbd(shortcutKey)
);
}
});
// Append shortcut keys
$shortcutItem.append($shortcutKeys);
// Append description
$shortcutItem.append(
$('<span />', {
class: 'et-pb-shortcut-desc'
}).html(shortcutSet.desc)
);
// Append Item
$shortcutTab.append($shortcutItem);
} else {
$shortcutTab.append(
$('<h2 />', {class: 'et-pb-shortcut-subtitle'}).html(shortcutSet.title)
);
}
});
});
return this;
}
});
ET_PageBuilder.RightClickOptionsView = window.wp.Backbone.View.extend( {
tagName : 'div',
id : 'et-builder-right-click-controls',
template : _.template( $('#et-builder-right-click-controls-template').html() ),
events : {
'click .et-pb-right-click-rename' : 'rename',
'click .et-pb-right-click-start-ab-testing' : 'startABTesting',
'click .et-pb-right-click-end-ab-testing' : 'endABTesting',
'click .et-pb-right-click-save-to-library' : 'saveToLibrary',
'click .et-pb-right-click-undo' : 'undo',
'click .et-pb-right-click-redo' : 'redo',
'click .et-pb-right-click-disable' : 'disable',
'click .et_pb_disable_on_option' : 'disable_device',
'click .et-pb-right-click-lock' : 'lock',
'click .et-pb-right-click-collapse' : 'collapse',
'click .et-pb-right-click-copy' : 'copy',
'click .et-pb-right-click-paste-after' : 'pasteAfter',
'click .et-pb-right-click-paste-app' : 'pasteApp',
'click .et-pb-right-click-paste-column' : 'pasteColumn',
'click .et-pb-right-click-preview' : 'preview',
'click .et-pb-right-click-disable-global' : 'disableGlobal'
},
initialize : function( attributes, skip_render ) {
var skip_render = _.isUndefined( skip_render ) ? false : skip_render,
allowed_library_clipboard_content;
this.type = this.options.model.attributes.type;
this.et_pb_has_storage_support = et_pb_has_storage_support();
this.has_compatible_clipboard_content = ET_PB_Clipboard.get( this.getClipboardType() );
this.history_noun = this.type === 'row_inner' ? 'row' : this.type;
if ( ET_PageBuilder_App.isLoading ) {
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting() ) {
return;
}
// Divi Library adjustment
if ( et_pb_options.is_divi_library === '1' && this.has_compatible_clipboard_content !== false ) {
// There are four recognized layout type: layout, section, row, module
switch( et_pb_options.layout_type ) {
case 'module' :
allowed_library_clipboard_content = [];
break;
case 'row' :
allowed_library_clipboard_content = ['module'];
break;
case 'section' :
allowed_library_clipboard_content = ['module', 'row'];
break;
default :
allowed_library_clipboard_content = ['module', 'row', 'section'];
break;
}
// If current clipboard type isn't allowed, disable pasteAfter
if ( $.inArray( this.type, allowed_library_clipboard_content ) == -1 ) {
this.has_compatible_clipboard_content = false;
}
}
// Enable right options control rendering to be skipped
if ( skip_render === false ) {
this.render();
}
},
render : function() {
var $parent = $( this.options.view ),
$options_wrap = this.$el.html( this.template() ),
view_offset = this.options.view.offset(),
parent_offset_x = this.options.view_event.pageX - view_offset.left - 100,
parent_offset_y = this.options.view_event.pageY - view_offset.top;
// close other options, if there's any
this.closeAllRightClickOptions();
// Prevent recursive right click options
if ( $( this.options.view_event.toElement ).is('#et-builder-right-click-controls a') ) {
return;
}
// Don't display empty right click options
if ( $options_wrap.find('li').length < 1 ) {
return;
}
// Append options to the page
$parent.append( $options_wrap );
// Fixing options' position and animating it
$options_wrap.find('.options').css({
'top' : parent_offset_y,
'left' : parent_offset_x,
'margin-top': ( 0 - $options_wrap.find('.options').height() - 40 ),
}).animate({
'margin-top': ( 0 - $options_wrap.find('.options').height() - 10 ),
'opacity' : 1
}, 300 );
// Add full screen page overlay (right/left click anywhere outside builder to close options)
$('#et_pb_layout').prepend('<div id="et_pb_layout_right_click_overlay" />');
},
closeAllRightClickOptions : function() {
et_pb_close_all_right_click_options();
return false;
},
rename : function( event ) {
event.preventDefault();
var $parent = this.$el.parent(),
cid = this.options.model.attributes.cid;
et_pb_create_prompt_modal( 'rename_admin_label', cid );
// close the click right options
this.closeAllRightClickOptions();
},
startABTesting : function ( event ) {
// Close right click options UI
this.closeAllRightClickOptions();
// Turn on Split Testing state
ET_PageBuilder_AB_Testing.toggle_status( true );
// Disable publish button
ET_PageBuilder_App.disable_publish = true;
$( '#publish' ).addClass( 'disabled' );
// Check DB existence
ET_PageBuilder_AB_Testing.check_create_db();
// Turn on Split testing subject selection mode
ET_PageBuilder_App.is_selecting_ab_testing_subject = true;
// Adding nescesarry class for Split testing subject selection mode's UI
$( '#et_pb_layout' ).addClass( 'et_pb_select_ab_testing_subject' );
},
endABTesting : function ( event ) {
// Close right click options UI
this.closeAllRightClickOptions();
// Set split test to off
ET_PageBuilder_AB_Testing.toggle_status( false );
// Turn off Split testing subject selection mode
ET_PageBuilder_App.is_selecting_ab_testing_subject = false;
// Check against "on to off" or "off to off" state
if ( ET_PageBuilder_AB_Testing.count_subjects() > 0 ) {
et_pb_create_prompt_modal( 'turn_off_ab_testing' );
}
},
disableGlobal : function ( event ) {
event.preventDefault();
// Close right click options UI
this.closeAllRightClickOptions();
// Remove global attributes from the module
ET_PageBuilder_Layout.removeGlobalAttributes( this );
// Update content and reinit layout
et_reinitialize_builder_layout();
},
saveToLibrary : function ( event ) {
event.preventDefault();
var model = this.options.model,
type = model.attributes.type,
view_settings = {
model : model,
collection : ET_PageBuilder_Modules,
attributes : {
'data-open_view' : 'module_settings'
}
};
// Close right click options UI
this.closeAllRightClickOptions();
if ( ET_PageBuilder_AB_Testing.is_active() && ( ET_PageBuilder_AB_Testing.is_split_test_item( model ) || type === 'app' ) ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_save_' + type + '_layout_has_ab_testing' );
return;
}
if ( this.type === 'app' ) {
// Init save current page to library modal view
et_pb_create_prompt_modal( 'save_layout' );
} else {
// Init modal view
modal_view = new ET_PageBuilder.ModalView( view_settings );
// Append modal view
$('body').append( modal_view.render().el );
// set initial active tab for partially saved module templates.
et_pb_open_current_tab();
// Init save template modal view
modal_view.saveTemplate( event );
}
},
undo : function( event ) {
event.preventDefault();
// Undoing...
ET_PageBuilder_App.undo( event );
// Close right click options UI
this.closeAllRightClickOptions();
},
redo : function( event ) {
event.preventDefault();
// Redoing...
ET_PageBuilder_App.redo( event );
// Close right click options UI
this.closeAllRightClickOptions();
},
disable : function( event ) {
event.preventDefault();
var $this_button = $( event.target ).hasClass( 'et-pb-right-click-disable' ) ? $( event.target ) : $( event.target ).closest( 'a' ),
this_options_container = $this_button.closest( 'li' ).find( 'span.et_pb_disable_on_options' ),
single_options = this_options_container.find( 'span.et_pb_disable_on_option' ),
is_all_disabled = typeof this.options.model.attributes.et_pb_disabled !== 'undefined' && 'on' === this.options.model.attributes.et_pb_disabled ? true : false,
disabled_on = typeof this.options.model.attributes.et_pb_disabled_on !== 'undefined' ? this.options.model.attributes.et_pb_disabled_on : '',
disabled_on_array,
i,
device;
$this_button.addClass( 'et_pb_right_click_hidden' );
this_options_container.addClass( 'et_pb_right_click_visible' );
// backward compatibility with old option
if ( is_all_disabled ) {
single_options.addClass( 'et_pb_disable_on_active' );
} else if ( '' !== disabled_on ) {
disabled_on_array = disabled_on.split('|');
i = 0,
device = 'phone';
single_options.each( function() {
var this_option = $( this );
if ( this_option.hasClass( 'et_pb_disable_on_' + device ) && 'on' === disabled_on_array[ i ] ) {
this_option.addClass( 'et_pb_disable_on_active' );
}
i++;
device = 1 === i ? 'tablet' : 'desktop';
} );
}
return false;
},
disable_device : function( event ) {
var $this_button = $( event.target ),
this_option = $( this ),
new_option_state = $this_button.hasClass( 'et_pb_disable_on_active' ) ? 'off' : 'on',
disabled_on = typeof this.options.model.attributes.et_pb_disabled_on !== 'undefined' ? this.options.model.attributes.et_pb_disabled_on : '',
$parent = this.$el.parent(),
history_verb,
disabled_on_array,
option_index,
history_addition;
// determine which option should be updated, Phone, Tablet or Desktop.
if ( $this_button.hasClass( 'et_pb_disable_on_phone' ) ) {
option_index = 0;
history_addition = 'phone';
} else if ( $this_button.hasClass( 'et_pb_disable_on_tablet' ) ) {
option_index = 1;
history_addition = 'tablet';
} else {
option_index = 2;
history_addition = 'desktop';
}
if ( '' !== disabled_on ) {
disabled_on_array = disabled_on.split('|');
} else {
disabled_on_array = ['','',''];
}
disabled_on_array[ option_index ] = new_option_state;
this.options.model.attributes.et_pb_disabled_on = disabled_on_array[0] + '|' + disabled_on_array[1] + '|' + disabled_on_array[2];
if ( 'on' === disabled_on_array[0] && 'on' === disabled_on_array[1] && 'on' === disabled_on_array[2] ) {
parent_background_color = $parent.css('backgroundColor');
$parent.addClass('et_pb_disabled');
// Add attribute to shortcode
this.options.model.attributes.et_pb_disabled = 'on';
history_verb = 'disabled';
} else {
// toggle et_pb_disabled class
$parent.removeClass( 'et_pb_disabled' );
// Remove attribute to shortcode
this.options.model.attributes.et_pb_disabled = 'off';
history_verb = 'off' === new_option_state ? 'enabled' : 'disabled';
}
$this_button.toggleClass( 'et_pb_disable_on_active' );
// Update global module
this.updateGlobalModule();
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( history_verb, this.history_noun, undefined, history_addition );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
return false;
},
lock : function( event ) {
event.preventDefault();
var $parent = this.$el.parent();
// toggle et_pb_locked class
if ( $parent.hasClass('et_pb_locked') ) {
this.unlockItem();
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'unlocked', this.history_noun );
} else {
this.lockItem();
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'locked', this.history_noun );
}
// close the click right options
this.closeAllRightClickOptions();
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
},
unlockItem : function() {
var this_el = this,
$parent = this_el.$el.parent(),
request = et_pb_user_lock_permissions(),
children_views,
parent_views;
request.done( function ( response ) {
if ( true === response ) {
$parent.removeClass('et_pb_locked');
// Add attribute to shortcode
this_el.options.model.attributes.et_pb_locked = 'off';
if ( 'module' !== this_el.options.model.get( 'type' ) ) {
children_views = ET_PageBuilder_Layout.getChildrenViews( this_el.model.get('cid') );
_.each( children_views, function( view, key ) {
view.$el.removeClass('et_pb_parent_locked');
view.model.set( 'et_pb_parent_locked', 'off', { silent : true } );
} );
}
if ( 'section' !== this_el.options.model.get( 'type' ) ) {
parent_views = ET_PageBuilder_Layout.getParentViews( this_el.model.get( 'parent' ) );
_.each( parent_views, function( view, key ) {
if ( ! ET_PageBuilder_Layout.isChildrenLocked( view.model.get( 'cid' ) ) ) {
view.$el.removeClass('et_pb_children_locked');
}
} );
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'unlocked', this_el.history_noun );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
// Update global module
this_el.updateGlobalModule();
} else {
alert( et_pb_options.locked_item_permission_alert );
}
});
},
lockItem : function() {
var this_el = this,
$parent = this_el.$el.parent(),
request = et_pb_user_lock_permissions(),
children_views,
parent_views;
request.done( function ( response ) {
if ( true === response ) {
$parent.addClass('et_pb_locked');
// Add attribute to shortcode
this_el.options.model.attributes.et_pb_locked = 'on';
if ( 'module' !== this_el.options.model.get( 'type' ) ) {
children_views = ET_PageBuilder_Layout.getChildrenViews( this_el.model.get('cid') );
_.each( children_views, function( view, key ) {
view.$el.addClass('et_pb_parent_locked');
view.model.set( 'et_pb_parent_locked', 'on', { silent : true } );
} );
}
if ( 'section' !== this_el.options.model.get( 'type' ) ) {
parent_views = ET_PageBuilder_Layout.getParentViews( this_el.model.get( 'parent' ) );
_.each( parent_views, function( view, key ) {
view.$el.addClass( 'et_pb_children_locked' );
} );
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'locked', this_el.history_noun );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
// Update global module
this_el.updateGlobalModule();
} else {
alert( et_pb_options.locked_item_permission_alert );
}
});
},
collapse : function( event ) {
event.preventDefault();
var $parent = this.$el.parent(),
cid = this.options.model.attributes.cid,
history_verb;
$parent.toggleClass('et_pb_collapsed');
if ( $parent.hasClass('et_pb_collapsed') ) {
// Add attribute to shortcode
this.options.model.attributes.et_pb_collapsed = 'on';
history_verb = 'collapsed';
} else {
// Add attribute to shortcode
this.options.model.attributes.et_pb_collapsed = 'off';
history_verb = 'expanded';
}
// Carousel effect for split testing subject
if ( ET_PageBuilder_AB_Testing.is_active() && this.model.get( 'et_pb_ab_subject' ) === 'on' ) {
ET_PageBuilder_AB_Testing.subject_carousel( cid );
}
// Update global module
this.updateGlobalModule();
// close the click right options
this.closeAllRightClickOptions();
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( history_verb, this.history_noun );
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
},
copy : function( event, keepEvent ) {
if ( ! keepEvent ) {
event.preventDefault();
}
var module_attributes = _.clone( this.model.attributes ),
type = module_attributes.type,
clipboard_content;
// Normalize row_inner as row. Specialty's section row is detected as row_inner
// but selector-wise, there's no .et_pb_row_inner. It uses the same .et_pb_row
if ( type === 'row_inner' ) {
type = 'row';
}
// Delete circular structure element carried by default by specialty section's row inner
if ( ! _.isUndefined( module_attributes.view ) ) {
delete module_attributes.view;
}
// Delete appendAfter element, its leftover can cause misunderstanding on rendering UI
if ( ! _.isUndefined( module_attributes.appendAfter ) ) {
delete module_attributes.appendAfter;
}
// append childview's data to mobile_attributes for row and section
if ( type === 'row' || type === 'section' ) {
module_attributes.childviews = this.getChildViews( module_attributes.cid );
}
delete module_attributes.className;
delete module_attributes.et_pb_locked;
// Set clipboard content
clipboard_content = JSON.stringify( module_attributes );
// Save content to clipboard
ET_PB_Clipboard.set( this.getClipboardType(), clipboard_content );
// close the click right options
this.closeAllRightClickOptions();
},
pasteAfter : function( event, parent, clipboard_type, has_cloned_cid, keepEvent, noHistory ) {
if ( ! keepEvent ) {
event.preventDefault();
}
var parent = _.isUndefined( parent ) ? this.model.get( 'parent' ) : parent;
var clipboard_type = _.isUndefined( clipboard_type ) ? this.getClipboardType() : clipboard_type;
var has_cloned_cid = _.isUndefined( has_cloned_cid ) ? true : has_cloned_cid;
var parent_view = ET_PageBuilder_Layout.getView( parent );
var clipboard_content;
// Get clipboard content
clipboard_content = ET_PB_Clipboard.get( clipboard_type );
clipboard_content = JSON.parse( clipboard_content );
// If current clipboard content is Split testing subject, assign new subject ID
if ( ! _.isUndefined( clipboard_content.et_pb_ab_subject ) || 'on' === clipboard_content.et_pb_ab_subject ) {
clipboard_content.et_pb_ab_subject_id = ET_PageBuilder_AB_Testing.get_subject_id();
}
if ( has_cloned_cid ) {
clipboard_content.cloned_cid = this.model.get( 'cid' );
}
// Paste views recursively
this.setPasteViews( clipboard_content, parent, 'main_parent' );
// Carousel effect for split testing subject
if ( ET_PageBuilder_AB_Testing.is_active() && ( clipboard_content.type === 'row' || clipboard_content.type === 'row_inner' || clipboard_content.type === 'section' ) && clipboard_content.et_pb_ab_subject === 'on' ) {
ET_PageBuilder_AB_Testing.subject_carousel( clipboard_content.cid );
}
// Trigger events
ET_PageBuilder_Events.trigger( 'et-advanced-module:updated' );
ET_PageBuilder_Events.trigger( 'et-advanced-module:saved' );
// Update global module. Need to update global module only when pasting into Global parent
if ( ! _.isUndefined( parent_view ) && ( ET_PageBuilder_Layout.is_global( parent_view.model ) || ET_PageBuilder_Layout.is_global_children( parent_view.model ) ) ) {
this.updateGlobalModule();
}
// close the click right options
this.closeAllRightClickOptions();
// Enable history saving and set meta for history
// pasteAfter can be used for clone, so only use copied if history verb being used is default
if ( ET_PageBuilder_Visualize_Histories.verb === 'did' && ! noHistory ) {
ET_PageBuilder_App.allowHistorySaving( 'copied', this.history_noun );
}
if ( ! keepEvent ) {
// Rebuild shortcodes
ET_PageBuilder_App.saveAsShortcode();
}
},
pasteApp : function( event ) {
event.preventDefault();
// Get last' section model
var sections = ET_PageBuilder_Modules.where({ 'type' : 'section' }),
last_section = _.last( sections );
// Set last section as this.model and this.options.model so setPasteViews() can parse the clipboard correctly
this.model = last_section;
this.options.model = last_section;
// Paste Item
this.pasteAfter( event, undefined, 'et_pb_clipboard_section', false );
},
pasteColumn : function( event ) {
event.preventDefault();
var parent = this.model.get( 'cid' ),
clipboard_type = this.model.get('type') === 'section' ? 'et_pb_clipboard_module_fullwidth' : 'et_pb_clipboard_module';
// Paste item
this.pasteAfter( event, parent, clipboard_type, false );
},
getClipboardType : function() {
var type = this.model.attributes.type,
module_type = _.isUndefined( this.model.attributes.module_type ) ? this.model.attributes.type : this.model.attributes.module_type,
clipboard_key = 'et_pb_clipboard_' + type,
fullwidth_prefix = 'et_pb_fullwidth';
// Added fullwidth prefix
if ( module_type.substr( 0, fullwidth_prefix.length ) === fullwidth_prefix ) {
clipboard_key += '_fullwidth';
}
return clipboard_key;
},
getChildViews : function( parent ) {
var this_el = this,
views = ET_PageBuilder_Modules.models,
child_attributes,
child_views = [];
_.each( views, function( view, key ) {
if ( view.attributes.parent === parent ) {
child_attributes = view.attributes;
// Delete circular structure element carried by default by specialty section's row inner
if ( ! _.isUndefined( child_attributes.view ) ) {
delete child_attributes.view;
}
// Delete appendAfter element, its leftover can cause misunderstanding on rendering UI
if ( ! _.isUndefined( child_attributes.appendAfter ) ) {
delete child_attributes.appendAfter;
}
child_attributes.created = 'manually';
// Append grand child views, if there's any
child_attributes.childviews = this_el.getChildViews( view.attributes.cid );
child_views.push( child_attributes );
}
} );
return child_views;
},
setPasteViews : function( view, parent, is_main_parent ) {
var this_el = this,
cid = ET_PageBuilder_Layout.generateNewId(),
view_index = this.model.collection.indexOf( this.model ),
childviews = ( ! _.isUndefined( view.childviews ) && _.isArray( view.childviews ) ) ? view.childviews : false,
global_module_elements = [ 'et_pb_global_parent', 'global_parent_cid' ];
// Add newly generated cid and parent to the pasted view
view.cid = cid;
view.parent = parent;
if ( typeof is_main_parent !== 'undefined' && 'main_parent' === is_main_parent ) {
view.pasted_module = true;
} else {
view.pasted_module = false;
}
// update global parent attribute when pasting the module from Global Row or Section.
if ( ! _.isUndefined( view.et_pb_global_parent ) && '' !== view.et_pb_global_parent ) {
view.et_pb_global_parent = et_pb_get_global_parent_cid( ET_PageBuilder_Layout.getView( parent ) );
}
// Set new global_parent_cid for pasted element
if ( ! _.isUndefined( view.et_pb_global_module ) && _.isUndefined( view.global_parent_cid ) && _.isUndefined( this.set_global_parent_cid ) ) {
this.global_parent_cid = cid;
this.set_global_parent_cid = true;
}
if ( ! _.isUndefined( view.global_parent_cid ) ) {
view.global_parent_cid = this.global_parent_cid;
}
// If the view is pasted inside global module, inherit its global module child attributes
_.each( global_module_elements, function( global_module_element ) {
if ( ! _.isUndefined( this_el.options.model.get( global_module_element ) ) && _.isUndefined( view[ global_module_element ] ) ) {
view[ global_module_element ] = this_el.options.model.get( global_module_element );
}
} );
// Remove template type leftover. Template type is used by Divi Library to remove item's settings and clone button
if ( ! _.isUndefined( view.et_pb_template_type ) ) {
delete view.et_pb_template_type;
}
// If current view is Split testing subject, assign new subject ID
if ( ! _.isUndefined( view.et_pb_ab_subject ) || 'on' === view.et_pb_ab_subject ) {
view.et_pb_ab_subject_id = ET_PageBuilder_AB_Testing.get_subject_id();
}
// Delete unused childviews
delete view.childviews;
// add default Admin Label if not defined
if ( _.isUndefined( view.admin_label ) ) {
view.admin_label = ! _.isUndefined( view.module_type ) ? ET_PageBuilder_Layout.getDefaultAdminLabel( view.module_type ) : '';
}
// Add view to collections
this.model.collection.add( view, { at : view_index } );
// If current view has childviews (row & module), repeat the process above recursively
if ( childviews ) {
_.each( childviews, function( childview ){
this_el.setPasteViews( childview, cid );
});
};
},
updateGlobalModule : function () {
var global_module_cid;
if ( ET_PageBuilder_Layout.is_global( this.model ) ) {
global_module_cid = this.options.model.get( 'cid' );
} else if ( ET_PageBuilder_Layout.is_global_children( this.model ) ) {
global_module_cid = this.options.model.get( 'global_parent_cid' );
}
if ( ! _.isUndefined( global_module_cid ) ) {
et_pb_update_global_template( global_module_cid );
}
},
hasOption : function( option_name ) {
var cid = typeof this.model.get === 'function' ? this.model.get( 'cid' ) : false,
has_option = false,
type = this.options.model.attributes.type,
is_ab_active = ET_PageBuilder_AB_Testing.is_active(),
is_ab_goal = is_ab_active ? ET_PageBuilder_AB_Testing.is_goal( this.model ) : false,
is_ab_goal_children = is_ab_active ? ET_PageBuilder_AB_Testing.is_goal_children( this.model ) : false,
has_ab_goal = is_ab_active ? ET_PageBuilder_AB_Testing.has_goal( this.model ) : false,
is_ab_subject= is_ab_active ? ET_PageBuilder_AB_Testing.is_subject( this.model ) : false,
is_ab_subject_children = is_ab_active ? ET_PageBuilder_AB_Testing.is_subject_children( this.model ) : false,
is_ab_allowed_change = is_ab_active ? ET_PageBuilder_AB_Testing.is_user_has_permission( cid, 'right_click_change' ) : true,
is_ab_allowed_copy = is_ab_active ? ET_PageBuilder_AB_Testing.is_user_has_permission( cid, 'copy' ) : true,
is_ab_allowed_paste = is_ab_active ? ET_PageBuilder_AB_Testing.is_user_has_permission( cid, 'paste' ) : true;
switch( option_name ) {
case "rename" :
if ( this.hasOptionSupport( [ "module", "section", "row_inner", "row" ] ) &&
this.options.model.attributes.et_pb_locked !== "on" &&
is_ab_allowed_change ) {
has_option = true;
}
break;
case "save-to-library" :
if ( this.hasOptionSupport( [ "app", "section", "row_inner", "row", "module" ] ) &&
! ET_PageBuilder_Layout.is_global( this.options.model ) &&
! ET_PageBuilder_Layout.is_global_children( this.options.model ) &&
this.options.model.attributes.et_pb_locked !== "on" &&
! ( ET_PageBuilder_AB_Testing.is_active() && ( ET_PageBuilder_AB_Testing.is_split_test_item( this.options.model ) || type === 'app' ) ) &&
et_pb_options.is_divi_library !== "1" ) {
has_option = true;
}
break;
case "start-ab-testing" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
! is_ab_active ) {
has_option = true;
}
break;
case "end-ab-testing" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
( is_ab_subject || is_ab_goal || is_ab_subject_children || is_ab_goal_children ) &&
is_ab_active ) {
has_option = true;
}
break;
case "disable-global" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
( ET_PageBuilder_Layout.is_global( this.options.model ) || ET_PageBuilder_Layout.is_global_children( this.options.model) )
) {
has_option = true;
}
break;
case "undo" :
if ( this.hasOptionSupport( [ "app", "section", "row_inner", "row", "column", "column_inner", "module" ] ) &&
this.hasUndo() ) {
has_option = true;
}
break;
case "redo" :
if ( this.hasOptionSupport( [ "app", "section", "row_inner", "row", "column", "column_inner", "module" ] ) &&
this.hasRedo() ) {
has_option = true;
}
break;
case "disable" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
this.options.model.attributes.et_pb_locked !== "on" &&
this.hasDisabledParent() === false &&
_.isUndefined( this.model.attributes.et_pb_skip_module ) &&
is_ab_allowed_change ) {
has_option = true;
}
break;
case "lock" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
_.isUndefined( this.model.attributes.et_pb_skip_module ) &&
is_ab_allowed_change ) {
has_option = true;
}
break;
case "collapse" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row" ] ) &&
this.options.model.attributes.et_pb_locked !== "on" &&
! ( ET_PageBuilder_AB_Testing.is_active() && this.options.model.get( 'et_pb_ab_subject' ) === "on" && ( this.options.model.get( 'et_pb_collapsed' ) === "off" || _.isUndefined( this.options.model.get( 'et_pb_collapsed' ) ) ) ) &&
_.isUndefined( this.model.attributes.et_pb_skip_module ) ) {
has_option = true;
}
break;
case "copy" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
this.et_pb_has_storage_support &&
_.isUndefined( this.model.attributes.et_pb_skip_module ) &&
is_ab_allowed_copy &&
! is_ab_goal &&
! has_ab_goal ) {
has_option = true;
}
break;
case "paste-after" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
this.et_pb_has_storage_support &&
this.has_compatible_clipboard_content &&
is_ab_allowed_paste ) {
has_option = true;
}
break;
case "paste-app" :
if ( this.hasOptionSupport( [ "app" ] ) &&
this.et_pb_has_storage_support &&
ET_PB_Clipboard.get( "et_pb_clipboard_section" ) ) {
has_option = true;
}
break;
case "paste-column" :
if ( ! _.isUndefined( this.model.attributes.is_insert_module ) &&
( ( ( this.type === "column" || this.type == "column_inner" ) && ET_PB_Clipboard.get( "et_pb_clipboard_module" ) ) || ( this.type === "section" && ET_PB_Clipboard.get( "et_pb_clipboard_module_fullwidth" ) ) ) &&
this.et_pb_has_storage_support ) {
has_option = true;
}
break;
case "preview" :
if ( this.hasOptionSupport( [ "section", "row_inner", "row", "module" ] ) &&
this.options.model.attributes.et_pb_locked !== "on" ) {
has_option = true;
}
break;
}
return has_option;
},
hasOptionSupport : function( whitelisted_types ) {
if ( _.isUndefined( _.findWhere( whitelisted_types, this.type ) ) ) {
return false;
}
return true;
},
hasUndo : function() {
return ET_PageBuilder_App.hasUndo();
},
hasRedo : function() {
return ET_PageBuilder_App.hasRedo();
},
hasDisabledParent : function() {
var parent_view = ET_PageBuilder_Layout.getView( this.model.attributes.parent ),
parent_views = {},
has_disabled_parents = false;
// Loop until parent_view is undefined (reaches section)
while ( ! _.isUndefined( parent_view ) ) {
// Check whether current parent is disabled or not
if ( ! _.isUndefined( parent_view.model.attributes.et_pb_disabled ) && parent_view.model.attributes.et_pb_disabled === "on" ) {
has_disabled_parents = true;
}
// Append views to object
parent_views[parent_view.model.attributes.cid] = parent_view;
// Refresh parent_view for new loop
parent_view = ET_PageBuilder_Layout.getView( parent_view.model.attributes.parent );
}
return has_disabled_parents;
},
preview : function( event ) {
event.preventDefault();
// Get item's view
var view = ET_PageBuilder_Layout.getView( this.model.get( 'cid' ) );
// Close all right click options
this.closeAllRightClickOptions();
// Tell view that it is initiated from right click options so it can tell modalView
view.triggered_by_right_click = true;
// Tell modal view that this instance is intended for previewing
// This is specifically needed for global module
view.do_preview = true;
// Display ModalView
view.showSettings( event );
// Emulate preview clicking
$('.et-pb-modal-preview-template').trigger( 'click' );
}
} );
ET_PageBuilder.visualizeHistoriesView = window.wp.Backbone.View.extend( {
el : '#et-pb-histories-visualizer',
template : _.template( $('#et-builder-histories-visualizer-item-template').html() ),
events : {
'click li' : 'rollback'
},
verb : 'did',
noun : 'module',
noun_alias : undefined,
addition : '',
getItemID : function( model ) {
return '#et-pb-history-' + model.get( 'timestamp' );
},
getVerb : function() {
var verb = this.verb;
if ( ! _.isUndefined( et_pb_options.verb[verb] ) ) {
verb = et_pb_options.verb[verb];
}
return verb;
},
getNoun : function() {
var noun = this.noun;
if ( ! _.isUndefined( this.noun_alias ) ) {
noun = this.noun_alias;
} else if ( ! _.isUndefined( et_pb_options.noun[noun] ) ) {
noun = et_pb_options.noun[noun];
}
return noun;
},
getAddition : function() {
var addition = this.addition;
if ( ! _.isUndefined( et_pb_options.addition[addition] ) ) {
addition = et_pb_options.addition[addition];
}
return addition;
},
addItem : function( model ) {
// Setting the passed model as class' options so the template can be rendered correctly
this.options = model;
// Prepend history item to container
this.$el.prepend( this.template() );
// Fix max-height for history visualizer
this.setHistoriesHeight();
},
changeItem : function( model ) {
var item_id = this.getItemID( model ),
$item = $( item_id ),
active_model = model.collection.findWhere({ current_active_history : true }),
active_index = model.collection.indexOf( active_model ),
item_index = model.collection.indexOf( model );
// Setting the passed model as class' options so the template can be rendered correctly
this.options = model;
// Remove all class related to changed item
this.$el.find('li').removeClass( 'undo redo active' );
// Update currently item class, relative to current index
// Use class change instead of redraw the whole index using template() because verb+noun changing is too tricky
if ( active_index === item_index ) {
$item.addClass( 'active' );
this.$el.find('li:lt('+ $item.index() +')').addClass( 'redo' );
this.$el.find('li:gt('+ $item.index() +')').addClass( 'undo' );
} else {
// Change upon history is tricky because there is no active model found. Assume that everything is undo action
this.$el.find('li:not( .active, .redo )').addClass( 'undo' );
}
// Fix max-height for history visualizer
this.setHistoriesHeight();
},
removeItem : function( model ) {
var item_id = this.getItemID( model );
// Remove model's item from UI
this.$el.find( item_id ).remove();
// Fix max-height for history visualizer
this.setHistoriesHeight();
},
setHistoryMeta : function( verb, noun, noun_alias, addition ) {
if ( ! _.isUndefined( verb ) ) {
this.verb = verb;
}
if ( ! _.isUndefined( noun ) ) {
this.noun = noun;
}
if ( ! _.isUndefined( noun_alias ) ) {
this.noun_alias = noun_alias;
} else {
this.noun_alias = undefined;
}
if ( ! _.isUndefined( addition ) ) {
this.addition = addition;
}
},
setHistoriesHeight : function() {
var this_el = this;
// Wait for 200 ms before making change to ensure that $layout has been changed
setTimeout( function(){
var $layout = $( '#et_pb_layout' ),
$layout_header = $layout.find( '.hndle' ),
$layout_controls = $( '#et_pb_layout_controls' ),
visualizer_height = $layout.outerHeight() - $layout_header.outerHeight() - $layout_controls.outerHeight();
this_el.$el.css({ 'max-height' : visualizer_height });
}, 200 );
},
rollback : function( event ) {
event.preventDefault();
var this_el = this,
$clicked_el = $( event.target ),
$this_el = $clicked_el.is( 'li' ) ? $clicked_el : $clicked_el.parent('li'),
timestamp = $this_el.data( 'timestamp' ),
model = this.options.collection.findWhere({ timestamp : timestamp }),
shortcode = model.get( 'shortcode' );
// Turn off other current_active_history
ET_PageBuilder_App.resetCurrentActiveHistoryMarker();
// Update undo model's current_active_history
model.set( { current_active_history : true });
// add loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
// Set shortcode to editor
et_pb_set_content( 'content', shortcode, 'saving_to_content' );
// Rebuild the builder
setTimeout( function(){
var $builder_container = $( '#et_pb_layout' ),
builder_height = $builder_container.innerHeight();
$builder_container.css( { 'height' : builder_height } );
ET_PageBuilder_App.removeAllSections();
ET_PageBuilder_App.$el.find( '.et_pb_section' ).remove();
// Ensure that no history is added for rollback
ET_PageBuilder_App.enable_history = false;
ET_PageBuilder_App.createLayoutFromContent( et_prepare_template_content( shortcode ), '', '', { is_reinit : 'reinit' } );
// Auto turn on Split Testing if the history has Split testing data
if ( ET_PageBuilder_AB_Testing.is_active_based_on_models() ) {
ET_PageBuilder_AB_Testing.toggle_status( true );
et_reinitialize_builder_layout();
} else {
ET_PageBuilder_AB_Testing.toggle_status( false );
}
$builder_container.css( { 'height' : 'auto' } );
// remove loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
// Update undo button state
ET_PageBuilder_App.updateHistoriesButtonState();
}, 600 );
}
} );
ET_PageBuilder.AppView = window.wp.Backbone.View.extend( {
el : $('#et_pb_main_container'),
template : _.template( $('#et-builder-app-template').html() ),
template_button : _.template( $('#et-builder-add-specialty-section-button').html() ),
events: {
'click .et-pb-layout-buttons-save' : 'saveLayout',
'click .et-pb-layout-buttons-load' : 'loadLayout',
'click .et-pb-layout-buttons-clear' : 'clearLayout',
'click .et-pb-layout-buttons-history' : 'toggleHistory',
'click #et-pb-histories-visualizer-overlay' : 'closeHistory',
'contextmenu #et-pb-histories-visualizer-overlay' : 'closeHistory',
'click .et-pb-layout-buttons-redo' : 'redo',
'click .et-pb-layout-buttons-undo' : 'undo',
'click .et-pb-layout-buttons-view-ab-stats' : 'viewABStats',
'click .et-pb-layout-buttons-settings' : 'settings',
'contextmenu .et-pb-layout-buttons-save' : 'showRightClickOptions',
'contextmenu .et-pb-layout-buttons-load' : 'showRightClickOptions',
'contextmenu .et-pb-layout-buttons-clear' : 'showRightClickOptions',
'contextmenu .et-pb-layout-buttons-redo' : 'showRightClickOptions',
'contextmenu .et-pb-layout-buttons-undo' : 'showRightClickOptions',
'contextmenu #et_pb_main_container_right_click_overlay' : 'showRightClickOptions',
'click #et_pb_main_container_right_click_overlay' : 'hideRightClickOptions'
},
initialize : function() {
this.listenTo( this.collection, 'add', this.addModule );
this.listenTo( ET_PageBuilder_Histories, 'add', this.addVisualizeHistoryItem );
this.listenTo( ET_PageBuilder_Histories, 'change', this.changeVisualizeHistoryItem );
this.listenTo( ET_PageBuilder_Histories, 'remove', this.removeVisualizeHistoryItem );
this.listenTo( ET_PageBuilder_Events, 'et-sortable:update', _.debounce( this.saveAsShortcode, 128 ) );
this.listenTo( ET_PageBuilder_Events, 'et-model-changed-position-within-column', _.debounce( this.saveAsShortcode, 128 ) );
this.listenTo( ET_PageBuilder_Events, 'et-module:removed', _.debounce( this.saveAsShortcode, 128 ) );
this.listenTo( ET_PageBuilder_Events, 'et-pb-loading:started', this.startLoadingAnimation );
this.listenTo( ET_PageBuilder_Events, 'et-pb-loading:ended', this.endLoadingAnimation );
this.listenTo( ET_PageBuilder_Events, 'et-pb-content-updated', this.recalculateModulesOrder );
this.listenTo( ET_PageBuilder_Events, 'et-advanced-module:updated_order', this.updateAdvancedModulesOrder );
this.listenTo( ET_PageBuilder_Events, 'et-pb-content-updated', this.updateYoastContent );
this.$builder_toggle_button = $( 'body' ).find( '#et_pb_toggle_builder' );
this.$builder_toggle_button_wrapper = $( 'body' ).find( '.et_pb_toggle_builder_wrapper' );
this.render();
this.maybeGenerateInitialLayout();
// Set current builder product name and version as the last version used to save this post/page.
$( '#et_builder_version' ).val( 'BB|' + window.et_builder_product_name + '|' + window.et_builder_version );
},
render : function() {
this.$el.html( this.template() );
this.makeSectionsSortable();
this.addLoadingAnimation();
$( '#et_pb_main_container_right_click_overlay' ).remove();
this.$el.prepend('<div id="et_pb_main_container_right_click_overlay" />');
this.updateHistoriesButtonState();
return this;
},
addLoadingAnimation : function() {
$( 'body' ).append( '<div id="et_pb_loading_animation"></div>' );
this.$loading_animation = $( '#et_pb_loading_animation' ).hide();
},
startLoadingAnimation : function() {
if ( this.pageBuilderIsActive() ) {
// place the loading animation container before the closing body tag
if ( this.$loading_animation.next().length ) {
$( 'body' ).append( this.$loading_animation );
this.$loading_animation = $( '#et_pb_loading_animation' );
}
this.$loading_animation.show();
this.isLoading = true;
};
},
endLoadingAnimation : function() {
this.$loading_animation.hide();
this.isLoading = false;
},
pageBuilderIsActive : function() {
// check the button wrapper class as well because button may not be added in some cases
return this.$builder_toggle_button.hasClass( 'et_pb_builder_is_used' ) || this.$builder_toggle_button_wrapper.hasClass( 'et_pb_builder_is_used' );
},
saveLayout : function( event ) {
event.preventDefault();
if ( ET_PageBuilder_AB_Testing.is_active() ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_save_app_layout_has_ab_testing' );
return;
}
et_pb_close_all_right_click_options();
et_pb_create_prompt_modal( 'save_layout' );
},
loadLayout : function( event ) {
event.preventDefault();
var view;
et_pb_close_all_right_click_options();
if ( ET_PageBuilder_AB_Testing.is_active() ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_load_layout_has_ab_testing' );
return;
}
view = new ET_PageBuilder.ModalView( {
attributes : {
'data-open_view' : 'save_layout'
},
view : this
} );
$('body').append( view.render().el );
},
clearLayout : function( event ) {
event.preventDefault();
et_pb_close_all_right_click_options();
if ( ET_PageBuilder_AB_Testing.is_active() ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_clear_layout_has_ab_testing' );
return;
}
et_pb_create_prompt_modal( 'clear_layout' );
},
getHistoriesCount : function() {
return this.options.history.length;
},
getHistoriesIndex : function() {
var active_model = this.options.history.findWhere({ current_active_history : true }),
active_model_index = _.isUndefined( active_model ) ? ( this.options.history.models.length - 1 ) : this.options.history.indexOf( active_model );
return active_model_index;
},
isDoingCombination : function() {
if ( _.isUndefined( this.is_doing_combination ) ) {
return false;
} else {
return this.is_doing_combination;
}
},
enableHistory : function() {
if ( _.isUndefined( this.enable_history ) ) {
return false;
} else {
return this.enable_history;
}
},
allowHistorySaving : function( verb, noun, noun_alias, addition ) {
this.enable_history = true;
// Enable history saving and set meta for history
ET_PageBuilder_Visualize_Histories.setHistoryMeta( verb, noun, noun_alias, addition );
},
reviseHistories : function() {
var model,
this_el = this;
if ( this.hasRedo() ) {
// Prepare reversed index (deleting unused model using ascending index changes the order of collection)
var history_index = _.range( ( this.getHistoriesIndex() + 1 ), this.getHistoriesCount() ).reverse();
// Loop the reversed index then delete the matched models
_.each( history_index, function( index ) {
model = this_el.options.history.at( index );
this_el.options.history.remove( model );
} );
}
// Update undo button state
this.updateHistoriesButtonState();
},
resetCurrentActiveHistoryMarker : function() {
var current_active_histories = this.options.history.where({ current_active_history : true });
if ( ! _.isEmpty( current_active_histories ) ) {
_.each( current_active_histories, function( current_active_history ) {
current_active_history.set({ current_active_history : false });
} );
}
},
hasUndo : function() {
return this.getHistoriesIndex() > 0 ? true : false;
},
hasRedo : function() {
return ( this.getHistoriesCount() - this.getHistoriesIndex() ) > 1 ? true : false;
},
hasOverlayRendered : function() {
if ( $('.et_pb_modal_overlay').length ) {
return true;
}
return false;
},
updateHistoriesButtonState : function() {
if ( this.hasUndo() ) {
$( '.et-pb-layout-buttons-undo' ).removeClass( 'disabled' );
} else {
$( '.et-pb-layout-buttons-undo' ).addClass( 'disabled' );
}
if ( this.hasRedo() ) {
$( '.et-pb-layout-buttons-redo' ).removeClass( 'disabled' );
} else {
$( '.et-pb-layout-buttons-redo' ).addClass( 'disabled' );
}
if ( this.hasUndo() || this.hasRedo() ) {
$( '.et-pb-layout-buttons-history' ).removeClass( 'disabled' );
} else {
$( '.et-pb-layout-buttons-history' ).addClass( 'disabled' );
}
},
getUndoModel : function() {
var model = this.options.history.at( this.getHistoriesIndex() - 1 );
if ( _.isUndefined( model ) ) {
return false;
} else {
return model;
}
},
undo : function( event ) {
event.preventDefault();
var this_el = this,
undo_model = this.getUndoModel(),
undo_content,
current_active_histories;
// Bail if there's no undo histories to be used
if ( ! this.hasUndo() ) {
return;
}
// Bail if no undo model found
if ( _.isUndefined( undo_model ) ) {
return;
}
// Bail if there is overlay rendered (usually via hotkeys)
if ( this.hasOverlayRendered() ) {
return;
}
// Get undo content
undo_content = undo_model.get( 'shortcode' );
// Turn off other current_active_history
this.resetCurrentActiveHistoryMarker();
// Update undo model's current_active_history
undo_model.set( { current_active_history : true });
// add loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
// Set last history's content into main editor
et_pb_set_content( 'content', undo_content, 'saving_to_content' );
// Rebuild the builder
setTimeout( function(){
var $builder_container = $( '#et_pb_layout' ),
builder_height = $builder_container.innerHeight();
$builder_container.css( { 'height' : builder_height } );
ET_PageBuilder_App.removeAllSections();
ET_PageBuilder_App.$el.find( '.et_pb_section' ).remove();
// Temporarily disable history until new layout has been generated
this_el.enable_history = false;
ET_PageBuilder_App.createLayoutFromContent( et_prepare_template_content( undo_content ), '', '', { is_reinit : 'reinit' } );
$builder_container.css( { 'height' : 'auto' } );
// remove loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
// Update undo button state
this_el.updateHistoriesButtonState();
}, 600 );
},
viewABStats : function( event ) {
event.preventDefault();
// View Split Testing stats is disabled on Divi Library
if ( et_pb_options.is_divi_library === "1" ) {
return;
}
et_pb_create_prompt_modal( 'view_ab_stats' );
},
settings : function( event ) {
event.preventDefault();
// Builder settings is disabled on Divi Library
if ( et_pb_options.is_divi_library === "1" ) {
return;
}
et_pb_create_prompt_modal( 'open_settings' );
},
getRedoModel : function() {
var model = this.options.history.at( this.getHistoriesIndex() + 1 );
if ( _.isUndefined( model ) ) {
return false;
} else {
return model;
}
},
toggleHistory : function( event ) {
event.preventDefault();
var $et_pb_history_visualizer = $('#et-pb-histories-visualizer');
if ( $et_pb_history_visualizer.hasClass( 'active' ) ) {
$et_pb_history_visualizer.addClass( 'fadeout' );
// Remove class after being animated
setTimeout( function() {
$et_pb_history_visualizer.removeClass( 'fadeout' );
}, 500 );
}
$( '.et-pb-layout-buttons-history, #et-pb-histories-visualizer, #et-pb-histories-visualizer-overlay' ).toggleClass( 'active' );
},
closeHistory : function( event ) {
event.preventDefault();
this.toggleHistory( event );
},
redo : function( event ) {
event.preventDefault();
var this_el = this,
redo_model = this.getRedoModel(),
redo_model_index,
redo_content,
current_active_histories;
// Bail if there's no redo histories to be used
if ( ! this.hasRedo() ) {
return;
}
// Bail if no redo model found
if ( _.isUndefined( redo_model ) || ! redo_model ) {
return;
}
// Bail if there is overlay rendered (usually via hotkeys)
if ( this.hasOverlayRendered() ) {
return;
}
redo_model_index = this.options.history.indexOf( redo_model );
redo_content = redo_model.get( 'shortcode' );
// Turn off other current_active_history
this.resetCurrentActiveHistoryMarker();
// Update redo model's current_active_history
redo_model.set( { current_active_history : true });
// add loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
// Set last history's content into main editor
et_pb_set_content( 'content', redo_content, 'saving_to_content' );
// Rebuild the builder
setTimeout( function(){
var $builder_container = $( '#et_pb_layout' ),
builder_height = $builder_container.innerHeight();
$builder_container.css( { 'height' : builder_height } );
ET_PageBuilder_App.removeAllSections();
ET_PageBuilder_App.$el.find( '.et_pb_section' ).remove();
// Temporarily disable history until new layout has been generated
this_el.enable_history = false;
ET_PageBuilder_App.createLayoutFromContent( et_prepare_template_content( redo_content ), '', '', { is_reinit : 'reinit' } );
$builder_container.css( { 'height' : 'auto' } );
// remove loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
// Update redo button state
this_el.updateHistoriesButtonState();
}, 600 );
},
addHistory : function( content ) {
if ( this.enableHistory() && ! this.isDoingCombination() ) {
var date = new Date(),
hour = date.getHours() > 12 ? date.getHours() - 12 : date.getHours(),
minute = date.getMinutes(),
datetime_suffix = date.getHours() > 12 ? "PM" : "AM";
// If there's a redo, remove models after active model
if ( this.hasRedo() ) {
this.reviseHistories();
}
this.resetCurrentActiveHistoryMarker();
// Save content to builder history for undo/redo
this.options.history.add({
timestamp : _.now(),
datetime : ( "0" + hour).slice(-2) + ":" + ( "0" + minute ).slice(-2) + " " + datetime_suffix,
shortcode : content,
current_active_history : true,
verb : ET_PageBuilder_Visualize_Histories.verb,
noun : ET_PageBuilder_Visualize_Histories.noun
}, { validate : true });
// Return history meta to default. Prevent confusion and for debugging
ET_PageBuilder_Visualize_Histories.setHistoryMeta( 'did', 'something' );
}
// Update undo button state
this.updateHistoriesButtonState();
},
addVisualizeHistoryItem : function( model ) {
ET_PageBuilder_Visualize_Histories.addItem( model );
},
changeVisualizeHistoryItem : function( model ) {
ET_PageBuilder_Visualize_Histories.changeItem( model );
},
removeVisualizeHistoryItem : function( model ) {
ET_PageBuilder_Visualize_Histories.removeItem( model );
},
maybeGenerateInitialLayout : function() {
var module_id = ET_PageBuilder_Layout.generateNewId(),
this_el = this;
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
setTimeout( function() {
var fix_shortcodes = true,
content = '';
// check whether the tinyMCE container is loaded already if not - try again.
if ( typeof window.tinyMCE !== 'undefined' && window.tinyMCE.get( 'content' ) && ! window.tinyMCE.get( 'content' ).isHidden() && ! $( 'iframe#content_ifr' ).length ) {
et_pb_bulder_loading_attempts++;
//show failure modal after 30 unsuccessful attempts
if ( 30 < et_pb_bulder_loading_attempts ) {
var $failure_notice_template = $( '#et-builder-failure-notice-template' );
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
$( '#et_pb_main_container' ).removeClass( 'et_pb_loading_animation' );
$( 'body' ).addClass( 'et_pb_stop_scroll' ).append( $failure_notice_template.html() );
return;
}
this_el.maybeGenerateInitialLayout();
return;
}
/*
* Visual editor adds paragraph tags around shortcodes,
* it causes &nbsp; to be inserted into a module content area
*/
content = et_pb_get_content( 'content', fix_shortcodes );
// Enable history saving and set meta for history
if ( content !== '' ) {
this_el.allowHistorySaving( 'loaded', 'page' );
}
// Save page loaded
this_el.addHistory( content );
if ( this_el.pageBuilderIsActive() ) {
if ( -1 === content.indexOf( '[et_pb_') ) {
ET_PageBuilder_App.reInitialize();
} else if ( -1 !== content.indexOf( 'specialty_placeholder') ) {
this_el.createLayoutFromContent( et_prepare_template_content( content ) );
$( '.et_pb_section_specialty' ).append( this_el.template_button() );
} else {
this_el.createLayoutFromContent( et_prepare_template_content( content ) );
}
} else {
this_el.createLayoutFromContent( content );
}
et_pb_maybe_apply_wpautop_to_models( et_get_editor_mode(), 'initial_load' );
ET_PageBuilder_Events.trigger( 'et-pb-content-updated' );
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
$( '#et_pb_main_container' ).addClass( 'et_pb_loading_animation' );
setTimeout( function() {
$( '#et_pb_main_container' ).removeClass( 'et_pb_loading_animation' );
}, 500 );
// start listening to any collection events after all modules have been generated
this_el.listenTo( this_el.collection, 'change reset add', _.debounce( this_el.saveAsShortcode, 128 ) );
ET_PageBuilder_AB_Testing.update();
}, 500 );
},
wp_regexp_not_global : _.memoize( function( tag ) {
return new RegExp( '\\[(\\[?)(' + tag + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)' );
}),
getShortCodeParentTags : function () {
var shortcodes = 'et_pb_section|et_pb_row|et_pb_column|et_pb_column_inner|et_pb_row_inner'.split('|');
shortcodes = shortcodes.concat( et_pb_options.et_builder_module_parent_shortcodes.split('|') );
shortcodes = shortcodes.join('|');
return shortcodes;
},
getShortCodeChildTags : function () {
return et_pb_options.et_builder_module_child_shortcodes;
},
getShortCodeRawContentTags : function () {
var raw_content_shortcodes = et_pb_options.et_builder_module_raw_content_shortcodes,
raw_content_shortcodes_array;
raw_content_shortcodes_array = raw_content_shortcodes.split( '|' );
return raw_content_shortcodes_array;
},
//ignore_template_tag, current_row_cid, global_id, is_reinit, after_section, global_parent
createLayoutFromContent : function( content, parent_cid, inner_shortcodes, additional_options, parent_address ) {
var this_el = this,
et_pb_shortcodes_tags = typeof inner_shortcodes === 'undefined' || '' === inner_shortcodes ? this.getShortCodeParentTags() : this.getShortCodeChildTags(),
reg_exp = window.wp.shortcode.regexp( et_pb_shortcodes_tags ),
inner_reg_exp = this.wp_regexp_not_global( et_pb_shortcodes_tags ),
matches = content.match( reg_exp ),
et_pb_raw_shortcodes = this.getShortCodeRawContentTags(),
additional_options_received = typeof additional_options === 'undefined' ? {} : additional_options;
var migrations = _.isUndefined( et_pb_options.et_pb_module_settings_migrations ) ? false : et_pb_options.et_pb_module_settings_migrations;
var name_changes = _.isUndefined( migrations.name_changes ) ? false : migrations.name_changes;
var value_changes = _.isUndefined( migrations.value_changes ) ? false : migrations.value_changes;
_.each( matches, function ( shortcode, index ) {
var shortcode_element = shortcode.match( inner_reg_exp ),
shortcode_name = shortcode_element[2],
shortcode_attributes = shortcode_element[3] !== ''
? window.wp.shortcode.attrs( shortcode_element[3] )
: '',
shortcode_content = shortcode_element[5],
module_cid = ET_PageBuilder_Layout.generateNewId(),
module_settings,
prefixed_attributes = {},
found_inner_shortcodes = typeof shortcode_content !== 'undefined' && shortcode_content !== '' && shortcode_content.match( reg_exp ),
global_module_id = '',
is_structure_element = $.inArray( shortcode_name, [ 'et_pb_section', 'et_pb_row', 'et_pb_column', 'et_pb_row_inner', 'et_pb_column_inner' ] ) > -1 ;
if ( is_structure_element ) {
shortcode_name = shortcode_name.replace( 'et_pb_', '' );
}
module_settings = {
type : shortcode_name,
cid : module_cid,
created : 'manually',
module_type : shortcode_name
};
if ( typeof additional_options_received.current_row_cid !== 'undefined' && '' !== additional_options_received.current_row_cid ) {
module_settings['current_row'] = additional_options_received.current_row_cid;
}
if ( typeof additional_options_received.global_parent !== 'undefined' && '' !== additional_options_received.global_parent ) {
module_settings['et_pb_global_parent'] = additional_options_received.global_parent;
module_settings['global_parent_cid'] = additional_options_received.global_parent_cid;
}
if ( shortcode_name === 'section' && ( typeof additional_options_received.after_section !== 'undefined' && '' !== additional_options_received.after_section ) ) {
module_settings['after_section'] = additional_options_received.after_section;
}
if ( shortcode_name !== 'section' ) {
module_settings['parent'] = parent_cid;
}
if ( shortcode_name.indexOf( 'et_pb_' ) !== -1 ) {
module_settings['type'] = 'module';
}
// generate default admin_label
module_settings['admin_label'] = ET_PageBuilder_Layout.getDefaultAdminLabel( shortcode_name );
module_settings._address = index.toString();
if ( ! _.isUndefined( parent_address ) ) {
module_settings._address = parent_address + '.' + module_settings._address;
}
if ( _.isObject( shortcode_attributes['named'] ) ) {
var fill_legacy_global_options = false;
// prepare global module selective sync attributes
if ( 'global' === et_pb_options.is_global_template && ! is_structure_element && typeof shortcode_attributes['named']['template_type'] !== 'undefined' && 'module' === shortcode_attributes['named']['template_type'] ) {
if ( 'updated' === et_pb_options.selective_sync_status ) {
et_pb_all_unsynced_options[ et_pb_options.template_post_id ] = et_pb_options.excluded_global_options;
} else {
fill_legacy_global_options = true;
et_pb_all_legacy_synced_options[ et_pb_options.template_post_id ] = [];
}
}
global_module_id = typeof shortcode_attributes['named']['global_module'] !== 'undefined' && '' === global_module_id ? shortcode_attributes['named']['global_module'] : global_module_id;
// settings migration should not be performed on reinit. It should only be performed on initial content loading
if ( 'reinit' !== additional_options_received.is_reinit ) {
// BEGIN Settings Migrations
if ( name_changes && ! _.isUndefined( name_changes[shortcode_name] ) ) {
_.forEach( name_changes[shortcode_name], function( new_name, old_name ) {
if ( ! _.isUndefined( shortcode_attributes['named'][old_name] ) && _.isUndefined( shortcode_attributes['named'][new_name] ) ) {
shortcode_attributes['named'][new_name] = shortcode_attributes['named'][old_name];
}
} );
}
if ( value_changes && ! _.isUndefined( value_changes[module_settings._address] ) ) {
_.forEach( value_changes[module_settings._address], function( new_value, setting_name ) {
shortcode_attributes['named'][setting_name] = new_value;
} );
}
// If current loop is module, look for module item's migration content. Module item value migration won't be parsed correctly on page load because module item is not visibly rendered on page layout
// thus, get module item based on current module's address then assign it as element to module object. This element will be fetched when module's setting modal is rendered
if ( 'module' === module_settings.type ) {
var module_items_value_changes = {},
module_address_length = module_settings._address.length;
_.forEach( value_changes, function( item_changes, item_address ) {
if ( module_settings._address + '.' === String( item_address ).substr( 0, ( module_address_length + 1 ) ) ) {
module_items_value_changes[ item_address.substr( module_settings._address.length + 1 ) ] = item_changes;
}
} );
if ( ! _.isEmpty( module_items_value_changes ) ) {
shortcode_attributes['named']['value_changes'] = module_items_value_changes;
}
}
// END Settings Migrations
}
for ( var key in shortcode_attributes['named'] ) {
if ( typeof additional_options_received.ignore_template_tag === 'undefined' || '' === additional_options_received.ignore_template_tag || ( 'ignore_template' === additional_options_received.ignore_template_tag && 'template_type' !== key ) ) {
var prefixed_key = key !== 'admin_label' && key !== 'specialty_columns' && key !== 'value_changes' ? 'et_pb_' + key : key,
skip_setting = false;
// fill the array of legacy global synced options for module
if ( fill_legacy_global_options ) {
et_pb_all_legacy_synced_options[ et_pb_options.template_post_id ].push( key );
}
if ( ( shortcode_name === 'column' || shortcode_name === 'column_inner' ) && prefixed_key === 'et_pb_type' ) {
prefixed_key = 'layout';
}
// skip unsynced options for global modules if isset
if ( ! _.isEmpty( additional_options_received.unsynced_options ) && -1 !== _.indexOf( additional_options_received.unsynced_options, key ) ) {
skip_setting = true;
}
if ( ! skip_setting ) {
prefixed_attributes[prefixed_key] = shortcode_attributes['named'][key];
// Delete module item's value changes that is being assigned to module. Otherwise, this will pollutes `window.wp.shortcode.attrs()` and causing incorrect shortcode attribute parsing
if ( key === 'value_changes' ) {
delete shortcode_attributes['named'][key];
}
}
}
}
module_settings = _.extend( module_settings, prefixed_attributes );
}
if ( typeof module_settings['specialty_columns'] !== 'undefined' ) {
module_settings['layout_specialty'] = '1';
module_settings['specialty_columns'] = parseInt( module_settings['specialty_columns'] );
}
// Skip content if it's not synced for global modules.
if ( ! found_inner_shortcodes && ( _.isUndefined( additional_options_received.unsynced_options ) || _.isEmpty( additional_options_received.unsynced_options ) || -1 === _.indexOf( additional_options_received.unsynced_options, 'et_pb_content_field' ) ) ) {
if ( $.inArray( shortcode_name, et_pb_raw_shortcodes ) > -1 ) {
module_settings['et_pb_raw_content'] = _.unescape( shortcode_content );
// replace line-break placeholders with real line-breaks
module_settings['et_pb_raw_content'] = module_settings['et_pb_raw_content'].replace( /<!-- \[et_pb_line_break_holder\] -->/g, '\n' );
} else {
module_settings['et_pb_content_new'] = shortcode_content;
}
}
// convert line break placeholders into real line-breaks for the message pattern option in Contact Form module
if ( 'et_pb_contact_form' === shortcode_name && typeof module_settings['et_pb_custom_message'] !== 'undefined' ) {
// unescape content to make sure quotes displayed correctly in the Editor.
module_settings['et_pb_custom_message'] = _.unescape( module_settings['et_pb_custom_message'].replace( /\|\|et_pb_line_break_holder\|\|/g, '\r\n' ) );
}
if ( ! module_settings['et_pb_disabled'] !== 'undefined' && module_settings['et_pb_disabled'] === 'on' ) {
module_settings.className = ' et_pb_disabled';
}
if ( ! module_settings['et_pb_locked'] !== 'undefined' && module_settings['et_pb_locked'] === 'on' ) {
module_settings.className = ' et_pb_locked';
}
if ( typeof additional_options_received.global_id !== 'undefined' && '' !== additional_options_received.global_id ) {
module_settings['et_pb_global_module'] = additional_options_received.global_id;
}
this_el.collection.add( [ module_settings ] );
if ( 'reinit' === additional_options_received.is_reinit || ( global_module_id === '' || ( global_module_id !== '' && 'row' !== shortcode_name && 'row_inner' !== shortcode_name && 'section' !== shortcode_name ) ) ) {
if ( found_inner_shortcodes ) {
var global_parent_id = typeof additional_options_received.global_parent === 'undefined' || '' === additional_options_received.global_parent ? global_module_id : additional_options_received.global_parent,
global_parent_cid_new = typeof additional_options_received.global_parent_cid === 'undefined' || '' === additional_options_received.global_parent_cid
? typeof global_module_id !== 'undefined' && '' !== global_module_id ? module_cid : ''
: additional_options_received.global_parent_cid;
this_el.createLayoutFromContent( shortcode_content, module_cid, '', { is_reinit : additional_options_received.is_reinit, global_parent : global_parent_id, global_parent_cid : global_parent_cid_new }, module_settings._address );
}
} else {
//calculate how many global modules we requested on page
et_pb_globals_requested++;
et_pb_load_global_row( global_module_id, module_cid, shortcode );
this_el.createLayoutFromContent( shortcode_content, module_cid, '', { is_reinit : 'reinit' }, module_settings._address );
}
} );
},
addModule : function( module ) {
var view,
modal_view,
row_parent_view,
row_layout,
view_settings = {
model : module,
collection : ET_PageBuilder_Modules
},
cloned_cid = typeof module.get('cloned_cid') !== 'undefined' ? module.get('cloned_cid') : false;
switch ( module.get( 'type' ) ) {
case 'section' :
view = new ET_PageBuilder.SectionView( view_settings );
ET_PageBuilder_Layout.addView( module.get('cid'), view );
if ( ! _.isUndefined( module.get( 'view' ) ) ){
module.get( 'view' ).$el.after( view.render().el );
} else if ( typeof module.get( 'after_section' ) !== 'undefined' && '' !== module.get( 'after_section' ) ) {
ET_PageBuilder_Layout.getView( module.get( 'after_section' ) ).$el.after( view.render().el );
} else if ( typeof module.get( 'current_row' ) !== 'undefined' ) {
this.replaceElement( module.get( 'current_row' ), view );
} else if ( cloned_cid ) {
this.$el.find( 'div[data-cid="' + cloned_cid + '"]' ).closest('.et_pb_section').after( view.render().el );
} else {
this.$el.append( view.render().el );
}
if ( 'on' === module.get( 'et_pb_fullwidth' ) ) {
$( view.render().el ).addClass( 'et_pb_section_fullwidth' );
var sub_view = new ET_PageBuilder.ColumnView( view_settings );
view.addChildView( sub_view );
$( view.render().el ).find( '.et-pb-section-content' ).append( sub_view.render().el );
}
if ( 'on' === module.get( 'et_pb_specialty' ) && 'auto' === module.get( 'created' ) && ! module.get( 'pasted_module' ) ) {
$( view.render().el ).addClass( 'et_pb_section_specialty' );
var et_view;
et_view = new ET_PageBuilder.ModalView( {
model : view_settings.model,
collection : view_settings.collection,
attributes : {
'data-open_view' : 'column_specialty_settings'
},
et_view : view,
view : view
} );
$('body').append( et_view.render().el );
}
// add Rows layout once the section has been created in "auto" mode
// skip this step if pasting section.
if ( ! module.get( 'pasted_module' ) && 'manually' !== module.get( 'created' ) && 'on' !== module.get( 'et_pb_fullwidth' ) && 'on' !== module.get( 'et_pb_specialty' ) ) {
view.addRow();
}
break;
case 'row' :
case 'row_inner' :
view = new ET_PageBuilder.RowView( view_settings );
if ( module.get( 'parent' ) !== '' ) {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-insert-row' ).hide();
}
ET_PageBuilder_Layout.addView( module.get('cid'), view );
/*this.$("[data-cid=" + module.get('parent') + "]").append( view.render().el );*/
if ( ! _.isUndefined( module.get( 'current_row' ) ) ) {
this.replaceElement( module.get( 'current_row' ), view );
} else if ( ! _.isUndefined( module.get( 'appendAfter' ) ) ) {
module.get( 'appendAfter' ).after( view.render().el );
} else if ( cloned_cid ) {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( 'div[data-cid="' + cloned_cid + '"]' ).parent().after( view.render().el );
} else {
if ( ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-section-content' ).length ) {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-section-content' ).append( view.render().el );
} else {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '> .et-pb-insert-module, > .et-pb-insert-row' ).hide().end().append( view.render().el );
}
}
// unset the columns_layout so it'll be calculated properly when columns added
module.unset( 'columns_layout' );
// add parent view to inner rows that have been converted from shortcodes
if ( module.get('created') === 'manually' && module.get('module_type') === 'row_inner' ) {
module.set( 'view', ET_PageBuilder_Layout.getView( module.get( 'parent' ) ), { silent : true } );
}
/*module.get( 'view' ).$el.find( '.et-pb-section-content' ).append( view.render().el );*/
break;
case 'column' :
case 'column_inner' :
view_settings['className'] = 'et-pb-column et-pb-column-' + module.get( 'layout' );
if ( ! _.isUndefined( module.get( 'layout_specialty' ) ) && '1' === module.get( 'layout_specialty' ) ) {
view_settings['className'] += ' et-pb-column-specialty';
}
view = new ET_PageBuilder.ColumnView( view_settings );
ET_PageBuilder_Layout.addView( module.get('cid'), view );
if ( _.isUndefined( module.get( 'layout_specialty' ) ) ) {
/* Need to pass the columns layout into the parent row model to save the row template properly */
row_parent_view = ET_PageBuilder_Layout.getView( module.get( 'parent' ) );
row_layout = typeof row_parent_view.model.get( 'columns_layout' ) !== 'undefined' ? row_parent_view.model.get( 'columns_layout' ) + ',' + module.get( 'layout' ) : module.get( 'layout' );
row_parent_view.model.set( 'columns_layout', row_layout );
if ( ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).model.get( 'et_pb_specialty' ) !== 'on' ) {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-row-container' ).append( view.render().el );
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).toggleInsertColumnButton();
} else {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-section-content' ).append( view.render().el );
}
} else {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-section-content' ).append( view.render().el );
if ( '1' === module.get( 'layout_specialty' ) ) {
if ( 'manually' !== module.get( 'created' ) ) {
this.collection.add( [ {
type : 'row',
module_type : 'row',
cid : ET_PageBuilder_Layout.generateNewId(),
parent : module.get( 'cid' ),
view : view,
admin_label : et_pb_options.noun['row']
} ] );
}
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).model.set( 'specialty_columns', parseInt( module.get( 'specialty_columns' ) ) );
}
}
/*module.get( 'view' ).$el.find( '.et-pb-row-container' ).append( view.render().el );*/
/*this.$("[data-cid=" + module.get('parent') + "] .et-pb-row-container").append( view.render().el );*/
break;
case 'module' :
view_settings['attributes'] = {
'data-cid' : module.get( 'cid' )
}
if ( module.get( 'mode' ) !== 'advanced' && module.get( 'created' ) === 'manually' && ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).model.get( 'module_type' ) === 'column_inner' ) {
var inner_column_parent_row = ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).model.get( 'parent' );
ET_PageBuilder_Layout.getView( inner_column_parent_row ).$el.find( '.et-pb-insert-column' ).hide();
}
if ( typeof module.get( 'mode' ) !== 'undefined' && module.get( 'mode' ) === 'advanced' ) {
// create sortable tab
view = new ET_PageBuilder.AdvancedModuleSettingView( view_settings );
module.attributes.view.child_views.push( view );
if ( typeof module.get( 'cloned_cid' ) !== 'undefined' && '' !== module.get( 'cloned_cid' ) ) {
ET_PageBuilder_Layout.getView( module.get( 'cloned_cid' ) ).$el.after( view.render().el );
} else {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find('.et-pb-sortable-options').append( view.render().el );
}
ET_PageBuilder_Layout.addView( module.get('cid'), view );
} else {
var template_type = '';
ET_PageBuilder_Events.trigger( 'et-new_module:show_settings' );
view = new ET_PageBuilder.BlockModuleView( view_settings );
if ( typeof module.attributes.view !== 'undefined' && module.attributes.view.model.get( 'et_pb_fullwidth' ) === 'on' ) {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).addChildView( view );
template_type = ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).model.get( 'et_pb_template_type' );
} else if ( typeof module.attributes.view !== 'undefined' ) {
template_type = ET_PageBuilder_Layout.getView( ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).model.get( 'parent' ) ).model.get( 'et_pb_template_type' );
}
// Append new module in proper position. Clone shouldn't be appended. It should be added after the cloned item
if ( cloned_cid ) {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( 'div[data-cid="' + cloned_cid + '"]' ).after( view.render().el );
} else {
// if .et-pb-insert-module button exists, then add the module before that button. Otherwise append module to the parent
if ( ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-insert-module' ).length ) {
ET_PageBuilder_Layout.getView( module.get( 'parent' ) ).$el.find( '.et-pb-insert-module' ).before( view.render().el );
} else {
var parent_view = ET_PageBuilder_Layout.getView( module.get( 'parent' ) );
// append module to appropriate div if it's a fullwidth section
if ( typeof parent_view.model.get( 'et_pb_fullwidth' ) !== 'undefined' && 'on' === parent_view.model.get( 'et_pb_fullwidth' ) ) {
parent_view.$el.find( '.et_pb_fullwidth_sortable_area' ).append( view.render().el );
} else {
parent_view.$el.append( view.render().el );
}
}
}
ET_PageBuilder_Layout.addView( module.get('cid'), view );
if ( typeof template_type !== 'undefined' && 'module' === template_type ) {
module.set( 'template_type', 'module', { silent : true } );
}
if ( 'manually' !== module.get( 'created' ) ) {
view_settings['attributes'] = {
'data-open_view' : 'module_settings'
}
this.openModuleSettings( view_settings );
}
}
break;
}
// Always unset cloned_cid attribute after adding module.
// It prevents module mishandling for module which is cloned multiple time
module.unset('cloned_cid');
},
openModuleSettings : function( view_settings ) {
var modal_view = new ET_PageBuilder.ModalView( view_settings ),
that = this;
et_modal_view_rendered = modal_view.render();
if ( false === et_modal_view_rendered ) {
setTimeout( function() {
that.openModuleSettings( view_settings );
}, 500 );
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
return;
}
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
$('body').append( et_modal_view_rendered.el );
},
saveAsShortcode : function( et_model, et_collection, et_options ) {
var this_el = this,
action_setting = arguments.length > 0 && typeof arguments[0] === 'object' && arguments[0]['et_action'] || '';
// set that the bb is in use, which is looked for by fb if the user switches to new tab
set_this_editor_in_use();
if ( et_options && et_options['update_shortcodes'] == 'false' ) {
return;
}
shortcode = this_el.generateCompleteShortcode();
this.addHistory( shortcode );
ET_PageBuilder_AB_Testing.update();
setTimeout( function(){
// Save to content is performed each time, except when a layout is being loaded
var action = action_setting || '';
et_pb_set_content( 'content', shortcode, action );
ET_PageBuilder_Events.trigger( 'et-pb-content-updated' );
}, 500 );
},
generateCompleteShortcode : function( cid, layout_type, ignore_global_tag, ignore_global_tabs, is_saving_global ) {
var shortcode = '',
this_el = this,
all_sections = typeof cid === 'undefined' ? true : false,
layout_type = typeof layout_type === 'undefined' ? '' : layout_type;
this.$el.find( '.et_pb_section' ).each( function() {
var $this_section = $(this).find( '.et-pb-section-content' ),
include_whole_section = false,
skip_section = typeof $this_section.data( 'skip' ) === 'undefined' ? false : $this_section.data( 'skip' );
if ( ( ( false === all_sections && cid === $this_section.data( 'cid' ) ) || true === all_sections ) && true !== skip_section ) {
shortcode += this_el.generateModuleShortcode( $(this), true, layout_type, ignore_global_tag );
include_whole_section = true;
}
if ( $this_section.closest( '.et_pb_section' ).hasClass( 'et_pb_section_fullwidth' ) ) {
$this_section.find( '.et_pb_module_block' ).each( function() {
var fullwidth_module_cid = $( this ).data( 'cid' );
if ( ( false === all_sections && ( cid === fullwidth_module_cid || true === include_whole_section ) ) || true === all_sections ) {
shortcode += this_el.generateModuleShortcode( $(this), false, layout_type, ignore_global_tag, '', ignore_global_tabs );
}
} );
} else if ( $this_section.closest( '.et_pb_section' ).hasClass( 'et_pb_section_specialty' ) && ( ( true === include_whole_section || true === all_sections || 'module' === layout_type || 'row' === layout_type ) && true !== skip_section ) ) {
$this_section.find( '> .et-pb-column' ).each( function() {
var $this_column = $(this),
column_cid = $this_column.data( 'cid' ),
module = ET_PageBuilder_Modules.findWhere( { cid : column_cid } ),
specialty_columns = module.get( 'layout_specialty' ) === '1' ? ' specialty_columns="' + module.get( 'specialty_columns' ) + '"' : '',
specialty_column_layout = module.get('layout');
if ( true === include_whole_section || true === all_sections ) {
shortcode += '[et_pb_column type="' + specialty_column_layout + '"' + specialty_columns +']';
}
if ( $this_column.hasClass( 'et-pb-column-specialty' ) ) {
// choose each row
$this_column.find( '.et_pb_row' ).each( function() {
var $this_row = $(this),
row_cid = $this_row.find( '.et-pb-row-content' ).data( 'cid' ),
module = ET_PageBuilder_Modules.findWhere( { cid : row_cid } ),
include_whole_inner_row = false;
if ( true === include_whole_section || true === all_sections || ( 'row' === layout_type && row_cid === cid ) ) {
include_whole_inner_row = true;
shortcode += this_el.generateModuleShortcode( $(this), true, layout_type, ignore_global_tag, 'row_inner' );
}
$this_row.find( '.et-pb-column' ).each( function() {
var $this_column_inner = $(this),
column_cid = $this_column_inner.data( 'cid' ),
module = ET_PageBuilder_Modules.findWhere( { cid : column_cid } );
if ( true === include_whole_inner_row ) {
shortcode += '[et_pb_column_inner type="' + module.get('layout') + '" saved_specialty_column_type="' + specialty_column_layout + '"]';
}
$this_column_inner.find( '.et_pb_module_block' ).each( function() {
var inner_module_cid = $( this ).data( 'cid' );
if ( ( false === all_sections && ( cid === inner_module_cid || true === include_whole_section || true === include_whole_inner_row ) ) || true === all_sections ) {
shortcode += this_el.generateModuleShortcode( $(this), false, layout_type, ignore_global_tag, '', ignore_global_tabs );
}
} );
if ( true === include_whole_inner_row ) {
shortcode += '[/et_pb_column_inner]';
}
} );
if ( true === include_whole_section || true === all_sections || ( 'row' === layout_type && row_cid === cid ) ) {
shortcode += '[/et_pb_row_inner]';
}
} );
} else {
// choose each module
$this_column.find( '.et_pb_module_block' ).each( function() {
var specialty_module_cid = $( this ).data( 'cid' );
if ( ( false === all_sections && ( cid === specialty_module_cid || true === include_whole_section ) ) || true === all_sections ) {
shortcode += this_el.generateModuleShortcode( $(this), false, layout_type, ignore_global_tag, '', ignore_global_tabs, is_saving_global );
}
} );
}
if ( true === include_whole_section || true === all_sections ) {
shortcode += '[/et_pb_column]';
}
} );
} else {
$this_section.find( '.et_pb_row' ).each( function() {
var $this_row = $(this),
$this_row_content = $this_row.find( '.et-pb-row-content' ),
row_cid = $this_row_content.data( 'cid' ),
include_whole_row = false,
skip_row = typeof $this_row_content.data( 'skip' ) === 'undefined' ? false : $this_row_content.data( 'skip' );
if ( ( ( false === all_sections && ( cid === row_cid || true === include_whole_section ) ) || true === all_sections ) && true !== skip_row ) {
shortcode += this_el.generateModuleShortcode( $(this), true, layout_type, ignore_global_tag );
include_whole_row = true;
}
$this_row.find( '.et-pb-column' ).each( function() {
var $this_column = $(this),
column_cid = $this_column.data( 'cid' ),
module = ET_PageBuilder_Modules.findWhere( { cid : column_cid } );
if ( ( ( false === all_sections && ( true === include_whole_section || true === include_whole_row ) ) || true === all_sections ) && true !== skip_row ) {
shortcode += '[et_pb_column type="' + module.get('layout') + '"]';
}
$this_column.find( '.et_pb_module_block' ).each( function() {
var module_cid = $( this ).data( 'cid' );
if ( ( false === all_sections && ( cid === module_cid || true === include_whole_section || true === include_whole_row ) ) || true === all_sections ) {
shortcode += this_el.generateModuleShortcode( $(this), false, layout_type, ignore_global_tag, '', ignore_global_tabs, is_saving_global );
}
} );
if ( ( ( false === all_sections && ( true === include_whole_section || true === include_whole_row ) ) || true === all_sections ) && true !== skip_row ) {
shortcode += '[/et_pb_column]';
}
} );
if ( ( ( false === all_sections && ( cid === row_cid || true === include_whole_section ) ) || true === all_sections ) && true !== skip_row ) {
shortcode += '[/et_pb_row]';
}
} );
}
if ( ( ( false === all_sections && cid === $this_section.data( 'cid' ) ) || true === all_sections ) && true !== skip_section ) {
shortcode += '[/et_pb_section]';
}
} );
return shortcode;
},
generateModuleShortcode : function( $module, open_tag_only, layout_type, ignore_global_tag, defined_module_type, ignore_global_tabs, is_saving_global ) {
var attributes = '',
content = '',
$this_module = $module,
is_module_type = ! $this_module.is( '.et_pb_section' ) && ! $this_module.is( '.et_pb_row' ) && ! $this_module.is( '.et_pb_row_inner' ) && ! $this_module.is( '.et_pb_column' ) && ! $this_module.is( '.et_pb_column_inner' ),
prefix = $this_module.is( '.et_pb_section' ) || $this_module.is( '.et_pb_row' ) || $this_module.is( '.et_pb_row_inner' )
? 'et_pb_'
: '',
module_cid = typeof $this_module.data( 'cid' ) === 'undefined'
? $this_module.find( '.et-pb-data-cid' ).data( 'cid' )
: $this_module.data( 'cid' ),
module = ET_PageBuilder_Modules.find( function( model ) {
return model.get('cid') == module_cid;
} ),
module_type = typeof module !== 'undefined' ? module.get( 'module_type' ) : 'undefined',
is_synced_global_module = false,
module_settings,
shortcode,
template_module_type,
unsynced_options = [];
if ( typeof defined_module_type !== 'undefined' && '' !== defined_module_type ) {
module_type = defined_module_type;
}
if ( typeof module === 'undefined' ) {
return;
}
module_settings = module.attributes;
is_synced_global_module = ( 'module' === et_pb_options.layout_type && 'global' === et_pb_options.is_global_template ) || ( is_saving_global && is_module_type && !_.isUndefined( module_settings['et_pb_global_module'] ) );
// save only synced options for the global modules
if ( is_saving_global && is_module_type && typeof module_settings['et_pb_global_module'] !== 'undefined' ) {
unsynced_options = ! _.isEmpty( et_pb_all_unsynced_options[ module_settings['et_pb_global_module'] ] ) ? et_pb_all_unsynced_options[ module_settings['et_pb_global_module'] ] : [];
}
for ( var key in module_settings ) {
if ( ! _.isEmpty( unsynced_options ) ) {
var global_option_name = $.inArray( key, ['et_pb_content_new', 'et_pb_raw_content'] ) !== -1 ? 'et_pb_content_field' : key.replace( 'et_pb_', '' );
// skip unsynced options
if ( $.inArray( global_option_name, unsynced_options ) !== -1 ) {
continue;
}
}
if ( typeof ignore_global_tag === 'undefined' || 'ignore_global' !== ignore_global_tag || ( typeof ignore_global_tag !== 'undefined' && 'ignore_global' === ignore_global_tag && 'et_pb_global_module' !== key && 'et_pb_global_parent' !== key ) ) {
if ( typeof ignore_global_tabs === 'undefined' || 'ignore_global_tabs' !== ignore_global_tabs || ( typeof ignore_global_tabs !== 'undefined' && 'ignore_global_tabs' === ignore_global_tabs && 'et_pb_saved_tabs' !== key ) ) {
var setting_name = key,
setting_value;
// remove previous instance of these flags, the bb_built will be added again below as needed
if ( _.includes( ['et_pb_fb_built', 'et_pb_bb_built', '_address'], setting_name ) ) {
continue;
}
if ( setting_name.indexOf( 'et_pb_' ) === -1 && setting_name !== 'admin_label' ) continue;
setting_value = typeof( module.get( setting_name ) ) !== 'undefined' ? module.get( setting_name ) : '';
if ( setting_name === 'et_pb_content_new' || setting_name === 'et_pb_raw_content' ) {
content = setting_value;
if ( setting_name === 'et_pb_raw_content' ) {
// replace the line-breaks with placeholders, so they won't be removed/replaced by WP
content = content.replace( /\r?\n|\r/g, '<!-- [et_pb_line_break_holder] -->' );
content = _.escape( content );
}
content = $.trim( content );
var modules_with_child = $.parseJSON( et_pb_options.et_builder_modules_with_children );
// don't add additional line-breaks to the modules wich child elements. It'll add unwanted extra space to them
if ( ! _.includes( _.keys( modules_with_child ), module.get( 'module_type' ) ) && '' !== content && setting_name === 'et_pb_content_new' ) {
content = "\n\n" + content + "\n\n";
}
} else if ( setting_value !== '' || is_synced_global_module ) {
// check if there is a default value for a setting
if ( typeof module_settings['module_defaults'] !== 'undefined' && typeof module_settings['module_defaults'][ setting_name ] !== 'undefined' ) {
var module_setting_default = module_settings['module_defaults'][ setting_name ],
string_setting_value = setting_value + ''; // cast setting value to string to properly compare it with the module_setting_default
// don't add an attribute to a shortcode, if default value is equal to the current value
// Exception: Global Modules. We should save default values to make sure it synced with all modules correctly.
if ( module_setting_default === string_setting_value && ! is_synced_global_module ) {
delete module.attributes[ setting_name ];
continue;
}
}
setting_name = setting_name.replace( 'et_pb_', '' );
if ( typeof setting_value === 'string' ) {
// Make sure double quotes are encoded, before adding values to shortcode
setting_value = setting_value.replace( /\"/g, '%22' ).replace( /\\/g, '%92' );
setting_value = setting_value.replace( /\[/g, '%91' ).replace( /\]/g, '%93' );
}
if ( 'et_pb_contact_form' === module_type && setting_name === 'custom_message' ) {
// save the line breaks in contact message pattern correctly
setting_value = _.escape( setting_value.replace( /\r?\n|\r/g, '||et_pb_line_break_holder||' ) );
}
// escape URLs
var url_regex = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/;
if ( url_regex.test( setting_value ) ) {
setting_value = _.escape( _.unescape( setting_value ) );
}
// make sure admin label is always on the same position to correctly save the shortcode into library
if ( 'admin_label' === setting_name ) {
// save admin label to shortcode only if it's not default
if ( setting_value !== ET_PageBuilder_Layout.getDefaultAdminLabel( module_settings['module_type'] ) ) {
attributes = ' ' + setting_name + '="' + setting_value + '"' + attributes;
}
} else {
attributes += ' ' + setting_name + '="' + setting_value + '"';
}
}
}
}
}
template_module_type = 'section' !== module_type && 'row' !== module_type ? 'module' : module_type;
template_module_type = 'row_inner' === module_type ? 'row' : template_module_type;
if ( typeof layout_type !== 'undefined' && ( layout_type === template_module_type ) ) {
attributes += ' template_type="' + layout_type + '"';
}
if ( typeof module_settings['template_type'] !== 'undefined' ) {
attributes += ' template_type="' + module_settings['template_type'] + '"';
}
// prefix sections with a bb_built attr flag
if ( 'section' === module_type ) {
attributes = ' bb_built="1"' + attributes;
}
shortcode = '[' + prefix + module_type + attributes;
if ( content === '' && ( typeof module_settings['type'] !== 'undefined' && module_settings['type'] === 'module' ) ) {
open_tag_only = true;
shortcode += ' /]';
} else {
shortcode += ']';
}
if ( ! open_tag_only )
shortcode += content + '[/' + prefix + module_type + ']';
return shortcode;
},
makeSectionsSortable : function() {
var this_el = this;
this.$el.sortable( {
items : '> *:not(#et_pb_layout_controls, #et_pb_main_container_right_click_overlay, #et-pb-histories-visualizer, #et-pb-histories-visualizer-overlay)',
cancel : '.et-pb-settings, .et-pb-clone, .et-pb-remove, .et-pb-section-add, .et-pb-row-add, .et-pb-insert-module, .et-pb-insert-column, .et_pb_locked, .et-pb-disable-sort',
delay: 100,
update : function( event, ui ) {
// Loading process occurs. Dragging is temporarily disabled
if ( ET_PageBuilder_App.isLoading ) {
this_el.$el.sortable( 'cancel' );
return;
}
// Split Testing adjustment :: section as/has subject/goal
if ( ET_PageBuilder_AB_Testing.is_active() ) {
var section_cid = $( ui.item ).children( '.et-pb-section-content' ).attr( 'data-cid' );
// Check user permission
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( section_cid, 'section' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
this_el.$el.sortable( 'cancel' );
et_reinitialize_builder_layout();
return;
}
}
// Enable history saving and set meta for history
this_el.allowHistorySaving( 'moved', 'section' );
ET_PageBuilder_Events.trigger( 'et-sortable:update' );
},
start : function( event, ui ) {
et_pb_close_all_right_click_options();
// copy section if Alt key pressed
if ( event.altKey ) {
var movedSection = ET_PageBuilder_Layout.getView( $( ui.item ).children('.et-pb-section-content').data( 'cid' ) );
var view_settings = {
model : movedSection.model,
view : movedSection.$el,
view_event : event
};
var clone_section = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
clone_section.copy( event, true );
clone_section.pasteAfter( event, undefined, undefined, undefined, true, true );
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'cloned', 'section' );
}
}
} );
},
reInitialize : function() {
var content = et_pb_get_content( 'content' ),
contentIsEmpty = content == '',
default_initial_column_type = et_pb_options.default_initial_column_type,
default_initial_text_module = et_pb_options.default_initial_text_module;
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
this.removeAllSections();
if ( content.indexOf( '[et_pb_section' ) === -1 ) {
if ( ! contentIsEmpty ) {
content = '[et_pb_column type="' + default_initial_column_type + '"][' + default_initial_text_module + ']' + content + '[/' + default_initial_text_module + '][/et_pb_column]';
}
content = '[et_pb_section][et_pb_row]' + content + '[/et_pb_row][/et_pb_section]';
}
this.createNewLayout( content );
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
},
removeAllSections : function( create_initial_layout ) {
var content;
// force removal of all the sections and rows
ET_PageBuilder_Layout.set( 'forceRemove', true );
this.$el.find( '.et-pb-section-content' ).each( function() {
var $this_el = $(this),
this_view = ET_PageBuilder_Layout.getView( $this_el.data( 'cid' ) );
// don't remove cloned sections
if ( typeof this_view !== 'undefined' ) {
// Remove sections. Use remove_all flag so it can differ "remove section" and "clear layout"
this_view.removeSection( false, true );
}
} );
ET_PageBuilder_Layout.set( 'forceRemove', false );
if ( create_initial_layout ) {
content = '[et_pb_section][et_pb_row][/et_pb_row][/et_pb_section]';
this.createNewLayout( content );
}
},
// creates new layout from any content and saves new shortcodes once
createNewLayout : function( content, action ) {
var action = action || '';
this.stopListening( this.collection, 'change reset add', this.saveAsShortcode );
if ( action === 'load_layout' && typeof window.switchEditors !== 'undefined' ) {
content = et_pb_fix_shortcodes( window.switchEditors.wpautop( content ) );
}
this.createLayoutFromContent( content );
this.saveAsShortcode( { et_action : action } );
this.listenTo( this.collection, 'change reset add', _.debounce( this.saveAsShortcode, 128 ) );
},
//replaces the Original element with Replacement element in builder
replaceElement : function ( original_cid, replacement_view ) {
var original_view = ET_PageBuilder_Layout.getView( original_cid );
original_view.$el.after( replacement_view.render().el );
original_view.model.destroy();
ET_PageBuilder_Layout.removeView( original_cid );
original_view.remove();
},
showRightClickOptions : function( event ) {
event.preventDefault();
var et_right_click_options_view,
view_settings = {
model : {
attributes : {
type : 'app',
module_type : 'app'
}
},
view : this.$el,
view_event : event
};
et_right_click_options_view = new ET_PageBuilder.RightClickOptionsView( view_settings );
},
hideRightClickOptions : function( event ) {
event.preventDefault();
et_pb_close_all_right_click_options();
},
// calculates the order for each module in the builder
recalculateModulesOrder : function() {
var all_modules = this.collection;
this.order_modules_array = [];
this.order_modules_array['children_count'] = [];
// go through all the modules in the builder content and set the module_order attribute for each.
this.$el.find( '.et_pb_section' ).each( function( index ) {
var $this_section = $(this).find( '.et-pb-section-content' ),
section_cid = $this_section.data( 'cid' );
ET_PageBuilder_App.setModuleOrder( section_cid );
ET_PageBuilder_App.setModuleAddresses( section_cid, index );
if ( $this_section.closest( '.et_pb_section' ).hasClass( 'et_pb_section_fullwidth' ) ) {
$this_section.find( '.et_pb_module_block' ).each( function() {
var fullwidth_module_cid = $( this ).data( 'cid' );
ET_PageBuilder_App.setModuleOrder( fullwidth_module_cid );
} );
} else if ( $this_section.closest( '.et_pb_section' ).hasClass( 'et_pb_section_specialty' ) ) {
$this_section.find( '> .et-pb-column' ).each( function() {
var $this_column = $(this),
column_cid = $this_column.data( 'cid' );
ET_PageBuilder_App.setModuleOrder( column_cid );
if ( $this_column.hasClass( 'et-pb-column-specialty' ) ) {
// choose each row
$this_column.find( '.et_pb_row' ).each( function() {
var $this_row = $(this),
row_cid = $this_row.find( '.et-pb-row-content' ).data( 'cid' );
ET_PageBuilder_App.setModuleOrder( row_cid );
$this_row.find( '.et-pb-column' ).each( function() {
var $this_column_inner = $(this),
column_cid = $this_column_inner.data( 'cid' );
ET_PageBuilder_App.setModuleOrder( column_cid );
$this_column_inner.find( '.et_pb_module_block' ).each( function() {
var inner_module_cid = $( this ).data( 'cid' );
ET_PageBuilder_App.setModuleOrder( inner_module_cid );
});
});
});
} else {
// choose each module
$this_column.find( '.et_pb_module_block' ).each( function() {
var specialty_module_cid = $( this ).data( 'cid' );
ET_PageBuilder_App.setModuleOrder( specialty_module_cid, 'specialty' );
});
}
});
} else {
$this_section.find( '.et_pb_row' ).each( function() {
var $this_row = $(this),
$this_row_content = $this_row.find( '.et-pb-row-content' ),
row_cid = $this_row_content.data( 'cid' );
ET_PageBuilder_App.setModuleOrder( row_cid );
$this_row.find( '.et-pb-column' ).each( function() {
var $this_column = $(this),
column_cid = $this_column.data( 'cid' );
ET_PageBuilder_App.setModuleOrder( column_cid );
$this_column.find( '.et_pb_module_block' ).each( function() {
var module_cid = $( this ).data( 'cid' );
ET_PageBuilder_App.setModuleOrder( module_cid );
});
});
});
}
});
},
// reload content for the Yoast after it was changed in builder
updateYoastContent : function() {
if ( ! et_pb_is_yoast_seo_active() ) {
return;
}
var content = et_pb_get_content( 'content', true );
// perform the do_shortcode for the current content from builder and force Yoast to reload
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data: {
action : 'et_pb_execute_content_shortcodes',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_pb_unprocessed_data : content
},
success: function( data ) {
et_pb_processed_yoast_content = data;
YoastSEO.app.pluginReloaded( 'ET_PB_Yoast_Content' );
}
} );
},
// calculate and add the module_order attribute for the module.
setModuleOrder: function( cid, is_specialty ) {
var modules_with_child = $.parseJSON( et_pb_options.et_builder_modules_with_children ),
current_model,
module_order,
parent_row,
module_type,
start_from,
child_slug;
current_model = ET_PageBuilder_Modules.findWhere( { cid : cid } );
if ( typeof current_model === 'undefined' ) {
return;
}
module_type = typeof current_model.attributes.module_type !== 'undefined' ? current_model.attributes.module_type : current_model.attributes.type;
// determine the column type. Check the parent, if parent == row_inner, then column type = column_inner
if ( 'column' === module_type || 'column_inner' === module_type || 'specialty' === is_specialty ) {
parent_row = ET_PageBuilder_Modules.findWhere( { cid : current_model.attributes.parent } );
// inner columns may have column module_type, so check the parent row to determine the column_inner type
if ( 'column' === module_type && 'row_inner' === parent_row.attributes.module_type ) {
module_type = 'column_inner';
}
}
// check whether the module order exist for current module_type otherwise set to 0
module_order = typeof this.order_modules_array[ module_type ] !== 'undefined' ? this.order_modules_array[ module_type ] : 0;
current_model.attributes.module_order = module_order;
// reset columns_order attribute to recalculate it properly
if ( ( 'row' === module_type || 'row_inner' === module_type || 'section' === module_type ) && typeof current_model.attributes.columns_order !== 'undefined' ) {
current_model.attributes.columns_order = [];
}
// columns order should be stored in the Row/Specialty section as well
if ( 'column' === module_type || 'column_inner' === module_type || 'specialty' === is_specialty ) {
if ( typeof parent_row.attributes.columns_order !== 'undefined' ) {
parent_row.attributes.columns_order.push( module_order );
} else {
parent_row.attributes.columns_order = [ module_order ];
}
}
// calculate child items for modules which support them and update count in module attributes
if ( typeof modules_with_child[ module_type ] !== 'undefined' ) {
child_slug = modules_with_child[ module_type ];
start_from = typeof this.order_modules_array['children_count'][ child_slug ] !== 'undefined' ? this.order_modules_array['children_count'][ child_slug ] : 0;
current_model.attributes.child_start_from = start_from; // this attributed used as a start point for calculation of child modules order
if ( typeof current_model.attributes.et_pb_content_new !== 'undefined' && '' !== current_model.attributes.et_pb_content_new ) {
var et_pb_shortcodes_tags = ET_PageBuilder_App.getShortCodeChildTags();
var reg_exp = window.wp.shortcode.regexp( et_pb_shortcodes_tags );
var matches = current_model.attributes.et_pb_content_new.match( reg_exp );
start_from += null !== matches ? matches.length : 0;
}
this.order_modules_array['children_count'][ child_slug ] = start_from;
}
// increment the module order for current module_type
this.order_modules_array[ module_type ] = module_order + 1;
},
setModuleAddresses: function( cid, index, parent_address ) {
var module = ET_PageBuilder_Modules.findWhere( { cid : cid } );
var children = ET_PageBuilder_Modules.where( { parent : cid } );
if ( _.isUndefined( module ) ) {
return;
}
var module_type = _.isUndefined( module.attributes.module_type ) ? module.attributes.type : module.attributes.module_type;
var current_address = module.get( '_address' );
var new_address = 'section' === module_type ? index.toString() : parent_address + '.' + index.toString();
var path = _.isUndefined( current_address ) ? false : 'et_pb_module_settings_migrations.value_changes.' + current_address;
var has_migrations = path ? has( et_pb_options, path ) : false;
if ( has_migrations && new_address !== current_address ) {
// Update module settings migration data
et_pb_options.et_pb_module_settings_migrations.value_changes[new_address] = _.clone( et_pb_options.et_pb_module_settings_migrations.value_changes[current_address] );
delete et_pb_options.et_pb_module_settings_migrations.value_changes[current_address];
}
module.set( { _address: new_address } );
if ( ! _.isUndefined( children ) && children.length > 0 ) {
_.forEach( children, function( child_module, child_index ) {
ET_PageBuilder_App.setModuleAddresses( child_module.attributes.cid, child_index, new_address );
} );
}
},
updateAdvancedModulesOrder: function( $this_el ) {
var $modules_container = typeof $this_el !== 'undefined' ? $this_el.find( '.et-pb-option-advanced-module-settings' ) : $( '.et-pb-option-advanced-module-settings' ),
modules_count = 0,
$modules_list;
if ( $modules_container.length ) {
$modules_list = $modules_container.find( '.et-pb-sortable-options > li' );
if ( $modules_list.length ) {
$modules_list.each( function() {
var $this_item = $( this ),
this_cid = $this_item.data( 'cid' ),
current_model,
current_parent,
start_from;
current_model = ET_PageBuilder_Modules.findWhere( { cid : this_cid } );
current_parent = ET_PageBuilder_Modules.findWhere( { cid : current_model.attributes.parent_cid } );
start_from = typeof current_parent.attributes.child_start_from !== 'undefined' ? current_parent.attributes.child_start_from : 0;
current_model.attributes.module_order = modules_count + start_from;
modules_count++;
});
}
}
}
} );
ET_PageBuilder.Controls = {};
ET_PageBuilder.Controls.BorderRadiusControl = function (container) {
this.initialize(container);
};
$.extend(ET_PageBuilder.Controls.BorderRadiusControl.prototype, {
initialize: function(container) {
this._container = container;
this._setting_field = container.siblings('.et-pb-main-setting');
if (!this._setting_field.length) {
return false;
}
this._link_button = container.find('.et-pb-border-radius-wrap-link-button > a');
this._radius_fields = container.find('.et-pb-border-radius-option-input');
this._radius_preview = container.find('.et-pb-border-radius-preview');
this._defalut_value = _.isUndefined(this._setting_field.data('default_inherited')) ? this._setting_field.data('default') : this._setting_field.data('default_inherited');
var setting_value = this._setting_field.val();
if (_.isEmpty(setting_value)) {
setting_value = this._defalut_value;
this._setting_field.val(this._defalut_value);
}
var combined_value = setting_value;
this._values = this._splitValue(combined_value);
this._lastValue = '';
this._setting_field.change(this._onSettingChange.bind(this));
this._radius_fields.change(this._onFieldChange.bind(this));
this._link_button.click(this._onClickLink.bind(this));
this._render();
},
_onClickLink: function(e) {
e.preventDefault();
e.stopPropagation();
var currentLinkState = this._getSettingValue('border-link');
//if the user clicks on the link icon in the middle, all values will become the last modified value
if (!currentLinkState) {
//if that is not traceable, change all four the to the upper left corner value
if (this._lastValue === '') {
this._lastValue = this._getSettingValue('top-left');
}
var spreadValues = this._spreadValue(this._lastValue);
this._onChange(this._combineValues(spreadValues));
} else {
var currentValues = this._getValues();
currentValues['border-link'] = false;
this._onChange(this._combineValues(currentValues));
}
},
_onSettingChange: function(e) {
var combinedValue = !_.isUndefined(e.target.value) && e.target.value !== '' ? e.target.value : this._getDefaultValue();
this._values = this._splitValue(combinedValue);
this._render();
},
_onChange: function(value) {
var combinedValue = _.isUndefined(value) ? this._getDefaultValue() : value;
$(this._setting_field).val(combinedValue);
this._values = this._splitValue(combinedValue);
$(this._setting_field).trigger('et_pb_setting:change');
this._render();
},
_isOn: function(value) {
return value === 'on';
},
_isLinkedMode: function() {
return this._getSettingValue('border-link');
},
_spreadValue: function(value) {
return {
'border-link': true,
'top-left': value,
'top-right': value,
'bottom-right': value,
'bottom-left': value
};
},
_onFieldChange: function(e) {
var sanitizedValue = et_pb_sanitize_input_unit_value(e.target.value, false);
this._lastValue = sanitizedValue;
var values;
if (this._isLinkedMode()) {
values = this._spreadValue(sanitizedValue);
} else {
var corner = e.target.getAttribute('data-corner');;
values = this._getValues();
values[corner] = sanitizedValue;
}
this._onChange(this._combineValues(values));
},
_getDefaultValue: function() {
return !_.isUndefined(this._defalut_value) &&
(this._defalut_value !== '') ? this._setting_field.val() : 'on||||';
},
_getValues: function() {
return this._values;
},
_getSettingValue: function(valueName) {
var values = this._getValues();
return values[valueName];
},
_splitValue: function(combinedValue) {
var values = combinedValue.split('|');
return {
'border-link': !_.isUndefined(values[0]) ? this._isOn(values[0]) : true,
'top-left': !_.isUndefined(values[1]) && values[1] !== '' ? values[1] : '0px',
'top-right': !_.isUndefined(values[2]) && values[2] !== '' ? values[2] : '0px',
'bottom-right': !_.isUndefined(values[3]) && values[3] !== '' ? values[3] : '0px',
'bottom-left': !_.isUndefined(values[4]) && values[4] !== '' ? values[4] : '0px'
};
},
_combineValues: function(values) {
return (values['border-link'] ? 'on' : '') + '|' + values['top-left'] + '|' +
values['top-right'] + '|' + values['bottom-right'] + '|' + values['bottom-left'];
},
_render: function() {
//render fields
_.each(this._radius_fields, function(field) {
$(field).val(this._getSettingValue($(field).data('corner')));
}, this);
//render link button
$(this._link_button).toggleClass('active', this._getSettingValue('border-link'));
//render preview area
$(this._radius_preview).css('border-top-left-radius', this._getSettingValue('top-left'));
$(this._radius_preview).css('border-top-right-radius', this._getSettingValue('top-right'));
$(this._radius_preview).css('border-bottom-right-radius', this._getSettingValue('bottom-right'));
$(this._radius_preview).css('border-bottom-left-radius', this._getSettingValue('bottom-left'));
},
});
ET_PageBuilder.Controls.BorderRadius = function (container) {
var tabbed_controls = container.find('.et-pb-border-radius-wrap');
if (tabbed_controls.length) {
tabbed_controls.each(function() {
new ET_PageBuilder.Controls.BorderRadiusControl($(this));
});
}
};
ET_PageBuilder.Controls.TabbedControl = function (container) {
this.initialize(container);
};
$.extend(ET_PageBuilder.Controls.TabbedControl.prototype, {
_getByPath: function(object, path) {
return _.reduce(path.split('.'), function(prevObj, currObj) {
return prevObj ? prevObj[currObj] : undefined
}, object);
},
initialize: function(container) {
var _tabs = container.find('.et-pb-settings-tab');
var _content_divs = container.find('.et-pb-settings-tab-content');
if (!_tabs.length || !_content_divs.length) {
return false;
}
var thisClass = this;
this._$container = container;
this._suffix = container.data('attr-suffix');
this._tabs = {};
this._tab_content = {};
this._first_tab = null;
this._active_tab = null;
this._tab_settings_map = null;
this._outside_preview = container.find('.et-pb-outside-preview-container');
this._reset_button = container.closest('.et-pb-composite-tabbed-wrapper').siblings('.et-pb-composite-tabbed-reset-setting');
this._is_child_settings_container = container.parents('.et_pb_modal_settings_container').hasClass('et_pb_modal_settings_container_step2');
_tabs.each(function() {
var tab = $(this).find('.et-pb-settings-tab-title');
thisClass._tabs[$(tab).data('tab')] = tab;
if (tab.length) {
tab.click(thisClass._onClickTab.bind(thisClass));
}
});
_content_divs.each(function(index, element) {
var tabIndex = $(element).data('tab')
thisClass._tab_content[tabIndex] = {
'content' : this,
'preview-area': $(element).find('.et-pb-tab-preview-container'),
};
if (index === 0) {
thisClass._first_tab = tabIndex;
thisClass._active_tab = tabIndex;
}
});
//wait until control reset icon will be initialized
//it has 50ms delay at first control initialization
setTimeout(function() {
thisClass._buildTabSettingsMap();
$(_content_divs).on('et_pb_setting:change et_pb_setting:color_picker:change', thisClass._onChangeHandler.bind(thisClass));
$(_content_divs).on('change', 'select', thisClass._onChangeHandler.bind(thisClass));
$(thisClass._reset_button).on('click', thisClass._onClickReset.bind(thisClass));
thisClass._render();
}, 100);
},
_buildTabSettingsMap: function() {
var result = {};
_.map(this._tab_content, function(tab, tabIndex) {
result[tabIndex] = {};
var isTabSettingModified = false;
$(tab['content']).find('.et-pb-main-setting').each(function(index, element) {
var defaultValue = et_pb_get_default_setting_value($(element));
var controlIndex = $(element).parents('.et-pb-composite-tabbed-option').data('control-index');
result[tabIndex][controlIndex] = {};
result[tabIndex][controlIndex]['default'] = defaultValue;
result[tabIndex][controlIndex]['value'] = ET_PageBuilder.Helpers.getSettingValue($(element));
isTabSettingModified = isTabSettingModified || !et_pb_is_setting_value_default($(element));
});
result[tabIndex]['modified'] = isTabSettingModified;
});
this._tab_settings_map = result;
},
_isAnySettingModified: function() {
var result = false;
_.map(this._tab_settings_map, function(tab) {
if (this._getByPath(tab, 'modified')) {
result = true;
}
}, this);
return result;
},
_onChangeHandler: function(e) {
//Workaround for handling color picker changes
setTimeout(this._onSettingChange.bind(this), 100);
},
_onSettingChange: function() {
this._buildTabSettingsMap();
this._render();
},
_onClickTab: function(e) {
e.preventDefault();
var tab = e.target.getAttribute('data-tab');
this._makeTabActive(tab);
this._render();
},
_onClickReset: function() {
var that = this;
_.map(this._tab_settings_map, function(tab) {
_.map(tab, function(value, setting) {
$control = that._$container.find('[data-control-index="' + setting + '"]');
$control.find('.et-pb-reset-setting').trigger('click');
}, this);
});
this._active_tab = this._first_tab;
},
_makeTabActive: function(tab) {
this._active_tab = tab;
},
_showTab: function(tab) {
$(this._tabs[tab]).closest('.et-pb-settings-tab').addClass('active');
$(this._tab_content[tab]['content']).show();
},
_hideTab: function(tab) {
$(this._tabs[tab]).closest('.et-pb-settings-tab').removeClass('active');
$(this._tab_content[tab]['content']).hide();
},
_renderOutsidePreviewArea: function(previewContainer) {
return false;
},
_renderTabPreviewArea: function(tab, previewContainer) {
return false;
},
_render: function() {
this._renderOutsidePreviewArea(this._outside_preview);
this._renderTabPreviewArea(this._active_tab, this._tab_content[this._active_tab]['preview-area']);
_.map(this._tabs, function (tab, tabIndex) {
if (tabIndex === this._active_tab) {
this._showTab(tabIndex);
} else {
this._hideTab(tabIndex);
}
if (this._tab_settings_map[tabIndex]['modified']) {
$(this._tabs[tabIndex]).closest('.et-pb-settings-tab').addClass('modified');
} else {
$(this._tabs[tabIndex]).closest('.et-pb-settings-tab').removeClass('modified');
}
}, this);
if (this._isAnySettingModified()) {
$(this._reset_button).addClass('et-pb-reset-icon-visible');
} else {
$(this._reset_button).removeClass('et-pb-reset-icon-visible');
}
},
});
ET_PageBuilder.Controls.Tabbed = function (container) {
var tabbed_controls = container.find('.et-pb-composite-tabbed');
if (tabbed_controls.length) {
tabbed_controls.each(function() {
new ET_PageBuilder.Controls.TabbedControl($(this));
});
}
};
ET_PageBuilder.Controls.BorderStylesControl = function (container) {
this._setting_values = null;
this._had_previously_resetted = false;
this.initialize(container);
};
$.extend(ET_PageBuilder.Controls.BorderStylesControl.prototype, ET_PageBuilder.Controls.TabbedControl.prototype, {
_processWidth: function(value) {
var width = parseInt(value);
if (width > 50) {
width = 50;
}
return et_pb_sanitize_input_unit_value(width.toString(), false, 'px');
},
_setControlInitials: function($element) {
var that = this;
var controlIndex = $element.parents('.et-pb-composite-tabbed-option').data('control-index');
this._setting_values[controlIndex] = {};
var saved_value = $element.data('saved_value');
var defaultKey = et_pb_get_default_key($element);
var value = '';
var defaultValue = '';
var parentDefault = '';
if ($element.hasClass('et-pb-range')) {
var $range_input = $element.siblings('.et-pb-range-input');
defaultValue = $range_input.data(defaultKey);
parentDefault = $range_input.data('default_inherited');
value = $range_input.val();
//assign special flag for checking 'default' data attribute instead of backbone
//model defaults array while saving child setting
$range_input.data('check_attr_default', 'yes');
} else {
value = $element.val();
defaultValue = $element.data(defaultKey);
parentDefault = $element.data('default_inherited');
//assign special flag for checking 'default' data attribute instead of backbone
//model defaults array while saving child setting
$element.data('check_attr_default', 'yes');
}
var defaultForComparison = _.isUndefined(defaultValue) ? '' : defaultValue;
var valueForComparison = '';
if (_.isUndefined(saved_value)) {
valueForComparison = value;
} else {
if (_.isEmpty(saved_value)) {
if (value === defaultValue) {
valueForComparison = defaultValue;
} else {
valueForComparison = '';
}
} else {
valueForComparison = saved_value;
}
}
var isSettingModified = valueForComparison !== defaultForComparison;
if (!_.isEmpty(parentDefault)) {//for child setting
if (_.isEmpty(valueForComparison) || valueForComparison === parentDefault) {
isSettingModified = false;
}
}
//if child setting and the setting is modified in parent we should adjust control according to the setting value
if (!_.isEmpty(parentDefault) && defaultValue !== parentDefault && !isSettingModified) {
that._updateControl($element, defaultValue, false);
}
//saved setting value
this._setting_values[controlIndex]['saved_value'] = isSettingModified ? valueForComparison : '';
//default value
this._setting_values[controlIndex]['default_value'] = defaultValue;
//default from parent
this._setting_values[controlIndex]['default_inherited'] = parentDefault;
//control itself
this._setting_values[controlIndex]['control'] = $element;
//get control edge
var lastUnderscoreIndex = controlIndex.replace(this._suffix, '').lastIndexOf('_');
var edge = controlIndex.substr(lastUnderscoreIndex).replace(this._suffix, '');
//related tab
this._setting_values[controlIndex]['tab'] = 'border' + edge;
var modified = this._tab_settings_map['border' + edge]['modified'];
this._tab_settings_map['border' + edge]['modified'] = modified || isSettingModified;
},
_recalculateEdgeSettings: function(controlIndex) {
if (controlIndex.indexOf('all') === -1) {//control not from All tab so nothing to change
return;
}
//get setting type
var lastUnderscoreIndex = controlIndex.replace(this._suffix, '').lastIndexOf('_');
var settingType = controlIndex.substr(0, lastUnderscoreIndex);//one of border_color, border_width, border_style
var that = this;
_.map(this._setting_values, function(values, setting) {
if (setting.indexOf(settingType) !== -1 && setting.indexOf('all') === -1) {//setting related to edge tab
var $element = values['control'];
var allTabValue = _.isEmpty(that._setting_values[controlIndex]['saved_value']) ?
that._setting_values[controlIndex]['default_value'] : that._setting_values[controlIndex]['saved_value'];
if (_.isEmpty(values['default_inherited'])) {//update logic for parent settings
values['default_value'] = allTabValue;
if (_.isEmpty(values['saved_value'])) {//edge setting is not modified
that._updateControl($element, allTabValue, allTabValue);//update value and control default
} else {
that._updateControl($element, false, allTabValue);//update only control default
}
} else {//update logic for child settings
//implementing the same behavior as within VB
allTabValue = that._setting_values[controlIndex]['saved_value'];
var allTabDefault = that._setting_values[controlIndex]['default_value'];
if (_.isEmpty(values['saved_value'])) {//edge setting is not modified
if (!_.isEmpty(allTabValue)) {//rewrite child edge setting only if All tab setting is modified
//save edge default to be able to restore setting value in case of All tab setting will be not modified
if (_.isEmpty(values['saved_default'])) {
values['saved_default'] = values['default_value'];
}
values['default_value'] = allTabValue;
that._updateControl($element, allTabValue, allTabValue);//update value and control default
} else {
if (!_.isEmpty(values['saved_default'])) {//restore child setting value from previously saved default
var previousDefault = values['saved_default'];
values['default_value'] = previousDefault;
that._updateControl($element, previousDefault, previousDefault);
values['saved_default'] = '';
} else {
if (values['default_value'] === values['default_inherited']) {
values['default_value'] = allTabDefault;
that._updateControl($element, allTabDefault, allTabDefault);
} else {
that._updateControl($element, values['default_value'], false);
}
}
}
} else {//edge setting is modified so assign default from All tab
var defaultValue = _.isEmpty(allTabValue) ? allTabDefault : allTabValue;
values['default_value'] = defaultValue;
that._updateControl($element, values['saved_value'], defaultValue);
}
}
}
});
},
_onSettingChange: function($element, controlIndex, resetFlag) {
var value = resetFlag ? '' : ET_PageBuilder.Helpers.getSettingValue($element);
this._updateSetting(controlIndex, value);
this._recalculateEdgeSettings(controlIndex);
},
_onChangeHandler: function(e, param) {
//if change event fired after change value according all tab then skip it
if (!_.isUndefined(param) && param === 'et_pb_from_all_tab') {
return;
}
var $element = $(e.target);
var controlIndex = $element.parents('.et-pb-composite-tabbed-option').data('control-index');
var resetFlag = !_.isUndefined(param) && param === 'et_pb_reset_setting';
//avoid double setting change after reset
if (this._had_previously_resetted) {
this._had_previously_resetted = false;
return;
}
if (resetFlag) {
this._had_previously_resetted = true;
}
//otherwise handle control updates
if (e.type === 'et_pb_setting:color_picker:change') {//handle color picker changes in different way
this._updateSetting(controlIndex, param);
this._recalculateEdgeSettings(controlIndex);
} else if (controlIndex.indexOf('color') === -1) {
this._onSettingChange($element, controlIndex, resetFlag);
}
this._render();
},
_updateSetting: function(controlIndex, value) {
var that = this;
var setting = this._setting_values[controlIndex];
var isSettingModified = value !== setting['default_value'];
setting['saved_value'] = !isSettingModified ? '' : value;
var tab = setting['tab'];
var isTabModified = false;
_.map(this._tab_settings_map[tab], function(control, controlIndex) {
if (controlIndex !== 'modified') {
var settingValue = that._setting_values[controlIndex]['saved_value'];
var defaultValue = that._setting_values[controlIndex]['default_value'];
isSettingModified = !_.isEmpty(settingValue) && (settingValue !== defaultValue);
isTabModified = isTabModified || isSettingModified;
}
});
this._tab_settings_map[tab]['modified'] = isTabModified;
},
_updateControl: function($element, value, defaultValue) {
var defaultKey = et_pb_get_default_key($element);
var isRange = $element.hasClass( 'et-pb-range' );
var rangeInput = null;
if (isRange) {
rangeInput = $element.siblings( '.et-pb-range-input' );
}
if (defaultValue) {
if (isRange) {
rangeInput.data(defaultKey, defaultValue);
$element.data(defaultKey, parseFloat(defaultValue) || 0);
} else {
$element.data(defaultKey, defaultValue);
}
}
if (value) {
if (isRange) {
$element.val(parseFloat(value) || 0);
$element = rangeInput;
}
$element.val(value).trigger('change', ['et_pb_from_all_tab']);
}
},
_resetAllTab: function() {
var that = this;
_.map(this._setting_values, function(values, setting) {
if (setting.indexOf('all') !== -1) {//setting related to All tab
values['saved_value'] = '';
that._updateControl(values['control'], values['default_value'], false);
that._recalculateEdgeSettings(setting);
}
});
},
_resetEdgeTabs: function() {
var that = this;
_.map(this._setting_values, function(values, setting) {
if (setting.indexOf('all') === -1) {//setting related to edge tab
//handle parent and child setting defaults in different way
if (_.isEmpty(values['default_inherited'])) {//parent setting
values['default_value'] = '';
} else {//child setting
if (!_.isEmpty(values['saved_default'])) {//restore child setting value from previously saved default
values['default_value'] = values['saved_default'];
values['saved_default'] = '';
}
}
values['saved_value'] = '';
}
});
},
_onClickReset: function() {
if (this._is_child_settings_container) {
this._resetAllTab();
this._resetEdgeTabs();
} else {
this._resetEdgeTabs();
this._resetAllTab();
}
this._active_tab = this._first_tab;
this._render();
},
_buildTabSettingsMap: function() {
var that = this;
var result = {};
_.map(this._tab_content, function(tab, tabIndex) {
result[tabIndex] = {};
$(tab['content']).find('.et-pb-main-setting').each(function(index, element) {
var controlIndex = $(element).parents('.et-pb-composite-tabbed-option').data('control-index');
result[tabIndex][controlIndex] = {};
});
result[tabIndex]['modified'] = false;
});
this._tab_settings_map = result;
//on first run walk through all settings and initialize _setting_values
if (this._setting_values === null) {
this._setting_values = {};
//run through edge tabs first
_.map(this._tab_content, function(tab, tabIndex) {
if (tabIndex !== 'border_all') {
$(tab['content']).find('.et-pb-main-setting').each(function(index, element) {
that._setControlInitials($(element));
});
}
});
//then through all edge tab
$(this._tab_content['border_all']['content']).find('.et-pb-main-setting').each(function(index, element) {
that._setControlInitials($(element));
var controlIndex = $(element).parents('.et-pb-composite-tabbed-option').data('control-index');
that._recalculateEdgeSettings(controlIndex);
});
}
},
_renderTabPreviewArea: function(tab, previewContainer) {
var borderEdges = [
'top',
'right',
'bottom',
'left'
];
var properties = [
'width',
'style',
'color'
];
var previewBorderStyles = {};
_.forEach(borderEdges, function(edge) {
var edgeCSS = '';
_.forEach(properties, function(property) {
var path = 'border_' + property + '_' + edge + this._suffix;
var value = _.isEmpty(this._setting_values[path]['saved_value']) ?
this._setting_values[path]['default_value'] : this._setting_values[path]['saved_value'];
if (property == 'width') {
value = this._processWidth(value);
}
edgeCSS += ' ' + value;
}, this);
previewBorderStyles['border-' + edge] = edgeCSS;
}, this);
_.map(previewBorderStyles, function(value, property){
previewContainer.find('.et-pb-tab-preview-container-preview').css(property, value);
}, this);
},
});
ET_PageBuilder.Controls.BorderStyles = function (container) {
var tabbed_controls = container.find('.et-pb-composite-tabbed-border-style');
if (tabbed_controls.length) {
tabbed_controls.each(function() {
new ET_PageBuilder.Controls.BorderStylesControl($(this));
});
}
};
// Close and remove right click options
function et_pb_close_all_right_click_options() {
// Remove right click options UI
$('#et-builder-right-click-controls').remove();
// Remove builder overlay (right/left click anywhere outside builder to close right click options UI)
$('#et_pb_layout_right_click_overlay').remove();
}
$('body').on( 'click contextmenu', '#et_pb_layout_right_click_overlay', function( event ){
event.preventDefault();
et_pb_close_all_right_click_options();
});
function et_pb_is_builder_used() {
return $('#et_pb_use_builder').val() === 'on';
}
function et_pb_activate_upload( $upload_button ) {
$upload_button.click( function( event ) {
var $this_el = $(this);
event.preventDefault();
et_pb_file_frame = wp.media.frames.et_pb_file_frame = new wp.media.view.MediaFrame.ETSelect({
title: $this_el.data( 'choose' ),
library: {
type: $this_el.data( 'type' )
},
button: {
text: $this_el.data( 'update' ),
},
multiple: false
});
et_pb_file_frame.on( 'select', function() {
var url = et_pb_file_frame.state().props.get('url');
var $upload_field = $this_el.siblings( '.et-pb-upload-field' );
$upload_field.val( url );
$upload_field.trigger( 'change' );
et_pb_generate_preview_content( $this_el );
});
et_pb_file_frame.on( 'insert', function() {
var selectedMediaItem = et_pb_file_frame.state().get('selection').models[0];
if ( ! _.isUndefined( selectedMediaItem ) ) {
var $upload_field = $this_el.siblings( '.et-pb-upload-field' );
$upload_field.val( selectedMediaItem.get('url') );
$upload_field.trigger( 'change' );
et_pb_generate_preview_content( $this_el );
}
});
et_pb_file_frame.open();
} );
$upload_button.siblings( '.et-pb-upload-field' ).on( 'input', function() {
et_pb_generate_preview_content( $(this).siblings( '.et-pb-upload-button' ) );
} );
$upload_button.siblings( '.et-pb-upload-field' ).each( function() {
et_pb_generate_preview_content( $(this).siblings( '.et-pb-upload-button' ) );
} );
}
function et_pb_activate_gallery( $gallery_button ) {
$gallery_button.click( function( event ) {
var $this_el = $(this),
$gallery_ids = $gallery_button.closest( '.et-pb-options-tab' ).find( '.et-pb-option-gallery_ids .et-pb-gallery-ids-field' ),
$gallery_orderby = $gallery_button.closest( '.et-pb-options-tab' ).find( '.et-pb-option-gallery_orderby .et-pb-gallery-ids-field' );
event.preventDefault();
// Check if the `wp.media.gallery` API exists.
if ( typeof wp === 'undefined' || ! wp.media || ! wp.media.gallery )
return;
var gallery_ids = $gallery_ids.val().length ? ' ids="' + $gallery_ids.val() + '"' : '',
gallery_orderby = $gallery_orderby.val().length ? ' orderby="' + $gallery_orderby.val() + '"' : '',
gallery_shortcode = '[gallery' + gallery_ids + gallery_orderby + ']';
et_pb_file_frame = wp.media.frames.et_pb_file_frame = wp.media.gallery.edit( gallery_shortcode );
if ( !gallery_ids ) {
et_pb_file_frame.setState('gallery-library');
}
// Remove the 'Columns' and 'Link To' unneeded settings
function remove_unneeded_gallery_settings( $el ) {
setTimeout(function(){
$el.find( '.gallery-settings' ).find( 'label.setting' ).each(function() {
if ( $(this).find( '.link-to, .columns, .size' ).length ) {
$(this).remove();
} else {
if ( $(this).has( 'input[type=checkbox]' ).length ) {
$(this).children( 'input[type=checkbox]' ).css( 'margin', '11px 5px' );
}
}
});
}, 10 );
}
// Remove initial unneeded settings
remove_unneeded_gallery_settings( et_pb_file_frame.$el );
// Remove unneeded settings upon re-viewing edit view
et_pb_file_frame.on( 'content:render:browse', function( browser ){
remove_unneeded_gallery_settings( browser.$el );
});
et_pb_file_frame.state( 'gallery-edit' ).on( 'update', function( selection ) {
var shortcode_atts = wp.media.gallery.shortcode( selection ).attrs.named;
if ( shortcode_atts.ids ) {
$gallery_ids.val( shortcode_atts.ids );
}
if ( shortcode_atts.orderby ) {
$gallery_orderby.val( shortcode_atts.orderby );
} else {
$gallery_orderby.val( '' );
}
});
});
}
function et_pb_email_lists_select_get_provider( $select ) {
return $select
.siblings( 'input' )
.attr( 'id' )
.replace( 'et_pb_', '' )
.replace( '_list', '' );
}
function et_pb_email_lists_add_new_account( $accounts_select, settingsView ) {
var provider = et_pb_email_lists_select_get_provider( $accounts_select );
var $container = $accounts_select.closest( '.et-pb-option--select_with_option_groups' );
var $api_fields = $container.parent().find('[class*="et_pb_email_' + provider + '"]:visible');
var data = {};
var nonce_key = 'et_builder_email_add_account_nonce';
$api_fields.each( function() {
var key = $(this).attr( 'id' ).replace( 'pb_', '' );
if ( endsWith( key, '_list' ) ) {
return;
}
data[key] = $(this).val();
} );
function complete( data ) {
$accounts_select
.val( $accounts_select.data( 'previous_value' ) )
.trigger( 'change' );
$api_fields.val( '' );
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
if ( 'error' in data && data.error ) {
alert( data.message );
}
}
data.action = 'et_builder_email_add_account';
data[nonce_key] = et_pb_options.et_builder_email_add_account_nonce;
data.et_bb = true;
data.et_provider = provider;
$.ajax({
type: 'POST',
url: et_pb_options.ajaxurl,
data: data
}).done( function( data, status, response ) {
data = JSON.parse( data );
$accounts_select.html( _.template( data.accounts_list ).bind( settingsView )( settingsView.model.attributes ) );
complete( data );
}).fail( complete );
}
function et_pb_email_fetch_lists( $accounts_select, $button, settingsView ) {
var provider = et_pb_email_lists_select_get_provider( $accounts_select );
var account_name = $accounts_select.data( 'selected_account' );
function complete( data ) {
$accounts_select
.val( $accounts_select.data( 'previous_value' ) )
.trigger( 'change' );
$button.removeClass( 'fetch_lists_in_progress' );
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
if ( 'error' in data && data.error ) {
alert( data.message );
}
}
$.ajax({
type: 'POST',
url: et_pb_options.ajaxurl,
data: {
action: 'et_builder_email_get_lists',
et_builder_email_fetch_lists_nonce: et_pb_options.et_builder_email_fetch_lists_nonce,
et_provider: provider,
et_account: account_name,
et_bb: true
}
}).done( function( data, status, response ) {
data = JSON.parse( data );
$accounts_select.html( _.template( data.accounts_list )( settingsView.model.attributes ) );
complete( data );
}).fail( complete );
}
function et_pb_email_remove_account( $accounts_select, settingsView ) {
var provider = et_pb_email_lists_select_get_provider( $accounts_select );
var account_name = $accounts_select.data( 'selected_account' );
function complete( data ) {
$accounts_select
.val( 'none' )
.trigger( 'change' );
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
if ( 'error' in data && data.error ) {
alert( data.message );
}
}
$.ajax({
type: 'POST',
url: et_pb_options.ajaxurl,
data: {
action: 'et_builder_email_remove_account',
et_builder_email_remove_account_nonce: et_pb_options.et_builder_email_remove_account_nonce,
et_provider: provider,
et_account: account_name,
et_bb: true
}
}).done( function( data, status, response ) {
data = JSON.parse( data );
$accounts_select.html( _.template( data.accounts_list )( settingsView.model.attributes ) );
complete( data );
}).fail( complete );
}
function et_pb_email_setup_submit_cancel_buttons( $buttons, $accounts_select, settingsView ) {
$buttons.on( 'click', function() {
if ( $(this).hasClass( 'et_pb_email_submit' ) ) {
// Submit button
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
et_pb_email_lists_add_new_account( $accounts_select, settingsView );
} else {
// Cancel button
$accounts_select
.val( $accounts_select.data( 'previous_value' ) )
.trigger( 'change' );
}
});
$buttons.appendTo( $buttons.parent() );
}
function et_pb_email_lists_buttons_setup( $add_account_buttons, settingsView ) {
var dependencies = window.et_pb_module_field_dependencies.et_pb_signup;
$add_account_buttons.each( function() {
var $add_account_button = $(this);
var $accounts_select = $add_account_button.siblings( 'select' );
var $fetch_lists_button = $add_account_button.siblings( '.et_pb_email_force_fetch_lists' );
var $remove_account_button = $add_account_button.siblings( '.et_pb_email_remove_account' );
var $value_field = $(this).siblings( 'input' );
var field_name = $value_field.closest( '.et-pb-option' ).data( 'option_name' );
var affects = _.keys( dependencies[field_name].affects );
var $affects;
affects = _.map( affects, function( affect ) { return '#et_pb_' + affect; } ).join( ', ' );
$affects = $(this).closest( '.et-pb-options-tab' ).find( affects );
$affects.one( 'et-pb-option-field-shown', function() {
var $buttons = $(this).siblings( 'button' );
et_pb_email_setup_submit_cancel_buttons( $buttons, $accounts_select, settingsView );
});
$fetch_lists_button.data( 'original_text', $fetch_lists_button.text() );
$remove_account_button.data( 'original_text', $remove_account_button.text() );
$accounts_select.on( 'change', function() {
var value = $(this).val();
if ( 'add_new_account' === value && ! $accounts_select.parent().hasClass( 'new_account_in_progress' ) ) {
$accounts_select.parent().addClass( 'new_account_in_progress' );
$('<span>')
.text( $accounts_select.data( 'adding_new_account_text' ) )
.insertAfter( $accounts_select )
.addClass( 'et_pb_email_account_message' );
$add_account_button
.hide()
.siblings()
.not( 'span' )
.hide();
if ( $accounts_select.siblings( '#et_pb_aweber_list' ).length > 0 ) {
window.open( 'https://auth.aweber.com/1.0/oauth/authorize_app/b17f3351' );
}
} else if ( 'fetch_lists' === value && ! $accounts_select.parent().hasClass( 'fetch_lists_in_progress' ) ) {
$accounts_select.parent().addClass( 'fetch_lists_in_progress' );
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
et_pb_email_fetch_lists( $accounts_select, $add_account_button, settingsView );
} else if ( 'remove_account' === value && ! $accounts_select.parent().hasClass( 'remove_account_in_progress' )) {
$accounts_select.parent().addClass( 'remove_account_in_progress' );
$add_account_button
.hide()
.siblings('p')
.hide();
$remove_account_button.text( $remove_account_button.data( 'confirm_text' ) );
$fetch_lists_button.text( $fetch_lists_button.data( 'cancel_text' ) );
var msg = $accounts_select.data( 'confirm_remove_text' ) + ' ' + $accounts_select.data( 'selected_account' );
$('<span>')
.text( msg )
.insertAfter( $accounts_select )
.addClass( 'et_pb_email_account_message' );
$accounts_select.hide();
} else {
$accounts_select.parent().removeClass( 'new_account_in_progress remove_account_in_progress fetch_lists_in_progress' );
var $modal_save_buttons = settingsView.$el.prev().find( '.et-pb-modal-save, .et-pb-modal-save-template' );
$modal_save_buttons.css( 'cursor', '' );
if ( 'none' === value ) {
$accounts_select.parent().addClass( 'no_account_selected' );
} else {
$accounts_select.parent().removeClass( 'no_account_selected' );
}
$add_account_button.show();
$remove_account_button.text( $remove_account_button.data( 'original_text' ) );
$fetch_lists_button.text( $fetch_lists_button.data( 'original_text' ) );
if ( ! value || 'none' === value ) {
$remove_account_button.hide();
$fetch_lists_button.hide();
} else {
$remove_account_button.show();
$fetch_lists_button.show();
}
$add_account_button.siblings('span').remove();
$add_account_button.siblings('p').show();
$accounts_select.show();
}
});
$add_account_button.click( function() {
var $modal_save_buttons = settingsView.$el.prev().find( '.et-pb-modal-save, .et-pb-modal-save-template' );
$modal_save_buttons.css( 'cursor', 'not-allowed' );
$accounts_select
.data( 'previous_value', $accounts_select.val() )
.val( 'add_new_account' )
.trigger( 'change' );
});
$fetch_lists_button.click( function() {
if ( $accounts_select.parent().hasClass( 'remove_account_in_progress' ) ) {
// Cancel button clicked
$accounts_select
.val( $accounts_select.data( 'previous_value' ) )
.trigger( 'change' );
return;
}
var account = $accounts_select
.find(':selected')
.parent()
.attr('label');
$accounts_select.data( 'selected_account', account );
$accounts_select
.data( 'previous_value', $accounts_select.val() )
.val( 'fetch_lists' )
.trigger( 'change' );
});
$remove_account_button.click( function() {
if ( $accounts_select.parent().hasClass( 'remove_account_in_progress' ) ) {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
et_pb_email_remove_account( $accounts_select, settingsView );
return;
}
var account = $accounts_select
.find(':selected')
.parent()
.attr('label');
if ( ! account ) {
return;
}
$accounts_select.data( 'selected_account', account );
$accounts_select
.data( 'previous_value', $accounts_select.val() )
.val( 'remove_account' )
.trigger( 'change' );
});
setTimeout( function() {
$accounts_select.trigger( 'change' );
}, 200 );
});
}
function et_pb_generate_video_image( $video_image_button ) {
$video_image_button.click( function( event ) {
var $this_el = $(this),
$upload_field = $( '#et_pb_src.et-pb-upload-field' ),
video_url = $upload_field.val().trim();
event.preventDefault();
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_video_get_oembed_thumbnail',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_video_url : video_url
},
success: function( response ) {
if ( response.length ) {
$('#et_pb_image_src').val( response ).trigger('input');
} else {
$this_el.after( '<div class="et-pb-error">' + et_pb_options.video_module_image_error + '</div>' );
$this_el.siblings('.et-pb-error').delay(5000).fadeOut(800);
}
}
} );
} );
}
function et_pb_generate_preview_content( $upload_button ){
if ( $upload_button.length < 1 ) {
return;
}
var $upload_field = $upload_button.siblings( '.et-pb-upload-field' ),
$preview = $upload_field.siblings( '.et-pb-upload-preview' ),
$background_preview = $upload_field.closest( '.et-pb-option' ).find( '.et-pb-option-preview' ),
has_preview = $background_preview.length,
image_url = $upload_field.val().trim(),
type = $upload_button.data( 'type' ),
module_type = $upload_button.closest( '.et_pb_module_settings' ).attr( 'data-module_type' ),
featured_image = $upload_button.closest('.et-pb-options-tabs').find('#et_pb_featured_image').val(),
featured_placement = $upload_button.closest('.et-pb-options-tabs').find('#et_pb_featured_placement').val(),
featured_image_src = $('#postimagediv img').attr('src'),
is_featured_image = _.contains( et_pb_options.et_builder_modules_featured_image_background, module_type ) && featured_image === 'on' && featured_placement === 'background',
base_name = $upload_field.closest( '.et-pb-option-container-inner' ).attr( 'data-base_name' ),
prefix = 'background' === base_name ? '' : base_name + '_';
// Overwrite image field by featured image in particular modules
if ( is_featured_image ) {
image_url = featured_image_src;
$background_preview.addClass( 'et-pb-featured-image-background' );
} else {
$background_preview.removeClass( 'et-pb-featured-image-background' );
}
if ( type !== 'image' && ! ( type === 'video' && has_preview ) ) return;
if ( image_url === '' ) {
if ( has_preview ) {
$background_preview.addClass( 'et-pb-option-preview--empty' ).find('.et-pb-preview-content').remove();
return;
} else if ( $preview.length ) {
$preview.remove();
}
return;
}
if ( has_preview ) {
$background_preview.find('.et-pb-preview-content').remove();
var $background_container = $upload_button.closest( '.et-pb-option-container--background' ),
$background_settings_fields = $background_container.find('input, select'),
column_index = $background_container.attr('data-column-index'),
background_images = [ 'url(' + image_url + ')' ],
gradient_backround = et_pb_get_gradient( $background_container.find( '.et_pb_background-tab--gradient' ), base_name ),
background_settings = {},
preview_content = '',
has_background_gradient = false,
has_background_image = false;
if ( gradient_backround ) {
has_background_gradient = true;
background_images.push( gradient_backround );
}
$background_settings_fields.each(function() {
if ( typeof $(this).attr('id') !== 'undefined' ) {
var name = $(this).attr( 'id' ).replace( 'et_pb_', '' ),
value = $(this).val(),
default_value = typeof $(this).attr( 'data-default' ) !== 'undefined' ? $(this).attr( 'data-default' ) : '',
has_value = value !== '' && typeof value !== 'undefined';
// Column adjustment
if ( typeof column_index !== 'undefined' ) {
name = name.replace( '_' + column_index, '' );
}
background_settings[ name ] = has_value ? value : default_value;
}
});
if ( type === 'image' ) {
var is_parallax = background_settings[prefix + 'parallax'] === 'on',
imageStyle = {
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
};
if ( is_parallax ) {
imageStyle.backgroundImage = 'url(' + image_url + ')';
imageStyle.backgroundRepeat = 'no-repeat';
imageStyle.backgroundSize = 'cover';
imageStyle.backgroundPosition = 'center';
} else {
if (typeof background_settings[base_name + '_position'] === 'undefined' ) {
background_settings[base_name + '_position'] = '';
}
if ( background_settings[base_name + '_color_gradient_overlays_image'] === 'on' ) {
background_images.reverse();
}
has_background_image = true;
imageStyle.backgroundImage = background_images.join(', ');
imageStyle.backgroundSize = background_settings[base_name + '_size'];
imageStyle.backgroundPosition = background_settings[base_name + '_position'].replace( '_', ' ' );
imageStyle.backgroundRepeat = background_settings[base_name + '_repeat'];
imageStyle.backgroundBlendMode = background_settings[base_name + '_blend'];
if ( has_background_gradient && has_background_image ) {
imageStyle.backgroundColor = 'initial';
} else {
imageStyle.backgroundColor = background_settings[base_name + '_color'];
}
}
preview_content = $('<div />', {
class: 'et-pb-preview-content'
}).css( imageStyle );
} else if ( type === 'video' ) {
preview_content = $('<video />', {
class: 'et-pb-preview-content',
src: image_url,
loop: true,
controls: true,
height: 190
} );
}
$background_preview.removeClass( 'et-pb-option-preview--empty' ).prepend( preview_content );
} else if ( ! $preview.length ) {
$upload_button.siblings('.description').before( '<div class="et-pb-upload-preview">' + '<strong class="et-pb-upload-preview-title">' + et_pb_options.preview_image + '</strong>' + '<img src="" width="408" /></div>' );
$preview = $upload_field.siblings( '.et-pb-upload-preview' );
}
$preview.find( 'img' ).attr( 'src', image_url );
}
function et_pb_reposition_colorpicker_element( $colorpicker ) {
var $colorpicker_container = $colorpicker.closest( '.et-pb-option-container' ),
handle_width = parseInt( $colorpicker_container.find( '.iris-square-value.ui-draggable' ).width() ),
handle_left = parseInt( $colorpicker_container.find( '.iris-square-value.ui-draggable' ).css( 'left' ) ) + ( handle_width / 2 ),
container_width = parseInt( $colorpicker_container.width() ),
iris_strip_right_max = 50;
if ( $colorpicker !== '' && handle_left > ( container_width - iris_strip_right_max ) ) {
$colorpicker_container.addClass( 'on-right-corner' );
} else {
$colorpicker_container.removeClass( 'on-right-corner' );
}
}
var ET_PageBuilder_Events = _.extend( {}, Backbone.Events ),
ET_PageBuilder_Layout = new ET_PageBuilder.Layout,
ET_PageBuilder_Modules = new ET_PageBuilder.Modules,
ET_PageBuilder_Histories = new ET_PageBuilder.Histories,
ET_PageBuilder_App = new ET_PageBuilder.AppView( {
model : ET_PageBuilder.Module,
collection : ET_PageBuilder_Modules,
history : ET_PageBuilder_Histories
} ),
ET_PageBuilder_Visualize_Histories = new ET_PageBuilder.visualizeHistoriesView,
$et_pb_content = $( '#et_pb_hidden_editor' ),
et_pb_content_html = $et_pb_content.html(),
et_pb_file_frame,
$toggle_builder_button = $('#et_pb_toggle_builder'),
$toggle_builder_button_wrapper = $('.et_pb_toggle_builder_wrapper'),
$builder = $( '#et_pb_layout' ),
$et_pb_old_content = $('#et_pb_old_content'),
$post_format_wrapper = $('#formatdiv'),
$use_builder_custom_field = $( '#et_pb_use_builder' ),
$main_editor_wrapper = $( '#et_pb_main_editor_wrap' ),
$et_pb_setting = $( '.et_pb_page_setting' ),
$et_pb_layout_settings = $( '.et_pb_page_layout_settings' ),
$et_pb_templates_cache = [],
et_pb_globals_requested = 0,
et_pb_globals_loaded = 0,
et_pb_processed_yoast_content = false,
et_pb_quick_tags_init_done = {};
ET_PageBuilder.Events = ET_PageBuilder_Events;
var ET_PageBuilder_AB_Testing = {
is_active : function () {
return $( '#et_pb_use_ab_testing' ).length && 'on' === $( '#et_pb_use_ab_testing' ).val() ? true : false;
},
toggle_status : function( status ) {
var $input = $( '#et_pb_use_ab_testing' ),
inputValue = $input.val(),
status = _.isUndefined( status ) ? false : status;
if ( ( inputValue === 'on' && ! status ) || ( ( inputValue === 'off' || inputValue === '' ) && status ) ) {
$input.addClass( 'et_pb_value_updated' );
}
set_this_editor_in_use();
if ( status ) {
$input.val( 'on' );
this.toggle_portability( false );
} else {
$input.val( 'off' );
}
},
toggle_portability : function( status ) {
var $portability_button = $( '.et-pb-app-portability-button' ),
disable_class = 'et-core-disabled',
is_currently_disabled = $portability_button.hasClass( disable_class );
// If no explicit status passed, do toggling
if ( _.isUndefined( status ) ) {
status = is_currently_disabled ? true : false;
}
// false === disabling
if ( status ) {
$portability_button.removeClass( disable_class );
} else {
$portability_button.addClass( disable_class );
}
},
get_stats_refresh_interval : function () {
return $( '#et_pb_ab_stats_refresh_interval' ).length ? $( '#et_pb_ab_stats_refresh_interval' ).val() : 'hourly';
},
get_shortcode_tracking_status : function() {
return $( '#et_pb_enable_shortcode_tracking' ).length && '' !== $( '#et_pb_enable_shortcode_tracking' ).val() ? $( '#et_pb_enable_shortcode_tracking' ).val() : 'off';
},
is_active_based_on_models : function () {
var subjects = ET_PageBuilder_Modules.where({ et_pb_ab_subject : 'on' }),
goal = ET_PageBuilder_Modules.where({ et_pb_ab_goal : 'on'});
return ( subjects.length > 1 && goal.length > 0 );
},
has_permission : function () {
if ( et_pb_ab_js_options.has_permission === '1' ) {
return true;
} else {
return false;
}
},
check_create_db : function () {
if ( 'exists' !== et_pb_options.ab_db_status ) {
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_create_ab_tables',
et_pb_ab_nonce : et_pb_options.ab_testing_builder_nonce,
},
success: function( response ) {
if ( ! response.length || 'success' !== response ) {
return false;
}
et_pb_options.ab_db_status = 'exists';
}
} );
}
return true;
},
is_selecting_subject : function() {
if ( ! _.isUndefined( ET_PageBuilder_App.is_selecting_ab_testing_subject ) && ET_PageBuilder_App.is_selecting_ab_testing_subject === true ) {
return true;
} else {
return false;
}
},
is_selecting_goal : function() {
if ( ! _.isUndefined( ET_PageBuilder_App.is_selecting_ab_testing_goal ) && ET_PageBuilder_App.is_selecting_ab_testing_goal === true ) {
return true;
} else {
return false;
}
},
is_selecting_winner : function() {
if ( ! _.isUndefined( ET_PageBuilder_App.is_selecting_ab_testing_winner ) && ET_PageBuilder_App.is_selecting_ab_testing_winner === true ) {
return true;
} else {
return false;
}
},
is_selecting : function() {
if ( this.is_selecting_subject() || this.is_selecting_goal() || this.is_selecting_winner() ) {
return true;
} else {
return false;
}
},
is_subject : function( model ) {
if ( this.is_active() && ! ET_PageBuilder_Layout.is_app( model ) && model.has( 'et_pb_ab_subject' ) && model.get( 'et_pb_ab_subject' ) === 'on' ) {
return true;
}
return false;
},
is_subject_children : function( model ) {
var parent_views = ET_PageBuilder_Layout.getParentViews( model.attributes.parent ),
result = false;
if ( ! _.isEmpty( parent_views ) ) {
_.each( parent_views, function( parent_view ) {
if ( ! _.isUndefined( parent_view.model.get( 'et_pb_ab_subject' ) ) && parent_view.model.get( 'et_pb_ab_subject' ) === 'on' ) {
result = true;
}
} );
}
return result;
},
is_unremovable_subject : function( model ) {
if ( this.is_active() && this.is_subject( model ) && this.subjects().length < 3 ) {
return true;
} else {
return false;
}
},
is_goal : function( model ) {
if ( this.is_active() && ! ET_PageBuilder_Layout.is_app( model ) && model.has( 'et_pb_ab_goal' ) && model.get( 'et_pb_ab_goal' ) === 'on' ) {
return true;
}
return false;
},
is_goal_children : function ( model ) {
var parent_views = ET_PageBuilder_Layout.getParentViews( model.attributes.parent ),
result = false;
if ( ! _.isEmpty( parent_views ) ) {
_.each( parent_views, function( parent_view ) {
if ( ! ET_PageBuilder_Layout.is_app( model ) && parent_view.model.has( 'et_pb_ab_goal' ) && parent_view.model.get( 'et_pb_ab_goal' ) === 'on' ) {
result = true;
}
} );
}
return result;
},
is_user_has_permission : function( cid, context, model ) {
if ( ! cid ) {
return false;
}
// Get view
var view = ET_PageBuilder_Layout.getView( cid ),
model = _.isUndefined( model ) ? view.model : model,
has_permission = ET_PageBuilder_AB_Testing.has_permission(),
is_subject = ET_PageBuilder_AB_Testing.is_subject( model ),
is_subject_children = ET_PageBuilder_AB_Testing.is_subject_children( model ),
has_subject = ET_PageBuilder_AB_Testing.has_subject( model ),
is_goal = ET_PageBuilder_AB_Testing.is_goal( model ),
is_goal_children = ET_PageBuilder_AB_Testing.is_goal_children( model ),
has_goal = ET_PageBuilder_AB_Testing.has_goal( model ),
status;
if ( context === 'section' ) {
status = is_subject || has_subject || is_goal || has_goal;
} else if ( context === 'module' ) {
status = is_subject || is_subject_children || is_goal || is_goal_children;
} else if ( context === 'add_module' ) {
status = is_subject || is_subject_children || is_goal || is_goal_children;
} else if ( context === 'add_row' ) {
status = is_subject_children || is_goal_children;
} else if ( context === 'paste' ) {
status = is_subject_children || is_goal_children;
} else if ( context === 'copy' ) {
status = is_subject || has_subject || is_goal || has_goal;
} else {
status = is_subject || is_subject_children || has_subject || is_goal || is_goal_children || has_goal;
}
// User with no ab_testing permisson cannot modify Split testing-related item
if ( ! has_permission && status ) {
return false;
}
return true;
},
is_split_test_item : function( model ) {
if (
this.is_subject( model ) ||
this.is_subject_children( model ) ||
this.has_subject( model ) ||
this.is_goal( model ) ||
this.is_goal_children( model ) ||
this.has_goal( model )
) {
return true;
}
return false;
},
filter_goals : function( models ) {
var goals = _.filter( models, function( model ) {
if ( model.has( 'et_pb_ab_goal' ) && model.get( 'et_pb_ab_goal' ) === 'on' ) {
return true;
}
return false;
});
return goals;
},
filter_subjects : function( models ) {
var subjects = _.filter( models, function( model ) {
if ( model.has( 'et_pb_ab_subject' ) && model.get( 'et_pb_ab_subject' ) === 'on' ) {
return true;
}
return false;
});
return subjects;
},
filter_models_by_cids : function( cids, models ) {
var filtered_models;
models = _.isUndefined( models ) ? ET_PageBuilder_Modules.models : models;
filtered_models = _.filter( models, function( model ) {
if ( $.inArray( model.get( 'parent' ), cids ) !== -1 ) {
return true;
}
return false;
});
return filtered_models;
},
pluck_cids_from_models : function( models ) {
var cids = [];
_.each( models, function( model ){
cids.push( model.get( 'cid' ) );
});
return cids;
},
has_goal : function ( model ) {
var cid = typeof model.get === 'function' ? model.get( 'cid' ) : false,
has_goal = false;
if ( this.is_active() && cid !== false ) {
_.each( ET_PageBuilder_Layout.getChildrenViews( cid ), function( child_view ) {
if ( child_view.model.get( 'et_pb_ab_goal' ) === 'on' ) {
has_goal = true;
}
});
}
return has_goal;
},
has_subject : function( model ) {
var cid = typeof model.get === 'function' ? model.get( 'cid' ) : false,
has_subject = false;
if ( this.is_active() ) {
_.each( ET_PageBuilder_Layout.getChildrenViews( cid ), function( child_view ) {
if ( child_view.model.get( 'et_pb_ab_subject' ) === 'on' ) {
has_subject = true;
}
});
}
return has_subject;
},
has_unremovable_subject : function( model ) {
var cid = model.get( 'cid' ),
type = model.get( 'type' ),
rows,
row_is_subject,
rows_cid = [],
row_inner,
row_inner_is_goal,
columns,
columns_cid = [],
modules,
module_is_subject;
if ( this.is_active() ) {
if ( type === 'section' ) {
// Get row's models
rows = ET_PageBuilder_Modules.where({ parent : cid } );
// Look for row as subjects
row_is_subject = this.filter_subjects( rows );
// Return true if this section gets deleted, remaining subject will be less than two
if ( ( this.count_subjects() - row_is_subject.length ) < 2 ) {
return true;
}
// Get row's cids
rows_cid = this.pluck_cids_from_models( rows );
// Specialty Section's adjustment :: it has one level deep tp get into rows_cid
if ( ! _.isUndefined( model.get( 'et_pb_specialty' ) ) && model.get( 'et_pb_specialty' ) === 'on' ) {
// Look for row_inner models
row_inner = this.filter_models_by_cids( rows_cid );
// Look for row_inner as subject
row_inner_is_subject = this.filter_subjects( row_inner );
// Return true if this row_inner gets deleted, remaining subject will be less than two
if ( ( this.count_subjects() - row_inner_is_subject.length ) < 2 ) {
return true;
}
// Passes row_inner cids as row cids
rows_cid = this.pluck_cids_from_models( row_inner );
}
}
if ( type === 'row' || type === 'row_inner' ) {
// Set cid as row cids
rows_cid = [cid];
}
if ( type === 'section' || type === 'row_inner' || type === 'row' ) {
// Get column's models
columns = this.filter_models_by_cids( rows_cid );
// Get column's cids
columns_cid = this.pluck_cids_from_models( columns );
// Get module's models
modules = this.filter_models_by_cids( columns_cid );
// Look for module as subject
module_is_subject = this.filter_subjects( modules );
// Return true if this row gets deleted, remaining subject will be less than two
if ( ( this.count_subjects() - module_is_subject.length ) < 2 ) {
return true;
}
}
}
return false;
},
subjects : function () {
var subjects = ET_PageBuilder_Modules.where({ et_pb_ab_subject : 'on' })
return subjects;
},
subject_ids : function () {
var subjects = this.subjects(),
subject_ids = [];
if ( subjects.length > 0 ) {
_.each( subjects, function( subject ) {
if ( subject.has( 'et_pb_ab_subject_id' ) ) {
subject_ids.push( subject.get( 'et_pb_ab_subject_id' ) );
}
} );
}
return subject_ids;
},
count_subjects : function() {
return this.subjects().length;
},
get_subject_id : function() {
if ( 0 === this.count_subjects() ) {
return 0;
}
var all_subjects = this.subjects(),
subject_ids = [];
_.each( all_subjects, function( subject ) {
if ( subject.has( 'et_pb_ab_subject_id' ) ) {
subject_ids.push( parseInt( subject.get( 'et_pb_ab_subject_id' ) ) );
} else {
subject_ids.push( 0 );
}
} );
return ( Math.max.apply( Math, subject_ids ) + 1 ).toString();
},
set_subject : function( view, waiting ) {
var that = this;
// make sure ab testing database tables created otherwise wait until creating process is finished
if ( 'exists' !== et_pb_options.ab_db_status ) {
setTimeout( function() {
that.set_subject( view, 'waiting' );
}, 500 );
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
return;
}
// finish the loading gif if it was started
if ( typeof waiting !== 'undefined' && 'waiting' === waiting ) {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
}
// Assign attribute
view.model.set( 'et_pb_ab_subject', 'on' );
view.model.set( 'et_pb_ab_subject_id', that.get_subject_id() );
// Mark as selected
view.$el.addClass( 'et_pb_ab_subject' );
// Turn off subject selecting mode
ET_PageBuilder_App.is_selecting_ab_testing_subject = false;
$( '#et_pb_layout' ).removeClass( 'et_pb_select_ab_testing_subject' );
// Turn on goal selecting mode if needed
if ( ET_PageBuilder_AB_Testing.count_subjects() < 2 ) {
ET_PageBuilder_App.is_selecting_ab_testing_goal = true;
$( '#et_pb_layout' ).addClass( 'et_pb_select_ab_testing_goal' );
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_goal' );
}
// Update shortcode layout
ET_PageBuilder_App.saveAsShortcode();
},
set_subject_rank_coloring : function( view ) {
var subjects_rank = et_pb_ab_js_options.subjects_rank,
subject_id = view.model.has( 'et_pb_ab_subject_id' ) ? 'subject_' + view.model.get( 'et_pb_ab_subject_id' ) : false,
type = view.model.get( 'type' ),
title_selector = '.et-pb-module-title';
// Adjust title selector
switch( type ) {
case 'section' :
title_selector = '.et-pb-section-title';
break;
case 'row_inner' :
title_selector = '.et-pb-row-title';
break;
case 'row' :
title_selector = '.et-pb-row-title';
break;
}
if ( subject_id && ! _.isUndefined( subjects_rank[subject_id] ) && ! _.isUndefined( subjects_rank[subject_id]['rank'] ) && ! _.isUndefined( subjects_rank[subject_id]['percentage'] ) ) {
view.$el.addClass( 'rank-' + subjects_rank[subject_id]['rank'] );
view.$el.find(title_selector).append( " (" + subjects_rank[subject_id]['percentage'] + ")" );
}
// Add subject ID marker
if ( view.model.has( 'et_pb_ab_subject_id' ) ) {
if ( type === 'module' ) {
view.$el.find('.et-pb-ab-subject-id').remove();
view.$el.find('.et-pb-remove').after( $('<span />', { class : 'et-pb-ab-subject-id' } ).text( view.model.get( 'et_pb_ab_subject_id' ) ) );
} else {
view.$el.find('.et-pb-ab-subject-id').remove();
view.$el.find(title_selector).append( $('<span />', { class : 'et-pb-ab-subject-id' } ).text( view.model.get( 'et_pb_ab_subject_id' ) ) );
}
}
},
set : function ( view, event ) {
if ( this.is_selecting_subject() ) {
// Disguiese all global-item related attributes into while being used as Split test
if ( ET_PageBuilder_Layout.is_global( view.model ) || ET_PageBuilder_Layout.is_global_children( view.model ) ) {
ET_PageBuilder_Layout.removeGlobalAttributes( view, true );
}
this.set_subject( view );
setTimeout( function() {
ET_PageBuilder_App.disable_publish = true;
$( '#publish' ).addClass( 'disabled' );
}, 750 );
return;
} else if ( this.is_selecting_goal() ) {
// Prevent row / section of selected subject to be set as subject
if ( this.has_subject( view.model ) ) {
this.alert( 'cannot_select_subject_parent_as_goal' );
return;
}
// Mark as doing combination. This force disables enable_history
ET_PageBuilder_App.is_doing_combination = true;
// Disguise all global-item related attributes while being used as Split test goal
// global item behaviour removes Split testing goal attributes when its setting modal
// saves modified configuration
if ( ET_PageBuilder_Layout.is_global( view.model ) || ET_PageBuilder_Layout.is_global_children( view.model ) ) {
ET_PageBuilder_Layout.removeGlobalAttributes( view, true );
}
// Assign attribute
view.model.set( 'et_pb_ab_goal', 'on' );
// Mark as selected
view.$el.addClass( 'et_pb_ab_goal' );
// Turn off goal selecting mode
ET_PageBuilder_App.is_selecting_ab_testing_goal = false;
$( '#et_pb_layout' ).removeClass( 'et_pb_select_ab_testing_goal' );
// update post meta with the Goal Module slug
$( '#et_pb_ab_goal_module' ).val( view.options.model.attributes.module_type );
// Duplicate subject
var subject_model = ET_PageBuilder_Modules.findWhere({ et_pb_ab_subject : 'on' }),
subject_view = _.isUndefined( subject_model.cid ) ? false : ET_PageBuilder_Layout.getView( subject_model.get( 'cid' ) );
if ( subject_view ) {
var clone_subject,
view_settings = {
model : subject_view.model,
view : subject_view.$el,
view_event : event
};
clone_subject = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
clone_subject.copy( event );
clone_subject.pasteAfter( event );
ET_PageBuilder_AB_Testing.alert( 'configure_ab_testing_alternative' );
// Update Split Testing Status
this.update();
}
// Update shortcode layout & rebuild the UI
et_reinitialize_builder_layout();
// Wait until et_reinitialize_builder_layout() sequences have been finished
// to disable is_doing_combination status
setTimeout( function() {
ET_PageBuilder_App.is_doing_combination = false;
ET_PageBuilder_App.allowHistorySaving( 'turnon', 'abtesting' );
// Display view stats icon
$( '#et_pb_layout .et-pb-app-view-ab-stats-button' ).addClass( 'active' );
delete ET_PageBuilder_App.disable_publish;
$( '#publish' ).removeClass( 'disabled' );
}, 650 );
return;
} else if ( this.is_selecting_winner() ) {
if ( view.options.model.has( 'et_pb_ab_subject' ) && view.options.model.get( 'et_pb_ab_subject' ) === 'on' ) {
// Find other blocks model then remove it
var ab_testing_subjects = ET_PageBuilder_Modules.where({ et_pb_ab_subject : 'on' }),
view_type,
view;
// Mark as doing combination. This force disables enable_history
ET_PageBuilder_App.is_doing_combination = true;
// Turn off Split testing's winner selecting mode
ET_PageBuilder_App.is_selecting_ab_testing_winner = false;
// Loop subjects
_.each( ab_testing_subjects, function( subject ) {
// Remove unselected subject
if ( view.model.attributes.cid !== subject.attributes.cid ) {
subject_view = ET_PageBuilder_Layout.getView( subject.attributes.cid );
view_type = subject_view.model.get( 'type' );
if ( view_type === 'section' ) {
subject_view.removeSection();
} else if ( view_type === 'row' || view_type === 'row_inner' ) {
subject_view.removeRow();
} else if ( view_type === 'module' ) {
subject_view.removeModule();
}
}
});
// Remove Split testing related data
view.model.unset( 'et_pb_ab_subject' );
view.model.unset( 'et_pb_ab_subject_id' );
// Auto expand collapsed winner
if ( view.model.has( 'et_pb_collapsed' ) && view.model.get( 'et_pb_collapsed' ) === 'on' ) {
view.model.unset( 'et_pb_collapsed' );
}
// Return all disguised global item into actual global item
if ( ET_PageBuilder_Layout.is_temp_global( view.model ) || ET_PageBuilder_Layout.is_temp_global_children( view.model ) ) {
et_pb_create_prompt_modal( 'set_global_subject_winner', undefined, undefined, undefined, { view : view } );
return;
}
// Turn off Split testing sequence
this.turn_off_ab_testing_sequence();
return;
} else {
// Prompt modal box to select winner
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_winner_first' );
return;
}
}
},
turn_off_ab_testing_sequence : function () {
// Reset subjects_rank data
et_pb_ab_js_options.subjects_rank = {};
// Save as shortcode & rebuild builder
et_reinitialize_builder_layout();
// Wait until et_reinitialize_builder_layout() sequences have been finished
// to disable is_doing_combination status
setTimeout( function() {
ET_PageBuilder_App.is_doing_combination = false;
ET_PageBuilder_App.allowHistorySaving( 'turnoff', 'abtesting' );
delete ET_PageBuilder_App.disable_publish;
$( '#publish' ).removeClass( 'disabled' );
}, 650 );
// Remove nescesarry class for Split testing winner selection mode's UI
$( '#et_pb_layout' ).removeClass( 'et_pb_select_ab_testing_winner' );
// Hide view stats icon
$( '#et_pb_layout .et-pb-app-view-ab-stats-button' ).removeClass( 'active' );
// Re-enable portability
this.toggle_portability( true );
// clear stats for disabled test
$.ajax({
type : "POST",
url : et_pb_options.ajaxurl,
data : {
action : 'et_pb_ab_clear_stats',
et_pb_ab_nonce : et_pb_options.ab_testing_builder_nonce,
et_pb_test_id : et_pb_ab_js_options.test_id
},
success : function( response ) {
// Reset report data
et_pb_ab_js_options.has_report = false;
ET_PageBuilder_App.ab_stats = {};
}
});
},
update_saved_subject_ids : function () {
var subject_ids = this.subject_ids(),
formatted_subject_ids = subject_ids.join();
if ( $( '#et_pb_ab_subjects' ).val() !== formatted_subject_ids ) {
$( '#et_pb_ab_subjects' ).val( formatted_subject_ids ).addClass('et_pb_value_updated');
}
set_this_editor_in_use();
},
update_layout : function () {
if ( this.is_active() ) {
/* Layout adjustment */
setTimeout( function() {
// Add disable subject removal class
var $et_pb_layout = $( '#et_pb_layout' );
if ( ET_PageBuilder_AB_Testing.count_subjects() < 3 ) {
$et_pb_layout.addClass( 'et_pb_ab_disable_subject_removal' );
} else {
$et_pb_layout.removeClass( 'et_pb_ab_disable_subject_removal' );
}
}, 100 );
/* Individual subject adjustment */
// Section
if ( $( '.et_pb_section.et_pb_ab_subject' ).length ) {
$( '.et_pb_ab_subject_first' ).removeClass( 'et_pb_ab_subject_first' );
$( '.et_pb_ab_subject_last' ).removeClass( 'et_pb_ab_subject_last' );
$( '.et_pb_section' ).each(function(){
var $section = $(this);
$section.find( '.et_pb_section.et_pb_ab_subject:first' ).addClass( 'et_pb_ab_subject_first' );
$section.find( '.et_pb_section.et_pb_ab_subject:last' ).addClass( 'et_pb_ab_subject_last' );
});
// Loop sections, adjust section class
$( '.et_pb_section.et_pb_ab_subject' ).each(function() {
var $section = $(this);
if ( ! $section.prev().hasClass( 'et_pb_ab_subject' ) ) {
$section.addClass( 'et_pb_ab_subject_first' );
}
if ( ! $section.next().hasClass( 'et_pb_ab_subject' ) ) {
$section.addClass( 'et_pb_ab_subject_last' );
}
});
}
// Row
if ( $( '.et_pb_row.et_pb_ab_subject' ).length ) {
$( '.et_pb_ab_subject_first' ).removeClass( 'et_pb_ab_subject_first' );
$( '.et_pb_ab_subject_last' ).removeClass( 'et_pb_ab_subject_last' );
$( '.et_pb_section' ).each(function(){
var $section = $(this);
$section.find( '.et_pb_row.et_pb_ab_subject:first' ).addClass( 'et_pb_ab_subject_first' );
$section.find( '.et_pb_row.et_pb_ab_subject:last' ).addClass( 'et_pb_ab_subject_last' );
});
// Loop rows, adjust row class
$( '.et_pb_row.et_pb_ab_subject' ).each(function() {
var $row = $(this);
if ( ! $row.prev().hasClass( 'et_pb_ab_subject' ) ) {
$row.addClass( 'et_pb_ab_subject_first' );
}
if ( ! $row.next().hasClass( 'et_pb_ab_subject' ) ) {
$row.addClass( 'et_pb_ab_subject_last' );
}
});
}
if ( $( '.et_pb_row.et_pb_ab_subject.et_pb_ab_no_permission' ).length || $( '.et_pb_row.et_pb_ab_goal.et_pb_ab_no_permission' ).length ) {
$( '.et_pb_row.et_pb_ab_subject.et_pb_ab_no_permission, .et_pb_row.et_pb_ab_goal.et_pb_ab_no_permission' ).each( function() {
var $row = $(this);
$row.closest( '.et_pb_section' ).addClass( 'et_pb_ab_no_permission_parent' );
});
}
// Module
if ( $( '.et_pb_module_block.et_pb_ab_subject' ).length ) {
$( '.et_pb_ab_subject_first' ).removeClass( 'et_pb_ab_subject_first' );
$( '.et_pb_ab_subject_last' ).removeClass( 'et_pb_ab_subject_last' );
// Loop columns, adjust module class
$( '.et-pb-column' ).each(function(){
var $column = $(this);
$column.find( '.et_pb_module_block.et_pb_ab_subject:first' ).addClass( 'et_pb_ab_subject_first' );
$column.find( '.et_pb_module_block.et_pb_ab_subject:last' ).addClass( 'et_pb_ab_subject_last' );
});
// Loop subjects, adjust module class
$( '.et_pb_module_block.et_pb_ab_subject' ).each(function(){
var $module = $(this);
if ( ! $module.prev().hasClass( 'et_pb_ab_subject' ) ) {
$module.addClass( 'et_pb_ab_subject_first' );
}
if ( ! $module.next().hasClass( 'et_pb_ab_subject' ) ) {
$module.addClass( 'et_pb_ab_subject_last' );
}
});
}
if ( $( '.et_pb_module_block.et_pb_ab_subject.et_pb_ab_no_permission' ).length || $( '.et_pb_module_block.et_pb_ab_goal.et_pb_ab_no_permission' ).length ) {
$( '.et_pb_module_block.et_pb_ab_subject.et_pb_ab_no_permission, .et_pb_module_block.et_pb_ab_goal.et_pb_ab_no_permission' ).each( function() {
var $module_block = $(this);
$module_block.closest( '.et_pb_row' ).addClass( 'et_pb_ab_no_permission_parent' );
$module_block.closest( '.et_pb_section' ).addClass( 'et_pb_ab_no_permission_parent' );
});
}
// Make sure that there is at least one expanded subject for carousel effect
var expand_first_subject = true,
$first_subject,
first_subject_cid,
first_subject_view;
_.each( this.subjects(), function( subject ){
if ( ! subject.has( 'et_pb_collapsed' ) || subject.get( 'et_pb_collapsed' ) === 'off' ) {
expand_first_subject = false;
}
});
if ( expand_first_subject ) {
$first_subject = $('.et_pb_ab_subject:first');
first_subject_cid = $first_subject.children( '.et-pb-data-cid' ).attr( 'data-cid' );
first_subject_view = ET_PageBuilder_Layout.getView( first_subject_cid );
if ( $first_subject.length && ! _.isUndefined( first_subject_view ) ) {
$first_subject.removeClass( 'et_pb_collapsed' );
first_subject_view.model.set( 'et_pb_collapsed', 'off' );
}
}
}
},
update : function () {
this.update_saved_subject_ids();
this.update_layout();
},
is_alert_valid : function( alert_id ) {
// Prevent similar alert to be toggled twice
if ( ! _.isUndefined( ET_PageBuilder_App.ab_last_visible_alert ) && ET_PageBuilder_App.ab_last_visible_alert === alert_id ) {
return false;
}
// Log last visible alert
ET_PageBuilder_App.ab_last_visible_alert = alert_id;
return true;
},
alert : function( alert_id ) {
// Prevent similar alert to be toggled twice
if ( ! this.is_alert_valid( alert_id ) ) {
return;
}
// Display alert
et_pb_create_prompt_modal( 'ab_testing_alert', undefined, undefined, undefined, { id : alert_id } );
},
alert_yes_no : function( alert_id ) {
// Prevent similar alert to be toggled twice
if ( ! this.is_alert_valid( alert_id ) ) {
return;
}
// Display alert
et_pb_create_prompt_modal( 'ab_testing_alert_yes_no', undefined, undefined, undefined, { id : alert_id } );
},
get_all_subjects_stats_settings : function( analysis ) {
var $tab = $( '.view-stats-tab[data-analysis="' + analysis + '"]' ),
$subjects_filter = $tab.find( '.et-pb-ab-view-stats-subjects-filter' ),
$durations_filter = $tab.find( '.et-pb-ab-view-stats-time-filter' ),
$analysis_tab_nav = $tab.find( '.et-pb-options-tabs-links' ),
table_column_key = ['first', 'second', 'third', 'fourth', 'fifth'],
settings = {
subject_statuses : [],
subject_ids : [],
table : {
thead : [],
tbody : {},
tfoot : []
}
},
data;
if ( ! $durations_filter.find( '.active' ).length ) {
$durations_filter.find('a[data-duration="' + et_pb_ab_js_options.refresh_interval_duration + '"]').addClass('active');
}
data = ET_PageBuilder_App.ab_stats[ $durations_filter.find( '.active' ).attr( 'data-duration' ) ];
// Get active subjects
$subjects_filter.find( 'a' ).each(function(){
var $filter = $(this),
subject_status = ! $filter.hasClass( 'inactive' ),
subject_has_data = ! $filter.parent( 'li' ).hasClass( 'et-pb-no-data' ),
subject_id = $filter.attr( 'data-subject-id' );
if ( subject_has_data ) {
settings.subject_statuses.push( subject_status );
}
if ( subject_status && subject_has_data ) {
settings.subject_ids.push( parseInt( subject_id ) );
}
});
// Push table's heading data
for ( var thead_tr_index = 0; thead_tr_index < 5; thead_tr_index++ ) {
settings.table.thead[ table_column_key[ thead_tr_index ] ] = et_pb_ab_js_options['view_stats_thead_titles'][ analysis ][ thead_tr_index ];
}
// Push table's body data
if ( ! _.isUndefined( data ) ) {
_.each( data.subjects_id, function( subject_id ) {
var subject_key = 'subject_' + subject_id,
subject_model = ET_PageBuilder_Modules.findWhere({ et_pb_ab_subject_id : subject_id }),
subject_name = _.isUndefined( subject_model ) || ! subject_model.has( 'admin_label' ) ? false : subject_model.get( 'admin_label' );
if ( ! subject_name || $.inArray( parseInt( subject_id ), settings.subject_ids ) === -1 ) {
return;
}
settings.table.tbody[ subject_key ] = {
first : subject_id,
second : subject_name,
third : data['subjects_totals'][ subject_key ][ et_pb_ab_js_options['analysis_formula'][ analysis ]['denominator'] ],
fourth : data['subjects_totals'][ subject_key ][ et_pb_ab_js_options['analysis_formula'][ analysis ]['numerator'] ],
fifth : data['subjects_totals'][ subject_key ][ analysis ]+ '%'
};
});
settings.table.tfoot = {
first : et_pb_ab_js_options.total_title,
second : null,
third : data['events_totals'][ et_pb_ab_js_options['analysis_formula'][ analysis ]['denominator'] ],
fourth : data['events_totals'][ et_pb_ab_js_options['analysis_formula'][ analysis ]['numerator'] ],
fifth : data['events_totals'][ analysis ] + '%'
};
}
return settings;
},
switch_view_stats_tab : function() {
var $tab_nav = $( '.et-pb-options-tabs-links' ),
$tabs_wrapper = $( '.et-pb-ab-view-stats-content.has-data' ),
active_analysis = $tab_nav.find( 'li.et-pb-options-tabs-links-active' ).attr( 'data-analysis' );
$tabs_wrapper.find( '.view-stats-tab' ).removeClass( 'active' );
$tabs_wrapper.find( '.view-stats-tab[data-analysis="' + active_analysis + '"]' ).addClass( 'active' );
},
display_stats_tabs : function( data ) {
var this_el = this,
thead_template = _.template("<tr><th><%= first %></th><th><%= second %></th><th><%= third %></th><th><%= fourth %></th><th><%= fifth %></th></tr>"),
tbody_row_template = _.template("<tr><td><%= first %></td><td><%= second %></td><td><%= third %></td><td><%= fourth %></td><td><%= fifth %></td></tr>"),
tfoot_template = _.template("<tr><td colspan='2'><%= first %></td></td><td><%= third %></td><td><%= fourth %></td><td><%= fifth %></td></tr>"),
$prompt_modal = $( '.et_pb_prompt_modal.et_pb_ab_view_stats' ),
goal_model = ET_PageBuilder_Modules.findWhere({ et_pb_ab_goal : "on"}),
goal_module_type = goal_model.get( 'module_type' ),
subject_ids = $('#et_pb_ab_subjects').val().split(",");
if ( ! _.isEmpty( data.subjects_totals ) || et_pb_ab_js_options.has_report ) {
// Hide conversions tabs, adjust conversion copy
if ( $.inArray( goal_module_type, et_pb_ab_js_options.have_conversions ) === -1 ) {
$( '.et_pb_options_tab_ab_stat_conversion, .view-stats-tab.tab-conversions' ).remove();
$( '.et_pb_options_tab_ab_stat_clicks' ).addClass( 'et-pb-options-tabs-links-active' );
} else if ( goal_module_type === 'et_pb_shop' ) {
$( '.et_pb_options_tab_ab_stat_conversion a' ).text( et_pb_ab_js_options.sales_title );
}
// remove the shortcode tracking tab if this option disabled
if ( 'on' !== ET_PageBuilder_AB_Testing.get_shortcode_tracking_status() ) {
$( '.et_pb_options_tab_ab_stat_shortcode_conversions' ).remove();
}
// Initiate on each tab
$prompt_modal.find( '.view-stats-tab' ).each(function() {
var $tab = $(this),
analysis = $tab.attr( 'data-analysis' ),
$line_chart = $( '#ab-testing-stats-' + analysis ),
$pie_chart = $( '#ab-testing-stats-pie-' + analysis ),
$ab_testing_table = $( '#view-stats-table-' + analysis ),
$ab_testing_table_thead = $ab_testing_table.find( 'thead' ),
$ab_testing_table_tbody = $ab_testing_table.find( 'tbody' ),
$ab_testing_table_tfoot = $ab_testing_table.find( 'tfoot' ),
$subjects_filter = $tab.find( '.et-pb-ab-view-stats-subjects-filter' ),
$durations_filter = $tab.find( '.et-pb-ab-view-stats-time-filter' ),
$pie_chart_legends = $tab.find( '.ab-testing-stats-pie-legends' ),
$analysis_tab_nav = $( '.et_pb_ab_view_stats .et-pb-options-tabs-links' ),
line_chart_data = {
labels: data.dates,
datasets: []
},
pie_chart_data = [],
line_chart,
line_chart_datasets,
pie_chart,
pie_chart_segments,
stats_settings;
// Append line and pie graph legends
_.each( subject_ids, function( subject_id ){
var subject_key = 'subject_' + subject_id,
subject_model = ET_PageBuilder_Modules.findWhere({ et_pb_ab_subject_id : subject_id }),
subject_name = _.isUndefined( subject_model ) || ! subject_model.has( 'admin_label' ) ? false : subject_model.get( 'admin_label' );
if ( ! subject_name ) {
return;
}
// Generate subject toggle button
$toggle_subject = $( '<li />' ).append( $( '<a />', { href : '#', 'data-subject-id' : subject_id } ).text( subject_name ) );
$legend_subject = $( '<li />', { 'data-subject-id' : subject_id } ).append( $( '<a />', { href : '#' } ).text( subject_name ) ).prepend( $( '<span />' ) );
$subjects_filter.append( $toggle_subject );
$pie_chart_legends.append( $legend_subject );
});
// Loop each subject data and insert needed UI
if ( ! _.isEmpty( data ) && ! _.isUndefined( data ) && data ) {
// Draw graph
draw_graphs = this_el.draw_graphs(
analysis,
data,
line_chart,
pie_chart,
$line_chart,
$pie_chart,
$ab_testing_table,
$ab_testing_table_thead,
$ab_testing_table_tbody,
$ab_testing_table_tfoot,
thead_template,
tbody_row_template,
tfoot_template,
true
);
// Update tab's variables
line_chart = draw_graphs.line_chart;
pie_chart = draw_graphs.pie_chart;
line_chart_data = draw_graphs.line_chart_data;
pie_chart_data = draw_graphs.pie_chart_data;
line_chart_datasets = draw_graphs.line_chart_datasets;
pie_chart_segments = draw_graphs.pie_chart_segments;
} else {
var $active_durations_filter = $durations_filter.find( 'a[data-duration="' + et_pb_ab_js_options.refresh_interval_duration + '"]' );
$active_durations_filter.addClass( 'active' );
$tab.addClass( 'no-tab-data' );
}
// Toggle subject stats and graph
$subjects_filter.on( 'click', 'a', function(e) {
e.preventDefault();
var $link = $(this),
subject_id = $link.attr( 'data-subject-id' );
// Toggle subject nav
$(this).toggleClass( 'inactive' );
$pie_chart_legends.find( 'li[data-subject-id="'+ subject_id +'"]' ).toggleClass( 'inactive' );
// Filter by subject
filter_subject = this_el.filter_stats_subject(
analysis,
line_chart,
pie_chart,
line_chart_datasets,
pie_chart_segments,
$ab_testing_table,
$ab_testing_table_thead,
$ab_testing_table_tbody,
$ab_testing_table_tfoot,
thead_template,
tbody_row_template,
tfoot_template
);
line_chart = filter_subject.line_chart;
pie_chart = filter_subject.pie_chart;
});
// Toggle legend
$pie_chart_legends.on( 'click', 'a', function(e) {
e.preventDefault();
var $link = $(this),
li = $link.parent( 'li' ),
subject_id = li.attr( 'data-subject-id' );
$subjects_filter.find( 'a[data-subject-id="' + subject_id + '"]' ).trigger( 'click' );
});
// Switch between tabs
$analysis_tab_nav.on( 'click', 'a', function(e) {
e.preventDefault();
// skip the refresh button
if ( $( this ).hasClass( 'et-pb-ab-refresh-stats' ) ) {
return;
}
$analysis_tab_nav.find( 'li' ).removeClass( 'et-pb-options-tabs-links-active' );
$(this).parent( 'li' ).addClass( 'et-pb-options-tabs-links-active' );
this_el.switch_view_stats_tab();
});
// Change time context of the graph
$durations_filter.on( 'click', 'a', function(e) {
e.preventDefault();
var $filter = $(this),
duration = $filter.attr( 'data-duration' ),
$prompt_modal = $( '.et_pb_prompt_modal.et_pb_ab_view_stats' );
$durations_filter.find( 'a' ).removeClass( 'active' );
$filter.addClass( 'active' );
if ( _.isUndefined( ET_PageBuilder_App.ab_stats[ duration ] ) || ! ET_PageBuilder_App.ab_stats[ duration ] ) {
// Start loading bar
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
// Get Split statistics data
$.ajax({
type : "POST",
url : et_pb_options.ajaxurl,
data : {
action : 'et_pb_ab_builder_data',
et_pb_ab_nonce : et_pb_options.ab_testing_builder_nonce,
et_pb_ab_test_id : et_pb_ab_js_options.test_id,
et_pb_ab_duration : duration
},
success : function( data ) {
// Remove no tab data state
$tab.removeClass( 'no-tab-data' );
// Stop loading bar
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
if ( 'false' === data ) {
// Display no-data notification
$tab.addClass( 'no-tab-data' );
return;
}
data = $.parseJSON( data );
// Save graph data for quick retrieval if there are data found
ET_PageBuilder_App.ab_stats[ duration ] = data;
// Update graph
draw_graphs = this_el.draw_graphs(
analysis,
data,
line_chart,
pie_chart,
$line_chart,
$pie_chart,
$ab_testing_table,
$ab_testing_table_thead,
$ab_testing_table_tbody,
$ab_testing_table_tfoot,
thead_template,
tbody_row_template,
tfoot_template
);
// Update tab's variables
line_chart = draw_graphs.line_chart;
pie_chart = draw_graphs.pie_chart;
line_chart_data = draw_graphs.line_chart_data;
pie_chart_data = draw_graphs.pie_chart_data;
line_chart_datasets = draw_graphs.line_chart_datasets;
pie_chart_segments = draw_graphs.pie_chart_segments;
}
});
} else {
// Remove no tab data state
$tab.removeClass( 'no-tab-data' );
// Get appropriate data based on duration
data = ET_PageBuilder_App.ab_stats[ duration ];
// Update graph
draw_graphs = this_el.draw_graphs(
analysis,
data,
line_chart,
pie_chart,
$line_chart,
$pie_chart,
$ab_testing_table,
$ab_testing_table_thead,
$ab_testing_table_tbody,
$ab_testing_table_tfoot,
thead_template,
tbody_row_template,
tfoot_template
);
// Update tab's variables
line_chart = draw_graphs.line_chart;
pie_chart = draw_graphs.pie_chart;
line_chart_data = draw_graphs.line_chart_data;
pie_chart_data = draw_graphs.pie_chart_data;
line_chart_datasets = draw_graphs.line_chart_datasets;
pie_chart_segments = draw_graphs.pie_chart_segments;
}
});
})
// Refresh split test
$prompt_modal.on( 'click', '.et-pb-ab-refresh-stats', function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
$.ajax({
type : "POST",
url : et_pb_options.ajaxurl,
data : {
action : 'et_pb_ab_clear_cache',
et_pb_ab_nonce : et_pb_options.ab_testing_builder_nonce,
et_pb_test_id : et_pb_ab_js_options.test_id
},
success : function( data ) {
ET_PageBuilder_App.ab_stats = {};
// emulate click on the current filter link to re-draw the current graph
$( '.et-pb-ab-view-stats-time-filter' ).find( 'a.active' ).click();
}
});
} );
// Display UI
$prompt_modal.addClass( 'et-pb-loaded' ).find( '.et-pb-ab-view-stats-content.has-data, .et-pb-options-tabs-links' ).css({ 'opacity' : 1 });
this_el.switch_view_stats_tab();
} else {
// Display no-data notification
$prompt_modal.find( '.et-pb-ab-view-stats-content.has-data, .et-pb-options-tabs-links' ).hide();
$prompt_modal.find( '.et-pb-ab-view-stats-content.no-data' ).css({ 'opacity' : 1, 'display' : 'block' });
return;
}
},
draw_graphs : function( analysis, data, line_chart, pie_chart, $line_chart, $pie_chart, $ab_testing_table, $ab_testing_table_thead, $ab_testing_table_tbody, $ab_testing_table_tfoot, thead_template, tbody_row_template, tfoot_template, skip_subject_filtering ) {
var line_chart_data = {
labels: $.merge( [""], data.dates ),
datasets: []
},
pie_chart_data = [],
$tab = $line_chart.closest( '.view-stats-tab' ),
$toggle_subject = $tab.find( '.et-pb-ab-view-stats-subjects-filter' ),
$legend_subject = $tab.find( '.ab-testing-stats-pie-legends' );
_.each( data.subjects_id, function( subject_id ){
var subject_key = 'subject_' + subject_id,
subject_model = ET_PageBuilder_Modules.findWhere({ et_pb_ab_subject_id : subject_id }),
subject_name = _.isUndefined( subject_model ) || _.isUndefined( subject_model.attributes.admin_label ) ? false : subject_model.attributes.admin_label,
$toggle_subject_item = $toggle_subject.find( 'a[data-subject-id="' + subject_id + '"]' ),
$legend_subject_item = $legend_subject.find( 'li[data-subject-id="' + subject_id + '"] span' );
if ( ! subject_name ) {
return;
}
// Update toggle and legend item if needed
if ( _.isUndefined( $toggle_subject_item.attr( 'style' ) ) ) {
$toggle_subject_item.css({ 'backgroundColor' : data['subjects_totals'][ subject_key ]['color'] } );
}
if ( _.isUndefined( $legend_subject_item.attr( 'style' ) ) ) {
$legend_subject_item.css({ 'backgroundColor' : data['subjects_totals'][ subject_key ]['color'] } );
}
// Generate line chart data
line_chart_data.datasets.push({
subject_id : subject_id,
label: subject_name,
fillColor: "transparent",
strokeColor: data['subjects_totals'][ subject_key ]['color'],
pointColor: data['subjects_totals'][ subject_key ]['color'],
pointStrokeColor: "#fff",
data: $.merge( [ null ], _.values( data['subjects_analysis'][ subject_key ][ analysis ] ) )
});
// Generate pie chart data
pie_chart_data.push({
value : ( data['subjects_totals'][ subject_key ][ analysis ] ),
color : data['subjects_totals'][ subject_key ]['color'],
label : '#' + subject_id + ': ' + subject_name
});
});
// Reset hide/show state of toggle subject and pie chart legend
$toggle_subject.find('li').removeClass( 'et-pb-no-data' );
$legend_subject.find('li').removeClass( 'et-pb-no-data' );
// Hide/show toggle and legend
_.each( $( '#et_pb_ab_subjects' ).val().split( ',' ), function( subject_id ) {
if ( $.inArray( subject_id, data.subjects_id ) === -1 ) {
$toggle_subject.find( 'a[data-subject-id="' + subject_id + '"]' ).parent( 'li' ).addClass( 'et-pb-no-data' );
$legend_subject.find( 'li[data-subject-id="' + subject_id + '"]' ).addClass( 'et-pb-no-data' );
}
} )
// Define stats settings
stats_settings = this.get_all_subjects_stats_settings( analysis );
// Draw Table
$ab_testing_table_thead.empty().html( $( thead_template( stats_settings.table.thead ) ) );
$ab_testing_table_tbody.empty();
_.each( stats_settings.table.tbody, function( row ){
$ab_testing_table_tbody.append( $( tbody_row_template( row ) ) );
});
$ab_testing_table_tfoot.empty().html( $( tfoot_template( stats_settings.table.tfoot ) ) );
if ( _.size( stats_settings.table.tbody ) > 1 ) {
// Make table sortable
$ab_testing_table.tablesorter();
var $ab_testing_table_first_head_column = $ab_testing_table.find( 'thead th:first' );
if ( ! $ab_testing_table_first_head_column.hasClass( '.headerSortDown' ) ) {
setTimeout( function(){
$ab_testing_table_first_head_column.trigger( 'click' );
}, 500 );
}
}
// Draw Line Chart
if ( ! _.isUndefined( line_chart ) ) {
line_chart.destroy();
}
// make the tab's content visible to draw the graphs
$line_chart.closest( '.view-stats-tab' ).addClass( 'et_pb_ab_visible_tab' );
line_chart = new Chart( $line_chart.get(0).getContext("2d") ).Line(
line_chart_data,
{
scaleFontSize : 13,
scaleFontColor : "#a1a9b1",
scaleLabel: "<%=value%>%",
scaleGridLineWidth : 2,
scaleLineWidth: 2,
tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>%",
multiTooltipTemplate: "<%= value %>%",
datasetStrokeWidth : 4,
pointDotStrokeWidth : 2,
pointDotRadius : 7
}
);
// Save datasets
line_chart_datasets = line_chart.datasets;
// Draw Pie chart
if ( ! _.isUndefined( pie_chart ) ) {
pie_chart.destroy();
}
// initialize the pie chart only if canvas visible to avoid js errors
if ( $pie_chart.is( ':visible' ) ) {
pie_chart = new Chart( $pie_chart.get(0).getContext("2d") ).Pie(
pie_chart_data,
{
animationEasing : 'easeInCubic',
animationSteps : 50,
tooltipTemplate: "<%if (label){%><%=label%><%}%>"
}
);
// Save segments
pie_chart_segments = pie_chart.segments;
}
// Filter by subject
if ( _.isUndefined( skip_subject_filtering ) ) {
filter_subject = this.filter_stats_subject(
analysis,
line_chart,
pie_chart,
line_chart_datasets,
pie_chart_segments,
$ab_testing_table,
$ab_testing_table_thead,
$ab_testing_table_tbody,
$ab_testing_table_tfoot,
thead_template,
tbody_row_template,
tfoot_template
);
line_chart = filter_subject.line_chart;
pie_chart = filter_subject.pie_chart;
}
// remove visible class after graphs were generated
$line_chart.closest( '.view-stats-tab' ).removeClass( 'et_pb_ab_visible_tab' );
return {
line_chart : line_chart,
pie_chart : pie_chart,
line_chart_data : line_chart_data,
pie_chart_data : pie_chart_data,
line_chart_datasets : line_chart_datasets,
pie_chart_segments : pie_chart_segments
}
},
filter_stats_subject : function( analysis, line_chart, pie_chart, line_chart_datasets, pie_chart_segments, $ab_testing_table, $ab_testing_table_thead, $ab_testing_table_tbody, $ab_testing_table_tfoot, thead_template, tbody_row_template, tfoot_template ) {
// Get settings and modify chart data
var stats_settings = this.get_all_subjects_stats_settings( analysis ),
updated_line_chart_data = _.compact( _.map( line_chart_datasets, function( item, key ) { return stats_settings.subject_statuses[ key ] ? item : false } ) ),
updated_pie_chart_data = _.compact( _.map( pie_chart_segments, function( item, key ) { return stats_settings.subject_statuses[ key ] ? item : false } ) ),
table_row_size;
// Update line chart
line_chart.datasets = updated_line_chart_data;
line_chart.update();
// Emptying table
$ab_testing_table_thead.empty();
$ab_testing_table_tbody.empty();
$ab_testing_table_tfoot.empty();
// Update table's head
$ab_testing_table_thead.html( $( thead_template( stats_settings.table.thead ) ) );
_.each( stats_settings.table.tbody, function( row ){
$ab_testing_table_tbody.append( $( tbody_row_template( row ) ) );
});
// Update table row size
table_row_size = _.size( stats_settings.table.tbody );
// Initiate table sorter and manually sorting table by triggering click if there is a body table
if ( table_row_size > 1 ) {
// Make table sortable
$ab_testing_table.tablesorter();
var $ab_testing_table_first_head_column = $ab_testing_table.find( 'thead th:first' );
if ( ! $ab_testing_table_first_head_column.hasClass( '.headerSortDown' ) ) {
setTimeout( function(){
$ab_testing_table_first_head_column.trigger( 'click' );
}, 500 );
}
}
// Update table footer calculation
if ( table_row_size > 0 ) {
tfoot_third_data = _.pluck( stats_settings.table.tbody, 'third' );
tfoot_fourth_data = _.pluck( stats_settings.table.tbody, 'fourth' );
tfoot_fifth_data = _.map( _.pluck( stats_settings.table.tbody, 'fifth' ), function( num ) { return parseFloat( num ) });
tfoot_third = _.reduce( tfoot_third_data, function( a, b ) { return a + b; }, 0 );
tfoot_fourth = _.reduce( tfoot_fourth_data, function( a, b ) { return a + b; }, 0 );
tfoot_fifth = ( _.reduce( tfoot_fifth_data, function( a, b ) { return a + b; }, 0 ) / _.size( tfoot_fifth_data ) ).toFixed(2) + '%';
$ab_testing_table_tfoot.html( $( tfoot_template( {
first : et_pb_ab_js_options.total_title,
second : null,
third : tfoot_third,
fourth : tfoot_fourth,
fifth : tfoot_fifth
} ) ) );
}
// Update pie chart
pie_chart.segments = updated_pie_chart_data;
pie_chart.update();
return {
line_chart : line_chart,
pie_chart : pie_chart
}
},
delete_post_meta : function(){
// Update all Split testing related hidden post meta data so it will be removed when the page is updated
this.toggle_status( false );
$( '#et_pb_ab_subjects' ).val( '' );
set_this_editor_in_use();
},
subject_carousel : function( cid ) {
var current_subject_view = ET_PageBuilder_Layout.getView( cid ),
subject_models = ET_PageBuilder_Modules.where({ 'et_pb_ab_subject' : 'on' }),
collapse_status = current_subject_view.model.get( 'et_pb_collapsed' ),
collapse_status_others = collapse_status === 'on' ? 'off' : 'on';
_.each( subject_models, function( subject_model ){
var subject_view = ET_PageBuilder_Layout.getView( subject_model.attributes.cid );
if ( subject_view.model.get( 'cid' ) === current_subject_view.model.get( 'cid' ) ) {
if ( collapse_status === 'on' ) {
subject_view.model.set( 'et_pb_collapsed', 'off' );
}
} else {
if ( collapse_status === 'on' ) {
subject_view.model.set( 'et_pb_collapsed', 'on' );
} else {
subject_view.model.set( 'et_pb_collapsed', collapse_status_others );
}
}
if ( subject_view.model.get( 'et_pb_collapsed' ) === 'on' ) {
subject_view.$el.addClass( 'et_pb_collapsed' );
} else {
subject_view.$el.removeClass( 'et_pb_collapsed' );
}
});
}
};
$et_pb_content.remove();
// button can be disabled, therefore use the button wrapper to determine whether to display builder or not
if ( $toggle_builder_button_wrapper.hasClass( 'et_pb_builder_is_used' ) ) {
$builder.show();
et_pb_hide_layout_settings();
}
$toggle_builder_button.click( function( event ) {
event.preventDefault();
var $this_el = $(this),
is_builder_used = $this_el.hasClass( 'et_pb_builder_is_used' ),
$et_pb_fb_cta = $( '#et_pb_fb_cta' ),
content;
if ( is_builder_used ) {
et_pb_create_prompt_modal( 'deactivate_builder' );
} else {
content = et_pb_get_content( 'content' );
$et_pb_old_content.val( content );
ET_PageBuilder_App.reInitialize();
$use_builder_custom_field.val( 'on' );
$builder.show();
$this_el.text( $this_el.data( 'editor' ) );
$main_editor_wrapper.toggleClass( 'et_pb_hidden' );
$this_el.toggleClass( 'et_pb_builder_is_used' );
ET_PageBuilder_Events.trigger( 'et-activate-builder' );
et_pb_hide_layout_settings();
$et_pb_fb_cta.addClass( 'et_pb_ready' );
}
} );
$( '#et_pb_fb_cta' ).click( function( e ) {
e.preventDefault();
// Fade wrap.
$( 'html' ).fadeOut();
// Set redirect.
$( 'form#post' ).append( '<input type="hidden" name="et-fb-builder-redirect" value="' + $( this ).attr('href') + '" />' );
// Set builder.
if ( ! $toggle_builder_button.hasClass( 'et_pb_builder_is_used' ) ) {
$et_pb_old_content.val( et_pb_get_content( 'content' ) );
ET_PageBuilder_App.reInitialize();
$use_builder_custom_field.val( 'on' );
}
// Prevent reload box and queue save to allow builder to create empty section if necessary.
$( window )
.off( 'beforeunload' )
.delay( 500 )
.queue( function() {
var trigger = $( '#save-action #save-post' );
// Publish if save draft isn't present.
if ( trigger.length === 0 ){
trigger = $( '#publishing-action #publish' );
}
trigger.trigger( 'click' );
} );
} ).contextmenu( function() {
$.ajax( {
type: 'POST',
url: $( '#post' ).attr( 'action' ),
data: $('#post').serializeArray(),
} );
} );
function et_pb_deactivate_builder() {
var $body = $( 'body' ),
page_position = 0;
$et_pb_fb_cta = $( '#et_pb_fb_cta' );
$et_pb_fb_cta.removeClass( 'et_pb_ready' );
et_pb_set_content( 'content', $et_pb_old_content.val() );
window.wpActiveEditor = 'content';
$use_builder_custom_field.val( 'off' );
$builder.hide();
$toggle_builder_button.text( $toggle_builder_button.data( 'builder' ) ).toggleClass( 'et_pb_builder_is_used' );
$main_editor_wrapper.toggleClass( 'et_pb_hidden' );
et_pb_show_layout_settings();
page_position = $body.scrollTop();
$body.scrollTop( page_position + 1 );
ET_PageBuilder_Events.trigger( 'et-deactivate-builder' );
// If Split testing is active, remove all Split testing related post meta
if ( ET_PageBuilder_AB_Testing.is_active() ) {
ET_PageBuilder_AB_Testing.delete_post_meta();
}
//trigger window resize event to trigger tinyMCE editor toolbar sizes recalculation.
$( window ).trigger( 'resize' );
}
function et_pb_create_prompt_modal( action, cid_or_element, module_width, columns_layout, template_settings ) {
var on_top_class = -1 !== $.inArray( action, [ 'save_template', 'reset_advanced_settings' ] ) ? ' et_modal_on_top' : '',
on_top_both_actions_class = 'reset_advanced_settings' === action ? ' et_modal_on_top_both_actions' : '',
$modal = $( '<div class="et_pb_modal_overlay' + on_top_class + on_top_both_actions_class + '" data-action="' + action + '"></div>' ),
modal_interface = $( '#et-builder-prompt-modal-' + action ).length ? $( '#et-builder-prompt-modal-' + action ).html() : $( '#et-builder-prompt-modal' ).html(),
modal_content = _.template( $( '#et-builder-prompt-modal-' + action + '-text' ).html() ),
auto_close_modal = true,
modal_attributes = {},
$yes_no_button_wrapper,
$yes_no_button,
$yes_no_select;
et_pb_close_all_right_click_options();
// Lock body scroll
$('body').addClass('et_pb_stop_scroll');
if ( 'save_template' === action ) {
var current_view = ET_PageBuilder_Layout.getView( cid_or_element.model.get( 'cid' ) ),
parent_view = typeof current_view.model.get( 'parent' ) !== 'undefined' ? ET_PageBuilder_Layout.getView( current_view.model.get( 'parent' ) ) : '',
$global_children = current_view.$el.find( '.et_pb_global' ),
is_global = current_view.$el.is( '.et_pb_global' ),
has_global = $global_children.length ? 'has_global' : 'no_globals';
modal_attributes.is_global = typeof current_view.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== current_view.model.get( 'et_pb_global_module' ) ? 'global' : 'regular';
modal_attributes.is_global_child = '' !== parent_view && ( ( typeof parent_view.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== parent_view.model.get( 'et_pb_global_module' ) ) || ( typeof parent_view.model.get( 'global_parent_cid' ) !== 'undefined' && '' !== parent_view.model.get( 'global_parent_cid' ) ) ) ? 'global' : 'regular';
modal_attributes.module_type = current_view.model.get( 'type' );
}
if ( 'delete_font' === action ) {
modal_attributes.font_name = cid_or_element;
}
if ( ! _.isUndefined( template_settings ) ) {
$.extend( modal_attributes, template_settings );
}
$modal.append( modal_interface );
$modal.find( '.et_pb_prompt_modal' ).prepend( modal_content( modal_attributes ) );
if ( 'upload_font' === action ) {
// Populate file name.
$modal.find( '.et-core-portability-import-form input[type="file"]' ).on( 'change', function( e ) {
var files = $( this ).get( 0 ).files;
var fonts_list = '';
var supported_file_formats = et_pb_options.supported_font_formats;
if ( ! _.isEmpty( files ) ) {
_.each( files, function( file_data ) {
var file_name = !_.isUndefined( file_data['name'] ) ? file_data['name'].toLowerCase() : '';
// check selected file format.
_.each(supported_file_formats, function( file_ext ) {
var processed_ext = '.' + file_ext;
if ( file_name.match(file_ext+'$') ) {
fonts_list += '<div class="et-fb-font-files-list-item" data-file_format="' + file_ext + '" data-file_name="' + file_name + '"><span class="et-fb-font-files-list-item-remove"></span>' + file_name + '</div>';
}
});
});
}
if ( '' !== fonts_list ) {
$( '.et-font-uploader-selected-fonts' ).html('');
$( '.et-font-uploader-selected-fonts' ).removeClass('et-font-uploader-hidden-field').append( fonts_list );
}
} );
// Trigger file window.
$modal.find( '.et-core-portability-import-form button' ).click( function( e ) {
e.preventDefault();
var $this_form = $( this ).closest( '.et-core-portability-import-form' );
$this_form.find( 'input[type="file"]' ).trigger( 'click' );
} );
$modal.on( 'click', '.et-fb-font-files-list-item-remove', function( e ) {
$( e.target ).closest('.et-fb-font-files-list-item').remove();
} );
$modal.find( '.et-font-uploader-all-weights' ).on( 'change', function( e ) {
var is_all_selected = $(this).prop( 'checked' );
var $other_weights = $modal.find( '.et-font-uploader-weight-values' );
if ( ! is_all_selected ) {
$other_weights.removeClass( 'et-font-uploader-hidden-section' );
} else {
$other_weights.addClass( 'et-font-uploader-hidden-section' );
}
});
}
if ( 'open_settings' === action ) {
$modal.addClass( 'et_pb_builder_settings' );
// update the shortcode
et_pb_update_tracking_shortcode();
$modal.find( '.et_pb_prompt_field_list' ).each(function() {
var $field_list = $(this),
id = $field_list.attr( 'data-id' ),
type = $field_list.attr( 'data-type' ),
autoload = $field_list.attr( 'data-autoload' ),
custom_id = {
et_pb_enable_ab_testing: 'et_pb_use_ab_testing',
et_pb_ab_refresh_interval: 'et_pb_ab_stats_refresh_interval'
},
$saving_input = typeof custom_id[ id ] !== 'undefined' ? $( '#' + custom_id[ id ] ) : $( '#_' + id ),
saved_value = $saving_input.val();
switch ( type ) {
case ( 'yes_no_button' ) :
var $yn_wrapper = $field_list.find( '.et_pb_yes_no_button_wrapper' ),
$yn_button = $yn_wrapper.find( '.et_pb_yes_no_button' ),
$yn_select = $yn_wrapper.find( 'select' );
// Determine Y/N button state on load
$yn_select.val( saved_value );
$yn_select.trigger( 'change' );
// On button click
$yn_button.click( function() {
var $yn_button = $(this);
if ( $yn_button.hasClass( 'et_pb_off_state' ) ) {
$yn_button.removeClass( 'et_pb_off_state' ).addClass( 'et_pb_on_state' );
$yn_select.val( 'on' );
} else {
$yn_button.removeClass( 'et_pb_on_state' ).addClass( 'et_pb_off_state' );
$yn_select.val( 'off' );
}
$yn_select.trigger( 'change' );
});
// On select change
$yn_select.change( function() {
var $yn_select = $(this),
value = $yn_select.val();
if ( value === 'on' ) {
$yn_button.removeClass( 'et_pb_off_state' ).addClass( 'et_pb_on_state' );
} else {
$yn_button.removeClass( 'et_pb_on_state' ).addClass( 'et_pb_off_state' );
}
// Updated affected ids
if ( $field_list.data( 'affects' ) !== '' ) {
var affects = $field_list.attr( 'data-affects' ),
affected_ids = affects.split( '|' );
_.each( affected_ids, function( affected_id ){
var $selector = $modal.find( '.et_pb_prompt_field_list[data-id="' + affected_id + '"]' ),
visibility_dependency = $selector.attr( 'data-visibility-dependency' );
if ( value === visibility_dependency && $field_list.hasClass( 'et-pb-visible' ) ) {
$selector.addClass( 'et-pb-visible' );
$selector.find( 'select' ).trigger( 'change' );
} else {
$selector.removeClass( 'et-pb-visible' );
// hide all dependant options if hidden option affects someting
if ( $selector.data( 'affects' ) !== '' ) {
var affected_ids = $selector.data( 'affects' ).split( '|' );
_.each( affected_ids, function( affected_id ) {
var $selector = $modal.find( '.et_pb_prompt_field_list[data-id="' + affected_id + '"]' );
$selector.removeClass( 'et-pb-visible' );
} );
}
}
});
}
});
// Trigger select on load to initiate necesarry change
$yn_select.trigger( 'change' );
break;
case ( 'color-alpha' ) :
var $input_colorpicker = $field_list.find( '.input-colorpicker' );
$input_colorpicker.val( saved_value ).wpColorPicker({
width: 313
});
break;
case ( 'colorpalette' ) :
var $palette_wrapper = $(this),
$colorpalette_colorpickers = $palette_wrapper.find( '.input-colorpalette-colorpicker' ),
colorpalette_colorpicker_index = 0,
saved_palette = saved_value.split( '|' );
$colorpalette_colorpickers.each(function(){
var $colorpalette_colorpicker = $(this),
colorpalette_colorpicker_color = saved_palette[ colorpalette_colorpicker_index ];
$colorpalette_colorpicker.val( colorpalette_colorpicker_color ).wpColorPicker({
hide : false,
default : $(this).data( 'default-color' ),
width: 313,
palettes : false,
change : function( event, ui ) {
var $input = $(this),
data_index = $input.attr( 'data-index'),
$preview = $modal.find( '.colorpalette-item-' + data_index ),
color = ui.color.toString();
$input.val( color );
$preview.css({ 'backgroundColor' : color });
set_this_editor_in_use();
}
});
$colorpalette_colorpicker.trigger( 'change' );
$colorpalette_colorpicker.siblings('.wp-picker-clear').on('click', function(e){
e.preventDefault();
$colorpalette_colorpicker.wpColorPicker( 'color', colorpalette_colorpicker_color )
});
$colorpalette_colorpicker.closest( '.wp-picker-container' ).find( '.wp-color-result' ).attr( 'title', et_pb_options.select_text );
$colorpalette_colorpicker.closest( '.wp-picker-container' ).on( 'click', '.wp-color-result', function( event ) {
// Hide active colorpalette colorpicker when "Select" button clicked
$palette_wrapper.find( '.colorpalette-colorpicker' ).removeClass( 'active' );
});
colorpalette_colorpicker_index++;
});
$palette_wrapper.on( 'click', '.colorpalette-item', function(e){
e.preventDefault();
var $colorpalette_item = $(this),
data_index = $colorpalette_item.attr( 'data-index' );
// Hide other colorpalette colorpicker
$palette_wrapper.find( '.colorpalette-colorpicker').removeClass( 'active' );
// Display selected colorpalette colorpicker
$palette_wrapper.find( '.colorpalette-colorpicker[data-index="' + data_index + '"]').addClass( 'active' );
});
break;
case ( 'range' ) :
var $input_range = $field_list.find( 'input[type="range"]' ),
value = $input_range.val(),
input_min = $input_range.attr('min'),
input_max = $input_range.attr('max'),
$input_wrapper = $input_range.parent( 'div' ),
$input_number_template = $( '<input />', { type : 'number', step : 1, class : 'et-pb-range-input', min : input_min, max : input_max, value : value }),
$input_number;
// Assign saved value
$input_range.val( saved_value );
// Append number input
$input_wrapper.append( $input_number_template );
$input_number = $input_wrapper.find( '.et-pb-range-input' );
$input_range.on( 'change input', function() {
var value = $(this).val();
$input_number.val( value );
});
$input_number.on( 'change keydown', function(){
var value = $(this).val();
$input_range.val( value );
});
$input_range.trigger( 'change' );
break;
case( 'select' ) :
var $select = $(this).find( 'select' );
$select.val( saved_value );
break;
case( 'textarea' ) :
var $textarea = $(this).find( 'textarea' );
$textarea.val( saved_value );
break;
}
});
}
if ( 'view_ab_stats' === action ) {
if ( $( '.et-pb-ab-view-stats-content' ).length ) {
return;
}
// Start loading bar
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
// Prevent cannot read undefined value
if ( _.isUndefined( ET_PageBuilder_App.ab_stats ) ) {
ET_PageBuilder_App.ab_stats = {};
}
if ( _.isUndefined( ET_PageBuilder_App.ab_stats[ et_pb_ab_js_options.refresh_interval_duration ] ) ) {
// Get Split statistics data
$.ajax({
type : "POST",
url : et_pb_options.ajaxurl,
data : {
action : 'et_pb_ab_builder_data',
et_pb_ab_nonce : et_pb_options.ab_testing_builder_nonce,
et_pb_ab_test_id : et_pb_ab_js_options.test_id,
et_pb_ab_duration : et_pb_ab_js_options.refresh_interval_duration
},
success : function( data ) {
// Stop loading bar
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
data = $.parseJSON( data );
// Save graph data for quick retrieval if there are data found
ET_PageBuilder_App.ab_stats[ et_pb_ab_js_options.refresh_interval_duration ] = data;
// Display all subjects graph
ET_PageBuilder_AB_Testing.display_stats_tabs( data );
}
});
} else {
// Display all subjects graph
setTimeout( function() {
// Stop loading bar
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
ET_PageBuilder_AB_Testing.display_stats_tabs( ET_PageBuilder_App.ab_stats[ et_pb_ab_js_options.refresh_interval_duration ] );
}, 500 );
}
}
if ( 'ab_testing_alert_yes_no' === action && ! _.isUndefined( template_settings.id ) ) {
$modal.attr({ 'data-action' : action + '_' + template_settings.id });
}
$( 'body' ).append( $modal );
if ( $('.et_pb_prompt_modal').css('bottom') === 'auto' ) {
window.et_pb_align_vertical_modal( $modal.find('.et_pb_prompt_modal'), '.et_pb_prompt_buttons' );
}
setTimeout( function() {
$modal.find('select, input, textarea, radio').filter(':eq(0)').focus();
}, 1 );
if ( 'rename_admin_label' === action ) {
var admin_label = $modal.find( 'input#et_pb_new_admin_label' ),
current_view = ET_PageBuilder_Layout.getView( cid_or_element ),
current_admin_label = current_view.model.get( 'admin_label' ).trim();
if ( current_admin_label !== '' ) {
admin_label.val( current_admin_label );
}
}
$( '.et_pb_modal_overlay .et_pb_prompt_proceed' ).click( function( event ) {
event.preventDefault();
var $prompt_modal = $(this).closest( '.et_pb_modal_overlay' );
switch( $prompt_modal.data( 'action' ).trim() ){
case 'deactivate_builder' :
et_pb_deactivate_builder();
break;
case 'clear_layout' :
ET_PageBuilder_App.removeAllSections( true );
break;
case 'rename_admin_label' :
var admin_label = $prompt_modal.find( '#et_pb_new_admin_label' ).val().trim(),
current_view = ET_PageBuilder_Layout.getView( cid_or_element );
// TODO: Decide if we want to allow blank admin labels
if ( admin_label == '' ) {
$prompt_modal.find( '#et_pb_new_admin_label' ).focus()
return;
}
current_view.model.set( 'admin_label', admin_label, { silent : true } );
current_view.renameModule();
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'renamed', 'module', admin_label );
et_reinitialize_builder_layout();
break;
case 'reset_advanced_settings' :
cid_or_element.each( function() {
et_pb_reset_element_settings( $(this) );
} );
break;
case 'save_layout' :
var layout_name = $prompt_modal.find( '#et_pb_new_layout_name' ).val().trim();
if ( layout_name == '' ) {
$prompt_modal.find( '#et_pb_new_layout_name' ).focus()
return;
}
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_save_layout',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_layout_name : layout_name,
et_layout_content : et_pb_get_content( 'content' ),
et_layout_type : 'layout',
et_post_type : et_pb_options.post_type
},
success: function( data ) {
// update the list of saved layouts after new one was added
et_load_saved_layouts( 'not_predefined', '', '', et_pb_options.post_type, true );
}
} );
break;
case 'save_template' :
var template_name = $prompt_modal.find( '#et_pb_new_template_name' ).val().trim(),
layout_scope = $prompt_modal.find( $( '#et_pb_template_global' ) ).is( ':checked' ) ? 'global' : 'not_global',
$module_settings_container = $( '.et_pb_module_settings' ),
module_type = $module_settings_container.data( 'module_type' ),
layout_type = ( 'section' === module_type || 'row' === module_type ) ? module_type : 'module',
module_width_upd = typeof module_width !== 'undefined' ? module_width : 'regular',
module_cid = cid_or_element.model.get( 'cid' ),
template_shortcode = '',
selected_cats = '',
new_cat = $prompt_modal.find( '#et_pb_new_cat_name' ).val(),
ignore_global = is_global || ( typeof has_global !== 'undefined' && 'has_global' === has_global && 'global' === layout_scope ) ? 'ignore_global' : 'include_global',
ignore_saved_tabs = 'ignore_global' === ignore_global ? 'ignore_global_tabs' : '',
$modal_settings_container = $( '.et_pb_modal_settings_container' ),
$modal_overlay = $( '.et_pb_modal_overlay' );
layout_type = 'row_inner' === module_type ? 'row' : layout_type;
if ( template_name == '' ) {
$prompt_modal.find( '#et_pb_new_template_name' ).focus();
return;
}
if ( $( '.layout_cats_container input' ).is( ':checked' ) ) {
$( '.layout_cats_container input' ).each( function() {
var this_input = $( this );
if ( this_input.is( ':checked' ) ) {
selected_cats += '' !== selected_cats ? ',' + this_input.val() : this_input.val();
}
});
}
if ( 'module' === layout_type ) {
cid_or_element.model.set( 'et_pb_saved_tabs', 'all', { silent : true } );
}
cid_or_element.performSaving();
template_shortcode = ET_PageBuilder_App.generateCompleteShortcode( module_cid, layout_type, ignore_global, ignore_saved_tabs );
if ( 'row_inner' === module_type ) {
template_shortcode = template_shortcode.replace( /et_pb_row_inner/g, 'et_pb_row' );
template_shortcode = template_shortcode.replace( /et_pb_column_inner/g, 'et_pb_column' );
}
$modal_settings_container.addClass( 'et_pb_modal_closing' );
$modal_overlay.addClass( 'et_pb_overlay_closing' );
setTimeout( function() {
if ( 'module' === layout_type ) {
et_pb_tinymce_remove_control( 'et_pb_content_new' );
}
$modal_settings_container.remove();
$modal_overlay.remove();
$( 'body' ).removeClass( 'et_pb_stop_scroll' );
}, 600 );
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
dataType: 'json',
data:
{
action : 'et_pb_save_layout',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_layout_name : template_name,
et_layout_content : template_shortcode,
et_layout_scope : layout_scope,
et_layout_type : layout_type,
et_module_width : module_width_upd,
et_columns_layout : columns_layout,
et_selected_tabs : 'all',
et_module_type : module_type,
et_layout_cats : selected_cats,
et_layout_new_cat : new_cat,
et_post_type : et_pb_options.post_type,
},
beforeSend: function( data ) {
//show overlay which blocks the entire screen to avoid js errors if user starts editing the module immediately after saving
if ( 'global' === layout_scope ) {
if ( ! $( 'body' ).find( '.et_pb_global_loading_overlay' ).length ) {
$( 'body' ).append( '<div class="et_pb_global_loading_overlay"></div>' );
}
}
},
success : function( data ) {
if ( 'global' === layout_scope ) {
var model = ET_PageBuilder_App.collection.find( function( model ) {
return model.get( 'cid' ) == module_cid;
} );
model.set( 'et_pb_global_module', data.post_id );
if ( 'ignore_global' === ignore_global ) {
if ( $global_children.length ) {
$global_children.each( function() {
var child_cid = $( this ).data( 'cid' );
if ( typeof child_cid !== 'undefined' && '' !== child_cid ) {
var child_model = ET_PageBuilder_App.collection.find( function( model ) {
return model.get( 'cid' ) == child_cid;
} );
child_model.unset( 'et_pb_global_module' );
child_model.unset( 'et_pb_saved_tabs' );
}
});
}
}
et_reinitialize_builder_layout();
setTimeout( function(){
$( 'body' ).find( '.et_pb_global_loading_overlay' ).remove();
}, 650 );
}
// clear the library cache to update the library modules list
$et_pb_templates_cache = {};
}
} );
break;
case 'open_settings' :
var $enable_ab_testing_select = $modal.find( '#et_pb_enable_ab_testing' ),
refresh_ab_stats_interval_value = $modal.find( '#et_pb_ab_refresh_interval' ).val(),
enable_ab_testing_select_value = $enable_ab_testing_select.val() === 'on' ? true : false,
shortcode_tracking_value = $modal.find( '#et_pb_enable_shortcode_tracking' ).val(),
$refresh_ab_stats_interval_meta = $( '#et_pb_ab_stats_refresh_interval' ),
$shortcode_tracking_value_meta = $( '#et_pb_enable_shortcode_tracking' );
// Passes settings data to hidden inputs
$modal.find( '.et_pb_prompt_field_list' ).each(function(){
var $item = $( this ),
id = $item.attr( 'data-id' ),
autoload = $item.attr( 'data-autoload' ) === '1' ? true : false,
$saving_input = $( '#_' + id ),
saving_palette = [],
initial_value = $saving_input.val();
// Only pass autoload item
if ( ! autoload ) {
return;
}
if ( $item.hasClass( 'colorpalette' ) ) {
$item.find( '.input-colorpalette-colorpicker' ).each(function() {
saving_palette.push( $(this).val() );
});
$saving_input.val( saving_palette.join('|') );
if ( initial_value !== saving_palette.join('|') ) {
$saving_input.addClass( 'et_pb_value_updated' );
set_this_editor_in_use();
}
// update option so updated color palette will be applied immediately
et_pb_options.page_color_palette = saving_palette.join('|');
} else {
$saving_input.val( $item.find( '#' + id ).val() );
if ( initial_value !== $item.find( '#' + id ).val() ) {
$saving_input.addClass( 'et_pb_value_updated' );
set_this_editor_in_use();
}
if ( 'et_pb_section_background_color' === $saving_input.attr( 'id' ) ) {
et_pb_options.page_section_bg_color = $item.find( '#' + id ).val();
}
if ( 'et_pb_page_gutter_width' === $saving_input.attr( 'id' ) ) {
et_pb_options.page_gutter_width = $item.find( '#' + id ).val();
}
}
});
// Update Split testing status meta data
ET_PageBuilder_AB_Testing.toggle_status( enable_ab_testing_select_value );
// Update Refresh stats interval meta data
$refresh_ab_stats_interval_meta.val( refresh_ab_stats_interval_value );
$shortcode_tracking_value_meta.val( shortcode_tracking_value );
et_pb_ab_js_options.refresh_interval_duration = _.isUndefined( et_pb_ab_js_options.refresh_interval_durations[ refresh_ab_stats_interval_value ] ) ? 'day' : et_pb_ab_js_options.refresh_interval_durations[ refresh_ab_stats_interval_value ];
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Look for subject 1 of AB testing. If there isn't any, prompt subject selector mode
if ( ET_PageBuilder_AB_Testing.count_subjects() < 2 ) {
ET_PageBuilder_App.disable_publish = true;
$( '#publish' ).addClass( 'disabled' );
ET_PageBuilder_AB_Testing.check_create_db();
// Prompt select subject modal box
ET_PageBuilder_AB_Testing.alert_yes_no( 'select_ab_testing_subject' );
// Turn on Split testing subject selection mode
ET_PageBuilder_App.is_selecting_ab_testing_subject = true;
// Adding nescesarry class for Split testing subject selection mode's UI
$( '#et_pb_layout' ).addClass( 'et_pb_select_ab_testing_subject' );
}
} else {
// Turn off Split testing subject selection mode
ET_PageBuilder_App.is_selecting_ab_testing_subject = false;
// Check against "on to off" or "off to off" state
if ( ET_PageBuilder_AB_Testing.count_subjects() > 0 ) {
et_pb_create_prompt_modal( 'turn_off_ab_testing' );
}
}
break;
case 'turn_off_ab_testing' :
// Remove goal
var ab_goals = ET_PageBuilder_Modules.where({ et_pb_ab_goal : 'on' }),
ab_goal_view;
_.each( ab_goals, function( ab_goal ){
delete ab_goal.attributes.et_pb_ab_goal;
if ( ! _.isUndefined( ab_goal.attributes.et_pb_temp_global_module ) || ! _.isUndefined( ab_goal.attributes.et_pb_temp_global_parent ) ) {
ab_goal_view = ET_PageBuilder_Layout.getView( ab_goal.attributes.cid );
ET_PageBuilder_Layout.removeTemporaryGlobalAttributes( ab_goal_view, true );
}
});
// Disable publish button
ET_PageBuilder_App.disable_publish = true;
$( '#publish' ).addClass( 'disabled' );
// Turn on Split Testing selecting winner mode
ET_PageBuilder_App.is_selecting_ab_testing_winner = true;
// Adding nescesarry class for Split testing winner selection mode's UI
$( '#et_pb_layout' ).addClass( 'et_pb_select_ab_testing_winner' );
break;
case 'set_global_subject_winner' :
// Remove Temporary global attributes
ET_PageBuilder_Layout.removeTemporaryGlobalAttributes( template_settings.view );
// Turn off Split testing sequence
ET_PageBuilder_AB_Testing.turn_off_ab_testing_sequence();
break;
case 'ab_testing_alert' :
if ( ! _.isUndefined( ET_PageBuilder_App.ab_last_visible_alert ) ) {
delete ET_PageBuilder_App.ab_last_visible_alert;
}
break;
case 'view_ab_stats' :
// Set split test to off
ET_PageBuilder_AB_Testing.toggle_status( false );
// Turn off Split testing subject selection mode
ET_PageBuilder_App.is_selecting_ab_testing_subject = false;
// Check against "on to off" or "off to off" state
if ( ET_PageBuilder_AB_Testing.count_subjects() > 0 ) {
et_pb_create_prompt_modal( 'turn_off_ab_testing' );
}
break;
case 'delete_font' :
auto_close_modal = false;
if ( ! $( this ).hasClass('et-font-uploader-disabled' ) ) {
et_pb_process_user_font( 'remove', {'font_name':cid_or_element}, $prompt_modal, $( this ) );
}
break;
case 'upload_font' :
var font_name = $modal.find( '#et-font-uploader-name' ).val();
var font_files = $modal.find( '.et-core-portability-import-form input[type="file"]' ).get( 0 ).files;
var font_weight = $modal.find( '.et-font-uploader-all-weights' ).prop( 'checked' ) ? 'all' : '';
var new_font_data = {};
var error_message = '';
$modal.find( '.et-font-uploader-error' ).html('');
auto_close_modal = false;
// get the selected font weights if all is not selected
if ( 'all' !== font_weight ) {
var $other_weights_values = $modal.find( '.et-font-uploader-weight-values input' );
var valid_values = ['100', '200', '300', '400', '500', '600', '700', '800', '900' ];
var selected_weights = [];
$.each( $other_weights_values, function( optionIndex, $option_el ) {
if ( $( $option_el ).prop('checked') ) {
selected_weights.push( valid_values[optionIndex] );
}
});
font_weight = selected_weights.join(',');
}
if ( '' === font_name ) {
error_message += et_pb_options.font_name_error + '\n';
}
if ( _.isUndefined(font_files) ) {
error_message += et_pb_options.font_file_error + '\n';
}
if ( '' === font_weight ) {
error_message += et_pb_options.font_weight_error + '\n';
}
if ( '' !== error_message ) {
$modal.find( '.et-font-uploader-error' ).html(error_message);
} else {
new_font_data = {
'font_name' : font_name,
'font_weight' : font_weight,
'generic_family' : 'sans-serif',
'font_files' : font_files
};
if ( ! $( this ).hasClass('et-font-uploader-disabled' ) ) {
et_pb_process_user_font( 'add', new_font_data, $prompt_modal, $( this ), cid_or_element );
}
}
break;
}
if ( auto_close_modal ) {
et_pb_close_modal( $( this ) );
}
} );
$( '.et_pb_modal_overlay .et_pb_prompt_proceed_alternative' ).click( function( event ) {
event.preventDefault();
var $prompt_modal = $(this).closest( '.et_pb_modal_overlay' );
switch( $prompt_modal.data( 'action' ).trim() ){
case 'set_global_subject_winner' :
// Revive global attributes
ET_PageBuilder_Layout.removeTemporaryGlobalAttributes( template_settings.view, true );
// Turn off Split testing sequence
ET_PageBuilder_AB_Testing.turn_off_ab_testing_sequence();
break;
case 'ab_testing_alert_yes_no_select_ab_testing_subject' :
ET_PageBuilder_AB_Testing.toggle_status( false );
ET_PageBuilder_AB_Testing.toggle_portability( true );
// Re-enable publish
ET_PageBuilder_App.disable_publish = false;
$( '#publish' ).removeClass( 'disabled' );
// Turn off Split testing subject selection mode
ET_PageBuilder_App.is_selecting_ab_testing_subject = false;
// Adding nescesarry class for Split testing subject selection mode's UI
$( '#et_pb_layout' ).removeClass( 'et_pb_select_ab_testing_subject' );
delete ET_PageBuilder_App.ab_last_visible_alert;
break;
}
et_pb_close_modal( $( this ) );
});
$( '.et_pb_modal_overlay .et_pb_prompt_dont_proceed' ).click( function( event ) {
event.preventDefault();
var $prompt_modal = $(this).closest( '.et_pb_modal_overlay' );
switch( $prompt_modal.data( 'action' ).trim() ) {
case 'ab_testing_alert' :
if ( ! _.isUndefined( ET_PageBuilder_App.ab_last_visible_alert ) ) {
delete ET_PageBuilder_App.ab_last_visible_alert;
}
break;
}
et_pb_close_modal( $( this ) );
} );
}
function et_pb_process_user_font( action, font_data, $modal, $button, upload_font_to ) {
var font_settings = {};
if ( 'add' === action ) {
font_settings = JSON.stringify({
'font_weights': font_data.font_weight,
'generic_family': font_data.generic_family
});
}
var form_data = new FormData();
var request_data = {
action : 'et_pb_process_custom_font',
et_pb_font_action : action,
et_fb_upload_font_nonce : et_pb_options.upload_font_nonce,
et_pb_font_name: font_data.font_name,
et_pb_font_settings: font_settings
};
_.each( font_data.font_files, function(single_font, index) {
// process only font files which were not removed from the list by user
var $selected_font_el = $( '.et-font-uploader-selected-fonts' ).find("[data-file_name='" + single_font.name.toLowerCase() + "']");
if ( $selected_font_el.length > 0 ) {
var font_ext = $selected_font_el.data('file_format');
request_data['et_pb_font_file_' + font_ext] = single_font;
}
});
_.each( request_data, function(value, name) {
form_data.append( name, value);
} );
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
contentType: false,
processData: false,
data: form_data,
beforeSend: function() {
$modal.append( '<div id="et_pb_loading_animation"></div>' );
$button.addClass('et-font-uploader-disabled');
},
complete: function() {
$modal.find( '#et_pb_loading_animation' ).remove();
},
success: function( data ) {
var result = $.parseJSON( data );
if ( ! _.isEmpty( result['error'] ) ) {
$button.removeClass('et-font-uploader-disabled');
$modal.find( '.et-font-uploader-error' ).html( result['error'] );
} else {
// update custom fonts list after font removed
if ( 'remove' === action && !_.isUndefined( et_pb_options.user_fonts[ font_data.font_name ] ) ) {
delete et_pb_options.user_fonts[ font_data.font_name ];
var font_item_class = '.select-option-item-' + font_data.font_name.replace(/ /g, '_');
if ( $( font_item_class ).length > 0 ) {
$( font_item_class ).each( function() {
var $current_font_item = $(this);
var is_selected_font = $current_font_item.hasClass('et_pb_selected_menu_item');
var $option_container = is_selected_font ? $current_font_item.closest( '.et-pb-option-container--font' ) : '';
$current_font_item.remove();
// reset font-family to default if currently selected font removed
if ( is_selected_font ) {
et_pb_update_recent_fonts( font_data.font_name, 'remove' );
et_pb_update_font_settings($option_container, 'default');
et_pb_setup_font_setting( $option_container, false );
}
});
}
}
if ( 'add' === action ) {
if ( ! _.isEmpty( result.updated_fonts ) ) {
et_pb_options.user_fonts = result.updated_fonts;
var new_font_name = result.uploaded_font;
// add new font to all custom font sections in opened modal
// select new font in the option where Upload font was initiated
if ( ! _.isUndefined( new_font_name ) ) {
var new_font_item_class = new_font_name.replace(/ /g, '_');
var $all_custom_fonts_sections = $( '.et-pb-option-subgroup-uploaded .et-pb-option-subgroup-container' );
var $font_item_el = '<li class="select-option-item select-option-item-custom-font select-option-item-' + new_font_item_class + '" data-value="' + new_font_name + '">' + new_font_name + '<span class="et-pb-user-font-marker"></span></li>';
if ( $all_custom_fonts_sections.length > 0 ) {
$all_custom_fonts_sections.append($font_item_el);
}
// select new font for the appropriate option
var $option_to_activate = _.isUndefined( upload_font_to ) ? '' : $( '[data-option_name="' + upload_font_to + '"]' ).find('.select-option-item-custom-font[data-value="' + new_font_name + '"]');
if ( '' !== $option_to_activate && $option_to_activate.length > 0 ) {
$option_to_activate.click();
}
}
}
}
et_pb_close_modal( $modal );
}
},
});
}
function et_pb_update_tracking_shortcode() {
var shortcode = '[et_pb_split_track id="' + et_pb_ab_js_options.test_id + '" /]';
setTimeout( function(){
$( '#et_pb_ab_current_shortcode' ).val( shortcode );
}, 100 );
}
function et_pb_handle_clone_class( $element ) {
$element.addClass( 'et_pb_animate_clone' );
setTimeout( function() {
if ( $element.length ) {
$element.removeClass( 'et_pb_animate_clone' );
}
}, 500 );
}
function et_pb_close_modal( $this_button ) {
var $modal_overlay = $this_button.closest( '.et_pb_modal_overlay' );
var $body = $('body');
// Unlock body scroll
$body.removeClass('et_pb_stop_scroll');
$body.removeClass('et_pb_advanced_menu_opened');
$modal_overlay.addClass( 'et_pb_modal_closing' );
setTimeout( function() {
$modal_overlay.remove();
}, 600 );
}
function et_pb_close_modal_view( that, trigger_event ) {
that.removeOverlay();
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_modal_closing' );
setTimeout( function() {
that.remove();
if ( 'trigger_event' === trigger_event ) {
ET_PageBuilder_Events.trigger( 'et-modal-view-removed' );
}
}, 600 );
}
function et_pb_hide_layout_settings(){
if ( $et_pb_setting.filter( ':visible' ).length > 1 ){
$et_pb_layout_settings.find('.et_pb_page_layout_settings').hide();
$et_pb_layout_settings.find('.et_pb_side_nav_settings').show();
}
else{
if ( 'post' !== et_pb_options.post_type ) {
$et_pb_layout_settings.closest( '#et_settings_meta_box' ).find('.et_pb_page_layout_settings').hide();
}
$et_pb_layout_settings.closest( '#et_settings_meta_box' ).find('.et_pb_side_nav_settings').show();
$et_pb_layout_settings.closest( '#et_settings_meta_box' ).find('.et_pb_single_title').show();
}
// On post, hide post format UI and layout settings if pagebuilder is activated
if ( $post_format_wrapper.length ) {
$post_format_wrapper.hide();
var active_post_format = $post_format_wrapper.find( 'input[type="radio"]:checked').val();
$( '.et_divi_format_setting.et_divi_' + active_post_format + '_settings' ).hide();
}
// Show project navigation option when builder enabled
if ( 'project' === et_pb_options.post_type ) {
$et_pb_layout_settings.closest( '#et_settings_meta_box' ).find( '.et_pb_project_nav' ).show();
}
}
function et_pb_show_layout_settings(){
$et_pb_layout_settings.show().closest( '#et_settings_meta_box' ).show();
$et_pb_layout_settings.closest( '#et_settings_meta_box' ).find('.et_pb_side_nav_settings').hide();
$et_pb_layout_settings.closest( '#et_settings_meta_box' ).find('.et_pb_single_title').hide();
// On post, show post format UI and layout settings if pagebuilder is deactivated
if ( $post_format_wrapper.length ) {
$post_format_wrapper.show();
var active_post_format = $post_format_wrapper.find( 'input[type="radio"]:checked').val();
$( '.et_divi_format_setting.et_divi_' + active_post_format + '_settings' ).show();
}
// Hide project navigation option when builder disabled
if ( 'project' === et_pb_options.post_type ) {
$et_pb_layout_settings.closest( '#et_settings_meta_box' ).find( '.et_pb_project_nav' ).hide();
}
}
function et_pb_get_content( textarea_id, fix_shortcodes ) {
var content,
fix_shortcodes = typeof fix_shortcodes !== 'undefined' ? fix_shortcodes : false;
if ( typeof window.tinyMCE !== 'undefined' && window.tinyMCE.get( textarea_id ) && ! window.tinyMCE.get( textarea_id ).isHidden() ) {
content = window.tinyMCE.get( textarea_id ).getContent();
} else {
content = $( '#' + textarea_id ).val();
}
if ( fix_shortcodes && typeof window.tinyMCE !== 'undefined' ) {
content = content.replace( /<p>\[/g, '[' );
content = content.replace( /\]<\/p>/g, ']' );
}
return content.trim();
}
function et_get_editor_mode() {
var et_editor_mode = 'tinymce';
if ( 'html' === getUserSetting( 'editor' ) ) {
et_editor_mode = 'html';
}
return et_editor_mode;
}
function et_pb_is_editor_in_visual_mode( id ) {
var is_editor_in_visual_mode = !! ( typeof window.tinyMCE !== 'undefined' && window.tinyMCE.get( id ) && ! window.tinyMCE.get( id ).isHidden() );
return is_editor_in_visual_mode;
}
function set_this_editor_in_use() {
var post_id = $('#post_ID').val();
var secure = ( 'https:' === window.location.protocol );
var cookie_expires = 5 * 60; // 5 mins (in secs)
wpCookies.set( 'et-editor-available-post-' + post_id + '-bb', 'bb', cookie_expires * 6, et_pb_options.cookie_path, false, secure );
wpCookies.set( 'et-editing-post-' + post_id + '-bb', 'bb', cookie_expires, et_pb_options.cookie_path, false, secure );
wpCookies.remove( 'et-saving-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
wpCookies.remove( 'et-saved-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
}
function et_pb_set_content( textarea_id, content, current_action ) {
var current_action = current_action || '',
main_editor_in_visual_mode = et_pb_is_editor_in_visual_mode( 'content' ),
current_editor_in_visual_mode = et_pb_is_editor_in_visual_mode( textarea_id ),
trimmed_content = $.trim( content );
if ( typeof window.tinyMCE !== 'undefined' && window.tinyMCE.get( textarea_id ) && current_editor_in_visual_mode ) {
var editor = window.tinyMCE.get( textarea_id );
editor.setContent( trimmed_content, { format : 'html' } );
}
// Always set this content as well, since WP autosave uses, for example,
// uses `$( '#content' ).val()` to fetch current post content
if ( $( '#' + textarea_id ).length ) {
$( '#' + textarea_id ).val( trimmed_content );
}
// initiate quicktags only once to avoid issue with duplication of tags
if ( ! et_pb_quick_tags_init_done[textarea_id] && 'content' !== textarea_id ) {
// generate quick tag buttons for the editor in Text mode
( typeof tinyMCEPreInit.mceInit[textarea_id] !== "undefined" ) ? quicktags( { id : textarea_id } ) : quicktags( tinyMCEPreInit.qtInit[textarea_id] );
QTags._buttonsInit();
et_pb_quick_tags_init_done[textarea_id] = true;
}
// Enabling publish button + removes disable_publish mark
if ( ! wp.heartbeat || ! wp.heartbeat.hasConnectionError() ) {
$('#publish').removeClass( 'disabled' );
delete ET_PageBuilder_App.disable_publish;
}
}
function et_pb_tinymce_remove_control( textarea_id ) {
if ( typeof window.tinyMCE !== 'undefined' ) {
window.tinyMCE.execCommand( 'mceRemoveEditor', false, textarea_id );
if ( typeof window.tinyMCE.get( textarea_id ) !== 'undefined' ) {
window.tinyMCE.remove( '#' + textarea_id );
}
// set the quick tags init variable to false for current textarea so quicktags be initiated properly next time
et_pb_quick_tags_init_done[textarea_id] = false;
}
}
function et_pb_update_affected_fields( $affected_fields ) {
if ( $affected_fields.length ) {
$affected_fields.each( function() {
$(this).trigger( 'change' );
} );
}
}
function et_pb_hide_empty_toggles( $option_el ) {
if ( $option_el.length === 0 ) {
return;
}
var $toggle_container = $option_el.closest( '.et-pb-options-toggle-container' );
if ( $toggle_container.length === 0 ) {
return;
}
var has_visible_options = false;
// check if toggle has visible options by checking the `display` property of each option inside the toggle
if ( $toggle_container.find( '.et-pb-option' ).length > 0 ) {
$toggle_container.find( '.et-pb-option' ).each(function() {
if ( 'none' !== $( this ).css( 'display' ) ) {
has_visible_options = true;
}
});
}
// add/remove empty toggle class depending of visibility of options inside
if ( has_visible_options ) {
$toggle_container.removeClass( 'et-pb-options-toggle-empty' );
} else {
$toggle_container.addClass( 'et-pb-options-toggle-empty' );
}
}
function et_pb_custom_color_remove( $element ) {
var $this_el = $element,
$color_picker_container = $this_el.closest( '.et-pb-custom-color-container' ),
$color_choose_button = $color_picker_container.siblings( '.et-pb-choose-custom-color-button' ),
$hidden_color_input = $color_picker_container.find( '.et-pb-custom-color-picker' ),
hidden_class = 'et_pb_hidden';
$color_choose_button.removeClass( hidden_class );
$color_picker_container.addClass( hidden_class );
$hidden_color_input.val( '' );
return false;
}
// set default values for the responsive options.
// Tablet default inherits Desktop value, Phone default inherits the Tablet value.
function et_pb_update_mobile_defaults( $this_el, range_input_value ) {
var this_device = typeof $this_el.data( 'device' ) === 'undefined' ? 'all' : $this_el.data( 'device' );
if ( 'all' === this_device || 'phone' === this_device ) {
return;
}
var this_value = typeof range_input_value !== 'undefined' ? range_input_value : $this_el.val(),
is_range_field = $this_el.hasClass( 'et-pb-range-input' ) || $this_el.hasClass( 'et-pb-range' ),
is_margin_field = $this_el.hasClass( 'et_custom_margin_main' ),
field_class = is_range_field ? '.et-pb-range-input' : '.et-pb-main-setting',
$tablet_field = $this_el.siblings( field_class + '.et_pb_setting_mobile_tablet' ),
$phone_field = $this_el.siblings( field_class + '.et_pb_setting_mobile_phone' ),
tablet_default = typeof $tablet_field.data( 'default' ) === 'undefined' ? '' : $tablet_field.data( 'default' ),
phone_default = typeof $phone_field.data( 'default' ) === 'undefined' ? '' : $phone_field.data( 'default' ),
range_value = _.isNaN( parseFloat( this_value ) ) ? 0 : parseFloat( this_value ),
check_phone_default = false,
$tablet_range,
$phone_range;
if ( is_range_field ) {
$tablet_range = $this_el.siblings( '.et-pb-range.et_pb_setting_mobile_tablet' );
$phone_range = $this_el.siblings( '.et-pb-range.et_pb_setting_mobile_phone' );
} else if ( ! $this_el.hasClass( 'et_custom_margin_main' ) ) {
this_value = et_pb_sanitize_input_unit_value( this_value, false, '' );
}
if ( 'desktop' === this_device ) {
if ( 'no' === $tablet_field.data( 'has_saved_value' ) && $tablet_field.val() === tablet_default ) {
$tablet_field.val( this_value ).change();
check_phone_default = true;
// update range value if needed
if ( is_range_field ) {
$tablet_range.val( range_value );
}
}
$tablet_field.data( 'default', this_value );
// update range value if needed
if ( is_range_field ) {
$tablet_range.data( 'default', range_value );
}
if ( is_margin_field ) {
et_pb_process_custom_margin_field( $tablet_field );
}
} else {
check_phone_default = true;
}
// adjust default settings for the phone
if ( check_phone_default ) {
if ( 'no' === $phone_field.data( 'has_saved_value' ) && $phone_field.val() === phone_default ) {
$phone_field.val( this_value ).change();
// update range value if needed
if ( is_range_field ) {
$phone_range.val( range_value );
}
if ( is_margin_field ) {
et_pb_process_custom_margin_field( $phone_field );
}
}
$phone_field.data( 'default', this_value );
// update range value if needed
if ( is_range_field ) {
$phone_range.data( 'default', range_value );
}
}
}
function et_pb_update_reset_button( $option_container ) {
var current_option = $option_container.find( '.et-pb-main-setting.et_pb_setting_mobile_active' ),
option_value = current_option.val() + '',
is_range_option = current_option.hasClass( 'et-pb-range' ),
option_default = typeof current_option.data( 'default' ) === 'undefined' ? '' : current_option.data( 'default' ) + '',
$reset_button = $option_container.find( '.et-pb-reset-setting' ),
option_default_processed = is_range_option && '' !== option_default ? parseFloat( option_default ) + '' : option_default;
if ( option_value !== option_default_processed ) {
$reset_button.addClass( 'et-pb-reset-icon-visible' );
} else {
$reset_button.removeClass( 'et-pb-reset-icon-visible' );
}
}
function et_pb_open_responsive_tab( $option_container, selected_tab ) {
$option_container.find( '.et_pb_setting_mobile' ).removeClass( 'et_pb_setting_mobile_active' );
$option_container.find( '.et_pb_setting_mobile_' + selected_tab ).addClass( 'et_pb_setting_mobile_active' );
$option_container.find( '.et_pb_mobile_settings_tab' ).removeClass( 'et_pb_mobile_settings_active_tab' );
$option_container.find( '.et_pb_mobile_settings_tab[data-settings_tab="' + selected_tab + '"]' ).addClass( 'et_pb_mobile_settings_active_tab' );
et_pb_update_reset_button( $option_container );
}
// check the advanced settings and update defaults based on the current settings of the parent module
function et_pb_set_child_defaults( $container, module_cid ) {
var $advanced_tab = $container.find( '.et-pb-options-tab-advanced' );
var $advanced_tab_settings = $advanced_tab.find( '.et-pb-main-setting' );
var $parent_container = $( '.et_pb_modal_settings_container:not(.et_pb_modal_settings_container_step2)');
var $parent_container_adv = $parent_container.find( '.et-pb-options-tab-advanced' );
var current_module = ET_PageBuilder_Modules.findWhere( { cid : module_cid } );
var is_conditional = function (el) {
var key = et_pb_get_default_key($(el));
var data = $(el).data(key);
return _.isArray(data) && _.isObject(data[1]);
};
if ( $advanced_tab.length ) {
$advanced_tab_settings.each( function() {
var $this_option = $( this );
var $option_main_input;
var defaultKey = '';
var parentDefault = '';
// process range options
if ( $this_option.hasClass( 'et-pb-range' ) ) {
$option_main_input = $this_option.siblings( '.et-pb-range-input' );
parentDefault = $option_main_input.data(defaultKey) || "";
$option_main_input.each( function() {
var $current_option = $( this ),
option_id = $current_option.attr( 'id' ),
current_device = typeof $current_option.data( 'device' ) !== 'undefined' ? $current_option.data( 'device' ) : 'all',
option_parent = $( '#' + option_id );
if ( option_parent.length && !is_conditional($current_option) ) {
// check whether module already has module_defaults, otherwise set it to empty array
current_module.attributes['module_defaults'] = current_module.attributes['module_defaults'] || [];
// update 'module_defaults' to avoid saving the default values into database
current_module.attributes['module_defaults'][ option_id ] = option_parent.val();
// update default attribute in the option settings to display the correct value in builder
if ( 'all' !== current_device ) {
var $mobile_option = $current_option.siblings( '.et-pb-main-setting.et_pb_setting_mobile_' + current_device );
$mobile_option.data( 'default_inherited', option_parent.val() );
$mobile_option.data( 'default', option_parent.val() );
}
defaultKey = et_pb_get_default_key(option_parent);
parentDefault = option_parent.data(defaultKey) || "";
$current_option.data( 'default_inherited', parentDefault );
$current_option.data( 'default', option_parent.val() );
}
} );
} else {
var option_id = $this_option.attr('id');
var option_parent = $( '#' + option_id );
if ( option_parent.length ) {
var parent_value = option_parent.val();
// check whether module already has module_defaults, otherwise set it to empty array
current_module.attributes['module_defaults'] = current_module.attributes['module_defaults'] || [];
// update 'module_defaults' to avoid saving the default values into database
current_module.attributes['module_defaults'][ option_id ] = parent_value;
defaultKey = et_pb_get_default_key(option_parent);
parentDefault = option_parent.data(defaultKey) || "";
$this_option.data( 'default_inherited', parentDefault );
$this_option.data( defaultKey, parent_value );
}
}
} );
}
}
function et_pb_init_main_settings( $container, this_module_cid ) {
var module = ET_PageBuilder_Modules.findWhere( { cid : this_module_cid } );
var $main_tabs = $container.find( '.et-pb-options-tabs-links' );
var $settings_tab = $container.find( '.et-pb-options-tab' );
var $et_affect_fields = $container.find( '.et-pb-affects' );
var $et_responsive_affect_fields = $container.find( '.et-pb-responsive-affects' );
var $main_custom_margin_field = $container.find( '.et_custom_margin_main' );
var $custom_margin_fields = $container.find( '.et_custom_margin' );
var $font_select = $container.find( '.et-pb-option--font' );
var $font_style_fields = $container.find( '.et_builder_font_style' );
var $font_styles_selects = $container.find( '.et_builder_font_weight, .et_pb_font_line_style_select, .et-pb-font-line-color-value' );
var $font_select_placeholder = $container.find( '.et_pb_select_placeholder' );
var $text_align_selects = $container.find( 'select.et-pb-text-align-select' );
var $text_align_button = $container.find( '.et_builder_text_align' );
var $multiple_buttons_select = $container.find( '.et_pb_multiple_buttons_wrapper select' );
var $multiple_buttons_button = $container.find( '.et_builder_multiple_buttons_button' );
var $range_field = $container.find( '.et-pb-range' );
var $range_input = $container.find( '.et-pb-range-input' );
var $advanced_tab = $container.find( '.et-pb-options-tab-advanced' );
var $advanced_tab_settings = $advanced_tab.find( '.et-pb-main-setting' );
var $custom_color_picker = $container.find( '.et-pb-custom-color-picker' );
var $custom_color_choose_button = $container.find( '.et-pb-choose-custom-color-button' );
var $select_with_option_groups = $container.find( '.et-pb-option-container--select_with_option_groups select' );
var $yes_no_button_wrapper = $container.find( '.et_pb_yes_no_button_wrapper' );
var $yes_no_button = $container.find( '.et_pb_yes_no_button' );
var $yes_no_select = $container.find( '.et_pb_yes_no_button_wrapper select' );
var $validate_unit_field = $container.find( '.et-pb-validate-unit' );
var $options_wrapper = $container.find( '.et_options_list:not(.et_conditional_logic)' );
var $conditional_logic = $container.find( '.et_conditional_logic' );
var $select_animation = $container.find( '.et_select_animation' );
var $presets = $container.find( '.et-preset-container' );
var $background_fields = $container.find( '.et-pb-option--background, .et-pb-option--background-field' );
var $regular_input = $container.find( 'input.regular-text.et_pb_setting_mobile' );
var hidden_class = 'et_pb_hidden';
var $custom_css_option = $container.find( '.et-pb-options-tab-custom_css .et-pb-option' );
var $mobile_settings_toggle = $container.find( '.et-pb-mobile-settings-toggle' );
var $mobile_settings_tabs = $container.find( '.et_pb_mobile_settings_tabs' );
var $checkboxes_set = $container.find( '.et_pb_checkboxes_wrapper' );
var $checkbox = $checkboxes_set.find( 'input[type="checkbox"]' );
var $section_bg_color_option = 'section' === $container.data( 'module_type' ) ? $container.find( '#et_pb_background_color' ) : '';
var $gutter_width_option = $container.find( '#et_pb_gutter_width' );
var $google_maps_api_option = $container.find( '#et_pb_google_api_key' );
var $google_maps_api_button = $container.find( '.et_pb_update_google_key' );
var $id_field = $container.find('#et_pb_field_id');
var $tabbed_subtoggles = $container.find('.et_pb_contains_tabbed_subtoggle');
if ( $google_maps_api_option.length ) {
$google_maps_api_button.attr( 'href', et_pb_options.options_page_url );
if ( '' === et_pb_options.google_api_key ) {
$google_maps_api_option.addClass( 'et_pb_hidden_field' );
$google_maps_api_button.text( $google_maps_api_button.data( 'empty_text' ) ).addClass( 'et_pb_no_field_visible' );
} else {
$google_maps_api_option.val( et_pb_options.google_api_key );
}
}
if ( '' !== $section_bg_color_option && '' !== et_pb_options.page_section_bg_color ) {
if ( '' === $section_bg_color_option.val() ) {
$section_bg_color_option.val( et_pb_options.page_section_bg_color );
$section_bg_color_option.change();
}
$section_bg_color_option.data( 'default', et_pb_options.page_section_bg_color );
}
if ( $gutter_width_option && '' !== et_pb_options.page_gutter_width ) {
// update default gutters
$gutter_width_option.siblings( '.et-pb-main-setting' ).data( 'default', et_pb_options.page_gutter_width );
$gutter_width_option.data( 'default', et_pb_options.page_gutter_width );
}
if ( $tabbed_subtoggles.length ) {
$tabbed_subtoggles.each( function() {
var $this_section = $( this );
var $navigation = $this_section.find( '.subtoggle_tabs_nav' );
// do not proceed if no navigation found
if ( $navigation.length < 1 || $navigation.find( '.subtoggle_tabs_nav_item' ).length < 1 ) {
return;
}
var navigation_item_width = ( 100/$navigation.find( '.subtoggle_tabs_nav_item' ).length ) + '%';
// adjust width of navigation tabs to fill the width of settings modal
$navigation.find( '.subtoggle_tabs_nav_item' ).css( { 'width' : navigation_item_width } );
// automatically open the first tab on load
$( $navigation.find( '.subtoggle_tabs_nav_item a' )[0] ).addClass( 'et-bb-active-sub-tab' );
$( $this_section.find( '.et_pb_tabbed_subtoggle' )[0] ).addClass( 'et-bb-active-subtoggle' );
$navigation.find( '.subtoggle_tabs_nav_item a' ).click( function( event ) {
event.preventDefault();
var $clicked_button = $( this );
var clicked_button_id = $clicked_button.data( 'tab_id' );
$this_section.find( '.subtoggle_tabs_nav_item a' ).removeClass( 'et-bb-active-sub-tab' );
$clicked_button.addClass( 'et-bb-active-sub-tab' );
$this_section.find( '.et_pb_tabbed_subtoggle' ).removeClass( 'et-bb-active-subtoggle' )
$this_section.find( "[data-tab_id='" + clicked_button_id + "']" ).addClass( 'et-bb-active-subtoggle' );
});
});
}
if ( $mobile_settings_tabs.length ) {
$mobile_settings_tabs.each( function() {
var $this_tabs = $( this ),
$this_option_container = $this_tabs.closest( '.et-pb-option' ),
last_edited_field = $this_option_container.find( '.et_pb_mobile_last_edited_field' ).val(),
$mobile_fields = $this_option_container.find( '.et_pb_setting_mobile' );
// update defaults for the mobile settings
if ( $mobile_fields.length ) {
$mobile_fields.each( function() {
var $this_field = $( this ),
this_device = $this_field.data( 'device' ),
has_saved_value = 'desktop' !== this_device && typeof $this_field.data( 'has_saved_value' ) !== 'undefined' ? $this_field.data( 'has_saved_value' ) : 'no',
input_type = $this_field.attr( 'type' ),
new_default = 'tablet' === this_device ? $this_field.siblings( 'input[type="' + input_type + '"].et_pb_setting_mobile_desktop' ).val() : $this_field.siblings( 'input[type="' + input_type + '"].et_pb_setting_mobile_tablet' ).val();
// no need to update anything for desktop
if ( 'desktop' === this_device ) {
return;
}
if ( 'no' === has_saved_value ) {
$this_field.val( new_default );
}
$this_field.data( 'default', new_default );
});
}
if ( typeof last_edited_field !== 'undefined' && '' !== last_edited_field ) {
last_edited_options = last_edited_field.split( '|' );
if ( typeof last_edited_options[0] === 'undefined' || 'on' !== last_edited_options[0] ) {
return;
}
$this_option_container.find( '.et-pb-mobile-settings-toggle' ).addClass( 'et-pb-mobile-icon-visible et-pb-mobile-settings-active' );
$this_option_container.toggleClass( 'et_pb_has_mobile_settings' );
if ( typeof last_edited_options[1] !== 'undefined' && '' !== last_edited_options[1] ) {
et_pb_open_responsive_tab( $this_option_container, last_edited_options[1] );
}
}
});
}
$mobile_settings_toggle.click( function() {
var $this_toggle = $( this ),
$this_option_container = $this_toggle.closest( '.et-pb-option' ),
$last_edited_field = $this_option_container.find( '.et_pb_mobile_last_edited_field' ),
last_edited_field_val = $last_edited_field.val(),
last_edited_options = '' !== last_edited_field_val ? last_edited_field_val.split( '|' ) : [],
active_tab = typeof last_edited_options[1] !== 'undefined' && '' !== last_edited_options[1] ? last_edited_options[1] : 'desktop',
$reset_button = $this_option_container.find( '.et-pb-reset-setting' );
$this_toggle.toggleClass( 'et-pb-mobile-settings-active' );
$this_option_container.toggleClass( 'et_pb_has_mobile_settings' );
// Set the last edited tab or desktop tab
et_pb_open_responsive_tab( $this_option_container, active_tab );
// Add et_pb_animate_options class to apply css animation and remove it after 500ms
$this_option_container.addClass( 'et_pb_animate_options' );
setTimeout( function() {
$this_option_container.removeClass( 'et_pb_animate_options' );
}, 500 );
if ( $this_option_container.hasClass( 'et_pb_has_mobile_settings' ) ) {
$reset_button.data( 'device', active_tab );
last_edited_options[0] = 'on';
} else {
$reset_button.data( 'device', 'all' );
last_edited_options[0] = 'off';
et_pb_open_responsive_tab( $this_option_container, 'desktop' );
}
last_edited_options[1] = typeof last_edited_options[1] !== 'undefined' ? last_edited_options[1] : '';
$last_edited_field.val( last_edited_options[0] + '|' + last_edited_options[1] ).trigger( 'et_pb_setting:change' );
return false;
});
$mobile_settings_tabs.find( 'a' ).click( function() {
var $this_button = $( this ),
$option_container = $this_button.closest( '.et-pb-option-container' ),
selected_tab = $this_button.data( 'settings_tab' ),
$last_edited_field = $option_container.find( '.et_pb_mobile_last_edited_field' );
$this_button.closest( '.et_pb_mobile_settings_tabs' ).find( 'a' ).removeClass( 'et_pb_mobile_settings_active_tab' );
$this_button.addClass( 'et_pb_mobile_settings_active_tab' );
$option_container.find( '.et_pb_setting_mobile' ).removeClass( 'et_pb_setting_mobile_active' );
$option_container.find( '.et_pb_setting_mobile_' + selected_tab ).addClass( 'et_pb_setting_mobile_active' );
$option_container.find( '.et-pb-reset-setting' ).data( 'device', selected_tab );
$last_edited_field.val( 'on|' + selected_tab );
et_pb_update_reset_button( $option_container );
return false;
});
if ( $checkboxes_set.length ) {
$checkboxes_set.each( function() {
var $this_container = $( this ),
value = $this_container.find( 'input.et-pb-main-setting' ).val(),
checkboxes = $this_container.find( 'input[type="checkbox"]' ),
values_array,
i;
if ( '' !== value ) {
values_array = value.split( '|' );
i = 0;
checkboxes.each( function() {
if ( 'on' === values_array[ i ] ) {
var $this_checkbox = $( this );
$this_checkbox.prop( 'checked', true );
}
i++;
});
}
});
}
$checkbox.click( function() {
var $this_checkbox = $( this ),
current_checkbox_class = $( this ).attr( 'class' ),
$this_container = $this_checkbox.closest( '.et_pb_checkboxes_wrapper' ),
$disabled_option_field = $this_container.find( '.et_pb_disabled_option' ),
$all_checkboxes = $this_container.find( 'input[type="checkbox"]' ),
$value_field = $this_container.find( 'input.et-pb-main-setting' ),
new_value = true === $this_checkbox.prop( 'checked' ) ? 'on' : 'off',
i = 0,
empty_values_array = [],
checkbox_order,
values_array;
$all_checkboxes.each( function() {
if ( $( this ).hasClass( current_checkbox_class ) ) {
checkbox_order = i;
}
i++;
empty_values_array.push( '' );
});
if ( '' !== $value_field.val() ) {
values_array = $value_field.val().split( '|' );
} else {
values_array = empty_values_array;
}
values_array[ checkbox_order ] = new_value;
$value_field.val( values_array.join( '|' ) );
// need to check additional option for 'disable_on'
if ( $disabled_option_field.length ) {
if ( 'on' === values_array[0] && 'on' === values_array[1] && 'on' === values_array[2] ) {
$disabled_option_field.val( 'on' );
} else {
$disabled_option_field.val( 'off' );
}
}
});
if ( typeof window.switchEditors !== 'undefined' ) {
$container.find( '.wp-switch-editor' ).click( function() {
var $this_el = $(this),
editor_mode;
editor_mode = $this_el.hasClass( 'switch-tmce' ) ? 'tinymce' : 'html';
et_pb_maybe_apply_wpautop_to_models( editor_mode );
window.switchEditors.go( 'content', editor_mode );
} );
}
// fix the issue with disapperaing line breaks in visual editor
$regular_input.on( 'input change' , function() {
et_pb_update_mobile_defaults( $( this ) );
});
$custom_color_picker.each( function() {
var $this_color_picker = $(this),
this_color_picker_value = $this_color_picker.val(),
$container = $this_color_picker.closest( '.et-pb-custom-color-container' ),
$options_container = $this_color_picker.closest( '.et-pb-options-tab' ),
$choose_color_button = $container.siblings( '.et-pb-choose-custom-color-button' ),
old_color_option = typeof $this_color_picker.data( 'old-option-ref' ) !== 'undefined' && '' !== $this_color_picker.data( 'old-option-ref' ) ? $this_color_picker.data( 'old-option-ref' ) : '',
$old_color_el = '' !== old_color_option ? $options_container.find( '.et-pb-option-' + old_color_option ) : '',
$old_color_input = '' !== $old_color_el && $old_color_el.length ? $old_color_el.find( 'input' ) : '',
$main_color_picker = $container.find( '.et-pb-color-picker-hex' );
// process the value from old option if exists
if ( '' !== $old_color_input ) {
// get the value from old option only if new option is not set
if ( '' === this_color_picker_value && '' !== $old_color_input.val() ) {
this_color_picker_value = $old_color_input.val();
}
// always reset the old option to remove it from shortcode
$old_color_input.val( '' );
}
if ( '' === this_color_picker_value ) {
return true;
}
$container.removeClass( hidden_class );
$choose_color_button.addClass( hidden_class );
$main_color_picker.wpColorPicker( 'color', this_color_picker_value );
} );
$custom_color_choose_button.click( function() {
var $this_el = $(this),
$color_picker_container = $this_el.siblings( '.et-pb-custom-color-container' ),
$color_picker = $color_picker_container.find( '.et-pb-color-picker-hex' ),
$hidden_color_input = $color_picker_container.find( '.et-pb-custom-color-picker' );
$this_el.addClass( hidden_class );
$color_picker_container.removeClass( hidden_class );
$color_picker_container.find( '.wp-color-result' ).click();
$hidden_color_input.val( $color_picker.wpColorPicker( 'color' ) );
return false;
} );
$select_with_option_groups.each( function() {
var $value_field = $(this).siblings( 'input.et-pb-main-setting' ),
values = $value_field.val().split( '|' ),
group = values.length > 1 ? values[0] : '',
value = values.length > 1 ? values[1] : values[0];
if ( '' === group ) {
group = $(this).find(':selected').parent().attr('label');
$value_field
.val( group + '|' + value )
.trigger( 'change' );
}
$(this).val( value );
$(this).change( function() {
var group = $(this).find(':selected').parent().attr('label') || '';
$value_field
.val( group + '|' + $(this).val() )
.trigger( 'change' );
});
});
$yes_no_button_wrapper.each( function() {
var $this_el = $( this ),
$this_switcher = $this_el.find( '.et_pb_yes_no_button' ),
selected_value = $this_el.find( 'select' ).val();
if ( 'on' === selected_value ) {
$this_switcher.removeClass( 'et_pb_off_state' );
$this_switcher.addClass( 'et_pb_on_state' );
} else {
$this_switcher.removeClass( 'et_pb_on_state' );
$this_switcher.addClass( 'et_pb_off_state' );
}
});
$options_wrapper.each( function() {
var $current_wrapper = $(this),
$options_list = $current_wrapper.find( 'textarea' ),
options_value = $options_list.val(),
debounce;
$current_wrapper.on( 'keydown', 'input[type=text]', function(event) {
if ('Enter' === event.key) {
event.stopPropagation();
}
});
$current_wrapper.on( 'keyup', 'input[type=text]', function(event) {
clearTimeout( debounce );
if ( 'Enter' === event.key ) {
add_options_list_row( $(this), false, true );
}
debounce = setTimeout( function() {
update_options_list( $current_wrapper, $options_list );
}, 500 );
} );
$current_wrapper.on( 'click', '.et-pb-add-sortable-option', function( event ) {
event.preventDefault();
add_options_list_row( $(this), true, true );
} );
$current_wrapper.on( 'click', '.et_options_list_copy', function( event ) {
event.preventDefault();
add_options_list_row( $(this) );
} );
$current_wrapper.on( 'click', '.et_options_list_remove', function( event ) {
event.preventDefault();
if ( $current_wrapper.find( '.et_options_list_row' ).length === 1 ) {
$current_wrapper.find( '.et_options_list_row:first input[type=text]' ).val( '' );
update_options_list( $current_wrapper, $options_list );
return;
}
var $parentRow = $(this).parents( '.et_options_list_row' );
$parentRow.remove();
update_options_list( $current_wrapper, $options_list );
} );
$current_wrapper.on( 'click', '.et_options_list_check', function( event ) {
event.preventDefault();
var $check = $(this);
var isRadio = $check.parent().hasClass('et_options_list_row_radio');
if ( isRadio ) {
$current_wrapper.find( '.et_options_list_check' ).not( $check ).removeClass( 'et_options_list_checked' );
}
$check.toggleClass( 'et_options_list_checked' );
update_options_list( $current_wrapper, $options_list );
} );
if ( ! options_value ) {
var current_cid = parseInt( $current_wrapper.parents('[data-parent-cid]').attr('data-parent-cid') );
var current_data = ET_PageBuilder_Modules.findWhere( { cid : current_cid } );
// This is for backwards compatibility with the old implementation where
// there was an option for checking the checkbox by default
var is_checked = ! _.isUndefined( current_data.attributes.et_pb_checkbox_checked ) && 'on' === current_data.attributes.et_pb_checkbox_checked;
// This helps with migrating the old checkboxes to the new functionality
// by adding the existing title as the first checkbox in the list
var default_title = ! _.isUndefined( current_data.attributes.et_pb_field_title ) ? current_data.attributes.et_pb_field_title : '';
options_value = JSON.stringify([{
value : default_title,
checked : true === is_checked ? 1 : 0
}]);
$options_list.val(options_value);
if ( 'checkbox' === current_data.attributes.et_pb_field_type && $current_wrapper.find('.et_options_list_row_checkbox').length > 0 ) {
setTimeout(function() {
$('#et_pb_field_title').val('');
}, 0);
}
}
init_options_list( $current_wrapper, $options_list, options_value );
$current_wrapper.children( '.et_options_rows' ).sortable({
axis : 'y',
containment: 'parent',
update: function() {
update_options_list( $current_wrapper, $options_list );
setTimeout( function() {
$('.et_options_rows').children().css({
position: '',
top: '',
left: ''
});
}, 700);
}
});
} );
function add_options_list_row( $button, newRow, reset ) {
var rowSelector = '.et_options_list_row';
if ( newRow ) {
rowSelector = '.et_options_list_row:last';
}
// Target the clicked row
var $parentRow = $button.parents( rowSelector );
if ( newRow ) {
$parentRow = $button.parent().find( rowSelector );
}
// Create a clone of the clicked row
var $newRow = $parentRow.clone();
// Remove the checked status for the new row to avoid multiple checked options
$newRow.find( '.et_options_list_checked' ).removeClass( 'et_options_list_checked' );
// Reset the value for new rows
if ( reset ) {
$newRow.find( 'input[type=text]' ).val('');
}
// Append the new row
$newRow.insertAfter( $parentRow );
$newRow.find( 'input[type=text]' ).focus();
}
function init_options_list( $wrapper, $options_list, options_value ) {
if ( '' === options_value || _.isUndefined( options_value ) ) {
return;
}
var $row = $wrapper.find( '.et_options_list_row:first' );
var $rows = $('<div>').addClass('et_options_rows');
options_value = JSON.parse( options_value );
for ( var i = 0; i < options_value.length; i++ ) {
var option = options_value[i];
var isChecked = 1 === option.checked;
var $newRow = $row.clone();
$newRow.find( 'input[type=text]' ).val( option.value );
$newRow.find( '.et_options_list_check' ).toggleClass( 'et_options_list_checked', isChecked );
$newRow.appendTo( $rows );
}
$rows.insertAfter( $row );
$row.remove();
}
function update_options_list( $wrapper, $options_list ) {
var options = [];
$options_list.val( '' );
$wrapper.find( 'input[type=text]' ).each( function() {
var $input = $(this);
var isChecked = $input.prev( '.et_options_list_checked' ).length > 0;
var option_object = {
value: $input.val(),
checked: 0
};
if ( '' === option_object.value ) {
return;
}
if ( isChecked ) {
option_object.checked = 1;
}
options.push( option_object );
} );
$options_list.val( JSON.stringify( options ) );
}
$conditional_logic.each( function() {
/* Parse the conditional logic settings */
var $logicSet = $(this);
var logicData = $logicSet.find('textarea').val();
logicData = '' !== logicData ? logicData : '[]';
logicData = JSON.parse( logicData );
/* Create an entry for each setting's row */
var $row = $(this).find('.et_options_list_row');
if ( 1 < logicData.length ) {
for ( var i = 1; i < logicData.length; i++ ) {
var $cloned_row = $row.clone();
$logicSet.find('.et_options_list_row:last').after( $cloned_row );
}
}
/* Wait for the Backbone templates to render */
setTimeout( function() {
/* Setup datastore */
var datastore = {};
var $wrapper = $logicSet.parents( '.et_pb_modal_settings_container_step2' );
var parentID = $wrapper.data('parent-cid');
var $parent = $wrapper.prev( '.et_pb_modal_settings_container' );
var $siblings = $parent.find( 'ul.et-pb-sortable-options li:not([data-cid="' + parentID + '"])' );
var $field = $logicSet.find('.et_conditional_logic_field');
$siblings.each( function() {
var $sibling = $(this);
var siblingCID = $sibling.data('cid');
var siblingData = ET_PageBuilder_Modules.findWhere( { cid : siblingCID } );
var siblingAttrs = siblingData.attributes;
var fieldID = siblingAttrs.et_pb_field_id;
if ( '' === fieldID ) {
return;
}
fieldID = fieldID.toLowerCase();
var fieldType = ! _.isUndefined( siblingAttrs.et_pb_field_type ) ? siblingAttrs.et_pb_field_type : 'input';
var fieldTitle = ! _.isUndefined( siblingAttrs.et_pb_field_title ) ? siblingAttrs.et_pb_field_title : fieldID;
fieldTitle = '' !== fieldTitle.trim() ? fieldTitle : fieldID;
var $option = $('<option data-type="' + fieldType + '" value="' + fieldID + '">' + fieldTitle + '</option>');
$field.append( $option );
datastore[fieldID] = siblingAttrs;
});
var firstKey = '';
for (var prop in datastore) {
if ( datastore.hasOwnProperty(prop) ) {
firstKey = prop;
break;
}
}
var firstID = datastore[firstKey].et_pb_field_id.toLowerCase();
if ( 0 === logicData.length && 0 !== datastore.length ) {
logicData.push({
field : firstID,
condition: 'is',
value : ''
});
}
for ( var i = 0; i < logicData.length; i++ ) {
var row = logicData[i];
var $row = $logicSet.find('.et_options_list_row').eq(i);
var $field = $row.find('.et_conditional_logic_field');
var $condition = $field.next('.et_conditional_logic_condition');
var fieldData = datastore[firstID];
var fieldType = 'input';
var fieldValue = '';
var fieldID = _.isUndefined( row.field ) || _.isUndefined( datastore[row.field] ) ? firstID : row.field;
var fieldCondition = _.isUndefined( row.condition ) ? 'is' : row.condition;
if ( ! _.isUndefined( datastore[row.field] ) ) {
fieldData = datastore[row.field];
fieldValue = row.value;
fieldType = _.isUndefined( fieldData.et_pb_field_type ) ? 'input' : fieldData.et_pb_field_type;
}
$row.find('.et_conditional_logic_value').remove();
var $value = et_pb_create_conditional_logic_value_field( fieldType, fieldValue, fieldData, $logicSet );
$value.insertAfter( $condition );
$field.val( fieldID );
$condition.val( fieldCondition );
}
et_pb_update_conditional_logic( $logicSet );
$logicSet.on('change', '.et_conditional_logic_field', function() {
var $field = $(this);
var field = $field.val();
var $condition = $field.next('.et_conditional_logic_condition');
var $row = $field.parents('.et_options_list_row');
var fieldData = datastore[field];
var fieldValue = '';
var fieldType = _.isUndefined( fieldData.et_pb_field_type ) ? 'input' : fieldData.et_pb_field_type;
var selectedValue = $row.attr('data-selected-value');
if ( selectedValue && ! _.includes(['radio', 'select', 'checkbox'], fieldType) ) {
fieldValue = selectedValue;
}
$row.find('.et_conditional_logic_value').remove();
var $value = et_pb_create_conditional_logic_value_field( fieldType, fieldValue, fieldData, $logicSet );
$value.insertAfter( $condition );
et_pb_update_conditional_logic( $logicSet );
});
$logicSet.on('change', '.et_conditional_logic_condition, .et_conditional_logic_value', function() {
et_pb_update_conditional_logic( $logicSet );
});
$logicSet.on('click', '.et-pb-add-sortable-option', function(event) {
event.preventDefault();
et_pb_add_conditional_logic_row( $(this), datastore );
});
$logicSet.on('click', '.et_options_list_remove', function(event) {
event.preventDefault();
et_pb_remove_conditional_logic_row( $(this) );
});
}, 0);
} );
// Replace any spaces in field ID with underscores
$id_field.on('focusout', function() {
var sanitizedID = $(this).val().replace(/\s+/g, '_');
var $wrapper = $id_field.parents( '.et_pb_modal_settings_container_step2' );
var $parent = $wrapper.prev( '.et_pb_modal_settings_container' );
var parentID = $wrapper.data('parent-cid');
var $siblings = $parent.find( 'ul.et-pb-sortable-options li:not([data-cid="' + parentID + '"])' );
var siblings = [];
$siblings.each( function() {
var $sibling = $(this);
var siblingCID = $sibling.data('cid');
var siblingData = ET_PageBuilder_Modules.findWhere( { cid : siblingCID } );
var siblingAttrs = siblingData.attributes;
siblings.push( siblingAttrs );
});
// Assign a starting placeholder ID if it is blank
if ( '' === sanitizedID ) {
var currentData = ET_PageBuilder_Modules.findWhere( { cid : parentID } );
var module_order = parseInt( currentData.attributes.module_order );
sanitizedID = 'Field_' + ( module_order + 1 );
}
// Check siblings for duplicate IDs
while(true) {
var hasDuplicates = false;
for ( var i = 0; i < siblings.length; i++ ) {
var sibling = siblings[i];
// Unlike VB we don't need to check if the sibling is the same
// as the current module in BB, since we already exlude it
// when generating the siblings data array
var siblingID = sibling.et_pb_field_id;
if ( siblingID.toLowerCase() === sanitizedID.toLowerCase() ) {
sanitizedID = sanitizedID + '_2';
hasDuplicates = true;
break;
}
}
if ( false === hasDuplicates ) {
break;
}
}
$(this).val( sanitizedID );
});
function et_pb_create_conditional_logic_value_field( fieldType, fieldValue, fieldData, $wrapper ) {
var $value = null;
switch( fieldType ) {
case 'checkbox':
case 'radio':
case 'select':
var optionsString;
switch( fieldType ) {
case 'checkbox':
optionsString = fieldData.et_pb_checkbox_options;
break;
case 'radio':
optionsString = fieldData.et_pb_radio_options;
break;
case 'select':
optionsString = fieldData.et_pb_select_options;
break;
}
options = et_pb_jsonify( optionsString );
$value = $('<select></select>');
$.each( options, function( optionIndex, optionData ) {
var $option = $('<option value="' + optionData.value + '">' + optionData.value + '</option>');
$value.append( $option );
if ( '' === fieldValue ) {
return;
}
$value.val( fieldValue );
});
break;
default:
$value = $('<input type="text" value="' + fieldValue + '" />');
break;
}
$value.addClass('et_conditional_logic_value');
return $value;
}
function et_pb_add_conditional_logic_row( $button, datastore ) {
if ( 0 === datastore.length ) {
return;
}
var $wrapper = $button.parents('.et_conditional_logic');
var $row = $wrapper.find('.et_options_list_row:last');
var $newRow = $row.clone();
var $condition = $newRow.find('.et_conditional_logic_condition');
var firstKey = '';
for (var prop in datastore) {
if ( datastore.hasOwnProperty(prop) ) {
firstKey = prop;
break;
}
}
var fieldData = datastore[firstKey];
var fieldValue = '';
var fieldType = _.isUndefined( fieldData.et_pb_field_type ) ? 'input' : fieldData.et_pb_field_type;
$newRow.find('.et_conditional_logic_value').remove();
var $value = et_pb_create_conditional_logic_value_field( fieldType, fieldValue, fieldData, $wrapper );
$value.insertAfter( $condition );
$condition.val( 'is' );
$newRow.insertAfter($row);
et_pb_update_conditional_logic( $wrapper );
}
function et_pb_remove_conditional_logic_row( $button ) {
var $row = $button.parent('.et_options_list_row');
var $wrapper = $row.parent('.et_conditional_logic');
if ( 1 === $wrapper.find('.et_options_list_row').length ) {
return;
}
$row.remove();
et_pb_update_conditional_logic( $wrapper );
}
function et_pb_update_conditional_logic( $wrapper ) {
var $textarea = $wrapper.find('textarea');
var logic = [];
$wrapper.find('.et_options_list_row').each(function() {
var $row = $(this);
var field = $row.find('.et_conditional_logic_field').val();
var condition = $row.find('.et_conditional_logic_condition').val();
var $value = $row.find('.et_conditional_logic_value');
var value = $value.val();
var fieldType = $row.find('.et_conditional_logic_field').find('option:selected').data('type');
var selectedValue = _.includes(['radio', 'select', 'checkbox'], fieldType) ? false : value;
var logicSet = {
field : field,
condition: condition,
value : value
};
if ( false !== selectedValue ) {
$row.attr('data-selected-value', selectedValue);
}
logic.push( logicSet );
$value.prop('disabled', false);
if ( _.includes(['is empty', 'is not empty'], condition) ) {
$value.prop('disabled', true);
}
});
$textarea.val( JSON.stringify( logic ) );
}
function et_pb_jsonify( escapedString ) {
if ( '' === escapedString ) {
escapedString = '[]';
}
var unescapedString;
unescapedString = escapedString.replace( /%22/g, "\"" );
unescapedString = unescapedString.replace( /%91/g, "[" );
unescapedString = unescapedString.replace( /%92/g, "\\" );
unescapedString = unescapedString.replace( /%93/g, "]" );
var string_json = JSON.parse( unescapedString );
return string_json;
}
$select_animation.each(function() {
var $current_select = $(this);
var $animation_style = $current_select.find('input[type="hidden"]');
var current_value = $animation_style.val();
$current_select.find('.et_animation_button_title[data-value="' + current_value + '"]').parent().addClass('et_active_animation');
$current_select.on('click', '.et_animation_button a', function(event) {
event.preventDefault();
var $animation_button = $(this);
if ( $animation_button.hasClass('et_active_animation') ) {
return;
}
var animation_type = $animation_button.find('.et_animation_button_title').attr('data-value');
animation_type = animation_type.trim();
$current_select.find('.et_animation_button a').removeClass('et_active_animation');
$animation_button.addClass('et_active_animation');
$animation_style.val( animation_type ).trigger('change');
})
});
$presets.each(function() {
var $this = $(this);
var $style = $this.find('input[type="hidden"]');
var active_class = 'et-preset-active';
var change_value = function(id, value){
var el = $this.closest('.et-pb-options-toggle-container').find('#et_pb_' + id);
el.val(value);
el.trigger('change');
};
var update_presets = function () {
$this.find('.et-preset').removeClass(active_class);
$this.find('.et-preset[data-value="' + $style.val() + '"]').addClass(active_class);
};
$this.on('click', '.et-preset', function(event) {
var $preset = $(this);
var type = $preset.attr('data-value').trim();
var fields = {};
event.preventDefault();
if ( $preset.hasClass(active_class) ) {
return;
}
$this.find('.et-preset').removeClass(active_class);
$preset.addClass(active_class);
$style.val( type ).trigger('change');
try {
fields = JSON.parse($preset.attr('data-fields'));
} catch(e){
fields = [];
}
$.each(fields, change_value);
});
$style.on('change', update_presets);
update_presets();
});
$yes_no_button.click( function() {
var $this_el = $( this ),
$this_select = $this_el.closest( '.et_pb_yes_no_button_wrapper' ).find( 'select' );
if ( $this_el.hasClass( 'et_pb_off_state') ) {
$this_el.removeClass( 'et_pb_off_state' );
$this_el.addClass( 'et_pb_on_state' );
$this_select.val( 'on' );
} else {
$this_el.removeClass( 'et_pb_on_state' );
$this_el.addClass( 'et_pb_off_state' );
$this_select.val( 'off' );
}
$this_select.trigger( 'change' );
});
$yes_no_select.change( function() {
var $this_el = $( this ),
$this_switcher = $this_el.closest( '.et_pb_yes_no_button_wrapper' ).find( '.et_pb_yes_no_button' ),
new_value = $this_el.val();
if ( 'on' === new_value ) {
$this_switcher.removeClass( 'et_pb_off_state' );
$this_switcher.addClass( 'et_pb_on_state' );
} else {
$this_switcher.removeClass( 'et_pb_on_state' );
$this_switcher.addClass( 'et_pb_off_state' );
}
});
if ( $background_fields.length ) {
$background_fields.each(function() {
var $background_fields_ui = $(this),
is_background = $background_fields_ui.is('.et-pb-option--background'),
wrapper_class = is_background ? '.et-pb-option--background' : '.et-pb-option--background-field',
base_name = $background_fields_ui.find( '.et-pb-option-container-inner' ).data( 'base_name' ),
base_prefix = is_background ? '' : base_name + '_',
tab_nav_count = $background_fields_ui.find('.et_pb_background-tab-navs li').size();
$background_fields_ui.find('.et_pb_background-tab:first').show();
$background_fields_ui.find('.et_pb_background-tab-navs li:first a').addClass('active');
// Tab Nav Width Adjustment
if ( 4 !== tab_nav_count) {
$background_fields_ui.find('.et_pb_background-tab-navs li').css({ width: (100/tab_nav_count) + '%'});
}
// Background field tab navigation
$background_fields_ui.find('.et_pb_background-tab-navs').on( 'click', 'a', function(e) {
e.preventDefault();
var $clicked_tab = $(this),
clicked_tab = $clicked_tab.attr('data-tab'),
$wrapper = $clicked_tab.closest( wrapper_class );
$wrapper.find('.et_pb_background-tab-navs a').removeClass('active');
$clicked_tab.addClass('active');
$wrapper.find('.et_pb_background-tab:visible').hide();
$wrapper.find('.et_pb_background-tab[data-tab="' + clicked_tab + '"]').fadeIn();
$wrapper.find('.et_pb_background-tab[data-tab="' + clicked_tab + '"]').find( '.et-pb-affects' ).trigger( 'change' );
et_pb_update_background_tab_filled_status( $clicked_tab.closest( wrapper_class ), false );
});
// Gradient preview
var $gradient_preview_tab = $background_fields_ui.find('.et_pb_background-tab--gradient'),
$gradient_preview = $gradient_preview_tab.find('.et-pb-option-preview'),
$gradient_preview_add = $gradient_preview.find('.et-pb-option-preview-button--add'),
$gradient_preview_swap = $gradient_preview.find('.et-pb-option-preview-button--swap'),
$gradient_preview_delete = $gradient_preview.find('.et-pb-option-preview-button--delete'),
use_color_gradient = is_background ? 'use_background_color_gradient' : base_name + '_use_color_gradient',
$use_gradient_ui = $gradient_preview_tab.find('.et_pb_background-option--' + use_color_gradient + ' .et_pb_yes_no_button'),
$use_gradient_input = $gradient_preview_tab.find('.et_pb_background-option--' + use_color_gradient + ' select'),
$gradient_start_input = $gradient_preview_tab.find( '.et_pb_background-option--' + base_name + '_color_gradient_start .wp-color-picker' ),
gradient = et_pb_get_gradient( $gradient_preview_tab, base_name );
// Has gradient color
if ( gradient ) {
$gradient_preview.css({
backgroundImage: gradient
});
$gradient_preview.removeClass( 'et-pb-option-preview--empty' );
}
$gradient_preview.click(function(e) {
e.preventDefault();
e.stopPropagation();
if ( ! $gradient_preview.hasClass('et-pb-option-preview--empty') ) {
$gradient_start_input.wpColorPicker('open', true);
return;
}
$use_gradient_ui.removeClass( 'et_pb_off_state' ).addClass( 'et_pb_on_state' );
$use_gradient_input.val( 'on' ).trigger( 'change' );
$gradient_preview.removeClass( 'et-pb-option-preview--empty' );
});
$gradient_preview_add.click(function(e) {
e.stopPropagation();
$use_gradient_ui.removeClass( 'et_pb_off_state' ).addClass( 'et_pb_on_state' );
$use_gradient_input.val( 'on' ).trigger( 'change' );
$gradient_preview.removeClass( 'et-pb-option-preview--empty' );
});
$gradient_preview_delete.click(function(e) {
e.stopPropagation();
$use_gradient_ui.removeClass( 'et_pb_on_state' ).addClass( 'et_pb_off_state' );
$use_gradient_input.val( 'off' ).trigger( 'change' );
$gradient_preview.addClass( 'et-pb-option-preview--empty' );
});
$gradient_preview_swap.click(function(e) {
e.preventDefault();
e.stopPropagation();
var $background = $(this).closest( wrapper_class ),
$start = $background.find( '.et_pb_background-option--' + base_name + '_color_gradient_start .et-pb-color-picker-hex' ),
$end = $background.find( '.et_pb_background-option--' + base_name + '_color_gradient_end .et-pb-color-picker-hex' ),
startValue = $start.val(),
endValue = $end.val();
// Swap color
$start.val( endValue ).trigger( 'change' );
$end.val( startValue ).trigger( 'change' );
});
$gradient_preview_tab.on( 'change input keyup', 'select, input[type="text"], input[type="range"]', function() {
et_pb_update_gradient_preview( $(this) );
});
// Determine filled tab state
function et_pb_update_background_tab_filled_status( $background_fields_ui, activate_filled_tab ) {
$background_fields_ui.find( '.et_pb_background-tab' ).each(function() {
var $background_tab = $(this),
tab_status = false,
background_tab_name = $background_tab.attr( 'data-tab' ),
$background_tab_nav = $background_fields_ui.find( '.et_pb_background-tab-nav[data-tab="' + background_tab_name + '"]' );
switch( background_tab_name ) {
case( 'color' ) :
var $use_background_color = $background_tab.find( '.et_pb_background-option--use_background_color' ),
$background_color = $background_tab.find( '.et_pb_background-option--' + base_name + '_color' );
if ( $use_background_color.length && $background_color.length ) {
tab_status = 'on' === $use_background_color.find( 'select option:selected' ).val() && '' !== $background_color.find( '.et-pb-color-picker-hex' ).val();
} else if ( ! $use_background_color.length && $background_color.length ) {
tab_status = '' !== $background_color.find( '.et-pb-color-picker-hex' ).val();
}
break;
case( 'gradient' ) :
var use_background_color_gradient = $background_tab.find( '.et_pb_background-option--' + use_color_gradient + ' select option:selected' ).val();
if ( 'on' === use_background_color_gradient ) {
tab_status = true;
}
break;
case( 'image' ) :
var background_image = $background_tab.find( '.et_pb_background-option--' + base_name + '_image .et-pb-upload-field' ).val() || $background_tab.find( '.et_pb_background-option--background_url .et-pb-upload-field' ).val();
if ( ! _.isUndefined( background_image ) && '' !== background_image ) {
tab_status = true;
}
break;
case( 'video' ) :
var background_video_mp4 = $background_tab.find( '.et_pb_background-option--' + base_name + '_video_mp4 .et-pb-upload-field' ).val(),
background_video_webm = $background_tab.find( '.et_pb_background-option--' + base_name + '_video_webm .et-pb-upload-field' ).val();
if ( ( ! _.isUndefined( background_video_mp4 ) && '' !== background_video_mp4 ) || ( ! _.isUndefined( background_video_webm ) && '' !== background_video_webm ) ) {
tab_status = true;
}
break;
}
if ( tab_status ) {
$background_tab_nav.addClass( 'et-pb-filled' );
if ( activate_filled_tab ) {
$background_fields_ui.find( '.et_pb_background-tab' ).removeAttr( 'style' );
$background_tab_nav.trigger( 'click' );
}
} else {
$background_tab_nav.removeClass( 'et-pb-filled' );
}
});
}
et_pb_update_background_tab_filled_status( $background_fields_ui, true );
// Update image preview panel whenever these fields are changed
var column_index = $background_fields_ui.find( '.et-pb-option-container--background' ).attr( 'data-column-index' ),
field_suffix = typeof column_index === 'undefined' ? '' : '_' + column_index,
image_preview_affecting_fields = [
'#et_pb_' + base_name + '_color' + field_suffix,
'#et_pb_use_background_color', // Call to Action
'#et_pb_' + base_name + '_color_gradient_start' + field_suffix,
'#et_pb_' + base_name + '_color_gradient_end' + field_suffix,
'#et_pb_' + use_color_gradient + field_suffix,
'#et_pb_' + base_name + '_color_gradient_type' + field_suffix,
'#et_pb_' + base_name + '_color_gradient_direction' + field_suffix,
'#et_pb_' + base_name + '_color_gradient_direction_radial' + field_suffix,
'#et_pb_' + base_name + '_color_gradient_start_position' + field_suffix,
'#et_pb_' + base_name + '_color_gradient_end_position' + field_suffix,
typeof column_index === 'undefined' ? '#et_pb_bg_img' + field_suffix : '#et_pb_background_image',
'#et_pb_background_url', // Fullwidth Header
'#et_pb_' + base_prefix + 'parallax' + field_suffix,
'#et_pb_' + base_prefix + 'parallax_method' + field_suffix,
'#et_pb_' + base_name + '_size' + field_suffix,
'#et_pb_' + base_name + '_position' + field_suffix,
'#et_pb_' + base_name + '_repeat' + field_suffix,
'#et_pb_' + base_name + '_blend' + field_suffix,
'.et-pb-range'
];
$background_fields_ui.find( image_preview_affecting_fields.join( ', ' ) ).change( function() {
et_pb_generate_preview_content( $background_fields_ui.find( '.et_pb_background-tab--image .et-pb-upload-button' ) );
} );
// Some background image is overwritten by featured image. Need to wait until DOM is inserted
setTimeout(function() {
if ( $( '#et_pb_featured_placement' ).length ) {
$('#et_pb_featured_placement').change(function() {
et_pb_generate_preview_content( $background_fields_ui.find( '.et_pb_background-tab--image .et-pb-upload-button' ) );
});
}
if ( $( '#et_pb_featured_image' ).length ) {
$('#et_pb_featured_image').change(function() {
et_pb_generate_preview_content( $background_fields_ui.find( '.et_pb_background-tab--image .et-pb-upload-button' ) );
});
}
}, 700);
});
}
$main_tabs.find( 'li a' ).click( function() {
var $this_el = $(this),
tab_index = $this_el.closest( 'li' ).index(),
$links_container = $this_el.closest( 'ul' ),
$tabs = $links_container.siblings( '.et-pb-options-tabs' ),
active_link_class = 'et-pb-options-tabs-links-active',
$active_tab_link = $links_container.find( '.' + active_link_class ),
active_tab_link_index = $active_tab_link.index(),
$current_tab = $tabs.find( '.et-pb-options-tab' ).eq( active_tab_link_index ),
$next_tab = $tabs.find( '.et-pb-options-tab' ).eq( tab_index ),
fade_speed = 300;
if ( active_tab_link_index !== tab_index ) {
$next_tab.css( { 'display' : 'none', opacity : 0 } );
$current_tab.css( { 'display' : 'block', 'opacity' : 1 } ).stop( true, true ).animate( { opacity : 0 }, fade_speed, function(){
$(this).css( 'display', 'none' );
$next_tab.css( { 'display' : 'block', 'opacity' : 0 } ).stop( true, true ).animate( { opacity : 1 }, fade_speed, function() {
var $this = $(this);
//et_pb_update_affected_fields( $et_affect_fields );
if ( ! $this.find( '.et-pb-option:visible' ).length && ! $next_tab.hasClass( 'et-pb-options-tab-view_stats' ) ) {
$this.append( '<p class="et-pb-all-options-hidden">' + et_pb_options.all_tab_options_hidden + '<p>' );
} else {
$('.et-pb-all-options-hidden').remove();
}
$main_tabs.trigger( 'et_pb_main_tab:changed' );
} );
} );
$active_tab_link.removeClass( active_link_class );
$links_container.find( 'li' ).eq( tab_index ).addClass( active_link_class );
// always scroll to the top when tab opened
$( '.et-pb-options-tabs' ).animate( { scrollTop : 0 }, 400, 'swing' );
}
return false;
} );
$settings_tab.each( function() {
var $this_tab = $(this),
$toggles = $this_tab.find( '.et-pb-options-toggle-enabled' ),
open_class = 'et-pb-option-toggle-content-open',
closed_class = 'et-pb-option-toggle-content-closed',
content_area_class = 'et-pb-option-toggle-content',
animation_speed = 300;
$toggles.find( 'h3' ).click( function() {
var $this_el = $(this),
$content_area = $this_el.siblings( '.' + content_area_class ),
$container = $this_el.closest( '.et-pb-options-toggle-container' ),
$open_toggle = $toggles.filter( '.' + open_class ),
$open_toggle_content_area = $open_toggle.find( '.' + content_area_class );
if ( $container.hasClass( open_class ) ) {
return;
}
$open_toggle.removeClass( open_class ).addClass( closed_class );
$open_toggle_content_area.slideToggle( animation_speed );
$container.removeClass( closed_class ).addClass( open_class );
$content_area.slideToggle( animation_speed, function() {
et_pb_update_affected_fields( $et_affect_fields );
} );
} );
} );
if ( $main_custom_margin_field.length ) {
$main_custom_margin_field.each( function() {
et_pb_process_custom_margin_field( $( this ) );
});
$main_custom_margin_field.on( 'et_main_custom_margin:change', function() {
et_pb_process_custom_margin_field( $(this) );
} );
}
$custom_margin_fields.change( function() {
var $this_el = $(this),
this_device = typeof $this_el.data( 'device' ) !== 'undefined' ? $this_el.data( 'device' ) : 'all',
$container = $this_el.closest( '.et_custom_margin_padding' ),
$main_container = $container.closest( '.et-pb-option-container' ),
$mobile_toggle = $main_container.find( '.et-pb-mobile-settings-toggle' ),
$main_field = 'all' === this_device ? $container.find( '.et_custom_margin_main' ) : $container.find( '.et_custom_margin_main.et_pb_setting_mobile_' + this_device ),
fields_selector = 'all' === this_device ? '.et_custom_margin' : '.et_custom_margin.et_pb_setting_mobile_' + this_device,
margin = '',
$option = $this_el.closest( '.et-pb-option' ),
option_name = $option.data( 'option_name' ),
property_map = {
custom_padding: 'padding',
custom_margin: 'margin'
};
$container.find( fields_selector ).each( function() {
margin += $.trim( et_pb_sanitize_input_unit_value( $(this).val(), $(this).hasClass( 'auto_important' ), undefined, property_map[option_name] ) ) + '|';
} );
margin = margin.slice( 0, -1 );
if ( '|||' === margin ) {
margin = '';
} else {
$mobile_toggle.addClass( 'et-pb-mobile-icon-visible' );
}
$main_field.val( margin ).trigger( 'et_pb_setting:change' );
et_pb_update_mobile_defaults( $main_field );
} );
$font_style_fields.click( function() {
var $this_el = $(this);
var $options_container = $this_el.closest('.et_builder_font_styles');
var related_options = [['uppercase', 'capitalize'], ['underline', 'line_through']];
var button_name = $this_el.data('button_name');
var $main_container = $this_el.closest( '.et-pb-option-container--font' );
$this_el.toggleClass( 'et_font_style_active' );
// Option can affect other options, i.e. enabling one option from set disables other options
// Check if one of the related options enabled and disable others
_.forEach( related_options, function(options_set) {
if ( -1 !== _.indexOf( options_set, button_name ) ) {
_.forEach( options_set, function(related_option) {
if ( related_option !== button_name ) {
$options_container.find('.et_builder_' + related_option + '_font').removeClass( 'et_font_style_active' );
}
});
}
});
et_pb_update_font_settings( $this_el.closest( '.et-pb-option-container--font' ) );
et_pb_setup_font_setting( $this_el.closest( '.et-pb-option--font' ) );
return false;
} );
$font_styles_selects.change( function() {
et_pb_update_font_settings( $(this).closest( '.et-pb-option-container--font' ) );
} );
$font_select.on( 'click', '.et-pb-settings-option-select li', function( event ) {
var $this_el = $(this),
$menu_container = $this_el.closest( '.et-pb-option--font' ),
$menu_items = $menu_container.find( '.et-pb-settings-option-select-advanced' ),
menu_value = $this_el.data('value');
if ( ! _.isUndefined(menu_value) ) {
if ( $( event.target ).closest( '.et-pb-user-font-marker' ).length > 0 ) {
et_pb_create_prompt_modal( 'delete_font', menu_value );
return;
}
et_pb_update_font_settings( $menu_container, menu_value );
et_pb_close_advanced_menu( $menu_items );
if ( 'default' !== menu_value ) {
et_pb_update_recent_fonts( menu_value );
}
et_pb_setup_font_setting( $menu_container, false );
}
} );
$font_select.on( 'click', '.et-pb-font-upload-button', function( event ) {
var option_name = $( event.target ).closest( '.et-pb-option--font' ).data('option_name');
et_pb_create_prompt_modal( 'upload_font', option_name );
});
$font_select.on( 'input', '.et-pb-menu-filter', function() {
var search_text = $( this ).val();
var $menu_options = $( this ).closest( '.et-pb-settings-option-select-advanced' );
var $menu_items = $menu_options.find('.select-option-item');
if ( '' !== search_text ) {
$menu_options.addClass('et_pb_menu_search_active');
} else {
$menu_options.removeClass('et_pb_menu_search_active');
}
$menu_items.removeClass('et_pb_hidden_item');
// filter menu items depending on search string
var filtered_items = _.filter($menu_items, function(item){ return ( -1 === $( item ).text().toLowerCase().search( search_text.toLowerCase() ) ) });
$( filtered_items ).addClass('et_pb_hidden_item');
});
$font_select.each( function() {
et_pb_setup_font_setting( $(this), false, true );
} );
$font_select_placeholder.click( function() {
var $this_placeholder = $( this );
var $menu_container = $this_placeholder.closest( '.et-pb-select-font-outer' );
var $menu_options = $menu_container.find( '.et-pb-settings-option-select-advanced' );
var $menu_items = $menu_options.find('.select-option-item');
var $search_field = $menu_container.find( '.et-pb-menu-filter' );
// open menu and reset all classes
$menu_options.addClass('et_pb_menu_active');
$menu_options.removeClass('et_pb_menu_search_active');
$menu_items.removeClass('et_pb_hidden_item');
$search_field.val('');
$menu_options.animate({
scrollTop: 0
}, 0);
// set the menu position and size
var menu_position = $this_placeholder.offset();
var window_height = $( window ).height();
var window_scroll = $( window ).scrollTop();
var safety_space = 50; // some space to move the menu away from the edge
var max_height = 500 > window_height ? ( window_height - safety_space ) : 500;
var top_position = menu_position.top - window_scroll - 20;
var bottom_space = window_height - top_position;
if ( bottom_space < max_height ) {
top_position -= ( max_height - bottom_space ) + safety_space;
} else {
max_height = bottom_space - safety_space;
}
$menu_options.css({'top' : top_position, 'maxHeight' : max_height});
$( 'body' ).addClass('et_pb_advanced_menu_opened');
});
$text_align_selects.each( function() {
var $text_align_select = $(this),
saved_value = $text_align_select.data('saved_value'),
default_value = $text_align_select.data('default'),
text_align = '' !== saved_value ? $text_align_select.val() : default_value,
$container = $text_align_select.closest( '.et-pb-option-container' ),
$select_field = $container.find( 'select.et-pb-text-align-select' ),
$selected_button = text_align !== '' ? $container.find( '.et_builder_' + text_align + '_text_align' ) : false;
if ( $selected_button ) {
$selected_button.addClass( 'et_text_align_active' );
}
} );
$text_align_selects.change( function() {
var $this_el = $( this ),
$container = $this_el.closest( '.et-pb-option-container' ),
$active_button = $container.find( '.et_builder_text_align.et_text_align_active' ),
value = $active_button.length ? $active_button.data( 'value' ) : false,
defaultValue = $this_el.attr( 'data-default' ),
new_saved_value = defaultValue === value ? '' : value;
if ( value ) {
$this_el.data('saved_value', new_saved_value);
$this_el.val( value ).trigger( 'et_pb_setting:change' );
}
} );
$text_align_button.click(function() {
var $button = $(this),
activeClassName = 'et_text_align_active',
$container = $button.closest( '.et-pb-option-container' ),
is_active = $button.hasClass( activeClassName ),
$select = $container.find( '.et-pb-text-align-select' ),
defaultValue = $select.attr( 'data-default' );
$container.find( '.et_builder_text_align' ).removeClass( activeClassName );
if ( ! is_active ) {
$button.addClass( activeClassName );
} else if ( ! _.isUndefined( defaultValue ) && defaultValue !== '' ) {
$container.find( '.et_builder_' + defaultValue + '_text_align' ).addClass( activeClassName );
}
$select.trigger( 'change' );
return false;
} );
$multiple_buttons_select.each( function() {
var $select_el = $(this);
$select_el.trigger( 'et_pb_setting:change' );
} );
$multiple_buttons_select.change( function() {
var $select_el = $(this);
var saved_value = $select_el.data('saved_value');
var default_value = $select_el.data('default');
var select_val = '' !== saved_value ? $select_el.val() : default_value;
var $container = $select_el.closest( '.et-pb-option-container' );
var $selected_button = select_val !== '' ? $container.find( '.et_builder_' + select_val + '_button' ) : false;
if ( $selected_button ) {
$container.find( '.et_builder_multiple_buttons_button' ).removeClass( 'et_builder_multiple_buttons_button_active' );
$selected_button.addClass( 'et_builder_multiple_buttons_button_active' );
// set the select to correct value by default
if ( '' === saved_value ) {
$select_el.val(default_value);
}
$select_el.trigger( 'et_pb_setting:change' );
}
} );
$multiple_buttons_button.click(function() {
var $button = $(this);
var activeClassName = 'et_builder_multiple_buttons_button_active';
var $container = $button.closest( '.et-pb-option-container' );
var newValue = $button.data( 'value' );
var $select = $container.find( 'select' );
var default_value = $select.data( 'default' );
var new_saved_value = default_value === newValue ? '' : newValue;
$select.data('saved_value', new_saved_value);
$select.val( newValue ).trigger('change');
return false;
} );
$range_field.on( 'input change', function() {
var $this_el = $(this),
this_device = typeof $this_el.data( 'device' ) === 'undefined' ? 'all' : $this_el.data( 'device' ),
range_value = $this_el.val(),
$range_input = 'all' === this_device ? $this_el.siblings( '.et-pb-range-input' ) : $this_el.siblings( '.et-pb-range-input.et_pb_setting_mobile_' + this_device ),
initial_value_set = $range_input.data( 'initial_value_set' ) || false,
range_input_value = et_pb_sanitize_input_unit_value( $.trim( $range_input.val() ), false, 'no_default_unit' ),
number,
length;
if ( range_input_value === '' && ! initial_value_set ) {
$this_el.val( 0 );
$range_input.data( 'initial_value_set', true );
return;
}
number = parseFloat( range_input_value );
range_input_value += '';
length = $.trim( range_input_value.replace( number, '' ) );
if ( length !== '' ) {
range_value += length;
}
$range_input.val( range_value ).trigger( 'et_pb_setting:change' );
et_pb_update_mobile_defaults( $this_el, range_value );
} );
if ( $range_field.length ) {
$range_field.each( function() {
var $this_el = $(this),
this_device = typeof $this_el.data( 'device' ) === 'undefined' ? 'all' : $this_el.data( 'device' ),
default_value = typeof $this_el.data( 'default_inherited' ) !== 'undefined' ? $.trim( $this_el.data( 'default_inherited' ) ) : $.trim( $this_el.data( 'default' ) ),
$range_input = 'all' === this_device ? $this_el.siblings( '.et-pb-range-input' ) : $this_el.siblings( '.et-pb-range-input.et_pb_setting_mobile_' + this_device ),
range_input_value = $.trim( $range_input.val() );
if ( range_input_value === '' ) {
if ( default_value !== '' ) {
$range_input.val( default_value );
default_value = parseFloat( default_value ) || 0;
}
$this_el.val( default_value );
range_input_value = default_value;
}
// Define defaults for tablet and phone settings on load
if ( 'tablet' === this_device ) {
var $desktop_field = $this_el.siblings( '.et-pb-range-input.et_pb_setting_mobile_desktop' ),
new_tablet_default = $desktop_field.val();
$this_el.data( 'default', parseFloat( new_tablet_default ) );
$range_input.data( 'default', new_tablet_default );
} else if ( 'phone' === this_device ) {
var $tablet_field = $this_el.siblings( '.et-pb-range-input.et_pb_setting_mobile_tablet' ),
new_phone_default = $tablet_field.val();
$this_el.data( 'default', parseFloat( new_phone_default ) );
$range_input.data( 'default', new_phone_default );
}
et_pb_check_range_boundaries( $this_el, range_input_value, true );
} );
}
$range_input.on( 'keyup change', function( event ) {
var $this_el = $(this),
this_device = typeof $this_el.data( 'device' ) === 'undefined' ? 'all' : $this_el.data( 'device' ),
this_value = et_pb_get_range_input_value( $this_el, true ),
$range_slider = 'all' === this_device ? $this_el.siblings( '.et-pb-range' ) : $this_el.siblings( '.et-pb-range.et_pb_setting_mobile_' + this_device ),
update_step = false,
slider_value;
slider_value = parseFloat( this_value ) || 0;
// check the range slider step and update if value entered manually.
if ( ! _.isUndefined( event.type ) && 'keyup' === event.type ) {
update_step = true;
}
et_pb_check_range_boundaries( $range_slider, slider_value, update_step );
$range_slider.val( slider_value ).trigger( 'et_pb_setting:change' );
et_pb_update_mobile_defaults( $this_el );
} );
if ( $validate_unit_field.length ) {
$validate_unit_field.each( function() {
var $this_el = $(this),
value = et_pb_sanitize_input_unit_value( $.trim( $this_el.val() ) );
$this_el.val( value );
} );
}
if ( $advanced_tab_settings.length ) {
$advanced_tab_settings.on( 'change et_pb_setting:change et_main_custom_margin:change', function() {
var $this_el = $(this),
this_device = typeof $this_el.data( 'device' ) === 'undefined' ? 'all' : $this_el.data( 'device' ),
$option_container = $this_el.closest( '.et-pb-option-container' ),
$reset_button = $option_container.find( '.et-pb-reset-setting' ),
is_range_option = $this_el.hasClass( 'et-pb-range' ),
is_font_option = $this_el.hasClass( 'et-pb-font-select' ),
is_preset = $this_el.hasClass( 'et-presets' ) || $this_el.hasClass( 'et_select_animation' );
var $current_element = is_range_option && 'all' === this_device ? $this_el.siblings( '.et-pb-range-input' ) : $this_el;
if (is_preset) {
$current_element = $this_el.children('input');
}
$current_element = is_range_option && 'all' !== this_device ? $this_el.siblings( '.et-pb-range-input.et_pb_setting_mobile_' + this_device ) : $current_element;
var default_value = et_pb_get_default_setting_value( $current_element ).toLowerCase();
var current_value = $current_element.val() + '';
current_value = current_value.toLowerCase();
var $mobile_toggle = $option_container.find( '.et-pb-mobile-settings-toggle' );
// specific actions required for reset buttons in Font option
if ( is_font_option ) {
var font_settings = current_value.split('|');
var font_settings_default = default_value.split('|');
$reset_button.each( function() {
var $this_button = $( this );
var font_setting_id = 0;
if ( $this_button.hasClass('et_pb_reset_weight') ) {
font_setting_id = 1;
}
if ( '' !== font_settings[ font_setting_id ] && font_settings_default[ font_setting_id ] !== font_settings[ font_setting_id ] ) {
$this_button.addClass( 'et-pb-reset-icon-visible' );
} else {
$this_button.removeClass( 'et-pb-reset-icon-visible' );
}
});
return;
}
if ( $current_element.hasClass( 'et_pb_setting_mobile' ) && ! $current_element.hasClass( 'et_pb_setting_mobile_active' ) ) {
// make the mobile toggle icon visible if any option is not default
if ( ( current_value !== default_value && ! is_range_option ) || ( is_range_option && current_value !== default_value + 'px' && current_value !== default_value ) ) {
$mobile_toggle.addClass( 'et-pb-mobile-icon-visible' );
}
// do not proceed if mobile settings are not opened and we're processing mobile field
return;
}
// range option default value can be defined without units, so compare current value with default and default + 'px' for range option
if ( !et_pb_is_setting_value_default( $current_element, is_range_option) ) {
setTimeout( function() {
$reset_button.addClass( 'et-pb-reset-icon-visible' );
}, 50 );
$mobile_toggle.addClass( 'et-pb-mobile-icon-visible' );
} else {
$reset_button.removeClass( 'et-pb-reset-icon-visible' );
if ( ! $mobile_toggle.hasClass( 'et-pb-mobile-settings-active' ) ) {
$mobile_toggle.removeClass( 'et-pb-mobile-icon-visible' );
}
}
} );
$advanced_tab_settings.trigger( 'change' );
$container.find( '.et-pb-main-settings .et_pb_options_tab_advanced a' ).append( '<span class="et-pb-reset-settings"></span>' );
$container.find( '.et-pb-reset-settings' ).on( 'click', function() {
et_pb_create_prompt_modal( 'reset_advanced_settings', $advanced_tab_settings );
} );
}
$container.find( '.et-pb-reset-setting' ).not('.et-pb-reset-skip').on( 'click', function() {
et_pb_reset_element_settings( $(this) );
} );
var module_type = $container.data( 'module_type' );
var $other_et_affects = $();
if ( has( window.et_pb_module_field_dependencies, module_type ) ) {
var field_dependencies = window.et_pb_module_field_dependencies[module_type];
function et_pb_show_field_decide( new_value, show_if, show_if_not ) {
var show = false;
if ( show_if && show_if_not ) {
show_if = _.isArray( show_if ) ? _.includes( show_if, new_value ) : new_value === show_if;
show_if_not = _.isArray( show_if_not ) ? ! _.includes( show_if_not, new_value ) : new_value !== show_if_not;
show = show_if && show_if_not;
} else if ( show_if ) {
show = _.isArray( show_if ) ? _.includes( show_if, new_value ) : new_value === show_if;
} else if ( show_if_not ) {
show = _.isArray( show_if_not ) ? ! _.includes( show_if_not, new_value ) : new_value !== show_if_not;
}
return show;
}
function et_pb_get_field_dependencies( affected_field ) {
var deps = [];
if ( field_dependencies[affected_field].show_if ) {
deps = _.keys( field_dependencies[affected_field].show_if );
}
if ( field_dependencies[affected_field].show_if_not ) {
deps = _.union( deps, _.keys( field_dependencies[affected_field].show_if_not ) );
}
return deps;
}
function et_pb_dependency_value_change_handler( affected_field ) {
var show = [];
var affects = field_dependencies[affected_field].affects;
var $affected_field = $container.find( '#et_pb_' + affected_field );
var $affected_container = $affected_field.closest( '.et-pb-option' );
var dependencies = et_pb_get_field_dependencies( affected_field );
_.forEach( dependencies, function ( dependency ) {
var new_value = $container.find( '#et_pb_' + dependency ).val();
var show_if = field_dependencies[dependency].affects[affected_field]['show_if'];
var show_if_not = field_dependencies[dependency].affects[affected_field]['show_if_not'];
show.push( et_pb_show_field_decide( new_value, show_if, show_if_not ) );
} );
show = ! _.includes( show, false );
// shows or hides the affected field container
$affected_container.toggle( show ).addClass( 'et_pb_animate_affected' );
var event = show ? 'et-pb-option-field-shown' : 'et-pb-option-field-hidden';
$affected_field.trigger( event );
setTimeout( function () {
$affected_container.removeClass( 'et_pb_animate_affected' );
et_pb_hide_empty_toggles( $affected_field );
}, 500 );
if ( ! _.isUndefined( affects ) ) {
_.forEach( affects, function ( value, affected_field ) {
et_pb_dependency_value_change_handler( affected_field );
} );
}
}
_.forEach( field_dependencies, function( dependency_info, field_name ) {
if ( _.isUndefined( dependency_info.affects ) ) {
return;
}
var $dependency = $container.find( '#et_pb_' + field_name );
$other_et_affects = $other_et_affects.add( $dependency );
$dependency.on( 'change', function() {
_.forEach( dependency_info.affects, function( value, affected_field ) {
et_pb_dependency_value_change_handler( affected_field );
} );
} );
});
}
if ( $et_affect_fields.length ) {
$et_affect_fields.change( function() {
var $this_field = $(this), // this field value affects another field visibility
new_field_value = $this_field.val(),
new_field_value_number = parseInt( new_field_value ),
data_affects_obj = _.map( $this_field.data( 'affects' ).split(', '), function( affect ) {
var is_selector = ( 'image' !== affect ) && $( affect ).length;
return is_selector ? affect : '#et_pb_' + affect;
} ),
data_affects = data_affects_obj.join(', '),
$affected_fields = $container.find( data_affects ),
this_field_tab_index = $this_field.closest( '.et-pb-options-tab' ).index();
$affected_fields.each( function() {
var $affected_field = $(this),
$affected_container = $affected_field.closest( '.et-pb-option' ),
is_text_trigger = 'text' === $this_field.attr( 'type' ) && typeof show_if_not === 'undefined' && typeof show_if === 'undefined', // need to know if trigger is text field
show_if = $affected_container.data( 'depends_show_if' ) || 'on',
show_if_not = is_text_trigger ? '' : $affected_container.data( 'depends_show_if_not' ),
show = show_if === new_field_value || ( typeof show_if_not !== 'undefined' && ! _.contains( show_if_not.split(','), new_field_value ) ),
affected_field_tab_index = $affected_field.closest( '.et-pb-options-tab' ).index(),
$dependant_fields = $affected_container.find( '.et-pb-affects' ), // affected field might affect some other fields as well
is_use_background_color_gradient = $this_field.closest( '.et_pb_background-template--use_color_gradient' ).length;
// make sure hidden text fields do not break the visibility of option
if ( is_text_trigger && ! $this_field.is( ':visible' ) ) {
return;
}
// if the affected field should be displayed, but the field that affects it is not visible, don't show the affected field ( it only can happen on settings page load )
if ( this_field_tab_index === affected_field_tab_index && show && ! $this_field.is( ':visible' ) && ! $this_field.is( '[type="hidden"]' ) && ! is_use_background_color_gradient ) {
show = false;
}
// shows or hides the affected field container
$affected_container.toggle( show ).addClass( 'et_pb_animate_affected' );
var event = $affected_field.is( ':visible' ) ? 'et-pb-option-field-shown' : 'et-pb-option-field-hidden';
$affected_field.trigger( event );
setTimeout( function() {
$affected_container.removeClass( 'et_pb_animate_affected' );
et_pb_hide_empty_toggles( $affected_field );
}, 500 );
// if the affected field affects other fields, find out if we need to hide/show them
if ( $dependant_fields.length ) {
var data_inner_affects_obj = _.map( $dependant_fields.data( 'affects' ).split(', '), function( affect ) {
var is_selector = ( 'image' !== affect ) && $( affect ).length;
return is_selector ? affect : '#et_pb_' + affect;
} );
var data_inner_affects = data_inner_affects_obj.join(', ');
var $inner_affected_elements = $( data_inner_affects );
if ( ! $affected_container.is( ':visible' ) ) {
// if the main affected field is hidden, hide all fields it affects
$inner_affected_elements.each( function() {
$(this).closest( '.et-pb-option' ).hide();
et_pb_hide_empty_toggles( $(this) );
} );
} else {
// if the main affected field is displayed, trigger the change event for all fields it affects
$affected_field.trigger( 'change' );
}
}
} );
// don't make conditional logic row sortable as that is not needed and causes it to not work properly
$('.et_options_list:not(.et_conditional_logic)').each(function() {
var $list = $(this);
if ( 0 !== $list.find('.et_options_rows').length ) {
return;
}
var $options = $list.find('textarea');
$list.find('.et_options_list_row').wrapAll('<div class="et_options_rows" />');
$list.find( '.et_options_rows' ).sortable({
axis : 'y',
containment: 'parent',
update: function() {
update_options_list( $list, $options );
setTimeout( function() {
$('.et_options_rows').children().css({
position: '',
top: '',
left: ''
});
}, 700);
}
});
});
} );
// trigger change event for all dependant ( affected ) fields to show on settings page load
setTimeout( function() {
// make all settings visible to properly enable all affected fields
$settings_tab.css( { 'display' : 'block' } );
// include fields using more advanced dependency declaration instead of html5 data attrs
$et_affect_fields = $et_affect_fields.add( $other_et_affects );
$et_affect_fields.data( 'is_rendering_setting_view', true );
et_pb_update_affected_fields( $et_affect_fields );
$et_affect_fields.data( 'is_rendering_setting_view', false );
// After all affected fields is being processed return all tabs to the initial state
$settings_tab.css( { 'display' : 'none' } );
et_pb_open_current_tab();
// Remove all empty toggles which may appear in Section settings
if ( $( '.et-pb-option-toggle-content' ).length > 0 ) {
$( '.et-pb-option-toggle-content' ).each( function() {
if ( '' === $.trim( $( this ).text() ) ) {
$( this ).closest( '.et-pb-options-toggle-container' ).remove();
}
});
}
}, 100 );
}
if ( $et_responsive_affect_fields.length ) {
$et_responsive_affect_fields.on( 'et_pb_setting:change', function() {
var $field = $(this),
$field_wrapper = $field.parent(),
$responsive_fields = $field_wrapper.children( '.et-pb-responsive-affects' ),
responsive_desktop_name = $field.data( 'responsive-desktop-name' ),
affects = $field.data( 'responsive-affects' ).split( ',' ),
values = {
desktop: $field_wrapper.find( '#' + responsive_desktop_name ).val(),
tablet: $field_wrapper.find( '#' + responsive_desktop_name + '_tablet' ).val(),
phone: $field_wrapper.find( '#' + responsive_desktop_name + '_phone' ).val()
},
$last_edited = $field.closest('.et_pb_modal_settings_container_step2').length ? $field_wrapper.find( 'input[id="data.' + responsive_desktop_name + '_last_edited"]' ) : $field_wrapper.find( '#' + responsive_desktop_name + '_last_edited' ),
last_edited = $last_edited.val(),
is_responsive = 'string' === typeof last_edited ? last_edited.split('|')[0] === 'on' : false;
_.forEach( affects, function( affect ) {
var $affected_field = $( '#et_pb_' + affect ),
$affected_field_container = $affected_field.closest( '.et-pb-option:not(.et_pb_background-option)' ),
show_if_not = $affected_field_container.data( 'depends_show_if_not' ).split( ',' ),
show = true;
if ( is_responsive ) {
show = ! _.contains( show_if_not, values.desktop ) || ! _.contains( show_if_not, values.tablet ) || ! _.contains( show_if_not, values.phone );
} else {
show = ! _.contains( show_if_not, values.desktop );
}
$affected_field_container.toggle( show );
// Also toggle group toggle if this is the only option on the toggle group
if ( $affected_field_container.siblings().length < 1 ) {
$affected_field_container.closest( '.et-pb-options-toggle-container' ).toggle( show );
}
} );
} );
setTimeout( function() {
$et_responsive_affect_fields.each(function() {
$(this).trigger( 'et_pb_setting:change' );
});
} );
}
// update the unique class for opened module when custom css tab opened
$container.find( '.et-pb-options-tabs-links' ).on( 'et_pb_main_tab:changed', function() {
var $custom_css_tab = $( '.et-pb-options-tabs-links' ).find( '.et_pb_options_tab_custom_css' ),
$module_order_placeholder = $( '.et-pb-options-tab-custom_css' ).find( '.et_pb_module_order_placeholder' ),
opened_module,
module_order;
if ( $custom_css_tab.hasClass( 'et-pb-options-tabs-links-active' ) ) {
var opened_module = ET_PageBuilder_Modules.findWhere( { cid : this_module_cid } );
module_order = typeof opened_module.attributes.module_order !== 'undefined' ? opened_module.attributes.module_order : '';
// replace empty placeholders with module order value if any
if ( $module_order_placeholder.length ) {
$module_order_placeholder.replaceWith( module_order );
}
}
});
// show/hide css selector field for the custom css options on focus
if ( $custom_css_option.length ) {
$custom_css_option.focusin( function() {
var $this = $( this ),
$this_main_container = $this.closest( '.et-pb-option' ),
$css_selector_holder = $this_main_container.find( 'label > span' ),
$other_inputs_selectors = $this_main_container.siblings().find( 'label > span' );
// show the css selector span for option with focus
if ( $css_selector_holder.length ) {
$css_selector_holder.removeClass( 'et_pb_hidden_css_selector' );
$css_selector_holder.css( { 'display' : 'inline-block' } );
$css_selector_holder.addClass( 'et_pb_visible_css_selector' );
}
// hide the css selector span for other options
if ( $other_inputs_selectors.length ) {
$other_inputs_selectors.removeClass( 'et_pb_visible_css_selector' );
$other_inputs_selectors.addClass( 'et_pb_hidden_css_selector' );
setTimeout( function() {
$other_inputs_selectors.css( { 'display' : 'none' } );
$other_inputs_selectors.removeClass( 'et_pb_hidden_css_selector' );
}, 200 );
}
});
}
// handle global module options sync button clicks
$container.on( 'click', '.et_pb_global_sync_switcher', function() {
var $clicked_button = $( this );
var option_unsynced = $clicked_button.hasClass( 'et_pb_global_unsynced' );
if ( option_unsynced ) {
$clicked_button.removeClass( 'et_pb_global_unsynced' );
} else {
$clicked_button.addClass( 'et_pb_global_unsynced' );
}
});
new ET_PageBuilder.Controls.BorderRadius($container);
new ET_PageBuilder.Controls.BorderStyles($container);
}
function et_pb_update_font_settings($option_container, font_family) {
var $main_option = $option_container.find( 'input.et-pb-font-select' ),
main_option_val = $main_option.val().split('|'),
bold_option = $option_container.find( '.et_builder_font_weight' ).val(),
$style_options = $option_container.find( '.et_builder_font_styles' ),
$line_color_option = $option_container.find( '.et-pb-font-line-color-value' ),
$line_style_option = $option_container.find( '.et_pb_font_line_style_select' ),
$italic_option = $style_options.find( '.et_builder_italic_font' ),
$uppercase_option = $style_options.find( '.et_builder_uppercase_font' ),
$underline_option = $style_options.find( '.et_builder_underline_font' ),
$capitalize_option = $style_options.find( '.et_builder_capitalize_font' ),
$line_through_option = $style_options.find( '.et_builder_line_through_font' ),
style_active_class = 'et_font_style_active',
font_name = _.isUndefined( font_family ) ? main_option_val[0] : font_family,
result = '';
result += font_name !== 'default' ? $.trim( font_name ) : '';
result += '|';
if ( '400' !== bold_option ) {
result += bold_option;
}
result += '|';
if ( $italic_option.hasClass( style_active_class ) ) {
result += 'on';
}
result += '|';
if ( $uppercase_option.hasClass( style_active_class ) ) {
result += 'on';
}
result += '|';
if ( $underline_option.hasClass( style_active_class ) ) {
result += 'on';
}
result += '|';
if ( $capitalize_option.hasClass( style_active_class ) ) {
result += 'on';
}
result += '|';
if ( $line_through_option.hasClass( style_active_class ) ) {
result += 'on';
}
result += '|';
if ( '' !== $line_color_option.val() ) {
result += $line_color_option.val();
}
result += '|';
if ( 'solid' !== $line_style_option.val() ) {
result += $line_style_option.val();
}
$main_option.val( result ).trigger( 'change' );
}
function et_pb_close_advanced_menu( $menu ) {
var $menu_container = $menu.closest( '.et-pb-option--font' ),
$menu_placeholder = $menu_container.find( '.et_pb_select_placeholder' );
$menu.removeClass('et_pb_menu_active');
$( 'body' ).removeClass('et_pb_advanced_menu_opened');
}
// check the range slider boundaries against the provided value and extend min or max boundary if needed
function et_pb_check_range_boundaries( $range_slider, slider_value, update_step ) {
var slider_max = parseFloat( $range_slider.attr( 'max' ) ),
slider_min = parseFloat( $range_slider.attr( 'min' ) );
if ( $range_slider.hasClass( 'et-pb-fixed-range' ) ) {
return;
}
slider_value = '' !== slider_value ? parseFloat( slider_value ) : 0;
// extend max boundary of the slider if needed
if ( slider_value > slider_max ) {
$range_slider.attr( 'max', slider_value );
$range_slider.val(slider_value);
}
// extend min boundary of the slider if needed
if ( slider_value < slider_min ) {
$range_slider.attr( 'min', slider_value );
$range_slider.val(slider_value);
}
// set the step to 0.1 if we need to update step and value is not integer
if ( update_step && '0.1' !== $range_slider.attr( 'step' ) && ( slider_value % 1 > 0 ) ) {
$range_slider.attr( 'step', '0.1' );
// reset the slider value to make sure it updated correctly after changing the step
$range_slider.val( slider_value );
}
}
function et_pb_get_range_input_value( $range_input, update_element_value ) {
var $range_field = $range_input.parent().find( '.et-pb-range' ),
range_value = $range_input.val(),
range_processed = typeof range_value === 'string' ? range_value.trim() : range_value,
range_digit = parseFloat( range_processed ),
range_string = range_processed.toString().replace( range_digit, '' ),
result;
// no need to use Number.isNaN there. parseFloat guarantees that we have a number or `NaN` value at this point.
if ( isNaN( range_digit ) ) {
range_digit = '';
}
if ( $range_field.hasClass( 'et-pb-fixed-range' ) ) {
var range_field_max = parseFloat( $range_field.attr( 'max' ) ),
range_field_min = parseFloat( $range_field.attr( 'min' ) ),
is_too_high = range_digit > range_field_max,
is_too_low = range_digit < range_field_min;
if ( is_too_high ) {
range_digit = range_field_max;
} else if ( is_too_low ) {
range_digit = range_field_min;
}
}
result = range_digit.toString() + range_string;
if ( update_element_value && result !== range_value ) {
$range_input.val( result );
}
return result;
}
function et_pb_get_default_key(el){
return $(el).hasClass( 'et-pb-color-picker-hex' ) ? 'default-color' : 'default';
}
function et_pb_get_default_setting_value( $element ) {
var default_data_name = et_pb_get_default_key($element);
var default_value;
// need to check for 'undefined' type instead of $element.data( default_data_name ) || '' because default value maybe 0
default_value = typeof $element.data( default_data_name ) !== 'undefined' ? $element.data( default_data_name ) : '';
if (_.isArray(default_value) && default_value.length > 0) {
var target = $element.closest('.et-pb-options-toggle-container').find('#et_pb_' + default_value[0]);
var values = default_value[1] || {};
default_value = values['' + target.val()];
}
// convert any type to string
default_value = default_value + '';
return default_value;
}
function et_pb_is_setting_value_default ($element) {
var default_value = et_pb_get_default_setting_value($element).toLowerCase();
var current_value = _.isUndefined(ET_PageBuilder.Helpers.getSettingValue($element)) ? '' : ET_PageBuilder.Helpers.getSettingValue($element).toString().toLowerCase();
var is_range_option = $element.hasClass('et-pb-range');
if ($element.is('select') && default_value === '' && $element.prop('selectedIndex') === 0) {
return true;
}
if ((!_.isNull(current_value) && current_value !== default_value && ! is_range_option) || (is_range_option && current_value !== default_value + 'px' && current_value !== default_value)) {
return false;
} else {
return true;
}
}
function et_pb_update_gradient_preview( $this ) {
var $wrapper = $this.closest('.et_pb_background-tab--gradient'),
base_name = $wrapper.closest( '.et-pb-option-container-inner' ).attr( 'data-base_name' ),
gradient = et_pb_get_gradient( $wrapper, base_name ),
$preview = $wrapper.find('.et-pb-option-preview');
if ( gradient ) {
$preview.css({
backgroundImage: gradient
});
} else {
$preview.removeAttr( 'style' );
}
}
function et_pb_get_gradient( $wrapper, base_name ) {
var base_name = base_name || 'background',
use_color_gradient = 'background' === base_name ? 'use_background_color_gradient' : base_name + '_use_color_gradient',
$use_gradient_input = $wrapper.find('.et_pb_background-option--' + use_color_gradient + ' select'),
$start_input = $wrapper.find('.et_pb_background-option--' + base_name + '_color_gradient_start .et-pb-color-picker-hex'),
$end_input = $wrapper.find('.et_pb_background-option--' + base_name + '_color_gradient_end .et-pb-color-picker-hex'),
$type_input = $wrapper.find('.et_pb_background-option--' + base_name + '_color_gradient_type select'),
$linear_direction_input = $wrapper.find('.et_pb_background-option--' + base_name + '_color_gradient_direction .et-pb-range-input'),
$radial_direction_input = $wrapper.find('.et_pb_background-option--' + base_name + '_color_gradient_direction_radial select'),
$start_position_input = $wrapper.find('.et_pb_background-option--' + base_name + '_color_gradient_start_position .et-pb-range-input'),
$end_position_input = $wrapper.find('.et_pb_background-option--' + base_name + '_color_gradient_end_position .et-pb-range-input');
if ( 'on' !== $use_gradient_input.val() ) {
return false;
}
var args = {
type: 'linear',
direction: '180deg',
radialDirection: 'center',
colorStart: '#2b87da',
colorEnd: '#29c4a9',
startPosition: '0%',
endPosition: '100%'
};
_.each({
type: $type_input.val(),
direction: $linear_direction_input.val(),
radialDirection: $radial_direction_input.val(),
colorStart: $start_input.val(),
colorEnd: $end_input.val(),
startPosition: $start_position_input.val(),
endPosition: $end_position_input.val()
}, function(value, key) {
if ('' !== value && ! _.isUndefined(value)) {
args[key] = value;
}
})
var direction = args.type === 'linear' ? args.direction : ( 'circle at ' + args.radialDirection ),
startPosition = et_pb_sanitize_input_unit_value(args.startPosition, undefined, '%'),
endPosition = et_pb_sanitize_input_unit_value(args.endPosition, undefined, '%');
return args.type + '-gradient( ' + direction + ', ' + args.colorStart + ' ' + startPosition + ', ' + args.colorEnd + ' ' + endPosition + ' )';
}
/*
* Reset icon or a setting field can be used as $element
*/
function et_pb_reset_element_settings( $element ) {
var $this_el = $element,
$option_container = $this_el.closest( '.et-pb-option-container' ),
$main_container = $option_container.closest( '.et-pb-option' ),
this_device = typeof $this_el.data( 'device' ) === 'undefined' || ! $main_container.hasClass( 'et_pb_has_mobile_settings' ) ? 'all' : $this_el.data( 'device' ),
$main_setting = 'all' === this_device ? $option_container.find( '.et-pb-main-setting' ) : $option_container.find( '.et-pb-main-setting.et_pb_setting_mobile_' + this_device ),
default_value = et_pb_get_default_setting_value( $main_setting );
if ( $main_setting.is( '.et-pb-text-align-select' ) ) {
if ( default_value ) {
$option_container
.find( '.et_builder_' + default_value + '_text_align' )
.addClass( 'et_text_align_active' )
.siblings()
.removeClass( 'et_text_align_active' );
} else {
$option_container
.find( '.et_text_align_active' )
.removeClass( 'et_text_align_active' );
}
$main_setting
.val( default_value )
.trigger( 'change' )
.trigger( 'et_pb_setting:change' );
if ( ! $this_el.hasClass( 'et-pb-reset-setting' ) ) {
$this_el = $option_container.find( '.et-pb-reset-setting' );
}
$this_el.removeClass( 'et-pb-reset-icon-visible' );
return;
}
if ( $main_setting.is( 'select' ) && default_value === '' ) {
$main_setting.prop( 'selectedIndex', 0 ).trigger( 'change' );
return;
}
if ( $main_setting.hasClass( 'et-pb-custom-color-picker' ) ) {
et_pb_custom_color_remove( $this_el );
return;
}
if ( $main_setting.hasClass( 'et-pb-color-picker-hex' ) ) {
$main_setting.wpColorPicker( 'color', default_value );
if ( default_value === '' ) {
$main_setting.siblings('.wp-picker-clear').trigger('click');
}
if ( ! $this_el.hasClass( 'et-pb-reset-setting' ) ) {
$this_el = $option_container.find( '.et-pb-reset-setting' );
}
$this_el.removeClass( 'et-pb-reset-icon-visible' );
return;
}
if ( $main_setting.hasClass( 'et-pb-font-select' ) ) {
var reset_option = $this_el.hasClass('et_pb_reset_weight') ? 'weight' : 'font';
et_pb_setup_font_setting( $option_container, reset_option );
return;
}
if ( $main_setting.hasClass( 'et-pb-range' ) ) {
$main_setting = 'all' === this_device ? $this_el.siblings( '.et-pb-range-input' ) : $this_el.siblings( '.et-pb-range-input.et_pb_setting_mobile_' + this_device );
default_value = et_pb_get_default_setting_value( $main_setting );
}
$main_setting.val( default_value ).trigger( 'et_pb_setting:change', ['et_pb_reset_setting'] );
$main_setting.data( 'has_saved_value', 'no' );
if ( $main_setting.hasClass( 'et_custom_margin_main' ) ) {
$main_setting.trigger( 'et_main_custom_margin:change' );
} else {
$main_setting.trigger( 'change' );
}
if ( $main_setting.hasClass('et_select_animation') ) {
$main_setting.find('.et_animation_button > a.et_active_animation').removeClass('et_active_animation');
$main_setting.find('.et_animation_button:first > a').addClass('et_active_animation');
}
if ( $main_setting.hasClass('et-presets') ) {
// When presets control is resetted, remove the active class and add it to its first preset
$main_setting.find('.et-preset').removeClass('et-preset-active').first().addClass('et-preset-active');
}
}
// Determine whether the value passed is acceptable value for given css property
function et_pb_is_acceptable_css_string_value( property, value ) {
var acceptable_css_string_values = et_pb_options.acceptable_css_string_values;
return ! _.isUndefined( acceptable_css_string_values[ property ] ) ? _.contains( acceptable_css_string_values[ property ], value ) : false;
}
function et_pb_sanitize_input_unit_value( value, auto_important, default_unit, context ) {
var value = typeof value === 'undefined' ? '' : value,
valid_one_char_units = [ "%" ],
valid_two_chars_units = [ "em", "px", "cm", "mm", "in", "pt", "pc", "ex", "vh", "vw", "ms" ],
valid_three_chars_units = [ "deg" ],
important = "!important",
important_length = important.length,
has_important = false,
value_length = value.length,
auto_important = _.isUndefined( auto_important ) ? false : auto_important,
unit_value,
result;
if ( value === '' ) {
return '';
}
// check for !important
if ( value.substr( ( 0 - important_length ), important_length ) === important ) {
has_important = true;
value_length = value_length - important_length;
value = value.substr( 0, value_length ).trim();
}
// Allow whitelisted strings to be used
if ( ! _.isUndefined( context ) && et_pb_is_acceptable_css_string_value( context, value ) ) {
unit_value = value;
// Re-add !important tag
if ( has_important && ! auto_important ) {
unit_value = unit_value + ' ' + important;
}
return unit_value;
}
if ( $.inArray( value.substr( -1, 1 ), valid_one_char_units ) !== -1 ) {
unit_value = parseFloat( value ) + value.substr( -1, 1 );
// Re-add !important tag
if ( has_important && ! auto_important ) {
unit_value = unit_value + ' ' + important;
}
return unit_value;
}
if ( $.inArray( value.substr( -2, 2 ), valid_two_chars_units ) !== -1 ) {
var unit_value = parseFloat( value ) + value.substr( -2, 2 );
// Re-add !important tag
if ( has_important && ! auto_important ) {
unit_value = unit_value + ' ' + important;
}
return unit_value;
}
if ( $.inArray( value.substr( -3, 3 ), valid_three_chars_units ) !== -1 ) {
var unit_value = parseFloat( value ) + value.substr( -3, 3 );
// Re-add !important tag
if ( has_important && ! auto_important ) {
unit_value = unit_value + ' ' + important;
}
return unit_value;
}
if( isNaN( parseFloat( value ) ) ) {
return '';
}
result = parseFloat( value );
if ( _.isUndefined( default_unit ) || 'no_default_unit' !== default_unit ) {
result += 'px';
}
// Return and automatically append px (default value)
return result;
}
function et_pb_process_custom_margin_field( $element ) {
var $this_field = $element,
this_device = typeof $this_field.data( 'device' ) !== 'undefined' ? $this_field.data( 'device' ) : 'all',
this_field_value = $this_field.val(),
$container = $this_field.closest( '.et_custom_margin_padding' ),
$main_container = $container.closest( '.et-pb-option-container' ),
$mobile_toggle = $main_container.find( '.et-pb-mobile-settings-toggle' ),
$margin_fields = 'all' === this_device ? $container.find( '.et_custom_margin' ) : $container.find( '.et_custom_margin.et_pb_setting_mobile_' + this_device ),
show_mobile = false,
i = 0,
margins;
et_pb_update_mobile_defaults( $element );
if ( this_field_value !== '' ) {
margins = this_field_value.split( '|' );
// if we have more fields than saved values, then add missing ones considering that saved values are top and bottom padding/margin
if ( $margin_fields.length > margins.length ) {
// fill the 2nd and 4th positions with empty values
margins.splice( 1, 0, '' );
margins.push( '' );
}
$margin_fields.each( function() {
var $this_field = $(this),
field_index = $margin_fields.index( $this_field ),
auto_important = $this_field.hasClass( 'auto_important' ),
$option = $this_field.closest( '.et-pb-option' ),
option_name = $option.data( 'option_name' ),
property_map = {
custom_padding: 'padding',
custom_margin: 'margin'
},
corner_value = et_pb_sanitize_input_unit_value( margins[ field_index ], auto_important, undefined, property_map[ option_name ] );
$this_field.val( corner_value ).trigger('et_pb_setting:change');
if ( '' !== corner_value ) {
show_mobile = true;
}
} );
if ( show_mobile ) {
$mobile_toggle.addClass( 'et-pb-mobile-icon-visible' );
}
} else {
$margin_fields.each( function() {
$(this).val( '' );
} );
}
}
function et_pb_setup_font_setting( $container, reset, initial_setup ) {
var $options_container = $container.closest( '.et-pb-options-tab' ),
$font_option_container = $container.find('.et-pb-select-font-outer'),
$main_option = $container.find( 'input.et-pb-font-select' ),
$select_option = $container.find( '.et-pb-settings-option-select-advanced' ),
$style_options = $container.find( '.et_builder_font_styles' ),
$select_placeholder = $container.find( '.et_pb_select_placeholder' ),
$bold_option = $container.find( '.et_builder_font_weight' ),
$line_color_option = $container.find( '.et_pb_font_line_color' ),
$line_style_option = $container.find( '.et_pb_font_line_style_select' ),
$font_style_options = $container.find( '.et_pb_font_style_container' ),
$italic_option = $style_options.find( '.et_builder_italic_font' ),
$uppercase_option = $style_options.find( '.et_builder_uppercase_font' ),
$underline_option = $style_options.find( '.et_builder_underline_font' ),
$capitalize_option = $style_options.find( '.et_builder_capitalize_font' ),
$line_through_option = $style_options.find( '.et_builder_line_through_font' ),
style_active_class = 'et_font_style_active',
font_value = $.trim( $main_option.val() ),
default_value = !_.isUndefined( $main_option.data('default') ) ? $main_option.data('default') : '||||||||',
all_caps_option = typeof $main_option.data( 'old-option-ref' ) !== 'undefined' && '' !== $main_option.data( 'old-option-ref' ) ? $main_option.data( 'old-option-ref' ) : '',
$all_caps_el = '' !== all_caps_option ? $options_container.find( '.et-pb-option-' + all_caps_option ) : '',
$all_caps_input = '' !== $all_caps_el && $all_caps_el.length ? $all_caps_el.find( 'input' ) : '',
selected_font = 'default',
recent_items = et_pb_get_recent_fonts( $select_option ),
weight_value = '400',
is_underline = false,
is_strikethrough = false,
selected_font_item,
font_values;
if ( reset ) {
var default_values = default_value.split('|');
font_values = '' === font_value.replace( /\|/g, '' ) ? default_values : font_value.split('|');
if ( 'weight' === reset ) {
font_values[1] = default_values[1];
} else {
font_values[0] = default_values[0];
}
font_value = font_values.join('|');
}
if ( initial_setup ) {
// update the label for Font Weight and Font Style options to include the group label
var $font_weight_container = $container.find('.et_pb_font_weight_container');
var $style_label = $font_style_options.find('label');
var $weight_label = $font_weight_container.find('label');
var group_header = $font_option_container.data('group_label');
// set to default if font value is empty
if ( '' === font_value.replace( /\|/g, '' ) ) {
font_value = default_value;
}
$style_label.html( group_header + ' ' + $style_label.html() );
$weight_label.html( group_header + ' ' + $weight_label.html() );
// update reset buttons location and data
var $reset_button = $container.find( '.et-pb-reset-setting' );
var $reset_button_weight = $reset_button.clone();
$font_option_container.append( $reset_button.addClass('et_pb_reset_font') );
$font_weight_container.append( $reset_button_weight.addClass('et_pb_reset_weight') );
}
if ( font_value !== '' ) {
font_values = font_value.split( '|' );
selected_font = font_values[0] !== '' ? font_values[0] : 'default';
$select_placeholder.html(_.escape(selected_font));
if ( font_values[1] !== '' ) {
weight_value = 'on' === font_values[1] ? '700' : font_values[1];
}
if ( font_values[2] === 'on' ) {
$italic_option.addClass( style_active_class );
} else {
$italic_option.removeClass( style_active_class );
}
if ( font_values[3] === 'on' ) {
$uppercase_option.addClass( style_active_class );
} else {
$uppercase_option.removeClass( style_active_class );
}
if ( font_values[4] === 'on' ) {
$underline_option.addClass( style_active_class );
is_underline = true;
} else {
$underline_option.removeClass( style_active_class );
}
if ( ! _.isUndefined( font_values[5] ) && font_values[5] === 'on' ) {
$capitalize_option.addClass( style_active_class );
} else {
$capitalize_option.removeClass( style_active_class );
}
if ( ! _.isUndefined( font_values[6] ) && font_values[6] === 'on' ) {
$line_through_option.addClass( style_active_class );
is_strikethrough = true;
} else {
$line_through_option.removeClass( style_active_class );
}
if ( ! _.isUndefined( font_values[7] ) && font_values[7] !== '' ) {
$line_color_option.find('.et-pb-custom-color-container').removeClass('et_pb_hidden');
$line_color_option.find('.et-pb-custom-color-button').addClass('et_pb_hidden');
$line_color_option.find('.et-pb-color-picker-hex-alpha').wpColorPicker( 'color', font_values[7] );
}
if ( ! _.isUndefined( font_values[8] ) && font_values[8] !== '' ) {
$line_style_option.val( font_values[8] );
}
} else {
$select_placeholder.html(_.escape(selected_font));
$italic_option.removeClass( style_active_class );
$uppercase_option.removeClass( style_active_class );
$underline_option.removeClass( style_active_class );
$capitalize_option.removeClass( style_active_class );
$line_through_option.removeClass( style_active_class );
}
// hide line color and line style options if underline and strikethrough are not selected
if ( ! is_underline && ! is_strikethrough ) {
$container.find( '.et_pb_font_line_settings' ).addClass('et_pb_hidden');
$container.find('.et-pb-option-container').removeClass( 'et_pb_fonts_long' );
} else {
var line_group_header = $font_option_container.data('group_label');
// construct the label for line style options dynamically
$container.find( '.et_pb_font_line_settings label' ).each( function() {
var $this_label = $( this );
var label_text = is_underline ? $this_label.data('underline_label') : $this_label.data('strikethrough_label');
$this_label.html(line_group_header + ' ' + label_text);
});
$container.find( '.et_pb_font_line_settings' ).removeClass('et_pb_hidden');
$container.find('.et-pb-option-container').addClass( 'et_pb_fonts_long' );
}
var supported_weigths = get_supported_weights( selected_font );
// make all the options accessible
$bold_option.find( 'option' ).removeClass('et_pb_unsupported_option');
// hide unsupported font-weight options for selected font
$bold_option.find( 'option' ).each( function() {
var $option_el = $( this );
// hide option if it doesn't exist in the list of supported options
if ( -1 === _.indexOf( supported_weigths, $option_el.val() ) ) {
$option_el.addClass('et_pb_unsupported_option');
// reset selected option to default
if (weight_value === $option_el.val()) {
weight_value = '400';
}
}
});
$bold_option.find('option[value="' + weight_value + '"]').prop('selected', true);
// mark the selected font and prepend it to the beginning of menu.
$selected_font_item = $select_option.find( '.select-option-item-' + selected_font.replace( / /g, '_' ) );
$select_option.find( '.et_pb_selected_menu_item' ).removeClass('et_pb_selected_menu_item');
$selected_font_item.addClass( 'et_pb_selected_menu_item' );
$select_option.find('.et_pb_selected_item_container').html(_.escape($selected_font_item.text()));
if ( ! _.isEmpty( recent_items ) ) {
$select_option.find('.et-pb-recent-fonts').removeClass('et_pb_hidden_subgroup');
$select_option.find('.et-pb-recent-fonts ul').html('');
_.each( recent_items, function( item ) {
var $recent_element = '<li class="select-option-item select-option-item-recent-font select-option-item-' + item.replace( / /g, '_' ) + '" data-value="' + item + '">' + item + '</li>';
$select_option.find('.et-pb-recent-fonts ul').append($recent_element);
});
} else {
$select_option.find('.et-pb-recent-fonts').addClass('et_pb_hidden_subgroup');
}
// backward compatibility for obsolete "all caps" option
if ( $all_caps_input.length && '' !== $all_caps_input.val() ) {
// turn on uppercase option if it's off, but "All Caps" is on
if ( font_values[3] !== 'on' && 'on' === $all_caps_input.val() ) {
$uppercase_option.addClass( style_active_class );
font_values[3] = 'on';
// update the value of font option if Uppercase value was changed
$main_option.val( font_values.join( '|' ) ).trigger( 'change' );
}
// reset the value for obsolete "all caps" option to remove it from shortcode
$all_caps_input.val( '' );
}
// update option value after reset
if ( reset ) {
$main_option.val(font_values.join('|')).trigger( 'et_pb_setting:change' );
}
}
function get_supported_weights( selected_font ) {
var google_fonts_data = et_pb_options.google_fonts;
var user_fonts_data = et_pb_options.user_fonts;
var selected_font_data = _.isUndefined( user_fonts_data[ selected_font ] ) ? false : user_fonts_data[ selected_font ];
var supported_options = _.keys( et_pb_options.supported_font_weights );
var processedWeights = {};
// return list of supported weights for Default font
if ( 'default' === selected_font.toLowerCase() ) {
return ['300', '400', '600', '700', '800'];
}
// try to retrieve font data from google fonts if it was not retrieved from User fonts
if ( ! selected_font_data ) {
selected_font_data = _.isUndefined( google_fonts_data[ selected_font ] ) ? false : google_fonts_data[ selected_font ];
}
if ( ! selected_font_data || _.isUndefined( selected_font_data.styles ) ) {
return supported_options;
}
return _.intersection( _.union( ['400', '700'], selected_font_data.styles.split(',') ), supported_options );
}
function et_pb_update_recent_fonts( item_name, action ) {
// don't add default font to the recent items
if ( 'default' === item_name ) {
return;
}
var recent_items = wpCookies.get( 'et-pb-recent-items-font_family' );
recent_items = ! _.isUndefined( recent_items ) && ! _.isNull( recent_items ) ? recent_items.split('|') : [];
if ( 'remove' === action ) {
if ( -1 === _.indexOf( recent_items, item_name ) ) {
return;
}
delete recent_items[ item_name ];
} else if ( -1 === _.indexOf( recent_items, item_name ) ) {
if ( recent_items.length >= 3 ) {
// remove last item in array
recent_items = recent_items.slice(0, 2);
}
// prepend the new item at the beginning of array
recent_items = _.union( [ item_name ], recent_items );
} else {
return;
}
var secure = ( 'https:' === window.location.protocol );
var cookie_expires = 365*24*60*60*1000;
// save the list of most recent items to cookies
wpCookies.set( 'et-pb-recent-items-font_family', recent_items.join('|'), cookie_expires, et_pb_options.cookie_path, false, secure );
}
function et_pb_get_recent_fonts( $menu ) {
// get the list of most recent items from cookies
var recent_items = wpCookies.get( 'et-pb-recent-items-font_family' );
recent_items = ! _.isUndefined( recent_items ) && ! _.isNull( recent_items ) ? recent_items.split('|') : [];
if ( _.isEmpty( recent_items ) ) {
return [];
}
var recent_items_processed = [];
_.each( recent_items, function( item ) {
if ( $menu.find( '.select-option-item-' + item.replace( / /g, '_' ) ).length > 0 ) {
recent_items_processed.push( item );
}
});
return recent_items_processed;
}
function et_pb_hide_active_color_picker( container ) {
container.$( '.et-pb-color-picker-hex:visible' ).each( function(){
$(this).closest( '.wp-picker-container' ).find( '.wp-color-result' ).trigger( 'click' );
} );
}
function et_builder_debug_message() {
if ( et_pb_options.debug && window.console ) {
if ( 2 === arguments.length ) {
console.log( arguments[0], arguments[1] );
} else {
console.log( arguments[0] );
}
}
}
function et_reinitialize_builder_layout( update_global_modules ) {
ET_PageBuilder_App.saveAsShortcode();
setTimeout( function(){
var $builder_container = $( '#et_pb_layout' ),
builder_height = $builder_container.innerHeight();
$builder_container.css( { 'height' : builder_height } );
content = et_pb_get_content( 'content', true );
ET_PageBuilder_App.removeAllSections();
ET_PageBuilder_App.$el.find( '.et_pb_section' ).remove();
ET_PageBuilder_App.createLayoutFromContent( et_prepare_template_content( content ), '', '', { is_reinit : 'reinit' } );
$builder_container.css( { 'height' : 'auto' } );
ET_PageBuilder_AB_Testing.update();
// in some cases we may need to update the content of global Rows and Section right after the layout reinit
if ( ! update_global_modules ) {
return;
}
// get array of global Rows and Sections on the page
var global_modules = _.filter( ET_PageBuilder_Modules.models, function( model ) {
return 'module' !== model.attributes.type && typeof model.attributes.et_pb_global_module !== 'undefined' && model.attributes.et_pb_global_module !== '';
} );
// update saved global template for each Section and Row
if ( 0 !== global_modules.length ) {
_.each( global_modules, function( model ) {
et_pb_update_global_template( model.attributes.cid );
});
}
}, 600 );
}
// TODO, need to put WP credits here, there is code in this function thats is based on/from WP core heartbeat.js
// wp-includes/js/heartbeat.js
function et_builder_check_for_frontend_builder_updates(){
var $last_post_modified = $('#et_pb_last_post_modified');
var last_post_modified = $last_post_modified.val();
var post_id = $('#post_ID').val();
var blog_id = typeof window.autosaveL10n !== 'undefined' && window.autosaveL10n.blog_id;
var force_check = false;
var latest_post_content;
var is_builder_used;
var hidden;
var visibilityState;
var visibilitychange;
var blurred;
var focused;
var checkFocusTimer;
var checkFocus;
var hasFocus = true;
var force_autosave = false;
var secure = ( 'https:' === window.location.protocol );
var wp_saved_cookie = wpCookies.get( 'wp-saving-post' );
var hasStorage;
var autosaving_in_progress_cookie;
var cookie_expires = 5 * 60; // 5 minutes
var is_reloading = false;
// Check if the browser supports sessionStorage and it's not disabled
var checkStorage = function() {
var test = Math.random().toString(),
result = false;
try {
window.sessionStorage.setItem( 'wp-test', test );
result = window.sessionStorage.getItem( 'wp-test' ) === test;
window.sessionStorage.removeItem( 'wp-test' );
} catch(e) {}
hasStorage = result;
return result;
};
checkStorage();
/**
* Initialize the local storage
*
* @return mixed False if no sessionStorage in the browser or an Object containing all postData for this blog
*/
var getStorage = function(key_prefix) {
var stored_obj = false;
key_prefix = key_prefix || 'wp';
// Separate local storage containers for each blog_id
if ( hasStorage && blog_id ) {
stored_obj = sessionStorage.getItem( key_prefix + '-autosave-' + blog_id );
if ( stored_obj ) {
stored_obj = JSON.parse( stored_obj );
} else {
stored_obj = {};
}
}
return stored_obj;
};
/**
* Set the storage for this blog
*
* Confirms that the data was saved successfully.
*
* @return bool
*/
var setStorage = function( stored_obj, key_prefix ) {
var key;
key_prefix = key_prefix || 'wp';
if ( hasStorage && blog_id ) {
key = key_prefix + '-autosave-' + blog_id;
sessionStorage.setItem( key, JSON.stringify( stored_obj ) );
return sessionStorage.getItem( key ) !== null;
}
return false;
};
/**
* Set (save or delete) post data in the storage.
*
* If stored_data evaluates to 'false' the storage key for the current post will be removed
*
* $param stored_data The post data to store or null/false/empty to delete the key
* @return bool
*/
var setData = function( stored_data, key_prefix ) {
var stored = getStorage(key_prefix);
if ( ! stored || ! post_id ) {
return false;
}
if ( stored_data ) {
stored[ 'post_' + post_id ] = stored_data;
} else if ( stored.hasOwnProperty( 'post_' + post_id ) ) {
delete stored[ 'post_' + post_id ];
} else {
return false;
}
return setStorage( stored, key_prefix );
};
if ( wp_saved_cookie === post_id + '-saved' ) {
// The post was saved properly, set cookie to remove old fb autosave data (if present)
// FB will pick this up and clear its autosave
wpCookies.set( 'et-saved-post-' + post_id + '-bb', 'bb', cookie_expires, et_pb_options.cookie_path, false, secure );
wpCookies.set( 'et-recommend-sync-post-' + post_id + '-bb', 'bb', 30, et_pb_options.cookie_path, false, secure );
}
wpCookies.set( 'et-editor-available-post-' + post_id + '-bb', 'bb', cookie_expires * 6, et_pb_options.cookie_path, false, secure );
function check_fb_saved() {
var fb_saved_cookie = wpCookies.get( 'et-saved-post-' + post_id + '-fb' );
if ( fb_saved_cookie ) {
// The post was saved properly in FB, set cookie to remove old fb autosave data (if present)
// FB will pick this up and clear its autosave
setData(false, 'wp');
var fb_editing_cookie = wpCookies.get( 'et-editing-post-' + post_id + '-fb' );
if ( ! fb_editing_cookie ) {
wpCookies.remove( 'et-saved-post-' + post_id + '-fb', et_pb_options.cookie_path, false, secure );
}
}
}
check_fb_saved();
is_builder_used = function(){
return $( '#et_pb_use_builder' ).val() === 'on';
};
autosaving_in_progress_cookie = function(in_progress) {
if ( in_progress ) {
wpCookies.remove( 'et-saved-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
wpCookies.set( 'et-saving-post-' + post_id + '-bb', 'bb', cookie_expires, et_pb_options.cookie_path, false, secure );
} else {
// remove "saving" and set "saved", both are looked for in FB
wpCookies.remove( 'et-saving-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
wpCookies.set( 'et-saved-post-' + post_id + '-bb', 'bb', cookie_expires, et_pb_options.cookie_path, false, secure );
}
};
// Used to check if content has changed, to be used before forcing a autosave heartbeat
var initialCompareString = _.isUndefined( wp.autosave ) ? '' : wp.autosave.getCompareString();
var lastCompareString;
var hasContentChanged = function() {
if ( _.isUndefined( wp.heartbeat ) || _.isUndefined( wp.autosave ) ) {
return false;
}
var postData = wp.autosave.getPostData('local');
var compareString = wp.autosave.getCompareString( postData );
if ( typeof lastCompareString === 'undefined' ) {
lastCompareString = initialCompareString;
}
// If the content, title and excerpt did not change since the last save, don't save again
if ( compareString === lastCompareString ) {
return false;
}
lastCompareString = compareString;
return true;
};
blurred = function(){
if ( !is_builder_used() ) {
return;
}
hasFocus = false;
var cookie = wpCookies.get( 'et-editing-post-' + post_id + '-bb' );
if ( cookie ) {
// if content has not changed, no need to force an autosave heartbeat
if ( !hasContentChanged() ) {
return false;
}
// fire after next js event loop tick, so that during reload this will not even fire
setTimeout(function(){
// this flag is set, adding redundency to preventing autosave during reload
if ( !is_reloading ) {
force_autosave = true;
autosaving_in_progress_cookie(true);
if ( ! _.isUndefined( wp.heartbeat ) && ! _.isUndefined( wp.autosave ) ) {
wp.autosave.server.triggerSave();
}
}
}, 0);
}
};
focused = function(){
if ( !is_builder_used() ) {
return false;
}
var post_id = $('#post_ID').val();
var secure = ( 'https:' === window.location.protocol );
var cookie_expires = 5 * 60; // 5 mins (in secs)
hasFocus = true;
var cookie = wpCookies.get( 'et-editing-post-' + post_id + '-fb' );
if ( !cookie ) {
return false;
}
if ( _.isUndefined( wp.heartbeat ) || _.isUndefined( wp.autosave ) ) {
return false;
}
var syncMaxChecks = 5;
var syncChecks = 0;
var syncCheck = function(){
var syncingCookieFB = wpCookies.get( 'et-syncing-post-' + post_id + '-fb' );
var syncingCookieBB = wpCookies.get( 'et-syncing-post-' + post_id + '-bb' );
var syncCheckedMax = syncChecks >= syncMaxChecks;
if ( !syncCheckedMax && ( syncingCookieFB || syncingCookieBB ) ) {
// bump loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
} else {
// remove loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
return false;
}
syncChecks++;
// check again in 1 sec (recursive)
setTimeout(syncCheck, 1000);
return true;
};
if (syncCheck()) {
return;
}
wpCookies.set( 'et-syncing-post-' + post_id + '-bb', 'bb', 30, et_pb_options.cookie_path, false, secure );
// external editor was in use!
et_builder_debug_message('external editor was in use!');
et_builder_debug_message('trigger preloader');
// add loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
// temp block autosave
wp.autosave.server.tempBlockSave();
var FBDoneFoundSavingCookie = false;
var FBDoneReCheckTimeout = 500;
var FBDoneMaxWaitTime = 15000;
var FBDoneMaxChecks = FBDoneMaxWaitTime / FBDoneReCheckTimeout;
var FBDoneChecks = 0;
var checkFBDoneAutosaving = function() {
var FBsaved = false;
// see if saved has happened
var savedCookie = wpCookies.get( 'et-saved-post-' + post_id + '-fb' );
if ( savedCookie ) {
FBsaved = true;
}
if ( FBDoneChecks > FBDoneMaxChecks ) {
FBsaved = true;
}
FBDoneChecks++;
if ( _.isUndefined( wp.heartbeat ) || _.isUndefined( wp.autosave ) ) {
return;
}
// bump temp block autosave
wp.autosave.server.tempBlockSave();
// bump loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
if ( FBsaved ) {
et_builder_debug_message('calling wp.heartbeat.connectNow()');
force_check = true;
// check if FB saved, and if it did, clear our local autosave data
check_fb_saved();
// wait .5 sec so autosave has time to settle...?
setTimeout(function(){
wp.heartbeat.connectNow();
}, 500);
// clean these up, since we have consumed them
wpCookies.remove( 'et-saving-post-' + post_id + '-fb', et_pb_options.cookie_path, false, secure );
wpCookies.remove( 'et-saved-post-' + post_id + '-fb', et_pb_options.cookie_path, false, secure );
wpCookies.remove( 'et-syncing-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
// delete the fb-editing cookie, since the baton is in BB's hand now
wpCookies.remove( 'et-editing-post-' + post_id + '-fb', et_pb_options.cookie_path, false, secure );
return true;
}
// check again in .5 sec (recursive)
setTimeout(checkFBDoneAutosaving, FBDoneReCheckTimeout);
}
// kick it off
checkFBDoneAutosaving();
};
checkFocus = function() {
if ( hasFocus && ! document.hasFocus() ) {
blurred();
} else if ( ! hasFocus && document.hasFocus() ) {
focused();
}
};
if ( typeof document.hidden !== 'undefined' ) {
hidden = 'hidden';
visibilitychange = 'visibilitychange';
visibilityState = 'visibilityState';
} else if ( typeof document.msHidden !== 'undefined' ) { // IE10
hidden = 'msHidden';
visibilitychange = 'msvisibilitychange';
visibilityState = 'msVisibilityState';
} else if ( typeof document.webkitHidden !== 'undefined' ) { // Android
hidden = 'webkitHidden';
visibilitychange = 'webkitvisibilitychange';
visibilityState = 'webkitVisibilityState';
}
window.addEventListener("beforeunload", function( event ) {
is_reloading = true;
wpCookies.remove( 'et-editing-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
wpCookies.remove( 'et-syncing-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
wpCookies.remove( 'et-saving-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
wpCookies.remove( 'et-editor-available-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
});
if ( hidden ) {
$(document).on( visibilitychange + '.fb-heartbeat', function(e) {
if ( !is_builder_used() ) {
return;
}
if ( document[visibilityState] === 'hidden' ) {
blurred();
window.clearInterval( checkFocusTimer );
} else {
focused();
if ( document.hasFocus ) {
checkFocusTimer = window.setInterval( checkFocus, 1000 );
}
}
});
}
// Use document.hasFocus() if available.
if ( document.hasFocus ) {
checkFocusTimer = window.setInterval( checkFocus, 1000 );
}
// fire it right away
focused();
// check for save from FB, even if it refreshes right after saving
setInterval( function(){
var fb_recommend_sync_cookie = wpCookies.get( 'et-recommend-sync-post-' + post_id + '-fb' );
var fb_saved_cookie = wpCookies.get( 'et-saved-post-' + post_id + '-fb' );
if ( fb_recommend_sync_cookie && fb_saved_cookie ) {
if ( ! _.isUndefined( wp.heartbeat ) ) {
wp.heartbeat.connectNow();
}
wpCookies.remove( 'et-recommend-sync-post-' + post_id + '-fb', et_pb_options.cookie_path, false, secure );
}
}, 3000 );
// send last_post_modified with the heartbeatData sent to server
// php et_pb_heartbeat_post_modified() hook is looking for this key
$(document).on('heartbeat-send.bb-heartbeat', function(event, heartbeatData ){
if ( !is_builder_used() ) {
return;
}
heartbeatData.et = {
last_post_modified: last_post_modified,
built_by: 'bb',
post_id: post_id,
force_check: force_check,
force_autosave: force_check ? false : force_autosave // if force_check, dont let it be force_autosave at same time
};
// reset force check after its used
force_check = false;
// set the autosave payload if its not there, since we are trying to force_autosave now
if ( force_autosave && 'undefined' === typeof heartbeatData.wp_autosave ) {
heartbeatData.wp_autosave = wp.autosave.getPostData();
// Overwriting autosave's post data with the newest content change
heartbeatData.wp_autosave.content = et_pb_get_content( 'content' );
heartbeatData.wp_autosave._wpnonce = $( '#_wpnonce' ).val() || '';
}
if ( typeof heartbeatData.wp_autosave === 'object' ) {
heartbeatData.wp_autosave.builder_settings = _.mapObject( _.indexBy( $( '.et_pb_page_settings input.et_pb_value_updated' ).serializeArray(), 'name' ), function( setting, name ) {
return setting.value;
} );
heartbeatData.wp_autosave.et_fb_autosave_nonce = et_pb_options.et_fb_autosave_nonce;
// Remove updated marker
$( '.et_pb_page_settings input.et_pb_value_updated' ).removeClass('et_pb_value_updated');
}
// reset this flag after its used on the autosave heartbeat
if ( force_autosave && 'undefined' !== typeof heartbeatData.wp_autosave ) {
force_autosave = false;
}
});
// check recieved heartbeat response, to see if et_pb_heartbeat_post_modified() determined
// the post has been modified externally of this editor
$(document).on('heartbeat-tick.bb-heartbeat', function(event, response ){
if ( !is_builder_used() ) {
return;
}
if ( ! _.isEmpty( response.et ) && ! _.isEmpty( response.et.builder_settings_autosave ) ) {
var is_builder_settings_popup_opened = $( '.et_pb_modal_overlay.et_pb_builder_settings' ).length;
_.each( response.et.builder_settings_autosave, function( value, name ) {
$('#_' + name).val( value );
if ( 'et_pb_section_background_color' === name ) {
et_pb_options.page_section_bg_color = value;
}
if ( 'et_pb_page_gutter_width' === name ) {
et_pb_options.page_gutter_width = value;
}
if ( 'et_pb_color_palette' === name ) {
et_pb_options.page_color_palette = value;
}
// Live refresh for currently opened builder settings
if ( is_builder_settings_popup_opened ) {
var $field = $( '.et_pb_modal_overlay.et_pb_builder_settings div[data-id="'+ name +'"]' );
var dataType = $field.attr( 'data-type');
switch( dataType ) {
case 'range':
$field.find( '.range, .et-pb-range-input' ).val( value );
break;
case 'color-alpha':
$field.find( '.input-colorpicker' ).wpColorPicker( 'color', value );
break;
case 'textarea':
$field.find( 'textarea' ).val( value );
break
case 'colorpalette':
var paletteColors = value.split('|');
$field.find( '.input-colorpalette-colorpicker' ).each(function( index, palette ) {
if ( ! _.isUndefined( paletteColors[index] ) ) {
var paletteColor = paletteColors[index];
$(palette).val( paletteColor ).wpColorPicker( 'color', paletteColor );
$field.find( '.colorpalette-item-' + ( index + 1) ).css({
'backgroundColor' : paletteColor
});
}
});
break;
case 'yes_no_button':
var $yn_wrapper = $field.find( '.et_pb_yes_no_button_wrapper' ),
$yn_button = $field.find( '.et_pb_yes_no_button' ),
$yn_select = $field.find( 'select' );
$yn_select.find('option[value="'+value+'"]').prop('selected', true);
if ( value === 'on' ) {
$yn_button.removeClass( 'et_pb_off_state' ).addClass( 'et_pb_on_state' );
} else {
$yn_button.removeClass( 'et_pb_on_state' ).addClass( 'et_pb_off_state' );
}
break;
default :
$field.find( 'input' ).val( value );
break;
}
}
} );
}
// if this was a completed autosave, update our saving/saved cookie state
if ( response.wp_autosave ) {
autosaving_in_progress_cookie(false);
}
if ( 'undefined' === typeof response.et ) {
return false;
}
if ( 'undefined' !== typeof response.et.post_modified ) {
last_post_modified = response.et.post_modified;
}
if ( 'undefined' !== typeof response.et.post_content ) {
et_builder_debug_message('ext changes occured');
latest_post_content = response.et.post_content;
// Close currently opened settings modal
var $modalSettingsContainer = $('.et_pb_modal_settings_container');
if ( $modalSettingsContainer.length && $modalSettingsContainer.attr('data-open_view') === 'module_settings' ) {
$modalSettingsContainer.find('.et-pb-modal-close').trigger('click');
}
update_builder_content();
} else {
// remove loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
}
});
var update_builder_content = function(){
$last_post_modified.val(last_post_modified);
if ( !is_builder_used() ) {
return;
}
// If this is a fresh new post/page, the first attempt will be to update with blank content from db (since its not saved yet in db)
// so this check will skip that initial attempt
if ( '' == latest_post_content ) {
return;
}
// add loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
// Set shortcode to editor
var shortcode = latest_post_content;
et_pb_set_content( 'content', shortcode, 'updating_to_latest_fb_content' );
// Rebuild the builder
setTimeout( function(){
var $builder_container = $( '#et_pb_layout' ),
builder_height = $builder_container.innerHeight();
$builder_container.css( { 'height' : builder_height } );
ET_PageBuilder_App.removeAllSections();
ET_PageBuilder_App.$el.find( '.et_pb_section' ).remove();
// Ensure that no history is added for rollback
ET_PageBuilder_App.enable_history = false;
ET_PageBuilder_App.createLayoutFromContent( et_prepare_template_content( shortcode ), '', '', { is_reinit : 'reinit' } );
// Auto turn on Split Testing if the history has Split testing data
if ( ET_PageBuilder_AB_Testing.is_active_based_on_models() ) {
ET_PageBuilder_AB_Testing.toggle_status( true );
et_reinitialize_builder_layout();
} else {
ET_PageBuilder_AB_Testing.toggle_status( false );
}
$builder_container.css( { 'height' : 'auto' } );
// remove loading state
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
// delete the editing cookie since the above doesnt count as dirty'ing the content
setTimeout(function(){
wpCookies.remove( 'et-editing-post-' + post_id + '-bb', et_pb_options.cookie_path, false, secure );
}, 500 );
}, 500 );
};
}
et_builder_check_for_frontend_builder_updates();
$( document ).on( 'tinymce-editor-init.autosave', function( event, editor ) {
if ( 'content' === editor.id ) {
$( document ).off( 'tinymce-editor-init.autosave' );
}
});
function et_prepare_template_content( content ) {
if ( -1 !== content.indexOf( '[et_pb_' ) ) {
if ( -1 === content.indexOf( 'et_pb_row' ) && -1 === content.indexOf( 'et_pb_section' ) ) {
if ( -1 === content.indexOf( 'et_pb_fullwidth' ) ) {
content = '[et_pb_section template_type="module" skip_module="true"][et_pb_row template_type="module" skip_module="true"][et_pb_column type="4_4"]' + content + '[/et_pb_column][/et_pb_row][/et_pb_section]';
} else {
content = '[et_pb_section fullwidth="on" template_type="module" skip_module="true"]' + content + '[/et_pb_section]';
}
} else if ( -1 === content.indexOf( 'et_pb_section' ) ) {
content = '[et_pb_section template_type="row" skip_module="true"]' + content + '[/et_pb_section]';
}
}
return content;
}
function generate_templates_view( include_global, is_global, layout_type, append_to, module_width, specialty_cols, selected_category, previous_result ) {
var is_global = '' === is_global ? 'not_global' : is_global;
if ( typeof $et_pb_templates_cache[layout_type + '_' + is_global + '_' + module_width + '_' + specialty_cols] !== 'undefined' ) {
var templates_collection = new ET_PageBuilder.SavedTemplates( $et_pb_templates_cache[layout_type + '_' + is_global + '_' + module_width + '_' + specialty_cols] ),
templates_view = new ET_PageBuilder.TemplatesView( { collection: templates_collection, category: selected_category } );
append_to.append( templates_view.render().el );
if ( 'include_global' === include_global && 'not_global' === is_global ) {
generate_templates_view( 'include_global', 'global', layout_type, append_to, module_width, specialty_cols, selected_category );
} else {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
append_to.prepend( et_pb_generate_layouts_filter( selected_category ) );
$( '#et_pb_select_category' ).data( 'attr', { include_global : include_global, is_global : '', layout_type : layout_type, append_to : append_to, module_width : module_width, specialty_cols : specialty_cols } );
}
} else {
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
dataType: 'json',
data:
{
action : 'et_pb_get_saved_templates',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_is_global : is_global,
et_post_type : et_pb_options.post_type,
et_layout_type : layout_type,
et_module_width : module_width,
et_specialty_columns : specialty_cols
},
beforeSend : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
},
complete : function() {
if ( 'include_global' !== include_global || ( 'include_global' === include_global && 'global' === is_global ) ) {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
append_to.prepend( et_pb_generate_layouts_filter( selected_category ) );
$( '#et_pb_select_category' ).data( 'attr', { include_global : include_global, is_global : '', layout_type : layout_type, append_to : append_to, module_width : module_width, specialty_cols : specialty_cols } );
}
},
success: function( data ) {
var request_result = '';
if ( typeof data.error !== 'undefined' ) {
//show error message only for global section or when global section wasn't included
if ( ( 'include_global' === include_global && 'global' === is_global && 'success' !== previous_result ) || 'include_global' !== include_global ) {
append_to.append( '<ul><li>' + data.error + '</li></ul>');
request_result = 'fail';
}
} else {
var templates_collection = new ET_PageBuilder.SavedTemplates( data ),
templates_view = new ET_PageBuilder.TemplatesView( { collection: templates_collection } );
$et_pb_templates_cache[layout_type + '_' + is_global + '_' + module_width + '_' + specialty_cols] = data;
append_to.append( templates_view.render().el );
request_result = 'success';
}
if ( 'include_global' === include_global && 'not_global' === is_global ) {
generate_templates_view( 'include_global', 'global', layout_type, append_to, module_width, specialty_cols, selected_category, request_result );
}
}
} );
}
}
function et_pb_generate_layouts_filter( selected_category ) {
var all_cats = $.parseJSON( et_pb_options.layout_categories ),
$cats_selector = '<select id="et_pb_select_category">',
selected_option = 'all' === selected_category || '' === selected_category ? ' selected' : '';
$cats_selector += '<option value="all"' + selected_option + '>' + et_pb_options.all_cat_text + '</option>';
if( ! $.isEmptyObject( all_cats ) ) {
$.each( all_cats, function( i, single_cat ) {
if ( ! $.isEmptyObject( single_cat ) ) {
selected_option = selected_category === single_cat.slug ? ' selected' : '';
$cats_selector += '<option value="' + single_cat.slug + '"' + selected_option + '>' + single_cat.name + '</option>';
}
});
}
$cats_selector += '</select>';
return $cats_selector;
}
// function to load saved layouts, it works differently than loading saved rows, sections and modules, so we need a separate function
function et_load_saved_layouts( layout_type, container_class, $this_el, post_type, update_cache ) {
if ( typeof $et_pb_templates_cache[layout_type + '_layouts'] !== 'undefined' && ! update_cache ) {
$this_el.find( '.et-pb-main-settings.' + container_class ).append( $et_pb_templates_cache[layout_type + '_layouts'] );
} else {
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_show_all_layouts',
et_layouts_built_for_post_type: post_type,
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_load_layouts_type : layout_type //'predefined' or not predefined
},
beforeSend : function() {
if ( ! update_cache ) {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
}
},
complete : function() {
if ( ! update_cache ) {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
}
},
success: function( data ){
if ( ! update_cache ) {
$this_el.find( '.et-pb-main-settings.' + container_class ).append( data );
}
$et_pb_templates_cache[layout_type + '_layouts'] = data;
}
} );
}
}
function et_handle_templates_switching( $clicked_button, module_type, module_width ) {
if ( ! $clicked_button.hasClass( 'et-pb-options-tabs-links-active' ) ) {
var specialty_columns = typeof $clicked_button.closest( '.et-pb-options-tabs-links' ).data( 'specialty_columns' ) !== 'undefined' ? $clicked_button.closest( '.et-pb-options-tabs-links' ).data( 'specialty_columns' ) : 0;
$( '.et-pb-options-tabs-links li' ).removeClass( 'et-pb-options-tabs-links-active' );
$clicked_button.addClass( 'et-pb-options-tabs-links-active' );
$( '.et-pb-main-settings.active-container' ).css( { 'display' : 'block', 'opacity' : 1 } ).stop( true, true ).animate( { opacity : 0 }, 300, function(){
$( this ).css( 'display', 'none' );
$( this ).removeClass( 'active-container' );
$( '.' + $clicked_button.data( 'open_tab' ) ).addClass( 'active-container' ).css( { 'display' : 'block', 'opacity' : 0 } ).stop( true, true ).animate( { opacity : 1 }, 300 );
});
if ( typeof $clicked_button.data( 'content_loaded' ) === 'undefined' && ! $clicked_button.hasClass( 'et-pb-new-module' ) && 'layout' !== module_type ) {
generate_templates_view( 'include_global', '', module_type, $( '.' + $clicked_button.data( 'open_tab' ) ), module_width, specialty_columns, 'all' );
$clicked_button.data( 'content_loaded', 'true' );
}
}
}
function et_pb_maybe_apply_wpautop_to_models( editor_mode, load ) {
if ( typeof window.switchEditors === 'undefined' ) {
return;
}
var tinymce_advanced_noautop = tinyMCEPreInit.mceInit.et_pb_content_new.tadv_noautop; // get the noautop option from tinyMCE advanced plugin
// do not apply autop, if such option is enabled in TinyMCE Advanced Plugin
if ( typeof tinymce_advanced_noautop !== 'undefined' && tinymce_advanced_noautop === true ) {
return;
}
_.each( ET_PageBuilder_App.collection.models, function( model ) {
var modules_with_child = $.parseJSON( et_pb_options.et_builder_modules_with_children );
// do not apply autop for the modules with child. Autop should be applied inside child module instead
if ( _.includes( _.keys( modules_with_child ), model.get( 'module_type' ) ) ) {
return;
}
var model_content = model.get( 'et_pb_content_new' );
if ( typeof model_content !== 'undefined' ) {
if ( editor_mode === 'tinymce' ) {
model_content = window.switchEditors.wpautop( model_content.replace( /<p> <\/p>/g, "<p>&nbsp;</p>" ) );
} else {
// do not remove <br /> tags on initial page load
if ( ! _.isUndefined( load ) && load === 'initial_load' ) {
return;
}
model_content = window.switchEditors.pre_wpautop( model_content );
}
model.set( 'et_pb_content_new', model_content, { silent : true } );
}
} );
}
function et_add_template_meta( custom_field_name, value ) {
var current_post_id = et_pb_options.template_post_id;
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_add_template_meta',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_meta_value : value,
et_custom_field : custom_field_name,
et_post_id : current_post_id
}
} );
}
function et_builder_get_global_module( view_settings ) {
var modal_view;
var shortcode_atts;
var global_module_id = view_settings.model.get( 'et_pb_global_module' );
// autop shouldn't be applied if editor is in text mode
var et_global_autop = 'html' === et_get_editor_mode() ? 'skip' : 'apply';
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
dataType: 'json',
data:
{
action : 'et_pb_get_global_module',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_global_id : global_module_id,
et_global_autop: et_global_autop
},
beforeSend : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
},
complete : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
},
success: function( data ) {
if ( data.error ) {
// if global template not found, then make module not global.
view_settings.model.unset( 'et_pb_global_module' );
view_settings.model.unset( 'et_pb_saved_tabs' );
} else {
var et_pb_shortcodes_tags = ET_PageBuilder_App.getShortCodeParentTags(),
reg_exp = window.wp.shortcode.regexp( et_pb_shortcodes_tags ),
inner_reg_exp = ET_PageBuilder_App.wp_regexp_not_global( et_pb_shortcodes_tags ),
matches = et_pb_fix_shortcodes( data.shortcode ).match( reg_exp ),
selective_sync_method = data.sync_status,
unsynced_options = 'updated' === selective_sync_method ? JSON.parse( data.excluded_options ) : [];
if ( 'updated' === selective_sync_method ) {
et_pb_all_unsynced_options[ global_module_id ] = 0 < unsynced_options.length ? unsynced_options : [];
} else {
et_pb_all_legacy_synced_options[ global_module_id ] = [];
}
_.each( matches, function ( shortcode ) {
var shortcode_element = shortcode.match( inner_reg_exp ),
shortcode_name = shortcode_element[2],
shortcode_attributes = shortcode_element[3] !== ''
? window.wp.shortcode.attrs( shortcode_element[3] )
: '',
shortcode_content = shortcode_element[5],
module_settings,
found_inner_shortcodes = typeof shortcode_content !== 'undefined' && shortcode_content !== '' && shortcode_content.match( reg_exp ),
saved_tabs = shortcode_attributes['named']['saved_tabs'] || view_settings.model.get('et_pb_saved_tabs'),
ignore_admin_label = 'updated' !== selective_sync_method && 'all' !== saved_tabs && -1 === saved_tabs.indexOf( 'general' ), // we should load Admin Label only if General tab is synced
sync_content = 'updated' === selective_sync_method ? -1 === et_pb_all_unsynced_options[ global_module_id ].indexOf( 'et_pb_content_field' ) : ( '' !== saved_tabs && ( -1 !== saved_tabs.indexOf( 'general' ) || 'all' === saved_tabs ) );
// no need to perform specific actions if module is fully global, so process it as updated module.
if ( 'all' === saved_tabs && 'updated' !== selective_sync_method ) {
et_pb_all_unsynced_options[ global_module_id ] = [];
selective_sync_method = 'updated';
}
if ( _.isObject( shortcode_attributes['named'] ) ) {
for ( var key in shortcode_attributes['named'] ) {
if ( 'template_type' !== key && ( 'admin_label' !== key || ( 'admin_label' === key && ! ignore_admin_label ) ) ) {
// skip unsynced options
if ( 'updated' === selective_sync_method && -1 !== et_pb_all_unsynced_options[ global_module_id ].indexOf( key ) ) {
continue;
}
var prefixed_key = 'admin_label' !== key ? ( 'et_pb_' + key ) : key;
if ( '' !== key ) {
view_settings.model.set( prefixed_key, shortcode_attributes['named'][key], { silent : true } );
}
// fill in array of synced legacy optoins to determine which options are not synced
if ( 'updated' !== selective_sync_method ) {
et_pb_all_legacy_synced_options[ global_module_id ].push( key );
}
}
}
}
if ( sync_content ) {
var content_storage = 'et_pb_content_new';
var et_pb_raw_shortcodes = ET_PageBuilder_App.getShortCodeRawContentTags();
// content storage name is different for raw shortcodes ( such as Code module ). Update the content storage name if needed.
if ( $.inArray( shortcode_name, et_pb_raw_shortcodes ) > -1 ) {
content_storage = 'et_pb_raw_content';
shortcode_content = _.unescape( shortcode_content );
// replace line-break placeholders with real line-breaks
shortcode_content = shortcode_content.replace( /<!-- \[et_pb_line_break_holder\] -->/g, '\n' );
}
view_settings.model.set( content_storage, shortcode_content, { silent : true } );
if ( 'updated' !== selective_sync_method ) {
et_pb_all_legacy_synced_options[ global_module_id ].push( 'et_pb_content_field' );
}
}
if ( 'updated' !== selective_sync_method ) {
view_settings.model.set( 'legacy_synced_options', et_pb_all_legacy_synced_options[ global_module_id ], { silent : true } );
}
} );
}
modal_view = new ET_PageBuilder.ModalView( view_settings );
$( 'body' ).append( modal_view.render().el );
// Emulate preview clicking if this is triggered via right click
if ( view_settings.triggered_by_right_click === true && view_settings.do_preview === true ) {
$('.et-pb-modal-preview-template').trigger( 'click' );
}
$( '.et_pb_modal_settings_container' ).addClass( 'et_pb_saved_global_modal et_pb_modal_selective_sync' );
et_pb_add_selective_sync_buttons( $( '.et_pb_modal_settings_container' ), global_module_id )
}
} );
}
function et_pb_load_global_row( post_id, module_cid, current_content ) {
if ( ! $( 'body' ).find( '.et_pb_global_loading_overlay' ).length ) {
$( 'body' ).append( '<div class="et_pb_global_loading_overlay"></div>' );
}
// autop shouldn't be applied if editor is in text mode
var et_global_autop = 'html' === et_get_editor_mode() ? 'skip' : 'apply';
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
dataType: 'json',
data:
{
action : 'et_pb_get_global_module',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_global_id : post_id,
et_global_autop : et_global_autop
},
success: function( data ){
var global_content_is_different = false;
if ( data.error ) {
// if global template not found, then make module and all child modules not global.
var this_view = ET_PageBuilder_Layout.getView( module_cid ),
$child_elements = this_view.$el.find( '[data-cid]' );
this_view.model.unset( 'et_pb_global_module' );
if ( $child_elements.length ) {
$child_elements.each( function() {
var $this_child = $( this ),
child_cid = $this_child.data( 'cid' );
if ( typeof child_cid !== 'undefined' && '' !== child_cid ) {
var child_view = ET_PageBuilder_Layout.getView( child_cid );
if ( typeof child_view !== 'undefined' ) {
child_view.model.unset( 'et_pb_global_parent' );
}
}
});
}
} else {
var processed_content = current_content.replace( / global_parent="\S+"/g, '' );
var processed_shortcode = et_pb_fix_shortcodes( data.shortcode.replace( /template_type="\S+"/, 'global_module="' + post_id + '"' ) );
// remove all the unwanted spaces and line-breaks to make sure shortcode comparison performed correctly.
processed_shortcode = processed_shortcode.replace( /]\s?\n\s?\n\s?/g, '] ' ).replace( /\s?\n\s?\n\s?\[/g, ' [' );
processed_shortcode = processed_shortcode.replace( /]\s+/g, ']' ).replace( /\s+\[/g, '[' );
processed_content = processed_content.replace( /]\s+/g, ']' ).replace( /\s+\[/g, '[' );
// remove line-breaks from the shortcode before comparison if editor is in Visual mode
if ( et_pb_is_editor_in_visual_mode( 'content' ) ) {
processed_shortcode = processed_shortcode.replace( /\r?\n|\r/g, '' );
}
// compare unescaped strings to improve the comparison accuracy
if ( _.unescape( processed_shortcode ) !== _.unescape( processed_content ) ) {
global_content_is_different = true;
// call createLayoutFromContent only if current_shortcode is different than received shortcode
ET_PageBuilder_App.createLayoutFromContent( data.shortcode, '', '', { ignore_template_tag : 'ignore_template', current_row_cid : module_cid, global_id : post_id, is_reinit : 'reinit' } );
}
}
et_pb_globals_loaded++;
//make sure all global modules have been processed and reinitialize the layout
if ( et_pb_globals_requested === et_pb_globals_loaded ) {
// Reinitialize the layout only if global module content is different than content on page.
if ( global_content_is_different ) {
// reinitialize the layout and update global template in DB to make sure all the attributes saved the same way as on the page.
et_reinitialize_builder_layout( true );
}
setTimeout( function(){
$( 'body' ).find( '.et_pb_global_loading_overlay' ).remove();
}, 650 );
}
}
} );
}
function et_pb_update_global_template( global_module_cid ) {
var global_module_view = ET_PageBuilder_Layout.getView( global_module_cid ),
post_id = global_module_view.model.get( 'et_pb_global_module' ),
layout_type = global_module_view.model.get( 'type' );
layout_type_updated = 'row_inner' === layout_type ? 'row' : layout_type,
template_shortcode = ET_PageBuilder_App.generateCompleteShortcode( global_module_cid, layout_type_updated, 'ignore_global', false, true );
unsynced_global_options = ! _.isEmpty( et_pb_all_unsynced_options[ post_id ] ) ? et_pb_all_unsynced_options[ post_id ] : [];
// do not proceed if global post ID is not defined or empty.
if ( typeof post_id === 'undefined' || '' === post_id ) {
return;
}
if ( 'row_inner' === layout_type ) {
template_shortcode = template_shortcode.replace( /et_pb_row_inner/g, 'et_pb_row' );
template_shortcode = template_shortcode.replace( /et_pb_column_inner/g, 'et_pb_column' );
}
$.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
data:
{
action : 'et_pb_update_layout',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce,
et_layout_content : template_shortcode,
et_template_post_id : post_id,
et_layout_type : layout_type,
et_unsynced_options : JSON.stringify( unsynced_global_options )
}
} );
}
function et_pb_get_global_parent_cid( module ) {
var global_holder_view = module;
var global_module_cid = '';
// check the module parents tree to find the closest global parent if exists
while ( ! _.isUndefined( global_holder_view.model.get( 'parent' ) ) && '' === global_module_cid ) {
// Refresh global holder for new loop
global_holder_view = ET_PageBuilder_Layout.getView( global_holder_view.model.get( 'parent' ) );
global_module_cid = '' === global_module_cid && ! _.isUndefined( global_holder_view.model.get( 'et_pb_global_module' ) ) ? global_holder_view.model.get( 'cid' ) : global_module_cid;
}
return global_module_cid;
}
function et_pb_open_current_tab() {
var $container = $( '.et_pb_modal_settings_container' );
// always open the first tab by default
$container.find( '.et-pb-options-tabs .et-pb-options-tab:first-child' ).css( { 'display' : 'block', opacity : 1 } );
if ( $( '.et_pb_modal_settings_container' ).hasClass( 'et_pb_hide_general_tab' ) ) {
$container.find( '.et-pb-options-tabs-links li' ).removeClass( 'et-pb-options-tabs-links-active' );
$container.find( '.et-pb-options-tabs .et-pb-options-tab' ).css( { 'display' : 'none', opacity : 0 } );
if ( $container.hasClass( 'et_pb_hide_advanced_tab' ) ) {
$container.find( '.et-pb-options-tabs-links li.et_pb_options_tab_custom_css' ).addClass( 'et-pb-options-tabs-links-active' );
$container.find( '.et-pb-options-tabs .et-pb-options-tab.et-pb-options-tab-custom_css' ).css( { 'display' : 'block', opacity : 1 } );
} else {
$container.find( '.et-pb-options-tabs-links li.et_pb_options_tab_advanced' ).addClass( 'et-pb-options-tabs-links-active' );
$container.find( '.et-pb-options-tabs .et-pb-options-tab.et-pb-options-tab-advanced' ).css( { 'display' : 'block', opacity : 1 } );
}
} else {
$container.find( '.et-pb-options-tabs .et-pb-options-tab.et-pb-options-tab-general' ).css( { 'display' : 'block', opacity : 1 } );
}
}
/**
* Check if current user has permission to lock/unlock content
*/
function et_pb_user_lock_permissions() {
var permissions = $.ajax( {
type: "POST",
url: et_pb_options.ajaxurl,
dataType: 'json',
data:
{
action : 'et_pb_current_user_can_lock',
et_admin_load_nonce : et_pb_options.et_admin_load_nonce
},
beforeSend : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:started' );
},
complete : function() {
ET_PageBuilder_Events.trigger( 'et-pb-loading:ended' );
},
} );
return permissions;
}
/**
* Check for localStorage support
*/
function et_pb_has_storage_support() {
try {
return 'localStorage' in window && window.localStorage !== null;
} catch (e) {
return false;
}
}
/**
* Check whether the Yoast SEO plugin is active
*/
function et_pb_is_yoast_seo_active() {
return ( 'object' === typeof YoastSEO && YoastSEO.hasOwnProperty( 'app' ) )
}
function et_pb_is_modal_opened() {
return 0 < $( '.et_pb_modal_overlay, .et-core-modal-overlay.et-core-active' ).length;
}
/**
* Prepare an object from hovered module for Shortcuts
*/
function et_pb_get_hovered_module_view( hoveredObject ) {
if ( _.isEmpty( hoveredObject ) || et_pb_is_modal_opened() ) {
return false;
}
var view_settings = {
model : hoveredObject.model,
view : hoveredObject.$el,
view_event : event
};
var prepared_item = new ET_PageBuilder.RightClickOptionsView( view_settings, true );
return prepared_item;
}
function et_pb_add_selective_sync_buttons( $options_container, global_id ) {
if ( $options_container.length === 0 ) {
return;
}
var $options_array = $options_container.find( '.et-pb-option' );
if ( $options_container.find( '.et-pb-option-advanced-module-settings' ).length > 0 ) {
var disabled_class = et_pb_is_option_unsynced( 'et_pb_content_field', global_id ) ? ' et_pb_global_unsynced' : '';
$options_container.find( '.et-pb-option-advanced-module-settings' ).append( '<span class="et_pb_global_sync_switcher' + disabled_class + '" data-option_name="et_pb_content_field" data-additional_options="none"></span>' );
}
if ( $options_array.length === 0 ) {
return;
}
_.each( $options_array, function( $single_option ) {
var option_name = _.includes( ['content_new', 'raw_content'], $( $single_option ).data( 'option_name' ) ) ? 'et_pb_content_field' : $( $single_option ).data( 'option_name' );
var disabled_class = et_pb_is_option_unsynced( option_name, global_id ) ? ' et_pb_global_unsynced' : '';
var additional_options = $( $single_option ).find( '.et_pb_mobile_settings_tabs' ).length !== 0 ? 'mobile' : 'none';
$( $single_option ).append( '<span class="et_pb_global_sync_switcher' + disabled_class + '" data-option_name="' + option_name + '" data-additional_options="' + additional_options + '"></span>' );
} );
}
function et_pb_is_option_unsynced( option_name, global_id ) {
var sync_method = ! _.isUndefined( et_pb_all_unsynced_options[ global_id ] ) ? 'updated' : 'legacy';
if ( 'legacy' === sync_method ) {
return ( -1 === et_pb_all_legacy_synced_options[ global_id ].indexOf( option_name ) );
} else {
return ( -1 !== et_pb_all_unsynced_options[ global_id ].indexOf( option_name ) );
}
}
function et_pb_is_featured_image_background( $preview_button ) {
var $background_container = $preview_button.closest( '.et-pb-option-container--background' ),
$background_option = $preview_button.closest('.et_pb_background-option'),
option_name = $background_option.attr( 'data-option_name' ),
module_type = $preview_button.closest( '.et_pb_module_settings' ).attr( 'data-module_type' ),
featured_placement = $background_container.closest('.et-pb-options-tabs').find('#et_pb_featured_placement').val(),
is_featured_image_background = _.contains( et_pb_options.et_builder_modules_featured_image_background, module_type ) && option_name === 'background_image' && featured_placement === 'background';
return is_featured_image_background;
}
/**
* Removes extra <p> and <br> tags from shortcode similar to et_pb_fix_shortcodes from /includes/builder/functions.php
* @return {string}
*/
function et_pb_fix_shortcodes( shortcode ) {
shortcode = shortcode.replace( /<p>\[/g, '[' );
shortcode = shortcode.replace( /\]<\/p>/g, ']' );
shortcode = shortcode.replace( /\]<br \/>/g, ']' );
shortcode = shortcode.replace( /<br \/>\n\[/g, '[' );
return shortcode;
}
/**
* Clipboard mechanism. Clipboard is only capable of handling one copied content at the onetime
* @todo add fallback support
*/
ET_PB_Clipboard = {
key : 'et_pb_clipboard_',
set : function( type, content ) {
if ( et_pb_has_storage_support() ) {
// Save the type of copied content
localStorage.setItem( this.key + 'type', LZString.compressToUTF16( type ) );
// Save the copied content
localStorage.setItem( this.key + 'content', LZString.compressToUTF16( content ) );
} else {
alert( et_pb_options.localstorage_unavailability_alert );
}
},
get : function( type ) {
if ( et_pb_has_storage_support() ) {
// Get saved type and content
var saved_type = LZString.decompressFromUTF16( localStorage.getItem( this.key + 'type' ) ),
saved_content = LZString.decompressFromUTF16( localStorage.getItem( this.key + 'content' ) );
// Check for the compatibility of saved data and paste destination
// Return value if the supplied type equal with saved value, or if the getter doesn't care about the content's type
if ( typeof type === 'undefined' || type === saved_type ) {
return saved_content;
} else {
return false;
}
} else {
alert( et_pb_options.localstorage_unavailability_alert );
}
}
};
var et_pb_reinit_layout_throttled = _.debounce( et_reinitialize_builder_layout, 2000 );
/**
* Builder hotkeys
*/
$(window).keydown( function( event ){
if ( ! et_pb_is_builder_used() ) {
return;
}
function et_pb_close_opened_modal() {
var $close_button = $( '.et-pb-modal-close' );
var $core_close_button = $('.et-core-modal-close');
if ( $close_button.length ) {
// it's possible that there are 2 Modals appear on top of each other, close the one which is on top
if ( typeof $close_button[1] !== 'undefined' ) {
$close_button[1].click();
} else {
$close_button.click();
}
}
if ($core_close_button.length) {
$core_close_button.click();
}
$( 'body' ).removeClass( 'et-core-nbfc' );
}
// Hotkeys that should work regardless current focus state
// Handle Esc and Enter only if Modal is opened
if ( et_pb_is_modal_opened() || $( '.et_pb_prompt_modal' ).is( ':visible' ) ) {
var $save_button = $( '.et-pb-modal-save' ),
$proceed_button = $( '.et_pb_prompt_proceed' ),
$builder_buttons = $( '#et_pb_main_container a, #et_pb_toggle_builder' );
switch( event.which ) {
// Enter button handling
case 13 :
// do nothing if focus is in the textarea or in the map address field so enter will work as expected
if ( $( '.et-pb-option-container textarea, #et_pb_address, #et_pb_pin_address, .et-pb-color-picker-hex-has-preview' ).is( ':focus' ) ) {
// Close currently focused colorpicker
$( '.et-pb-color-picker-hex-has-preview:focus' ).wpColorPicker( 'close' );
return;
}
//remove focus from the builder buttons to avoid unexpected behavior
$builder_buttons.blur();
if ( $save_button.length || $proceed_button.length ) {
// it's possible that proceed button displayed above the save, we need to click only proceed button in that case
if ( $proceed_button.length ) {
$proceed_button.click();
} else {
// it's possible that there are 2 Modals appear on top of each other, save the one which is on top
if ( typeof $save_button[1] !== 'undefined' ) {
$save_button[1].click();
} else {
$save_button.click();
}
}
}
break;
// Escape button handling
case 27 :
// close the modal on Esc
et_pb_close_opened_modal();
break;
}
}
if ((event.keyCode === 83 && event.metaKey && event.shiftKey && !event.altKey) || (event.keyCode === 83 && event.ctrlKey && event.shiftKey && !event.altKey)) {
// Save as draft
event.preventDefault();
et_pb_close_opened_modal();
// Triggers save by draft by triggering DOM to initiate necessary animation
$('#save-post').trigger('click');
return;
} else if ( (event.keyCode === 83 && event.metaKey && !event.altKey) || (event.keyCode === 83 && event.ctrlKey && !event.altKey) ) {
// Save / Publish
event.preventDefault();
et_pb_close_opened_modal();
// Triggers publish by triggering DOM to initiate necessary animation
jQuery('#publish').trigger('click');
return;
}
// do not override default hotkeys inside input fields
if ( typeof event.target !== 'undefined' && $( event.target ).is( 'input, textarea' ) ) {
return;
}
if ( event.keyCode === 90 && event.metaKey && event.shiftKey && ! event.altKey || event.keyCode === 90 && event.ctrlKey && event.shiftKey && ! event.altKey ) {
// Redo
event.preventDefault();
ET_PageBuilder_App.redo( event );
return false;
} else if ( event.keyCode === 90 && event.metaKey && ! event.altKey || event.keyCode === 90 && event.ctrlKey && ! event.altKey ) {
// Undo
event.preventDefault();
ET_PageBuilder_App.undo( event );
return false;
} else if ( event.keyCode === 79 ) {
// do not proceed if any modal is opened
if ( et_pb_is_modal_opened() ) {
return;
}
// Open Page Settings Modal: `o`
event.preventDefault();
if (!$('.et_pb_builder_settings').length) {
$('#et_pb_layout .et-pb-app-settings-button').trigger('click');
}
} else if (event.keyCode === 80 ) {
event.preventDefault();
// Open preview on super + `p`
if ( event.metaKey || event.ctrlKey ) {
if ( $( '.et-pb-modal-preview-template' ).length ) {
$( '.et-pb-modal-preview-template' ).trigger( 'click' );
}
return false;
}
// do not proceed if any modal is opened
if ( et_pb_is_modal_opened() ) {
return;
}
// Open Portability Tooltip: `p`
if (!$('div[data-et-core-portability]').hasClass('et-core-active')) {
$('#et_pb_layout .et-pb-app-portability-button').trigger('click');
}
} else if (event.keyCode === 72) {
// do not proceed if any modal is opened
if ( et_pb_is_modal_opened() ) {
return;
}
// Open History Modal: `h`
event.preventDefault();
$('#et_pb_layout .et-pb-layout-buttons-history').trigger('click');
} else if (event.keyCode === 9 && event.shiftKey) {
// Switch modal tabs on `Tab` key
if ( $( '.et-pb-options-tabs-links' ).length || $( '.et-pb-preview-screensize-switcher' ).length ) {
var isPreviewActive = $( '.et-pb-modal-preview-template' ).length && $( '.et-pb-modal-preview-template' ).hasClass( 'active' ) ? true : false;
var $tabsContainer = ! isPreviewActive ? $( '.et-pb-options-tabs-links' ) : $( '.et-pb-preview-screensize-switcher' );
var $tabLinks = $tabsContainer.find( 'li' );
var tabsCount = $tabLinks.length;
var nextTab = $tabLinks[0];
var counter = 0;
$tabLinks.each( function( index ) {
var activeClassHolder = isPreviewActive ? $( this ).find( 'a' ) : $( this );
var activeClass = isPreviewActive ? 'active' : 'et-pb-options-tabs-links-active';
// if we're not on the last tab
if ( activeClassHolder.hasClass( activeClass ) && index !== tabsCount - 1 ) {
nextTab = $tabLinks[ index + 1 ];
}
});
if ( $( nextTab ).length ) {
$( nextTab ).find( 'a' ).trigger( 'click' );
}
}
} else if (event.keyCode === 67 && ( event.metaKey || event.ctrlKey )) {
// Copy hovered module on super + `c`
var prepared_item = et_pb_get_hovered_module_view( et_pb_hovered_item_buffer );
if ( prepared_item ) {
// do not copy empty columns
if ( et_pb_hovered_item_buffer.$el.hasClass( 'et-pb-column' ) ) {
return;
}
prepared_item.copy( event );
}
} else if (event.keyCode === 86 && ( event.metaKey || event.ctrlKey )) {
// Paste after hovered module on super + `v`
var prepared_item = et_pb_get_hovered_module_view( et_pb_hovered_item_buffer );
if ( prepared_item ) {
var $hoveredElement = et_pb_hovered_item_buffer.$el;
if ( $hoveredElement.hasClass( 'et-pb-column' ) || ( $hoveredElement.hasClass( 'et_pb_section_fullwidth' ) && ! ET_PB_Clipboard.get( 'et_pb_clipboard_section' ) && ! $hoveredElement.find( '.et_pb_module_block' ).length ) ) {
prepared_item.pasteColumn( event );
} else {
prepared_item.pasteAfter( event );
}
}
} else if (event.keyCode === 88 && ( event.metaKey || event.ctrlKey )) {
// Cut hovered module on super + `x`
var prepared_item = et_pb_get_hovered_module_view( et_pb_hovered_item_buffer );
if ( prepared_item ) {
// do not copy empty columns
if ( et_pb_hovered_item_buffer.$el.hasClass( 'et-pb-column' ) ) {
return;
}
prepared_item.copy( event );
var $remove_button = et_pb_hovered_item_buffer.$el.hasClass( 'et_pb_module_block' ) ? et_pb_hovered_item_buffer.$el.find( '.et-pb-remove' ) : et_pb_hovered_item_buffer.$el.find( '> .et-pb-controls .et-pb-remove' );
// remove element after it was copied
if ( $remove_button.length ) {
$remove_button.trigger( 'click' );
et_pb_hovered_item_buffer = {};
et_reinitialize_builder_layout();
}
}
} else if (event.keyCode === 68 ) {
//Disable module `d`
var prepared_item = et_pb_get_hovered_module_view( et_pb_hovered_item_buffer );
if ( prepared_item ) {
// do not proceed if empty column hovered
if ( et_pb_hovered_item_buffer.$el.hasClass( 'et-pb-column' ) ) {
return;
}
var history_verb = 'disabled';
if ( typeof prepared_item.model.attributes.et_pb_disabled === 'undefined' || 'on' !== prepared_item.model.attributes.et_pb_disabled ) {
prepared_item.model.attributes.et_pb_disabled = 'on';
et_pb_hovered_item_buffer.$el.addClass( 'et_pb_disabled' );
} else {
prepared_item.model.attributes.et_pb_disabled = 'off';
et_pb_hovered_item_buffer.$el.removeClass( 'et_pb_disabled' );
history_verb = 'enabled'
}
// Update global module
prepared_item.updateGlobalModule();
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( history_verb, prepared_item.history_noun );
ET_PageBuilder_App.saveAsShortcode();
}
} else if (event.keyCode === 76 ) {
//Lock module `l`
var prepared_item = et_pb_get_hovered_module_view( et_pb_hovered_item_buffer );
if ( prepared_item ) {
// do not proceed if empty column hovered
if ( et_pb_hovered_item_buffer.$el.hasClass( 'et-pb-column' ) ) {
return;
}
if ( typeof prepared_item.model.attributes.et_pb_locked === 'undefined' || 'on' !== prepared_item.model.attributes.et_pb_locked ) {
prepared_item.lock( event );
} else {
prepared_item.unlockItem( event );
}
et_reinitialize_builder_layout();
}
} else if (event.keyCode === 83) {
event.preventDefault();
if ( ! _.isEmpty( et_pb_hovered_item_buffer ) && ! $( '.et_pb_modal_overlay' ).length ) {
// save the `s` key pressed flag
et_pb_key_pressed.s = true;
}
} else if ( ( event.keyCode === 49 || event.keyCode === 50 || event.keyCode === 51 ) && et_pb_key_pressed.s ) {
if ( $( '.et_pb_modal_overlay' ).length ) {
return;
}
var $hoveredElement = et_pb_hovered_item_buffer.$el;
var $hoveredSection = $hoveredElement.closest( '.et_pb_section' );
if ( $hoveredSection.length ) {
switch( event.keyCode ) {
case 49:
// add regular section
$hoveredSection.find( '.et-pb-section-add-main' ).trigger( 'click' );
break;
case 50:
//add specialty section
$hoveredSection.find( '.et-pb-section-add-specialty' ).trigger( 'click' );
break;
case 51:
//add fullwidth section
$hoveredSection.find( '.et-pb-section-add-fullwidth' ).trigger( 'click' );
break;
}
}
} else if (event.keyCode === 82) {
if ( ! _.isEmpty( et_pb_hovered_item_buffer ) && ! $( '.et_pb_modal_overlay' ).length ) {
// save the `r` key pressed flag
et_pb_key_pressed.r = true;
}
} else if (event.keyCode === 67 && ! event.metaKey && ! event.ctrlKey ) {
if ( ! _.isEmpty( et_pb_hovered_item_buffer ) && ! $( '.et_pb_modal_overlay' ).length ) {
// save the `c` key pressed flag
et_pb_key_pressed.c = true;
}
} else if ( ( event.keyCode === 49 || event.keyCode === 50 || event.keyCode === 51 || event.keyCode === 52 || event.keyCode === 53 || event.keyCode === 54 || event.keyCode === 55 || event.keyCode === 56 || event.keyCode === 57 || event.keyCode === 48 || event.keyCode === 189 ) && ( et_pb_key_pressed.r || et_pb_key_pressed.c ) ) {
// Add Row / Change Row Structure shortcuts
var $hoveredElement = et_pb_hovered_item_buffer.$el;
var $hoveredRow = $hoveredElement.closest( '.et_pb_row' );
if ( $hoveredRow.length ) {
var selectedLayout = '4_4';
switch( event.keyCode ) {
case 49:
selectedLayout = '4_4';
break;
case 50:
selectedLayout = '1_2,1_2';
break;
case 51:
selectedLayout = '1_3,1_3,1_3';
break;
case 52:
selectedLayout = '1_4,1_4,1_4,1_4';
break;
case 53:
selectedLayout = '2_3,1_3';
break;
case 54:
selectedLayout = '1_3,2_3';
break;
case 55:
selectedLayout = '1_4,3_4';
break;
case 56:
selectedLayout = '3_4,1_4';
break;
case 57:
selectedLayout = '1_2,1_4,1_4';
break;
case 48:
selectedLayout = '1_4,1_4,1_2';
break;
case 189:
selectedLayout = '1_4,1_2,1_4';
break;
}
var row_view = ET_PageBuilder_Layout.getView( $hoveredRow.find( '.et-pb-row-content' ).data( 'cid' ) );
if ( typeof row_view !== 'undefined' ) {
var is_structure_change = false;
var skip_column_history = false;
var row_parent = ET_PageBuilder_Layout.getView( row_view.model.attributes.parent );
if ( typeof row_parent !== 'undefined' && 'column' === row_parent.model.attributes.type ) {
var allowed_columns = 3 === row_parent.model.attributes.specialty_columns ? [ 49, 50, 51 ] : [ 49, 50 ];
// do not insert unsupported column type into the specialty section
if ( -1 === $.inArray( event.keyCode, allowed_columns ) ) {
return;
}
}
var processed_row_view = {};
if ( et_pb_key_pressed.r ) {
if ( 'on' === row_view.model.get( 'et_pb_parent_locked' ) ) {
return;
}
// Split Testing-related action
if ( ET_PageBuilder_AB_Testing.is_active() ) {
// Check for user permission and module status
if ( ! ET_PageBuilder_AB_Testing.is_user_has_permission( row_view.model.get( 'cid' ), 'add_row' ) ) {
ET_PageBuilder_AB_Testing.alert( 'has_no_permission' );
return;
}
}
// Enable history saving and set meta for history
ET_PageBuilder_App.allowHistorySaving( 'added', 'row' );
skip_column_history = true;
// creating new Row
var module_id = ET_PageBuilder_Layout.generateNewId(),
global_parent = typeof row_view.model.get( 'et_pb_global_module' ) !== 'undefined' && '' !== row_view.model.get( 'et_pb_global_module' ) ? row_view.model.get( 'et_pb_global_module' ) : '',
global_parent_cid = '' !== global_parent ? row_view.model.get( 'cid' ) : '';
row_parent.collection.add( [ {
type : 'row',
module_type : 'row',
cid : module_id,
parent : row_parent.model.get( 'cid' ),
view : row_view,
appendAfter : row_view.$el,
et_pb_global_parent : global_parent,
global_parent_cid : global_parent_cid,
admin_label : et_pb_options.noun['row']
} ] );
processed_row_view = ET_PageBuilder_Layout.getView( module_id );
} else {
// structure edit is not allowed for global Rows
if ( ( typeof row_view.model.attributes.et_pb_global_module !== 'undefined' && '' !== row_view.model.attributes.et_pb_global_module ) || ( 'row' === et_pb_options.layout_type && 'global' === et_pb_options.is_global_template ) ) {
return;
}
// changing structure of exisitng Row
processed_row_view = row_view;
is_structure_change = true;
}
var column_options = {
'layout' : selectedLayout,
'is_structure_change' : is_structure_change,
'layout_specialty' : '',
};
// reset the columns layout
ET_PageBuilder_Layout.changeColumnStructure( processed_row_view, column_options, true, skip_column_history );
}
}
} else if ( ( event.keyCode === 49 || event.keyCode === 50 || event.keyCode === 51 || event.keyCode === 52 || event.keyCode === 53 || event.keyCode === 54 || event.keyCode === 55 || event.keyCode === 56 || event.keyCode === 57 || event.keyCode === 48 || event.keyCode === 189 ) ) {
if ( ! $( 'ul.et-pb-column-layouts' ).length ) {
return;
}
var layoutsList = $( 'ul.et-pb-column-layouts li' );
var selectedLayout = 0;
switch( event.keyCode ) {
case 49:
selectedLayout = 0;
break;
case 50:
selectedLayout = 1;
break;
case 51:
selectedLayout = 2;
break;
case 52:
selectedLayout = 3;
break;
case 53:
selectedLayout = 4;
break;
case 54:
selectedLayout = 5;
break;
case 55:
selectedLayout = 6;
break;
case 56:
selectedLayout = 7;
break;
case 57:
selectedLayout = 8;
break;
case 48:
selectedLayout = 9;
break;
case 189:
selectedLayout = 10;
break;
}
if ( layoutsList.length && layoutsList[ selectedLayout ] ) {
$( layoutsList[ selectedLayout ] ).trigger( 'click' );
}
} else if (event.key === '?' || event.keyCode === 191) {
var isHelpModal = $('.et_pb_modal_settings_container').attr('data-open_view') === 'help';
// Help : `?`
if ( $('.et-pb-modal-close').length ) {
$('.et-pb-modal-close').click();
}
if (isHelpModal) {
return;
}
et_pb_close_opened_modal();
view = new ET_PageBuilder.ModalView( {
attributes : {
'data-open_view' : 'help'
},
view : this
} );
$('body').append( view.render().el );
}
});
$(window).keyup( function( event ) {
if (event.keyCode === 83) {
// reset the `s` key pressed flag
et_pb_key_pressed.s = false;
} else if ( event.keyCode === 82 ) {
// reset the `r` key pressed flag
et_pb_key_pressed.r = false;
} else if ( event.keyCode === 67 && et_pb_key_pressed.c ) {
// reset the `c` key pressed flag
et_pb_key_pressed.c = false;
et_pb_reinit_layout_throttled();
}
});
$( 'body' ).on( 'mouseover', '.et-pb-right-click-trigger-overlay, .et-pb-controls, .et_pb_module_block, .et-pb-insert-module, .et-pb-row-add', function( event ) {
var $hoveredItem = $( event.target );
var $hoveredElement = $hoveredItem.closest( '.et_pb_module_block' );
if ( ! $hoveredElement.length ) {
// if empty Column or Row hovered
if ( $hoveredItem.closest( '.et-pb-insert-module' ).length || $hoveredItem.closest( '.et-pb-row-add' ).length ) {
$hoveredElement = $hoveredItem.closest( 'div' );
if ( $hoveredItem.closest( '.et-pb-row-add' ).length ) {
$hoveredElement = $hoveredElement.find( '.et-pb-row-content' );
}
} else {
var $hoveredRightClickArea = $hoveredItem.closest( '.et-pb-right-click-trigger-overlay' ).length ? $hoveredItem.closest( '.et-pb-right-click-trigger-overlay' ) : $hoveredItem.closest( '.et-pb-controls' );
// do not proceed if no Divi Module hovered and reset hovered element
if ( ! $hoveredRightClickArea.length ) {
et_pb_hovered_item_buffer = {};
return;
}
var $hoveredRow = $hoveredRightClickArea.closest( '.et_pb_row' );
if ( $hoveredRow.length ) {
$hoveredElement = $hoveredRow.find( '.et-pb-row-content' );
} else {
var $hoveredSection = $hoveredRightClickArea.closest( '.et_pb_section' );
$hoveredElement = $hoveredSection.find( '.et-pb-section-content' );
}
}
}
if ( $hoveredElement.length ) {
var hoveredElementObject = ET_PageBuilder_Layout.getView( $hoveredElement.data( 'cid' ) );
et_pb_hovered_item_buffer = hoveredElementObject;
}
} );
// open module settings on double click
$( 'body' ).on( 'dblclick', '.et-pb-right-click-trigger-overlay, .et-pb-controls, .et_pb_module_block', function( event) {
var $clickedItem = $( event.target );
// do not proceed if clicked on buttons
if ( $clickedItem.closest( 'a' ).length ) {
return;
}
var $clickedModule = $clickedItem.closest( '.et_pb_module_block' );
if ( $clickedModule.length ) {
// Open module settings
$clickedModule.find( '.et-pb-settings' ).trigger( 'click' );
return;
}
if ( $clickedItem.closest( '.et-pb-controls' ).length ) {
// Open settings of Row or Section if clicked inside the controls panel
$clickedItem.closest( '.et-pb-controls' ).find( '.et-pb-settings' ).trigger( 'click' );
}
var $clickedRightClickArea = $clickedItem.closest( '.et-pb-right-click-trigger-overlay' );
if ( ! $clickedRightClickArea.length ) {
return;
}
var $clickedRow = $clickedRightClickArea.closest( '.et_pb_row' );
if ( $clickedRow.length ) {
// Open Row Settings
$clickedRow.find( '> .et-pb-controls .et-pb-settings' ).trigger( 'click' );
} else {
var $clickedSection = $clickedRightClickArea.closest( '.et_pb_section' );
// Open Section Settings
$clickedSection.find( '> .et-pb-controls .et-pb-settings' ).trigger( 'click' );
}
} );
/**
* Add app settings button and link it to actual settings button
* Hide settings button on Divi Library
*/
if ( et_pb_options.is_divi_library === "0" ) {
var $app_settings_button = $( '#et-builder-app-settings-button-template' ).html();
$( '#et_pb_layout' ).prepend( $app_settings_button );
$( '#et_pb_layout' ).on( 'click', '.et-pb-app-view-ab-stats-button', function(e) {
e.preventDefault();
if ( ET_PageBuilder_AB_Testing.is_selecting_subject() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_subject_first' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting_goal() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_goal_first' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting_winner() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_winner_first' );
return;
}
$( '#et_pb_layout_controls .et-pb-layout-buttons-view-ab-stats' ).trigger( 'click' );
} );
$( '#et_pb_layout' ).on( 'click', '.et-pb-app-portability-button.et-core-disabled', function(e) {
e.preventDefault();
if ( ET_PageBuilder_AB_Testing.is_selecting_subject() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_subject_first' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting_goal() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_goal_first' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting_winner() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_winner_first' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_active() ) {
ET_PageBuilder_AB_Testing.alert( 'cannot_import_export_layout_has_ab_testing' );
return;
}
} );
$( '#et_pb_layout' ).on( 'click', '.et-pb-app-settings-button', function(e) {
e.preventDefault();
if ( ET_PageBuilder_AB_Testing.is_selecting_subject() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_subject_first' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting_goal() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_goal_first' );
return;
}
if ( ET_PageBuilder_AB_Testing.is_selecting_winner() ) {
ET_PageBuilder_AB_Testing.alert( 'select_ab_testing_winner_first' );
return;
}
$( '#et_pb_layout_controls .et-pb-layout-buttons-settings' ).trigger( 'click' );
} );
}
// set the correct content for Yoast SEO plugin if it's activated
if ( et_pb_is_yoast_seo_active() ) {
var ET_PB_Yoast_Content = function() {
YoastSEO.app.registerPlugin( 'ET_PB_Yoast_Content', { status: 'ready' } );
/**
* @param modification {string} The name of the filter
* @param callable {function} The callable
* @param pluginName {string} The plugin that is registering the modification.
* @param priority {number} (optional) Used to specify the order in which the callables
* associated with a particular filter are called. Lower numbers
* correspond with earlier execution.
*/
YoastSEO.app.registerModification( 'content', this.et_pb_update_content, 'ET_PB_Yoast_Content', 5 );
}
/**
* Return the content processed by do_shortcode()
*/
ET_PB_Yoast_Content.prototype.et_pb_update_content = function( data ) {
var final_content = et_pb_processed_yoast_content || et_pb_options.yoast_content;
return final_content;
};
new ET_PB_Yoast_Content();
}
$( window ).resize( function() {
var $et_pb_prompt_modal = $('.et_pb_prompt_modal.et_pb_auto_centerize_modal');
if ( $et_pb_prompt_modal.length ) {
$et_pb_prompt_modal.removeAttr( 'style' );
window.et_pb_align_vertical_modal( $et_pb_prompt_modal, '.et_pb_prompt_buttons' );
}
} );
$(window).on( 'load', function() {
setTimeout( function() {
var $et_toggle_builder_button = $( '#et_pb_toggle_builder' );
var $et_pb_fb_cta = $( '#et_pb_fb_cta' );
$et_toggle_builder_button.addClass( 'et_pb_ready' );
if ( $et_toggle_builder_button.hasClass( 'et_pb_builder_is_used' ) ) {
$et_pb_fb_cta.addClass( 'et_pb_ready' );
}
}, 250 );
} );
$(window).on( 'mousedown', function( event ) {
var $opened_custom_menu = $( '.et-pb-settings-option-select-advanced.et_pb_menu_active' );
// close opened menu if exist
if ( $( event.target ).closest('.et-pb-settings-option-select-advanced').length < 1 && $opened_custom_menu.length > 0 ) {
et_pb_close_advanced_menu( $opened_custom_menu );
}
} );
} );
} )(jQuery);
( function($) {
window.et_builder = window.et_builder || {};
/* Override the Yoast function to fix the typing lag caused by Yoast seo plugin
* By default Yoast parses shortcodes from all the content on every keypress inside tinyMCE
* and it causes the lag during the typing if content of page is huge
* Basically just remove the following part from original function:
* e.editor.on('keydown', function() {
* that.loadShortcodes.bind( that, that.declareReloaded.bind( that ) )();
* });
*/
if ( typeof window.YoastShortcodePlugin !== 'undefined' ) {
window.YoastShortcodePlugin.prototype.bindElementEvents = function() {
var contentElement = document.getElementById( 'content' ) || false;
var that = this;
if (contentElement) {
contentElement.addEventListener( 'keydown', this.loadShortcodes.bind( this, this.declareReloaded.bind( this ) ) );
contentElement.addEventListener( 'change', this.loadShortcodes.bind( this, this.declareReloaded.bind( this ) ) );
}
if( typeof tinyMCE !== 'undefined' && typeof tinyMCE.on === 'function' ) {
tinyMCE.on( 'addEditor', function( e ) {
e.editor.on( 'change', function() {
that.loadShortcodes.bind( that, that.declareReloaded.bind( that ) )();
});
});
}
}
}
$( document ).ready( function() {
var et_builder = {},
et_builder_template_options = {
tabs: {},
padding: {},
yes_no_button: {},
multiple_buttons: {},
font_buttons: {},
text_align_buttons: {},
select: {},
font_line_styles: {},
animation_buttons: {},
user_fonts: et_pb_options.user_fonts,
font_weights: et_pb_options.supported_font_weights,
options_icons: et_pb_options.all_svg_icons,
background_tabs_nav: {},
background_gradient_buttons: {},
option_preview_buttons: {}
};
window.et_builder_template_options = et_builder_template_options;
// hook for necessary adv form field logic for tabbed posts module
function adv_setting_form_category_select_update_hidden( that ) {
$select_field = that.$el.find('#et_pb_category_id');
$hidden_name_field = that.$el.find('#et_pb_category_name');
if ( $select_field.length && $hidden_name_field.length ) {
category_name = $select_field.find('option:selected').text().trim();
$hidden_name_field.val( category_name );
$select_field.on('change', function() {
category_name = $(this).find('option:selected').text().trim();
$hidden_name_field.val( category_name );
});
}
}
ET_PageBuilder.Events.on('et-advanced-module-settings:render', adv_setting_form_category_select_update_hidden );
et_builder = {
fonts_template: function( options ) {
var template = _.template( $('#et-builder-google-fonts-options-items').html() );
template_processed = template( window.et_builder_template_options.user_fonts );
return template_processed;
},
fonts_weight_template: function( options ) {
var template = _.template( $('#et-builder-font-weight-items').html() );
template_processed = template( window.et_builder_template_options.font_weights );
return template_processed;
},
font_icon_list_template: function(){
var template = $('#et-builder-font-icon-list-items').html();
return template;
},
font_down_icon_list_template: function(){
var template = $('#et-builder-font-down-icon-list-items').html();
return template;
},
preview_tabs_output: function(){
var template = $('#et-builder-preview-icons-template').html();
return template;
},
options_tabs_output: function( options ){
var template = _.template( $('#et-builder-options-tabs-links-template').html() ),
options_filtered = {},
options_filtered_index = 1,
template_processed;
window.et_builder_template_options['tabs']['options'] = $.extend( {}, options );
template_processed = template( window.et_builder_template_options.tabs );
return template_processed;
},
mobile_tabs_output: function(){
var template = $('#et-builder-mobile-options-tabs-template').html();
return template;
},
options_template_output: function( option_type, options, data ) {
var template = _.template( $('#et-builder-' + option_type + '-option-template').html() ),
template_processed;
window.et_builder_template_options[ option_type ]['options'] = $.extend( {}, options );
if ( !_.isUndefined( data ) ) {
window.et_builder_template_options[ option_type ]['data'] = $.extend( {}, data );
}
template_processed = template( window.et_builder_template_options[ option_type ] );
return template_processed;
},
options_text_align_buttons_output: function( options, type ){
var template = _.template( $('#et-builder-text-align-buttons-option-template').html() ),
template_processed;
window.et_builder_template_options['text_align_buttons']['options'] = $.extend( {}, options );
window.et_builder_template_options['text_align_buttons']['type'] = type;
template_processed = template( window.et_builder_template_options.text_align_buttons );
return template_processed;
}
};
$.extend( window.et_builder, et_builder );
// Adjust the height of tinymce iframe when fullscreen mode enabled from the Divi builder
function et_pb_adjust_fullscreen_mode() {
var $modal_container = $( '.et_pb_modal_settings_container' );
// if fullscreen mode enabled then calculate and apply correct height
if ( $modal_container.find( 'div.mce-fullscreen' ).length ) {
setTimeout( function() {
var modal_height = $modal_container.innerHeight(),
toolbar_height = $modal_container.find( '.mce-toolbar-grp' ).innerHeight();
$modal_container.find( 'iframe' ).height( modal_height - toolbar_height );
}, 100 );
}
}
// recalculate sizes of tinymce iframe when Fullscreen button clicked
$( 'body' ).on( 'click', '.et_pb_module_settings .mce-i-fullscreen', function() {
et_pb_adjust_fullscreen_mode();
});
// recalculate sizes of tinymce iframe when window resized
$( window ).resize( function() {
et_pb_adjust_fullscreen_mode();
});
// Fixing fullscreen editor inside builder ModalView height in Firefox. Firefox is too fast in calculating modal weight
// Its height calculation ends up incorrect. Performing delayed resize trigger fixes the issue
$('body.wp-admin').on( 'click', '.et-pb-modal-container .mce-widget.mce-btn[aria-label="Fullscreen"] button', function() {
setTimeout( function() {
$(window).trigger( 'resize' );
}, 50 );
} );
});
} )(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment