1. fix: form improvements — multiple promoteurices, asterisks, contact dedup, bentopdf - Multiple promoteurice (interne + ULB): both fieldsets now support dynamic add/remove rows (same pattern as lecteurs). field names changed to arrays (jury_promoteur[], jury_promoteur_ulb_name[]). Controllers accept both scalar and array forms for backwards compat. - ULB promoteurice: when finality=Approfondi, asterisk appears on legend and first ULB input is marked required (JS toggle). Non-Approfondi hides the fieldset and clears values. - Contact visibility duplication: removed redundant contact_public checkbox from admin add/edit forms (showContact=false). The 'mail' field in fieldset-tfe-info already serves this purpose. - Asterisk fixes: website URL field now has asterisk+required when Site web format selected. Video/audio already had correct required handling. - bentopdf link: clearer full URL 'https://bentopdf.com/' in both fichiers-fragment.php and form.php (edit mode) 2. refactor: merge Note contextuelle into Backoffice, add Lien BAIU, reorder fields Backoffice fieldset now contains in order: 1. Note contextuelle (was standalone fieldset) 2. Points du jury 3. Remarques 4. Lien BAIU (moved from Métadonnées complémentaires) 5. Exemplaire physique BAIU 6. Exemplaire physique ERG 7. Contact interne Métadonnées complémentaires now only has: pages, minutes, annexes checkbox. Removed dead showContextNote variable from form.php, add.php, edit.php. Controller baiu_link still mapped to input name "lien" (no migration needed). 3. refactor: move annexes checkbox from Métadonnées into Fichiers fieldset - Removed 'Ce TFE comporte des annexes' checkbox from fieldset-metadata.php. - Added annexes checkbox + conditional file input to fichiers-fragment.php. When checked, an HTMX swap reveals the 'annexes' file input (multiple, PDF or ZIP/TAR, max 500 MB). - form.php seeds ['has_annexes'] for initial fragment render. - Métadonnées complémentaires now only contains pages + minutes.
9.2 KiB
XAMXAM TODO
Completed
-
PeerTube integration — two parallel systems (backup direct upload + PeerTube API)
PeerTubeService.php— credentials CRUD + OAuth2 password grant + multipart upload to/api/v1/videos/upload- Migration
021_peertube_settings.sql—peertube_settingstable (singleton) +peertube_upload_enabledfeature flag (default 0 = disabled) actions/settings.php—peertubesection handler (toggle + credential save)admin/parametres.php— PeerTube section UI (instance URL, username, password, channel ID, privacy)templates/admin/parametres.php— PeerTube settings form between SMTP and admin account sectionsadmin/partage/fichiers-fragment.php— shows<input type="file">for video/audio when enabled, keeps TODO notice when disabledThesisCreateController—handlePeerTubeUpload()uploads video/audio to PeerTube, stores watch URL asthesis_filesrowThesisEditController— samehandlePeerTubeUpload()method for edit workflowtemplates/public/tfe.php— renders PeerTube iframe embed for files whose path contains/videos/watch/AdminLogger—logPeerTubeUpdate()audit method- Direct file upload fallback: when
peertube_upload_enabled = 0, standard<input type="file">+ local storage works unchanged
-
Backoffice fieldset reorder — Note contextuelle merged in, Lien BAIU added, removed from Métadonnées
- Backoffice order: Note contextuelle → Points du jury → Remarques → Lien BAIU → Exemplaire BAIU → Exemplaire ERG → Contact interne
- Removed standalone "Note contextuelle" fieldset (now inside Backoffice)
- Lien BAIU moved from Métadonnées complémentaires into Backoffice
- Métadonnées fieldset now: pages, minutes, annexes only
-
Form fixes batch
- bentopdf link clearer: "PDFs trop lourds ? https://bentopdf.com/" (full URL visible)
- Multiple promoteurices: interne and ULB fields now dynamic (add/remove rows, same as lecteurs)
- Contact visibility duplication removed from admin forms (
showContact = false;mailfield in fieldset-tfe-info covers it) - Asterisk corrections in files section: note_intention, website URL, video, audio all show red asterisk +
requiredwhen non-admin - ULB promoteurice asterisk + required when finality=Approfondi (JS toggles
<span class="asterisk">*</span>+requiredon first ULB input) - Controllers handle
jury_promoteurandjury_promoteur_ulb_nameas both scalar and array (backwards compat)
-
Fix
just serve— justfile shebang recipes (deploy-env,reencrypt-password) used space indentation instead of tabs, causing "extra leading whitespace" parse error -
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