221 lines
No EOL
9.7 KiB
JavaScript
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);
|
|
});
|
|
});
|
|
|
|
}); |