199 lines
7.9 KiB
JavaScript
199 lines
7.9 KiB
JavaScript
jQuery(document).ready(function($) {
|
|
'use strict';
|
|
|
|
// Form submission
|
|
$('#pc-announcements-274-form').on('submit', function(e) {
|
|
e.preventDefault();
|
|
|
|
var $form = $(this);
|
|
var $submitBtn = $form.find('button[type="submit"]');
|
|
var originalText = $submitBtn.text();
|
|
|
|
// Show loading state
|
|
$submitBtn.prop('disabled', true).text('Saving...');
|
|
|
|
$.ajax({
|
|
url: pc_announcements_274_ajax.ajax_url,
|
|
type: 'POST',
|
|
data: $form.serialize(),
|
|
dataType: 'json',
|
|
success: function(response) {
|
|
if (response.success) {
|
|
// Show success message
|
|
$('<div class="notice notice-success is-dismissible"><p>' + response.data.message + '</p></div>')
|
|
.insertAfter('.wp-header-end')
|
|
.delay(3000)
|
|
.fadeOut(function() {
|
|
$(this).remove();
|
|
});
|
|
|
|
// Redirect to list page
|
|
setTimeout(function() {
|
|
window.location.href = 'admin.php?page=pc-announcements-274&message=success';
|
|
}, 1000);
|
|
} else {
|
|
// Show error message
|
|
$('<div class="notice notice-error is-dismissible"><p>' + response.data.message + '</p></div>')
|
|
.insertAfter('.wp-header-end');
|
|
}
|
|
},
|
|
error: function() {
|
|
$('<div class="notice notice-error is-dismissible"><p>' + pc_announcements_274_ajax.i18n.error_occurred + '</p></div>')
|
|
.insertAfter('.wp-header-end');
|
|
},
|
|
complete: function() {
|
|
// Restore button state
|
|
$submitBtn.prop('disabled', false).text(originalText);
|
|
}
|
|
});
|
|
});
|
|
|
|
// Delete confirmation
|
|
$('.pc-announcements-274-delete-btn').on('click', function(e) {
|
|
e.preventDefault();
|
|
|
|
var announcementId = $(this).data('id');
|
|
var $modal = $('#pc-announcements-274-delete-modal');
|
|
|
|
// Show modal
|
|
$modal.show();
|
|
|
|
// Handle delete confirmation
|
|
$modal.find('.pc-announcements-274-confirm-delete').off('click').on('click', function() {
|
|
$.ajax({
|
|
url: pc_announcements_274_ajax.ajax_url,
|
|
type: 'POST',
|
|
data: {
|
|
action: 'pc_announcements_274_action',
|
|
sub_action: 'delete_announcement',
|
|
id: announcementId,
|
|
nonce: pc_announcements_274_ajax.nonce
|
|
},
|
|
dataType: 'json',
|
|
success: function(response) {
|
|
if (response.success) {
|
|
// Remove the row from table
|
|
$('button[data-id="' + announcementId + '"]').closest('tr').fadeOut(function() {
|
|
$(this).remove();
|
|
|
|
// Show empty state if no items left
|
|
if ($('.pc-announcements-274-wrap .wp-list-table tbody tr').length === 0) {
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
// Show success message
|
|
$('<div class="notice notice-success is-dismissible"><p>' + response.data.message + '</p></div>')
|
|
.insertAfter('.wp-header-end')
|
|
.delay(3000)
|
|
.fadeOut(function() {
|
|
$(this).remove();
|
|
});
|
|
} else {
|
|
// Show error message
|
|
$('<div class="notice notice-error is-dismissible"><p>' + response.data.message + '</p></div>')
|
|
.insertAfter('.wp-header-end');
|
|
}
|
|
},
|
|
error: function() {
|
|
$('<div class="notice notice-error is-dismissible"><p>' + pc_announcements_274_ajax.i18n.error_occurred + '</p></div>')
|
|
.insertAfter('.wp-header-end');
|
|
},
|
|
complete: function() {
|
|
// Hide modal
|
|
$modal.hide();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
// Close modal handlers
|
|
$('#pc-announcements-274-delete-modal').on('click', '.pc-announcements-274-cancel-delete, .pc-announcements-274-modal-backdrop', function() {
|
|
$('#pc-announcements-274-delete-modal').hide();
|
|
});
|
|
|
|
// Close modal with Escape key
|
|
$(document).on('keydown', function(e) {
|
|
if (e.keyCode === 27) { // Escape key
|
|
$('#pc-announcements-274-delete-modal').hide();
|
|
}
|
|
});
|
|
|
|
// Media upload functionality
|
|
var customUploader;
|
|
|
|
$('.pc-announcements-274-upload-image-btn').on('click', function(e) {
|
|
e.preventDefault();
|
|
|
|
var $button = $(this);
|
|
var $inputField = $button.siblings('input[type="url"]');
|
|
|
|
// If the uploader object has already been created, reopen the dialog
|
|
if (customUploader) {
|
|
customUploader.open();
|
|
return;
|
|
}
|
|
|
|
// Extend the wp.media object
|
|
customUploader = wp.media.frames.file_frame = wp.media({
|
|
title: pc_announcements_274_ajax.i18n.choose_image,
|
|
button: {
|
|
text: pc_announcements_274_ajax.i18n.choose_image
|
|
},
|
|
multiple: false
|
|
});
|
|
|
|
// When a file is selected, grab the URL and set it as the text field's value
|
|
customUploader.on('select', function() {
|
|
var attachment = customUploader.state().get('selection').first().toJSON();
|
|
$inputField.val(attachment.url);
|
|
|
|
// Update preview if exists
|
|
var $preview = $inputField.siblings('.pc-announcements-274-image-preview');
|
|
if ($preview.length === 0) {
|
|
$preview = $('<div class="pc-announcements-274-image-preview"></div>').insertAfter($inputField.parent());
|
|
}
|
|
$preview.html('<img src="' + attachment.url + '" alt="' + pc_announcements_274_ajax.i18n.preview + '" style="max-width: 200px; height: auto;">');
|
|
});
|
|
|
|
// Open the uploader dialog
|
|
customUploader.open();
|
|
});
|
|
|
|
// Auto-hide notices
|
|
$('.notice.is-dismissible').on('click', '.notice-dismiss', function() {
|
|
$(this).closest('.notice').fadeOut(function() {
|
|
$(this).remove();
|
|
});
|
|
});
|
|
|
|
// Image URL field change handler
|
|
$('input[name="image_url"]').on('input', function() {
|
|
var url = $(this).val();
|
|
var $preview = $(this).siblings('.pc-announcements-274-image-preview');
|
|
|
|
if (url) {
|
|
if ($preview.length === 0) {
|
|
$preview = $('<div class="pc-announcements-274-image-preview"></div>').insertAfter($(this).parent());
|
|
}
|
|
$preview.html('<img src="' + url + '" alt="' + pc_announcements_274_ajax.i18n.preview + '" style="max-width: 200px; height: auto;" onerror="this.style.display=\'none\'">');
|
|
} else if ($preview.length > 0) {
|
|
$preview.empty();
|
|
}
|
|
});
|
|
|
|
// Date/time validation
|
|
$('#start_date, #end_date').on('change', function() {
|
|
var startDate = $('#start_date').val();
|
|
var endDate = $('#end_date').val();
|
|
|
|
if (startDate && endDate && new Date(startDate) >= new Date(endDate)) {
|
|
$('<div class="notice notice-warning is-dismissible"><p>' + pc_announcements_274_ajax.i18n.end_date_warning + '</p></div>')
|
|
.insertAfter('.wp-header-end')
|
|
.delay(5000)
|
|
.fadeOut(function() {
|
|
$(this).remove();
|
|
});
|
|
}
|
|
});
|
|
}); |