6155 lines
220 KiB
JavaScript
6155 lines
220 KiB
JavaScript
/* global fusionBuilderGetContent, FusionPageBuilderApp, tinymce, fusionBuilderConfig, fusionHistoryManager, tinyMCE, unescape, fusionAllElements, FusionPageBuilderElements, confirm, fusionBuilderText, alert, FusionPageBuilderViewManager, console, fusionMultiElements, fusionBuilderStickyHeader, openShortcodeGenerator, Fuse, fusionIconSearch, awbUpdatePOPanel */
|
|
/* eslint no-bitwise: 0 */
|
|
/* eslint no-redeclare: 0 */
|
|
/* eslint no-alert: 0 */
|
|
/* eslint no-undef: 0 */
|
|
/* eslint no-mixed-operators: 0 */
|
|
/* eslint no-useless-escape: 0 */
|
|
/* eslint no-unused-vars: 0 */
|
|
/* eslint no-shadow: 0 */
|
|
/* eslint array-callback-return: 0 */
|
|
/* eslint no-throw-literal: 0 */
|
|
/* eslint max-depth: 0 */
|
|
/* eslint no-multi-assign: 0 */
|
|
/* eslint guard-for-in: 0 */
|
|
/* eslint no-native-reassign: 0 */
|
|
/* eslint no-continue: 0 */
|
|
/* eslint no-global-assign: 0 */
|
|
|
|
var FusionPageBuilder = FusionPageBuilder || {};
|
|
|
|
// Events
|
|
var FusionPageBuilderEvents = _.extend( {}, Backbone.Events );
|
|
|
|
( function( $ ) {
|
|
|
|
var FusionDelay;
|
|
|
|
$.fn.outerHTML = function() {
|
|
return ( ! this.length ) ? this : ( this[ 0 ].outerHTML || ( function( el ) {
|
|
var div = document.createElement( 'div' ),
|
|
contents;
|
|
|
|
div.appendChild( el.cloneNode( true ) );
|
|
contents = div.innerHTML;
|
|
div = null;
|
|
return contents;
|
|
}( this[ 0 ] ) ) );
|
|
};
|
|
|
|
window.fusionBuilderGetContent = function( textareaID, removeAutoP, initialLoad ) { // jshint ignore:line
|
|
|
|
var content;
|
|
|
|
if ( 'undefined' === typeof removeAutoP ) {
|
|
removeAutoP = false;
|
|
}
|
|
|
|
if ( 'undefined' === typeof initialLoad ) {
|
|
initialLoad = false;
|
|
}
|
|
|
|
if ( ! initialLoad && 'undefined' !== typeof window.tinyMCE && window.tinyMCE.get( textareaID ) && ! window.tinyMCE.get( textareaID ).isHidden() ) {
|
|
content = window.tinyMCE.get( textareaID ).getContent();
|
|
} else if ( $( '#' + textareaID ).length ) {
|
|
content = $( '#' + textareaID ).val().replace( /\r?\n/g, '\r\n' );
|
|
}
|
|
|
|
// Remove auto p tags from content.
|
|
if ( removeAutoP && 'undefined' !== typeof window.tinyMCE && 'undefined' !== typeof content ) {
|
|
content = content.replace( /<p>\[/g, '[' );
|
|
content = content.replace( /\]<\/p>/g, ']' );
|
|
}
|
|
|
|
if ( 'undefined' !== typeof content ) {
|
|
return content.trim();
|
|
}
|
|
};
|
|
|
|
// Delay
|
|
FusionDelay = ( function() {
|
|
var timer = 0;
|
|
|
|
return function( callback, ms ) {
|
|
clearTimeout( timer );
|
|
timer = setTimeout( callback, ms );
|
|
};
|
|
}() );
|
|
|
|
$( window ).on( 'load', function() {
|
|
if ( $( '#fusion_toggle_builder' ).data( 'enabled' ) ) {
|
|
$( '#fusion_toggle_builder' ).trigger( 'click' );
|
|
}
|
|
} );
|
|
|
|
$( '#publishing-action #publish' ).on( 'click', function() {
|
|
FusionPageBuilderApp.saveGlobal = false;
|
|
} );
|
|
|
|
$( window ).on( 'beforeunload', function() {
|
|
var editor = 'undefined' !== typeof tinymce && tinymce.get( 'content' );
|
|
if ( ( ( editor && ! editor.isHidden() && editor.isDirty() ) || ( wp.autosave && wp.autosave.server.postChanged() ) ) && ( true === FusionPageBuilderApp.saveGlobal && ! $( '#publish' ).hasClass( 'disable' ) ) ) {
|
|
FusionPageBuilderApp.saveGlobal = false;
|
|
return '';
|
|
}
|
|
} );
|
|
|
|
$( document ).ready( function() {
|
|
var $selectedDemo,
|
|
$useBuilderMetaField,
|
|
$toggleBuilderButton,
|
|
$builder,
|
|
$mainEditorWrapper,
|
|
$container;
|
|
|
|
// Column sizes dialog. Close on outside click.
|
|
$( document ).click( function( e ) {
|
|
if ( $( e.target ).parent( '.column-sizes' ).length || $( e.target ).hasClass( 'fusion-builder-resize-column' ) || $( e.target ).parent( '.fusion-builder-resize-column' ).length ) {
|
|
// Column sizes dialog clicked.
|
|
} else {
|
|
$( '.column-sizes' ).hide();
|
|
}
|
|
} );
|
|
|
|
// Avada Builder App View
|
|
FusionPageBuilder.AppView = window.wp.Backbone.View.extend( {
|
|
|
|
mediaImportKeys: [],
|
|
|
|
el: $( '#fusion_builder_main_container' ),
|
|
|
|
template: FusionPageBuilder.template( $( '#fusion-builder-app-template' ).html() ),
|
|
|
|
events: {
|
|
'click .fusion-builder-layout-button-save': 'saveLayout',
|
|
'click .fusion-builder-layout-button-load': 'loadLayout',
|
|
'click .fusion-builder-layout-button-delete': 'deleteLayout',
|
|
'click .fusion-builder-layout-buttons-clear': 'clearLayout',
|
|
'click .fusion-builder-demo-button-load': 'loadDemoPage',
|
|
'click .fusion-builder-layout-code-fields': 'toggleCodeFields',
|
|
'click .fusion-builder-layout-custom-css': 'customCSS',
|
|
'click .fusion-builder-template-buttons-save': 'saveTemplateDialog',
|
|
'click #fusion-builder-layouts .fusion-builder-modal-close': 'hideLibrary',
|
|
'click .fusion-builder-library-dialog': 'openLibrary',
|
|
'mouseenter .fusion-builder-layout-buttons-history': 'showHistoryDialog',
|
|
'mouseleave .fusion-builder-layout-buttons-history': 'hideHistoryDialog',
|
|
'click .fusion-builder-element-button-save': 'saveElement',
|
|
'click #fusion-load-template-dialog': 'loadPreBuiltPage',
|
|
'click #fusion-load-studio-dialog': 'loadSutdioPage',
|
|
'click .fusion-builder-layout-buttons-toggle-containers': 'toggleAllContainers',
|
|
'click .fusion-builder-global-tooltip': 'unglobalize',
|
|
'click .fusion-builder-publish-tooltip': 'publish',
|
|
'click .awb-import-options-toggle': 'toggleImportOptions',
|
|
'click .awb-import-studio-item': 'loadStudioLayout',
|
|
contextmenu: 'contextMenu'
|
|
},
|
|
|
|
initialize: function() {
|
|
|
|
this.builderActive = false;
|
|
this.pauseBuilder = false;
|
|
this.ajaxurl = fusionBuilderConfig.ajaxurl;
|
|
this.fusion_load_nonce = fusionBuilderConfig.fusion_load_nonce;
|
|
this.fusion_builder_plugin_dir = fusionBuilderConfig.fusion_builder_plugin_dir;
|
|
this.layoutIsLoading = false;
|
|
this.layoutIsSaving = false;
|
|
this.saveGlobal = false;
|
|
this.layoutIsDeleting = false;
|
|
this.parentRowId = '';
|
|
this.parentColumnId = '';
|
|
this.targetContainerCID = '';
|
|
this.activeModal = '';
|
|
this.innerColumn = '';
|
|
this.blankPage = '';
|
|
this.newLayoutLoaded = false;
|
|
this.newContainerAdded = false;
|
|
this.fullWidth = fusionBuilderConfig.full_width;
|
|
this.allContent = '';
|
|
|
|
// Shortcode Generator
|
|
this.shortcodeGenerator = '';
|
|
this.shortcodeGeneratorMultiElement = '';
|
|
this.shortcodeGeneratorMultiElementChild = '';
|
|
this.allowShortcodeGenerator = '';
|
|
this.shortcodeGeneratorActiveEditor = '';
|
|
this.shortcodeGeneratorEditorID = '';
|
|
this.manuallyAdded = false;
|
|
this.manualGenerator = false;
|
|
this.manualEditor = '';
|
|
this.fromExcerpt = false;
|
|
|
|
// Code Block encoding
|
|
this.disable_encoding = fusionBuilderConfig.disable_encoding;
|
|
this._keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
|
this.codeEditor = '';
|
|
|
|
this.MultiElementChildSettings = false;
|
|
|
|
// Listen for new elements
|
|
this.listenTo( this.collection, 'add', this.addBuilderElement );
|
|
|
|
// Convert builder layout to shortcodes
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-added', this.builderToShortcodes );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-removed', this.builderToShortcodes );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-cloned', this.builderToShortcodes );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-edited', this.builderToShortcodes );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-sorted', this.builderToShortcodes );
|
|
|
|
// Sync global layouts.
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-added', this.syncGlobalLayouts );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-cloned', this.syncGlobalLayouts );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-edited', this.syncGlobalLayouts );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-element-sorted', this.syncGlobalLayouts );
|
|
|
|
// Loader animation
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-show-loader', this.showLoader );
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-hide-loader', this.hideLoader );
|
|
|
|
// Hide library
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-hide-library', this.hideLibrary );
|
|
|
|
// Save layout template on return key
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-save-layout', this.saveLayout );
|
|
|
|
// Save history state
|
|
this.listenTo( FusionPageBuilderEvents, 'fusion-save-history-state', this.saveHistoryState );
|
|
|
|
// Toggled Containers
|
|
this.toggledContainers = true;
|
|
|
|
// for HTML decoding.
|
|
this.dummyTextArea = document.createElement( 'textarea' );
|
|
|
|
this.render();
|
|
|
|
this.codeFields();
|
|
|
|
if ( ! jQuery( 'body' ).hasClass( 'gutenberg-editor-page' ) ) {
|
|
if ( $( '#fusion_toggle_builder' ).hasClass( 'fusion_builder_is_active' ) ) {
|
|
|
|
// Create builder layout on initial load.
|
|
this.initialBuilderLayout( true );
|
|
}
|
|
|
|
// Turn on history tracking. Capture editor. Save initial history state.
|
|
fusionHistoryManager.turnOnTracking();
|
|
fusionHistoryManager.captureEditor();
|
|
fusionHistoryManager.turnOffTracking();
|
|
}
|
|
|
|
// Context menu.
|
|
this.contextMenuView = false;
|
|
this.clipboard = {};
|
|
|
|
// Dynamic Values Model.
|
|
this.dynamicValues = new FusionPageBuilder.DynamicValues();
|
|
if ( 'object' === typeof fusionDynamicData ) {
|
|
this.dynamicValues.addData( null, fusionDynamicData.dynamicOptions );
|
|
}
|
|
|
|
// Studio Model.
|
|
this.studio = new FusionPageBuilder.Studio();
|
|
|
|
// Website Model.
|
|
this.website = new FusionPageBuilder.Website();
|
|
|
|
// Simplified element map.
|
|
this.simplifiedMap = [];
|
|
|
|
// Media map.
|
|
this.mediaMap = {
|
|
images: {},
|
|
menus: {},
|
|
forms: {},
|
|
post_cards: {},
|
|
videos: {},
|
|
icons: {},
|
|
off_canvases: {}
|
|
};
|
|
|
|
// Settings to params map for form only.
|
|
if ( jQuery( '#pyre_fusion_form' ).length ) {
|
|
this.createSettingsToParams();
|
|
}
|
|
},
|
|
|
|
render: function() {
|
|
this.$el.html( this.template() );
|
|
this.sortableContainers();
|
|
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Maps settings to settingsToParams.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {void}
|
|
*/
|
|
createSettingsToParams: function() {
|
|
var self = this,
|
|
paramObj;
|
|
|
|
_.each( fusionAllElements, function( element, elementID ) {
|
|
if ( ! _.isUndefined( element.settings_to_params ) ) {
|
|
_.each( element.settings_to_params, function( param, setting ) {
|
|
param = _.isObject( param ) && ! _.isUndefined( param.param ) ? param.param : param;
|
|
|
|
// We don't have this in PO, no need to listen.
|
|
if ( jQuery( '[name="_fusion[' + setting + ']"]' ).length ) {
|
|
jQuery( '[name="_fusion[' + setting + ']"]' ).on( 'change fusion-changed', function() {
|
|
var value = jQuery( this ).val() && '' !== jQuery( this ).val() ? jQuery( this ).val() : jQuery( this ).closest( '.pyre_metabox_field' ).find( '[data-default]' ).attr( 'data-default' );
|
|
self.defaultChanged( elementID, param, value );
|
|
} );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* A PO which is used as a default has changed.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {void}
|
|
*/
|
|
defaultChanged: function( elementType, param, value ) {
|
|
var oldDefault = fusionAllElements[ elementType ].params[ param ][ 'default' ];
|
|
if ( 'object' !== typeof fusionAllElements[ elementType ] ) {
|
|
return;
|
|
}
|
|
|
|
fusionAllElements[ elementType ].params[ param ][ 'default' ] = value;
|
|
if ( 'string' === typeof fusionAllElements[ elementType ].params[ param ].description ) {
|
|
fusionAllElements[ elementType ].params[ param ].description = fusionAllElements[ elementType ].params[ param ].description.replace( '>' + oldDefault, '>' + value );
|
|
}
|
|
},
|
|
|
|
unglobalize: function( event ) {
|
|
var cid = jQuery( event.currentTarget ).data( 'cid' ),
|
|
view = FusionPageBuilderViewManager.getView( cid ),
|
|
params = view.model.get( 'params' ),
|
|
type = view.model.get( 'element_type' ),
|
|
r;
|
|
|
|
r = confirm( fusionBuilderText.are_you_sure_you_want_to_remove_global );
|
|
|
|
if ( false === r ) {
|
|
return false;
|
|
}
|
|
|
|
// Remove global attributes
|
|
delete params.fusion_global;
|
|
view.model.set( 'params', params );
|
|
view.$el.removeClass( 'fusion-global-element fusion-global-container fusion-global-column' );
|
|
jQuery( event.currentTarget ).remove();
|
|
view.$el.removeAttr( 'fusion-global-layout' );
|
|
|
|
if ( 'fusion_builder_container' === type ) {
|
|
view.$el.find( '.fusion-builder-container-content > .fusion-builder-section-content' ).removeAttr( 'fusion-global-layout' );
|
|
}
|
|
|
|
fusionHistoryManager.turnOnTracking();
|
|
fusionHistoryState = fusionBuilderText.removed_global;
|
|
FusionPageBuilderEvents.trigger( 'fusion-element-edited' );
|
|
},
|
|
|
|
publish: function( event ) {
|
|
var cid = jQuery( event.currentTarget ).data( 'cid' ),
|
|
view = FusionPageBuilderViewManager.getView( cid ),
|
|
params = view.model.get( 'params' ),
|
|
r;
|
|
|
|
r = confirm( fusionBuilderText.are_you_sure_you_want_to_publish );
|
|
|
|
if ( false === r ) {
|
|
return false;
|
|
}
|
|
|
|
params.status = 'published';
|
|
view.model.set( 'params', params );
|
|
|
|
view.updateStatusIcons();
|
|
|
|
fusionHistoryManager.turnOnTracking();
|
|
fusionHistoryState = fusionBuilderText.container_published; // jshint ignore:line
|
|
FusionPageBuilderEvents.trigger( 'fusion-element-edited' );
|
|
},
|
|
|
|
isTinyMceActive: function() {
|
|
var isActive = ( 'undefined' !== typeof tinyMCE ) && tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden();
|
|
|
|
return isActive;
|
|
},
|
|
|
|
base64Encode: function( data ) {
|
|
var b64 = this._keyStr,
|
|
o1,
|
|
o2,
|
|
o3,
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4,
|
|
bits,
|
|
i = 0,
|
|
ac = 0,
|
|
enc = '',
|
|
tmpArr = [],
|
|
r;
|
|
|
|
if ( ! data ) {
|
|
return data;
|
|
}
|
|
|
|
try {
|
|
data = unescape( encodeURIComponent( data ) );
|
|
} catch ( e ) {
|
|
data = unescape( data );
|
|
}
|
|
|
|
do {
|
|
|
|
// Pack three octets into four hexets
|
|
o1 = data.charCodeAt( i++ );
|
|
o2 = data.charCodeAt( i++ );
|
|
o3 = data.charCodeAt( i++ );
|
|
|
|
bits = o1 << 16 | o2 << 8 | o3;
|
|
|
|
h1 = bits >> 18 & 0x3f;
|
|
h2 = bits >> 12 & 0x3f;
|
|
h3 = bits >> 6 & 0x3f;
|
|
h4 = bits & 0x3f;
|
|
|
|
// Use hexets to index into b64, and append result to encoded string.
|
|
tmpArr[ ac++ ] = b64.charAt( h1 ) + b64.charAt( h2 ) + b64.charAt( h3 ) + b64.charAt( h4 );
|
|
} while ( i < data.length );
|
|
|
|
enc = tmpArr.join( '' );
|
|
r = data.length % 3;
|
|
|
|
return ( r ? enc.slice( 0, r - 3 ) : enc ) + '==='.slice( r || 3 );
|
|
},
|
|
|
|
base64Decode: function( input ) {
|
|
var output = '',
|
|
chr1,
|
|
chr2,
|
|
chr3,
|
|
enc1,
|
|
enc2,
|
|
enc3,
|
|
enc4,
|
|
i = 0;
|
|
|
|
input = input.replace( /[^A-Za-z0-9\+\/\=]/g, '' );
|
|
|
|
while ( i < input.length ) {
|
|
|
|
enc1 = this._keyStr.indexOf( input.charAt( i++ ) );
|
|
enc2 = this._keyStr.indexOf( input.charAt( i++ ) );
|
|
enc3 = this._keyStr.indexOf( input.charAt( i++ ) );
|
|
enc4 = this._keyStr.indexOf( input.charAt( i++ ) );
|
|
|
|
chr1 = ( enc1 << 2 ) | ( enc2 >> 4 );
|
|
chr2 = ( ( enc2 & 15 ) << 4 ) | ( enc3 >> 2 );
|
|
chr3 = ( ( enc3 & 3 ) << 6 ) | enc4;
|
|
|
|
output = output + String.fromCharCode( chr1 );
|
|
|
|
if ( 64 !== enc3 ) {
|
|
output = output + String.fromCharCode( chr2 );
|
|
}
|
|
if ( 64 !== enc4 ) {
|
|
output = output + String.fromCharCode( chr3 );
|
|
}
|
|
|
|
}
|
|
|
|
output = this.utf8Decode( output );
|
|
|
|
return output;
|
|
},
|
|
|
|
utf8Decode: function( utftext ) {
|
|
var string = '',
|
|
i = 0,
|
|
c = 0,
|
|
c1 = 0,
|
|
c2 = 0,
|
|
c3;
|
|
|
|
while ( i < utftext.length ) {
|
|
|
|
c = utftext.charCodeAt( i );
|
|
|
|
if ( 128 > c ) {
|
|
string += String.fromCharCode( c );
|
|
i++;
|
|
} else if ( ( 191 < c ) && ( 224 > c ) ) {
|
|
c2 = utftext.charCodeAt( i + 1 );
|
|
string += String.fromCharCode( ( ( c & 31 ) << 6 ) | ( c2 & 63 ) );
|
|
i += 2;
|
|
} else {
|
|
c2 = utftext.charCodeAt( i + 1 );
|
|
c3 = utftext.charCodeAt( i + 2 );
|
|
string += String.fromCharCode( ( ( c & 15 ) << 12 ) | ( ( c2 & 63 ) << 6 ) | ( c3 & 63 ) );
|
|
i += 3;
|
|
}
|
|
}
|
|
return string;
|
|
},
|
|
/**
|
|
* Decodes headings if encoded.
|
|
*
|
|
* @since 3.11.0
|
|
* @param {string} html - The data to decode.
|
|
* @return {string}
|
|
*/
|
|
maybeDecode: function( text ) {
|
|
if ( ! this.needsDecoding( text ) ) {
|
|
return text;
|
|
}
|
|
this.dummyTextArea.innerHTML = text;
|
|
if ( '' !== this.dummyTextArea.value ) {
|
|
return this.dummyTextArea.value;
|
|
}
|
|
return text;
|
|
},
|
|
|
|
/**
|
|
* Checks if encoded.
|
|
*
|
|
* @since 3.11.0
|
|
* @param {string} html - The data to decode.
|
|
* @return {string}
|
|
*/
|
|
needsDecoding( text ) {
|
|
const entityPattern = /&[#A-Za-z0-9]+;/;
|
|
return entityPattern.test( text );
|
|
},
|
|
fusionBuilderMCEremoveEditor: function( id ) {
|
|
if ( 'undefined' !== typeof window.tinyMCE ) {
|
|
window.tinyMCE.execCommand( 'mceRemoveEditor', false, id );
|
|
if ( 'undefined' !== typeof window.tinyMCE.get( id ) ) {
|
|
window.tinyMCE.remove( '#' + id );
|
|
}
|
|
}
|
|
},
|
|
|
|
fusion_builder_sortable: function( $element ) {
|
|
var $sortable;
|
|
$sortable = $element.find( '.fusion-sortable-options' );
|
|
|
|
$sortable.each( function() {
|
|
jQuery( this ).sortable();
|
|
jQuery( this ).on( 'sortupdate', function( event ) {
|
|
var sortContainer = jQuery( event.target ),
|
|
sortOrder = '';
|
|
|
|
sortContainer.children( '.fusion-sortable-option' ).each( function() {
|
|
sortOrder += jQuery( this ).data( 'value' ) + ',';
|
|
} );
|
|
|
|
sortOrder = sortOrder.slice( 0, -1 );
|
|
|
|
sortContainer.siblings( '.sort-order' ).val( sortOrder ).trigger( 'change' );
|
|
} );
|
|
} );
|
|
},
|
|
|
|
fusion_builder_connected_sortable: function( $element ) {
|
|
var self = this,
|
|
$sortable = $element.find( '.fusion-connected-sortable' );
|
|
|
|
$sortable.sortable( {
|
|
connectWith: '.fusion-connected-sortable',
|
|
|
|
stop: function() {
|
|
self.updateConnectedSortables( $element );
|
|
}
|
|
} ).disableSelection();
|
|
|
|
$sortable.find( 'li' ).on( 'dblclick', function() {
|
|
if ( jQuery( this ).parent().hasClass( 'fusion-connected-sortable-enabled' ) ) {
|
|
$element.find( '.fusion-connected-sortable-disabled' ).prepend( this );
|
|
} else {
|
|
$element.find( '.fusion-connected-sortable-enabled' ).append( this );
|
|
}
|
|
|
|
self.updateConnectedSortables( $element );
|
|
} );
|
|
},
|
|
|
|
updateConnectedSortables: function( $element ) {
|
|
var $enabled = $element.find( '.fusion-connected-sortable-enabled' ),
|
|
$container = $element.find( '.fusion-builder-option-container' ),
|
|
sortOrder = '';
|
|
|
|
$enabled.children( '.fusion-connected-sortable-option' ).each( function() {
|
|
sortOrder += jQuery( this ).data( 'value' ) + ',';
|
|
} );
|
|
|
|
$container.find( '.fusion-connected-sortable' ).each( function() {
|
|
if ( jQuery( this ).find( 'li' ).length ) {
|
|
jQuery( this ).removeClass( 'empty' );
|
|
} else {
|
|
jQuery( this ).addClass( 'empty' );
|
|
}
|
|
} );
|
|
|
|
sortOrder = sortOrder.slice( 0, -1 );
|
|
|
|
$container.find( '.sort-order' ).val( sortOrder ).trigger( 'change' );
|
|
},
|
|
|
|
fusion_builder_sortable_text: function( $element ) {
|
|
var $sortable;
|
|
$sortable = $element.find( '.fusion-sortable-text-options' );
|
|
|
|
$sortable.each( function() {
|
|
var $sort = jQuery( this );
|
|
|
|
$sort.sortable( {
|
|
handle: '.fusion-sortable-move'
|
|
} );
|
|
$sort.on( 'sortupdate', function( event ) {
|
|
var sortContainer = jQuery( event.target ),
|
|
sortOrder = '';
|
|
|
|
sortContainer.children( '.fusion-sortable-option' ).each( function() {
|
|
sortOrder += jQuery( this ).find( 'input' ).val() + '|';
|
|
} );
|
|
|
|
sortOrder = sortOrder.slice( 0, -1 );
|
|
|
|
sortContainer.siblings( '.sort-order' ).val( sortOrder ).trigger( 'change' );
|
|
} );
|
|
|
|
$sort.on( 'click', '.fusion-sortable-remove', function( event ) {
|
|
event.preventDefault();
|
|
|
|
jQuery( event.target ).closest( '.fusion-sortable-option' ).remove();
|
|
$sort.trigger( 'sortupdate' );
|
|
} );
|
|
|
|
$sort.on( 'change keyup', 'input', function() {
|
|
$sort.trigger( 'sortupdate' );
|
|
} );
|
|
|
|
$sort.prev( '.fusion-builder-add-sortable-child' ).on( 'click', function( event ) {
|
|
var $newItem = $sort.next( '.fusion-placeholder-example' ).clone( true );
|
|
|
|
event.preventDefault();
|
|
|
|
$newItem.removeClass( 'fusion-placeholder-example' ).removeAttr( 'style' ).appendTo( $sort );
|
|
|
|
setTimeout( function() {
|
|
$sort.find( '.fusion-sortable-option:last-child input' ).focus();
|
|
}, 100 );
|
|
|
|
$sort.trigger( 'sortupdate' );
|
|
} );
|
|
} );
|
|
},
|
|
|
|
fusion_builder_form_options: function( $element ) {
|
|
var $valuesToggle = $element.find( '#form-options-settings' ),
|
|
$optionsGrid = $element.find( '.options-grid' ),
|
|
$addBtn = $element.find( '.fusion-builder-add-sortable-child' ),
|
|
$formOptions = $optionsGrid.find( '.fusion-form-options' ),
|
|
$template = jQuery( '<li class="fusion-form-option">' + $element.find( '.fusion-form-option-template' ).html() + '</li>' ),
|
|
$values = $optionsGrid.find( '.option-values' ),
|
|
$bulkAdd = $element.find( '.bulk-add-modal' ),
|
|
allowMultiple = 'yes' === $optionsGrid.data( 'multiple' ),
|
|
updateValues;
|
|
|
|
updateValues = function() {
|
|
var options = [];
|
|
$formOptions.children( 'li' ).each( function() {
|
|
var option = [],
|
|
isChecked = jQuery( this ).find( '.fusiona-check_circle' ).length;
|
|
|
|
option.push( isChecked ? 1 : 0 );
|
|
|
|
jQuery( this ).find( 'input' ).each( function() {
|
|
option.push( this.value );
|
|
} );
|
|
|
|
options.push( option );
|
|
} );
|
|
$values.val( FusionPageBuilderApp.base64Encode( JSON.stringify( options ) ) );
|
|
};
|
|
|
|
// Init sortable
|
|
$formOptions.sortable( {
|
|
handle: '.fusion-sortable-move'
|
|
} );
|
|
|
|
// Bindings
|
|
$formOptions.on( 'sortupdate', function() {
|
|
updateValues();
|
|
} );
|
|
$formOptions.on( 'change keyup', 'input', function( event ) {
|
|
event.preventDefault();
|
|
updateValues();
|
|
} );
|
|
|
|
$valuesToggle.on( 'click', function( event ) {
|
|
$optionsGrid.toggleClass( 'show-values' );
|
|
} );
|
|
|
|
$formOptions.on( 'click', '.fusion-sortable-remove', function( event ) {
|
|
event.preventDefault();
|
|
jQuery( event.target ).closest( '.fusion-form-option' ).remove();
|
|
updateValues();
|
|
} );
|
|
|
|
$formOptions.on( 'click', '.fusion-sortable-check', function( event ) {
|
|
var $el = jQuery( this ).find( '.fusiona-check_circle_outline' ),
|
|
isChecked = $el.hasClass( 'fusiona-check_circle' );
|
|
|
|
event.preventDefault();
|
|
|
|
if ( ! allowMultiple ) {
|
|
$formOptions.find( '.fusion-sortable-check .fusiona-check_circle' ).removeClass( 'fusiona-check_circle' );
|
|
}
|
|
|
|
if ( isChecked ) {
|
|
$el.removeClass( 'fusiona-check_circle' );
|
|
} else {
|
|
$el.addClass( 'fusiona-check_circle' );
|
|
}
|
|
updateValues();
|
|
} );
|
|
|
|
$addBtn.on( 'click', function( event ) {
|
|
var $newEl = $template.clone( true );
|
|
|
|
event.preventDefault();
|
|
|
|
$formOptions.append( $newEl );
|
|
setTimeout( function () {
|
|
$newEl.find( '.form-option-label input' ).focus();
|
|
}, 100 );
|
|
} );
|
|
|
|
$bulkAdd.on( 'click', function( event ) {
|
|
var modalView;
|
|
|
|
event.preventDefault();
|
|
|
|
if ( jQuery( '.fusion-builder-settings-bulk-dialog' ).length ) {
|
|
return;
|
|
}
|
|
|
|
modalView = new FusionPageBuilder.BulkAddView( {
|
|
choices: fusionBuilderConfig.predefined_choices
|
|
} );
|
|
|
|
jQuery( modalView.render().el ).dialog( {
|
|
title: 'Bulk Add / Predefined Choices',
|
|
dialogClass: 'fusion-builder-settings-bulk-dialog',
|
|
resizable: false,
|
|
width: 500,
|
|
draggable: false,
|
|
buttons: [
|
|
{
|
|
text: 'Cancel',
|
|
click: function() {
|
|
jQuery( this ).dialog( 'close' );
|
|
}
|
|
},
|
|
{
|
|
text: 'Insert Choices',
|
|
click: function() {
|
|
var choices = modalView.getChoices(),
|
|
$newEl;
|
|
|
|
event.preventDefault();
|
|
_.each( choices, function( choice ) {
|
|
$newEl = $template.clone( true );
|
|
if ( choice.includes( '|' ) ) {
|
|
choice = choice.split( '|' );
|
|
$newEl.find( 'input.label' ).val( choice[ 0 ] );
|
|
$newEl.find( 'input.value' ).val( choice[ 1 ] );
|
|
$valuesToggle.prop( 'checked', true );
|
|
$optionsGrid.addClass( 'show-values' );
|
|
} else {
|
|
$newEl.find( 'input.label' ).val( choice );
|
|
}
|
|
$formOptions.append( $newEl );
|
|
} );
|
|
|
|
updateValues();
|
|
jQuery( this ).dialog( 'close' );
|
|
},
|
|
class: 'ui-button-blue'
|
|
}
|
|
],
|
|
open: function() {
|
|
jQuery( '.fusion-builder-modal-settings-container' ).css( 'z-index', 9998 );
|
|
},
|
|
beforeClose: function() {
|
|
jQuery( '.fusion-builder-modal-settings-container' ).css( 'z-index', 99999 );
|
|
jQuery( this ).remove();
|
|
}
|
|
|
|
} );
|
|
} );
|
|
|
|
|
|
},
|
|
|
|
fusion_builder_logics: function( $element ) {
|
|
var $optionsGrid = $element.find( '.options-grid' ),
|
|
$addBtn = $element.find( '.fusion-builder-add-sortable-child' ),
|
|
$fusionLogics = $optionsGrid.find( '.fusion-logics' ),
|
|
$template = jQuery( '<li class="fusion-logic">' + $element.find( '.fusion-logic-template' ).html() + '</li>' ),
|
|
$values = $optionsGrid.find( '.logic-values' ),
|
|
updateValues;
|
|
|
|
updateValues = function () {
|
|
var options = [];
|
|
$fusionLogics.children( 'li' ).each( function () {
|
|
var option = {},
|
|
operator = jQuery( this ).find( '.fusion-sortable-operator' ),
|
|
self = jQuery( this );
|
|
|
|
// operator.
|
|
option.operator = operator.hasClass( 'and' ) ? 'and' : 'or';
|
|
// comparison.
|
|
option.comparison = jQuery( this ).find( '.logic-comparison-selection' ).val();
|
|
// field.
|
|
option.field = jQuery( this ).find( 'select.fusion-logic-choices' ).val();
|
|
// desired value.
|
|
option.value = jQuery( this ).find( '.fusion-logic-option' ).val();
|
|
// additinals.
|
|
if ( jQuery( this ).find( '.logic-additionals' ).length ) {
|
|
option.additionals = jQuery( this ).find( '.fusion-logic-additionals-field' ).val();
|
|
}
|
|
options.push( option );
|
|
} );
|
|
$values
|
|
.val( FusionPageBuilderApp.base64Encode( JSON.stringify( options ) ) )
|
|
.trigger( 'change' );
|
|
};
|
|
|
|
// Init sortable
|
|
$fusionLogics.sortable( {
|
|
items: '.fusion-logic',
|
|
tolerance: 'pointer',
|
|
cursor: 'move',
|
|
connectWith: '.fusion-logics',
|
|
handle: '.fusion-logic-controller-head',
|
|
axis: 'y'
|
|
} );
|
|
|
|
// Bindings
|
|
$fusionLogics.on( 'sortupdate', function () {
|
|
updateValues();
|
|
} );
|
|
|
|
$fusionLogics.on( 'change keyup', 'input', function ( event ) {
|
|
event.preventDefault();
|
|
updateValues();
|
|
} );
|
|
|
|
$fusionLogics.on( 'change', 'select.fusion-logic-option', function( event ) {
|
|
event.preventDefault();
|
|
updateValues();
|
|
} );
|
|
|
|
$fusionLogics.on( 'change', 'select.fusion-logic-choices', function( event ) {
|
|
var allChoices = $fusionLogics.closest( '.fusion-builder-option-logics' ).find( '.fusion-logics-all-choices' ).text(),
|
|
selection = jQuery( this ).val(),
|
|
selectionText = jQuery( this ).closest( 'select' ).find( 'option:selected' ).text(),
|
|
$wrapper = jQuery( this ).closest( '.fusion-logic' ),
|
|
$comparisons = '',
|
|
$options = '',
|
|
isSelected,
|
|
currentChoice;
|
|
|
|
event.preventDefault();
|
|
|
|
try {
|
|
allChoices = JSON.parse( allChoices );
|
|
} catch ( e ) {
|
|
allChoices = [];
|
|
}
|
|
|
|
$wrapper.find( 'h4.logic-title' ).text( selectionText );
|
|
|
|
currentChoice = allChoices.find( ( { id } ) => id === selection );
|
|
|
|
if ( 'object' === typeof currentChoice ) {
|
|
if ( 'object' === typeof currentChoice.comparisons ) {
|
|
jQuery.each( currentChoice.comparisons, function( comparisonValue, comparisonName ) {
|
|
isSelected = 'equal' === comparisonValue ? 'active' : '';
|
|
$comparisons += '<option value="' + comparisonValue + '" ' + isSelected + '>' + comparisonName + '</select>';
|
|
} );
|
|
}
|
|
|
|
$wrapper.find( '.logic-comparison-selection' ).empty().append( $comparisons );
|
|
|
|
switch ( currentChoice.type ) {
|
|
case 'select':
|
|
if ( 'object' === typeof currentChoice.options ) {
|
|
$options += '<div class="select_arrow"></div>';
|
|
$options += '<select class="fusion-dont-update fusion-logic-option fusion-hide-from-atts fusion-select-field">';
|
|
jQuery.each( currentChoice.options, function( key, choice ) {
|
|
$options += '<option value="' + key + '">' + choice + '</option>';
|
|
} );
|
|
$options += '</select>';
|
|
}
|
|
|
|
$wrapper.find( '.logic-value-field' ).html( $options );
|
|
$wrapper.find( '.logic-value .fusion-select-field' ).select2();
|
|
break;
|
|
|
|
case 'text':
|
|
$options = '<input type="text" value="" placeholder="' + fusionBuilderText.condition_value + '" class="fusion-hide-from-atts fusion-logic-option" />';
|
|
$wrapper.find( '.logic-value-field' ).html( $options );
|
|
break;
|
|
}
|
|
|
|
$wrapper.find( '.logic-additionals' ).remove();
|
|
if ( 'undefined' !== typeof currentChoice.additionals ) {
|
|
switch ( currentChoice.additionals.type ) {
|
|
case 'select':
|
|
if ( 'object' === typeof currentChoice.additionals.options ) {
|
|
$options = '<div class="logic-additionals">';
|
|
$options += '<div class="select_arrow"></div>';
|
|
$options += '<select class="fusion-dont-update fusion-logic-additionals-field fusion-hide-from-atts fusion-select-field">';
|
|
jQuery.each( currentChoice.additionals, function( key, choice ) {
|
|
$options += '<option value="' + key + '">' + choice + '</option>';
|
|
} );
|
|
$options += '</select>';
|
|
$options += '</div>';
|
|
}
|
|
|
|
$wrapper.find( '.logic-field' ).append( $options );
|
|
$wrapper.find( '.logic-field .fusion-select-field' ).select2();
|
|
break;
|
|
|
|
case 'text':
|
|
$options = '<div class="logic-additionals">';
|
|
$options += '<input type="text" value="" placeholder="' + currentChoice.additionals.placeholder + '" class="fusion-hide-from-atts fusion-logic-additionals-field" />';
|
|
$options += '</div>';
|
|
$wrapper.find( '.logic-field' ).append( $options );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
updateValues();
|
|
} );
|
|
|
|
$fusionLogics.on( 'click', '.fusion-sortable-remove', function ( event ) {
|
|
event.preventDefault();
|
|
jQuery( event.target ).closest( '.fusion-logic' ).remove();
|
|
|
|
updateValues();
|
|
} );
|
|
|
|
$fusionLogics.on( 'click', '.fusion-sortable-edit, h4.logic-title', function( event ) {
|
|
var $parent = jQuery( this ).closest( '.fusion-logic' );
|
|
event.preventDefault();
|
|
|
|
$parent.find( '.fusion-logic-controller-content' ).slideToggle( 'fast' );
|
|
|
|
} );
|
|
|
|
$fusionLogics.on( 'click', '.logic-operator', function() {
|
|
var $el = jQuery( this ).find( '.fusion-sortable-operator' );
|
|
|
|
if ( $el.hasClass( 'and' ) ) {
|
|
$el.removeClass( 'and' ).addClass( 'or' );
|
|
$el.closest( '.fusion-logic' ).addClass( 'has-or' ).attr( 'aria-label-or', fusionBuilderText.logic_separator_text );
|
|
} else {
|
|
$el.removeClass( 'or' ).addClass( 'and' );
|
|
$el.closest( '.fusion-logic' ).removeClass( 'has-or' );
|
|
}
|
|
updateValues();
|
|
} );
|
|
|
|
$fusionLogics.on( 'change', '.logic-comparison-selection', function() {
|
|
event.preventDefault();
|
|
updateValues();
|
|
} );
|
|
|
|
$addBtn.on( 'click', function( event ) {
|
|
var $newEl = $template.clone( true );
|
|
|
|
event.preventDefault();
|
|
|
|
$fusionLogics.find( '.fusion-logic-controller-content' ).hide();
|
|
|
|
$fusionLogics.append( $newEl );
|
|
$newEl.find( '.logic-field .fusion-select-field' ).select2();
|
|
$newEl.find( 'select.fusion-logic-choices' ).trigger( 'change' );
|
|
updateValues();
|
|
} );
|
|
},
|
|
|
|
fusion_builder_iconpicker: function( value, id, container, search ) {
|
|
|
|
var output = jQuery( '.fusion-icons-rendered' ).length ? jQuery( '.fusion-icons-rendered' ).html() : '',
|
|
outputNav = jQuery( '.fusion-icon-picker-nav-rendered' ).length ? jQuery( '.fusion-icon-picker-nav-rendered' ).html() : '',
|
|
oldIconName = '',
|
|
$container = jQuery( container ),
|
|
$containerParent = $container.parent(),
|
|
valueSelector = '',
|
|
selectedSetId = '';
|
|
|
|
if ( '' !== value ) {
|
|
|
|
if ( 'fusion-prefix-' === value.substr( 0, 14 ) ) {
|
|
|
|
// Custom icon, we need to remove prefix.
|
|
value = value.replace( 'fusion-prefix-', '' );
|
|
} else {
|
|
value = value.split( ' ' );
|
|
|
|
// Legacy FontAwesome 4.x icon, so we need check if it needs to be updated.
|
|
if ( 'undefined' === typeof value[ 1 ] ) {
|
|
value[ 1 ] = 'fas';
|
|
|
|
if ( 'undefined' !== typeof window[ 'fusion-fontawesome-free-shims' ] ) {
|
|
oldIconName = value[ 0 ].substr( 3 );
|
|
|
|
jQuery.each( window[ 'fusion-fontawesome-free-shims' ], function( i, shim ) {
|
|
|
|
if ( shim[ 0 ] === oldIconName ) {
|
|
|
|
// Update icon name.
|
|
if ( null !== shim[ 2 ] ) {
|
|
value[ 0 ] = 'fa-' + shim[ 2 ];
|
|
}
|
|
|
|
// Update icon subset.
|
|
if ( null !== shim[ 1 ] ) {
|
|
value[ 1 ] = shim[ 1 ];
|
|
}
|
|
|
|
return false;
|
|
}
|
|
} );
|
|
}
|
|
|
|
// Update form field with new values.
|
|
$containerParent.find( '.fusion-iconpicker-input' ).attr( 'value', value[ 0 ] + ' ' + value[ 1 ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
// Add icon container and icon navigation.
|
|
//$container.html( output ).before( '<div class="fusion-icon-picker-nav">' + outputNav + '</div>' );
|
|
$container.html( output ).before( '<div class="fusion-icon-picker-nav-wrapper"><a href="#" class="fusion-icon-picker-nav-left fusiona-arrow-left"></a><div class="fusion-icon-picker-nav">' + outputNav + '</div><a href="#" class="fusion-icon-picker-nav-right fusiona-arrow-right"></a></div>' );
|
|
|
|
// Scroll nav div to right.
|
|
$containerParent.find( '.fusion-icon-picker-nav-wrapper > .fusion-icon-picker-nav-right' ).on( 'click', function( e ) {
|
|
e.preventDefault();
|
|
|
|
$containerParent.find( '.fusion-icon-picker-nav' ).animate( {
|
|
scrollLeft: '+=100'
|
|
}, 250 );
|
|
} );
|
|
|
|
// Scroll nav div to left.
|
|
$containerParent.find( '.fusion-icon-picker-nav-wrapper > .fusion-icon-picker-nav-left' ).on( 'click', function( e ) {
|
|
e.preventDefault();
|
|
|
|
$containerParent.find( '.fusion-icon-picker-nav' ).animate( {
|
|
scrollLeft: '-=100'
|
|
}, 250 );
|
|
} );
|
|
|
|
// Icon navigation link is clicked.
|
|
$containerParent.find( '.fusion-icon-picker-nav > a' ).on( 'click', function( e ) {
|
|
e.preventDefault();
|
|
|
|
jQuery( '.fusion-icon-picker-nav-active' ).removeClass( 'fusion-icon-picker-nav-active' );
|
|
jQuery( this ).addClass( 'fusion-icon-picker-nav-active' );
|
|
$container.find( '.fusion-icon-set' ).css( 'display', 'none' );
|
|
$container.find( jQuery( this ).attr( 'href' ) ).css( 'display', 'grid' );
|
|
} );
|
|
|
|
if ( '' !== value ) {
|
|
|
|
// FA or custom icon.
|
|
valueSelector = '.' + ( Array.isArray( value ) ? value.join( '.' ) : value );
|
|
$container.find( valueSelector ).parent().addClass( 'selected-element' ).css( 'display', 'flex' );
|
|
|
|
// Trigger click on parent nav tab item.
|
|
selectedSetId = $container.find( '.selected-element' ).closest( '.fusion-icon-set' ).prepend( $container.find( '.selected-element' ) ).attr( 'id' );
|
|
$containerParent.find( '.fusion-icon-picker-nav a[href="#' + selectedSetId + '"]' ).trigger( 'click' );
|
|
}
|
|
|
|
// Icon Search bar.
|
|
jQuery( search ).on( 'change paste keyup', function() {
|
|
var thisEl = jQuery( this );
|
|
|
|
FusionDelay( function() {
|
|
var options,
|
|
fuse,
|
|
result,
|
|
value;
|
|
|
|
if ( thisEl.val() ) {
|
|
value = thisEl.val().toLowerCase();
|
|
|
|
if ( 3 > value.length ) {
|
|
return;
|
|
}
|
|
|
|
$container.find( '.fusion-icon-set .icon_preview' ).css( 'display', 'none' );
|
|
options = {
|
|
threshold: 0.2,
|
|
location: 0,
|
|
distance: 100,
|
|
maxPatternLength: 32,
|
|
minMatchCharLength: 3,
|
|
keys: [
|
|
'name',
|
|
'keywords',
|
|
'categories'
|
|
]
|
|
};
|
|
fuse = new Fuse( fusionIconSearch, options );
|
|
result = fuse.search( value );
|
|
|
|
// Show icons.
|
|
_.each( result, function( resultIcon ) {
|
|
$container.find( '.icon_preview.' + resultIcon.name ).css( 'display', 'flex' );
|
|
} );
|
|
|
|
// Add attributes to iconset containers.
|
|
_.each( $container.find( '.fusion-icon-set' ), function( subContainer ) {
|
|
var hasSearchResults = false;
|
|
subContainer.classList.add( 'no-search-results' );
|
|
jQuery( '.icon_preview' ).each( function( index, icon ) {
|
|
if ( 'none' !== icon.style.display && subContainer.classList.contains( 'no-search-results' ) ) {
|
|
hasSearchResults = true;
|
|
}
|
|
} );
|
|
|
|
if ( ! hasSearchResults && ! subContainer.querySelector( '.no-search-results-notice' ) ) {
|
|
jQuery( subContainer ).append( '<div class="no-search-results-notice">' + fusionBuilderText.no_results_in.replace( '%s', jQuery( 'a[href="#' + subContainer.id + '"]' ).html() ) + '</div>' );
|
|
} else if ( hasSearchResults ) {
|
|
subContainer.classList.remove( 'no-search-results' );
|
|
}
|
|
} );
|
|
|
|
} else {
|
|
$container.find( '.fusion-icon-set .icon_preview' ).css( 'display', 'flex' );
|
|
_.each( $container.find( '.fusion-icon-set' ), function( subContainer ) {
|
|
subContainer.classList.remove( 'no-search-results' );
|
|
} );
|
|
}
|
|
}, 100 );
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* Trigger context menu.
|
|
*
|
|
* @since 2.0.0
|
|
* @param {Object} event - The jQuery event.
|
|
* @return {void}
|
|
*/
|
|
contextMenu: function( event ) {
|
|
var viewSettings,
|
|
view,
|
|
self = this,
|
|
$clickTarget = jQuery( event.target ),
|
|
$target = $clickTarget.closest( '[data-cid]:not(.fusion-builder-row-content)' ),
|
|
pageType = 'default',
|
|
elementType;
|
|
|
|
// Disable on blank template element.
|
|
if ( $clickTarget.hasClass( 'fusion_builder_blank_page' ) || $clickTarget.closest( '.fusion_builder_blank_page' ).length ) {
|
|
return;
|
|
}
|
|
|
|
if ( $clickTarget.data( 'cid' ) ) {
|
|
$target = $clickTarget;
|
|
}
|
|
|
|
// If targeting the container heading area.
|
|
if ( $clickTarget.hasClass( 'fusion-builder-section-header' ) || $clickTarget.closest( '.fusion-builder-section-header' ).length ) {
|
|
if ( $clickTarget.hasClass( 'fusion-builder-section-name' ) ) {
|
|
return;
|
|
}
|
|
$target = $clickTarget.closest( '.fusion_builder_container' ).find( '.fusion-builder-section-content' ).first();
|
|
}
|
|
|
|
// Remove any existing.
|
|
this.removeContextMenu();
|
|
|
|
event.preventDefault();
|
|
|
|
view = FusionPageBuilderViewManager.getView( $target.data( 'cid' ) );
|
|
|
|
if ( ! view ) {
|
|
return;
|
|
}
|
|
|
|
elementType = this.getElementType( view.model.attributes.element_type );
|
|
|
|
// Make sure library view has limited abilities.
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! $clickTarget.closest( '.fusion-builder-row-container-inner' ).length && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) {
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-sections' ) ) {
|
|
pageType = 'container';
|
|
}
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-columns' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' ) ) {
|
|
pageType = 'column';
|
|
if ( 'fusion_builder_container' === elementType ) {
|
|
return;
|
|
}
|
|
}
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-elements' ) ) {
|
|
pageType = 'element';
|
|
if ( 'fusion_builder_container' === elementType || 'fusion_builder_column' === elementType || 'fusion_builder_column_inner' === elementType ) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! view ) {
|
|
return;
|
|
}
|
|
|
|
viewSettings = {
|
|
model: {
|
|
parent: view.model,
|
|
event: event,
|
|
parentView: view,
|
|
pageType: pageType
|
|
}
|
|
};
|
|
|
|
// Create new context view.
|
|
this.contextMenuView = new FusionPageBuilder.ContextMenuView( viewSettings );
|
|
|
|
// Add context menu to builder.
|
|
this.$el.append( this.contextMenuView.render().el );
|
|
|
|
// Add listener to remove.
|
|
this.$el.one( 'click', function() {
|
|
self.removeContextMenu();
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* Remove any contextMenu.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {void}
|
|
*/
|
|
removeContextMenu: function() {
|
|
if ( this.contextMenuView && 'function' === typeof this.contextMenuView.removeMenu ) {
|
|
this.contextMenuView.removeMenu();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Get element type, split up element.
|
|
*
|
|
* @since 2.0.0
|
|
* @param {string} elementType - The element type/name.
|
|
* @return {void}
|
|
*/
|
|
getElementType: function( elementType ) {
|
|
var childElements;
|
|
|
|
if ( 'fusion_builder_container' === elementType || 'fusion_builder_column' === elementType || 'fusion_builder_column_inner' === elementType ) {
|
|
return elementType;
|
|
}
|
|
|
|
// First check if its a parent.
|
|
if ( elementType in fusionMultiElements ) {
|
|
return 'parent_element';
|
|
}
|
|
|
|
// Check if its a child.
|
|
childElements = _.values( fusionMultiElements );
|
|
if ( -1 !== childElements.indexOf( elementType ) ) {
|
|
return 'child_element';
|
|
}
|
|
|
|
if ( 'fusion_builder_row_inner' === elementType && FusionPageBuilderApp.pauseBuilder ) {
|
|
return 'fusion_builder_row_inner';
|
|
}
|
|
|
|
// Made it this far it must be regular.
|
|
return 'element';
|
|
},
|
|
|
|
fusionBuilderImagePreview: function( $uploadButton ) {
|
|
var $uploadField = $uploadButton.siblings( '.fusion-builder-upload-field' ),
|
|
$preview = $uploadField.siblings( '.fusion-builder-upload-preview' ),
|
|
$removeBtn = $uploadButton.siblings( '.upload-image-remove' ),
|
|
imageURL = $uploadField.val().trim(),
|
|
imagePreview,
|
|
imageIDField;
|
|
|
|
FusionPageBuilderEvents.trigger( 'awb-image-upload-url-' + $uploadButton.data( 'param' ), imageURL );
|
|
|
|
if ( 0 <= imageURL.indexOf( '<img' ) ) {
|
|
imagePreview = imageURL;
|
|
} else {
|
|
imagePreview = '<img src="' + imageURL + '" />';
|
|
}
|
|
|
|
if ( 'image' !== $uploadButton.data( 'type' ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( $uploadButton.hasClass( 'hide-edit-buttons' ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( '' === imageURL ) {
|
|
if ( $preview.length ) {
|
|
$preview.remove();
|
|
$removeBtn.remove();
|
|
$uploadButton.val( 'Upload Image' );
|
|
}
|
|
|
|
// Remove image ID if image preview is empty.
|
|
imageIDField = $uploadButton.closest( '.fusion-builder-module-settings' ).find( '#' + $uploadButton.data( 'param' ) + '_id' );
|
|
|
|
if ( 'element_content' === $uploadButton.data( 'param' ) ) {
|
|
imageIDField = $uploadButton.parents( '.fusion-builder-option' ).next().find( '#image_id' );
|
|
}
|
|
|
|
if ( imageIDField.length ) {
|
|
imageIDField.val( '' );
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if ( ! $preview.length ) {
|
|
$uploadButton.siblings( '.preview' ).before( '<div class="fusion-builder-upload-preview"><strong class="fusion-builder-upload-preview-title">Preview</strong><div class="fusion-builder-preview-image"><img src="" width="300" height="300" /></div></div>' );
|
|
$uploadButton.after( '<input type="button" class="button upload-image-remove" value="Remove" />' );
|
|
$uploadButton.val( 'Edit' );
|
|
$preview = $uploadField.siblings( '.fusion-builder-upload-preview' );
|
|
|
|
}
|
|
|
|
$preview.find( 'img' ).replaceWith( imagePreview );
|
|
},
|
|
|
|
FusionBuilderActivateUpload: function( $uploadButton ) {
|
|
$uploadButton.click( function( event ) {
|
|
|
|
var $thisEl,
|
|
fileFrame,
|
|
multiImageContainer,
|
|
multiImageInput,
|
|
multiVal,
|
|
multiUpload = false,
|
|
multiImages = false,
|
|
multiImageHtml = '',
|
|
ids = '',
|
|
optionID = '',
|
|
attachment = '',
|
|
attachments = [],
|
|
elementType = $( this ).closest( '.fusion_builder_module_settings' ).data( 'element_type' ),
|
|
param = $( this ).closest( '.fusion-builder-option' ).data( 'option-id' );
|
|
|
|
const saveType = jQuery( this ).data( 'save-type' );
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
$thisEl = $( this );
|
|
|
|
// If its a multi upload element, clone default params.
|
|
if ( 'fusion-multiple-upload' === $thisEl.data( 'id' ) ) {
|
|
multiUpload = true;
|
|
}
|
|
|
|
if ( 'fusion-multiple-images' === $thisEl.data( 'id' ) ) {
|
|
multiImages = true;
|
|
multiImageContainer = jQuery( $thisEl.next( '.fusion-multiple-image-container' ) )[ 0 ];
|
|
multiImageInput = jQuery( $thisEl ).prev( '.fusion-multi-image-input' );
|
|
}
|
|
|
|
fileFrame = wp.media( {
|
|
library: {
|
|
type: $thisEl.data( 'type' )
|
|
},
|
|
title: $thisEl.data( 'title' ),
|
|
multiple: ( multiUpload || multiImages ) ? 'between' : false,
|
|
frame: 'post',
|
|
className: 'media-frame mode-select fusion-builder-media-dialog ' + $thisEl.data( 'id' ),
|
|
displayUserSettings: false,
|
|
displaySettings: true,
|
|
allowLocalEdits: true
|
|
} );
|
|
wp.media.frames.file_frame = fileFrame;
|
|
|
|
// Set the media dialog box state as 'gallery' if the element is gallery.
|
|
if ( multiImages && 'fusion_gallery' === elementType ) {
|
|
multiVal = multiImageInput.val();
|
|
ids = 'string' === typeof multiVal ? multiVal.split( ',' ) : '';
|
|
attachments = [];
|
|
attachment = '';
|
|
|
|
wp.media._galleryDefaults.link = 'none';
|
|
wp.media._galleryDefaults.size = 'thumbnail';
|
|
fileFrame.options.syncSelection = true;
|
|
|
|
if ( 'undefined' !== typeof multiVal && '' !== multiVal ) {
|
|
fileFrame.options.state = 'gallery-edit';
|
|
} else {
|
|
fileFrame.options.state = 'gallery';
|
|
}
|
|
}
|
|
|
|
// Select currently active image automatically.
|
|
fileFrame.on( 'open', function() {
|
|
var selection = fileFrame.state().get( 'selection' ),
|
|
library = fileFrame.state().get( 'library' ),
|
|
attachment,
|
|
id,
|
|
fetchIds = [];
|
|
|
|
if ( multiImages ) {
|
|
multiVal = multiImageInput.val();
|
|
ids = 'string' === typeof multiVal ? multiVal.split( ',' ) : '';
|
|
|
|
if ( 'fusion_gallery' !== elementType || 'gallery-edit' !== fileFrame.options.state ) {
|
|
$( '.fusion-builder-media-dialog' ).addClass( 'hide-menu' );
|
|
}
|
|
|
|
jQuery.each( ids, function( index, id ) {
|
|
if ( '' !== id && 'NaN' !== id ) {
|
|
|
|
// Check if attachment exists.
|
|
if ( 'undefined' !== typeof wp.media.attachment( id ).get( 'url' ) ) {
|
|
|
|
// Exists, add it to selection.
|
|
selection.add( wp.media.attachment( id ) );
|
|
library.add( wp.media.attachment( id ) );
|
|
|
|
} else {
|
|
|
|
// Doesn't exist we need to fetch.
|
|
fetchIds.push( id );
|
|
}
|
|
}
|
|
} );
|
|
|
|
// If still some attachments needing fetched, fetch them in a single query.
|
|
if ( 0 < fetchIds.length ) {
|
|
wp.media.query( { post__in: fetchIds, posts_per_page: fetchIds.length } ).more().then( function() {
|
|
jQuery.each( ids, function( index, id ) {
|
|
if ( '' !== id && 'NaN' !== id ) {
|
|
|
|
// Add fetched attachment to selection.
|
|
selection.add( wp.media.attachment( id ) );
|
|
library.add( wp.media.attachment( id ) );
|
|
}
|
|
} );
|
|
} );
|
|
}
|
|
} else {
|
|
optionID = $thisEl.parents( '.fusion-builder-option.upload' ).data( 'option-id' );
|
|
|
|
id = $thisEl.parents( '.fusion-builder-module-settings' ).find( '#' + optionID + '_id' ).val();
|
|
id = ( 'undefined' !== typeof id ? id : $thisEl.parents( '.fusion-builder-module-settings' ).find( '#image_id' ).val() );
|
|
|
|
if ( 'undefined' !== typeof id && '' !== id ) {
|
|
id = id.split( '|' )[ 0 ];
|
|
}
|
|
|
|
attachment = wp.media.attachment( id );
|
|
|
|
$( '.fusion-builder-media-dialog' ).addClass( 'hide-menu' );
|
|
if ( id ) {
|
|
attachment.fetch( {
|
|
success: function( att ) {
|
|
library.add( att ? [ att ] : [] );
|
|
selection.add( att ? [ att ] : [] );
|
|
}
|
|
} );
|
|
}
|
|
}
|
|
} );
|
|
|
|
// Set the attachment ids from gallery selection if the element is gallery.
|
|
if ( multiImages && 'fusion_gallery' === elementType ) {
|
|
fileFrame.on( 'update', function( selection ) {
|
|
var imageIDs = '',
|
|
imageURL = '';
|
|
|
|
imageIDs = selection.map( function( attachment ) {
|
|
var imageID = attachment.id;
|
|
|
|
if ( attachment.attributes.sizes && 'undefined' !== typeof attachment.attributes.sizes.thumbnail ) {
|
|
imageURL = attachment.attributes.sizes.thumbnail.url;
|
|
} else if ( attachment.attributes.url ) {
|
|
imageURL = attachment.attributes.url;
|
|
}
|
|
|
|
if ( multiImages ) {
|
|
multiImageHtml += '<div class="fusion-multi-image" data-image-id="' + imageID + '">';
|
|
multiImageHtml += '<img src="' + imageURL + '"/>';
|
|
multiImageHtml += '<span class="fusion-multi-image-remove dashicons dashicons-no-alt"></span>';
|
|
multiImageHtml += '</div>';
|
|
}
|
|
return attachment.id;
|
|
} );
|
|
|
|
multiImageInput.val( imageIDs );
|
|
jQuery( multiImageContainer ).html( multiImageHtml );
|
|
} );
|
|
}
|
|
|
|
fileFrame.on( 'select insert', function() {
|
|
|
|
var imageURL,
|
|
imageID,
|
|
imageSize,
|
|
imageIDs,
|
|
state = fileFrame.state(),
|
|
firstElementNode,
|
|
firstElement,
|
|
imageIDField;
|
|
|
|
if ( 'undefined' === typeof state.get( 'selection' ) ) {
|
|
imageURL = jQuery( fileFrame.$el ).find( '#embed-url-field' ).val();
|
|
} else {
|
|
|
|
imageIDs = state.get( 'selection' ).map( function( attachment ) {
|
|
return attachment.id;
|
|
} );
|
|
|
|
const imageURLs = [];
|
|
state.get( 'selection' ).forEach( ( media ) => {
|
|
imageURLs.push( `${media.toJSON().url}|${media.id}` );
|
|
} );
|
|
|
|
// If its a multi image element, add the images container and IDs to input field.
|
|
if ( multiImages ) {
|
|
if ( 'url' === saveType ) {
|
|
multiImageInput.val( imageURLs.join( ',' ) ).trigger( 'change' );
|
|
} else {
|
|
multiImageInput.val( imageIDs ).trigger( 'change' );
|
|
}
|
|
}
|
|
|
|
// Remove default item.
|
|
if ( multiUpload ) {
|
|
firstElementNode = jQuery( $thisEl ).parents( '.fusion-builder-main-settings' ).find( '.fusion-builder-sortable-options li:first-child' );
|
|
if ( firstElementNode.length ) {
|
|
firstElement = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === firstElementNode.data( 'cid' );
|
|
} );
|
|
if ( firstElement && ( 'undefined' === typeof firstElement.attributes.params.image || '' === firstElement.attributes.params.image ) ) {
|
|
jQuery( $thisEl ).parents( '.fusion-builder-main-settings' ).find( '.fusion-builder-sortable-options li:first-child .fusion-builder-multi-setting-remove' ).trigger( 'click' );
|
|
}
|
|
}
|
|
}
|
|
|
|
state.get( 'selection' ).map( function( attachment ) {
|
|
var element = attachment.toJSON(),
|
|
display = state.display( attachment ).toJSON(),
|
|
defaultParams = {},
|
|
child,
|
|
params,
|
|
createChildren;
|
|
|
|
imageID = element.id;
|
|
imageSize = display.size;
|
|
if ( element.sizes && element.sizes[ display.size ] && element.sizes[ display.size ].url ) {
|
|
imageURL = element.sizes[ display.size ].url;
|
|
} else if ( element.url ) {
|
|
imageURL = element.url;
|
|
}
|
|
|
|
if ( multiImages ) {
|
|
multiImageHtml += '<div class="fusion-multi-image" data-image-id="' + imageID + '">';
|
|
multiImageHtml += '<img src="' + imageURL + '"/>';
|
|
multiImageHtml += '<span class="fusion-multi-image-remove dashicons dashicons-no-alt"></span>';
|
|
multiImageHtml += '</div>';
|
|
}
|
|
|
|
// If its a multi upload element, add the image to defaults and trigger a new item to be added.
|
|
if ( multiUpload ) {
|
|
child = fusionAllElements[ elementType ].element_child;
|
|
params = fusionAllElements[ elementType ].params[ param ].child_params;
|
|
createChildren = 'undefined' !== typeof fusionAllElements[ elementType ].params[ param ].create_children ? fusionAllElements[ elementType ].params[ param ].create_children : true;
|
|
|
|
// Save default values
|
|
_.each( params, function( name, param ) {
|
|
defaultParams[ param ] = fusionAllElements[ child ].params[ param ].value;
|
|
} );
|
|
|
|
// Set new default values
|
|
_.each( params, function( name, param ) {
|
|
fusionAllElements[ child ].params[ param ].value = attachment.attributes[ name ];
|
|
} );
|
|
|
|
if ( 'image' === param ) {
|
|
fusionAllElements[ elementType ].params[ param + '_id' ].value = imageID + '|' + imageSize;
|
|
}
|
|
|
|
if ( createChildren ) {
|
|
|
|
jQuery( $thisEl ).parents( '.fusion-builder-main-settings' ).find( '.fusion-builder-add-multi-child' ).trigger( 'click' );
|
|
FusionPageBuilderEvents.trigger( 'fusion-multi-child-update-preview' );
|
|
}
|
|
|
|
// Restore default values
|
|
_.each( defaultParams, function( defaultValue, param ) {
|
|
fusionAllElements[ child ].params[ param ].value = defaultValue;
|
|
} );
|
|
}
|
|
} );
|
|
}
|
|
|
|
jQuery( multiImageContainer ).html( multiImageHtml );
|
|
if ( ! multiUpload && ! multiImages ) {
|
|
$thisEl.siblings( '.fusion-builder-upload-field' ).val( imageURL ).trigger( 'change' );
|
|
|
|
// Set image id.
|
|
imageIDField = $thisEl.closest( '.fusion-builder-module-settings' ).find( '#' + param + '_id' );
|
|
|
|
if ( 'element_content' === param ) {
|
|
imageIDField = $thisEl.parents( '.fusion-builder-option' ).next().find( '#image_id' );
|
|
}
|
|
|
|
if ( imageIDField.length ) {
|
|
imageIDField.val( imageID + '|' + imageSize );
|
|
}
|
|
|
|
FusionPageBuilderApp.fusionBuilderImagePreview( $thisEl );
|
|
}
|
|
} );
|
|
|
|
fileFrame.open();
|
|
|
|
return false;
|
|
} );
|
|
|
|
$uploadButton.siblings( '.fusion-builder-upload-field' ).on( 'input', function() {
|
|
FusionPageBuilderApp.fusionBuilderImagePreview( $( this ).siblings( '.fusion-builder-upload-button' ) );
|
|
} );
|
|
|
|
$uploadButton.siblings( '.fusion-builder-upload-field' ).each( function() {
|
|
FusionPageBuilderApp.fusionBuilderImagePreview( $( this ).siblings( '.fusion-builder-upload-button' ) );
|
|
} );
|
|
|
|
jQuery( 'body' ).on( 'click', '.fusion-multi-image-remove', function() {
|
|
var input = jQuery( this ).parents( '.fusion-multiple-upload-images' ).find( '.fusion-multi-image-input' ),
|
|
imageIDs,
|
|
imageID,
|
|
imageIndex;
|
|
|
|
imageID = jQuery( this ).parent( '.fusion-multi-image' ).data( 'image-id' );
|
|
imageIDs = input.val() ? input.val().split( ',' ) : [];
|
|
const currentImage = imageIDs.find( ( image ) => ( image.includes( '|' ) ? image.includes( '|' + imageID ) : image.includes( imageID ) ) );
|
|
imageIndex = imageIDs.indexOf( currentImage );
|
|
|
|
if ( -1 !== imageIndex ) {
|
|
imageIDs.splice( imageIndex, 1 );
|
|
}
|
|
imageIDs = imageIDs.join( ',' );
|
|
input.val( imageIDs ).trigger( 'change' );
|
|
jQuery( this ).parent( '.fusion-multi-image' ).remove();
|
|
} );
|
|
},
|
|
|
|
fusionBuilderActivateLinkSelector: function( $linkButton ) {
|
|
var $linkSubmit = jQuery( '#wp-link-submit' ),
|
|
$linkTitle = jQuery( '.wp-link-text-field' ),
|
|
$linkTarget = jQuery( '.link-target' ),
|
|
$fusionLinkSubmit = jQuery( '<input type="button" name="fusion-link-submit" id="fusion-link-submit" class="button-primary" value="Set Link">' ),
|
|
$linkDialog = window.wpLink,
|
|
wpLinkL10n = window.wpLinkL10n,
|
|
$input,
|
|
$url;
|
|
|
|
jQuery( $linkButton ).click( function( e ) {
|
|
$fusionLinkSubmit.insertBefore( $linkSubmit );
|
|
$input = jQuery( e.target ).prev( '.fusion-builder-link-field' );
|
|
$url = $input.val();
|
|
$linkSubmit.hide();
|
|
$linkTitle.hide();
|
|
$linkTarget.hide();
|
|
$fusionLinkSubmit.show();
|
|
$linkDialog = ! window.wpLink && $.fn.wpdialog && jQuery( '#wp-link' ).length ? {
|
|
$link: ! 1,
|
|
open: function() {
|
|
this.$link = jQuery( '#wp-link' ).wpdialog( {
|
|
title: wpLinkL10n.title,
|
|
width: 480,
|
|
height: 'auto',
|
|
modal: ! 0,
|
|
dialogClass: 'wp-dialog',
|
|
zIndex: 3e5
|
|
} );
|
|
},
|
|
close: function() {
|
|
this.$link.wpdialog( 'close' );
|
|
}
|
|
} : window.wpLink;
|
|
$linkDialog.fusionUpdateLink = function( $fusionLinkSubmit ) {
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
e.stopPropagation();
|
|
$url = jQuery( '#wp-link-url' ).length ? jQuery( '#wp-link-url' ).val() : jQuery( '#url-field' ).val();
|
|
$input.val( $url ).trigger( 'change' );
|
|
$linkSubmit.show();
|
|
$linkTitle.show();
|
|
$linkTarget.show();
|
|
$fusionLinkSubmit.remove();
|
|
jQuery( '#wp-link-cancel' ).off( 'click' );
|
|
$linkDialog.close();
|
|
};
|
|
|
|
// Using custom CSS field here as dummy text area, as it is always available.
|
|
$linkDialog.open( 'fusion-custom-css-field' );
|
|
jQuery( '#wp-link-url' ).val( $url );
|
|
} );
|
|
|
|
jQuery( 'body' ).on( 'click', '#fusion-link-submit', function() {
|
|
$linkDialog.fusionUpdateLink( jQuery( this ) );
|
|
} );
|
|
|
|
jQuery( 'body' ).on( 'click', '#wp-link-cancel, #wp-link-close, #wp-link-backdrop', function() {
|
|
$linkSubmit.show();
|
|
$linkTitle.show();
|
|
$linkTarget.show();
|
|
$fusionLinkSubmit.remove();
|
|
} );
|
|
},
|
|
|
|
fusionBuilderActivateNominatimSearch: function( $linkButton ) {
|
|
let $input, latField, lonField, query;
|
|
|
|
jQuery( $linkButton ).click( function( e ) {
|
|
e.preventDefault();
|
|
$input = jQuery( e.target ).prev( '.fusion-builder-nominatim-field' );
|
|
latField = $input.data( 'lat' );
|
|
lonField = $input.data( 'lon' );
|
|
query = encodeURI( $input.val() );
|
|
const url = `https://nominatim.openstreetmap.org/search?q=${query}&format=json`;
|
|
const initFetch = { method: 'GET', mode: 'cors', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } };
|
|
window.fetch( url, initFetch )
|
|
.then( function( response ) {
|
|
return response.json();
|
|
} ).then( function( json ) {
|
|
if ( Array.isArray( json ) && 0 < json.length ) {
|
|
jQuery( `#${latField}` ).val( json[ 0 ].lat );
|
|
jQuery( `#${lonField}` ).val( json[ 0 ].lon );
|
|
} else {
|
|
alert( 'Unknown address: ' + $input.val() );
|
|
}
|
|
} )[ 'catch' ]( function( error ) {
|
|
alert( error.message );
|
|
} );
|
|
} );
|
|
},
|
|
|
|
fusionBuilderSetContent: function( textareaID, content ) {
|
|
if ( 'undefined' !== typeof window.tinyMCE && window.tinyMCE.get( textareaID ) && ! window.tinyMCE.get( textareaID ).isHidden() ) {
|
|
|
|
if ( window.tinyMCE.get( textareaID ).getParam( 'wpautop', true ) && 'undefined' !== typeof window.switchEditors ) {
|
|
content = window.switchEditors.wpautop( content );
|
|
}
|
|
|
|
window.tinyMCE.get( textareaID ).setContent( content, { format: 'html' } );
|
|
} else {
|
|
$( '#' + textareaID ).val( content );
|
|
}
|
|
},
|
|
|
|
layoutLoaded: function() {
|
|
this.newLayoutLoaded = true;
|
|
},
|
|
|
|
clearLayout: function( event ) {
|
|
|
|
var r;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
r = confirm( fusionBuilderText.are_you_sure_you_want_to_delete_this_layout );
|
|
|
|
if ( false === r ) {
|
|
return false;
|
|
}
|
|
|
|
this.blankPage = true;
|
|
this.clearBuilderLayout( true );
|
|
|
|
// Clear history
|
|
fusionHistoryManager.clearEditor( 'blank' );
|
|
|
|
},
|
|
|
|
showHistoryDialog: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
this.$el.find( '.fusion-builder-history-list' ).show();
|
|
},
|
|
|
|
hideHistoryDialog: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
this.$el.find( '.fusion-builder-history-list' ).hide();
|
|
},
|
|
|
|
saveTemplateDialog: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
this.showLibrary();
|
|
$( '#fusion-builder-layouts-templates-trigger' ).click();
|
|
},
|
|
|
|
loadPreBuiltPage: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
this.showLibrary();
|
|
|
|
jQuery( '#fusion-builder-layouts-demos-trigger' ).click();
|
|
|
|
},
|
|
|
|
loadSutdioPage: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
this.showLibrary();
|
|
|
|
jQuery( '#fusion-builder-layouts-studio-trigger' ).click();
|
|
|
|
},
|
|
|
|
saveLayout: function( event ) {
|
|
|
|
var templateContent,
|
|
templateName,
|
|
layoutsContainer,
|
|
currentPostID,
|
|
emptyMessage,
|
|
customCSS,
|
|
pageTemplate,
|
|
$customFields = [],
|
|
$name,
|
|
$value;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
// Get custom field values for saving.
|
|
jQuery( 'input[id^="pyre_"], select[id^="pyre_"]' ).each( function( n ) {
|
|
$name = jQuery( this ).attr( 'id' );
|
|
$value = jQuery( this ).val();
|
|
if ( 'undefined' !== typeof $name && 'undefined' !== typeof $value ) {
|
|
$customFields[ n ] = [ $name, $value ];
|
|
}
|
|
} );
|
|
|
|
templateContent = fusionBuilderGetContent( 'content', true ); // jshint ignore:line
|
|
templateName = $( '#new_template_name' ).val();
|
|
layoutsContainer = $( '#fusion-builder-layouts-templates .fusion-page-layouts' );
|
|
currentPostID = $( '#fusion_builder_main_container' ).data( 'post-id' );
|
|
emptyMessage = $( '#fusion-builder-layouts-templates .fusion-page-layouts .fusion-empty-library-message' );
|
|
customCSS = $( '#fusion-custom-css-field' ).val();
|
|
pageTemplate = $( '#page_template' ).val();
|
|
|
|
if ( '' !== templateName ) {
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
url: fusionBuilderConfig.ajaxurl,
|
|
dataType: 'json',
|
|
data: {
|
|
action: 'fusion_builder_save_layout',
|
|
fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce,
|
|
fusion_layout_name: templateName,
|
|
fusion_layout_content: templateContent,
|
|
fusion_layout_post_type: 'fusion_template',
|
|
fusion_current_post_id: currentPostID,
|
|
fusion_custom_css: customCSS,
|
|
fusion_page_template: pageTemplate,
|
|
fusion_options: $customFields
|
|
},
|
|
complete: function( data ) {
|
|
layoutsContainer.prepend( data.responseText );
|
|
emptyMessage.hide();
|
|
}
|
|
} );
|
|
|
|
$( '#new_template_name' ).val( '' );
|
|
|
|
} else {
|
|
alert( fusionBuilderText.please_enter_template_name );
|
|
}
|
|
},
|
|
|
|
saveElement: function( event ) {
|
|
var fusionElementType,
|
|
elementCID,
|
|
elementView;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
fusionElementType = $( event.currentTarget ).data( 'element-type' );
|
|
elementCID = $( event.currentTarget ).data( 'element-cid' );
|
|
elementView = FusionPageBuilderViewManager.getView( elementCID );
|
|
|
|
elementView.saveElement();
|
|
},
|
|
|
|
loadLayout: function( event ) {
|
|
var $layout,
|
|
contentPlacement,
|
|
content,
|
|
$customCSS;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
if ( true === this.layoutIsLoading ) {
|
|
return;
|
|
}
|
|
|
|
this.layoutIsLoading = true;
|
|
|
|
$layout = $( event.currentTarget ).closest( 'li' );
|
|
contentPlacement = $( event.currentTarget ).data( 'load-type' );
|
|
content = fusionBuilderGetContent( 'content' );
|
|
$customCSS = jQuery( '#fusion-custom-css-field' ).val();
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
url: fusionBuilderConfig.ajaxurl,
|
|
data: {
|
|
action: 'fusion_builder_load_layout',
|
|
fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce,
|
|
fusion_layout_id: $layout.data( 'layout_id' )
|
|
},
|
|
beforeSend: function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-show-loader' );
|
|
|
|
$( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' );
|
|
$( '.fusion_builder_modal_inner_row_overlay' ).remove();
|
|
$( '#fusion-builder-layouts' ).hide();
|
|
|
|
}
|
|
} )
|
|
.done( function( data ) {
|
|
var dataObj;
|
|
|
|
// New layout loaded
|
|
FusionPageBuilderApp.layoutLoaded();
|
|
|
|
dataObj = JSON.parse( data );
|
|
|
|
if ( 'above' === contentPlacement ) {
|
|
content = dataObj.post_content + content;
|
|
|
|
// Set custom css above
|
|
if ( 'undefined' !== typeof dataObj.custom_css ) {
|
|
$( '#fusion-custom-css-field' ).val( dataObj.custom_css + '\n' + $customCSS );
|
|
}
|
|
|
|
} else if ( 'below' === contentPlacement ) {
|
|
content = content + dataObj.post_content;
|
|
|
|
// Set custom css below
|
|
if ( 'undefined' !== typeof dataObj.custom_css ) {
|
|
if ( $customCSS.length ) {
|
|
$( '#fusion-custom-css-field' ).val( $customCSS + '\n' + dataObj.custom_css );
|
|
} else {
|
|
$( '#fusion-custom-css-field' ).val( dataObj.custom_css );
|
|
}
|
|
}
|
|
|
|
} else {
|
|
content = dataObj.post_content;
|
|
|
|
// Set custom css.
|
|
if ( 'undefined' !== typeof dataObj.custom_css ) {
|
|
$( '#fusion-custom-css-field' ).val( dataObj.custom_css );
|
|
}
|
|
|
|
// Set Fusion Option selection.
|
|
jQuery.each( dataObj.post_meta, function( $name, $value ) {
|
|
jQuery( '#' + $name ).val( $value ).trigger( 'change' );
|
|
} );
|
|
}
|
|
|
|
FusionPageBuilderApp.clearBuilderLayout();
|
|
|
|
FusionPageBuilderApp.createBuilderLayout( content );
|
|
|
|
// Set page template
|
|
if ( 'undefined' !== typeof dataObj.page_template ) {
|
|
$( '#page_template' ).val( dataObj.page_template );
|
|
}
|
|
|
|
FusionPageBuilderApp.layoutIsLoading = false;
|
|
} )
|
|
.always( function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-hide-loader' );
|
|
} );
|
|
},
|
|
|
|
loadDemoPage: function( event ) {
|
|
var pageName,
|
|
demoName,
|
|
postId,
|
|
content,
|
|
r;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
r = confirm( fusionBuilderText.importing_single_page );
|
|
|
|
if ( false === r ) {
|
|
return false;
|
|
}
|
|
|
|
if ( true === this.layoutIsLoading ) {
|
|
return;
|
|
}
|
|
|
|
this.layoutIsLoading = true;
|
|
|
|
pageName = $( event.currentTarget ).data( 'page-name' );
|
|
demoName = $( event.currentTarget ).data( 'demo-name' );
|
|
postId = $( event.currentTarget ).data( 'post-id' );
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
url: fusionBuilderConfig.ajaxurl,
|
|
data: {
|
|
action: 'fusion_builder_load_demo',
|
|
fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce,
|
|
page_name: pageName,
|
|
demo_name: demoName,
|
|
post_id: postId
|
|
},
|
|
beforeSend: function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-show-loader' );
|
|
|
|
$( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' );
|
|
$( '.fusion_builder_modal_inner_row_overlay' ).remove();
|
|
$( '#fusion-builder-layouts' ).hide();
|
|
|
|
}
|
|
} )
|
|
.done( function( data ) {
|
|
var dataObj,
|
|
meta;
|
|
|
|
// New layout loaded
|
|
FusionPageBuilderApp.layoutLoaded();
|
|
|
|
dataObj = JSON.parse( data );
|
|
|
|
content = dataObj.post_content;
|
|
|
|
FusionPageBuilderApp.clearBuilderLayout( false );
|
|
|
|
FusionPageBuilderApp.createBuilderLayout( content );
|
|
|
|
// Set page template
|
|
if ( 'undefined' !== typeof dataObj.page_template ) {
|
|
$( '#page_template' ).val( dataObj.page_template );
|
|
}
|
|
|
|
meta = dataObj.meta;
|
|
|
|
// Set page options
|
|
_.each( meta, function( value, name ) {
|
|
$( '#' + name ).val( value ).trigger( 'change' );
|
|
} );
|
|
|
|
FusionPageBuilderApp.layoutIsLoading = false;
|
|
} )
|
|
.always( function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-hide-loader' );
|
|
} );
|
|
},
|
|
|
|
deleteLayout: function( event ) {
|
|
|
|
var $layout,
|
|
r,
|
|
isGlobal = false;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
|
|
if ( $( event.currentTarget ).closest( 'li' ).hasClass( 'fusion-global' ) ) {
|
|
r = confirm( fusionBuilderText.are_you_sure_you_want_to_delete_global );
|
|
isGlobal = true;
|
|
} else {
|
|
r = confirm( fusionBuilderText.are_you_sure_you_want_to_delete_this );
|
|
}
|
|
|
|
if ( false === r ) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if ( true === this.layoutIsDeleting ) {
|
|
return;
|
|
}
|
|
|
|
this.layoutIsDeleting = true;
|
|
|
|
$layout = $( event.currentTarget ).closest( 'li' );
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
url: fusionBuilderConfig.ajaxurl,
|
|
data: {
|
|
action: 'fusion_builder_delete_layout',
|
|
fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce,
|
|
fusion_layout_id: $layout.data( 'layout_id' )
|
|
}
|
|
} )
|
|
.done( function( response ) {
|
|
var $containerSuffix = 'elements';
|
|
|
|
if ( 'undefined' === typeof response.success || ! response.success ) {
|
|
return;
|
|
}
|
|
|
|
if ( $layout.parents( '#fusion-builder-layouts-templates' ).length ) {
|
|
$containerSuffix = 'templates';
|
|
}
|
|
|
|
$layout.remove();
|
|
|
|
FusionPageBuilderApp.layoutIsDeleting = false;
|
|
if ( ! $( '#fusion-builder-layouts-' + $containerSuffix + ' .fusion-page-layouts' ).find( 'li' ).length ) {
|
|
$( '#fusion-builder-layouts-' + $containerSuffix + ' .fusion-page-layouts .fusion-empty-library-message' ).show();
|
|
}
|
|
|
|
if ( true === isGlobal ) {
|
|
$.each( $( 'div[fusion-global-layout="' + $layout.data( 'layout_id' ) + '"]' ), function( i, val ) { // jshint ignore:line
|
|
if ( $( this ).hasClass( 'fusion-builder-section-content' ) ) {
|
|
$( this ).parent().parent().find( 'a.fusion-builder-remove' ).first().trigger( 'click' );
|
|
} else {
|
|
$( this ).find( 'a.fusion-builder-remove' ).first().trigger( 'click' );
|
|
$( this ).find( 'a.fusion-builder-remove-inner-row' ).first().trigger( 'click' );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* Toggles import options.
|
|
*
|
|
* @since 3.7
|
|
* @param {Object} event - The event.
|
|
* @return {void}
|
|
*/
|
|
toggleImportOptions: function( event ) {
|
|
var $wrapper = jQuery( event.currentTarget ).closest( '.studio-wrapper' );
|
|
|
|
if ( ! $wrapper.hasClass( 'fusion-studio-preview-active' ) ) {
|
|
$wrapper.find( '.awb-import-options' ).toggleClass( 'open' );
|
|
}
|
|
},
|
|
|
|
loadStudioLayout: function( event ) {
|
|
var $layout,
|
|
self = this,
|
|
category = 'undefined' !== typeof fusionBuilderConfig.post_type && 'fusion_form' === fusionBuilderConfig.post_type ? 'forms' : 'fusion_template',
|
|
importOptions = FusionPageBuilderApp.studio.getImportOptions( event ),
|
|
postMeta,
|
|
content,
|
|
$layoutsContainer;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
// Off canvas.
|
|
category = 'undefined' !== typeof fusionBuilderConfig.post_type && 'awb_off_canvas' === fusionBuilderConfig.post_type ? fusionBuilderConfig.post_type : category;
|
|
|
|
if ( 'string' === typeof fusionBuilderConfig.template_category && 0 < fusionBuilderConfig.template_category.length ) {
|
|
category = fusionBuilderConfig.template_category;
|
|
}
|
|
|
|
if ( true === this.layoutIsLoading ) {
|
|
return;
|
|
}
|
|
|
|
this.layoutIsLoading = true;
|
|
|
|
$layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' );
|
|
$layoutsContainer = $layout.closest( '.studio-imports' );
|
|
|
|
// Get correct content.
|
|
FusionPageBuilderApp.builderToShortcodes();
|
|
content = fusionBuilderGetContent( 'content' );
|
|
|
|
FusionPageBuilderApp.loaded = false;
|
|
|
|
jQuery.ajax( {
|
|
type: 'POST',
|
|
url: FusionPageBuilderApp.ajaxurl,
|
|
dataType: 'JSON',
|
|
data: {
|
|
action: 'fusion_builder_load_layout',
|
|
fusion_load_nonce: FusionPageBuilderApp.fusion_load_nonce,
|
|
fusion_layout_id: $layout.data( 'layout-id' ),
|
|
overWriteType: importOptions.overWriteType,
|
|
shouldInvert: importOptions.shouldInvert,
|
|
imagesImport: importOptions.imagesImport,
|
|
fusion_studio: true,
|
|
post_id: fusionBuilderConfig.post_id,
|
|
category: category
|
|
},
|
|
|
|
beforeSend: function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-show-loader' );
|
|
|
|
$( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' );
|
|
$( '.fusion_builder_modal_inner_row_overlay' ).remove();
|
|
$( '#fusion-builder-layouts' ).hide();
|
|
$( '#fusion-builder-fusion_template-studio' ).find( '.studio-wrapper' ).addClass( 'loading' );
|
|
|
|
jQuery( '#fusion-loader .awb-studio-import-status' ).html( fusionBuilderText.studio_importing_content );
|
|
},
|
|
|
|
success: function( data ) {
|
|
var i,
|
|
promises = [],
|
|
dfd = jQuery.Deferred(), // Master deferred.
|
|
dfdNext = dfd; // Next deferred in the chain.
|
|
|
|
dfd.resolve();
|
|
|
|
// Reset array.
|
|
self.mediaImportKeys = [];
|
|
|
|
// We have the content, let's check for assets.
|
|
// Filter out empty properties (now those are empty arrays).
|
|
if ( 'object' === typeof data.avada_media ) {
|
|
Object.keys( data.avada_media ).forEach( function( key ) {
|
|
// We expect and object.
|
|
if ( 'object' === typeof data.avada_media[ key ] && ! Array.isArray( data.avada_media[ key ] ) ) {
|
|
self.mediaImportKeys.push( key );
|
|
}
|
|
} );
|
|
}
|
|
|
|
// Import studio media if needed.
|
|
if ( 0 < self.mediaImportKeys.length ) {
|
|
|
|
// Set first AJAX response as initial data.
|
|
self.studio.setImportData( data );
|
|
|
|
for ( i = 0; i < self.mediaImportKeys.length; i++ ) {
|
|
|
|
// IIFE to freeze the value of i.
|
|
( function( k ) { // eslint-disable-line no-loop-func
|
|
|
|
dfdNext = dfdNext.then( function() {
|
|
return self.importStudioMedia( self.studio.getImportData(), self.mediaImportKeys[ k ], importOptions );
|
|
} );
|
|
|
|
promises.push( dfdNext );
|
|
}( i ) );
|
|
|
|
}
|
|
|
|
jQuery.when.apply( null, promises ).then(
|
|
function() {
|
|
|
|
/*
|
|
var lastAjaxResponse;
|
|
|
|
if ( 1 === promises.length ) {
|
|
lastAjaxResponse = arguments[ 0 ];
|
|
} else {
|
|
lastAjaxResponse = arguments[ promises.length - 1 ][ 0 ];
|
|
}
|
|
*/
|
|
|
|
self.setStudioContent( data, self.studio.getImportData().post_content, importOptions.loadType );
|
|
FusionPageBuilderEvents.trigger( 'fusion-studio-content-imported', self.studio.getImportData() );
|
|
|
|
self.studioLayoutImportComplete();
|
|
|
|
// Update PO panel.
|
|
if ( 'function' === typeof awbUpdatePOPanel ) {
|
|
postMeta = self.studio.getImportData().post_meta;
|
|
|
|
if ( 'undefined' !== typeof postMeta && 'undefined' !== typeof postMeta._fusion ) {
|
|
awbUpdatePOPanel( postMeta._fusion );
|
|
}
|
|
}
|
|
|
|
self.studio.resetImportData();
|
|
},
|
|
function() {
|
|
|
|
jQuery( '#fusion-loader .awb-studio-import-status' ).html( fusionBuilderText.studio_importing_content_failed );
|
|
|
|
self.studioLayoutImportComplete();
|
|
|
|
self.studio.resetImportData();
|
|
}
|
|
);
|
|
} else {
|
|
|
|
self.setStudioContent( data, data.post_content, importOptions.loadType );
|
|
FusionPageBuilderEvents.trigger( 'fusion-studio-content-imported', data );
|
|
|
|
// Update PO panel.
|
|
if ( 'function' === typeof awbUpdatePOPanel ) {
|
|
postMeta = data.post_meta;
|
|
|
|
if ( 'undefined' !== typeof postMeta && 'undefined' !== typeof postMeta._fusion ) {
|
|
awbUpdatePOPanel( postMeta._fusion );
|
|
}
|
|
}
|
|
|
|
self.studioLayoutImportComplete();
|
|
}
|
|
|
|
}
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* Does what needs to be done when layout is imported.
|
|
*
|
|
* @since 3.5
|
|
* @param {Object} event - The event.
|
|
*/
|
|
studioLayoutImportComplete: function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-hide-loader' );
|
|
$( '#fusion-builder-fusion_template-studio' ).find( '.studio-wrapper' ).removeClass( 'loading' );
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} dataObj
|
|
* @param {String} newContent
|
|
* @param {String} contentPlacement
|
|
*/
|
|
setStudioContent: function( dataObj, newContent, contentPlacement ) {
|
|
var dataObj,
|
|
newCustomCss,
|
|
existingCss = jQuery( '#fusion-custom-css-field' ).val(),
|
|
content = '';
|
|
|
|
// Get correct content.
|
|
FusionPageBuilderApp.builderToShortcodes();
|
|
content = fusionBuilderGetContent( 'content' );
|
|
|
|
// New layout loaded
|
|
FusionPageBuilderApp.layoutLoaded();
|
|
|
|
newCustomCss = 'undefined' !== typeof dataObj.custom_css ? dataObj.custom_css : false;
|
|
|
|
if ( 'load-type-above' === contentPlacement ) {
|
|
content = newContent + content;
|
|
if ( newCustomCss ) {
|
|
jQuery( '#fusion-custom-css-field' ).val( newCustomCss + '\n' + existingCss );
|
|
}
|
|
|
|
} else if ( 'load-type-below' === contentPlacement ) {
|
|
content = content + newContent;
|
|
if ( newCustomCss ) {
|
|
jQuery( '#fusion-custom-css-field' ).val( existingCss + '\n' + newCustomCss );
|
|
}
|
|
|
|
} else {
|
|
content = newContent;
|
|
if ( newCustomCss ) {
|
|
jQuery( '#fusion-custom-css-field' ).val( newCustomCss );
|
|
}
|
|
|
|
// Set Fusion Option selection.
|
|
jQuery.each( dataObj.post_meta, function( $name, $value ) {
|
|
jQuery( '#' + $name ).val( $value ).trigger( 'change' );
|
|
} );
|
|
|
|
// Set page template.
|
|
jQuery( '#page_template' ).val( '100-width.php' );
|
|
}
|
|
|
|
// Create new builder layout.
|
|
FusionPageBuilderApp.clearBuilderLayout();
|
|
FusionPageBuilderApp.createBuilderLayout( content );
|
|
|
|
FusionPageBuilderApp.layoutIsLoading = false;
|
|
},
|
|
|
|
/**
|
|
* Imports studio post's media.
|
|
*
|
|
* @param {object} postData
|
|
* @param {string} mediaKey
|
|
* @param {object} importOptions
|
|
* @return promise
|
|
*/
|
|
importStudioMedia: function( postData, mediaKey, importOptions ) {
|
|
var self = this;
|
|
|
|
let mediaKeyLabel = mediaKey;
|
|
if ( 'multiple_images' === mediaKey ) {
|
|
mediaKeyLabel = 'Images';
|
|
}
|
|
jQuery( '#fusion-loader .awb-studio-import-status' ).html( fusionBuilderText.studio_importing_media + ' ' + mediaKeyLabel.replace( '_', ' ' ) );
|
|
|
|
return jQuery.ajax( {
|
|
type: 'POST',
|
|
url: ajaxurl,
|
|
dataType: 'JSON',
|
|
data: {
|
|
action: 'awb_studio_import_media',
|
|
data: {
|
|
mediaImportKey: mediaKey,
|
|
postData: postData
|
|
},
|
|
overWriteType: importOptions.overWriteType,
|
|
shouldInvert: importOptions.shouldInvert,
|
|
imagesImport: importOptions.imagesImport,
|
|
fusion_load_nonce: FusionPageBuilderApp.fusion_load_nonce
|
|
},
|
|
success: function( data ) {
|
|
self.studio.setImportData( data );
|
|
}
|
|
} );
|
|
},
|
|
|
|
studioPreviewLoaded: function() {
|
|
// Trigger event for preview update.
|
|
window.dispatchEvent( new Event( 'awb-studio-update-preview' ) );
|
|
|
|
jQuery( '.studio-wrapper' ).removeClass( 'loading' );
|
|
jQuery( '.studio-wrapper' ).find( '.fusion-loader' ).hide();
|
|
},
|
|
|
|
openLibrary: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
this.showLibrary();
|
|
$( '.fusion-tabs-menu > li:first-child > a' ).click();
|
|
},
|
|
|
|
showLibrary: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
$( '#fusion-builder-layouts' ).show();
|
|
$( 'body' ).addClass( 'fusion_builder_inner_row_no_scroll' ).append( '<div class="fusion_builder_modal_inner_row_overlay"></div>' );
|
|
|
|
setTimeout( function() {
|
|
$( '.fusion-builder-save-element-input, #new_template_name' ).focus();
|
|
}, 20 );
|
|
},
|
|
|
|
hideLibrary: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
$( '#fusion-builder-layouts' ).hide();
|
|
$( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' );
|
|
$( '.fusion_builder_modal_inner_row_overlay' ).remove();
|
|
$( '.fusion-save-element-fields' ).remove();
|
|
},
|
|
|
|
showLoader: function() {
|
|
$( '#fusion_builder_main_container' ).css( 'height', '148px' );
|
|
$( '#fusion_builder_container' ).hide();
|
|
$( '#fusion-loader' ).fadeIn( 'fast' );
|
|
},
|
|
|
|
hideLoader: function() {
|
|
$( '#fusion_builder_container' ).fadeIn( 'fast' );
|
|
$( '#fusion_builder_main_container' ).removeAttr( 'style' );
|
|
$( '#fusion-loader' ).fadeOut( 'fast' );
|
|
},
|
|
|
|
sortableContainers: function() {
|
|
this.$el.sortable( {
|
|
handle: '.fusion-builder-section-header',
|
|
items: '.fusion_builder_container, .fusion-builder-next-page, .fusion-checkout-form, .fusion-builder-form-step',
|
|
cancel: '.fusion-builder-section-name, .fusion-builder-settings, .fusion-builder-clone, .fusion-builder-remove, .fusion-builder-section-add, .fusion-builder-add-element, .fusion-builder-insert-column, #fusion_builder_controls, .fusion-builder-save-element',
|
|
cursor: 'move',
|
|
update: function() {
|
|
fusionHistoryManager.turnOnTracking();
|
|
fusionHistoryState = fusionBuilderText.moved_container; // jshint ignore:line
|
|
FusionPageBuilderEvents.trigger( 'fusion-element-sorted' );
|
|
}
|
|
} );
|
|
},
|
|
|
|
initialBuilderLayout: function( initialLoad ) {
|
|
|
|
// Clear all views
|
|
FusionPageBuilderViewManager.removeViews();
|
|
|
|
FusionPageBuilderEvents.trigger( 'fusion-show-loader' );
|
|
|
|
setTimeout( function() {
|
|
|
|
var content = fusionBuilderGetContent( 'content', true, initialLoad ),
|
|
contentErrorMarkup = '',
|
|
contentErrorMarkupWrapper = '',
|
|
contentErrorMarkupClone = '';
|
|
|
|
try {
|
|
|
|
if ( ! jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) {
|
|
content = FusionPageBuilderApp.validateContent( content );
|
|
}
|
|
|
|
FusionPageBuilderApp.createBuilderLayout( content );
|
|
|
|
FusionPageBuilderEvents.trigger( 'fusion-hide-loader' );
|
|
|
|
} catch ( error ) {
|
|
console.log( error );
|
|
FusionPageBuilderApp.fusionBuilderSetContent( 'content', content );
|
|
jQuery( '#fusion_toggle_builder' ).trigger( 'click' );
|
|
|
|
contentErrorMarkup = FusionPageBuilderApp.$el.find( '#content-error' );
|
|
contentErrorMarkupWrapper = FusionPageBuilderApp.$el;
|
|
contentErrorMarkupClone = contentErrorMarkup.clone();
|
|
|
|
contentErrorMarkup.dialog( {
|
|
dialogClass: 'fusion-builder-dialog',
|
|
autoOpen: false,
|
|
modal: true,
|
|
closeText: '',
|
|
buttons: {
|
|
OK: function() {
|
|
jQuery( this ).dialog( 'close' );
|
|
}
|
|
},
|
|
close: function() {
|
|
contentErrorMarkupWrapper.append( contentErrorMarkupClone );
|
|
}
|
|
} );
|
|
|
|
contentErrorMarkup.dialog( 'open' );
|
|
}
|
|
|
|
}, 50 );
|
|
},
|
|
|
|
validateContent: function( content ) {
|
|
var contentIsEmpty = '' === content,
|
|
textNodes = '',
|
|
columns = [],
|
|
containers = [],
|
|
shortcodeTags,
|
|
columnwrapped,
|
|
insertionFlag;
|
|
|
|
// Throw exception with the fullwidth shortcode.
|
|
if ( -1 !== content.indexOf( '[fullwidth' ) ) {
|
|
throw 'Avada 4.0.3 or earlier fullwidth container used!';
|
|
}
|
|
|
|
if ( ! contentIsEmpty ) {
|
|
|
|
// Fixes [fusion_text /] instances, which were created in 5.0.1 for empty text blocks.
|
|
content = content.replace( /\[fusion\_text \/\]/g, '[fusion_text][/fusion_text]' ).replace( /\[\/fusion\_text\]\[\/fusion\_text\]/g, '[/fusion_text]' );
|
|
|
|
content = content.replace( /\$\$/g, '$$' );
|
|
textNodes = content;
|
|
|
|
// Add container if missing.
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_container', textNodes, function() {
|
|
return '@|@';
|
|
} );
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_next_page', textNodes, function() {
|
|
return '@|@';
|
|
} );
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_form_step', textNodes, function() {
|
|
return '@|@';
|
|
} );
|
|
textNodes = wp.shortcode.replace( 'fusion_woo_checkout_form', textNodes, function() {
|
|
return '@|@';
|
|
} );
|
|
textNodes = textNodes.trim().split( '@|@' );
|
|
|
|
_.each( textNodes, function( textNodes ) {
|
|
if ( '' !== textNodes.trim() ) {
|
|
content = content.replace( textNodes, '[fusion_builder_container type="flex" hundred_percent="no" equal_height_columns="no" menu_anchor="" hide_on_mobile="small-visibility,medium-visibility,large-visibility" class="" id="" background_color="" background_image="" background_position="center center" background_repeat="no-repeat" fade="no" background_parallax="none" parallax_speed="0.3" video_mp4="" video_webm="" video_ogv="" video_url="" video_aspect_ratio="16:9" video_loop="yes" video_mute="yes" overlay_color="" overlay_opacity="0.5" video_preview_image="" border_size="" border_color="" border_style="solid" padding_top="" padding_bottom="" padding_left="" padding_right=""][fusion_builder_row]' + textNodes + '[/fusion_builder_row][/fusion_builder_container]' );
|
|
}
|
|
} );
|
|
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_container', content, function( tag ) {
|
|
containers.push( tag.content );
|
|
} );
|
|
|
|
_.each( containers, function( textNodes ) {
|
|
|
|
// Add column if missing.
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_row', textNodes, function( tag ) {
|
|
return tag.content;
|
|
} );
|
|
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_column', textNodes, function() {
|
|
return '@|@';
|
|
} );
|
|
|
|
textNodes = textNodes.trim().split( '@|@' );
|
|
_.each( textNodes, function( textNodes ) {
|
|
if ( '' !== textNodes.trim() && '[fusion_builder_row][/fusion_builder_row]' !== textNodes.trim() ) {
|
|
columnwrapped = '[fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" border_position="all" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="small-visibility,medium-visibility,large-visibility" center_content="no" last="no" min_height="" hover_type="none" link=""]' + textNodes + '[/fusion_builder_column]';
|
|
content = content.replace( textNodes, columnwrapped );
|
|
|
|
}
|
|
} );
|
|
} );
|
|
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_column_inner', content, function( tag ) {
|
|
columns.push( tag.content );
|
|
} );
|
|
textNodes = wp.shortcode.replace( 'fusion_builder_column', content, function( tag ) {
|
|
columns.push( tag.content );
|
|
} );
|
|
|
|
_.each( columns, function( textNodes ) {
|
|
|
|
// Wrap non fusion elements.
|
|
shortcodeTags = fusionAllElements;
|
|
_.each( shortcodeTags, function( shortcode ) {
|
|
if ( 'undefined' === typeof shortcode.generator_only ) {
|
|
textNodes = wp.shortcode.replace( shortcode.shortcode, textNodes, function() {
|
|
return '@|@';
|
|
} );
|
|
}
|
|
} );
|
|
|
|
textNodes = textNodes.trim().split( '@|@' );
|
|
_.each( textNodes, function( textNodes ) {
|
|
if ( '' !== textNodes.trim() && '<br />' !== textNodes.trim() ) {
|
|
insertionFlag = '@=%~@';
|
|
if ( '@' === textNodes.slice( -1 ) ) {
|
|
insertionFlag = '#=%~#';
|
|
}
|
|
content = content.replace( textNodes, '[fusion_text]' + textNodes.slice( 0, -1 ) + insertionFlag + textNodes.slice( -1 ) + '[/fusion_text]' );
|
|
}
|
|
} );
|
|
} );
|
|
content = content.replace( /@=%~@/g, '' ).replace( /#=%~#/g, '' );
|
|
|
|
// Check for once deactivated elements in text blocks that are active again.
|
|
content = wp.shortcode.replace( 'fusion_text', content, function( tag ) {
|
|
if ( 'undefined' !== typeof tag.attrs.named.dynamic_params && '' !== tag.attrs.named.dynamic_params ) {
|
|
return false;
|
|
}
|
|
shortcodeTags = fusionAllElements;
|
|
textNodes = tag.content;
|
|
|
|
_.each( shortcodeTags, function( shortcode ) {
|
|
if ( 'undefined' === typeof shortcode.generator_only ) {
|
|
textNodes = wp.shortcode.replace( shortcode.shortcode, textNodes, function() {
|
|
return '|';
|
|
} );
|
|
}
|
|
} );
|
|
if ( ! textNodes.replace( /\|/g, '' ).length ) {
|
|
return tag.content;
|
|
}
|
|
} );
|
|
}
|
|
|
|
function replaceDollars() {
|
|
return '$$';
|
|
}
|
|
|
|
content = content.replace( /$$/g, replaceDollars );
|
|
|
|
return content;
|
|
},
|
|
|
|
validateLibraryContent: function( content ) {
|
|
var contentIsEmpty = '' === content,
|
|
openContainer = '[fusion_builder_container type="flex" hundred_percent="no" equal_height_columns="no" menu_anchor="" hide_on_mobile="small-visibility,medium-visibility,large-visibility" class="" id="" background_color="" background_image="" background_position="center center" background_repeat="no-repeat" fade="no" background_parallax="none" parallax_speed="0.3" video_mp4="" video_webm="" video_ogv="" video_url="" video_aspect_ratio="16:9" video_loop="yes" video_mute="yes" overlay_color="" overlay_opacity="0.5" video_preview_image="" border_size="" border_color="" border_style="solid" padding_top="" padding_bottom="" padding_left="" padding_right=""][fusion_builder_row]',
|
|
closeContainer = '[/fusion_builder_row][/fusion_builder_container]',
|
|
openColumn = '[fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" border_position="all" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="small-visibility,medium-visibility,large-visibility" center_content="no" last="no" min_height="" hover_type="none" link=""]',
|
|
closeColumn = '[/fusion_builder_column]',
|
|
columnEdit = jQuery( 'body' ).hasClass( 'fusion-element-post-type-columns' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' );
|
|
|
|
// The way it is setup now, we dont want blank page template on library items.
|
|
if ( columnEdit && '[fusion_builder_blank_page][/fusion_builder_blank_page]' === content ) {
|
|
content = openColumn + closeColumn;
|
|
contentIsEmpty = false;
|
|
}
|
|
|
|
if ( ! contentIsEmpty ) {
|
|
|
|
// Editing element
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-elements' ) ) {
|
|
|
|
content = openContainer + openColumn + content + closeColumn + closeContainer;
|
|
|
|
} else if ( columnEdit ) {
|
|
|
|
content = openContainer + content + closeContainer;
|
|
}
|
|
}
|
|
|
|
function replaceDollars() {
|
|
return '$$';
|
|
}
|
|
|
|
content = content.replace( /$$/g, replaceDollars );
|
|
|
|
return content;
|
|
},
|
|
|
|
clearBuilderLayout: function( blankPageLayout ) {
|
|
|
|
// Remove blank page layout
|
|
this.$el.find( '.fusion-builder-blank-page-content' ).each( function() {
|
|
var $that = $( this ),
|
|
thisView = FusionPageBuilderViewManager.getView( $that.data( 'cid' ) );
|
|
|
|
if ( 'undefined' !== typeof thisView ) {
|
|
thisView.removeBlankPageHelper();
|
|
}
|
|
} );
|
|
|
|
// Remove all containers
|
|
this.$el.find( '.fusion-builder-section-content' ).each( function() {
|
|
var $that = $( this ),
|
|
thisView = FusionPageBuilderViewManager.getView( $that.data( 'cid' ) );
|
|
|
|
if ( 'undefined' !== typeof thisView ) {
|
|
thisView.removeContainer();
|
|
}
|
|
} );
|
|
|
|
// Create blank page layout
|
|
if ( blankPageLayout && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' ) ) {
|
|
|
|
if ( true === this.blankPage ) {
|
|
if ( ! this.$el.find( '.fusion-builder-blank-page-content' ).length ) {
|
|
this.createBuilderLayout( '[fusion_builder_blank_page][/fusion_builder_blank_page]' );
|
|
}
|
|
|
|
this.blankPage = false;
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
convertGalleryElement: function( content ) {
|
|
var regExp = window.wp.shortcode.regexp( 'fusion_gallery' ),
|
|
innerRegExp = this.regExpShortcode( 'fusion_gallery' ),
|
|
matches = content.match( regExp ),
|
|
newContent = content,
|
|
fetchIds = [];
|
|
|
|
if ( matches ) {
|
|
_.each( matches, function( shortcode ) {
|
|
var shortcodeElement = shortcode.match( innerRegExp ),
|
|
shortcodeAttributes = '' !== shortcodeElement[ 3 ] ? window.wp.shortcode.attrs( shortcodeElement[ 3 ] ) : '',
|
|
children = '',
|
|
newShortcode = '',
|
|
ids;
|
|
|
|
// Check for the old format shortcode
|
|
if ( 'undefined' !== typeof shortcodeAttributes.named.image_ids && '' !== shortcodeAttributes.named.image_ids ) {
|
|
ids = shortcodeAttributes.named.image_ids.split( ',' );
|
|
|
|
// Add new children shortcodes
|
|
_.each( ids, function( id ) {
|
|
children += '[fusion_gallery_image image="" image_id="' + id + '" /]';
|
|
fetchIds.push( id );
|
|
} );
|
|
|
|
// Add children shortcodes, remove image_ids attribute.
|
|
newShortcode = shortcode.replace( '][/fusion_gallery]', ']' + children + '[/fusion_gallery]' ).replace( '/]', ']' + children + '[/fusion_gallery]' ).replace( 'image_ids="' + shortcodeAttributes.named.image_ids + '" ', '' );
|
|
|
|
// Replace the old shortcode with the new one
|
|
newContent = newContent.replace( shortcode, newShortcode );
|
|
}
|
|
} );
|
|
|
|
// Fetch attachment data
|
|
if ( 0 < fetchIds.length ) {
|
|
wp.media.query( { post__in: fetchIds, posts_per_page: fetchIds.length } ).more();
|
|
}
|
|
}
|
|
|
|
return newContent;
|
|
},
|
|
|
|
mapStudioImages: function( options, values ) {
|
|
|
|
if ( 'object' !== typeof options ) {
|
|
return;
|
|
}
|
|
|
|
_.each( options, function( option ) {
|
|
var value;
|
|
if ( 'upload' === option.type && 'undefined' !== typeof values[ option.param_name ] && '' !== values[ option.param_name ] ) {
|
|
value = values[ option.param_name ];
|
|
|
|
if ( 'undefined' === typeof value || 'undefined' === value ) {
|
|
return;
|
|
}
|
|
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ value ] ) {
|
|
FusionPageBuilderApp.mediaMap.images[ value ] = true;
|
|
}
|
|
|
|
// Check if we have an image ID for this param.
|
|
if ( 'undefined' !== typeof values[ option.param_name + '_id' ] && '' !== values[ option.param_name + '_id' ] ) {
|
|
if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.images[ value ] ) {
|
|
FusionPageBuilderApp.mediaMap.images[ value ] = {};
|
|
}
|
|
FusionPageBuilderApp.mediaMap.images[ value ][ option.param_name + '_id' ] = values[ option.param_name + '_id' ];
|
|
}
|
|
} else if ( 'upload_images' === option.type && 'undefined' !== typeof values[ option.param_name ] && '' !== values[ option.param_name ] ) {
|
|
if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.multiple_images ) {
|
|
FusionPageBuilderApp.mediaMap.multiple_images = {};
|
|
}
|
|
|
|
const key = option.param_name + '-' + values[ option.param_name ];
|
|
|
|
if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.multiple_images[ key ] ) {
|
|
FusionPageBuilderApp.mediaMap.multiple_images[ key ] = {};
|
|
}
|
|
|
|
// Add images URLs
|
|
const images = values[ option.param_name ].split( ',' );
|
|
images.forEach( ( id ) => {
|
|
const image = wp.media.attachment( id );
|
|
if ( _.isUndefined( image.get( 'url' ) ) ) {
|
|
image.fetch().then( function() {
|
|
FusionPageBuilderApp.mediaMap.multiple_images[ key ][ id ] = image.get( 'url' );
|
|
} );
|
|
} else {
|
|
FusionPageBuilderApp.mediaMap.multiple_images[ key ][ id ] = image.get( 'url' );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
},
|
|
|
|
createMultiElementParentMediaMap: function( shortcodeName, content ) {
|
|
var regExp = window.wp.shortcode.regexp( shortcodeName ),
|
|
innerRegExp = this.regExpShortcode( shortcodeName ),
|
|
options = fusionAllElements[ shortcodeName ].params,
|
|
matches = content.match( regExp );
|
|
|
|
if ( 'object' !== typeof options ) {
|
|
return;
|
|
}
|
|
|
|
if ( matches ) {
|
|
_.each( matches, function( shortcode ) {
|
|
var shortcodeElement = shortcode.match( innerRegExp ),
|
|
shortcodeAttributes = '' !== shortcodeElement[ 3 ] ? window.wp.shortcode.attrs( shortcodeElement[ 3 ] ) : '';
|
|
|
|
if ( 'undefined' !== typeof shortcodeAttributes.named && 'undefined' !== typeof shortcodeAttributes.named.image_id && 'undefined' !== typeof shortcodeAttributes.named.image ) {
|
|
_.each( options, function( option ) {
|
|
var imageID, image;
|
|
|
|
if ( 'upload' === option.type && 'undefined' !== typeof shortcodeAttributes.named[ option.param_name ] ) {
|
|
image = shortcodeAttributes.named[ option.param_name ];
|
|
imageID = shortcodeAttributes.named.image_id;
|
|
|
|
if ( '' === image ) {
|
|
return;
|
|
}
|
|
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ image ] ) {
|
|
FusionPageBuilderApp.mediaMap.images[ image ] = true;
|
|
}
|
|
|
|
// Check if we have an image ID for this param.
|
|
if ( '' !== imageID && 'image' === option.param_name ) {
|
|
if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.images[ image ] ) {
|
|
FusionPageBuilderApp.mediaMap.images[ image ] = {};
|
|
}
|
|
FusionPageBuilderApp.mediaMap.images[ image ].image_id = imageID;
|
|
}
|
|
}
|
|
} );
|
|
}
|
|
|
|
// If media slide.
|
|
if ( 'fusion_slide' === shortcodeName && 'undefined' !== typeof shortcodeElement[ 5 ] && '' !== shortcodeElement[ 5 ] ) {
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ shortcodeElement[ 5 ] ] ) {
|
|
FusionPageBuilderApp.mediaMap.images[ shortcodeElement[ 5 ] ] = true;
|
|
}
|
|
}
|
|
} );
|
|
}
|
|
},
|
|
|
|
createBuilderLayout: function( content ) {
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) {
|
|
content = FusionPageBuilderApp.validateLibraryContent( content );
|
|
}
|
|
|
|
content = this.convertGalleryElement( content );
|
|
|
|
this.shortcodesToBuilder( content );
|
|
|
|
this.legacyColumnSpacing();
|
|
this.legacyContainerBorderSize();
|
|
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) {
|
|
this.libraryBuilderToShortcodes();
|
|
} else {
|
|
this.builderToShortcodes();
|
|
}
|
|
},
|
|
|
|
legacyContainerBorderSize: function() {
|
|
this.collection.each( function( model ) {
|
|
var params;
|
|
if ( 'fusion_builder_container' === model.get( 'type' ) ) {
|
|
params = model.get( 'params' );
|
|
|
|
// Check if we have an old border-size. If we do, then we need to migrate it to the new options
|
|
// and delete the old param.
|
|
if ( 'undefined' !== typeof params.border_size ) {
|
|
if ( '' !== params.border_size ) {
|
|
params.border_sizes_top = isNaN( params.border_size ) ? params.border_size : params.border_size + 'px';
|
|
params.border_sizes_bottom = params.border_sizes_top;
|
|
params.border_sizes_left = '0px';
|
|
params.border_sizes_right = '0px';
|
|
}
|
|
delete params.border_size;
|
|
model.set( 'params', params );
|
|
}
|
|
}
|
|
} );
|
|
},
|
|
|
|
legacyColumnSpacing: function() {
|
|
var self = this,
|
|
rows = {
|
|
parent: {},
|
|
nested: {}
|
|
},
|
|
rowId = 0,
|
|
nestedId = 0,
|
|
nestedCount = 0,
|
|
widthCount = 0,
|
|
column;
|
|
|
|
this.collection.each( function( model ) {
|
|
if ( 'fusion_builder_row' === model.get( 'type' ) ) {
|
|
rowId++;
|
|
} else if ( 'fusion_builder_row_inner' === model.get( 'type' ) ) {
|
|
nestedId++;
|
|
} else if ( 'fusion_builder_column' === model.get( 'type' ) || 'fusion_builder_column_inner' === model.get( 'type' ) ) {
|
|
params = model.get( 'params' );
|
|
width = self.validateColumnWidth( params.type );
|
|
column = {
|
|
model: model
|
|
};
|
|
|
|
if ( 'fusion_builder_column' === model.get( 'type' ) ) {
|
|
widthCount += width;
|
|
if ( 1 < widthCount ) {
|
|
rowId += 1;
|
|
widthCount = width;
|
|
}
|
|
|
|
if ( 'undefined' === typeof rows.parent[ rowId ] ) {
|
|
rows.parent[ rowId ] = [ column ];
|
|
} else {
|
|
rows.parent[ rowId ].push( column );
|
|
}
|
|
} else {
|
|
nestedCount += width;
|
|
if ( 1 < nestedCount ) {
|
|
nestedId += 1;
|
|
nestedCount = width;
|
|
}
|
|
|
|
if ( 'undefined' === typeof rows.nested[ nestedId ] ) {
|
|
rows.nested[ nestedId ] = [ column ];
|
|
} else {
|
|
rows.nested[ nestedId ].push( column );
|
|
}
|
|
}
|
|
}
|
|
} );
|
|
|
|
// Loop over parent rows.
|
|
_.each( rows.parent, function( row, rowIndex ) {
|
|
self.setLegacySpacing( row, rowIndex );
|
|
} );
|
|
|
|
// Loop over nested rows.
|
|
if ( ! _.isEmpty( rows.nested ) ) {
|
|
_.each( rows.nested, function( row, rowIndex ) {
|
|
self.setLegacySpacing( row, rowIndex );
|
|
} );
|
|
}
|
|
},
|
|
|
|
setLegacySpacing: function( row, rowIndex ) {
|
|
var self = this,
|
|
total = row.length,
|
|
lastIndex = total - 1,
|
|
previousSpacing = '',
|
|
emptySpacing = true,
|
|
lastModel = false,
|
|
container = false;
|
|
|
|
// Loop over columns inside virtual row
|
|
_.each( row, function( col, colIndex ) {
|
|
var columnFirst = false,
|
|
columnLast = false,
|
|
model = col.model,
|
|
params = jQuery.extend( true, {}, model.get( 'params' ) ),
|
|
spacing,
|
|
weightedSpacing;
|
|
|
|
// First index
|
|
if ( 0 === colIndex ) {
|
|
columnFirst = true;
|
|
}
|
|
|
|
if ( lastIndex === colIndex ) {
|
|
columnLast = true;
|
|
}
|
|
|
|
params.first = columnFirst;
|
|
params.last = columnLast;
|
|
|
|
// Check if we need legacy column spacing set.
|
|
if ( 'undefined' !== typeof params.spacing ) {
|
|
spacing = params.spacing;
|
|
if ( 'yes' === spacing ) {
|
|
spacing = '4%';
|
|
} else if ( 'no' === spacing ) {
|
|
spacing = '0px';
|
|
}
|
|
if ( '0px' !== spacing && 0 !== spacing && '0' !== spacing ) {
|
|
emptySpacing = false;
|
|
}
|
|
|
|
weightedSpacing = self.getWeightedSpacing( spacing, params, total );
|
|
|
|
// Only set params if both are unset.
|
|
if ( 'undefined' === typeof params.spacing_left && 'undefined' === typeof params.spacing_right ) {
|
|
// Use what is set as right spacing.
|
|
if ( ! params.last ) {
|
|
params.spacing_right = weightedSpacing;
|
|
}
|
|
|
|
// Check right spacing of previous column.
|
|
if ( '' !== previousSpacing ) {
|
|
params.spacing_left = self.getWeightedSpacing( previousSpacing, params, total );
|
|
}
|
|
}
|
|
|
|
previousSpacing = spacing;
|
|
} else {
|
|
emptySpacing = false;
|
|
}
|
|
|
|
lastModel = model;
|
|
model.set( 'params', params );
|
|
} );
|
|
|
|
// If all columns were empty, find parent container based on last col and add 0px.
|
|
if ( lastModel && emptySpacing ) {
|
|
container = this.getParentContainer( lastModel.get( 'cid' ) );
|
|
if ( container ) {
|
|
container.model.attributes.params.flex_column_spacing = '0px';
|
|
}
|
|
}
|
|
},
|
|
|
|
getHalfSpacing: function( value ) {
|
|
var unitlessSpacing = parseFloat( value ),
|
|
unitlessHalf = unitlessSpacing / 2;
|
|
|
|
return value.replace( unitlessSpacing, unitlessHalf );
|
|
},
|
|
|
|
getWeightedSpacing: function( value, params, total ) {
|
|
var width = parseFloat( this.validateColumnWidth( params.type ) ),
|
|
unitlessSpacing = parseFloat( value ),
|
|
unitlessWeighted;
|
|
|
|
total = 'undefined' === typeof total || false === total ? false : parseInt( total );
|
|
|
|
if ( false !== total && 3 > total ) {
|
|
unitlessWeighted = unitlessSpacing * width;
|
|
} else {
|
|
unitlessWeighted = unitlessSpacing / 2;
|
|
}
|
|
|
|
return value.replace( unitlessSpacing, unitlessWeighted );
|
|
},
|
|
|
|
validateColumnWidth: function( columnSize ) {
|
|
var fractions;
|
|
|
|
if ( 'undefined' === typeof columnSize ) {
|
|
columnSize = '1_3';
|
|
}
|
|
|
|
// Fractional value.
|
|
if ( -1 !== columnSize.indexOf( '_' ) ) {
|
|
fractions = columnSize.split( '_' );
|
|
return parseFloat( fractions[ 0 ] ) / parseFloat( fractions[ 1 ] );
|
|
}
|
|
|
|
// Greater than one, assume percentage and divide by 100.
|
|
if ( 1 < parseFloat( columnSize ) ) {
|
|
return parseFloat( columnSize ) / 100;
|
|
}
|
|
|
|
return columnSize;
|
|
},
|
|
|
|
/**
|
|
* Convert shortcodes for the builder.
|
|
*
|
|
* @since 2.0.0
|
|
* @param {string} content - The content.
|
|
* @param {number} parentCID - The parent CID.
|
|
* @param {string} targetEl - If we want to add in relation to a specific element.
|
|
* @param {string} targetPosition - Whether we want to be before or after specific element.
|
|
* @return {string|null}
|
|
*/
|
|
shortcodesToBuilder: function( content, parentCID, targetEl, targetPosition ) {
|
|
var thisEl,
|
|
regExp,
|
|
innerRegExp,
|
|
matches,
|
|
shortcodeTags;
|
|
|
|
// Show blank page layout
|
|
if ( '' === content && ! this.$el.find( '.fusion-builder-blank-page-content' ).length ) {
|
|
this.createBuilderLayout( '[fusion_builder_blank_page][/fusion_builder_blank_page]' );
|
|
|
|
return;
|
|
}
|
|
|
|
thisEl = this;
|
|
shortcodeTags = _.keys( fusionAllElements ).join( '|' );
|
|
regExp = window.wp.shortcode.regexp( shortcodeTags );
|
|
innerRegExp = this.regExpShortcode( shortcodeTags );
|
|
matches = content.match( regExp );
|
|
|
|
_.each( matches, function( shortcode ) {
|
|
|
|
var shortcodeElement = shortcode.match( innerRegExp ),
|
|
shortcodeName = shortcodeElement[ 2 ],
|
|
shortcodeAttributes = '' !== shortcodeElement[ 3 ] ? window.wp.shortcode.attrs( shortcodeElement[ 3 ] ) : '',
|
|
shortcodeContent = 'undefined' !== typeof shortcodeElement[ 5 ] ? shortcodeElement[ 5 ] : '',
|
|
elementCID = FusionPageBuilderViewManager.generateCid(),
|
|
prefixedAttributes = { params: ( {} ) },
|
|
elementSettings,
|
|
key,
|
|
prefixedKey,
|
|
dependencyOption,
|
|
dependencyOptionValue,
|
|
elementContent,
|
|
alpha,
|
|
paging,
|
|
values,
|
|
buttonPrefix,
|
|
radiaDirectionsNew,
|
|
|
|
// Check for shortcodes inside shortcode content
|
|
shortcodesInContent = 'undefined' !== typeof shortcodeContent && '' !== shortcodeContent && shortcodeContent.match( regExp ),
|
|
|
|
// Check if shortcode allows generator
|
|
allowGenerator = 'undefined' !== typeof fusionAllElements[ shortcodeName ].allow_generator ? fusionAllElements[ shortcodeName ].allow_generator : '';
|
|
|
|
elementSettings = {
|
|
type: shortcodeName,
|
|
element_type: shortcodeName,
|
|
cid: elementCID,
|
|
created: 'manually',
|
|
multi: '',
|
|
params: {},
|
|
allow_generator: allowGenerator
|
|
};
|
|
|
|
if ( 'fusion_builder_container' !== shortcodeName || 'fusion_builder_next_page' !== shortcodeName || 'fusion_woo_checkout_form' !== shortcodeName || 'fusion_builder_form_step' !== shortcodeName ) {
|
|
elementSettings.parent = parentCID;
|
|
}
|
|
|
|
if ( 'fusion_builder_container' !== shortcodeName && 'fusion_builder_row' !== shortcodeName && 'fusion_builder_column' !== shortcodeName && 'fusion_builder_column_inner' !== shortcodeName && 'fusion_builder_row_inner' !== shortcodeName && 'fusion_builder_blank_page' !== shortcodeName && 'fusion_builder_next_page' !== shortcodeName && 'fusion_woo_checkout_form' !== shortcodeName && 'fusion_builder_form_step' !== shortcodeName ) {
|
|
|
|
if ( -1 !== shortcodeName.indexOf( 'fusion_' ) ||
|
|
-1 !== shortcodeName.indexOf( 'layerslider' ) ||
|
|
-1 !== shortcodeName.indexOf( 'rev_slider' ) ||
|
|
'undefined' !== typeof fusionAllElements[ shortcodeName ] ) {
|
|
elementSettings.type = 'element';
|
|
}
|
|
}
|
|
|
|
if ( _.isObject( shortcodeAttributes.named ) ) {
|
|
|
|
// If no blend mode is defined, check if we should set to overlay.
|
|
if ( ( 'fusion_builder_container' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) && 'undefined' === typeof shortcodeAttributes.named.background_blend_mode ) {
|
|
backgroundColor = shortcodeAttributes.named.background_color;
|
|
videoBg = 'fusion_builder_container' === shortcodeName && 'undefined' !== typeof shortcodeAttributes.named.video_bg ? shortcodeAttributes.named.video_bg : '';
|
|
|
|
if ( 'fusion_builder_container' === shortcodeName && ( 'undefined' === typeof backgroundColor || '' === backgroundColor ) ) {
|
|
backgroundColor = fusionAllElements[ shortcodeName ].defaults.background_color;
|
|
}
|
|
if ( '' !== backgroundColor ) {
|
|
alphaBackgroundColor = jQuery.AWB_Color( backgroundColor ).alpha();
|
|
if ( 1 > alphaBackgroundColor && 0 !== alphaBackgroundColor && ( '' !== shortcodeAttributes.named.background_image || '' !== videoBg ) ) {
|
|
shortcodeAttributes.named.background_blend_mode = 'overlay';
|
|
}
|
|
}
|
|
}
|
|
|
|
// Correct radial direction params.
|
|
if ( ( 'fusion_builder_container' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) && 'undefined' !== typeof shortcodeAttributes.named.radial_direction ) {
|
|
radiaDirectionsNew = { 'bottom': 'center bottom', 'bottom center': 'center bottom', 'left': 'left center', 'right': 'right center', 'top': 'center top', 'center': 'center center', 'center left': 'left center' };
|
|
|
|
if ( shortcodeAttributes.named.radial_direction in radiaDirectionsNew ) {
|
|
shortcodeAttributes.named.radial_direction = radiaDirectionsNew[ shortcodeAttributes.named.radial_direction ];
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_tb_meta' === shortcodeName ) {
|
|
// Border sizes.
|
|
if ( ( 'undefined' === typeof shortcodeAttributes.named.border_top ||
|
|
'undefined' === typeof shortcodeAttributes.named.border_bottom ||
|
|
'undefined' === typeof shortcodeAttributes.named.border_left ||
|
|
'undefined' === typeof shortcodeAttributes.named.border_right ) &&
|
|
'string' === typeof shortcodeAttributes.named.border_size ) {
|
|
shortcodeAttributes.named.border_top = shortcodeAttributes.named.border_size + 'px';
|
|
shortcodeAttributes.named.border_bottom = shortcodeAttributes.named.border_size + 'px';
|
|
}
|
|
delete shortcodeAttributes.named.border_size;
|
|
}
|
|
|
|
if ( 'fusion_builder_container' === shortcodeName ) {
|
|
// Set flex mode if not set, stops migration on front-end.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.type && 'object' === typeof fusionAllElements.fusion_builder_container ) {
|
|
shortcodeAttributes.named.type = fusionAllElements.fusion_builder_container.defaults.type;
|
|
} else if ( 'undefined' !== typeof fusionBuilderConfig.container_legacy_support && ( '0' === fusionBuilderConfig.container_legacy_support || 0 === fusionBuilderConfig.container_legacy_support || false === fusionBuilderConfig.container_legacy_support ) ) {
|
|
// Is set and legacy mode is off, force to flex.
|
|
shortcodeAttributes.named.type = 'flex';
|
|
}
|
|
// No column align, but equal heights is on, set to stretch.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.flex_align_items && 'undefined' !== typeof shortcodeAttributes.named.equal_height_columns && 'yes' === shortcodeAttributes.named.equal_height_columns ) {
|
|
shortcodeAttributes.named.flex_align_items = 'stretch';
|
|
}
|
|
// No align content, but it is 100% height and centered.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.align_content && 'undefined' !== typeof shortcodeAttributes.named.hundred_percent_height && 'yes' === shortcodeAttributes.named.hundred_percent_height && 'undefined' !== typeof shortcodeAttributes.named.hundred_percent_height_center_content && 'yes' === shortcodeAttributes.named.hundred_percent_height_center_content ) {
|
|
shortcodeAttributes.named.align_content = 'center';
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) {
|
|
// No align self set but ignore equal heights is on.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.align_self && 'undefined' !== typeof shortcodeAttributes.named.min_height && 'none' === shortcodeAttributes.named.min_height ) {
|
|
shortcodeAttributes.named.align_self = 'flex-start';
|
|
}
|
|
|
|
// No align content set, but legacy center_content is on.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.align_content && 'undefined' !== typeof shortcodeAttributes.named.center_content && 'yes' === shortcodeAttributes.named.center_content ) {
|
|
shortcodeAttributes.named.align_content = 'center';
|
|
}
|
|
|
|
// Border sizes.
|
|
if ( ( 'undefined' === typeof shortcodeAttributes.named.border_sizes_top || 'undefined' === typeof shortcodeAttributes.named.border_sizes_bottom || 'undefined' === typeof shortcodeAttributes.named.border_sizes_left || 'undefined' === typeof shortcodeAttributes.named.border_sizes_right ) && 'string' === typeof shortcodeAttributes.named.border_size ) {
|
|
switch ( shortcodeAttributes.named.border_position ) {
|
|
case 'all':
|
|
shortcodeAttributes.named.border_sizes_top = shortcodeAttributes.named.border_size;
|
|
shortcodeAttributes.named.border_sizes_bottom = shortcodeAttributes.named.border_size;
|
|
shortcodeAttributes.named.border_sizes_left = shortcodeAttributes.named.border_size;
|
|
shortcodeAttributes.named.border_sizes_right = shortcodeAttributes.named.border_size;
|
|
break;
|
|
|
|
default:
|
|
shortcodeAttributes.named[ 'border_sizes_' + shortcodeAttributes.named.border_position ] = shortcodeAttributes.named.border_size;
|
|
}
|
|
delete shortcodeAttributes.named.border_size;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_fontawesome' === shortcodeName ) {
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.iconcolor_hover && 'string' === typeof shortcodeAttributes.named.iconcolor ) {
|
|
shortcodeAttributes.named.iconcolor_hover = shortcodeAttributes.named.iconcolor;
|
|
}
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.circlecolor_hover && 'string' === typeof shortcodeAttributes.named.circlecolor ) {
|
|
shortcodeAttributes.named.circlecolor_hover = shortcodeAttributes.named.circlecolor;
|
|
}
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.circlebordercolor_hover && 'string' === typeof shortcodeAttributes.named.circlebordercolor ) {
|
|
shortcodeAttributes.named.circlebordercolor_hover = shortcodeAttributes.named.circlebordercolor;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_title' === shortcodeName ) {
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.margin_top_small && 'string' === typeof shortcodeAttributes.named.margin_top_mobile ) {
|
|
shortcodeAttributes.named.margin_top_small = shortcodeAttributes.named.margin_top_mobile;
|
|
}
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.margin_bottom_small && 'string' === typeof shortcodeAttributes.named.margin_bottom_mobile ) {
|
|
shortcodeAttributes.named.margin_bottom_small = shortcodeAttributes.named.margin_bottom_mobile;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_countdown' === shortcodeName ) {
|
|
|
|
// Correct old combined border radius setting.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.counter_border_radius && 'string' === typeof shortcodeAttributes.named.border_radius ) {
|
|
shortcodeAttributes.named.counter_border_radius = shortcodeAttributes.named.border_radius;
|
|
}
|
|
|
|
// Correct the label text color.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.label_color && 'string' === typeof shortcodeAttributes.named.counter_text_color ) {
|
|
shortcodeAttributes.named.label_color = shortcodeAttributes.named.counter_text_color;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_widget' === shortcodeName ) {
|
|
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.margin_top && 'undefined' === typeof shortcodeAttributes.named.margin_right && 'undefined' === typeof shortcodeAttributes.named.margin_bottom && 'undefined' === typeof shortcodeAttributes.named.margin_left && '' !== shortcodeAttributes.named.fusion_margin ) {
|
|
shortcodeAttributes.named.margin_top = shortcodeAttributes.named.fusion_margin;
|
|
shortcodeAttributes.named.margin_right = shortcodeAttributes.named.fusion_margin;
|
|
shortcodeAttributes.named.margin_bottom = shortcodeAttributes.named.fusion_margin;
|
|
shortcodeAttributes.named.margin_left = shortcodeAttributes.named.fusion_margin;
|
|
}
|
|
}
|
|
|
|
for ( key in shortcodeAttributes.named ) {
|
|
|
|
prefixedKey = key;
|
|
if ( ( 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) && 'type' === prefixedKey ) {
|
|
prefixedKey = 'layout';
|
|
|
|
prefixedAttributes[ prefixedKey ] = shortcodeAttributes.named[ key ];
|
|
}
|
|
|
|
prefixedAttributes.params[ prefixedKey ] = shortcodeAttributes.named[ key ];
|
|
if ( 'fusion_products_slider' === shortcodeName && 'cat_slug' === key ) {
|
|
prefixedAttributes.params.cat_slug = shortcodeAttributes.named[ key ].replace( /\|/g, ',' );
|
|
}
|
|
if ( 'gradient_colors' === key ) {
|
|
delete prefixedAttributes.params[ prefixedKey ];
|
|
if ( -1 !== shortcodeAttributes.named[ key ].indexOf( '|' ) ) {
|
|
prefixedAttributes.params.button_gradient_top_color = shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' );
|
|
prefixedAttributes.params.button_gradient_bottom_color = shortcodeAttributes.named[ key ].split( '|' )[ 1 ] ? shortcodeAttributes.named[ key ].split( '|' )[ 1 ].replace( 'transparent', 'rgba(255,255,255,0)' ) : shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' );
|
|
} else {
|
|
prefixedAttributes.params.button_gradient_bottom_color = prefixedAttributes.params.button_gradient_top_color = shortcodeAttributes.named[ key ].replace( 'transparent', 'rgba(255,255,255,0)' );
|
|
}
|
|
}
|
|
if ( 'gradient_hover_colors' === key ) {
|
|
delete prefixedAttributes.params[ prefixedKey ];
|
|
if ( -1 !== shortcodeAttributes.named[ key ].indexOf( '|' ) ) {
|
|
prefixedAttributes.params.button_gradient_top_color_hover = shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' );
|
|
prefixedAttributes.params.button_gradient_bottom_color_hover = shortcodeAttributes.named[ key ].split( '|' )[ 1 ] ? shortcodeAttributes.named[ key ].split( '|' )[ 1 ].replace( 'transparent', 'rgba(255,255,255,0)' ) : shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' );
|
|
} else {
|
|
prefixedAttributes.params.button_gradient_bottom_color_hover = prefixedAttributes.params.button_gradient_top_color_hover = shortcodeAttributes.named[ key ].replace( 'transparent', 'rgba(255,255,255,0)' );
|
|
}
|
|
}
|
|
if ( 'overlay_color' === key && '' !== shortcodeAttributes.named[ key ] && 'fusion_builder_container' === shortcodeName ) {
|
|
delete prefixedAttributes.params[ prefixedKey ];
|
|
alpha = ( 'undefined' !== typeof shortcodeAttributes.named.overlay_opacity ) ? shortcodeAttributes.named.overlay_opacity : 1;
|
|
prefixedAttributes.params.background_color = jQuery.AWB_Color( shortcodeAttributes.named[ key ] ).alpha( alpha ).toRgbaString();
|
|
}
|
|
if ( 'overlay_opacity' === key ) {
|
|
delete prefixedAttributes.params[ prefixedKey ];
|
|
}
|
|
if ( 'scrolling' === key && 'fusion_blog' === shortcodeName ) {
|
|
delete prefixedAttributes.params.paging;
|
|
paging = ( 'undefined' !== typeof shortcodeAttributes.named.paging ) ? shortcodeAttributes.named.paging : '';
|
|
if ( 'no' === paging && 'pagination' === shortcodeAttributes.named.scrolling ) {
|
|
prefixedAttributes.params.scrolling = 'no';
|
|
}
|
|
}
|
|
|
|
// The grid-with-text layout was removed in Avada 5.2, so layout has to
|
|
// be converted to grid. And boxed_layout was replaced by new text_layout.
|
|
if ( 'fusion_portfolio' === shortcodeName ) {
|
|
if ( 'layout' === key ) {
|
|
if ( 'grid' === shortcodeAttributes.named[ key ] && shortcodeAttributes.named.hasOwnProperty( 'boxed_text' ) ) {
|
|
shortcodeAttributes.named.boxed_text = 'no_text';
|
|
} else if ( 'grid-with-text' === shortcodeAttributes.named[ key ] ) {
|
|
prefixedAttributes.params[ key ] = 'grid';
|
|
}
|
|
}
|
|
|
|
if ( 'boxed_text' === key ) {
|
|
prefixedAttributes.params.text_layout = shortcodeAttributes.named[ key ];
|
|
delete prefixedAttributes.params[ key ];
|
|
}
|
|
|
|
if ( 'content_length' === key && 'full-content' === shortcodeAttributes.named[ key ] ) {
|
|
prefixedAttributes.params[ key ] = 'full_content';
|
|
}
|
|
|
|
}
|
|
|
|
// Make sure the background hover color is set to border color, if it does not exist already.
|
|
if ( 'fusion_pricing_table' === shortcodeName ) {
|
|
if ( 'backgroundcolor' === key && ! shortcodeAttributes.named.hasOwnProperty( 'background_color_hover' ) ) {
|
|
prefixedAttributes.params.background_color_hover = shortcodeAttributes.named.bordercolor;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_title' === shortcodeName ) {
|
|
if ( 'on' === shortcodeAttributes.named.loop_animation ) {
|
|
prefixedAttributes.params.loop_animation = 'loop';
|
|
}
|
|
if ( 'off' === shortcodeAttributes.named.loop_animation ) {
|
|
prefixedAttributes.params.loop_animation = 'once';
|
|
}
|
|
}
|
|
|
|
if ( 'type' === key && ( 'fusion_widget' === shortcodeName ) && -1 !== prefixedAttributes.params[ key ].indexOf( 'Tribe' ) ) {
|
|
prefixedAttributes.params[ key ] = prefixedAttributes.params[ key ].replace( /\\/g, '' ).split( /(?=[A-Z])/ ).join( '\\' ).replace( '_\\', '_' );
|
|
}
|
|
|
|
if ( 'padding' === key && ( 'fusion_widget_area' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) ) {
|
|
values = shortcodeAttributes.named[ key ].split( ' ' );
|
|
|
|
if ( 1 === values.length ) {
|
|
prefixedAttributes.params.padding_top = values[ 0 ];
|
|
prefixedAttributes.params.padding_right = values[ 0 ];
|
|
prefixedAttributes.params.padding_bottom = values[ 0 ];
|
|
prefixedAttributes.params.padding_left = values[ 0 ];
|
|
}
|
|
|
|
if ( 2 === values.length ) {
|
|
prefixedAttributes.params.padding_top = values[ 0 ];
|
|
prefixedAttributes.params.padding_right = values[ 1 ];
|
|
prefixedAttributes.params.padding_bottom = values[ 0 ];
|
|
prefixedAttributes.params.padding_left = values[ 1 ];
|
|
}
|
|
|
|
if ( 3 === values.length ) {
|
|
prefixedAttributes.params.padding_top = values[ 0 ];
|
|
prefixedAttributes.params.padding_right = values[ 1 ];
|
|
prefixedAttributes.params.padding_bottom = values[ 2 ];
|
|
prefixedAttributes.params.padding_left = values[ 1 ];
|
|
}
|
|
|
|
if ( 4 === values.length ) {
|
|
prefixedAttributes.params.padding_top = values[ 0 ];
|
|
prefixedAttributes.params.padding_right = values[ 1 ];
|
|
prefixedAttributes.params.padding_bottom = values[ 2 ];
|
|
prefixedAttributes.params.padding_left = values[ 3 ];
|
|
}
|
|
|
|
delete prefixedAttributes.params[ key ];
|
|
}
|
|
}
|
|
|
|
// Ensures backwards compatibility for the widget element border_color option of the vertical menu.
|
|
if ( 'fusion_widget' === shortcodeName && 'Fusion_Widget_Vertical_Menu' === shortcodeAttributes.named.type && 'undefined' === typeof shortcodeAttributes.named.fusion_divider_color ) {
|
|
prefixedAttributes.params.fusion_divider_color = shortcodeAttributes.named.fusion_widget_vertical_menu__border_color;
|
|
delete prefixedAttributes.params.fusion_widget_vertical_menu__border_color;
|
|
}
|
|
|
|
// Ensures backwards compatibility for the table style in table element.
|
|
if ( 'fusion_table' === shortcodeName && 'undefined' === typeof shortcodeAttributes.named.fusion_table_type ) {
|
|
if ( '1' === shortcodeContent.charAt( 18 ) || '2' === shortcodeContent.charAt( 18 ) ) {
|
|
prefixedAttributes.params.fusion_table_type = shortcodeContent.charAt( 18 );
|
|
}
|
|
}
|
|
|
|
// Fix old values of image_width in content boxes and flip boxes and children.
|
|
if ( 'fusion_content_boxes' === shortcodeName || 'fusion_flip_boxes' === shortcodeName ) {
|
|
if ( 'undefined' !== typeof shortcodeAttributes.named.image_width ) {
|
|
prefixedAttributes.params.image_max_width = shortcodeAttributes.named.image_width;
|
|
}
|
|
|
|
shortcodeContent = shortcodeContent.replace( /image_width/g, 'image_max_width' );
|
|
}
|
|
|
|
if ( 'fusion_button' === shortcodeName || 'fusion_tagline_box' === shortcodeName ) {
|
|
buttonPrefix = 'fusion_tagline_box' === shortcodeName ? 'button_' : '';
|
|
|
|
// Ensures backwards compatibility for button shape.
|
|
if ( 'undefined' !== typeof shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) {
|
|
if ( 'square' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) {
|
|
prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '0';
|
|
} else if ( 'round' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) {
|
|
prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '2';
|
|
|
|
if ( '3d' === shortcodeAttributes.named.type ) {
|
|
prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '4';
|
|
}
|
|
} else if ( 'pill' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) {
|
|
prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '25';
|
|
} else if ( '' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) {
|
|
prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '';
|
|
}
|
|
|
|
delete prefixedAttributes.params[ buttonPrefix + 'shape' ];
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_button' === shortcodeName ) {
|
|
// Ensures backwards compatibility for button border color.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.border_color && 'undefined' !== typeof shortcodeAttributes.named.accent_color && '' !== shortcodeAttributes.named.accent_color ) {
|
|
prefixedAttributes.params.border_color = shortcodeAttributes.named.accent_color;
|
|
}
|
|
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.border_hover_color && 'undefined' !== typeof shortcodeAttributes.named.accent_hover_color && '' !== shortcodeAttributes.named.accent_hover_color ) {
|
|
prefixedAttributes.params.border_hover_color = shortcodeAttributes.named.accent_hover_color;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_button' === shortcodeName || 'fusion_form_submit' === shortcodeName ) {
|
|
// Split border width into 4.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.border_top && 'undefined' !== typeof shortcodeAttributes.named.border_width && '' !== shortcodeAttributes.named.border_width ) {
|
|
prefixedAttributes.params.border_top = parseInt( shortcodeAttributes.named.border_width ) + 'px';
|
|
prefixedAttributes.params.border_right = prefixedAttributes.params.border_top;
|
|
prefixedAttributes.params.border_bottom = prefixedAttributes.params.border_top;
|
|
prefixedAttributes.params.border_left = prefixedAttributes.params.border_top;
|
|
delete shortcodeAttributes.named.border_width;
|
|
}
|
|
|
|
// Split border radius into 4.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.border_radius_top_left && 'undefined' !== typeof shortcodeAttributes.named.border_radius && '' !== shortcodeAttributes.named.border_radius ) {
|
|
prefixedAttributes.params.border_radius_top_left = parseInt( shortcodeAttributes.named.border_radius ) + 'px';
|
|
prefixedAttributes.params.border_radius_top_right = prefixedAttributes.params.border_radius_top_left;
|
|
prefixedAttributes.params.border_radius_bottom_right = prefixedAttributes.params.border_radius_top_left;
|
|
prefixedAttributes.params.border_radius_bottom_left = prefixedAttributes.params.border_radius_top_left;
|
|
delete shortcodeAttributes.named.border_radius;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_alert' === shortcodeName ) {
|
|
if ( 'undefined' !== typeof shortcodeAttributes.named.dismissable && 'yes' === shortcodeAttributes.named.dismissable ) {
|
|
prefixedAttributes.params.dismissable = 'boxed';
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_images' === shortcodeName ) {
|
|
if ( 'undefined' !== typeof shortcodeAttributes.named.border && 'yes' === shortcodeAttributes.named.border ) {
|
|
prefixedAttributes.params.border_width = '1';
|
|
prefixedAttributes.params.border_color = '#e9eaee';
|
|
delete prefixedAttributes.params.border;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_tagline_box' === shortcodeName ) {
|
|
// Split border radius into 4.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.button_border_radius_top_left && 'undefined' !== typeof shortcodeAttributes.named.button_border_radius && '' !== shortcodeAttributes.named.button_border_radius ) {
|
|
prefixedAttributes.params.button_border_radius_top_left = parseInt( shortcodeAttributes.named.border_radius ) + 'px';
|
|
prefixedAttributes.params.button_border_radius_top_right = prefixedAttributes.params.button_border_radius_top_left;
|
|
prefixedAttributes.params.button_border_radius_bottom_right = prefixedAttributes.params.button_border_radius_top_left;
|
|
prefixedAttributes.params.button_border_radius_bottom_left = prefixedAttributes.params.button_border_radius_top_left;
|
|
delete shortcodeAttributes.named.button_border_radius;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_tb_woo_cart' === shortcodeName || 'fusion_tb_woo_reviews' === shortcodeName || 'fusion_post_card_cart' === shortcodeName || 'fusion_tb_woo_checkout_payment' === shortcodeName ) {
|
|
// Split border width into 4.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.button_border_top && 'undefined' !== typeof shortcodeAttributes.named.button_border_width && '' !== shortcodeAttributes.named.button_border_width ) {
|
|
prefixedAttributes.params.button_border_top = parseInt( shortcodeAttributes.named.button_border_width ) + 'px';
|
|
prefixedAttributes.params.button_border_right = prefixedAttributes.params.button_border_top;
|
|
prefixedAttributes.params.button_border_bottom = prefixedAttributes.params.button_border_top;
|
|
prefixedAttributes.params.button_border_left = prefixedAttributes.params.button_border_top;
|
|
delete shortcodeAttributes.named.button_border_width;
|
|
}
|
|
}
|
|
|
|
if ( 'fusion_post_card_cart' === shortcodeName ) {
|
|
// Split border width into 4.
|
|
if ( 'undefined' === typeof shortcodeAttributes.named.button_details_border_top && 'undefined' !== typeof shortcodeAttributes.named.button_details_border_width && '' !== shortcodeAttributes.named.button_details_border_width ) {
|
|
prefixedAttributes.params.button_details_border_top = parseInt( shortcodeAttributes.named.button_details_border_width ) + 'px';
|
|
prefixedAttributes.params.button_details_border_right = prefixedAttributes.params.button_details_border_top;
|
|
prefixedAttributes.params.button_details_border_bottom = prefixedAttributes.params.button_details_border_top;
|
|
prefixedAttributes.params.button_details_border_left = prefixedAttributes.params.button_details_border_top;
|
|
delete shortcodeAttributes.named.button_details_border_width;
|
|
}
|
|
}
|
|
|
|
// Ensures backwards compatibility for register note in user registration element.
|
|
if ( 'fusion_register' === shortcodeName && 'undefined' === typeof shortcodeAttributes.named.register_note ) {
|
|
prefixedAttributes.params.register_note = fusionBuilderText.user_login_register_note;
|
|
}
|
|
|
|
elementSettings = _.extend( elementSettings, prefixedAttributes );
|
|
}
|
|
|
|
if ( ! shortcodesInContent && 'fusion_builder_column' !== shortcodeName ) {
|
|
elementSettings.params.element_content = shortcodeContent;
|
|
}
|
|
|
|
// Compare shortcode name to multi elements object / array
|
|
if ( shortcodeName in fusionMultiElements ) {
|
|
elementSettings.multi = 'multi_element_parent';
|
|
}
|
|
|
|
// Set content for elements with dependency options
|
|
if ( 'undefined' !== typeof fusionAllElements[ shortcodeName ].option_dependency ) {
|
|
dependencyOption = fusionAllElements[ shortcodeName ].option_dependency;
|
|
dependencyOptionValue = prefixedAttributes.params[ dependencyOption ];
|
|
elementContent = prefixedAttributes.params.element_content;
|
|
prefixedAttributes.params[ dependencyOptionValue ] = elementContent;
|
|
}
|
|
|
|
if ( shortcodesInContent ) {
|
|
if ( 'fusion_builder_container' !== shortcodeName && 'fusion_builder_row' !== shortcodeName && 'fusion_builder_row_inner' !== shortcodeName && 'fusion_builder_column' !== shortcodeName && 'fusion_builder_column_inner' !== shortcodeName && 'fusion_builder_next_page' !== shortcodeName && 'fusion_woo_checkout_form' !== shortcodeName && 'fusion_builder_form_step' !== shortcodeName ) {
|
|
elementSettings.params.element_content = shortcodeContent;
|
|
}
|
|
}
|
|
|
|
if ( 'undefined' !== typeof targetEl && targetEl ) {
|
|
elementSettings.targetElement = targetEl;
|
|
}
|
|
if ( 'undefined' !== typeof targetPosition && targetPosition ) {
|
|
elementSettings.targetElementPosition = targetPosition;
|
|
}
|
|
|
|
thisEl.collection.add( [ elementSettings ] );
|
|
|
|
if ( shortcodesInContent ) {
|
|
|
|
if ( 'fusion_builder_container' === shortcodeName || 'fusion_builder_row' === shortcodeName || 'fusion_builder_row_inner' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) {
|
|
thisEl.shortcodesToBuilder( shortcodeContent, elementCID );
|
|
}
|
|
}
|
|
} );
|
|
},
|
|
|
|
addBuilderElement: function( element ) {
|
|
|
|
var view,
|
|
viewSettings = {
|
|
model: element,
|
|
collection: FusionPageBuilderElements
|
|
},
|
|
parentModel,
|
|
elementType,
|
|
previewView;
|
|
|
|
switch ( element.get( 'type' ) ) {
|
|
|
|
case 'fusion_builder_blank_page':
|
|
|
|
if ( 'undefined' !== typeof fusionBuilderConfig.post_type && 'fusion_form' === fusionBuilderConfig.post_type ) {
|
|
viewSettings.className = 'fusion_builder_blank_page';
|
|
view = new FusionPageBuilder.BlankFormView( viewSettings );
|
|
} else {
|
|
view = new FusionPageBuilder.BlankPageView( viewSettings );
|
|
}
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'view' ) ) ) {
|
|
element.get( 'view' ).$el.after( view.render().el );
|
|
|
|
} else {
|
|
this.$el.find( '#fusion_builder_container' ).append( view.render().el );
|
|
}
|
|
|
|
break;
|
|
|
|
case 'fusion_builder_container':
|
|
|
|
// Check custom container position
|
|
if ( '' !== FusionPageBuilderApp.targetContainerCID ) {
|
|
element.attributes.view = FusionPageBuilderViewManager.getView( FusionPageBuilderApp.targetContainerCID );
|
|
|
|
FusionPageBuilderApp.targetContainerCID = '';
|
|
}
|
|
|
|
view = new FusionPageBuilder.ContainerView( viewSettings );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'view' ) ) ) {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) {
|
|
element.get( 'view' ).$el.after( view.render().el );
|
|
} else {
|
|
element.get( 'view' ).$el.before( view.render().el );
|
|
}
|
|
|
|
} else {
|
|
this.$el.find( '#fusion_builder_container' ).append( view.render().el );
|
|
this.$el.find( '.fusion_builder_blank_page' ).remove();
|
|
}
|
|
|
|
// Add row if needed
|
|
if ( 'manually' !== element.get( 'created' ) ) {
|
|
view.addRow();
|
|
}
|
|
|
|
// Check if container is toggled
|
|
if ( ! _.isUndefined( element.attributes.params.admin_toggled ) && 'no' === element.attributes.params.admin_toggled || _.isUndefined( element.attributes.params.admin_toggled ) ) {
|
|
FusionPageBuilderApp.toggledContainers = false;
|
|
$( '.fusion-builder-layout-buttons-toggle-containers' ).find( 'span' ).addClass( 'dashicons-arrow-up' ).removeClass( 'dashicons-arrow-down' );
|
|
}
|
|
|
|
break;
|
|
|
|
case 'fusion_builder_row':
|
|
|
|
view = new FusionPageBuilder.RowView( viewSettings );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).length ) {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).append( view.render().el );
|
|
|
|
} else {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '> .fusion-builder-add-element' ).hide().end().append( view.render().el );
|
|
}
|
|
|
|
// Add parent view to inner rows that have been converted from shortcodes
|
|
if ( 'manually' === element.get( 'created' ) && 'row_inner' === element.get( 'element_type' ) ) {
|
|
element.set( 'view', FusionPageBuilderViewManager.getView( element.get( 'parent' ) ), { silent: true } );
|
|
}
|
|
|
|
break;
|
|
|
|
case 'fusion_builder_row_inner':
|
|
|
|
FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' );
|
|
|
|
view = new FusionPageBuilder.InnerRowView( viewSettings );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
// TODO - Check appendAfter.
|
|
if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) {
|
|
element.get( 'appendAfter' ).after( view.render().el );
|
|
element.unset( 'appendAfter' );
|
|
|
|
} else if ( FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).length ) {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).append( view.render().el );
|
|
|
|
} else if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) {
|
|
element.get( 'targetElement' ).after( view.render().el );
|
|
} else {
|
|
element.get( 'targetElement' ).before( view.render().el );
|
|
}
|
|
} else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '> .fusion-builder-add-element' ).before( view.render().el );
|
|
} else {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '> .fusion-builder-column-controls' ).after( view.render().el );
|
|
}
|
|
|
|
// Add parent view to inner rows that have been converted from shortcodes
|
|
if ( 'manually' === element.get( 'created' ) && 'row_inner' === element.get( 'element_type' ) ) {
|
|
element.set( 'view', FusionPageBuilderViewManager.getView( element.get( 'parent' ) ), { silent: true } );
|
|
}
|
|
|
|
break;
|
|
|
|
case 'fusion_builder_column':
|
|
|
|
if ( element.get( 'layout' ) ) {
|
|
viewSettings.className = 'fusion-builder-column fusion-builder-column-outer fusion-builder-column-' + element.get( 'layout' );
|
|
|
|
view = new FusionPageBuilder.ColumnView( viewSettings );
|
|
|
|
// This column was cloned
|
|
if ( ! _.isUndefined( element.get( 'cloned' ) ) && true === element.get( 'cloned' ) ) {
|
|
element.targetElement = view.$el;
|
|
element.unset( 'cloned' );
|
|
}
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) {
|
|
element.get( 'targetElement' ).after( view.render().el );
|
|
} else {
|
|
element.get( 'targetElement' ).before( view.render().el );
|
|
}
|
|
} else {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container' ).append( view.render().el );
|
|
} else {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container .fusion-builder-empty-section' ).after( view.render().el );
|
|
}
|
|
element.unset( 'from' );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'fusion_builder_column_inner':
|
|
|
|
viewSettings.className = 'fusion-builder-column fusion-builder-column-inner fusion-builder-column-' + element.get( 'layout' );
|
|
|
|
view = new FusionPageBuilder.NestedColumnView( viewSettings );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) {
|
|
element.get( 'targetElement' ).after( view.render().el );
|
|
} else {
|
|
element.get( 'targetElement' ).before( view.render().el );
|
|
}
|
|
} else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container-inner' ).append( view.render().el );
|
|
} else {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container-inner' ).prepend( view.render().el );
|
|
}
|
|
break;
|
|
|
|
case 'element':
|
|
|
|
viewSettings.attributes = {
|
|
'data-cid': element.get( 'cid' )
|
|
};
|
|
|
|
// Multi element child
|
|
if ( 'undefined' !== typeof element.get( 'multi' ) && 'multi_element_child' === element.get( 'multi' ) ) {
|
|
|
|
view = new FusionPageBuilder.MultiElementSortableChild( viewSettings );
|
|
|
|
element.targetElement = view.$el;
|
|
|
|
element.attributes.view.child_views.push( view );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'targetElement' ) ) ) {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) {
|
|
element.get( 'targetElement' ).after( view.render().el );
|
|
} else {
|
|
element.get( 'targetElement' ).before( view.render().el );
|
|
}
|
|
|
|
} else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-sortable-options' ).append( view.render().el );
|
|
} else {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-sortable-options' ).prepend( view.render().el );
|
|
}
|
|
|
|
// This child was cloned
|
|
if ( ! _.isUndefined( element.get( 'titleLabel' ) ) ) {
|
|
if ( ! _.isUndefined( element.get( 'cloned' ) ) ) {
|
|
view.$el.find( '.multi-element-child-name' ).html( element.get( 'titleLabel' ) );
|
|
}
|
|
element.unset( 'cloned' );
|
|
}
|
|
|
|
// Standard element
|
|
} else {
|
|
|
|
FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' );
|
|
|
|
view = new FusionPageBuilder.ElementView( viewSettings );
|
|
|
|
// Get element parent
|
|
parentModel = this.collection.find( function( model ) {
|
|
return model.get( 'cid' ) === element.get( 'parent' );
|
|
} );
|
|
|
|
// Add element builder view to proper column
|
|
if ( 'undefined' !== typeof parentModel && 'fusion_builder_column_inner' === parentModel.get( 'type' ) ) {
|
|
|
|
if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) {
|
|
element.get( 'targetElement' ).after( view.render().el );
|
|
} else {
|
|
element.get( 'targetElement' ).before( view.render().el );
|
|
}
|
|
} else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-add-element' ).before( view.render().el );
|
|
} else {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.prepend( view.render().el );
|
|
}
|
|
|
|
} else if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) {
|
|
if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) {
|
|
element.get( 'targetElement' ).after( view.render().el );
|
|
} else {
|
|
element.get( 'targetElement' ).before( view.render().el );
|
|
}
|
|
} else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) { // TO-DO: Check why this doesn't work. Will be wrong parent no doubt.
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-add-element:not(.fusion-builder-column-inner .fusion-builder-add-element)' ).before( view.render().el );
|
|
} else {
|
|
FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.prepend( view.render().el );
|
|
}
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
// Check if element was added manually
|
|
if ( 'manually' === element.get( 'added' ) ) {
|
|
|
|
viewSettings.attributes = {
|
|
'data-modal_view': 'element_settings'
|
|
};
|
|
|
|
view = new FusionPageBuilder.ModalView( viewSettings );
|
|
|
|
$( 'body' ).append( view.render().el );
|
|
|
|
// Generate element preview
|
|
} else {
|
|
|
|
elementType = element.get( 'element_type' );
|
|
|
|
if ( 'undefined' !== typeof fusionAllElements[ elementType ].preview ) {
|
|
|
|
previewView = new FusionPageBuilder.ElementPreviewView( viewSettings );
|
|
view.$el.find( '.fusion-builder-module-preview' ).append( previewView.render().el );
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 'generated_element':
|
|
|
|
FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' );
|
|
|
|
// Ignore modals for columns inserted with generator
|
|
if ( 'fusion_builder_column_inner' !== element.get( 'element_type' ) && 'fusion_builder_column' !== element.get( 'element_type' ) ) {
|
|
|
|
viewSettings.attributes = {
|
|
'data-modal_view': 'element_settings'
|
|
};
|
|
view = new FusionPageBuilder.ModalView( viewSettings );
|
|
$( 'body' ).append( view.render().el );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'fusion_builder_next_page':
|
|
view = new FusionPageBuilder.NextPage( viewSettings );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) {
|
|
|
|
// TODO - Check appendAfter.
|
|
if ( ! element.get( 'appendAfter' ).next().next().hasClass( 'fusion-builder-next-page' ) ) {
|
|
element.get( 'appendAfter' ).after( view.render().el );
|
|
}
|
|
} else {
|
|
$( '.fusion_builder_container:last-child' ).after( view.render().el );
|
|
}
|
|
|
|
break;
|
|
|
|
case 'fusion_builder_form_step':
|
|
view = new FusionPageBuilder.FormStep( viewSettings );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'appendAfter' ) ) && element.get( 'appendAfter' ).length ) {
|
|
|
|
element.get( 'appendAfter' ).after( view.render().el );
|
|
} else {
|
|
this.$el.find( '#fusion_builder_container' ).append( view.render().el );
|
|
this.$el.find( '.fusion_builder_blank_page' ).remove();
|
|
}
|
|
|
|
break;
|
|
|
|
case 'fusion_woo_checkout_form':
|
|
view = new FusionPageBuilder.checkoutForm( viewSettings );
|
|
|
|
FusionPageBuilderViewManager.addView( element.get( 'cid' ), view );
|
|
|
|
if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) {
|
|
|
|
// TODO - Check appendAfter.
|
|
if ( 2 > this.$el.find( '.fusion-checkout-form' ).length ) {
|
|
element.get( 'appendAfter' ).after( view.render().el );
|
|
}
|
|
} else if ( ! $( '.fusion_builder_container:last-child' ).length ) {
|
|
$( '#fusion_builder_container' ).append( view.render().el );
|
|
} else {
|
|
$( '.fusion_builder_container:last-child' ).after( view.render().el );
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
},
|
|
|
|
regExpShortcode: _.memoize( function( tag ) {
|
|
return new RegExp( '\\[(\\[?)(' + tag + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)' );
|
|
} ),
|
|
|
|
findShortcodeMatches: function( content, match ) {
|
|
|
|
var shortcodeMatches,
|
|
shortcodeRegExp,
|
|
shortcodeInnerRegExp;
|
|
|
|
if ( _.isObject( content ) ) {
|
|
content = content.value;
|
|
}
|
|
|
|
shortcodeMatches = '';
|
|
content = 'undefined' !== typeof content ? content : '';
|
|
shortcodeRegExp = window.wp.shortcode.regexp( match );
|
|
shortcodeInnerRegExp = new RegExp( '\\[(\\[?)(' + match + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)' );
|
|
|
|
if ( 'undefined' !== typeof content && '' !== content ) {
|
|
shortcodeMatches = content.match( shortcodeRegExp );
|
|
}
|
|
|
|
return shortcodeMatches;
|
|
},
|
|
|
|
beforeGenerateShortcode: function( elementCID ) {
|
|
var elementView = FusionPageBuilderViewManager.getView( elementCID ),
|
|
elementType = elementView.model.get( 'element_type' ),
|
|
options = fusionAllElements[ elementType ].params,
|
|
values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, elementView.model.get( 'params' ) ),
|
|
iconWithoutFusionPrefix;
|
|
|
|
if ( 'object' !== typeof options ) {
|
|
return;
|
|
}
|
|
|
|
// If images needs replaced lets check element to see if we have media being used to add to object.
|
|
if ( 'undefined' !== typeof fusionBuilderConfig.replaceAssets && fusionBuilderConfig.replaceAssets && ( '-1' !== jQuery( 'body' ).attr( 'class' ).indexOf( 'fusion-element-post-type-' ) || 'fusion_template' === fusionBuilderConfig.post_type ) ) {
|
|
|
|
this.mapStudioImages( options, values );
|
|
|
|
if ( 'undefined' !== typeof elementView.model.get( 'multi' ) && 'multi_element_parent' === elementView.model.get( 'multi' ) && '' !== values.element_content ) {
|
|
this.createMultiElementParentMediaMap( fusionAllElements[ elementType ].element_child, values.element_content );
|
|
}
|
|
|
|
|
|
// TODO: should just be on image view.
|
|
if ( 'fusion_imageframe' === elementType && '' !== values.element_content ) {
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ values.element_content ] ) {
|
|
FusionPageBuilderApp.mediaMap.images[ values.element_content ] = true;
|
|
}
|
|
|
|
// Check if we have an image ID for this param.
|
|
if ( 'undefined' !== typeof values.image_id && '' !== values.image_id ) {
|
|
if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.images[ values.element_content ] ) {
|
|
FusionPageBuilderApp.mediaMap.images[ values.element_content ] = {};
|
|
}
|
|
FusionPageBuilderApp.mediaMap.images[ values.element_content ].image_id = values.image_id;
|
|
}
|
|
}
|
|
|
|
// TODO: move to menu view.
|
|
if ( 'fusion_menu' === elementType && '' !== values.menu ) {
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.menus[ values.menu ] ) {
|
|
FusionPageBuilderApp.mediaMap.menus[ values.menu ] = true;
|
|
}
|
|
}
|
|
|
|
// TODO: move this when above are moved as well.
|
|
if ( 'fusion_form' === elementType && '' !== values.form_post_id ) {
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.forms[ values.form_post_id ] ) {
|
|
FusionPageBuilderApp.mediaMap.forms[ values.form_post_id ] = true;
|
|
}
|
|
}
|
|
|
|
// Add custom icons that used in forms to media map.
|
|
if ( this.isString( elementType ) && elementType.startsWith( 'fusion_form_' ) && this.isString( values.input_field_icon ) && 'fusion-prefix-' === values.input_field_icon.substr( 0, 14 ) ) {
|
|
if ( 'undefined' !== typeof fusionBuilderConfig.customIcons ) {
|
|
iconWithoutFusionPrefix = values.input_field_icon.substr( 14 );
|
|
|
|
// TODO: try to optimize this check.
|
|
jQuery.each( fusionBuilderConfig.customIcons, function( iconPostName, iconSet ) {
|
|
|
|
if ( 0 === iconWithoutFusionPrefix.indexOf( iconSet.css_prefix ) ) {
|
|
FusionPageBuilderApp.mediaMap.icons[ iconSet.post_id ] = iconSet.css_prefix;
|
|
return false;
|
|
}
|
|
} );
|
|
}
|
|
}
|
|
|
|
// TODO: move this when above are moved as well.
|
|
if ( ( 'fusion_tb_post_card_archives' === elementType || 'fusion_post_cards' === elementType ) && '' !== values.post_card ) {
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.post_cards[ values.post_card ] ) {
|
|
FusionPageBuilderApp.mediaMap.post_cards[ values.post_card ] = true;
|
|
}
|
|
}
|
|
|
|
// TODO: move this when above are moved as well.
|
|
if ( 'fusion_video' === elementType && '' !== values.video ) {
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.videos[ values.video ] ) {
|
|
FusionPageBuilderApp.mediaMap.videos[ values.video ] = true;
|
|
}
|
|
}
|
|
|
|
// TODO: move this when above are moved as well.
|
|
if ( 'fusion_builder_container' === elementType && '' !== values.video_mp4 ) {
|
|
// If its not within object already, add it.
|
|
if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.videos[ values.video_mp4 ] ) {
|
|
FusionPageBuilderApp.mediaMap.videos[ values.video_mp4 ] = true;
|
|
}
|
|
}
|
|
|
|
// TODO: move this when above are moved as well.
|
|
if ( 'fusion_fontawesome' === elementType && '' !== values.icon && 'fusion-prefix-' === values.icon.substr( 0, 14 ) ) {
|
|
if ( 'undefined' !== typeof fusionBuilderConfig.customIcons ) {
|
|
iconWithoutFusionPrefix = values.icon.substr( 14 );
|
|
|
|
// TODO: try to optimize this check.
|
|
jQuery.each( fusionBuilderConfig.customIcons, function( iconPostName, iconSet ) {
|
|
if ( 0 === iconWithoutFusionPrefix.indexOf( iconSet.css_prefix ) ) {
|
|
FusionPageBuilderApp.mediaMap.icons[ iconSet.post_id ] = iconSet.css_prefix;
|
|
return false;
|
|
}
|
|
} );
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
libraryBuilderToShortcodes: function() {
|
|
var shortcode = '',
|
|
cid,
|
|
view;
|
|
|
|
// Editing element
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-elements' ) ) {
|
|
if ( jQuery( '.fusion-builder-column-outer .fusion_builder_row_inner' ).length ) {
|
|
cid = jQuery( '.fusion-builder-column-outer .fusion_builder_row_inner' ).data( 'cid' );
|
|
view = FusionPageBuilderViewManager.getView( cid );
|
|
shortcode = view.getInnerRowContent();
|
|
|
|
} else if ( jQuery( '.fusion_module_block' ).length ) {
|
|
shortcode = FusionPageBuilderApp.generateElementShortcode( jQuery( '.fusion_module_block' ), false );
|
|
}
|
|
|
|
// Editing column.
|
|
} else if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-columns' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' ) ) {
|
|
if ( jQuery( '.fusion-builder-column-outer' ).length ) {
|
|
cid = jQuery( '.fusion-builder-column-outer' ).data( 'cid' );
|
|
view = FusionPageBuilderViewManager.getView( cid );
|
|
shortcode = view.getColumnContent( jQuery( '.fusion-builder-column-outer' ) );
|
|
}
|
|
|
|
// Editing container
|
|
} else if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-sections' ) ) {
|
|
if ( jQuery( '.fusion-builder-section-content' ).length ) {
|
|
cid = jQuery( '.fusion-builder-section-content.fusion-builder-data-cid' ).data( 'cid' );
|
|
view = FusionPageBuilderViewManager.getView( cid );
|
|
shortcode = view.getContainerContent();
|
|
}
|
|
}
|
|
|
|
setTimeout( function() {
|
|
FusionPageBuilderApp.fusionBuilderSetContent( 'content', shortcode );
|
|
FusionPageBuilderEvents.trigger( 'fusion-save-history-state' );
|
|
FusionPageBuilderApp.setGoogleFonts( shortcode );
|
|
}, 500 );
|
|
},
|
|
|
|
builderToShortcodes: function() {
|
|
|
|
var shortcode = '',
|
|
thisEl = this,
|
|
plugins = 'object' === typeof fusionBuilderConfig.plugins_active ? fusionBuilderConfig.plugins_active : false,
|
|
offCanvases;
|
|
|
|
this.simplifiedMap = [];
|
|
|
|
// Reset the media map.
|
|
this.mediaMap = {
|
|
images: {},
|
|
menus: {},
|
|
forms: {},
|
|
post_cards: {},
|
|
videos: {},
|
|
icons: {},
|
|
off_canvases: {}
|
|
};
|
|
|
|
if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) {
|
|
this.libraryBuilderToShortcodes();
|
|
|
|
} else if ( 'undefined' !== this.pauseBuilder && ! this.pauseBuilder ) {
|
|
|
|
this.$el.find( '.fusion_builder_container, .fusion-builder-form-step' ).each( function( index, value ) {
|
|
var $thisContainer = $( this ).find( '.fusion-builder-section-content' ),
|
|
stepId,
|
|
stepView;
|
|
|
|
// Form step shortcode.
|
|
if ( $( this ).hasClass( 'fusion-builder-form-step' ) ) {
|
|
stepId = $( this ).find( '.fusion-builder-data-cid' ).attr( 'data-cid' );
|
|
stepView = stepId ? FusionPageBuilderViewManager.getView( stepId ) : false;
|
|
|
|
if ( stepView ) {
|
|
shortcode += stepView.getContent();
|
|
} else {
|
|
shortcode += '[fusion_builder_form_step /]';
|
|
}
|
|
return;
|
|
}
|
|
|
|
shortcode += thisEl.generateElementShortcode( $( this ), true );
|
|
|
|
$thisContainer.find( '.fusion_builder_row' ).each( function() {
|
|
|
|
var $thisRow = $( this );
|
|
|
|
shortcode += '[fusion_builder_row]';
|
|
|
|
$thisRow.find( '.fusion-builder-column-outer' ).each( function() {
|
|
var $thisColumn = $( this ),
|
|
columnCID = $thisColumn.data( 'cid' ),
|
|
columnView = FusionPageBuilderViewManager.getView( columnCID );
|
|
|
|
shortcode += columnView.getColumnContent( $thisColumn );
|
|
} );
|
|
shortcode += '[/fusion_builder_row]';
|
|
} );
|
|
|
|
shortcode += '[/fusion_builder_container]';
|
|
|
|
// Check for next page shortcode
|
|
if ( $( this ).next().hasClass( 'fusion-builder-next-page' ) ) {
|
|
shortcode += '[fusion_builder_next_page]';
|
|
}
|
|
|
|
// Check for checkout form shortcode
|
|
if ( $( this ).next().hasClass( 'fusion-checkout-form' ) ) {
|
|
shortcode += '[fusion_woo_checkout_form]';
|
|
}
|
|
|
|
if ( $( this ).prev().hasClass( 'fusion-checkout-form' ) && 0 === index ) {
|
|
shortcode = '[fusion_woo_checkout_form]' + shortcode;
|
|
}
|
|
|
|
} );
|
|
|
|
setTimeout( function() {
|
|
|
|
FusionPageBuilderApp.fusionBuilderSetContent( 'content', shortcode );
|
|
FusionPageBuilderEvents.trigger( 'fusion-save-history-state' );
|
|
FusionPageBuilderApp.setGoogleFonts( shortcode );
|
|
jQuery( document ).trigger( 'fusion-builder-content-updated' );
|
|
}, 500 );
|
|
}
|
|
|
|
// Add Off Canvases to media map.
|
|
if ( false !== plugins && true === plugins.awb_studio ) {
|
|
offCanvases = jQuery( '#pyre_off_canvases' ).val();
|
|
|
|
if ( 'undefined' !== typeof offCanvases && offCanvases.length ) {
|
|
_.each( offCanvases, function( key, value ) {
|
|
FusionPageBuilderApp.mediaMap.off_canvases[ key ] = true;
|
|
} );
|
|
}
|
|
}
|
|
|
|
// If media map exists, add to post meta for saving.
|
|
if ( ! _.isEmpty( this.mediaMap ) && 'undefined' !== typeof fusionBuilderConfig.replaceAssets && fusionBuilderConfig.replaceAssets ) {
|
|
jQuery( '#fusion-studio-media-map-field' ).val( JSON.stringify( FusionPageBuilderApp.mediaMap ) );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Checks page content for font dependencies.
|
|
*
|
|
* @since 2.0.0
|
|
* @return {Object}
|
|
*/
|
|
setGoogleFonts: function( content ) {
|
|
var self = this,
|
|
googleFonts = {},
|
|
fontFamily,
|
|
$input = jQuery( '#fusion-google-fonts-field' ),
|
|
savedData = $input.val();
|
|
|
|
if ( savedData && '' !== savedData ) {
|
|
try {
|
|
savedData = JSON.parse( savedData );
|
|
} catch ( error ) {
|
|
console.log( error );
|
|
}
|
|
}
|
|
|
|
googleFonts = this.setElementFonts( content, googleFonts );
|
|
googleFonts = this.setInlineFonts( content, googleFonts );
|
|
|
|
// Delete global typographies.
|
|
for ( fontFamily in googleFonts ) {
|
|
if ( fontFamily.includes( 'var(' ) ) {
|
|
// awbOriginalPalette is a variable present only on studio plugin.
|
|
if ( window.awbOriginalPalette ) {
|
|
addOverwriteTypographyToMeta( fontFamily );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( 'object' === typeof savedData ) {
|
|
_.each( savedData, function( fontData, fontFamily ) {
|
|
_.each( fontData, function( values, key ) {
|
|
savedData[ fontFamily ][ key ] = _.values( values );
|
|
} );
|
|
} );
|
|
|
|
// We have existing values and existing value is not the same as new.
|
|
if ( ! _.isEqual( savedData, googleFonts ) ) {
|
|
|
|
if ( _.isEmpty( googleFonts ) ) {
|
|
googleFonts = '';
|
|
}
|
|
savedData = googleFonts; // eslint-disable-line camelcase
|
|
}
|
|
} else if ( ! _.isEmpty( googleFonts ) ) {
|
|
|
|
// We do not have existing values and we do have fonts now.
|
|
savedData = googleFonts; // eslint-disable-line camelcase
|
|
}
|
|
|
|
// Set the json encoded value to text area.
|
|
$input.val( JSON.stringify( savedData ) );
|
|
|
|
function addOverwriteTypographyToMeta( globalVar ) {
|
|
var typoMatch = globalVar.match( /--awb-typography(\d)/ ),
|
|
fontName,
|
|
fontVariant,
|
|
uniqueFontVariant,
|
|
variantMatch,
|
|
i,
|
|
typoId;
|
|
|
|
if ( ! typoMatch[ 1 ] || ! Array.isArray( googleFonts[ globalVar ].variants ) ) {
|
|
delete googleFonts[ globalVar ];
|
|
return;
|
|
}
|
|
|
|
// Get the font family.
|
|
typoId = typoMatch[ 1 ];
|
|
fontName = awbTypoData.data[ 'typography' + typoId ][ 'font-family' ];
|
|
fontVariant = [];
|
|
|
|
// Get the global font variants and merge with non-global ones.
|
|
for ( i = 0; i < googleFonts[ globalVar ].variants.length; i++ ) {
|
|
if ( googleFonts[ globalVar ].variants[ i ].includes( 'var(' ) ) {
|
|
variantMatch = googleFonts[ globalVar ].variants[ i ].match( /--awb-typography(\d)/ );
|
|
|
|
if ( variantMatch[ 1 ] ) {
|
|
if ( awbTypoData.data[ 'typography' + variantMatch[ 1 ] ].variant ) {
|
|
fontVariant.push( awbTypoData.data[ 'typography' + variantMatch[ 1 ] ].variant );
|
|
} else {
|
|
fontVariant.push( '400' );
|
|
}
|
|
}
|
|
|
|
} else {
|
|
fontVariant.push( googleFonts[ globalVar ].variants[ i ] );
|
|
}
|
|
}
|
|
|
|
// Update the font variant. If exist then concat them.
|
|
if ( googleFonts[ fontName ] ) {
|
|
if ( googleFonts[ fontName ].variants ) {
|
|
googleFonts[ fontName ].variants = googleFonts[ fontName ].variants.concat( fontVariant );
|
|
} else {
|
|
googleFonts[ fontName ].variants = fontVariant;
|
|
}
|
|
} else {
|
|
googleFonts[ fontName ] = {};
|
|
googleFonts[ fontName ].variants = fontVariant;
|
|
}
|
|
|
|
// Remove duplicate variants.
|
|
uniqueFontVariant = [];
|
|
googleFonts[ fontName ].variants.forEach( function( el ) {
|
|
if ( ! uniqueFontVariant.includes( el ) ) {
|
|
uniqueFontVariant.push( el );
|
|
}
|
|
} );
|
|
googleFonts[ fontName ].variants = uniqueFontVariant;
|
|
|
|
// Finally, delete global variant.
|
|
delete googleFonts[ globalVar ];
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Checks page content for element font families.
|
|
*
|
|
* @since 2.0.0
|
|
* @param object googleFonts
|
|
* @return {Object}
|
|
*/
|
|
setElementFonts: function( postContent, googleFonts ) {
|
|
var regexp,
|
|
elementFonts,
|
|
tempFonts = {},
|
|
saveFonts = [];
|
|
|
|
if ( '' !== postContent && -1 !== postContent.indexOf( 'fusion_font_' ) ) {
|
|
regexp = new RegExp( '(fusion_font_[^=]*=")([^"]*)"', 'g' );
|
|
elementFonts = postContent.match( regexp );
|
|
if ( 'object' === typeof elementFonts ) {
|
|
_.each( elementFonts, function( match, key ) {
|
|
var matches = match.slice( 0, -1 ).split( '="' ),
|
|
unique = matches[ 0 ].replace( 'fusion_font_family_', '' ).replace( 'fusion_font_variant_', '' ),
|
|
type = 'family';
|
|
|
|
if ( -1 !== matches[ 0 ].indexOf( 'fusion_font_variant_' ) ) {
|
|
type = 'variant';
|
|
}
|
|
|
|
if ( '' === matches[ 1 ] && 'family' === type ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'object' !== typeof tempFonts[ unique ] ) {
|
|
tempFonts[ unique ] = {};
|
|
} else if ( 'family' === type ) {
|
|
|
|
// If we are setting family again for something already in process, then save out incomplete and start fresh
|
|
saveFonts.push( tempFonts[ unique ] );
|
|
tempFonts[ unique ] = {};
|
|
}
|
|
|
|
tempFonts[ unique ][ type ] = matches[ 1 ];
|
|
|
|
// If both are set, add to save fonts and delete from temporary holder so others can be collected with same ID.
|
|
if ( 'undefined' !== typeof tempFonts[ unique ].family && 'undefined' !== typeof tempFonts[ unique ].variant ) {
|
|
saveFonts.push( tempFonts[ unique ] );
|
|
delete tempFonts[ unique ];
|
|
}
|
|
} );
|
|
}
|
|
|
|
// Check for incomplete ones with family and add them too.
|
|
_.each( tempFonts, function( font, option ) {
|
|
if ( 'undefined' !== typeof font.family && '' !== font.family ) {
|
|
saveFonts.push( tempFonts[ option ] );
|
|
}
|
|
} );
|
|
|
|
// Look all fonts for saving and save.
|
|
_.each( saveFonts, function( font, option ) {
|
|
if ( 'undefined' === typeof font.family || '' === font.family ) {
|
|
return;
|
|
}
|
|
if ( 'undefined' === typeof googleFonts[ font.family ] ) {
|
|
googleFonts[ font.family ] = {
|
|
variants: []
|
|
};
|
|
}
|
|
|
|
// Add the variant if it does not exist already.
|
|
if ( 'string' === typeof font.variant && ! googleFonts[ font.family ].variants.includes( font.variant ) ) {
|
|
googleFonts[ font.family ].variants.push( font.variant );
|
|
}
|
|
} );
|
|
}
|
|
|
|
return googleFonts;
|
|
},
|
|
|
|
/**
|
|
* Checks page content for inline font families.
|
|
*
|
|
* @since 2.0.0
|
|
* @param object googleFonts
|
|
* @return {Object}
|
|
*/
|
|
setInlineFonts: function( postContent, googleFonts ) {
|
|
var regexp,
|
|
inlineFonts,
|
|
current = {},
|
|
tempFonts = [],
|
|
saveFonts = [];
|
|
|
|
if ( '' !== postContent && -1 !== postContent.indexOf( 'data-fusion-google-' ) ) {
|
|
regexp = new RegExp( 'data-fusion-google-[^=]*="([^"]*)"', 'g' );
|
|
inlineFonts = postContent.match( regexp );
|
|
if ( 'object' === typeof inlineFonts ) {
|
|
_.each( inlineFonts, function( match, key ) {
|
|
var matches = match.slice( 0, -1 ).split( '="' ),
|
|
type = 'family';
|
|
|
|
if ( -1 !== matches[ 0 ].indexOf( 'data-fusion-google-variant' ) ) {
|
|
type = 'variant';
|
|
}
|
|
|
|
// Unfilled font family and reached another, bump to temporary and reset current.
|
|
if ( 'string' === typeof current.family && 'family' === type ) {
|
|
tempFonts.push( current );
|
|
current = {};
|
|
}
|
|
|
|
current[ type ] = matches[ 1 ];
|
|
|
|
// If both are set, add to save fonts and delete from temporary holder so others can be collected with same ID.
|
|
if ( 'undefined' !== typeof current.family && 'undefined' !== typeof current.variant ) {
|
|
saveFonts.push( current );
|
|
current = {};
|
|
}
|
|
} );
|
|
}
|
|
|
|
// Check for incomplete ones with family and add them too.
|
|
_.each( tempFonts, function( font, option ) {
|
|
if ( 'undefined' !== typeof font.family ) {
|
|
saveFonts.push( tempFonts[ option ] );
|
|
}
|
|
} );
|
|
|
|
// Look all fonts for saving and save.
|
|
_.each( saveFonts, function( font, option ) {
|
|
if ( 'undefined' === typeof googleFonts[ font.family ] ) {
|
|
googleFonts[ font.family ] = {
|
|
variants: [],
|
|
subsets: []
|
|
};
|
|
}
|
|
|
|
// Add the variant.
|
|
if ( 'string' === typeof font.variant ) {
|
|
googleFonts[ font.family ].variants.push( font.variant );
|
|
}
|
|
} );
|
|
}
|
|
return googleFonts;
|
|
},
|
|
|
|
syncGlobalLayouts: function() {
|
|
var $mainContainer = $( '#fusion_builder_main_container' ),
|
|
childChanged = false,
|
|
updated = [],
|
|
elementCID,
|
|
element;
|
|
|
|
// Return if no globals.
|
|
if ( 0 === $mainContainer.find( 'div[class^="fusion-global-"],div[class*=" fusion-global-"]' ).length ) {
|
|
return;
|
|
}
|
|
|
|
// Loop through all global elements.
|
|
$( 'div[class^="fusion-global-"],div[class*=" fusion-global-"]' ).each( function() {
|
|
var globalLayoutID = $( this ).attr( 'fusion-global-layout' );
|
|
|
|
// Check if multiple instances exist.
|
|
if ( 1 < $mainContainer.find( '[fusion-global-layout="' + globalLayoutID + '"]' ).length ) {
|
|
|
|
// Loop through all multiple instances.
|
|
$( '[fusion-global-layout="' + globalLayoutID + '"]' ).each( function() {
|
|
childChanged = false;
|
|
|
|
// Check for child element changes.
|
|
if ( $( this ).hasClass( 'fusion-global-container' ) ) {
|
|
childChanged = FusionPageBuilderApp.isChildElementChanged( $( this ), 'container' );
|
|
} else if ( $( this ).hasClass( 'fusion-global-column' ) ) {
|
|
childChanged = FusionPageBuilderApp.isChildElementChanged( $( this ), 'column' );
|
|
}
|
|
|
|
// Get cid from html element.
|
|
elementCID = 'undefined' === typeof $( this ).data( 'cid' ) ? $( this ).find( '.fusion-builder-data-cid' ).data( 'cid' ) : $( this ).data( 'cid' );
|
|
|
|
// Get model by cid.
|
|
element = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === elementCID;
|
|
} );
|
|
|
|
if ( ( 0 < _.keys( element.changed ).length || true === childChanged ) && -1 === $.inArray( globalLayoutID, updated ) ) {
|
|
|
|
// Sync models / Update layout template.
|
|
FusionPageBuilderApp.updateGlobalLayouts( this, element, globalLayoutID );
|
|
updated.push( globalLayoutID );
|
|
}
|
|
} );
|
|
}
|
|
} );
|
|
},
|
|
|
|
isChildElementChanged: function( currentElement, section ) {
|
|
|
|
// TO DO :: Check for clone and delete too.
|
|
var isChanged = false,
|
|
$thisColumn,
|
|
columnCID,
|
|
column;
|
|
|
|
if ( 'container' === section ) {
|
|
|
|
// Parse rows.
|
|
currentElement.find( '.fusion-builder-row-content:not(.fusion_builder_row_inner .fusion-builder-row-content)' ).each( function() {
|
|
|
|
var thisRow = $( this ),
|
|
rowCID = thisRow.data( 'cid' ),
|
|
row;
|
|
|
|
// Get model from collection by cid.
|
|
row = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === rowCID;
|
|
} );
|
|
|
|
if ( 0 < _.keys( row.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
|
|
// Parse columns.
|
|
thisRow.find( '.fusion-builder-column-outer' ).each( function() {
|
|
|
|
// Parse column elements.
|
|
var thisColumn = $( this ),
|
|
columnCID = thisColumn.data( 'cid' ),
|
|
|
|
// Get model from collection by cid.
|
|
column = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === columnCID;
|
|
} );
|
|
|
|
if ( 0 < _.keys( column.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
|
|
// Find column elements.
|
|
thisColumn.children( '.fusion_module_block, .fusion_builder_row_inner' ).each( function() {
|
|
var thisElement,
|
|
elementCID,
|
|
element,
|
|
thisInnerRow,
|
|
InnerRowCID,
|
|
innerRowView;
|
|
|
|
// Regular element.
|
|
if ( $( this ).hasClass( 'fusion_module_block' ) ) {
|
|
|
|
thisElement = $( this );
|
|
elementCID = thisElement.data( 'cid' );
|
|
|
|
// Get model from collection by cid.
|
|
element = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === elementCID;
|
|
} );
|
|
|
|
if ( 0 < _.keys( element.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
} else if ( $( this ).hasClass( 'fusion_builder_row_inner' ) ) { // Inner row element
|
|
|
|
thisInnerRow = $( this );
|
|
InnerRowCID = thisInnerRow.data( 'cid' );
|
|
|
|
innerRowView = FusionPageBuilderViewManager.getView( InnerRowCID );
|
|
|
|
// Check inner row.
|
|
if ( 'undefined' !== typeof innerRowView ) {
|
|
isChanged = FusionPageBuilderApp.isNestedRowChanged( '', columnCID );
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
} );
|
|
} else if ( 'column' === section ) {
|
|
$thisColumn = '';
|
|
columnCID = currentElement.data( 'cid' );
|
|
|
|
// Get model from collection by cid.
|
|
column = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === columnCID;
|
|
} );
|
|
|
|
if ( 0 < _.keys( column.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
|
|
// Parse column elements.
|
|
$thisColumn = currentElement;
|
|
$thisColumn.find( '.fusion_builder_column_element:not(.fusion-builder-column-inner .fusion_builder_column_element)' ).each( function() {
|
|
var $thisModule,
|
|
moduleCID,
|
|
module,
|
|
$thisInnerRow,
|
|
innerRowCID,
|
|
innerRowView;
|
|
|
|
// Standard element.
|
|
if ( $( this ).hasClass( 'fusion_module_block' ) ) {
|
|
$thisModule = $( this );
|
|
moduleCID = 'undefined' === typeof $thisModule.data( 'cid' ) ? $thisModule.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisModule.data( 'cid' );
|
|
|
|
// Get model from collection by cid.
|
|
module = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === moduleCID;
|
|
} );
|
|
|
|
if ( 0 < _.keys( module.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
|
|
// Inner row/nested element.
|
|
} else if ( $( this ).hasClass( 'fusion_builder_row_inner' ) ) {
|
|
$thisInnerRow = $( this );
|
|
innerRowCID = 'undefined' === typeof $thisInnerRow.data( 'cid' ) ? $thisInnerRow.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisInnerRow.data( 'cid' );
|
|
innerRowView = FusionPageBuilderViewManager.getView( innerRowCID );
|
|
|
|
// Clone inner row.
|
|
if ( 'undefined' !== typeof innerRowView ) {
|
|
isChanged = FusionPageBuilderApp.isNestedRowChanged( '', columnCID );
|
|
}
|
|
}
|
|
|
|
} );
|
|
}
|
|
|
|
return isChanged;
|
|
},
|
|
|
|
isNestedRowChanged: function( event ) {
|
|
var thisInnerRow,
|
|
isChanged;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
if ( 0 < _.keys( this.model.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
|
|
// Parse inner columns.
|
|
thisInnerRow = this.$el;
|
|
thisInnerRow.find( '.fusion-builder-column-inner' ).each( function() {
|
|
var $thisColumnInner = $( this ),
|
|
columnInnerCID = $thisColumnInner.data( 'cid' ),
|
|
innerColumnModule = FusionPageBuilderElements.findWhere( { cid: columnInnerCID } );
|
|
|
|
if ( 0 < _.keys( innerColumnModule.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
|
|
// Parse elements inside inner col.
|
|
$thisColumnInner.find( '.fusion_module_block' ).each( function() {
|
|
var thisModule = $( this ),
|
|
moduleCID = 'undefined' === typeof thisModule.data( 'cid' ) ? thisModule.find( '.fusion-builder-data-cid' ).data( 'cid' ) : thisModule.data( 'cid' ),
|
|
|
|
// Get model from collection by cid.
|
|
module = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === moduleCID;
|
|
} );
|
|
|
|
if ( 0 < _.keys( module.changed ).length ) {
|
|
isChanged = true;
|
|
return false;
|
|
}
|
|
} );
|
|
|
|
} );
|
|
return isChanged;
|
|
},
|
|
|
|
checkGlobalParents: function( parentCID ) {
|
|
var $mainContainer = $( '#fusion_builder_main_container' ),
|
|
thisView;
|
|
|
|
module = FusionPageBuilderElements.find( function( model ) { // jshint ignore:line
|
|
return model.get( 'cid' ) === parentCID;
|
|
} );
|
|
|
|
if ( 'undefined' === typeof module ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'undefined' !== typeof module.attributes.params && 'undefined' !== typeof module.attributes.params.fusion_global && 1 < $mainContainer.find( '[fusion-global-layout="' + module.attributes.params.fusion_global + '"]' ).length ) {
|
|
|
|
// Get element view.
|
|
thisView = FusionPageBuilderViewManager.getView( module.get( 'cid' ) );
|
|
if ( 'undefined' !== typeof thisView ) {
|
|
|
|
// Update global layout.
|
|
FusionPageBuilderApp.updateGlobalLayouts( thisView.$el, module, module.attributes.params.fusion_global );
|
|
}
|
|
}
|
|
|
|
if ( 'undefined' !== typeof module.attributes.params && 'undefined' !== typeof module.get( 'parent' ) ) {
|
|
FusionPageBuilderApp.checkGlobalParents( module.get( 'parent' ) );
|
|
}
|
|
},
|
|
|
|
updateGlobalLayouts: function( html, element, layoutID ) {
|
|
var $thisContainer = $( html ),
|
|
shortcode = '',
|
|
columnCID,
|
|
columnView,
|
|
innerRowCID,
|
|
innerRowView;
|
|
|
|
if ( $( html ).hasClass( 'fusion_builder_column_element' ) && ! $( html ).hasClass( 'fusion_builder_row_inner' ) ) {
|
|
shortcode += FusionPageBuilderApp.generateElementShortcode( $( html ), false );
|
|
} else if ( $( html ).hasClass( 'fusion_builder_row_inner' ) ) {
|
|
innerRowCID = $thisContainer.data( 'cid' );
|
|
innerRowView = FusionPageBuilderViewManager.getView( innerRowCID );
|
|
shortcode += innerRowView.getInnerRowContent( $thisContainer );
|
|
} else if ( $( html ).hasClass( 'fusion-builder-column' ) ) {
|
|
columnCID = $( html ).data( 'cid' );
|
|
columnView = FusionPageBuilderViewManager.getView( columnCID );
|
|
shortcode += columnView.getColumnContent( $( html ) );
|
|
} else if ( $( html ).hasClass( 'fusion_builder_container' ) ) {
|
|
shortcode += FusionPageBuilderApp.generateElementShortcode( $( html ), true );
|
|
$thisContainer.find( '.fusion_builder_row' ).each( function() {
|
|
var $thisRow = $( this );
|
|
shortcode += '[fusion_builder_row]';
|
|
$thisRow.find( '.fusion-builder-column-outer' ).each( function() {
|
|
var $thisColumn = $( this ),
|
|
columnCID = $thisColumn.data( 'cid' ),
|
|
columnView = FusionPageBuilderViewManager.getView( columnCID );
|
|
|
|
shortcode += columnView.getColumnContent( $thisColumn );
|
|
|
|
} );
|
|
shortcode += '[/fusion_builder_row]';
|
|
} );
|
|
shortcode += '[/fusion_builder_container]';
|
|
}
|
|
|
|
// Update layout in DB.
|
|
$.ajax( {
|
|
type: 'POST',
|
|
url: fusionBuilderConfig.ajaxurl,
|
|
dataType: 'json',
|
|
data: {
|
|
action: 'fusion_builder_update_layout',
|
|
fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce,
|
|
fusion_layout_id: layoutID,
|
|
fusion_layout_content: shortcode
|
|
},
|
|
complete: function() {
|
|
|
|
// Do Stuff.
|
|
}
|
|
} );
|
|
},
|
|
|
|
saveHistoryState: function() {
|
|
|
|
if ( true === this.newLayoutLoaded ) {
|
|
fusionHistoryManager.clearEditor();
|
|
this.newLayoutLoaded = false;
|
|
}
|
|
|
|
fusionHistoryManager.captureEditor();
|
|
fusionHistoryManager.turnOffTracking();
|
|
},
|
|
|
|
generateElementShortcode: function( $element, openTagOnly, generator ) {
|
|
var attributes = '',
|
|
content = '',
|
|
element,
|
|
$thisElement,
|
|
elementCID,
|
|
elementType,
|
|
elementSettings = '',
|
|
shortcode,
|
|
ignoredAtts,
|
|
optionDependency,
|
|
optionDependencyValue,
|
|
key,
|
|
setting,
|
|
settingName,
|
|
settingValue,
|
|
param,
|
|
keyName,
|
|
optionValue,
|
|
ignored,
|
|
paramDependency,
|
|
paramDependencyElement,
|
|
paramDependencyValue,
|
|
elementView;
|
|
|
|
// Check if added from Shortcode Generator
|
|
if ( true === generator ) {
|
|
element = $element;
|
|
} else {
|
|
$thisElement = $element;
|
|
|
|
// Get cid from html element
|
|
elementCID = 'undefined' === typeof $thisElement.data( 'cid' ) ? $thisElement.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisElement.data( 'cid' );
|
|
|
|
// Get model by cid
|
|
element = FusionPageBuilderElements.find( function( model ) {
|
|
return model.get( 'cid' ) === elementCID;
|
|
} );
|
|
}
|
|
|
|
elementView = FusionPageBuilderViewManager.getView( elementCID );
|
|
if ( 'undefined' !== typeof elementView && 'function' === typeof this.beforeGenerateShortcode ) {
|
|
this.beforeGenerateShortcode( elementCID );
|
|
}
|
|
|
|
elementType = 'undefined' !== typeof element ? element.get( 'element_type' ) : 'undefined';
|
|
shortcode = '';
|
|
elementSettings = element.attributes;
|
|
|
|
// Ignored shortcode attributes
|
|
ignoredAtts = 'undefined' !== typeof fusionAllElements[ elementType ].remove_from_atts ? fusionAllElements[ elementType ].remove_from_atts : [];
|
|
ignoredAtts.push( 'undefined' );
|
|
|
|
// Option dependency
|
|
optionDependency = ( 'undefined' !== typeof fusionAllElements[ elementType ].option_dependency ) ? fusionAllElements[ elementType ].option_dependency : '';
|
|
|
|
|
|
if ( 'undefined' !== typeof elementSettings.params ) {
|
|
|
|
settingValue = 'undefined' !== typeof element.get( 'params' ) ? element.get( 'params' ) : '';
|
|
|
|
// Loop over params
|
|
for ( param in settingValue ) {
|
|
|
|
keyName = param;
|
|
|
|
if ( 'element_content' === keyName ) {
|
|
|
|
optionValue = ( 'undefined' !== typeof settingValue[ param ] ) ? settingValue[ param ] : '';
|
|
|
|
content = optionValue;
|
|
|
|
if ( 'undefined' !== typeof settingValue[ optionDependency ] && '' !== optionDependency ) {
|
|
optionDependency = fusionAllElements[ elementType ].option_dependency;
|
|
optionDependencyValue = ( 'undefined' !== typeof settingValue[ optionDependency ] ) ? settingValue[ optionDependency ] : '';
|
|
|
|
// Set content
|
|
content = 'undefined' !== typeof settingValue[ optionDependencyValue ] ? settingValue[ optionDependencyValue ] : '';
|
|
}
|
|
|
|
} else {
|
|
|
|
ignored = '';
|
|
|
|
if ( '' !== optionDependency ) {
|
|
|
|
setting = keyName;
|
|
|
|
// Get option dependency value ( value for type )
|
|
optionDependencyValue = ( 'undefined' !== typeof settingValue[ optionDependency ] ) ? settingValue[ optionDependency ] : '';
|
|
|
|
// Check for old fusion_map array structure
|
|
if ( 'undefined' !== typeof fusionAllElements[ elementType ].params[ setting ] ) {
|
|
|
|
// Dependency exists
|
|
if ( 'undefined' !== typeof fusionAllElements[ elementType ].params[ setting ].dependency ) {
|
|
|
|
paramDependency = fusionAllElements[ elementType ].params[ setting ].dependency;
|
|
|
|
paramDependencyElement = ( 'undefined' !== typeof paramDependency.element ) ? paramDependency.element : '';
|
|
|
|
paramDependencyValue = ( 'undefined' !== typeof paramDependency.value ) ? paramDependency.value : '';
|
|
|
|
if ( paramDependencyElement === optionDependency ) {
|
|
|
|
if ( paramDependencyValue !== optionDependencyValue ) {
|
|
|
|
ignored = '';
|
|
ignored = setting;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ignore shortcode attributes tagged with "remove_from_atts"
|
|
if ( -1 < $.inArray( param, ignoredAtts ) || ignored === param ) {
|
|
|
|
// This attribute should be ignored from the shortcode
|
|
} else {
|
|
|
|
optionValue = 'undefined' !== typeof settingValue[ param ] ? settingValue[ param ] : '';
|
|
|
|
// Check if attribute value is null
|
|
if ( null === optionValue ) {
|
|
optionValue = '';
|
|
}
|
|
|
|
if ( ( 'on' === fusionBuilderConfig.removeEmptyAttributes && '' !== optionValue ) || 'off' === fusionBuilderConfig.removeEmptyAttributes ) {
|
|
attributes += ' ' + param + '="' + optionValue + '"';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
shortcode = '[' + elementType + attributes;
|
|
|
|
if ( '' === content && 'fusion_tab' !== elementType && 'fusion_text' !== elementType && 'fusion_code' !== elementType && ( 'undefined' !== typeof elementSettings.type && 'element' === elementSettings.type ) ) {
|
|
openTagOnly = true;
|
|
shortcode += ' /]';
|
|
} else {
|
|
shortcode += ']';
|
|
}
|
|
|
|
if ( ! openTagOnly ) {
|
|
shortcode += content + '[/' + elementType + ']';
|
|
}
|
|
|
|
if ( 'object' !== typeof this.simplifiedMap ) {
|
|
this.simplifiedMap = [];
|
|
}
|
|
this.simplifiedMap.push( {
|
|
shortcode: shortcode,
|
|
params: settingValue,
|
|
type: elementType
|
|
} );
|
|
|
|
return shortcode;
|
|
},
|
|
|
|
shouldExclude: function( param, elementType ) {
|
|
var excluded = {
|
|
'link_color': 'fusion_builder_container',
|
|
'link_hover_color': 'fusion_builder_container'
|
|
};
|
|
|
|
if ( 'undefined' !== typeof excluded[ param ] && elementType === excluded[ param ] ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
toggleCodeFields: function( event ) {
|
|
event.preventDefault();
|
|
|
|
jQuery( '.awb-po-code-fields' ).slideToggle();
|
|
jQuery( '.fusion-custom-css' ).slideUp();
|
|
},
|
|
|
|
codeFields: function() {
|
|
jQuery( '.awb-po-code-field textarea' ).on( 'change keyup paste', function() {
|
|
jQuery( '#pyre_tab_code_fields' ).find( '#pyre_' + jQuery( this ).attr( 'id' ) ).val( jQuery( this ).val() );
|
|
} );
|
|
},
|
|
|
|
customCSS: function( event ) {
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
jQuery( '.fusion-custom-css' ).slideToggle();
|
|
jQuery( '.awb-po-code-fields' ).slideUp();
|
|
},
|
|
|
|
toggleAllContainers: function( event ) {
|
|
|
|
var toggleButton,
|
|
containerCID,
|
|
that = this;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
toggleButton = $( '.fusion-builder-layout-buttons-toggle-containers' ).find( 'span' );
|
|
|
|
if ( toggleButton.hasClass( 'dashicons-arrow-up' ) ) {
|
|
toggleButton.removeClass( 'dashicons-arrow-up' ).addClass( 'dashicons-arrow-down' );
|
|
|
|
jQuery( '.fusion_builder_container' ).each( function() {
|
|
var containerModel;
|
|
|
|
containerCID = jQuery( this ).find( '.fusion-builder-data-cid' ).data( 'cid' );
|
|
containerModel = that.collection.find( function( model ) {
|
|
return model.get( 'cid' ) === containerCID;
|
|
} );
|
|
containerModel.attributes.params.admin_toggled = 'yes';
|
|
jQuery( this ).addClass( 'fusion-builder-section-folded' );
|
|
jQuery( this ).find( '.fusion-builder-toggle > span' ).removeClass( 'dashicons-arrow-up' ).addClass( 'dashicons-arrow-down' );
|
|
} );
|
|
|
|
} else {
|
|
toggleButton.addClass( 'dashicons-arrow-up' ).removeClass( 'dashicons-arrow-down' );
|
|
jQuery( '.fusion_builder_container' ).each( function() {
|
|
var containerModel;
|
|
|
|
containerCID = jQuery( this ).find( '.fusion-builder-data-cid' ).data( 'cid' );
|
|
containerModel = that.collection.find( function( model ) {
|
|
return model.get( 'cid' ) === containerCID;
|
|
} );
|
|
containerModel.attributes.params.admin_toggled = 'no';
|
|
jQuery( this ).removeClass( 'fusion-builder-section-folded' );
|
|
jQuery( this ).find( '.fusion-builder-toggle > span' ).addClass( 'dashicons-arrow-up' ).removeClass( 'dashicons-arrow-down' );
|
|
} );
|
|
}
|
|
|
|
FusionPageBuilderEvents.trigger( 'fusion-element-edited' );
|
|
},
|
|
|
|
showSavedElements: function( elementType, container ) {
|
|
|
|
var data = jQuery( '#fusion-builder-layouts-' + elementType ).find( '.fusion-page-layouts' ).clone(),
|
|
postId;
|
|
|
|
data.find( 'li' ).each( function() {
|
|
postId = jQuery( this ).find( '.fusion-builder-demo-button-load' ).attr( 'data-post-id' );
|
|
jQuery( this ).find( '.fusion-layout-buttons' ).remove();
|
|
jQuery( this ).find( 'h4' ).attr( 'class', 'fusion_module_title' );
|
|
jQuery( this ).attr( 'data-layout_id', postId );
|
|
jQuery( this ).addClass( 'fusion_builder_custom_' + elementType + '_load' );
|
|
if ( '' !== jQuery( this ).attr( 'data-layout_type' ) ) {
|
|
jQuery( this ).addClass( 'fusion-element-type-' + jQuery( this ).attr( 'data-layout_type' ) );
|
|
}
|
|
} );
|
|
container.append( '<div id="fusion-loader"><span class="fusion-builder-loader"></span></div>' );
|
|
container.append( '<ul class="fusion-builder-all-modules">' + data.html() + '</div>' );
|
|
},
|
|
|
|
rangeOptionPreview: function( view ) {
|
|
view.find( '.fusion-range-option' ).each( function() {
|
|
$( this ).next().html( $( this ).val() );
|
|
$( this ).on( 'change mousemove', function() {
|
|
$( this ).next().html( $( this ).val() );
|
|
} );
|
|
} );
|
|
},
|
|
|
|
addClassToElement: function( builderElement, className, layoutID, cid ) {
|
|
var tooltip = fusionBuilderText.global_element;
|
|
|
|
builderElement.addClass( className );
|
|
builderElement.attr( 'fusion-global-layout', layoutID );
|
|
|
|
if ( 'fusion-global-column' === className ) {
|
|
tooltip = fusionBuilderText.global_column;
|
|
} else if ( 'fusion-global-container' === className ) {
|
|
tooltip = fusionBuilderText.global_container;
|
|
}
|
|
|
|
// If container add to utility toolbar area.
|
|
if ( builderElement.find( '.fusion-builder-container-utility-toolbar' ).length ) {
|
|
builderElement.find( '.fusion-builder-container-utility-toolbar' ).append( '<div class="fusion-builder-global-tooltip" data-cid="' + cid + '"><span>' + tooltip + '</span></div>' );
|
|
} else {
|
|
builderElement.append( '<div class="fusion-builder-global-tooltip" data-cid="' + cid + '"><span>' + tooltip + '</span></div>' );
|
|
}
|
|
},
|
|
|
|
calculateTableData: function( params, view ) {
|
|
var tableDOM,
|
|
tr,
|
|
rowsOld,
|
|
thTdOld,
|
|
tdOld,
|
|
columnsOld;
|
|
|
|
if ( 'undefined' === typeof params.element_content || '' === params.element_content ) {
|
|
return params;
|
|
}
|
|
|
|
tableDOM = jQuery.parseHTML( params.element_content.trim() );
|
|
tr = jQuery( tableDOM ).find( 'tbody > tr' );
|
|
rowsOld = tr.length + 1;
|
|
thTdOld = jQuery( tableDOM ).find( 'th' ).length;
|
|
tdOld = tr.first().children( 'td' ).length;
|
|
columnsOld = Math.max( thTdOld, tdOld );
|
|
|
|
params.fusion_table_columns = columnsOld;
|
|
params.fusion_table_rows = rowsOld;
|
|
|
|
return params;
|
|
},
|
|
|
|
checkOptionDependency: function( view, thisEl, parentValues, repeaterFields, parentEl ) {
|
|
var $dependencies = {},
|
|
$dependencyIds = '',
|
|
$parentDependencyIds = '',
|
|
params = view.params,
|
|
$currentVal,
|
|
$currentId,
|
|
$optionId,
|
|
$passedArray,
|
|
dividerType,
|
|
upAndDown,
|
|
centerOption,
|
|
$targetElement,
|
|
containerView,
|
|
elementCid,
|
|
containerParams;
|
|
|
|
if ( 'undefined' !== typeof repeaterFields ) {
|
|
params = repeaterFields;
|
|
}
|
|
|
|
function doesTestPass( current, comparison, operator ) {
|
|
if ( '==' === operator && current == comparison ) { // jshint ignore:line
|
|
return true;
|
|
}
|
|
if ( '!=' === operator && current != comparison ) { // jshint ignore:line
|
|
return true;
|
|
}
|
|
if ( '>' === operator && current > comparison ) {
|
|
return true;
|
|
}
|
|
if ( '<' === operator && current < comparison ) {
|
|
return true;
|
|
}
|
|
if ( 'contains' === operator && -1 !== current.toString().indexOf( comparison ) ) {
|
|
return true;
|
|
}
|
|
if ( ( 'not_contain' === operator || 'doesnt_contain' === operator ) && -1 === current.toString().indexOf( comparison ) ) {
|
|
return true;
|
|
}
|
|
if ( 'is_empty' === operator ) {
|
|
if ( ! current || '' === current || null === current ) {
|
|
return true;
|
|
}
|
|
}
|
|
if ( 'is_transparent' === operator ) {
|
|
if ( 0 === jQuery.AWB_Color( current ).alpha() ) {
|
|
return true;
|
|
}
|
|
}
|
|
if ( 'is_not_transparent' === operator ) {
|
|
if ( 0 !== jQuery.AWB_Color( current ).alpha() ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// Special check for section separator.
|
|
if ( 'undefined' !== typeof view.shortcode && 'fusion_section_separator' === view.shortcode ) {
|
|
dividerType = thisEl.find( '#divider_type' );
|
|
upAndDown = dividerType.parents( 'ul' ).find( 'li[data-option-id="divider_candy"]' ).find( '.fusion-option-divider_candy' ).find( '.ui-button[data-value="bottom,top"]' );
|
|
centerOption = dividerType.parents( 'ul' ).find( 'li[data-option-id="divider_position"]' ).find( '.fusion-option-divider_position' ).find( '.ui-button[data-value="center"]' );
|
|
|
|
if ( 'triangle' !== dividerType.val() ) {
|
|
upAndDown.hide();
|
|
} else {
|
|
upAndDown.show();
|
|
}
|
|
|
|
if ( 'bigtriangle' !== dividerType.val() ) {
|
|
centerOption.hide();
|
|
} else {
|
|
centerOption.show();
|
|
}
|
|
|
|
dividerType.on( 'change paste keyup', function() {
|
|
|
|
if ( 'triangle' !== jQuery( this ).val() ) {
|
|
upAndDown.hide();
|
|
} else {
|
|
upAndDown.show();
|
|
}
|
|
|
|
if ( 'bigtriangle' !== jQuery( this ).val() ) {
|
|
centerOption.hide();
|
|
if ( centerOption.hasClass( 'ui-state-active' ) ) {
|
|
centerOption.prev().click();
|
|
}
|
|
} else {
|
|
centerOption.show();
|
|
}
|
|
|
|
} );
|
|
}
|
|
|
|
// Menu direction modes.
|
|
if ( 'fusion_menu' === view.shortcode ) {
|
|
const $tabs = thisEl.find( '.fusion-tabs' );
|
|
|
|
$tabs.find( 'input#direction' ).on( 'change', function() {
|
|
if ( $tabs.find( 'input#submenu_mode' ).length && 'accordion' === $tabs.find( 'input#submenu_mode' ).val() ) {
|
|
$tabs.find( '.fusion-option-submenu_mode a[data-value="dropdown"]' ).click();
|
|
}
|
|
} );
|
|
}
|
|
// Initial checks and create helper objects.
|
|
jQuery.each( params, function( index, value ) {
|
|
if ( 'undefined' !== typeof value.dependency ) {
|
|
$optionId = index;
|
|
$passedArray = [];
|
|
|
|
// Check each dependency for this option
|
|
jQuery.each( value.dependency, function( index, dependency ) {
|
|
|
|
// Create IDs of fields to check for.
|
|
if ( 'undefined' !== typeof repeaterFields && 'parent_' === dependency.element.substring( 0, 7 ) && 0 > $parentDependencyIds.indexOf( '#' + dependency.element.replace( 'parent_', '' ) ) ) {
|
|
$parentDependencyIds += ', [data-option-id="' + dependency.element.replace( 'parent_', '' ) + '"]';
|
|
} else if ( 0 > $dependencyIds.indexOf( '[data-option-id="' + dependency.element + '"]' ) ) {
|
|
$dependencyIds += ', [data-option-id="' + dependency.element + '"]';
|
|
}
|
|
|
|
// If option has dependency add to check array.
|
|
if ( 'undefined' === typeof $dependencies[ dependency.element ] ) {
|
|
$dependencies[ dependency.element ] = [ { option: $optionId, or: value.or } ];
|
|
} else {
|
|
$dependencies[ dependency.element ].push( { option: $optionId, or: value.or } );
|
|
}
|
|
|
|
// Check a value on parent container.
|
|
if ( 'fusion_builder_container' === dependency.element ) {
|
|
$currentVal = 'legacy';
|
|
elementCid = thisEl.attr( 'data-cid' );
|
|
|
|
if ( elementCid ) {
|
|
elementCid = FusionPageBuilderApp.$el.find( '[data-cid=' + elementCid + ']' ).closest( '.fusion-builder-section-content' ).attr( 'data-cid' );
|
|
if ( elementCid ) {
|
|
containerView = FusionPageBuilderViewManager.getView( elementCid );
|
|
if ( 'object' === typeof containerView ) {
|
|
containerParams = containerView.model.get( 'params' );
|
|
containerParams = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.defaults, containerParams );
|
|
$currentVal = containerParams[ ( 'undefined' !== typeof dependency.param ? dependency.param : 'type' ) ];
|
|
}
|
|
}
|
|
}
|
|
|
|
// If parentValues is an object and this is a parent dependency, then we should take value from there.
|
|
} else if ( 'parent_' === dependency.element.substring( 0, 7 ) ) {
|
|
if ( 'undefined' !== typeof repeaterFields ) {
|
|
$currentVal = thisEl.parents( '.fusion-builder-main-settings' ).find( '#' + dependency.element.replace( 'parent_', '' ) ).val();
|
|
} else if ( 'object' === typeof parentValues && parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ] ) {
|
|
$currentVal = parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ];
|
|
} else {
|
|
$currentVal = '';
|
|
}
|
|
} else {
|
|
$currentVal = thisEl.find( '[data-option-id="' + dependency.element + '"]' ).filter( function() {
|
|
return 0 === jQuery( this ).closest( '.dynamic-param-fields' ).length;
|
|
} ).find( '#' + dependency.element ).val();
|
|
|
|
// Use fake value if dynamic data is set.
|
|
if ( '' === $currentVal && 'true' === thisEl.find( '#' + dependency.element ).closest( '.fusion-builder-option' ).attr( 'data-dynamic' ) ) {
|
|
$currentVal = 'using-dynamic-value';
|
|
}
|
|
|
|
// Check for current post type dependency.
|
|
if ( '_post_type_edited' === dependency.element ) {
|
|
$currentVal = jQuery( '#post_type' ).val();
|
|
}
|
|
}
|
|
$passedArray.push( doesTestPass( $currentVal, dependency.value, dependency.operator ) );
|
|
} );
|
|
|
|
$targetElement = thisEl.find( '[name ="' + index + '"]' ).closest( '.fusion-builder-option' );
|
|
if ( 0 === $targetElement.length && 'element_content' !== index ) {
|
|
$targetElement = thisEl.find( '[data-option-id="' + index + '"]' );
|
|
}
|
|
|
|
// Check if it passes for regular "and" test.
|
|
if ( -1 === $.inArray( false, $passedArray ) && 'undefined' === typeof value.or ) {
|
|
$targetElement.fadeIn( 300 );
|
|
|
|
// Check if it passes "or" test.
|
|
} else if ( -1 !== $.inArray( true, $passedArray ) && 'undefined' !== typeof value.or ) {
|
|
$targetElement.fadeIn( 300 );
|
|
|
|
// If it fails.
|
|
} else {
|
|
$targetElement.hide();
|
|
}
|
|
}
|
|
} );
|
|
|
|
// Listen for changes to options which other are dependent on.
|
|
if ( $dependencyIds.length ) {
|
|
thisEl.find( $dependencyIds.substring( 2 ) ).filter( function() {
|
|
return 0 === jQuery( this ).closest( '.dynamic-param-fields' ).length;
|
|
} ).on( 'change paste keyup', function() {
|
|
$currentId = jQuery( this ).attr( 'data-option-id' );
|
|
|
|
// Loop through each option id that is dependent on this option.
|
|
jQuery.each( $dependencies[ $currentId ], function( index, value ) {
|
|
$passedArray = [];
|
|
|
|
// Check each dependency for that id.
|
|
jQuery.each( params[ value.option ].dependency, function( index, dependency ) {
|
|
|
|
if ( 'fusion_builder_container' === dependency.element ) {
|
|
$currentVal = 'legacy';
|
|
elementCid = thisEl.attr( 'data-cid' );
|
|
|
|
if ( elementCid ) {
|
|
elementCid = FusionPageBuilderApp.$el.find( '[data-cid=' + elementCid + ']' ).closest( '.fusion-builder-section-content' ).attr( 'data-cid' );
|
|
if ( elementCid ) {
|
|
containerView = FusionPageBuilderViewManager.getView( elementCid );
|
|
if ( 'object' === typeof containerView ) {
|
|
containerParams = containerView.model.get( 'params' );
|
|
containerParams = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.defaults, containerParams );
|
|
$currentVal = containerParams[ ( 'undefined' !== typeof dependency.param ? dependency.param : 'type' ) ];
|
|
}
|
|
}
|
|
}
|
|
|
|
// If parentValues is an object and this is a parent dependency, then we should take value from there.
|
|
} else if ( 'parent_' === dependency.element.substring( 0, 7 ) ) {
|
|
if ( 'object' === typeof parentValues && parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ] ) {
|
|
$currentVal = parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ];
|
|
} else {
|
|
$currentVal = '';
|
|
}
|
|
} else {
|
|
$currentVal = thisEl.find( '[data-option-id="' + dependency.element + '"]' ).filter( function() {
|
|
return 0 === jQuery( this ).closest( '.dynamic-param-fields' ).length;
|
|
} ).find( '#' + dependency.element ).val();
|
|
}
|
|
|
|
// Use fake value if dynamic data is set.
|
|
if ( '' === $currentVal && 'true' === jQuery( '#' + $currentId ).closest( '.fusion-builder-option' ).attr( 'data-dynamic' ) ) {
|
|
$currentVal = 'using-dynamic-value';
|
|
}
|
|
|
|
$passedArray.push( doesTestPass( $currentVal, dependency.value, dependency.operator ) );
|
|
} );
|
|
|
|
$targetElement = thisEl.find( '[data-option-id="' + value.option + '"]' );
|
|
|
|
// Check if it passes for regular "and" test.
|
|
if ( -1 === $.inArray( false, $passedArray ) && 'undefined' === typeof value.or ) {
|
|
$targetElement.fadeIn( 300 );
|
|
|
|
// Check if it passes "or" test.
|
|
} else if ( -1 !== $.inArray( true, $passedArray ) && 'undefined' !== typeof value.or ) {
|
|
$targetElement.fadeIn( 300 );
|
|
|
|
// If it fails.
|
|
} else {
|
|
$targetElement.hide();
|
|
}
|
|
} );
|
|
|
|
} );
|
|
}
|
|
|
|
// Repeater element row, listen for changes to parent options.
|
|
if ( 'undefined' !== typeof repeaterFields && 'undefined' !== typeof parentEl && $parentDependencyIds.length ) {
|
|
parentEl.on( 'change paste keyup', $parentDependencyIds.substring( 2 ), function() {
|
|
$currentId = jQuery( this ).attr( 'id' );
|
|
|
|
// Loop through each option id that is dependent on this option.
|
|
jQuery.each( $dependencies[ 'parent_' + $currentId ], function( index, value ) {
|
|
$passedArray = [];
|
|
|
|
// Check each dependency for that id.
|
|
jQuery.each( params[ value.option ].dependency, function( index, dependency ) {
|
|
if ( 'parent_' === dependency.element.substring( 0, 7 ) ) {
|
|
$currentVal = parentEl.find( '#' + dependency.element.replace( 'parent_', '' ) ).val();
|
|
} else {
|
|
$currentVal = parentEl.find( '#' + dependency.element ).val();
|
|
}
|
|
$passedArray.push( doesTestPass( $currentVal, dependency.value, dependency.operator ) );
|
|
} );
|
|
|
|
$targetElement = thisEl.find( '#' + value.option ).parents( '.fusion-builder-option' ).first();
|
|
|
|
// Check if it passes for regular "and" test.
|
|
if ( -1 === $.inArray( false, $passedArray ) && 'undefined' === typeof value.or ) {
|
|
$targetElement.fadeIn( 300 );
|
|
|
|
// Check if it passes "or" test.
|
|
} else if ( -1 !== $.inArray( true, $passedArray ) && 'undefined' !== typeof value.or ) {
|
|
$targetElement.fadeIn( 300 );
|
|
|
|
// If it fails.
|
|
} else {
|
|
$targetElement.hide();
|
|
}
|
|
} );
|
|
|
|
} );
|
|
}
|
|
},
|
|
|
|
getParentContainer: function( target ) {
|
|
var view = target;
|
|
|
|
// Not passing view directly, get it assuming cid is passed.
|
|
if ( 'object' !== typeof target ) {
|
|
view = FusionPageBuilderViewManager.getView( target );
|
|
}
|
|
|
|
// No view, return false.
|
|
if ( ! view || 'undefined' === typeof view.model.get ) {
|
|
return false;
|
|
}
|
|
|
|
// View found and is container, return that.
|
|
if ( 'fusion_builder_container' === view.model.get( 'element_type' ) ) {
|
|
return view;
|
|
}
|
|
|
|
// Not container but parent cid exists, try that.
|
|
if ( view.model.get( 'parent' ) ) {
|
|
return this.getParentContainer( view.model.get( 'parent' ) );
|
|
}
|
|
|
|
// Got here, that means no parent, no match, return false.
|
|
return false;
|
|
},
|
|
|
|
getParentColumn: function( target ) {
|
|
var view = target;
|
|
|
|
// Not passing view directly, get it assuming cid is passed.
|
|
if ( 'object' !== typeof target ) {
|
|
view = FusionPageBuilderViewManager.getView( target );
|
|
}
|
|
|
|
// No view, return false.
|
|
if ( ! view || 'undefined' === typeof view.model.get ) {
|
|
return false;
|
|
}
|
|
|
|
// View found and is container, return that.
|
|
if ( 'fusion_builder_column' === view.model.get( 'element_type' ) || 'fusion_builder_column_inner' === view.model.get( 'element_type' ) ) {
|
|
return view;
|
|
}
|
|
|
|
// Not container but parent cid exists, try that.
|
|
if ( view.model.get( 'parent' ) ) {
|
|
return this.getParentColumn( view.model.get( 'parent' ) );
|
|
}
|
|
|
|
// Got here, that means no parent, no match, return false.
|
|
return false;
|
|
},
|
|
|
|
isBlockLayoutColumn: function( view ) {
|
|
var params;
|
|
|
|
if ( ! view || 'undefined' === typeof view.model.get ) {
|
|
return false;
|
|
}
|
|
|
|
params = view.model.get( 'params' );
|
|
return params && 'block' === params.content_layout;
|
|
},
|
|
|
|
isFlex: function( view ) {
|
|
var params,
|
|
legacySupport = 'undefined' === typeof fusionBuilderConfig.container_legacy_support ? false : fusionBuilderConfig.container_legacy_support;
|
|
|
|
if ( false === legacySupport || 0 === legacySupport || '0' === legacySupport ) {
|
|
return true;
|
|
}
|
|
|
|
if ( ! view || 'undefined' === typeof view.model.get ) {
|
|
return false;
|
|
}
|
|
|
|
params = view.model.get( 'params' );
|
|
return params && 'flex' === params.type;
|
|
},
|
|
|
|
isString( s ) {
|
|
if ( 'string' === typeof s || s instanceof String ) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
} );
|
|
|
|
// Instantiate Builder App
|
|
FusionPageBuilderApp = new FusionPageBuilder.AppView( { // jshint ignore:line
|
|
model: FusionPageBuilder.Element,
|
|
collection: FusionPageBuilderElements
|
|
} );
|
|
|
|
// Stores 'active' value in fusion_builder_status meta key if builder is activa
|
|
$useBuilderMetaField = $( '#fusion_use_builder' );
|
|
|
|
// Avada Builder Toggle Button
|
|
$toggleBuilderButton = $( '#fusion_toggle_builder' );
|
|
|
|
// Avada Builder div
|
|
$builder = $( '#fusion_builder_layout' );
|
|
|
|
// Main wrap for the main editor
|
|
$mainEditorWrapper = $( '#fusion_main_editor_wrap' );
|
|
|
|
// Show builder div if it's activated
|
|
if ( $toggleBuilderButton.hasClass( 'fusion_builder_is_active' ) ) {
|
|
$builder.show();
|
|
FusionPageBuilderApp.builderActive = true;
|
|
|
|
// Sticky header
|
|
fusionBuilderEnableStickyHeader();
|
|
|
|
jQuery( 'body' ).addClass( 'fusion-builder-enabled' );
|
|
}
|
|
|
|
// Builder toggle button event
|
|
$toggleBuilderButton.click( function( event ) {
|
|
|
|
var isBuilderUsed;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
isBuilderUsed = $( this ).hasClass( 'fusion_builder_is_active' );
|
|
|
|
if ( isBuilderUsed ) {
|
|
fusionBuilderDeactivate( $( this ) );
|
|
FusionPageBuilderApp.builderActive = false;
|
|
jQuery( 'body' ).removeClass( 'fusion-builder-enabled' );
|
|
jQuery( 'body' ).trigger( 'scroll' );
|
|
} else {
|
|
fusionBuilderActivate( $( this ) );
|
|
FusionPageBuilderApp.builderActive = true;
|
|
jQuery( 'body' ).addClass( 'fusion-builder-enabled' );
|
|
}
|
|
} );
|
|
|
|
// Front End Editor button.
|
|
jQuery( '#fusion_toggle_front_end' ).on( 'click', function( event ) {
|
|
var $wpTitle = jQuery( '#title' ),
|
|
$link = jQuery( this );
|
|
|
|
event.preventDefault();
|
|
|
|
if ( window.confirm( fusionBuilderText.front_end_redirect_confirm ) ) {
|
|
if ( ! $wpTitle.val() ) {
|
|
$wpTitle.val( 'FB #' + jQuery( '#post_ID' ).val() );
|
|
}
|
|
|
|
if ( wp.autosave ) {
|
|
wp.autosave.server.triggerSave();
|
|
}
|
|
|
|
// Autosave callback.
|
|
jQuery( document ).on( 'heartbeat-tick.autosave', function() {
|
|
|
|
// Changes saved, so need for "are you sure you want to navigate away" alert.
|
|
jQuery( window ).off( 'beforeunload.edit-post' );
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
url: fusionBuilderConfig.ajaxurl,
|
|
data: {
|
|
action: 'update_page_template_post_meta',
|
|
fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce,
|
|
post_id: jQuery( '#post_ID' ).val()
|
|
}
|
|
} )
|
|
.done( function() {
|
|
|
|
// Redirect user.
|
|
window.location = $link.attr( 'href' );
|
|
} );
|
|
} );
|
|
}
|
|
} );
|
|
|
|
// Sticky builder header
|
|
function fusionBuilderEnableStickyHeader() {
|
|
var builderHeader = document.getElementById( 'fusion_builder_controls' ),
|
|
adminbarHeight = jQuery( '#wpadminbar' ).length ? jQuery( '#wpadminbar' ).height() : 0;
|
|
fusionBuilderStickyHeader( builderHeader, adminbarHeight );
|
|
}
|
|
|
|
function fusionBuilderActivate( toggle ) {
|
|
|
|
fusionBuilderReset();
|
|
|
|
FusionPageBuilderApp.initialBuilderLayout();
|
|
|
|
$useBuilderMetaField.val( 'active' );
|
|
|
|
$builder.show();
|
|
|
|
toggle.children( 'span' ).text( toggle.data( 'editor' ) );
|
|
toggle.toggleClass( 'fusion_builder_is_active' ).toggleClass( 'button-primary' ).toggleClass( 'fusiona-FB_logo_black' );
|
|
|
|
$mainEditorWrapper.toggleClass( 'fusion_builder_hidden' );
|
|
|
|
// Sticky header
|
|
fusionBuilderEnableStickyHeader();
|
|
|
|
}
|
|
|
|
function fusionBuilderReset() {
|
|
|
|
// Clear all models and views
|
|
FusionPageBuilderElements.reset();
|
|
FusionPageBuilderViewManager.set( 'elementCount', 0 );
|
|
FusionPageBuilderViewManager.set( 'views', {} );
|
|
|
|
// Clear layout
|
|
$( '#fusion_builder_container' ).html( '' );
|
|
|
|
FusionPageBuilderApp.shortcodeGenerator = false;
|
|
}
|
|
|
|
function fusionBuilderDeactivate() {
|
|
var $body,
|
|
pagePosition;
|
|
|
|
fusionBuilderReset();
|
|
|
|
$body = $( 'body' );
|
|
pagePosition = 0;
|
|
|
|
window.wpActiveEditor = 'content';
|
|
|
|
$useBuilderMetaField.val( 'off' );
|
|
|
|
$builder.hide();
|
|
|
|
$toggleBuilderButton.children( 'span' ).text( $toggleBuilderButton.data( 'builder' ) );
|
|
$toggleBuilderButton.toggleClass( 'fusion_builder_is_active' ).toggleClass( 'button-primary' ).toggleClass( 'fusiona-FB_logo_black' );
|
|
|
|
$mainEditorWrapper.toggleClass( 'fusion_builder_hidden' );
|
|
|
|
FusionPageBuilderApp.$el.find( '.fusion_builder_container' ).remove();
|
|
|
|
pagePosition = $body.scrollTop();
|
|
jQuery( 'html, body' ).scrollTop( pagePosition + 1 );
|
|
|
|
}
|
|
|
|
// Remove preview image.
|
|
$container = $( 'body' );
|
|
$container.on( 'click', '.upload-image-remove', function( event ) {
|
|
var $field,
|
|
$preview,
|
|
$upload,
|
|
imageIDField;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
$field = $( this ).parents( '.fusion-builder-option-container' ).find( '.fusion-builder-upload-field' );
|
|
$preview = $( this ).parents( '.fusion-builder-option-container' ).find( '.fusion-builder-upload-preview' );
|
|
$upload = $( this ).parents( '.fusion-builder-option-container' ).find( '.fusion-builder-upload-button' );
|
|
|
|
$field.val( '' ).trigger( 'change' );
|
|
$upload.val( 'Upload Image' );
|
|
$preview.remove();
|
|
|
|
FusionPageBuilderEvents.trigger( 'awb-image-upload-url-' + $upload.data( 'param' ), '' );
|
|
|
|
// Remove image ID if image is removed.
|
|
imageIDField = $upload.closest( '.fusion-builder-module-settings' ).find( '#' + $upload.data( 'param' ) + '_id' );
|
|
|
|
if ( 'element_content' === $upload.data( 'param' ) ) {
|
|
imageIDField = $upload.parents( '.fusion-builder-option' ).next().find( '#image_id' );
|
|
}
|
|
|
|
if ( imageIDField.length ) {
|
|
imageIDField.val( '' );
|
|
}
|
|
|
|
jQuery( this ).remove();
|
|
} );
|
|
|
|
// History steps.
|
|
$( 'body' ).on( 'click', '.fusion-builder-history-list li', function( event ) {
|
|
var step;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
step = $( event.currentTarget ).data( 'state-id' );
|
|
fusionHistoryManager.historyStep( step );
|
|
} );
|
|
|
|
$( 'body' ).on( 'click', '.fusion-studio-preview-active .awb-import-studio-item-in-preview', function( event ) {
|
|
var $wrapper = jQuery( event.currentTarget ).closest( '.studio-wrapper ' ),
|
|
dataID = $wrapper.data( 'layout-id' );
|
|
|
|
event.preventDefault();
|
|
|
|
jQuery( '.fusion-studio-preview-active .fusion-studio-preview-back' ).trigger( 'click' );
|
|
jQuery( '.fusion-page-layout[data-layout-id="' + dataID + '"]' ).find( '.awb-import-studio-item' ).trigger( 'click' );
|
|
} );
|
|
|
|
// Studio preview.
|
|
$( 'body' ).on( 'click', '.studio-wrapper .fusion-page-layout:not(.awb-demo-pages-layout) img', function( event ) {
|
|
var $item = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ),
|
|
url = $item.data( 'url' ),
|
|
$wrapper = $( event.currentTarget ).closest( '.studio-wrapper' );
|
|
|
|
$wrapper.addClass( 'loading fusion-studio-preview-active' );
|
|
$wrapper.find( '.awb-import-options' ).addClass( 'open' );
|
|
$wrapper.find( '.fusion-loader' ).show();
|
|
$wrapper.append( '<iframe class="awb-studio-preview-frame" src="' + url + '" frameBorder="0" scrolling="auto" onload="FusionPageBuilderApp.studioPreviewLoaded();" allowfullscreen=""></iframe>' );
|
|
$wrapper.data( 'layout-id', $item.data( 'layout-id' ) );
|
|
} );
|
|
|
|
// Remove studio preview.
|
|
$( 'body' ).on( 'click', '.fusion-studio-preview-back', function( event ) {
|
|
var $wrapper = $( event.currentTarget ).closest( '.studio-wrapper' );
|
|
|
|
event.preventDefault();
|
|
|
|
$wrapper.removeClass( 'fusion-studio-preview-active' );
|
|
$wrapper.find( '.awb-import-options' ).removeClass( 'open' );
|
|
$wrapper.find( '.awb-studio-preview-frame' ).remove();
|
|
} );
|
|
|
|
// Element option tabs.
|
|
$( 'body' ).on( 'click', '.fusion-tabs-menu a', function( event ) {
|
|
|
|
var tab, view, viewWeb;
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
FusionPageBuilderEvents.trigger( 'fusion-switch-element-option-tabs' );
|
|
FusionPageBuilderEvents.trigger( 'fusion-switch-element-option-tabs' );
|
|
|
|
$( this ).parent().addClass( 'current' ).removeClass( 'inactive' );
|
|
$( this ).parent().siblings().removeClass( 'current' ).addClass( 'inactive' );
|
|
tab = $( this ).attr( 'href' );
|
|
$( this ).parents( '.fusion-builder-modal-container' ).find( '.fusion-tab-content' ).not( tab ).css( 'display', 'none' );
|
|
$( '.fusion-builder-layouts-tab' ).hide();
|
|
|
|
if ( $( this ).parents( '.fusion-builder-modal-container' ).length ) {
|
|
$( this ).parents( '.fusion-builder-modal-container' ).find( '.fusion-tab-content' + tab ).fadeIn( 'fast' );
|
|
} else {
|
|
$( tab ).fadeIn( 'fast' );
|
|
}
|
|
|
|
$( this ).parents( '.fusion-builder-modal-container' ).find( '.fusion-builder-main-settings' ).scrollTop( 0 );
|
|
|
|
if ( jQuery( '.fusion-builder-modal-top-container' ).find( '.fusion-elements-filter' ).length ) {
|
|
setTimeout( function() {
|
|
jQuery( '.fusion-builder-modal-top-container' ).find( '.fusion-elements-filter' ).focus();
|
|
}, 50 );
|
|
}
|
|
|
|
// Trigger ajax for studio.
|
|
if ( '#fusion-builder-fusion_template-studio' === tab ) {
|
|
view = new FusionPageBuilder.BaseLibraryView();
|
|
view.loadStudio( 'fusion_template' );
|
|
}
|
|
|
|
// Trigger ajax for website.
|
|
if ( '#fusion-builder-layouts-demos' === tab ) {
|
|
viewWeb = new FusionPageBuilder.BaseLibraryView();
|
|
viewWeb.loadWebsite();
|
|
}
|
|
} );
|
|
|
|
// Viewport options.
|
|
$( 'body' ).on( 'click', '.fusion-viewport-indicator a', function( event ) {
|
|
var $portLink = jQuery( event.target ),
|
|
port = $portLink.closest( 'li' ).data( 'viewport' );
|
|
|
|
if ( event ) {
|
|
event.preventDefault();
|
|
}
|
|
|
|
// EOs.
|
|
$portLink.closest( '.fusion-builder-modal-settings-container' ).find( '.fusion-builder-main-settings' ).removeClass( 'fusion-large fusion-medium fusion-small' ).addClass( port );
|
|
$portLink.closest( 'ul' ).find( 'li' ).removeClass( 'active' );
|
|
$portLink.closest( 'li' ).addClass( 'active' );
|
|
|
|
// POs.
|
|
$portLink.closest( '.postbox' ).removeClass( 'fusion-large fusion-medium fusion-small' ).addClass( port );
|
|
$portLink.closest( '.postbox' ).find( 'ul.fusion-viewport-indicator li' ).removeClass( 'active' );
|
|
$portLink.closest( '.postbox' ).find( 'ul.fusion-viewport-indicator' ).find( 'li[data-viewport="' + port + '"]' ).addClass( 'active' );
|
|
|
|
} );
|
|
|
|
// Responsive setup on option change.
|
|
$( 'body' ).on( 'click', '.fusion_builder_module_settings[data-type="fusion_builder_container"] li.fusion-builder-option[data-option-id="type"] a', function( event ) {
|
|
var $option = jQuery( event.target ),
|
|
$container = jQuery( event.target ).closest( '.fusion_builder_module_settings' );
|
|
|
|
'flex' === $option.data( 'value' ) ? $container.addClass( 'has-flex' ) : $container.removeClass( 'has-flex' );
|
|
|
|
} );
|
|
|
|
// Close modal on overlick click.
|
|
jQuery( '.fusion_builder_modal_overlay' ).on( 'click', function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' );
|
|
FusionPageBuilderEvents.trigger( 'fusion-close-modal' );
|
|
} );
|
|
|
|
// Close nested modal on overlick click.
|
|
jQuery( '.fusion_builder_modal_inner_row_overlay' ).on( 'click', function() {
|
|
FusionPageBuilderEvents.trigger( 'fusion-close-inner-modal' );
|
|
FusionPageBuilderEvents.trigger( 'fusion-hide-library' );
|
|
} );
|
|
|
|
// Demo select.
|
|
$selectedDemo = jQuery( '.fusion-builder-demo-select' ).val();
|
|
jQuery( '#fusion-builder-layouts-demos .demo-' + $selectedDemo ).show();
|
|
|
|
jQuery( '.fusion-builder-demo-select' ).on( 'change', function() {
|
|
$selectedDemo = jQuery( '.fusion-builder-demo-select' ).val();
|
|
jQuery( '#fusion-builder-layouts-demos .fusion-page-layouts' ).hide();
|
|
jQuery( '#fusion-builder-demo-url-invalid' ).hide();
|
|
jQuery( '.fusion-builder-demo-page-link' ).val( '' );
|
|
jQuery( '#fusion-builder-layouts-demos .demo-' + $selectedDemo ).show();
|
|
} );
|
|
|
|
jQuery( '.fusion-builder-demo-page-link' ).on( 'input', function() {
|
|
var demoPageLink = jQuery( this ).val(),
|
|
demoPage,
|
|
parentDemo,
|
|
demoSelectorVal;
|
|
|
|
demoPageLink = demoPageLink.replace( 'https://', '' ).replace( 'http://', '' );
|
|
if ( '/' !== demoPageLink[ demoPageLink.length - 1 ] && ! _.isEmpty( demoPageLink ) ) {
|
|
demoPageLink += '/';
|
|
}
|
|
|
|
demoPage = jQuery( '#fusion-builder-layouts-demos' ).find( '.fusion-page-layout[data-page-link="' + demoPageLink + '"]' );
|
|
parentDemo = demoPage.closest( '.fusion-page-layouts' );
|
|
|
|
jQuery( '#fusion-builder-layouts-demos .fusion-page-layouts' ).hide();
|
|
jQuery( '#fusion-builder-demo-url-invalid' ).hide();
|
|
|
|
if ( _.isEmpty( demoPageLink ) ) {
|
|
demoSelectorVal = jQuery( '.fusion-builder-demo-select' ).val();
|
|
jQuery( '#fusion-builder-layouts-demos .demo-' + demoSelectorVal ).show();
|
|
} else if ( ! demoPage.length ) {
|
|
jQuery( '#fusion-builder-demo-url-invalid' ).show();
|
|
} else {
|
|
parentDemo.show();
|
|
parentDemo.find( '.fusion-page-layout' ).hide();
|
|
demoPage.show();
|
|
}
|
|
} );
|
|
|
|
// Iconpicker select/deselect handler.
|
|
jQuery( 'body' ).on( 'click', '.icon_select_container .icon_preview', function( e ) {
|
|
|
|
var fontName,
|
|
subset = 'fas',
|
|
$i = jQuery( this ).find( 'i' ),
|
|
value = '',
|
|
$containerParent = jQuery( this ).closest( '.fusion-iconpicker' );
|
|
|
|
e.preventDefault();
|
|
|
|
fontName = 'fa-' + jQuery( this ).find( 'i' ).attr( 'data-name' );
|
|
|
|
if ( ! $i.hasClass( 'fas' ) && ! $i.hasClass( 'fab' ) && ! $i.hasClass( 'far' ) && ! $i.hasClass( 'fal' ) ) {
|
|
|
|
// Custom icon set, so we need to add prefix.
|
|
value = 'fusion-prefix-' + jQuery( this ).find( 'i' ).attr( 'class' );
|
|
} else if ( $i.hasClass( 'fab' ) ) {
|
|
subset = 'fab';
|
|
} else if ( $i.hasClass( 'far' ) ) {
|
|
subset = 'far';
|
|
} else if ( $i.hasClass( 'fal' ) ) {
|
|
subset = 'fal';
|
|
}
|
|
|
|
// FA icon.
|
|
if ( '' === value ) {
|
|
value = fontName + ' ' + subset;
|
|
}
|
|
|
|
if ( $( this ).hasClass( 'selected-element' ) ) {
|
|
$containerParent.find( '.selected-element' ).removeClass( 'selected-element' );
|
|
$containerParent.find( '.fusion-iconpicker-input' ).attr( 'value', '' ).trigger( 'change' );
|
|
|
|
} else {
|
|
$containerParent.find( '.selected-element' ).removeClass( 'selected-element' );
|
|
$( this ).find( 'i' ).parent().addClass( 'selected-element' );
|
|
$containerParent.find( '.fusion-iconpicker-input' ).attr( 'value', value ).trigger( 'change' );
|
|
}
|
|
} );
|
|
|
|
// Copy icon name to clipboard.
|
|
jQuery( 'body' ).on( 'contextmenu', '.icon_select_container .icon_preview', function( event ) {
|
|
const iconName = jQuery( this ).children( 'i' ).attr( 'class' );
|
|
|
|
if ( 'clipboard' in navigator ) {
|
|
navigator.clipboard.writeText( iconName );
|
|
} else {
|
|
const textArea = document.createElement('textarea');
|
|
textArea.value = iconName;
|
|
textArea.style.opacity = 0;
|
|
document.body.appendChild( textArea );
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
const success = document.execCommand( 'copy' );
|
|
document.body.removeChild( textArea );
|
|
}
|
|
|
|
jQuery( this ).fadeOut( 100 );
|
|
jQuery( this ).fadeIn( 100 );
|
|
|
|
return false;
|
|
} );
|
|
|
|
// Open shortcode generator.
|
|
$( document ).on( 'click', '#qt_content_fusion_shortcodes_text_mode, #qt_excerpt_fusion_shortcodes_text_mode, #qt_element_content_fusion_shortcodes_text_mode', function() {
|
|
openShortcodeGenerator( $( this ) );
|
|
} );
|
|
|
|
$( 'input[type="radio"][name="screen_columns"]' ).on( 'click', function() {
|
|
$( window ).trigger( 'resize' );
|
|
} );
|
|
|
|
$( '.notice-dismiss, #show-settings-link' ).on( 'click', function() {
|
|
setTimeout( function() {
|
|
$( window ).trigger( 'resize' );
|
|
}, 750 );
|
|
} );
|
|
|
|
// Save layout template on return key.
|
|
$( '#new_template_name' ).on( 'keydown', function( e ) {
|
|
if ( 13 === e.keyCode || '13' === e.keyCode ) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
FusionPageBuilderEvents.trigger( 'fusion-save-layout' );
|
|
return false;
|
|
}
|
|
return true;
|
|
} );
|
|
|
|
// Save elements on return key.
|
|
$( 'body' ).on( 'keydown', '#fusion-builder-save-element-input', function( e ) {
|
|
if ( 13 === e.keyCode || '13' === e.keyCode ) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
$( '.fusion-builder-element-button-save' ).trigger( 'click' );
|
|
return false;
|
|
}
|
|
return true;
|
|
} );
|
|
|
|
// Handle the sticky publish buttons.
|
|
jQuery( '.fusion-preview' ).click( function( e ) {
|
|
e.preventDefault();
|
|
jQuery( '#post-preview' ).trigger( 'click' );
|
|
} );
|
|
jQuery( '.fusion-save-draft' ).click( function( e ) {
|
|
e.preventDefault();
|
|
jQuery( '#save-post' ).trigger( 'click' );
|
|
} );
|
|
jQuery( '.fusion-update' ).click( function( e ) {
|
|
e.preventDefault();
|
|
jQuery( '#publish' ).trigger( 'click' );
|
|
} );
|
|
|
|
function fusionInitIconPicker() {
|
|
var icons = fusionBuilderConfig.fontawesomeicons,
|
|
output = '<div class="fusion-icons-rendered" style="position:relative; height:0px; overflow:hidden;">',
|
|
outputSets = {
|
|
fas: '',
|
|
fab: '',
|
|
far: '',
|
|
fal: ''
|
|
},
|
|
iconSubsets = {
|
|
fas: 'Solid',
|
|
far: 'Regular',
|
|
fal: 'Light',
|
|
fab: 'Brands'
|
|
},
|
|
outputNav = '<div class="fusion-icon-picker-nav-rendered" style="height:0px; overflow:hidden;">',
|
|
isSearchDefined = 'undefined' !== typeof fusionIconSearch && Array.isArray( fusionIconSearch );
|
|
|
|
// Iterate through all FA icons and divide them into sets (one icon can belong to multiple sets).
|
|
_.each( icons, function( icon, key ) {
|
|
|
|
_.each( icon[ 1 ], function( iconSubset ) {
|
|
if ( -1 !== fusionBuilderConfig.fontawesomesubsets.indexOf( iconSubset ) ) {
|
|
outputSets[ iconSubset ] += '<span class="icon_preview ' + key + '" title="' + key + ' - ' + iconSubsets[ iconSubset ] + '"><i class="' + icon[ 0 ] + ' ' + iconSubset + '" data-name="' + icon[ 0 ].substr( 3 ) + '" aria-hidden="true"></i></span>';
|
|
}
|
|
} );
|
|
} );
|
|
|
|
// Add FA sets to output.
|
|
_.each( iconSubsets, function( label, key ) {
|
|
if ( -1 !== fusionBuilderConfig.fontawesomesubsets.indexOf( key ) ) {
|
|
outputNav += '<a href="#fusion-' + key + '">' + label + '</a>';
|
|
output += '<div id="fusion-' + key + '" class="fusion-icon-set">' + outputSets[ key ] + '</div>';
|
|
}
|
|
} );
|
|
|
|
// WIP: Add custom icons.
|
|
icons = fusionBuilderConfig.customIcons;
|
|
_.each( icons, function( iconSet, IconSetKey ) {
|
|
outputNav += '<a href="#' + IconSetKey + '">' + iconSet.name + '</a>';
|
|
output += '<div id="' + IconSetKey + '" class="fusion-icon-set fusion-custom-icon-set">';
|
|
_.each( iconSet.icons, function( icon ) {
|
|
|
|
if ( isSearchDefined ) {
|
|
fusionIconSearch.push( { name: icon } );
|
|
}
|
|
|
|
output += '<span class="icon_preview ' + icon + '" title="' + iconSet.css_prefix + icon + '"><i class="' + iconSet.css_prefix + icon + '" data-name="' + icon + '" aria-hidden="true"></i></span>';
|
|
} );
|
|
output += '</div>';
|
|
} );
|
|
|
|
outputNav += '</div>';
|
|
output += '</div>';
|
|
|
|
$( 'body' ).append( output + outputNav ).trigger( 'awb-icon-picker-init' );
|
|
|
|
}
|
|
|
|
// Init icon picker on page load.
|
|
fusionInitIconPicker();
|
|
|
|
/**
|
|
* Reinit icon picker.
|
|
*
|
|
* @since 2.0
|
|
* @return {void}
|
|
*/
|
|
FusionPageBuilder.reInitIconPicker = function() {
|
|
jQuery( '.fusion-icons-rendered' ).remove();
|
|
jQuery( '.fusion-icon-picker-nav-rendered' ).remove();
|
|
|
|
fusionInitIconPicker();
|
|
};
|
|
|
|
} );
|
|
}( jQuery ) );
|