Auto-commit for deploy to staging - 2026-09-26 10:01:27
Deploy HouseHub / deploy (push) Successful in 2s

This commit is contained in:
FeFeClochette committed 2026-09-26 10:01:27 +02:00
1 parent 4e156a09f7
commit bd9ab7304e
4 files changed
+76 -1

No files matched your search

+1
View File
@@ -1034,4 +1034,5 @@ return [
'cta_food' => 'Cuinar',
'food_err_no_views' => "Cap vista activada per a aquest mòdul. Modifiqueu la vostra configuració d'espai.",
'food_err_no_views_desc' => 'Heu desactivat totes les funcions d\'aquest mòdul. Aneu a la configuració per reactivar-les.',
'meal_paste_success' => 'Graella enganxada amb èxit!',
];
+1 -1
View File
@@ -105,7 +105,6 @@ return [
'mod_printvault_desc'=> 'Manage your 3D print files — STL, 3MF, GCode with interactive viewer.',
'mod_planka_name' => 'Planka',
'mod_planka_desc' => 'Manage your projects in Kanban mode with Planka.',
'budget_mandatory_note' => 'Les onglets Suivi et Récapitulatif sont indispensables et toujours actifs.',
'cta_open' => 'Open',
'cta_explore' => 'Explore',
@@ -1038,5 +1037,6 @@ return [
'cta_food' => 'Cook up',
'food_err_no_views' => "No view is enabled for this module. Please check your space settings.",
'food_err_no_views_desc' => 'You have disabled all features for this module. Please visit your settings to re-enable them.',
'meal_paste_success' => 'Grid pasted successfully!',
];
+1
View File
@@ -1033,5 +1033,6 @@ return [
'cta_food' => 'Mijoter',
'food_err_no_views' => "Aucune vue n'est activée pour ce module. Modifiez vos paramètres d'espace.",
'food_err_no_views_desc' => 'Vous avez désactivé toutes les fonctionnalités de ce module. Rendez-vous dans vos paramètres pour les réactiver.',
'meal_paste_success' => 'Grille collée avec succès !',
];
+73
View File
@@ -407,4 +407,77 @@ window.importPdfMenu = async function(e) {
updateDropzoneState(null);
}
};
// NOUVEAU : Interception du collage depuis Excel / Google Sheets
document.addEventListener('paste', async function(e) {
// On ne s'active que si on colle dans un textarea de repas
if (!e.target.classList.contains('js-meal-input')) return;
const clipboardData = e.clipboardData || window.clipboardData;
const pastedText = clipboardData.getData('text/plain');
// Si le texte ne contient ni tabulation ni saut de ligne, c'est un collage simple.
// On laisse le navigateur faire son comportement par défaut.
if (!pastedText.includes('\t') && !pastedText.includes('\n')) return;
// C'est une grille ! On bloque le comportement par défaut
e.preventDefault();
const rows = pastedText.split(/\r?\n/);
const startTd = e.target.closest('td');
const startTr = e.target.closest('tr');
const startColIndex = Array.from(startTr.children).indexOf(startTd);
let currentTr = startTr;
let updates = [];
for (let i = 0; i < rows.length; i++) {
if (!currentTr) break; // Fin du tableau visuel atteinte
// Ignorer la dernière ligne vide souvent générée par les tableurs lors d'une copie
if (rows[i].trim() === '' && i === rows.length - 1) continue;
const cells = rows[i].split('\t');
const trChildren = Array.from(currentTr.children);
for (let j = 0; j < cells.length; j++) {
const targetTd = trChildren[startColIndex + j];
if (!targetTd) continue; // Fin de la colonne visuelle atteinte
const targetTextarea = targetTd.querySelector('.js-meal-input');
if (targetTextarea) {
const val = cells[j].trim();
targetTextarea.value = val;
// Animation de succès visuel
if (typeof flashSuccess === 'function') flashSuccess(targetTextarea);
// Préparation pour le Bulk Save
updates.push({
plan_date: targetTextarea.dataset.d,
service: targetTextarea.dataset.s,
person_id: targetTextarea.dataset.p,
meal_name: val
});
}
}
// Descendre d'une ligne dans le tableau (ex: passer de Midi à Soir, ou de Soir au Midi du lendemain)
currentTr = currentTr.nextElementSibling;
}
// Sauvegarde groupée optimisée
if (updates.length > 0) {
const fd = new FormData();
fd.append('action', 'save_bulk');
fd.append('updates', JSON.stringify(updates));
try {
await pachaFetch('/modules/food/includes/api/save-meals.php', { method: 'POST', body: fd });
if (window.showToast) showToast(window.I18N['meal_paste_success'] || 'Grille collée avec succès !', 'success');
} catch(err) {
console.error("Erreur de sauvegarde lors du collage", err);
if (window.showToast) showToast(window.I18N['error_occured'], 'error');
}
}
});
</script>