115 lines
2.8 KiB
JavaScript
115 lines
2.8 KiB
JavaScript
/**
|
|
* PC Changelog Manager - Public JavaScript
|
|
*
|
|
* @package PCChangelogManager
|
|
*/
|
|
|
|
(function($) {
|
|
'use strict';
|
|
|
|
$(document).ready(function() {
|
|
// Handle upvote button clicks
|
|
$(document).on('click', '.pc-clm-upvote-btn', function(e) {
|
|
e.preventDefault();
|
|
|
|
var $button = $(this);
|
|
var postId = $button.data('post-id');
|
|
var $count = $button.find('.pc-clm-upvote-count');
|
|
var $label = $button.siblings('.pc-clm-upvote-label');
|
|
var originalCount = parseInt($count.text());
|
|
|
|
// Prevent multiple clicks
|
|
if ($button.prop('disabled')) {
|
|
return;
|
|
}
|
|
|
|
$button.prop('disabled', true);
|
|
|
|
// Show loading state
|
|
$button.addClass('loading');
|
|
|
|
// Make AJAX request
|
|
$.ajax({
|
|
url: pc_clm_ajax.ajax_url,
|
|
type: 'POST',
|
|
data: {
|
|
action: 'pc_clm_upvote',
|
|
post_id: postId,
|
|
nonce: pc_clm_ajax.nonce
|
|
},
|
|
success: function(response) {
|
|
if (response.success) {
|
|
// Update the count
|
|
$count.text(response.data.vote_count);
|
|
|
|
// Update label
|
|
var labelText = response.data.vote_count === 1 ? 'upvote' : 'upvotes';
|
|
$label.text(labelText);
|
|
|
|
// Mark as voted
|
|
$button.addClass('voted');
|
|
$button.prop('disabled', true);
|
|
|
|
// Show success message (optional)
|
|
showNotification(response.data.message, 'success');
|
|
} else {
|
|
// Show error message
|
|
showNotification(response.data.message, 'error');
|
|
// Re-enable button if not already voted
|
|
if (!response.data.voted) {
|
|
$button.prop('disabled', false);
|
|
}
|
|
}
|
|
},
|
|
error: function(xhr, status, error) {
|
|
console.error('Upvote error:', error);
|
|
showNotification('An error occurred. Please try again.', 'error');
|
|
$button.prop('disabled', false);
|
|
},
|
|
complete: function() {
|
|
$button.removeClass('loading');
|
|
}
|
|
});
|
|
});
|
|
|
|
// Helper function to show notifications
|
|
function showNotification(message, type) {
|
|
var $notification = $('<div class="pc-clm-notification pc-clm-notification-' + type + '">' + message + '</div>');
|
|
|
|
// Add to page
|
|
$('body').append($notification);
|
|
|
|
// Show with animation
|
|
setTimeout(function() {
|
|
$notification.addClass('show');
|
|
}, 100);
|
|
|
|
// Auto hide after 3 seconds
|
|
setTimeout(function() {
|
|
$notification.removeClass('show');
|
|
setTimeout(function() {
|
|
$notification.remove();
|
|
}, 300);
|
|
}, 3000);
|
|
}
|
|
|
|
// Handle keyboard accessibility for upvote buttons
|
|
$(document).on('keydown', '.pc-clm-upvote-btn', function(e) {
|
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
e.preventDefault();
|
|
$(this).click();
|
|
}
|
|
});
|
|
|
|
// Add hover effects for upvote buttons
|
|
$('.pc-clm-upvote-btn:not(.voted)').hover(
|
|
function() {
|
|
$(this).addClass('hover');
|
|
},
|
|
function() {
|
|
$(this).removeClass('hover');
|
|
}
|
|
);
|
|
});
|
|
|
|
})(jQuery); |