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

269 lines
7.5 KiB
JavaScript

/* global fusionAllElements, FusionPageBuilderElements, FusionPageBuilderApp, FusionPageBuilderViewManager, FusionEvents, FusionApp */
var FusionPageBuilder = FusionPageBuilder || {};
( function() {
jQuery( document ).ready( function() {
// Toggle child View
FusionPageBuilder.fusion_openstreetmap_marker = FusionPageBuilder.ChildElementView.extend( {
isSettingsOpen: false,
/**
* Modify template attributes.
*
* @since 3.10
* @param {Object} atts - The attributes.
* @return {Object}
*/
filterTemplateAtts: function( atts ) {
var attributes = {},
parent = this.model.get( 'parent' ),
parentModel = FusionPageBuilderElements.find( function( model ) {
return model.get( 'cid' ) == parent;
} ),
markerContent = '';
this.parentValues = jQuery.extend( true, {}, fusionAllElements.fusion_openstreetmap.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) );
this.values = atts.values;
attributes.cid = this.model.get( 'cid' );
attributes.icon = atts.values.icon;
attributes.iconAttr = this.childElemIconAttr( atts.values );
attributes.childInlineStyle = this.getChildInlineStyle();
attributes.values = atts.values;
attributes.animationClass = this.animationToClassName( this.parentValues.items_animation );
markerContent = atts.values.tooltip_content;
try {
if ( markerContent && '' !== markerContent && FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( markerContent ) ) === markerContent ) {
markerContent = FusionPageBuilderApp.base64Decode( markerContent );
}
} catch ( error ) {
console.log( error ); // jshint ignore:line
}
attributes.markerContent = markerContent;
this.childElemAttr( atts.values );
return attributes;
},
/**
* OnRender callback.
*
* @since 3.10
* @return {void}
*/
onRender: function() {
const self = this;
this.listenTo( FusionEvents, 'fusion-element-removed', function( cid ) {
if ( cid !== self.model.get( 'cid' ) && ( 'undefined' === typeof self.model.parentView || ! self.model.parentView ) ) {
return;
}
const parentView = FusionPageBuilderViewManager.getView( self.model.get( 'parent' ) );
if ( 'undefined' !== typeof parentView ) {
parentView.updateMarkers();
}
} );
},
/**
* Create the child element attributes.
*
* @since 3.10
* @param {Object} values - The options.
* @return {Object}
*/
childElemAttr: function( values ) {
const action = '' === values.action ? this.parentValues.action : values.action;
this.$el.addClass( 'awb-openstreet-map-marker' );
this.$el.addClass( 'awb-openstreet-map-marker-' + this.model.get( 'cid' ) );
// Remove the attributes, because this element is not totally replaced.
this.$el.removeAttr( 'data-latitude' );
this.$el.removeAttr( 'data-longitude' );
this.$el.removeAttr( 'data-icon' );
this.$el.removeAttr( 'data-action' );
this.$el.attr( 'data-latitude', values.latitude );
this.$el.attr( 'data-longitude', values.longitude );
this.$el.attr( 'data-icon', _.fusionFontAwesome( values.icon ) );
this.$el.attr( 'data-action', action );
},
/**
* Create the child inline css vars.
*
* @since 3.10
* @return {string}
*/
getChildInlineStyle: function() {
var cssVarsOptions;
cssVarsOptions = [
'color',
'background_color',
'hover_color',
'hover_background_color'
];
cssVarsOptions.size = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.border_radius_top_left = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.border_radius_top_right = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.border_radius_bottom_right = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.border_radius_bottom_left = { 'callback': _.fusionGetValueWithUnit };
return this.getCssVarsForOptions( cssVarsOptions );
},
/**
* Create the child icon element attributes.
*
* @since 3.10
* @param {Object} values - The options.
* @return {Object}
*/
childElemIconAttr: function( values ) {
var atts = {
'class': _.fusionFontAwesome( values.icon )
};
return atts;
},
/**
* Get the animation class corresponding with the animation id.
*
* @since 3.10
* @param {string} animationName - The animation name.
* @return {string} - Empty string if do not exist.
*/
animationToClassName: function( animationName ) {
if ( 'pumping' === animationName ) {
return 'awb-openstreet-map-marker-anim-pumping';
}
if ( 'pulsating' === animationName ) {
return 'awb-openstreet-map-marker-anim-pulsating';
}
if ( 'showing' === animationName ) {
return 'awb-openstreet-map-marker-anim-showing';
}
if ( 'sonar' === animationName ) {
return 'awb-openstreet-map-marker-anim-sonar';
}
if ( 'pumping_showing' === animationName ) {
return 'awb-openstreet-map-marker-anim-pump-showing';
}
return '';
},
/**
* Run on settings open.
*
* @since 3.10
* @return {void}
*/
onSettingsOpen: function() {
this.isSettingsOpen = true;
const parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) );
parentView.$el.addClass( 'fusion-osm-marker-editing' );
setTimeout( this.dragMarkerOn.bind( this ), 100 );
},
/**
* Run on settings close.
*
* @since 3.10
* @return {void}
*/
onSettingsClose: function() {
var $el = this.$el;
this.isSettingsOpen = false;
if ( ! $el ) {
return;
}
const parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) );
parentView.$el.removeClass( 'fusion-osm-marker-editing' );
this.dragMarkerOff();
},
/**
* Enable drag marker.
*
* @since 3.10
* @return {void}
*/
dragMarkerOn: function() {
if ( ! FusionApp.previewWindow.fusion_open_street_map[ this.model.get( 'parent' ) ] ) {
return;
}
const markers = FusionApp.previewWindow.fusion_open_street_map[ this.model.get( 'parent' ) ][ this.model.get( 'cid' ) ];
if ( markers ) {
markers.forEach( function( marker ) {
if ( marker ) {
marker.dragging.enable();
marker.on( 'dragend', function() {
jQuery( '#latitude' ).val( marker.getLatLng().lat ).trigger( 'change' );
jQuery( '#longitude' ).val( marker.getLatLng().lng ).trigger( 'change' );
} );
}
} );
}
},
/**
* Disable drag marker.
*
* @since 3.10
* @return {void}
*/
dragMarkerOff: function() {
if ( ! FusionApp.previewWindow.fusion_open_street_map[ this.model.get( 'parent' ) ] ) {
return;
}
const markers = FusionApp.previewWindow.fusion_open_street_map[ this.model.get( 'parent' ) ][ this.model.get( 'cid' ) ];
if ( markers ) {
markers.forEach( function( marker ) {
if ( marker ) {
marker.dragging.disable();
}
} );
}
},
/**
* Run after the element has been patched.
*
* @since 3.10
* @return {void}
*/
afterPatch: function() {
jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.closest( '.awb-openstreet-map' ) )
.trigger( 'awb_openstreetmap/updateMarker' )
.trigger( 'awb_openstreetmap/updateCoords' );
if ( this.isSettingsOpen ) {
setTimeout( this.dragMarkerOn.bind( this ), 100 );
}
}
} );
} );
}( jQuery ) );