document.addEventListener("DOMContentLoaded", function() { if (typeof jQuery === 'undefined') { console.error('jQuery is required for client-modals.js to work.'); return; } $(document).ready(function() { console.log('Client modals AJAX script loaded with SweetAlert.'); // Generic AJAX handler for standard forms (Shortcodes & Payments) $(document).on('submit', '#shortcodeForm, #paymentForm, #noteForm', function(e) { e.preventDefault(); let $form = $(this); let modalId = '#' + $form.closest('.modal').attr('id'); let $submitBtn = $form.find('button[type="submit"]'); let originalBtnText = $submitBtn.text(); $submitBtn.prop('disabled', true).text('Saving...'); $.ajax({ url: $form.attr('action'), type: 'POST', data: $form.serialize(), headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, success: function(response) { $(modalId).modal('hide'); $form[0].reset(); // Success SweetAlert Swal.fire({ icon: 'success', title: 'Success!', text: response.message || 'Record saved successfully.', confirmButtonColor: '#0d6efd' }).then(() => { location.reload(); }); }, error: function(xhr) { let errors = xhr.responseJSON?.errors; let errorMsg = 'Something went wrong. Please check your inputs.'; if (errors) { errorMsg = Object.values(errors).flat().join('\n'); } // Error SweetAlert Swal.fire({ icon: 'error', title: 'Validation Error', text: errorMsg, confirmButtonColor: '#dc3545' }); $submitBtn.prop('disabled', false).text(originalBtnText); } }); }); // AJAX handler for Document Upload (FormData) $(document).on('submit', '#documentForm', function(e) { e.preventDefault(); let formElement = this; let $form = $(this); let formData = new FormData(formElement); let modalId = '#' + $form.closest('.modal').attr('id'); let $submitBtn = $form.find('button[type="submit"]'); let originalBtnText = $submitBtn.text(); $submitBtn.prop('disabled', true).text('Uploading...'); $.ajax({ url: $form.attr('action'), type: 'POST', data: formData, processData: false, contentType: false, headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, success: function(response) { $(modalId).modal('hide'); formElement.reset(); // Success SweetAlert Swal.fire({ icon: 'success', title: 'Uploaded!', text: response.message || 'Document uploaded successfully.', confirmButtonColor: '#0d6efd' }).then(() => { location.reload(); }); }, error: function(xhr) { let errors = xhr.responseJSON?.errors; let errorMsg = 'Failed to upload document. Please check the file size and format.'; if (errors) { errorMsg = Object.values(errors).flat().join('\n'); } // Error SweetAlert Swal.fire({ icon: 'error', title: 'Upload Failed', text: errorMsg, confirmButtonColor: '#dc3545' }); $submitBtn.prop('disabled', false).text(originalBtnText); } }); }); // Initialize Select2 for Payment Services when modal opens $('#addPaymentModal').on('shown.bs.modal', function () { let $select = $('#paymentServicesSelect'); // Only fetch if options haven't been loaded yet if ($select.children('option').length === 0) { $.ajax({ url: base_url + '/api/services', // Update route if needed type: 'GET', success: function(data) { $select.empty(); data.forEach(function(service) { $select.append(new Option(service.name, service.name, false, false)); }); // Initialize Select2 with Bootstrap 5 theme $select.select2({ theme: 'bootstrap-5', dropdownParent: $('#addPaymentModal'), placeholder: 'Search and select services...' }); }, error: function() { console.error('Failed to load services for Select2.'); } }); } else { // If already loaded, just re-initialize if needed $select.select2({ theme: 'bootstrap-5', dropdownParent: $('#addPaymentModal'), placeholder: 'Search and select services...' }); } }); // Clear Select2 values when modal is closed $('#addPaymentModal').on('hidden.bs.modal', function () { $('#paymentServicesSelect').val(null).trigger('change'); }); // --- DYNAMIC DOCUMENT ROW HANDLERS --- $('#addRowBtn').on('click', function() { let rowHtml = `