mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-06-25 16:19:19 +02:00
* **Unified Format + Fichiers into a single HTMX fragment**
* Introduced `app/public/partage/fichiers-fragment.php` as shared dynamic block returning both format checkboxes and adaptive “Fichiers” fieldset
* Logic adapts inputs based on selected formats:
* no selection / upload formats → standard file inputs
* “Site web” → URL fields only
* “Site web + upload” → file inputs + URL sub-fieldset
* Added admin wrapper: `app/public/admin/fichiers-fragment.php` (gated via `admin_mode=1`)
* Added `app/public/admin/format-website-fragment.php` for edit-mode website URL toggling
* Wired route `/partage/fichiers-fragment` in `app/public/partage/index.php`
* Refactored `form.php` (add/edit partage) to use single `#format-fichiers-block` instead of separate fragments
* Edit mode format checkboxes now target `format-website-fragment.php` → `#edit-website-url-fieldset`
* Added `$hxInclude` support in `checkbox-list.php` for configurable HTMX includes
* **Format system migration + ordering**
* Migration `020_format_types_sort_and_rename.sql`:
* added `sort_order` column to `format_types`
* inserted new format **Image**
* defined ordering: Écriture · Image · Audio · Vidéo · Site web · Performance · Objet éditorial · Installation · Autre
* `Database.php`: format queries now use `ORDER BY sort_order, id`
* `fichiers-fragment.php`:
* uses ordered format list
* resolves Image/Vidéo/Audio by name
* introduces `$hasImage` flag
* preserves `admin_mode` across HTMX requests
* **File constraints and UX updates**
* Enforced **100 MB PDF limit**
* `ThesisCreateController`: `MAX_PDF_SIZE = 100MB` for PDFs only
* `ThesisEditController`: same PDF-specific constraint applied
* Other file types remain capped at 500 MB
* Updated UI hints in `fichiers-fragment.php` and edit form:
* explicitly mention 100 MB PDF limit
* added reference to `bentopdf.com` for compression guidance
* `file-field.php`: added `$hintRaw` to allow HTML rendering in hints
* **Admin authentication fix**
* Fixed missing auth in admin fragments
* Added `require_once AdminAuth.php`
* Replaced direct usage with `AdminAuth::requireLogin()`
* Applied consistent pattern with existing fragment authentication approach
* **Migrations included**
* `019_add_ecriture_format.sql`
* `020_format_types_sort_and_rename.sql`
* **Files affected**
* Controllers: `ThesisCreateController`, `ThesisEditController`
* DB layer: `Database.php`
* Public fragments: `partage/fichiers-fragment.php`, `admin/fichiers-fragment.php`, `admin/format-website-fragment.php`
* Templates: `form.php`, `checkbox-list.php`, `file-field.php`
* Routing: `partage/index.php`
* Misc: `TODO.md`
This consolidates format normalization, HTMX UI simplification, file validation rules, and admin stability fixes into a single coherent system update.
6.5 KiB
6.5 KiB
XAMXAM TODO
Completed
-
PDF 100 MB limit + bentopdf mention
ThesisCreateController:MAX_PDF_SIZE = 100 MB; PDFs checked against it, other files still 500 MBThesisEditController: same per-PDF limit appliedfichiers-fragment.php: note d'intention and TFE hints mention 100 MB PDF limit + bentopdf.com linkform.phpedit-mode new-files hint updatedfile-field.php: added$hintRawflag to allow HTML in hints
-
Format types: reorder, rename, add Image/Écriture
- Migration 019: add Écriture
- Migration 020: add
sort_ordercolumn, rename Autre → Etc. / Autre, add Image, set display order (Écriture · Image · Audio · Vidéo · Site web · Performance · Objet éditorial · Installation · Etc. / Autre) Database.phpformat_types query usesORDER BY sort_order, idfichiers-fragment.phpusesORDER BY sort_order, id; Image/Vidéo/Audio IDs resolved via name map- TODO: Vidéo + Audio — PeerTube API upload (notice shown in form for now)
-
Combined Format + Fichiers into HTMX-swappable block
partage/fichiers-fragment.php— new combined fragment: format checkboxes + fichiers fieldset that adapts based on selected formats (upload inputs / URL fields / both)- Route
/partage/fichiers-fragmentadded topartage/index.php admin/fichiers-fragment.php— admin-gated wrapper for the same fragment (setsadmin_mode=1)admin/format-website-fragment.php— admin-gated fragment for edit-mode website URL fieldset toggleform.php— add/partage mode: replaced separate Format + Fichiers + website-url-fieldset with single#format-fichiers-blockserver-rendered via shared fragmentform.php— edit mode: Format checkboxes wire toadmin/format-website-fragment.php→#edit-website-url-fieldset(existing-file management untouched)checkbox-list.php— added$hxIncludevariable (defaults to'this, #website-url-fieldset') so callers can customise included fields
-
TDD analysis + new test suites
- Bug fixed:
SearchController::handleSearch()—$coverMapundefined variable + never populated for search results ShareLinkTest(13 tests) —generateSlug, allvalidateLinkbranches,verifyPassword,incrementUsage,objet_restrictionPureLogicTest(31 tests) —TfeControllerhelpers (meta, OG image, jury split, captions),ThesisCreateControllerhelpers (autofocus, detectFileType, authorSlug),ThesisEditController::buildFileSizeInfo,ExportControllerCSV column consistency,SearchControllercoverMap regression- Private helpers promoted to
protectedinTfeController,ThesisCreateController,ThesisEditControllerto enable subclass-based testing without reflection
- Bug fixed:
-
Form save audit + TDD
createThesis()missingduration_pages/duration_minutescolumns — fixedThesisCreateControllernot passing raw page/minute values tocreateThesis()— fixed (durationPages,durationMinutesextracted and passed)FormSaveTest.php— 14 red-green tests covering create+edit round-trips for all fields
-
Language form improvements
- Add Néerlandais as default language option (schema + migration 017)
language_autreconditionally required via HTMX fragment (replaced custom JS)language_autresaved viagetOrCreateLanguage()in both create and edit controllersformData['languages']wired in edit.php so checkboxes are pre-checkedduration_pages/duration_minutessaved inupdateThesis()and read back ingetThesisRawFields()beforeunload-guardapplied to add and partage forms too
-
Audit + fix direct PHP URL references blocked by nginx catch-all
deny all/request-access.phpfetch intfe.php→/request-access/media.php?path=inform.php(×2) andadmin/recapitulatif.php→/media?path=
-
Fix 403 on
/language-autre-fragment.phpfromedit.php- Root cause: standalone root-level PHP file blocked by nginx catch-all
deny all - Moved logic to
partage/language-autre-fragment.php(shared include) - Added route
/partage/language-autre-fragmentinpartage/index.php - Added
admin/language-autre-fragment.php(AdminAuth gated, includes shared logic) form.phppicks URL based on$mode(partagevs admin)- Deleted
public/language-autre-fragment.php; nginx unchanged
- Root cause: standalone root-level PHP file blocked by nginx catch-all
-
Merge banner images into cover images
- Migration 016: copy
storage/banners/*→storage/covers/, insertthesis_filescover records, clearbanner_path, remove banners dir - Remove banner fieldset from edit form (
form.php) - Remove banner fieldset from student submission form (
fieldset-files.php: rename to couverture) - Update
ThesisEditController::save()— remove banner upload/removal logic - Update
ThesisCreateController::submit()— removehandleBannerUploadcall - Update
Database::handleCoverUpload()— add webp support, raise limit to 20 MB - Remove
Database::setBannerPath(),handleBannerUpload(),getThesisBannerPath() - Update
Database::deleteThesis()/bulkDeleteTheses()— remove banner file cleanup HomeController: batch-load covers for all items, remove banner_path fallbackSearchController::handleSearch(): batch-load covers, pass$coverMapto viewSearchController::handleStudentPreview(): load covers, pass$coverMapto partialTfeController::resolveOgImage(): use cover file_type instead of banner_pathhome.php: use only$coverMap(no banner_path fallback)search.php: show cover thumbnail on result cardsstudent-preview.php: use$coverMapinstead ofbanner_path- Migration applied and file moved to
applied/
- Migration 016: copy
-
Remove
requiredfrom all form inputs in admin add/edit- Introduced
$adminModeflag inform.php(true when$modeis'add'or'edit') - Hidden "champs obligatoires" note in admin mode
- All
$required = truecallers inform.php,fieldset-tfe-info.php,fieldset-academic.php,fieldset-licence-explanation.php,fieldset-files.phpchanged to!$adminMode - Hardcoded
requiredHTML attributes infieldset-tfe-info.php(synopsis, objet radios),fieldset-licence-explanation.php(access type radios),jury-fieldset.php(promoteur, lecteurs interne/externe) gated on!$adminMode - Dynamic JS
ulbInput.requiredin jury fieldset also gated
- Introduced