Prenotazioni Mensa – Registro modifiche

Riepilogo Lavori

Sessione di sviluppo Β· admin.php Β· cuoca/
πŸ“… 14 Marzo 2026
Giuseppe Montisci
πŸ› Bug Critico #1 Β· admin.php – Tutti i pulsanti smettono di funzionare
Sintomo
Dopo l'aggiunta del modale di conferma logout, nessun pulsante nella pagina admin rispondeva ai click (Storico, Modifica prenotazione, Riepilogo, Aggiungi dipendente, ecc.).
Causa Radice
Il blocco JavaScript del modale logout era stato scritto con virgolette tipografiche Unicode ( U+201C / U+201D) invece delle normali virgolette ASCII ".

JavaScript non riconosce le virgolette curve come delimitatori di stringa β†’ errore di sintassi β†’ l'intero blocco <script> non viene eseguito β†’ zero event listener registrati.
Identificato con node --check: "Invalid or unexpected token" a riga 2829 del JS estratto
Confermato con cat -A: ogni stringa mostrava sequenze M-bM-^@M-^\...M-bM-^@M-^] (UTF-8 di U+201C/U+201D)
Rimosso con Node.js (str.replace(/\u201c/g, '"').replace(/\u201d/g, '"')): 42 virgolette sostituite in tutto il file
// ❌ PRIMA (errore di sintassi – virgolette tipografiche)
const link = document.getElementById("logoutLink");
                                        ↑ U+201C          ↑ U+201D

// βœ… DOPO (virgolette ASCII standard)
const link = document.getElementById("logoutLink");
admin.php riga ~6385 (blocco JS logout modal)
✨ Miglioramento #2 Β· admin.php – Riepilogo: ordine alfabetico/naturale piatti
Problema
Nel riepilogo giornaliero (modale πŸ“Š), i piatti di Primo e Secondo apparivano nell'ordine casuale di inserimento nel database, non alfabetico.

Codici come P1, P10, P11, P2, P20 venivano mostrati fuori sequenza logica.
Soluzione
Aggiunto uksort() con strnatcasecmp subito prima di costruire gli array di output PHP.

Il natural sort (ordinamento naturale) riconosce i numeri come numeri, quindi: P1 β†’ P2 β†’ P9 β†’ P10 β†’ P11 β†’ P20 invece di ordine lessicografico.
// βœ… AGGIUNTO prima di costruire $primiOut / $secondiOut
uksort($summaryPrimi,   'strnatcasecmp');
uksort($summarySecondi, 'strnatcasecmp');

// Risultato ordinamento (esempio)
// PRIMA:  P1, P10, P11, P2, P20, Pasta al pesto, Risotto
// DOPO:   P1, P2, P10, P11, P20, Pasta al pesto, Risotto
PerchΓ© strnatcasecmp?
Rispetto a strcmp o usort semplice, strnatcasecmp Γ¨ case-insensitive e confronta le sequenze numeriche come interi β†’ perfetto per codici tipo P1…P99 misti a nomi di piatto con lettere.
admin.php riga ~1684 (AJAX action: summary_date)
πŸ”§ Fix UX #3 Β· admin.php – Campo data: pagina si ricarica dopo il primo digit
Sintomo
Scrivendo una data (es. il giorno 16), l'utente digitava "1" e la pagina si ricaricava immediatamente, perdendo il secondo digit "6". Campo bloccato al primo carattere.
Causa
I browser (Chrome/Edge) gestiscono type="date" con sezioni indipendenti (giorno / mese / anno). Digitando "1" nel campo giorno, il browser puΓ² auto-completare a "01" e scattare il change event con una data valida completa. Il vecchio handler navigava istantaneamente (window.location.replace) senza aspettare il secondo digit.
// ❌ PRIMA – navigazione immediata al primo change
dateFilterInput.addEventListener("change", () => {
    const v = dateFilterInput.value;
    if (!v) return;
    const url = new URL(window.location.href);
    url.searchParams.set("data", v);
    window.location.replace(url.toString());  // ← troppo veloce!
});

// βœ… DOPO – debounce 700ms + Invio per conferma immediata
let _dateTimer = null;

function goToDate() {
    const v = dateFilterInput.value;
    if (!v) return;
    const url = new URL(window.location.href);
    url.searchParams.set("data", v);
    window.location.replace(url.toString());
}

dateFilterInput.addEventListener("change", () => {
    if (_dateTimer) clearTimeout(_dateTimer);
    _dateTimer = setTimeout(goToDate, 700);   // aspetta 700ms
});

dateFilterInput.addEventListener("keydown", (e) => {
    if (e.key === "Enter") { clearTimeout(_dateTimer); goToDate(); }
});
Come funziona ora
Ogni volta che il browser emette change, parte un conto alla rovescia di 700ms. Se arriva un altro change prima dello scadere (perchΓ© l'utente sta ancora digitando), il timer repart da zero. La navigazione avviene solo quando l'utente smette di modificare la data per almeno 700ms. Con Invio si naviga subito senza aspettare.
admin.php riga ~3959 (IIFE dateFilter)
πŸ“‹ Riepilogo Rapido
# Tipo File Descrizione Strumento/Tecnica
1 Bug admin.php 42 virgolette Unicode "…" β†’ ASCII "…" nel JS logout modal node --check + regex Node.js
2 Feature admin.php Ordinamento naturale piatti nel riepilogo (P1→P2→P10…) uksort + strnatcasecmp (PHP)
3 Fix UX admin.php Debounce 700ms su campo data β†’ evita ricarica al primo digit JS setTimeout / clearTimeout