diff --git a/includes/lang/ca.php b/includes/lang/ca.php index 12ca488..9042bb3 100644 --- a/includes/lang/ca.php +++ b/includes/lang/ca.php @@ -52,4 +52,27 @@ return [ 'btn_close' => 'Tancar', 'planning_title' => 'Planning', + // --- Javascript (holidays.js) --- + 'modal_plan_trip' => 'Planificar el viatge', + 'modal_quick_edit' => 'Edició ràpida', + 'err_modal_missing' => 'Error: La modal holidayModal no es troba.', + 'placeholder_title' => 'Títol', + 'placeholder_price' => 'Preu (€)', + 'already_paid' => 'Ja pagat?', + 'remove_line' => 'Treure aquesta línia', + 'confirm_delete_trip' => 'Vols eliminar definitivament aquest viatge? Aquesta acció és irreversible.', + 'step_number' => 'Etapa', + 'place_new_step' => '📍 Afegir una nova etapa', + 'edit_step' => '✏️ Modificar l\'etapa', + 'search_in_progress' => 'Cerca en curs... ⏳', + 'no_result_found' => 'Cap resultat trobat.', + 'network_error' => 'Error de xarxa.', + 'placeholder_label' => 'Etiqueta', + 'placeholder_notes_link' => '🔗 Enllaç de reserva o notes (Opcional)...', + 'confirm_delete_step' => 'Eliminar aquesta etapa i totes les despeses associades?', + 'planning_of' => '📅 Planning : ', + 'missing_dates_title' => '⚠️ Dates que falten', + 'missing_dates_msg' => 'Si us plau, modifica aquesta etapa (✏️) i omple la seva Data d\'arribada i de sortida.', + 'to_place' => '📥 A col·locar', + ]; \ No newline at end of file diff --git a/includes/lang/fr.php b/includes/lang/fr.php index a41319c..31c6eff 100644 --- a/includes/lang/fr.php +++ b/includes/lang/fr.php @@ -51,4 +51,27 @@ return [ 'btn_close' => 'Fermer', 'planning_title' => 'Planning', + // --- Javascript (holidays.js) --- + 'modal_plan_trip' => 'Planifier le voyage', + 'modal_quick_edit' => 'Modification rapide', + 'err_modal_missing' => 'Erreur : La modale holidayModal est introuvable.', + 'placeholder_title' => 'Intitulé', + 'placeholder_price' => 'Prix (€)', + 'already_paid' => 'Déjà payé ?', + 'remove_line' => 'Retirer cette ligne', + 'confirm_delete_trip' => 'Voulez-vous vraiment supprimer définitivement ce voyage ? Cette action est irréversible.', + 'step_number' => 'Étape', + 'place_new_step' => '📍 Placer une nouvelle étape', + 'edit_step' => '✏️ Modifier l\'étape', + 'search_in_progress' => 'Recherche en cours... ⏳', + 'no_result_found' => 'Aucun résultat trouvé.', + 'network_error' => 'Erreur réseau.', + 'placeholder_label' => 'Libellé', + 'placeholder_notes_link' => '🔗 Lien de réservation ou notes (Optionnel)...', + 'confirm_delete_step' => 'Supprimer cette étape et toutes les dépenses associées ?', + 'planning_of' => '📅 Planning : ', + 'missing_dates_title' => '⚠️ Dates manquantes', + 'missing_dates_msg' => 'Veuillez modifier cette étape (✏️) et renseigner sa Date d\'arrivée et de départ.', + 'to_place' => '📥 À Placer', + ]; \ No newline at end of file diff --git a/modules/holidays/holidays.js b/modules/holidays/holidays.js index 4dcfad5..1b598a2 100644 --- a/modules/holidays/holidays.js +++ b/modules/holidays/holidays.js @@ -1,11 +1,21 @@ -document.addEventListener("DOMContentLoaded", () => { - // Fermer les modales si on clique en dehors du contenu - window.onclick = function (event) { - const modal = document.getElementById("holidayModal"); - if (event.target == modal) { - closeHolidayModal(); - } - }; +// ============================================================================ +// FONCTION DE TRADUCTION JS & LANGUE COURANTE +// ============================================================================ +function tr(key) { + return window.I18N && window.I18N[key] ? window.I18N[key] : key; +} + +// On détecte la langue de la page (définie dans la balise du header) +const currentLang = document.documentElement.lang === "ca" ? "ca-ES" : "fr-FR"; + +// ============================================================================ +// FERMETURE UNIVERSELLE DES MODALES +// ============================================================================ +window.addEventListener("click", function (event) { + if (event.target.classList.contains("pf-modal")) { + event.target.style.display = "none"; + document.body.classList.remove("no-scroll"); + } }); // --- 1. GESTION DE LA MODALE D'ÉDITION RAPIDE --- @@ -15,7 +25,6 @@ function openHolidayModal(mode) { const form = document.getElementById("holidayForm"); const btnDelete = document.getElementById("btn_delete"); - // Reset complet pour éviter les résidus d'une carte précédente form.reset(); document.getElementById("inp_id").value = ""; document.getElementById("list_transport").innerHTML = ""; @@ -23,53 +32,42 @@ function openHolidayModal(mode) { document.getElementById("list_activity").innerHTML = ""; if (mode === "add") { - document.getElementById("modalTitle").innerText = "Planifier le voyage"; + document.getElementById("modalTitle").innerText = tr("modal_plan_trip"); btnDelete.style.display = "none"; } else { - document.getElementById("modalTitle").innerText = "Modification rapide"; + document.getElementById("modalTitle").innerText = tr("modal_quick_edit"); btnDelete.style.display = "block"; } modal.style.display = "flex"; - - // Focus sur le champ titre pour une saisie rapide (petit délai pour l'animation d'ouverture) setTimeout(() => document.getElementById("inp_title").focus(), 100); } function closeHolidayModal() { document.getElementById("holidayModal").style.display = "none"; + document.body.classList.remove("no-scroll"); } function editHoliday(data) { - console.log("1. 🛠️ editHoliday déclenchée avec :", data); - const h = data.main; const modal = document.getElementById("holidayModal"); if (!modal) { - alert( - "Erreur : La modale 'holidayModal' est introuvable dans le code HTML.", - ); + alert(tr("err_modal_missing")); return; } - console.log("2. ✅ Modale trouvée dans le DOM."); document.body.appendChild(modal); if (typeof openHolidayModal === "function") { openHolidayModal("edit"); - console.log("3. 🔄 openHolidayModal (ancienne fonction) exécutée."); } - // On force l'affichage de manière agressive modal.classList.add("open"); modal.style.setProperty("display", "flex", "important"); modal.style.setProperty("z-index", "999999", "important"); document.body.classList.add("no-scroll"); - console.log("4. 👁️ Affichage forcé appliqué."); - - // Remplissage des champs (avec un try/catch pour capter la moindre erreur silencieuse) try { document.getElementById("inp_id").value = h.id; document.getElementById("inp_title").value = h.title; @@ -83,12 +81,10 @@ function editHoliday(data) { document.getElementById("inp_extra").value = h.budget_extra > 0 ? h.budget_extra : ""; document.getElementById("inp_notes").value = h.notes || ""; - console.log("5. ✍️ Champs textes remplis avec succès."); } catch (err) { - console.error("❌ Erreur lors du remplissage des champs textes :", err); + console.error("Erreur champs textes :", err); } - // Remplissage des listes d'items généraux try { document.getElementById("list_transport").innerHTML = ""; document.getElementById("list_accommodation").innerHTML = ""; @@ -96,7 +92,6 @@ function editHoliday(data) { if (data.items && data.items.length > 0) { data.items.forEach((item) => { - // On évite d'afficher le point technique invisible dans la liste des dépenses if ( typeof addItem === "function" && item.name !== "PF_TECHNICAL_POINT" @@ -105,9 +100,8 @@ function editHoliday(data) { } }); } - console.log("6. 📋 Listes dynamiques remplies. Fin de la fonction ! 🎉"); } catch (err) { - console.error("❌ Erreur lors du remplissage des listes dynamiques :", err); + console.error("Erreur listes :", err); } } @@ -117,33 +111,31 @@ function addItem(category, name = "", amount = "", isPaid = 0) { const container = document.getElementById("list_" + category); const div = document.createElement("div"); - // Style en ligne pour s'assurer que ça reste propre sans dépendre de classes externes complexes div.style.display = "flex"; div.style.gap = "8px"; div.style.alignItems = "center"; div.style.marginBottom = "10px"; - // Astuce pour lier la checkbox visuelle à l'input caché (valeur 0 ou 1 pour MySQL) const checkedAttr = isPaid == 1 ? "checked" : ""; div.innerHTML = ` -