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

260 lines
6.6 KiB
JavaScript

var FusionPageBuilder = FusionPageBuilder || {};
( function() {
jQuery( document ).ready( function() {
// Progress Bar Element View.
FusionPageBuilder.fusion_progress = FusionPageBuilder.ElementView.extend( {
/**
* Modify template attributes.
*
* @since 2.0
* @return {Object}
*/
filterTemplateAtts: function( atts ) {
var attributes = {};
// Validate values.
this.validateValues( atts.values );
// Create attribute objects
attributes.attr = this.buildAttr( atts.values );
attributes.attrBar = this.buildBarAttr( atts.values );
attributes.attrSpan = this.buildSpanAttr( atts.values, atts.extras );
attributes.attrEditor = this.buildInlineEditorAttr( atts.values );
attributes.attrContent = this.buildContentAttr( atts.values );
// Any extras that need passed on.
attributes.cid = this.model.get( 'cid' );
attributes.values = atts.values;
attributes.percentage = this.sanitizePercentage( atts.values.percentage );
return attributes;
},
/**
* Modifies the values.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {void}
*/
validateValues: function( values ) {
values.filledbordersize = _.fusionValidateAttrValue( values.filledbordersize, '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 = _.fusionVisibilityAtts( values.hide_on_mobile, {
class: 'fusion-progressbar',
style: this.getInlineStyle( values )
} );
if ( 'above_bar' === values.text_position ) {
attr[ 'class' ] += ' fusion-progressbar-text-above-bar';
} else if ( 'below_bar' === values.text_position ) {
attr[ 'class' ] += ' fusion-progressbar-text-below-bar';
} else {
attr[ 'class' ] += ' fusion-progressbar-text-on-bar';
}
if ( '' !== values[ 'class' ] ) {
attr[ 'class' ] += ' ' + values[ 'class' ];
}
if ( '' !== values.id ) {
attr.id = values.id;
}
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @return {Object}
*/
buildInlineEditorAttr: function() {
var attr = {
class: 'fusion-progressbar-text',
id: 'awb-progressbar-label-' + this.model.get( 'cid' )
};
attr = _.fusionInlineEditor( {
cid: this.model.get( 'cid' ),
'disable-return': true,
'disable-extra-spaces': true,
toolbar: 'simple'
}, attr );
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildContentAttr: function( values ) {
var attr = {
class: 'progress progress-bar-content',
role: 'progressbar',
style: ''
};
attr.style += 'width:' + this.sanitizePercentage( values.percentage ) + '%;';
attr.role = 'progressbar';
attr[ 'aria-labelledby' ] = 'awb-progressbar-label-' + this.model.get( 'cid' );
attr[ 'aria-valuemin' ] = '0';
attr[ 'aria-valuemax' ] = '100';
attr[ 'aria-valuenow' ] = values.percentage;
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildBarAttr: function( values ) {
var attr = {
class: 'fusion-progressbar-bar progress-bar',
style: ''
};
if ( 'yes' === values.striped ) {
attr[ 'class' ] += ' progress-striped';
}
if ( 'yes' === values.animated_stripes ) {
attr[ 'class' ] += ' active';
}
if ( '' !== values[ 'class' ] ) {
attr[ 'class' ] += ' ' + values[ 'class' ];
}
if ( '' !== values.id ) {
attr.id = values.id;
}
return attr;
},
/**
* Builds attributes.
*
* @since 2.0
* @param {Object} values - The values object.
* @return {Object}
*/
buildSpanAttr: function( values, extras ) {
var attr = {
class: 'progress-title',
style: ''
};
var empty_percentage = 0;
if ( 'on_bar' === values.text_position ) {
empty_percentage = 100 - this.sanitizePercentage( values.percentage );
if ( 66 > empty_percentage || 'true' === values.force_text_align ) {
if ( ! extras.is_rtl ) {
attr.style += 'right: calc(15px + ' + empty_percentage + '%);';
} else {
attr.style += 'left: calc(15px + ' + empty_percentage + '%);';
}
}
}
return attr;
},
getInlineStyle: function( values ) {
var cssVarsOptions,
customVars = {};
this.values = values;
cssVarsOptions = [
'text_align',
'text_line_height',
'text_text_transform',
'textcolor',
'height',
'filledcolor',
'unfilledcolor',
'border_radius_top_left',
'border_radius_top_right',
'border_radius_bottom_left',
'border_radius_bottom_right',
'filledbordersize',
'filledbordercolor'
];
cssVarsOptions.margin_top = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.margin_right = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.margin_bottom = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.margin_left = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.text_font_size = { 'callback': _.fusionGetValueWithUnit };
cssVarsOptions.text_letter_spacing = { 'callback': _.fusionGetValueWithUnit };
jQuery.each( _.fusionGetFontStyle( 'text_font', values, 'object' ), function( rule, value ) {
customVars[ rule ] = value;
} );
return this.getCssVarsForOptions( cssVarsOptions ) + this.getCustomCssVars( customVars );
},
/**
* Sanitize the percentage value, because this can come also from a
* dynamic data which can be a string or a float.
*
* @since 3.6
* @param {Object} values - The values object.
* @return {Object}
*/
sanitizePercentage: function( percentage ) {
percentage = parseFloat( percentage );
// percentage can be NaN if parseFloat failed.
if ( ! percentage ) {
percentage = 0;
}
percentage = Math.round( percentage );
if ( 0 > percentage ) {
percentage = 0;
}
if ( 100 < percentage ) {
percentage = 100;
}
return percentage;
}
} );
} );
}( jQuery ) );