From 5909f55abaedfaaf086f385aecad250e120ac5cb Mon Sep 17 00:00:00 2001 From: oversu <95a7002b-481b-4ef3-b578-f9c421550aa4@localhost> Date: Tue, 8 Sep 2026 22:28:01 +0200 Subject: [PATCH 01/20] =?UTF-8?q?Fiabilise=20les=20m=C3=A9dias=20et=20la?= =?UTF-8?q?=20navigation=20mobile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 9 + HISTORIQUE.md | 4 + README.md | 2 +- VERSION | 2 +- app/Controllers/AnimalPhotoActions.php | 1 + app/Controllers/AnimalsController.php | 5 +- app/Services/PrivateMediaService.php | 13 ++ app/Views/_layout_topbar.php | 15 +- app/Views/evolutions.php | 7 +- public/assets/mobile.css | 223 ++++++++++++++++++++++++- resources/lang/en.php | 2 +- resources/lang/fr.php | 2 +- 12 files changed, 266 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03dcc02..d1a7860 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ Toutes les modifications importantes du projet sont consignées ici. Le format s’inspire de [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/) et le projet suit le [versionnage sémantique](https://semver.org/lang/fr/). +## [1.0.0-rc.17] — 2026-09-08 + +### Interface mobile et médias publics + +- remplacement du défilement horizontal du menu principal par un menu repliable sur téléphone et tablette ; +- maintien d’une navigation complète et accessible au clavier comme aux lecteurs d’écran ; +- correction des permissions des nouveaux dossiers de photos publiques afin qu’ils restent lisibles par le serveur web ; +- conservation des permissions strictes des photographies et documents privés. + ## [1.0.0-rc.16] — 2026-09-08 ### Mise à jour autonome diff --git a/HISTORIQUE.md b/HISTORIQUE.md index 39588f0..57479cd 100644 --- a/HISTORIQUE.md +++ b/HISTORIQUE.md @@ -73,3 +73,7 @@ Intégration de la modification directement dans les lignes du catalogue pour re ## `1.0.0-rc.16` — Mise à jour autonome Création d’un parcours de mise à jour commun à l’interface et à la ligne de commande, avec releases Forgejo, sauvegarde obligatoire, contrôles d’intégrité et retour arrière complet. + +## `1.0.0-rc.17` — Utilisation mobile + +Remplacement de la barre de navigation horizontale par un menu mobile repliable et fiabilisation des permissions appliquées aux nouvelles photos publiques. diff --git a/README.md b/README.md index 827cdf9..aa7ab98 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,7 @@ L’option `--apply` ne doit être utilisée qu’après lecture des rapports. L ## État du projet -La candidate actuelle est `1.0.0-rc.3`. La branche 1.0 est gelée fonctionnellement : seuls les défauts bloquants découverts pendant les validations terrain sont corrigés avant `1.0.0`. +La candidate actuelle est `1.0.0-rc.17`. La branche 1.0 est gelée fonctionnellement : seuls les défauts bloquants découverts pendant les validations terrain sont corrigés avant `1.0.0`. Le contrôle de stabilisation est disponible dans [docs/AUDIT-1.0.md](docs/AUDIT-1.0.md). diff --git a/VERSION b/VERSION index e384ff5..17e3421 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0-rc.16 +1.0.0-rc.17 diff --git a/app/Controllers/AnimalPhotoActions.php b/app/Controllers/AnimalPhotoActions.php index d8f18e3..43c8d6e 100644 --- a/app/Controllers/AnimalPhotoActions.php +++ b/app/Controllers/AnimalPhotoActions.php @@ -36,6 +36,7 @@ trait AnimalPhotoActions $base = $base ?: 'photo'; $dir = __DIR__ . '/../../public/media/animals/' . $id; try { + PrivateMediaService::ensure($dir, true); $stored = ImageService::storeUploaded($tmp, $dir, $base, 'photo'); $filename = $stored['filename']; $mime = $stored['mime']; diff --git a/app/Controllers/AnimalsController.php b/app/Controllers/AnimalsController.php index e5407d6..58e5757 100644 --- a/app/Controllers/AnimalsController.php +++ b/app/Controllers/AnimalsController.php @@ -191,10 +191,7 @@ final class AnimalsController private static function ensureAnimalMediaDir(int $animalId): void { - $dir = self::animalMediaDir($animalId); - if (!is_dir($dir)) { - mkdir($dir, 0775, true); - } + PrivateMediaService::ensure(self::animalMediaDir($animalId), true); } private static function safeFilename(string $name): string diff --git a/app/Services/PrivateMediaService.php b/app/Services/PrivateMediaService.php index 2ed2bc6..0593a34 100644 --- a/app/Services/PrivateMediaService.php +++ b/app/Services/PrivateMediaService.php @@ -28,6 +28,19 @@ final class PrivateMediaService throw new RuntimeException(t('service.image.directory_failed')); } @chmod($dir, $mode); + if ($public) { + self::hardenPublicParents($dir); + } + } + + private static function hardenPublicParents(string $dir): void + { + $mediaRoot = dirname(__DIR__, 2) . '/public/media'; + foreach ([$mediaRoot, $mediaRoot . '/animals', $dir] as $publicDir) { + if (is_dir($publicDir)) { + @chmod($publicDir, 0755); + } + } } public static function moveVisibility(int $animalId, string $filename, bool $toPublic): void diff --git a/app/Views/_layout_topbar.php b/app/Views/_layout_topbar.php index 926ddf4..eb5b400 100644 --- a/app/Views/_layout_topbar.php +++ b/app/Views/_layout_topbar.php @@ -1,7 +1,7 @@ -