Crvi/assets/js/traduction-langue-admin.js
2026-01-20 07:54:37 +01:00

158 lines
5.4 KiB
JavaScript

/**
* Script admin pour la gestion des règles dépendantes des capacités de traduction
*/
(function($) {
'use strict';
$(document).ready(function() {
// Variables globales
const $addBtn = $('#add-sub-rule-btn');
const $modal = $('#sub-rule-modal');
const $confirmBtn = $('#confirm-add-sub-rule');
const $cancelBtn = $('#cancel-add-sub-rule');
const $spinner = $('.traduction-langue-add-sub-rule .spinner');
const parentId = $addBtn.data('parent-id');
// Ouvrir la modal au clic sur le bouton
$addBtn.on('click', function(e) {
e.preventDefault();
openModal();
});
// Fermer la modal au clic sur Annuler
$cancelBtn.on('click', function(e) {
e.preventDefault();
closeModal();
});
// Fermer la modal au clic sur l'overlay
$('.sub-rule-modal-overlay').on('click', function(e) {
closeModal();
});
// Fermer la modal avec la touche ESC
$(document).on('keyup', function(e) {
if (e.key === 'Escape' && $modal.is(':visible')) {
closeModal();
}
});
// Confirmer la création de la règle dépendante
$confirmBtn.on('click', function(e) {
e.preventDefault();
createSubRule();
});
/**
* Ouvre la modal de confirmation
*/
function openModal() {
$modal.fadeIn(200);
$('body').addClass('modal-open');
}
/**
* Ferme la modal de confirmation
*/
function closeModal() {
$modal.fadeOut(200);
$('body').removeClass('modal-open');
}
/**
* Crée une règle dépendante via l'API REST
*/
function createSubRule() {
// Désactiver les boutons pendant le traitement
$confirmBtn.prop('disabled', true);
$cancelBtn.prop('disabled', true);
$spinner.addClass('is-active');
// Données à envoyer
const data = {
parent_id: parentId
};
// Appel REST API
$.ajax({
url: traductionLangueAdmin.restUrl,
method: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
beforeSend: function(xhr) {
// Ajouter le nonce pour l'authentification
xhr.setRequestHeader('X-WP-Nonce', traductionLangueAdmin.nonce);
},
success: function(response) {
if (response.success && response.data) {
// Afficher un message de succès
showNotice('success', response.data.message || 'Règle dépendante créée avec succès.');
// Recharger la page après un court délai pour voir la nouvelle règle
setTimeout(function() {
window.location.reload();
}, 1000);
} else {
showNotice('error', 'Une erreur est survenue lors de la création de la règle.');
resetButtons();
}
},
error: function(xhr) {
let errorMessage = 'Une erreur est survenue lors de la création de la règle.';
if (xhr.responseJSON && xhr.responseJSON.message) {
errorMessage = xhr.responseJSON.message;
} else if (xhr.responseText) {
try {
const response = JSON.parse(xhr.responseText);
if (response.message) {
errorMessage = response.message;
}
} catch (e) {
// Ignorer les erreurs de parsing
}
}
showNotice('error', errorMessage);
resetButtons();
}
});
}
/**
* Réinitialise l'état des boutons après une erreur
*/
function resetButtons() {
$confirmBtn.prop('disabled', false);
$cancelBtn.prop('disabled', false);
$spinner.removeClass('is-active');
closeModal();
}
/**
* Affiche une notification WordPress
*
* @param {string} type - Type de notification (success, error, warning, info)
* @param {string} message - Message à afficher
*/
function showNotice(type, message) {
const noticeClass = 'notice-' + type;
const $notice = $('<div class="notice ' + noticeClass + ' is-dismissible"><p>' + message + '</p></div>');
// Insérer la notification après le titre de la page
$('.wrap h1').first().after($notice);
// Rendre la notification dismissible
$(document).trigger('wp-updates-notice-added');
// Auto-supprimer après 5 secondes
setTimeout(function() {
$notice.fadeOut(function() {
$(this).remove();
});
}, 5000);
}
});
})(jQuery);