quiztech_theme/js/quiztech-theme.js

221 lines
No EOL
9.7 KiB
JavaScript

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);
});
});
});