10 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
TODO
- Make all heading font sizes the same (slightly smaller than current h1) in common.css
- Remove individual font-size overrides from other CSS files so they inherit
- Standardise header nav structure: admin uses nav-left/nav-right like public
- Unify font-size for all nav links (logo + nav links all use var(--step--1))
- Clean up redundant CSS rules (.nav-logo, .nav-left-links)
- Update admin.css selectors to match new header structure
- Bump nav font-size to var(--step-0)
- Add small inverted top gradient to admin body
- Commit
- Cap home page cards grid to max 3 columns (was auto-fill, now repeat(3, 1fr) with 2→1 column breakpoints)
- Remove Modifier link from admin header when on edit page
- Move admin nav links to right side, keep only logo on left
- Remove Mots-clés from admin header, add as button in dashboard toolbar; use grid layout (title|stats, search|buttons)
- Group admin toolbar buttons: + Ajouter + Mots-clés stacked above Import/Export
- Stack admin filters vertically: search+button row above dropdowns row
- Standardise form inputs/selects/textareas in common.css: padding, --radius var, 2px accent border on focus