Unify the three public pages (à propos, charte, licence) onto a single grid layout (.page-content) with sticky TOC sidebar, replacing the old separate / / markup. - Merge about.php, charte.php, licence.php templates into shared .page-content / .content-section structure - Add CommonMark HeadingPermalinkExtension for stable heading anchors - Use SlugNormalizer for TOC links so they match rendered heading IDs - Standardize link styling across content blocks: bold black, accent on hover (consistent with global link style) - Fix code block wrapping: use pre-wrap instead of pre, constrain grid columns with min-width:0, auto scrollbar - Fix apropos page grid placement: force content-section into column 2 so contacts and credits stay in the content area, not the sidebar Also includes accumulated WIP changes: - Header gradient: hardcoded purple-to-green (replaces CSS variables) - Search placeholder font - Duration field: replace minutes/sec/heures with h:m:s time inputs - TFE file optional for formats 1,4,6 with client-side JS toggle - Licence form: em-dash to hyphen, details/summary classes - Pill search: block Enter key form submission when no results - Draft autosave: remove CSRF rotation (broke concurrent FilePond uploads) - Language pill: clear hints for excluded main languages - Search results: gradient placeholder cards for items without covers - TFE display: format durée values as XhYm instead of decimal
6.4 KiB
TODO
Last updated: 2026-06-19 Context: Analyse OverType editors on /admin/contenus-edit.php: concurrency safety, save reliability, content truncation bugs
In Progress
- #overtype-analysis Analyse and fix OverType editor reliability on contenus-edit.php
Pending
-
#tfe-optional-formats Make TFE file optional when format is Site web (1), Performance (4) or Installation (6) — fixed incorrect format IDs [3→1,4,6] + added client-side JS toggle for TFE required/asterisk. Note d'intention remains required. 🎯
(fichiers-fragment.php, file-upload-filepond.js)✓ -
#typography-weight-300 Set search placeholder + apropos/charte/licence
content to BBBDMSans weight 300
(search.css, apropos.css)✓ -
#toc-parts-uppercase Hardcode "PARTIES" uppercase + black bottom border on TOC label
(about.php, charte.php, licence.php, apropos.css)✓ -
#apropos-overflow Prevent #apropos-intro and content-section children from overflowing
(apropos.css)✓ -
#toc-navigation Fix TOC links not navigating to headings — enable
heading_permalinkextension in CommonMark withid_prefix: '',insert: 'before',aria_hidden: true+ register extension on environment; use CommonMark's SlugNormalizer in extractToc; hide permalink anchors with CSS; addmin-width: 0to.contentto prevent grid overflow(CharteController.php, LicenceController.php, MarkdownHelper.php, apropos.css)✓ -
#apropos-toc-style Fix TOC "Parties" label: Ductus font + lowercase, remove border-left from links, match global link style; rename .apropos-content → section.content, .apropos-section → .content-section, remove .prose wrapper
(apropos.css, about.php, charte.php, licence.php)✓ -
#apropos-toc-confirm Visually confirm charte + licence TOC layout renders correctly in browser (dup after #apropos-toc-style)
-
#aria-test-manual Test WCAG changes with VoiceOver and NVDA on full add/edit/partage form flows
-
#nojs-upload-test Test end-to-end: submit partage form with JS disabled, verify files arrive via
$_FILES -
#csp-media-iframe-deploy Deploy nginx config fix to server, test PDF iframe on /tfe?id=221
Completed
-
#csrf-rotation-race Stop CSRF token rotation in draft.php + remove hx-post from
— both broke FilePond uploads and form submission(admin/actions/draft.php, partage/fragments/draft.php, FormBootstrap.php, pill-search.js)✓ -
#filepond-csrf-stale(superseded by #csrf-rotation-race) -
#adminold-return-type Fix adminOld closure return type from
:stringto:string|array(FormBootstrap.php)✓ -
#duration-integer-units Make duration field: integer for pages/Mo, dedicated h/m/s time inputs
(form.php, ThesisCreateController.php, tfe.php, form-base.css)✓ -
#licence-svg-fix Fix licence details/summary SVG: width 1rem, inline-flex layout
(fieldset-licence-explanation.php, form-base.css)✓ -
#restore-languages Un-soft-delete anglais (id=2) and néerlandais (id=71) in dev DB ✓
-
#php-upload-limits Increase PHP upload_max_filesize to 8G, post_max_size to 8.5G
(.user.ini)✓ -
#formdata-fieldset-crash Remove leftover debug console.log that called new FormData(fieldset)
(admin/footer.php)✓ -
#csp-media-iframe-fix Fix CSP
frame-ancestors 'none'blocking PDF iframes — replacedtry_filesredirect with directfastcgi_passinlocation = /mediasoadd_headerCSP override survives internal nginx redirect(nginx/xamxam.conf)✓ -
#duration-migration Add migration to reintroduce
duration_valueandduration_unitcolumns + update views(migrations/applied/040_duration_fields.sql)✓ -
#duration-database Update
createThesis,updateThesis,getThesisRawFieldsin Database(Database.php)✓ -
#duration-controllers Handle duration in
ThesisCreateControllerandThesisEditController(ThesisCreateController.php, ThesisEditController.php)✓ -
#duration-form Add duration fieldset (value + unit dropdown) to form template
(templates/partials/form/form.php)✓ -
#duration-display Show duration on public TFE detail page
(templates/public/tfe.php)✓ -
#duration-view Include duration in v_theses_full and v_theses_public
(migrations/applied/040_duration_fields.sql, schema.sql, schema.sql.new)✓ -
#duration-bootstrapWire Wire duration variables through FormBootstrap adminFormVariables
(FormBootstrap.php)✓ -
#cleanup-drafts Add periodic cleanup job for orphaned drafts (
Database.php,justfile,deploy/xamxam-cleanup.cron,scripts/cleanup-drafts.php) ✓ -
#form-setup-helper Add
FormBootstraphelper class to reduce bootstrap duplication across add/edit/partage(admin/add.php)(admin/edit.php)✓ -
#two-phase-commit Add two-phase commit: INSERT thesis
status='draft', COMMIT, move files, UPDATE toactive(ThesisCreateController.php)✓ -
#filepond-preserve Preserve FilePond temp file IDs on partage validation redirect
(partage/index.php)(FilepondHandler.php)✓ -
#refactor-partage Extract partage form page chrome to
templates/partage/form-page.php(partage/index.php)✓ -
#htmx-migration HTMX v2 migration: OverType editors, autosave handler, backend
HX-Requestdetection ✓ -
#filepond-crash FilePond crash on TFE upload forms: root cause fixed (
.filename→.name), all crashes resolved ✓ -
#aria-errormessage WCAG AA: field-level
aria-errormessage,aria-invalid,aria-describedbyon all form fields ✓ -
#nojs-upload-fix No-JS file uploads:
filepond_modedefault to0 disabled, server-side$_FILESfallback ✓ -
#autosave-partage Autosave text fields on partage form: session draft endpoint (
fragments/draft.php), HTMX autosave on change/input, page-load hydration, "Brouillon enregistré" indicator, draft cleared on submit ✓ -
#autosave-partage-wire Wire
formExtraAttrs,showAutosaveStatus, draft hydration,autosave-handler.js, draft cleanup into partage form (partage/index.php,partage/form-page.php) ✓ -
#mobile-responsive Mobile-responsive form layout:
@media (max-width: 600px)breakpoint, 44×44px touch targets ✓ -
#aria-fieldset-fix Remove invalid
requiredattribute from<fieldset>, keeparia-required="true", addrole="group"✓ -
#split-form-css Split
form.cssintoform-base.cssandform-admin.css✓ -
#extra-css-admin Update
head.phpto support$extraCssAdminfor admin-only stylesheets(head.php)✓