/** * Protected Content Preview Handler. * * Handles visual indication of protected content in Elementor editor. * Shows badge with protection type and highlights protected elements. * * @package King_Addons */ (function ($) { 'use strict'; /** * Mark protected elements in editor. */ const markProtected = () => { $('[data-king-protected="yes"]').each(function () { const $el = $(this); // Skip if already marked. if ($el.data('king-protected-marked')) { return; } $el.addClass('king-addons-protected-preview'); $el.data('king-protected-marked', true); // Create badge with protection info. let $badge = $('
'); const protectionType = $el.attr('data-king-protected-type') || 'Protected'; let badgeHtml = '🔒'; badgeHtml += 'Protected'; // Tooltip with details. let tooltipHtml = '
'; tooltipHtml += 'Protection Info:'; tooltipHtml += '
' + protectionType + '
'; tooltipHtml += '
'; badgeHtml += tooltipHtml; $badge.html(badgeHtml); $el.append($badge); }); }; /** * Cleanup marks when protection is disabled. */ const cleanupMarks = () => { $('.king-addons-protected-preview').each(function () { const $el = $(this); if (!$el.is('[data-king-protected="yes"]')) { $el.removeClass('king-addons-protected-preview'); $el.removeData('king-protected-marked'); $el.find('.king-addons-protected-badge').remove(); } }); }; /** * Handler for panel open events. */ const onPanelOpen = () => { setTimeout(() => { markProtected(); cleanupMarks(); }, 100); }; /** * Handler for settings change. */ const onSettingsChange = (model) => { if (!model || !model.changed) { return; } const pcKeys = Object.keys(model.changed).filter(key => key.startsWith('protected_content')); if (pcKeys.length > 0) { setTimeout(() => { // Refresh marks. $('.king-addons-protected-preview').each(function () { $(this).removeData('king-protected-marked'); $(this).find('.king-addons-protected-badge').remove(); }); markProtected(); cleanupMarks(); }, 200); } }; /** * Initialize when Elementor frontend is ready. */ $(window).on('elementor/frontend/init', function () { // Mark already-present elements. markProtected(); // Element ready hook. if (typeof elementorFrontend !== 'undefined' && elementorFrontend.hooks) { elementorFrontend.hooks.addAction('frontend/element_ready/global', markProtected); } // Panel open events. if (typeof elementor !== 'undefined' && elementor.hooks) { elementor.hooks.addAction('panel/open_editor/widget', onPanelOpen); elementor.hooks.addAction('panel/open_editor/section', onPanelOpen); elementor.hooks.addAction('panel/open_editor/container', onPanelOpen); elementor.hooks.addAction('panel/open_editor/column', onPanelOpen); } // Settings change listener. if (typeof elementor !== 'undefined' && elementor.channels && elementor.channels.editor) { elementor.channels.editor.on('change', onSettingsChange); } // Periodic check for dynamically added elements. setInterval(() => { markProtected(); cleanupMarks(); }, 2000); }); }(jQuery));