# XAMXAM TODO ## Completed - [x] Language form improvements - [x] Add Néerlandais as default language option (schema + migration 017) - [x] Make `language_autre` required only when no Langue du TFE checkbox is checked (JS in form.php, PHP server-side default) - [x] Merge banner images into cover images - [x] Migration 016: copy `storage/banners/*` → `storage/covers/`, insert `thesis_files` cover records, clear `banner_path`, remove banners dir - [x] Remove banner fieldset from edit form (`form.php`) - [x] Remove banner fieldset from student submission form (`fieldset-files.php`: rename to couverture) - [x] Update `ThesisEditController::save()` — remove banner upload/removal logic - [x] Update `ThesisCreateController::submit()` — remove `handleBannerUpload` call - [x] Update `Database::handleCoverUpload()` — add webp support, raise limit to 20 MB - [x] Remove `Database::setBannerPath()`, `handleBannerUpload()`, `getThesisBannerPath()` - [x] Update `Database::deleteThesis()` / `bulkDeleteTheses()` — remove banner file cleanup - [x] `HomeController`: batch-load covers for all items, remove banner_path fallback - [x] `SearchController::handleSearch()`: batch-load covers, pass `$coverMap` to view - [x] `SearchController::handleStudentPreview()`: load covers, pass `$coverMap` to partial - [x] `TfeController::resolveOgImage()`: use cover file_type instead of banner_path - [x] `home.php`: use only `$coverMap` (no banner_path fallback) - [x] `search.php`: show cover thumbnail on result cards - [x] `student-preview.php`: use `$coverMap` instead of `banner_path` - [x] Migration applied and file moved to `applied/`