jQuery(document).ready(function($) { // --- Job Add/Edit Form Elements --- const formWrapper = $('#add-new-job-form'); const formElement = $('#new-job-form'); const jobIdField = $('#quiztech-job-id'); const jobTitleField = $('#job_title'); const jobDescriptionField = $('#job_description'); const formTitle = formWrapper.find('h2'); // Target the h2 inside the form div const submitButton = formElement.find('input[type="submit"]'); const cancelButton = formElement.find('.cancel-add-job'); const addButton = $('.add-new-job-button'); const statusDiv = formWrapper.find('.add-job-status'); const spinner = formWrapper.find('.spinner'); const jobTableBody = $('.quiztech-manage-table tbody'); // For event delegation // --- Helper: Reset and Prepare Form --- function resetAndPrepareForm(mode = 'add') { formElement[0].reset(); // Reset native form fields jobIdField.val(''); // Clear hidden ID formElement.find('#quiztech_associated_assessment_id').val(''); // Reset assessment dropdown statusDiv.empty().removeClass('error success'); // Clear status messages spinner.css('visibility', 'hidden'); if (mode === 'add') { formTitle.text(quiztechThemeData.l10n.addNewJobTitle || 'Add New Job Details'); // Use localized string submitButton.val(quiztechThemeData.l10n.saveJobButton || 'Save Job'); submitButton.prop('disabled', false); } else { // 'edit' mode formTitle.text(quiztechThemeData.l10n.editJobTitle || 'Edit Job Details'); // Use localized string submitButton.val(quiztechThemeData.l10n.updateJobButton || 'Update Job'); submitButton.prop('disabled', false); } } // --- Add New Job Button --- addButton.on('click', function(e) { e.preventDefault(); resetAndPrepareForm('add'); // Prepare form for adding formWrapper.slideDown(); $(this).hide(); // Hide the "Add New Job" button itself }); // --- Cancel Button (in Add/Edit Form) --- cancelButton.on('click', function(e) { e.preventDefault(); formWrapper.slideUp(function() { resetAndPrepareForm('add'); // Reset to add mode visuals when hiding }); addButton.show(); // Show the "Add New Job" button again }); // --- Edit Job Button Click (Event Delegation) --- jobTableBody.on('click', '.quiztech-edit-job-btn', function() { const $button = $(this); const jobId = $button.data('job-id'); const originalButtonText = $button.text(); // Prevent double clicks and show loading state if ($button.prop('disabled')) { return; } $button.prop('disabled', true).text(quiztechThemeData.l10n.loading || 'Loading...'); statusDiv.empty().removeClass('error success'); // Clear form status $.ajax({ url: quiztechThemeData.ajax_url, type: 'POST', data: { action: 'quiztech_get_job', nonce: quiztechThemeData.get_job_nonce, // Use new nonce job_id: jobId }, dataType: 'json', success: function(response) { if (response.success) { const data = response.data; resetAndPrepareForm('edit'); // Prepare form visuals for editing // Populate form fields jobIdField.val(data.id); jobTitleField.val(data.title); jobDescriptionField.val(data.description); // Populate the linked assessment dropdown formElement.find('#quiztech_associated_assessment_id').val(data.assessment_id || ''); // Set to empty string if null/undefined formWrapper.slideDown(); // Show the form // Scroll to form for better UX $('html, body').animate({ scrollTop: formWrapper.offset().top - 50 }, 300); } else { // Display error near the button or globally? For now, alert. alert(response.data.message || quiztechThemeData.error_generic); } }, error: function(jqXHR, textStatus, errorThrown) { console.error("AJAX Error fetching job:", textStatus, errorThrown, jqXHR.responseText); alert(quiztechThemeData.error_generic); }, complete: function() { // Restore button state $button.prop('disabled', false).text(originalButtonText); } }); }); // --- Add/Edit Job Form Submission AJAX --- formElement.on('submit', function(e) { e.preventDefault(); statusDiv.empty().removeClass('error success'); spinner.css('visibility', 'visible'); submitButton.prop('disabled', true); var formData = { action: 'quiztech_save_job', // Use new action nonce: quiztechThemeData.save_job_nonce, // Use new nonce job_id: jobIdField.val(), // Include job_id (will be empty for new jobs) job_title: jobTitleField.val(), job_description: jobDescriptionField.val(), quiztech_associated_assessment_id: formElement.find('#quiztech_associated_assessment_id').val() // Add assessment ID }; $.post(quiztechThemeData.ajax_url, formData) .done(function(response) { if (response.success) { statusDiv.text(response.data.message || 'Job saved successfully.').addClass('success'); // Reload page to see changes (simplest approach) // TODO: Implement dynamic row update/add for better UX later setTimeout(function() { location.reload(); }, 1500); } else { statusDiv.text(response.data.message || quiztechThemeData.error_generic).addClass('error'); submitButton.prop('disabled', false); // Re-enable button on failure } }) .fail(function(jqXHR, textStatus, errorThrown) { console.error("AJAX Error saving job:", textStatus, errorThrown, jqXHR.responseText); statusDiv.text(quiztechThemeData.error_generic).addClass('error'); submitButton.prop('disabled', false); // Re-enable button on failure }) .always(function() { spinner.css('visibility', 'hidden'); // Keep button disabled on success until reload }); }); // --- Send Invite Form (Existing Logic - Unchanged) --- // Show the specific "Send Invite" form row when the link is clicked $('.send-job-invite').on('click', function(e) { e.preventDefault(); var jobId = $(this).data('job-id'); var inviteRow = $('#send-invite-row-' + jobId); // Hide any other open invite forms first $('.send-invite-form-row').not(inviteRow).slideUp(); // Toggle the clicked one inviteRow.slideToggle(); }); // Hide the "Send Invite" form row when its cancel button is clicked $('.send-invite-form-row .cancel-invite').on('click', function(e) { e.preventDefault(); $(this).closest('.send-invite-form-row').slideUp(); }); // Send Invite AJAX $('.send-invite-submit').on('click', function(e) { e.preventDefault(); var $button = $(this); var jobId = $button.data('job-id'); var $wrapper = $button.closest('.send-invite-form-wrapper'); var $emailInput = $wrapper.find('input[name="applicant_email"]'); var $inviteSpinner = $wrapper.find('.spinner'); // Use different spinner variable var $inviteStatusDiv = $wrapper.find('.invite-status'); // Use different status div variable var applicantEmail = $emailInput.val(); if (!applicantEmail) { $emailInput.focus(); return; } $inviteStatusDiv.empty().removeClass('error success'); $inviteSpinner.css('visibility', 'visible'); $button.prop('disabled', true).siblings('.cancel-invite').prop('disabled', true); var inviteFormData = { // Use different formData variable action: 'send_job_invite', nonce: quiztechThemeData.send_invite_nonce, job_id: jobId, applicant_email: applicantEmail }; $.post(quiztechThemeData.ajax_url, inviteFormData) .done(function(response) { if (response.success) { $inviteStatusDiv.text(quiztechThemeData.invite_sent_success || 'Invite sent successfully!').addClass('success'); $emailInput.val(''); // Clear email field on success setTimeout(function() { $button.closest('.send-invite-form-row').slideUp(); }, 2000); } else { var errorMessage = quiztechThemeData.error_generic; if (response.data && response.data.message) { errorMessage = response.data.message; } $inviteStatusDiv.text(errorMessage).addClass('error'); } }) .fail(function(jqXHR, textStatus, errorThrown) { console.error("AJAX Error sending invite:", textStatus, errorThrown, jqXHR.responseText); $inviteStatusDiv.text(quiztechThemeData.error_generic).addClass('error'); }) .always(function() { $inviteSpinner.css('visibility', 'hidden'); $button.prop('disabled', false).siblings('.cancel-invite').prop('disabled', false); }); }); });