Add massive collection of CSS, JavaScript and theme assets that were previously excluded: **CSS Files (681 total):** - HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup - Theme framework files (Astra, builder systems, layouts): 200+ files - Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files - WordPress core and editor styles: 50+ files - Responsive and RTL language support: 200+ files **JavaScript Files (400+ total):** - HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations - Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope - Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS - WordPress core functionality: customizer, admin, block editor compatibility - Third-party integrations: Stripe, SMTP, analytics, search functionality **Assets:** - Certificate background images and logos - Comprehensive theme styling infrastructure - Mobile-responsive design systems - Cross-browser compatibility assets - Performance-optimized minified versions **Updated .gitignore:** - Fixed asset directory whitelisting patterns to properly include CSS/JS/images - Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.) - Maintains security by excluding sensitive files while including essential assets This commit provides the complete frontend infrastructure needed for: - Full theme functionality and styling - Plugin feature implementations - Mobile responsiveness and accessibility - Cross-browser compatibility - Performance optimization - Developer workflow support
489 lines
No EOL
18 KiB
JavaScript
489 lines
No EOL
18 KiB
JavaScript
/**
|
|
* 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('<option value="">' + 'No templates found' + '</option>');
|
|
$('.hvac-template-actions-buttons button').prop('disabled', true);
|
|
return;
|
|
}
|
|
|
|
$dropdown.append('<option value="">' + 'Select a template...' + '</option>');
|
|
|
|
this.templates.forEach(function(template) {
|
|
$dropdown.append(
|
|
'<option value="' + template.id + '">' +
|
|
template.title +
|
|
(template.category ? ' (' + template.category + ')' : '') +
|
|
'</option>'
|
|
);
|
|
});
|
|
|
|
$('.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 = $('<div class="hvac-placeholder-item">' +
|
|
'<span class="hvac-placeholder-code">' + placeholder + '</span>' +
|
|
'<span class="hvac-placeholder-desc">' + description + '</span>' +
|
|
'</div>');
|
|
|
|
$grid.append($item);
|
|
});
|
|
},
|
|
|
|
// Insert placeholder into content
|
|
insertPlaceholder: function(placeholder) {
|
|
// Try to insert into WordPress editor first
|
|
if (typeof tinyMCE !== 'undefined' && tinyMCE.get('email_message')) {
|
|
const editor = tinyMCE.get('email_message');
|
|
editor.insertContent(placeholder);
|
|
return;
|
|
}
|
|
|
|
// Try template content textarea
|
|
if ($('#hvac_template_content').length) {
|
|
const $textarea = $('#hvac_template_content');
|
|
const cursorPos = $textarea[0].selectionStart;
|
|
const textBefore = $textarea.val().substring(0, cursorPos);
|
|
const textAfter = $textarea.val().substring(cursorPos);
|
|
|
|
$textarea.val(textBefore + placeholder + textAfter);
|
|
$textarea[0].setSelectionRange(cursorPos + placeholder.length, cursorPos + placeholder.length);
|
|
$textarea.focus();
|
|
return;
|
|
}
|
|
|
|
// Fallback to email message textarea
|
|
if ($('#email_message').length) {
|
|
const $textarea = $('#email_message');
|
|
const cursorPos = $textarea[0].selectionStart;
|
|
const textBefore = $textarea.val().substring(0, cursorPos);
|
|
const textAfter = $textarea.val().substring(cursorPos);
|
|
|
|
$textarea.val(textBefore + placeholder + textAfter);
|
|
$textarea[0].setSelectionRange(cursorPos + placeholder.length, cursorPos + placeholder.length);
|
|
$textarea.focus();
|
|
}
|
|
},
|
|
|
|
// Check for unsaved changes
|
|
hasUnsavedChanges: function() {
|
|
if (!this.isEditing) return false;
|
|
|
|
return $('#hvac_template_title').val() !== '' ||
|
|
$('#hvac_template_content').val() !== '' ||
|
|
$('#hvac_template_category').val() !== '' ||
|
|
$('#hvac_template_description').val() !== '';
|
|
},
|
|
|
|
// Show messages
|
|
showMessage: function(message, type) {
|
|
const $container = $('.hvac-template-manager');
|
|
|
|
// Remove existing messages
|
|
$container.find('.hvac-template-message').remove();
|
|
|
|
// Add new message
|
|
const $message = $('<div class="hvac-template-message ' + type + '">' + message + '</div>');
|
|
$container.prepend($message);
|
|
|
|
// Auto-hide success messages
|
|
if (type === 'success') {
|
|
setTimeout(function() {
|
|
$message.fadeOut(function() {
|
|
$message.remove();
|
|
});
|
|
}, 3000);
|
|
}
|
|
},
|
|
|
|
// Create new template (helper method)
|
|
createNewTemplate: function() {
|
|
this.currentTemplateId = null;
|
|
this.isEditing = true;
|
|
|
|
// Clear and show form
|
|
this.cancelTemplateForm();
|
|
$('.hvac-template-form').addClass('active');
|
|
|
|
// Focus on title field
|
|
$('#hvac_template_title').focus();
|
|
},
|
|
|
|
// Utility: Get current email content
|
|
getCurrentEmailContent: function() {
|
|
if (typeof tinyMCE !== 'undefined' && tinyMCE.get('email_message')) {
|
|
return tinyMCE.get('email_message').getContent();
|
|
}
|
|
return $('#email_message').val() || '';
|
|
},
|
|
|
|
// Utility: Get current email subject
|
|
getCurrentEmailSubject: function() {
|
|
return $('#email_subject').val() || '';
|
|
},
|
|
|
|
// Save current email as template
|
|
saveCurrentEmailAsTemplate: function() {
|
|
const content = this.getCurrentEmailContent();
|
|
const subject = this.getCurrentEmailSubject();
|
|
|
|
if (!content && !subject) {
|
|
this.showMessage('No email content to save as template', 'error');
|
|
return;
|
|
}
|
|
|
|
// Pre-fill form with current email content
|
|
$('#hvac_template_title').val(subject || 'New Template');
|
|
$('#hvac_template_content').val(content);
|
|
|
|
this.createNewTemplate();
|
|
}
|
|
};
|
|
|
|
// Initialize when document is ready
|
|
$(document).ready(function() {
|
|
// Only initialize if template manager is present
|
|
if ($('.hvac-template-manager').length || $('.hvac-template-toggle').length) {
|
|
HVACTemplates.init();
|
|
}
|
|
});
|
|
|
|
// Expose to global scope for external usage
|
|
window.HVACTemplates = HVACTemplates;
|
|
|
|
})(jQuery); |