drag pdf
Deploy HouseHub / deploy (push) Successful in 2s

This commit is contained in:
FeFeClochette committed 2026-09-26 09:53:49 +02:00
1 parent bfa70402a9
commit 4e156a09f7
5 files changed
+82 -16

No files matched your search

+3 -3
View File
@@ -1021,9 +1021,9 @@ return [
'meal_saved' => 'Menjar guardat!', 'meal_saved' => 'Menjar guardat!',
'meal_btn_import_pdf' => 'Import Menu PDF', 'meal_btn_import_pdf' => 'Import Menu PDF',
'meal_import_title' => 'Import canteen menu', 'meal_import_title' => 'Import canteen menu',
'meal_import_child' => 'For which child?', 'meal_import_child' => 'Per quina persona?',
'meal_select_child' => 'Select child', 'meal_select_child' => 'Sélectionner un membre :',
'meal_pdf_file' => 'PDF File (Convivio)', 'meal_pdf_file' => 'PDF File',
'meal_drop_pdf' => 'Click to add PDF', 'meal_drop_pdf' => 'Click to add PDF',
'meal_import_success' => 'Menus imported successfully!', 'meal_import_success' => 'Menus imported successfully!',
'mod_food_name' => 'Cuina i Compres', 'mod_food_name' => 'Cuina i Compres',
+3 -3
View File
@@ -1025,9 +1025,9 @@ return [
'meal_saved' => 'Meal saved!', 'meal_saved' => 'Meal saved!',
'meal_btn_import_pdf' => 'Import Menu PDF', 'meal_btn_import_pdf' => 'Import Menu PDF',
'meal_import_title' => 'Import canteen menu', 'meal_import_title' => 'Import canteen menu',
'meal_import_child' => 'For which child?', 'meal_import_child' => 'For which person?',
'meal_select_child' => 'Select child', 'meal_select_child' => 'Sélectionner un membre :',
'meal_pdf_file' => 'PDF File (Convivio)', 'meal_pdf_file' => 'PDF File',
'meal_drop_pdf' => 'Click to add PDF', 'meal_drop_pdf' => 'Click to add PDF',
'meal_import_success' => 'Menus imported successfully!', 'meal_import_success' => 'Menus imported successfully!',
'mod_food_name' => 'Kitchen & Groceries', 'mod_food_name' => 'Kitchen & Groceries',
+3 -3
View File
@@ -1020,9 +1020,9 @@ return [
'meal_saved' => 'Repas enregistré !', 'meal_saved' => 'Repas enregistré !',
'meal_btn_import_pdf' => 'Importer Menu PDF', 'meal_btn_import_pdf' => 'Importer Menu PDF',
'meal_import_title' => 'Importer un menu de cantine', 'meal_import_title' => 'Importer un menu de cantine',
'meal_import_child' => 'Pour quel enfant ?', 'meal_import_child' => 'Pour quel membre ?',
'meal_select_child' => 'Sélectionner l\'enfant', 'meal_select_child' => 'Sélectionner un membre :',
'meal_pdf_file' => 'Fichier PDF (Convivio)', 'meal_pdf_file' => 'Fichier PDF',
'meal_drop_pdf' => 'Cliquez pour ajouter le PDF', 'meal_drop_pdf' => 'Cliquez pour ajouter le PDF',
'meal_import_success' => 'Menus importés avec succès !', 'meal_import_success' => 'Menus importés avec succès !',
'mod_food_name' => 'Cuisine & Courses', 'mod_food_name' => 'Cuisine & Courses',
+13
View File
@@ -1127,3 +1127,16 @@
display: block; display: block;
margin-bottom: 12px; margin-bottom: 12px;
} }
.meal-dropzone.drag-over {
border-color: var(--primary);
background: var(--bg-soft);
color: var(--primary);
}
.meal-dropzone.has-file {
border-color: var(--success);
background: var(--alert-success-bg);
color: var(--alert-success-text);
border-style: solid;
}
+60 -7
View File
@@ -167,10 +167,10 @@ while ($row = $stmtMeals->fetch(PDO::FETCH_ASSOC)) {
<div class="pf-form-group"> <div class="pf-form-group">
<label class="pf-label"><?= tr('meal_pdf_file') ?></label> <label class="pf-label"><?= tr('meal_pdf_file') ?></label>
<div class="meal-dropzone" onclick="document.getElementById('canteenPdf').click()"> <div class="meal-dropzone" id="mealDropzone" onclick="document.getElementById('canteenPdf').click()">
<span class="meal-dropzone-icon">📥</span> <span class="meal-dropzone-icon" id="mealDropzoneIcon">📥</span>
<span id="pdfFileName"><?= tr('meal_drop_pdf') ?></span> <span id="pdfFileName"><?= tr('meal_drop_pdf') ?></span>
<input type="file" id="canteenPdf" name="pdf_file" accept=".pdf" style="display: none;" required onchange="document.getElementById('pdfFileName').innerText = this.files[0] ? this.files[0].name : '<?= addslashes(tr('meal_drop_pdf')) ?>';"> <input type="file" id="canteenPdf" name="pdf_file" accept=".pdf" style="display: none;" required>
</div> </div>
</div> </div>
@@ -184,7 +184,7 @@ while ($row = $stmtMeals->fetch(PDO::FETCH_ASSOC)) {
<script> <script>
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
// Sauvegarde automatique AJAX à chaque modification // 1. Sauvegarde automatique AJAX à chaque modification
document.querySelectorAll('.js-meal-input').forEach(input => { document.querySelectorAll('.js-meal-input').forEach(input => {
input.addEventListener('change', async function() { input.addEventListener('change', async function() {
const fd = new FormData(); const fd = new FormData();
@@ -202,8 +202,61 @@ document.addEventListener('DOMContentLoaded', () => {
} }
}); });
}); });
// 2. NOUVEAU : Initialisation du Drag & Drop pour l'import PDF
const dropzone = document.getElementById('mealDropzone');
const fileInput = document.getElementById('canteenPdf');
if (dropzone && fileInput) {
// Empêcher l'ouverture automatique du fichier par le navigateur
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
dropzone.addEventListener(eventName, e => {
e.preventDefault();
e.stopPropagation();
}, false);
});
// Feedback visuel au survol
['dragenter', 'dragover'].forEach(eventName => {
dropzone.addEventListener(eventName, () => dropzone.classList.add('drag-over'), false);
});
['dragleave', 'drop'].forEach(eventName => {
dropzone.addEventListener(eventName, () => dropzone.classList.remove('drag-over'), false);
});
// Récupération du fichier au lâcher (Drop)
dropzone.addEventListener('drop', e => {
if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {
fileInput.files = e.dataTransfer.files;
updateDropzoneState(fileInput.files[0]);
}
}, false);
// Récupération au clic classique via l'input
fileInput.addEventListener('change', function() {
updateDropzoneState(this.files[0]);
});
}
}); });
// NOUVEAU : Fonction utilitaire pour gérer l'état visuel de la Dropzone
window.updateDropzoneState = function(file) {
const dropzone = document.getElementById('mealDropzone');
const fileNameDisplay = document.getElementById('pdfFileName');
const dropzoneIcon = document.getElementById('mealDropzoneIcon');
if (file) {
fileNameDisplay.innerText = file.name;
if (dropzone) dropzone.classList.add('has-file');
if (dropzoneIcon) dropzoneIcon.innerText = '✅';
} else {
fileNameDisplay.innerText = window.I18N['meal_drop_pdf'] || 'Cliquer pour ajouter le PDF';
if (dropzone) dropzone.classList.remove('has-file');
if (dropzoneIcon) dropzoneIcon.innerText = '📥';
}
};
// Focus Context Bar // Focus Context Bar
let copyState = { type: null, sourceDate: null, service: null, personIdx: null, sourceElements: [], fullDayName: '' }; let copyState = { type: null, sourceDate: null, service: null, personIdx: null, sourceElements: [], fullDayName: '' };
@@ -312,7 +365,7 @@ window.executeCopy = async function(targetDate, targetService) {
const fd = new FormData(); const fd = new FormData();
fd.append('action', 'save_bulk'); fd.append('action', 'save_bulk');
fd.append('updates', JSON.stringify(updates)); fd.append('updates', JSON.stringify(updates));
await pachaFetch('/modules/meals/includes/api/save-meals.php', { method: 'POST', body: fd }); await pachaFetch('/modules/food/includes/api/save-meals.php', { method: 'POST', body: fd });
} }
}; };
@@ -322,7 +375,7 @@ function flashSuccess(input) {
setTimeout(() => input.style.background = 'transparent', 400); setTimeout(() => input.style.background = 'transparent', 400);
} }
// NOUVEAU : Fonction Javascript d'Import PDF // Fonction Javascript d'Import PDF mise à jour
window.importPdfMenu = async function(e) { window.importPdfMenu = async function(e) {
e.preventDefault(); e.preventDefault();
const form = e.target; const form = e.target;
@@ -351,7 +404,7 @@ window.importPdfMenu = async function(e) {
btn.disabled = false; btn.disabled = false;
btn.innerText = oldText; btn.innerText = oldText;
form.reset(); form.reset();
document.getElementById('pdfFileName').innerText = window.I18N['meal_drop_pdf'] || 'Cliquer pour ajouter le PDF'; updateDropzoneState(null);
} }
}; };
</script> </script>