2026-02-05 17:08:59 +03:00

209 lines
4.9 KiB
JavaScript

var FusionPageBuilder = FusionPageBuilder || {};
( function() {
jQuery( document ).ready( function() {
// Image Hotspots View.
FusionPageBuilder.fusion_image_hotspots = FusionPageBuilder.ParentElementView.extend( {
/**
* Modify template attributes.
*
* @since 3.5
* @param {Object} atts - The attributes.
* @return {Object}
*/
filterTemplateAtts: function( atts ) {
var attributes = {};
attributes.hotspotImage = this.getImageHtml( atts.values );
attributes.cid = this.model.get( 'cid' );
attributes.elementAttr = this.elementAttr( atts.values );
return attributes;
},
/**
* Create the image element.
*
* @since 3.5
* @param {Object} values - The options.
* @return {Object}
*/
getImageHtml: function( values ) {
var imgAttr = '',
imageData;
if ( ! values.image ) {
return '';
}
if ( _.FusionIsValidJSON( values.image ) ) {
imageData = this.getLogoImage( values.image );
values.image = imageData.url;
}
// There is no width/height/alt/title attributes like in php file.
imgAttr = 'src="' + values.image + '"';
imgAttr += ' class="awb-image-hotspots-image"';
return '<img ' + imgAttr + '/>';
},
/**
* Create the element attributes.
*
* @since 3.5
* @param {Object} values - The options.
* @return {Object}
*/
elementAttr: function( values ) {
var atts = {
'style': this.getInlineStyle( values ),
'class': 'awb-image-hotspots'
},
alignmentLarge,
alignmentMedium,
alignmentSmall;
atts[ 'class' ] += ' ' + this.getBaseClass();
atts = _.fusionVisibilityAtts( values.hide_on_mobile, atts );
if ( values[ 'class' ] ) {
atts[ 'class' ] += ' ' + values[ 'class' ];
}
if ( values.id ) {
atts.id = values.id;
}
atts = _.fusionAnimations( values, atts );
alignmentLarge = values.alignment;
alignmentMedium = ! _.isEmpty( values.alignment_medium ) ? values.alignment_medium : false;
if ( alignmentMedium && alignmentLarge !== alignmentMedium ) {
atts[ 'class' ] += ' md-flex-align-' + alignmentMedium;
}
alignmentSmall = ! _.isEmpty( values.alignment_small ) ? values.alignment_small : false;
if ( alignmentSmall && alignmentLarge !== alignmentSmall ) {
atts[ 'class' ] += ' sm-flex-align-' + alignmentSmall;
}
return atts;
},
/**
* Get inline style.
*
* @since 3.9
* @param {Object} values
* @return string
*/
getInlineStyle: function( values ) {
var cssVarsOptions = {};
this.values = values;
cssVarsOptions = [
'image_max_width',
'alignment',
'popover_heading_background_color',
'popover_content_background_color',
'popover_text_color',
'popover_border_color',
'margin_top',
'margin_right',
'margin_bottom',
'margin_left'
];
return this.getCssVarsForOptions( cssVarsOptions );
},
/**
* Get the class name with an unique id among elements.
*
* @since 3.5
* @return {string}
*/
getBaseClass: function() {
return 'awb-image-hotspots-' + this.model.get( 'cid' );
},
/**
* Get the logo src.
*
* @since 3.5
* @param {string} logo_json
* @return {string}
*/
getLogoImage: function( logo_json ) {
var data = {
'id': '',
'url': '',
'srcset': ''
},
i,
keys_to_verify = [ 'default', 'sticky', 'mobile' ],
is_url,
is_retina_url,
key;
logo_json = JSON.parse( logo_json );
for ( i = 0; 3 > i; i++ ) {
key = keys_to_verify[ i ];
if ( ! logo_json || ! logo_json[ key ] || ! logo_json[ key ].normal ) {
continue; // eslint-disable-line no-continue
}
is_url = ( ! _.isEmpty( logo_json[ key ].normal.url ) && ! _.isEmpty( logo_json[ key ].normal.id ) );
is_retina_url = ( ! _.isEmpty( logo_json[ key ].retina.url ) && ! _.isEmpty( logo_json[ key ].retina.id ) );
if ( is_url ) {
data.url = logo_json[ key ].normal.url;
data.id = logo_json[ key ].normal.id;
data.srcset = data.url + ' 1x';
if ( is_retina_url ) {
data.srcset += ', ' + logo_json[ key ].retina.url + ' 2x';
}
return data;
}
if ( is_retina_url ) {
data.url = logo_json[ key ].retina.url;
data.id = logo_json[ key ].retina.id;
data.srcset = data.url + ' 1x';
return data;
}
}
return data;
},
/**
* Run after the element has been patched.
*
* @since 3.5
* @return {void}
*/
afterPatch: function() {
var popover = '';
// Call the parent afterPatch.
FusionPageBuilder.ParentElementView.prototype.afterPatch.bind( this )();
popover = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.el ).find( '[data-awb-toggle-image-hotspot-popover="true"]' );
popover.popover( 'destroy' );
popover.popover();
}
} );
} );
}( jQuery ) );