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

377 lines
9.7 KiB
JavaScript

/* global FusionEvents */
var FusionPageBuilder = FusionPageBuilder || {};
( function() {
jQuery( document ).ready( function() {
// Image Before After Element View.
FusionPageBuilder.fusion_image_before_after = FusionPageBuilder.ElementView.extend( {
/**
* Runs when element is first init.
*
* @since 2.0.0
* @return {void}
*/
onInit: function() {
this.listenTo( FusionEvents, 'fusion-preview-toggle', this.previewToggle );
this.listenTo( FusionEvents, 'fusion-iframe-loaded', this.initElement );
},
/**
* Init Element.
*
* @since 2.0.0
* @return {void}
*/
initElement: function() {
jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_image_before_after', this.model.attributes.cid );
},
/**
* Preview mode toggled.
*
* @since 2.0.0
* @return {void}
*/
previewToggle: function() {
if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'fusion-builder-preview-mode' ) ) {
this.disableDroppableElement();
} else {
this.enableDroppableElement();
}
},
/**
* Runs before view DOM is patched.
*
* @since 2.0.0
* @return {void}
*/
beforePatch: function() {
this.$el.css( 'min-height', this.$el.outerHeight() + 'px' );
},
/**
* Runs after view DOM is patched.
*
* @since 2.0
* @return {void}
*/
afterPatch: function() {
var self = this;
this._refreshJs();
setTimeout( function() {
self.$el.css( 'min-height', '0px' );
}, 300 );
},
/**
* Modify template attributes.
*
* @since 2.0
* @param {Object} atts - The attributes.
* @return {Object}
*/
filterTemplateAtts: function( atts ) {
var attributes = {};
if ( '' !== atts.values.before_image || '' !== atts.values.after_image ) {
// Validate values.
this.validateValues( atts.values );
// Create attribute objects
attributes.attr = this.buildAttr( atts.values );
attributes.attrWrapper = this.buildWrapperAttr( atts.values );
attributes.attrLink = this.buildLinkAttr( atts.values );
attributes.attrBeforeImage = this.buildBeforeImageAttr( atts.values );
attributes.attrAfterImage = this.buildAfterImageAttr( atts.values );
attributes.attrOverlay = this.buildOverlayAttr( atts.values );
attributes.attrHandle = this.buildHandleAttr( atts.values );
// Any extras that need passed on.
attributes.values = atts.values;
}
return attributes;
},
/**
* Modifies the values.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {void}
*/
validateValues: function( values ) {
values.offset = parseInt( values.offset, 10 ) / 100;
values.font_size = _.fusionValidateAttrValue( values.font_size, 'px' );
values.borderradius = _.fusionValidateAttrValue( values.borderradius, 'px' );
values.bordersize = _.fusionValidateAttrValue( values.bordersize, 'px' );
values.max_width = _.fusionValidateAttrValue( values.max_width, 'px' );
values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' );
values.margin_left = _.fusionValidateAttrValue( values.margin_left, 'px' );
values.margin_right = _.fusionValidateAttrValue( values.margin_right, 'px' );
values.margin_top = _.fusionValidateAttrValue( values.margin_top, 'px' );
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildAttr: function( values ) {
var attr = {
class: 'fusion-image-before-after-element',
style: ''
},
cid = this.model.get( 'cid' );
if ( 'switch' === values.type ) {
attr[ 'class' ] += ' fusion-image-switch';
} else if ( 'before_after' === values.type ) {
attr[ 'class' ] += ' fusion-image-before-after fusion-image-before-after-container';
if ( values.offset || 0 == values.offset ) {
attr[ 'data-offset' ] = values.offset.toString();
}
if ( values.orientation ) {
attr[ 'data-orientation' ] = values.orientation;
}
if ( values.handle_movement ) {
if ( 'drag_click' === values.handle_movement ) {
attr[ 'data-move-with-handle-only' ] = 'true';
attr[ 'data-click-to-move' ] = 'true';
} else if ( 'drag' === values.handle_movement ) {
attr[ 'data-move-with-handle-only' ] = 'true';
} else if ( 'hover' === values.handle_movement ) {
attr[ 'data-move-slider-on-hover' ] = 'true';
}
}
}
if ( '' !== values.max_width ) {
attr.style += 'max-width:' + values.max_width + ';';
}
attr[ 'class' ] += ' fusion-image-before-after-cid' + cid;
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildWrapperAttr: function( values ) {
var attr = _.fusionVisibilityAtts( values.hide_on_mobile, {
class: 'fusion-image-before-after-wrapper',
style: this.getStyleVars( values )
} ),
cid = this.model.get( 'cid' );
if ( values.orientation && 'before_after' === values.type ) {
attr[ 'class' ] += ' fusion-image-before-after-' + values.orientation;
}
if ( '' !== values.type ) {
attr[ 'class' ] += ' type-' + values.type.replace( '_', '-' );
}
if ( '' !== values.label_hover_type ) {
const hoverTypeExtra = 'out-image-up-down' === values.label_placement ? 'out-' : '';
attr[ 'class' ] += ' hover-type-' + hoverTypeExtra + values.label_hover_type;
}
if ( '' !== values.alignment ) {
attr[ 'class' ] += ' has-alignment';
attr[ 'class' ] += ' align-' + values.alignment;
}
if ( '' !== values[ 'class' ] ) {
attr[ 'class' ] += ' ' + values[ 'class' ];
}
if ( '' !== values.id ) {
attr.id = values.id;
}
attr = _.fusionAnimations( values, attr );
attr[ 'class' ] += ' fusion-image-before-after-wrapper-cid' + cid;
return attr;
},
/**
* Builds link attributes.
*
* @since 2.2
* @param {Object} values - The values object.
* @return {Object}
*/
buildLinkAttr: function( values ) {
var attr = {
class: 'fusion-image-switch-link',
href: values.link,
target: values.target,
rel: ''
};
if ( '_blank' === values.target ) {
attr.rel = 'noopener noreferrer';
}
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildBeforeImageAttr: function( values ) {
var attr = {
class: 'before_after' === values.type ? 'fusion-image-before-after-before' : 'fusion-image-switch-before',
src: values.before_image,
alt: ''
};
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildAfterImageAttr: function( values ) {
var attr = {
class: 'before_after' === values.type ? 'fusion-image-before-after-after' : 'fusion-image-switch-after',
src: values.after_image,
alt: ''
};
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildOverlayAttr: function( values ) {
var attr = {
class: 'fusion-image-before-after-overlay'
};
if ( values.label_placement && '' !== values.label_placement ) {
attr[ 'class' ] += ' before-after-overlay-' + values.label_placement;
}
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildHandleAttr: function( values ) {
var attr = {
class: 'fusion-image-before-after-handle'
};
if ( values.handle_type && 'default' !== values.handle_type ) {
attr[ 'class' ] += ' fusion-image-before-after-handle-' + values.handle_type;
}
return attr;
},
/**
* Get style variables.
*
* @param {Object} values
* @returns string
*/
getStyleVars: function( values ) {
var cssVars = [
'handle_color',
'font_size',
'accent_color',
'bordersize',
'borderradius',
'bordercolor',
'margin_top',
'margin_right',
'margin_bottom',
'margin_left'
],
customCSSVars = {},
color,
colorObj;
this.values = values;
if ( 'circle' !== values.handle_type && 'arrows' !== values.handle_type ) {
cssVars.push( 'handle_bg' );
}
if ( values.handle_color ) {
if ( values.handle_type && 'circle' === values.handle_type ) {
color = values.handle_color;
colorObj = jQuery.AWB_Color( color );
customCSSVars[ 'handle-accent-color' ] = _.fusionAutoCalculateAccentColor( color );
customCSSVars[ 'handle-transparent-color' ] = colorObj.alpha( 0.6 ).toVarOrRgbaString();
}
}
if ( values.accent_color ) {
color = values.accent_color;
colorObj = jQuery.AWB_Color( color );
customCSSVars[ 'accent-color-bg' ] = 'transparent';
if ( 'out-image-up-down' !== values.label_placement ) {
customCSSVars[ 'accent-color-bg' ] = colorObj.alpha( colorObj.alpha() * 0.15 ).toVarOrRgbaString();
}
}
if ( values.max_width ) {
customCSSVars[ 'element-width' ] = '100%';
customCSSVars[ 'element-max-width' ] = values.max_width;
}
if ( values.transition_time ) {
customCSSVars.transition_time = values.transition_time + 's';
}
return this.getCssVarsForOptions( cssVars ) + this.getCustomCssVars( customCSSVars );
}
} );
} );
}( jQuery ) );