# Report 2026-03-12 ## Zadání Implementovat upgrade plan P1-P7 (15 položek) - optimalizace výkonu, udržovatelnosti a UX. ## Provedené změny ### P1 - Quick wins - **useDebounce hook** (300ms) integrován do useListData - eliminuje API call na každý keystroke - **DB indexy** - migrace 001_add_indexes.sql (attendance, invoices, quotations, refresh_tokens, audit_log) - **TCPDF odstraněn** z composer.json (nepoužívaná závislost) - **Vite build plugin** opraven pro graceful handling bez composer v PATH ### P2 - Stránkování - **PaginationHelper.php** - DRY backend pagination (parseParams + paginate) - **Pagination.jsx** - frontend komponenta (prev/next/čísla stránek/info) - **CSS** - .admin-pagination styly - Backend handlery refaktorovány: offers, orders, invoices, projects (default 25/stránku) - useListData rozšířen o page/perPage/pagination ### P3 - Dekompozice velkých komponent - **Dashboard.jsx** (1346 → 378 LOC): 6 subkomponent + dashboardHelpers.js - **OfferDetail.jsx** (1061 → ~530 LOC): useOfferForm hook + OfferCustomerPicker - **AttendanceAdmin.jsx** (1036 → ~275 LOC): useAttendanceAdmin hook + AttendanceShiftTable ### P4 - Backend kvalita - **SELECT * fix** - 69+ výskytů ve 22 souborech nahrazeno explicitními sloupci - users-handlers.php: password_hash explicitně vyloučen - **Overdue konsolidace** - přesunuto do invoices.php routeru (1x místo 3x) - **Validator.php** - validační helper (required, string, int, email, in, numeric) - **PaginationHelper** - PHPStan typy opraveny ### P5 - UX polish - **NotFound.jsx** - 404 stránka místo redirectu na / - **ErrorBoundary** - CSS třídy, DEV error stack, odkaz na Dashboard - **useFocusTrap hook** - Tab cycling, auto-focus, restore focus - **ConfirmModal** - focus trap integrován ### P6 - Operační viditelnost - **audit-log.php** - API endpoint s filtrováním a stránkováním - **AuditLog.jsx** - stránka s tabulkou, filtry, skeleton loading - **Sidebar** - položka "Audit log" (settings.audit permission) - **cleanup.php** - CLI script (rate limits >24h, audit log >90 dní) ### P7 - FormField komponenta - **FormField.jsx** - wrapper pro label + input + error pattern (aria-invalid) - **Vehicles.jsx** migrováno jako demonstrace ## Nalezené problémy - Composer není v PATH na tomto stroji → `composer remove` a `composer update` je třeba spustit ručně - DB migrace (001, 002) je třeba spustit ručně na databázi ## Stav - ESLint: PASS (0 errors, 0 warnings) - PHPCS: PASS (0 errors, 0 warnings on line length) - Build: PASS (2155 modules, 2.63s) - PHPStan: PASS (0 errors) - Git: commitnuto a pushnuto (7 commitů)