Pontoporeia e6829994b6 Refactor + feat: unify format/fichiers HTMX fragment, reorder format types, add file constraints, fix admin auth
* **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.
2026-05-13 17:59:13 +02:00
2026-05-07 16:40:16 +02:00
2026-05-07 16:40:16 +02:00

XAMXAM

(Anciennement Posterg)

Répertoire des travaux de fin d'études de l'ERG (École de Recherche Graphique).

Requirements

  • PHP 8.4
  • SQLite3 (php8.4-sqlite3)
  • nginx (production)

Development

MacOS

Logiciels:

  • un IDE pour éditer → VSCode
  • git (ou une interface graphique) pour partager les modifications → git-gui (officiel) ou Github Desktop
  • un server web avec PHP pour visualiser le project dans le navigateur → MAMP

Workflow

  1. Faire un changement dans ton IDE
  2. Démarrer le site via MAMP, en sélectionnant le dossier public
  3. Vérifier que ça marche sur le site en local, depuis ton navigateur
  4. Une fois qu'un changement spécifique est fait, commit les changements sur les fichiers qui sont relatif à ce changement
  5. Vérifier que vous avez syncroniser avec le remotepull + rebase ! pas merge
  6. push les changements vers le remote
just serve   # http://localhost:8000  (public) and /admin/

Deployment

Files are pushed to the server with rsync — there is no repo on the remote.

just deploy     # rsync app files → xamxam:/var/www/xamxam/
just deploy-db  # push local xamxam.db → remote (only if remote DB is absent)

deploy-db refuses to run if a database already exists on the server, to avoid accidental overwrites of production data.

First-time server setup

ssh xamxam
sudo mkdir -p /var/www/xamxam
sudo chown www-data:xamxam /var/www/xamxam
sudo chmod 775 /var/www/xamxam
exit

Then deploy once and apply nginx config:

just deploy
just deploy-nginx

Admin users (htpasswd)

just manage-admin-users
# Then on server:
ssh xamxam "sudo bash /tmp/manage-admin-users.sh"

Security notes

  • Admin panel protected by nginx auth_basic + PHP session (AdminAuth)
  • Uploads stored outside webroot, served via controlled media.php
  • Rate limiting on public search (src/RateLimit.php)
  • See nginx/docs/SECURITY_HEADERS.md for security headers reference
Description
Site permettant de consulter la collection de TFE de l'erg
Readme 165 MiB
Languages
PHP 78.2%
CSS 11.4%
JavaScript 6.9%
Shell 1.5%
Just 1.3%
Other 0.7%