File: /home/adventp/www/wp-content/plugins/js_composer/modules/seo/assets/js/vc_ui-panel-seo-settings.js
/* =========================================================
* Copyright 2023 Wpbakery
*
* WPBakery Page Builder SEO panel in the navbar
*
* ========================================================= */
/* global vc, i18nLocale, Backbone */
if (!window.vc) {
window.vc = {};
}
(function ($) {
'use strict';
var storagePrefix = 'formData';
window.vc.PostSettingsSeoUIPanel = vc.PostSettingsSeoUIPanelView
.vcExtendUI(vc.HelperPanelViewHeaderFooter)
.vcExtendUI(vc.HelperPanelViewResizable)
.vcExtendUI(vc.HelperPanelViewDraggable)
.extend({
el: '#vc_ui-panel-post-seo',
panelName: 'post_seo',
events: {
'click [data-vc-ui-element="button-close"]': 'hide',
'click [data-vc-ui-element="panel-tab-control"]': 'changeTab',
'click [data-vc-ui-element="button-save"]': 'save',
'click [data-vc-ui-element="button-minimize"]': 'toggleOpacity',
'click .vc_icon-remove': 'removeImage',
'change #vc_ui-seo-social .gallery_widget_attached_images_ids': 'updateImagePreview',
'input #social-title-x, #social-title-facebook': 'updateTitlePreview',
'input #social-description-x, #social-description-facebook': 'updateDescriptionPreview',
'click #preview-dots, #vc_seo-title, #vc_description-container': 'focusTarget',
'change .vc-preview-radio input[type="radio"]': 'changePreviewMode',
'input #vc_seo-title-field, #vc_seo-description-field, #vc_seo-slug-field': 'updateGeneralPreviewText',
'blur #vc_seo-title-field, #vc_seo-description-field': 'fillSocialInputs',
'change #vc_focus-keyphrase-field, #vc_seo-title-field, #vc_seo-description-field, #vc_seo-slug-field, #social-title-facebook, #social-description-facebook, #social-title-x, #social-description-x': 'handleInputChange'
},
initialize: function () {
_.bindAll(this,
'fixElContainment',
'setSize');
this.on('setSize', this.setResize, this);
this.setFormDataState();
},
render: function (model, prepend) {
if (this.$el.is(':hidden')) {
vc.closeActivePanel();
}
vc.active_panel = this;
this.show();
},
show: function () {
if (this.$el.hasClass('vc_active')) {
return;
}
this.$el.addClass('vc_active');
if (!this.draggable) {
this.initDraggable();
}
this.fixElContainment();
this.trigger('show');
var $tabs = this.$el.find('.vc_panel-tab');
if ($tabs.length) {
this.$tabs = $tabs;
}
},
changeTab: function (e) {
e.preventDefault();
var $control = $(e.currentTarget);
var $parent = $control.parent();
$('[data-vc-ui-element="panel-add-element-tab"].vc_active').removeClass('vc_active');
$parent.addClass('vc_active');
this.$tabs.filter('.vc_active').removeClass('vc_active');
var activeIndex = $parent.data('tabIndex');
this.$tabs.filter('[data-tab-index="' + activeIndex + '"]').addClass('vc_active');
},
removeImage: function (e) {
var $control = $(e.currentTarget);
var wrapper = $control.closest('.edit_form_line');
var socialNetSlug = wrapper.attr('data-social-net-preview-slug');
var preview = $('#' + socialNetSlug);
preview.find('.wpb-social-placeholder-image').show();
var image = preview.find('img');
image.attr('src', '');
wrapper.find('.gallery_widget_attached_images_ids').val('');
if (e && e.preventDefault) {
e.preventDefault();
}
$control.parent().remove();
},
updateImagePreview: function (e) {
var $control = $(e.currentTarget);
var wrapper = $control.closest('.edit_form_line');
var src = wrapper.find('.inner img').attr('src');
var socialNetSlug = wrapper.attr('data-social-net-preview-slug');
if (socialNetSlug && src) {
src = src.replace('-150x150', '');
var preview = $('#' + socialNetSlug);
var image = preview.find('img');
image.attr('src', src);
image.show();
preview.find('.wpb-social-placeholder-image').hide();
}
},
updateTitlePreview: function (e) {
var $control = $(e.currentTarget);
var wrapper = $control.closest('.vc_seo-social-block');
wrapper.find('.wpb-social-net-preview .vc_social-title').text($control.val());
},
updateDescriptionPreview: function (e) {
var $control = $(e.currentTarget);
var wrapper = $control.closest('.vc_seo-social-block');
var value = $control.val();
wrapper.find('.wpb-social-net-preview .vc_social-description').text(value);
wrapper.find('.vc_social-description-counter').text(value.length);
},
focusTarget: function (e) {
var target = $(e.currentTarget).data('focus');
$("#" + target).focus();
},
changePreviewMode: function (e) {
var pagePreview = this.$el.find('.page-preview');
if ('mobile' === $(e.currentTarget).val()) {
pagePreview.removeClass('desktop-view');
} else {
pagePreview.addClass('desktop-view');
}
},
createSlug: function (inputString) {
var slug = inputString.toLowerCase();
// Remove spaces and replace with hyphens
slug = slug.replace(/\s+/g, '-');
// Remove special characters
slug = slug.replace(/[^a-zA-Z0-9\-]/g, '');
// Remove trailing and leading punctuation
slug = slug.replace(/^[.,!?()[]{}<>:;]+|[.,!?()[]{}<>:;]+$/g, '');
return slug;
},
updateGeneralPreviewText: function (e) {
var value = $(e.currentTarget).val();
if ('vc_seo-slug-field' === $(e.currentTarget).attr('id')) {
value = this.createSlug(value);
}
var previewElementId = $(e.currentTarget).data('preview');
var previewElement = this.$el.find('#' + previewElementId);
if (previewElement) {
previewElement.text(value);
}
},
handleInputChange: function (e) {
var trimmedValue = e.target.value.trim();
vc.seo_storage.setResults(trimmedValue, e.target.name, storagePrefix);
},
setFormDataState: function () {
this.$el.find('#vc_ui-seo-general').find('input[type="text"], textarea').each(function (index, input) {
var inputName = $(input).attr('name');
var inputValue = $(input).val();
vc.seo_storage.setResults(inputValue, inputName, storagePrefix);
});
this.$el.find('#vc_ui-seo-social').find('input[type="text"], textarea').each(function (index, input) {
var inputName = $(input).attr('name');
var inputValue = $(input).val();
vc.seo_storage.setResults(inputValue, inputName, storagePrefix);
});
},
// If empty fills social inputs with general tab data
fillSocialInputs: function (e) {
var value = $(e.currentTarget).val();
var name = $(e.currentTarget).attr('name');
var formData = vc.seo_storage.get('formData');
var fieldMap = {
'title': ['social-title-x', 'social-title-facebook'],
'description': ['social-description-x', 'social-description-facebook']
};
if (fieldMap[name]) {
fieldMap[name].forEach(function (field) {
if (!formData[field]) {
$('#' + field).val(value).trigger('input');
}
});
}
}
});
})(window.jQuery);