/** * HVAC Communication Templates JavaScript * * Handles the frontend functionality for email template management * * @version 1.0.0 */ (function($) { 'use strict'; // Template Manager Object const HVACTemplates = { // Configuration config: { ajaxUrl: hvacTemplates.ajaxUrl, nonce: hvacTemplates.nonce, placeholders: hvacTemplates.placeholders, categories: hvacTemplates.categories, strings: hvacTemplates.strings }, // Current state currentTemplateId: null, isEditing: false, templates: [], // Initialize init: function() { this.bindEvents(); this.loadTemplates(); this.setupPlaceholderHelper(); }, // Bind event handlers bindEvents: function() { const self = this; // Toggle template manager $(document).on('click', '.hvac-template-toggle', function(e) { e.preventDefault(); self.toggleTemplateManager(); }); // Category filter change $(document).on('change', '.hvac-template-category-filter', function() { self.filterTemplatesByCategory($(this).val()); }); // Template actions $(document).on('click', '.hvac-btn-load', function(e) { e.preventDefault(); const templateId = $('.hvac-template-dropdown').val(); if (templateId) { self.loadTemplate(templateId); } }); $(document).on('click', '.hvac-btn-edit', function(e) { e.preventDefault(); const templateId = $('.hvac-template-dropdown').val(); if (templateId) { self.editTemplate(templateId); } }); $(document).on('click', '.hvac-btn-delete', function(e) { e.preventDefault(); const templateId = $('.hvac-template-dropdown').val(); if (templateId && confirm(self.config.strings.confirmDelete)) { self.deleteTemplate(templateId); } }); $(document).on('click', '.hvac-btn-save', function(e) { e.preventDefault(); self.saveTemplate(); }); // Form actions $(document).on('click', '.hvac-template-form-save', function(e) { e.preventDefault(); self.saveTemplate(); }); $(document).on('click', '.hvac-template-form-cancel', function(e) { e.preventDefault(); self.cancelTemplateForm(); }); // Placeholder insertion $(document).on('click', '.hvac-placeholder-item', function(e) { e.preventDefault(); const placeholder = $(this).find('.hvac-placeholder-code').text(); self.insertPlaceholder(placeholder); }); // Auto-save prevention $(document).on('beforeunload', function() { if (self.isEditing && self.hasUnsavedChanges()) { return 'You have unsaved changes. Are you sure you want to leave?'; } }); }, // Toggle template manager visibility toggleTemplateManager: function() { const $manager = $('.hvac-template-manager'); const $toggle = $('.hvac-template-toggle'); if ($manager.is(':visible')) { $manager.slideUp(); $toggle.removeClass('active').text('📝 Use Template'); } else { $manager.slideDown(); $toggle.addClass('active').text('📝 Hide Templates'); } }, // Load user templates loadTemplates: function(category = '') { const self = this; $.ajax({ url: this.config.ajaxUrl, type: 'POST', data: { action: 'hvac_get_templates', nonce: this.config.nonce, category: category }, success: function(response) { if (response.success) { self.templates = response.data.templates; self.populateTemplateDropdown(); } else { self.showMessage(response.data.message, 'error'); } }, error: function() { self.showMessage(self.config.strings.error, 'error'); } }); }, // Filter templates by category filterTemplatesByCategory: function(category) { this.loadTemplates(category); }, // Populate template dropdown populateTemplateDropdown: function() { const $dropdown = $('.hvac-template-dropdown'); $dropdown.empty(); if (this.templates.length === 0) { $dropdown.append(''); $('.hvac-template-actions-buttons button').prop('disabled', true); return; } $dropdown.append(''); this.templates.forEach(function(template) { $dropdown.append( '' ); }); $('.hvac-template-actions-buttons button').prop('disabled', false); }, // Load template content into email form loadTemplate: function(templateId) { const self = this; $.ajax({ url: this.config.ajaxUrl, type: 'POST', data: { action: 'hvac_load_template', nonce: this.config.nonce, template_id: templateId }, beforeSend: function() { $('.hvac-btn-load').addClass('hvac-loading'); }, success: function(response) { if (response.success) { const template = response.data; // Populate email form fields $('#email_subject').val(template.title); // Handle different content areas (WordPress editor or textarea) if (typeof tinyMCE !== 'undefined' && tinyMCE.get('email_message')) { tinyMCE.get('email_message').setContent(template.content); } else { $('#email_message').val(template.content); } self.showMessage('Template loaded successfully', 'success'); // Optionally hide template manager after loading // self.toggleTemplateManager(); } else { self.showMessage(response.data.message, 'error'); } }, complete: function() { $('.hvac-btn-load').removeClass('hvac-loading'); } }); }, // Edit template editTemplate: function(templateId) { const self = this; $.ajax({ url: this.config.ajaxUrl, type: 'POST', data: { action: 'hvac_load_template', nonce: this.config.nonce, template_id: templateId }, beforeSend: function() { $('.hvac-btn-edit').addClass('hvac-loading'); }, success: function(response) { if (response.success) { const template = response.data; self.currentTemplateId = template.id; self.isEditing = true; // Populate template form $('#hvac_template_title').val(template.title); $('#hvac_template_content').val(template.content); $('#hvac_template_category').val(template.category); $('#hvac_template_description').val(template.description); // Show template form $('.hvac-template-form').addClass('active'); self.showMessage('Template loaded for editing', 'success'); } else { self.showMessage(response.data.message, 'error'); } }, complete: function() { $('.hvac-btn-edit').removeClass('hvac-loading'); } }); }, // Delete template deleteTemplate: function(templateId) { const self = this; $.ajax({ url: this.config.ajaxUrl, type: 'POST', data: { action: 'hvac_delete_template', nonce: this.config.nonce, template_id: templateId }, beforeSend: function() { $('.hvac-btn-delete').addClass('hvac-loading'); }, success: function(response) { if (response.success) { self.showMessage(response.data.message, 'success'); self.loadTemplates(); // Refresh template list } else { self.showMessage(response.data.message, 'error'); } }, complete: function() { $('.hvac-btn-delete').removeClass('hvac-loading'); } }); }, // Save template saveTemplate: function() { const self = this; const templateData = { action: 'hvac_save_template', nonce: this.config.nonce, template_id: this.currentTemplateId || 0, title: $('#hvac_template_title').val(), content: $('#hvac_template_content').val(), category: $('#hvac_template_category').val(), description: $('#hvac_template_description').val() }; // Validation if (!templateData.title || !templateData.content) { this.showMessage('Template title and content are required', 'error'); return; } $.ajax({ url: this.config.ajaxUrl, type: 'POST', data: templateData, beforeSend: function() { $('.hvac-template-form-save').addClass('hvac-loading'); }, success: function(response) { if (response.success) { self.showMessage(response.data.message, 'success'); self.cancelTemplateForm(); self.loadTemplates(); // Refresh template list } else { self.showMessage(response.data.message, 'error'); } }, complete: function() { $('.hvac-template-form-save').removeClass('hvac-loading'); } }); }, // Cancel template form cancelTemplateForm: function() { this.currentTemplateId = null; this.isEditing = false; // Clear form $('#hvac_template_title').val(''); $('#hvac_template_content').val(''); $('#hvac_template_category').val(''); $('#hvac_template_description').val(''); // Hide form $('.hvac-template-form').removeClass('active'); }, // Setup placeholder helper setupPlaceholderHelper: function() { const $helper = $('.hvac-placeholder-helper'); if ($helper.length === 0) return; const $grid = $helper.find('.hvac-placeholder-grid'); Object.keys(this.config.placeholders).forEach(function(placeholder) { const description = HVACTemplates.config.placeholders[placeholder]; const $item = $('