/** * HVAC Modal Forms * * Handles modal forms for creating new organizers, categories, and venues * with role-based permissions and AJAX submission. */ (function($) { 'use strict'; class HVACModalForms { constructor() { this.init(); } init() { this.bindEvents(); this.createModalContainer(); } bindEvents() { // Listen for create new modal trigger $(document).on('hvac:create-new-modal', (e, data) => { this.showCreateModal(data.type, data.callback); }); // Modal close events $(document).on('click', '.hvac-modal-overlay, .hvac-modal-close', (e) => { e.preventDefault(); this.closeModal(); }); // Prevent modal close when clicking inside modal content $(document).on('click', '.hvac-modal-content', (e) => { e.stopPropagation(); }); // Form submission $(document).on('submit', '.hvac-modal-form', (e) => { e.preventDefault(); this.handleFormSubmission(e.target); }); // Escape key to close modal $(document).on('keydown', (e) => { if (e.keyCode === 27) { // ESC key this.closeModal(); } }); } createModalContainer() { if ($('#hvac-modal-container').length) { return; } const modalHtml = `
`; $('body').append(modalHtml); } showCreateModal(type, callback) { this.currentCallback = callback; const config = this.getModalConfig(type); if (!config) { console.error(`Unknown modal type: ${type}`); return; } // Set modal title $('.hvac-modal-title').text(config.title); // Generate form HTML const formHtml = this.generateFormHtml(type, config); $('.hvac-modal-body').html(formHtml); // Show modal $('#hvac-modal-container').fadeIn(300); // Focus first input setTimeout(() => { $('.hvac-modal-form input:first').focus(); }, 350); } getModalConfig(type) { const configs = { organizer: { title: 'Add New Organizer', fields: [ { name: 'organizer_name', label: 'Organizer Name', type: 'text', required: true }, { name: 'organizer_email', label: 'Email', type: 'email', required: false }, { name: 'organizer_website', label: 'Website', type: 'url', required: false }, { name: 'organizer_phone', label: 'Phone', type: 'tel', required: false } ], action: 'hvac_create_organizer' }, category: { title: 'Add New Category', fields: [ { name: 'category_name', label: 'Category Name', type: 'text', required: true }, { name: 'category_description', label: 'Description', type: 'textarea', required: false } ], action: 'hvac_create_category', permission_check: true }, venue: { title: 'Add New Venue', fields: [ { name: 'venue_name', label: 'Venue Name', type: 'text', required: true }, { name: 'venue_address', label: 'Address', type: 'text', required: false }, { name: 'venue_city', label: 'City', type: 'text', required: false }, { name: 'venue_state', label: 'State/Province', type: 'text', required: false }, { name: 'venue_zip', label: 'Zip/Postal Code', type: 'text', required: false }, { name: 'venue_country', label: 'Country', type: 'text', required: false }, { name: 'venue_website', label: 'Website', type: 'url', required: false }, { name: 'venue_phone', label: 'Phone', type: 'tel', required: false } ], action: 'hvac_create_venue' } }; return configs[type] || null; } generateFormHtml(type, config) { // Check for category permission if (config.permission_check && !hvacModalForms.canCreateCategories) { return ` `; } let formHtml = ` `; return formHtml; } generateFieldHtml(field) { const required = field.required ? 'required' : ''; const requiredMark = field.required ? '*' : ''; if (field.type === 'textarea') { return `