# Posterg TODO ## Fixes - [x] Replace `mb_strtolower` with `strtolower` in admin/index.php (mbstring not available in php8.4-fpm) - [x] Replace `mb_strlen`/`mb_substr` with `strlen`/`substr` in student-preview.php (same root cause) - [x] Add `objet` column migration (production DB missing column → SQLSTATE[HY000]: table theses has no column named objet) ## Logging - [x] `AppLogger` — structured JSON logger at `storage/logs/form-submissions.log` - [x] Admin formulaire: log submissions (success + error, IP, UA, author, post keys) - [x] Partage form: log submissions (success + error, share slug, IP, UA, post keys) ## Migrations - [x] Migration runner (`app/migrations/run.php`) with tracking table `_migrations` - [x] `001_add_objet_column.sql` (handles duplicate-column gracefully) ## Features - [x] Student name popover preview in /repertoire (zero per-hover requests) - [x] `Database::getThesesByAuthorName()` query - [x] `SearchController::handleStudentPreview()` HTMX endpoint - [x] `/repertoire/student-preview` route in Dispatcher - [x] `partials/student-preview.php` — iframe (single) or link list (multiple) - [x] Updated `repertoire-index.php` — htmx hover attrs, `$studentWorks` map - [x] Popover container + JS position/hide logic in `repertoire.php` - [x] CSS in `repertoire.css` ## File naming - [x] Analyse current file saving in admin/add.php and partage/index.php - [x] Implement author slug generation (`generateAuthorSlug`) - [x] Modify `handleThesisFiles`: folder = `theses/{year}/{year}_{AUTHOR_NAME}/` - [x] Modify `handleThesisFiles`: filename = `AUTHOR_NAME_sanitized_original.ext` - [x] Ensure uniqueness within same year/author (suffix `_1`, `_2`, etc.) - [x] Database path storage updated automatically via `insertThesisFile` - [ ] Test with actual uploads - [ ] Consider same changes for `handleCoverUpload` and `handleBannerUpload`