File: /var/www/html/wpskycap/wp-content/plugins/js_composer/modules/seo/assets/js/seo-analysis-view.js
/* =========================================================
* Copyright 2023 Wpbakery
*
* WPBakery Page Builder SEO Analysis panel in the navbar
*
* ========================================================= */
/* global Backbone, vc, _ */
if ( !window.vc ) {
window.vc = {};
}
( function ( $ ) {
'use strict';
// Update the Content Analysis panel contents via Backbone View
vc.SeoAnalysisView = Backbone.View.extend({
$wpbContentWrapper: null,
$navbarIcon: null,
currentBadge: '',
initialize: function () {
this.$wpbContentWrapper = this.getContentWrapper();
this.$navbarIcon = $( '.vc_seo-button' );
vc.seo_utils.createMeasurementElement();
vc.seo_checks.analyzeContent( this.$wpbContentWrapper );
this.render();
this.setIconBadge();
this.setEvents();
},
render: function () {
vc.seo_checks.analyzeContent( this.$wpbContentWrapper );
var resultsElements = this.getNotificationsHtml();
this.$el.html( resultsElements );
this.setIconBadge();
},
setEvents: function () {
this.debouncedRender = _.debounce( this.render, 200 );
this.listenTo( this.model, 'formData', this.debouncedRender );
var isFrontendEditor = 'admin_frontend_editor' === window.vc_mode;
if ( isFrontendEditor ) {
vc.events.on( 'afterRender', this.debouncedRender, this );
vc.events.on( 'shortcodeView:updated', this.debouncedRender, this );
vc.events.on( 'afterLoadShortcode', this.debouncedRender, this );
} else {
vc.events.on( 'shortcodes:update', this.debouncedRender, this );
vc.events.on( 'shortcodes:add', this.debouncedRender, this );
vc.events.on( 'undoredo:undo', this.debouncedRender, this );
vc.events.on( 'undoredo:redo', this.debouncedRender, this );
}
vc.events.on( 'shortcodes:destroy', this.debouncedRender, this );
},
getNotificationsHtml: function () {
var _this = this;
var results = this.model.get( 'results' );
var newResults = {
success: [],
problems: [],
warnings: []
};
// Assign each item for corresponding result type
results.forEach( function ( result ) {
newResults[result.state].push( result );
});
var resultsElements = [];
var resultsOrder = [ 'problems', 'warnings', 'success' ];
var resultsKeys = Object.keys( newResults );
var sortedKeys = resultsKeys.sort( function ( a, b ) {
// Find the index of the names in the customOrder array
var orderA = resultsOrder.indexOf( a );
var orderB = resultsOrder.indexOf( b );
// Compare the order values
return orderA - orderB;
});
sortedKeys.forEach( function ( key ) {
if ( newResults[key].length ) {
var html = _this.getResultsHtml( key, newResults[key]);
resultsElements.push( html );
}
});
return resultsElements;
},
setIconBadge: function () {
var state = 'success';
var allResults = this.model.get( 'results' );
var getIssue = function ( state ) {
return allResults.find( function ( result ) {
return state === result.state;
});
};
if ( getIssue( 'problems' ) ) {
state = 'problems';
} else if ( getIssue( 'warnings' ) ) {
state = 'warnings';
}
this.$navbarIcon.removeClass( this.currentBadge );
this.currentBadge = 'vc_ui-badge--' + state;
this.$navbarIcon.addClass( this.currentBadge );
},
getResultsHtml: function ( type, data ) {
var $section = $( '<div class="vc_ui-seo-results-section"><strong>' + window.i18nLocale[type] + '</strong><ul class="vc_ui-seo-results-list"></ul></div>' );
var $resultList = $section.find( 'ul' );
$.each( data, function ( i, val ) {
var $item = $( '<li class="vc_ui-seo-results-list-item vc_ui-seo-results-list-item--' + val.state + '">' + val.title + ': ' + val.description + '</li>' );
$resultList.append( $item );
});
return $section;
},
getContentWrapper: function () {
return 'admin_frontend_editor' === window.vc_mode ? vc.$frame.contents().find( '.wpb-content-wrapper' ) : $( '#wpbakery_content' );
}
});
// Initialize SEO Content Analysis Editor
vc.events.on( 'app.render', function () {
// Add timeout to let content render before analyzing it
setTimeout( function () {
vc.seo_analysis_view = new vc.SeoAnalysisView({
el: '#vc_ui-seo-analysis',
model: vc.seo_storage
});
}, 1000 );
});
})( window.jQuery );