@fraza/core 0.3.8 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/THIRD-PARTY-NOTICES.md +2 -2
  3. package/changelog.json +86 -0
  4. package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
  5. package/dist/docs/01-demarrage/01-installation.md +9 -15
  6. package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
  7. package/dist/docs/01-demarrage/03-configuration.md +1 -1
  8. package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
  9. package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
  10. package/dist/docs/02-guides/blocs-personnalises.md +1 -1
  11. package/dist/docs/02-guides/etendre-l-admin.md +2 -2
  12. package/dist/docs/02-guides/gerer-les-medias.md +1 -1
  13. package/dist/docs/02-guides/index.md +1 -1
  14. package/dist/docs/02-guides/seo-et-metadonnees.md +1 -1
  15. package/dist/docs/03-reference/01-cores/templates.md +3 -3
  16. package/dist/docs/03-reference/02-features/admin.md +13 -2
  17. package/dist/docs/03-reference/03-registres/media-registry.md +4 -4
  18. package/dist/docs/03-reference/04-partage/composants.md +2 -0
  19. package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
  20. package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
  21. package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
  22. package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
  23. package/dist/docs/04-architecture/05-securite.md +1 -1
  24. package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
  25. package/dist/docs/05-contribution/03-redaction.md +10 -0
  26. package/dist/docs/05-contribution/05-publication.md +0 -1
  27. package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
  28. package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
  29. package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
  30. package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
  31. package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
  32. package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
  33. package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
  34. package/dist/docs/06-modules/booking/index.md +22 -12
  35. package/dist/docs/06-modules/drive/01-installation.md +92 -0
  36. package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
  37. package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
  38. package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
  39. package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
  40. package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
  41. package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
  42. package/dist/docs/06-modules/drive/index.md +23 -13
  43. package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
  44. package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
  45. package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
  46. package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
  47. package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
  48. package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
  49. package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
  50. package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
  51. package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
  52. package/dist/docs/06-modules/facturation/index.md +26 -16
  53. package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
  54. package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +6 -6
  55. package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
  56. package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
  57. package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
  58. package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
  59. package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
  60. package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
  61. package/dist/docs/06-modules/forms/index.md +26 -14
  62. package/dist/docs/06-modules/index.md +2 -2
  63. package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
  64. package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
  65. package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
  66. package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
  67. package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
  68. package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
  69. package/dist/docs/06-modules/medias/index.md +25 -13
  70. package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
  71. package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
  72. package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
  73. package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
  74. package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
  75. package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
  76. package/dist/docs/06-modules/pages/index.md +21 -9
  77. package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
  78. package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
  79. package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
  80. package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
  81. package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
  82. package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
  83. package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
  84. package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
  85. package/dist/docs/06-modules/posts/index.md +25 -13
  86. package/dist/docs/assets/decouverte/tableau-de-bord.dark.webp +0 -0
  87. package/dist/docs/assets/decouverte/tableau-de-bord.light.webp +0 -0
  88. package/dist/docs/assets/demarrage/connexion.dark.webp +0 -0
  89. package/dist/docs/assets/demarrage/connexion.light.webp +0 -0
  90. package/dist/docs/assets/demarrage/roles.dark.webp +0 -0
  91. package/dist/docs/assets/demarrage/roles.light.webp +0 -0
  92. package/dist/docs/assets/demarrage/tableau-de-bord-neuf.dark.webp +0 -0
  93. package/dist/docs/assets/demarrage/tableau-de-bord-neuf.light.webp +0 -0
  94. package/dist/docs/assets/modules/booking/agenda.dark.webp +0 -0
  95. package/dist/docs/assets/modules/booking/agenda.light.webp +0 -0
  96. package/dist/docs/assets/modules/drive/navigateur.dark.webp +0 -0
  97. package/dist/docs/assets/modules/drive/navigateur.light.webp +0 -0
  98. package/dist/docs/assets/modules/facturation/factures.dark.webp +0 -0
  99. package/dist/docs/assets/modules/facturation/factures.light.webp +0 -0
  100. package/dist/docs/assets/modules/forms/constructeur.dark.webp +0 -0
  101. package/dist/docs/assets/modules/forms/constructeur.light.webp +0 -0
  102. package/dist/docs/assets/modules/medias/mediatheque.dark.webp +0 -0
  103. package/dist/docs/assets/modules/medias/mediatheque.light.webp +0 -0
  104. package/dist/docs/assets/modules/pages/liste.dark.webp +0 -0
  105. package/dist/docs/assets/modules/pages/liste.light.webp +0 -0
  106. package/dist/docs/assets/modules/posts/liste.dark.webp +0 -0
  107. package/dist/docs/assets/modules/posts/liste.light.webp +0 -0
  108. package/dist/docs/assets/reference/liste-compacte.dark.webp +0 -0
  109. package/dist/docs/assets/reference/liste-compacte.light.webp +0 -0
  110. package/dist/features/admin/components/dashboard/DashboardGrid.client.js +34 -23
  111. package/dist/shared/lib/version.js +1 -1
  112. package/package.json +1 -1
  113. package/supported.json +1 -1
  114. package/dist/docs/06-modules/drive/installation.md +0 -69
  115. /package/dist/docs/06-modules/medias/{integration.md → 05-integration.md} +0 -0
@@ -4,18 +4,17 @@ description: Installer @fraza/module-medias, configurer le stockage objet, crée
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/configuration
8
- - 06-modules/medias/integration
7
+ - 06-modules/medias/02-configuration
8
+ - 06-modules/medias/05-integration
9
9
  ---
10
10
 
11
- Cette page couvre l'installation de `@fraza/module-medias` dans un projet déjà structuré par `@fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
12
-
13
- C'est le seul module officiel qui demande une étape de câblage manuelle dans le projet, parce qu'il sert du binaire.
11
+ Cette page installe `@fraza/module-medias` dans un projet créé par `npx @fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
14
12
 
15
13
  ## Prérequis
16
14
 
17
- - Un projet généré par `npx @fraza/start`, avec `@fraza/core` installé.
18
- - Un **stockage objet compatible S3** configuré. Sans lui, le module démarre mais aucun téléversement n'aboutit. Voir [Configuration](./configuration.md).
15
+ - Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
16
+ - Un **stockage objet compatible S3** configuré. Sans lui, le module démarre mais aucun téléversement n'aboutit. Voir [Configuration](./02-configuration.md).
17
+ - Aucun compte : le paquet est publié sur npmjs.
19
18
 
20
19
  ## Installer
21
20
 
@@ -23,35 +22,35 @@ C'est le seul module officiel qui demande une étape de câblage manuelle dans l
23
22
  npm i @fraza/module-medias
24
23
  ```
25
24
 
26
- `sharp` est une **peer dependency facultative** (`>=0.35.0`) : le core la charge au premier traitement d'image, et Next.js en installe déjà une copie. La déclarer en peer garantit qu'il n'y en a qu'une seule dans le projet, dans une version que le site contrôle. Sans `sharp`, le module démarre, mais refuse les images JPEG, PNG et WebP tant que l'optimisation retire leurs métadonnées, ce qu'elle fait par défaut. Sur un projet dont le verrou est ancien, `npm update sharp` suffit à remonter au seuil de `0.35.0`.
27
-
28
- Le module n'a plus aucune dépendance de production : `archiver` a été retiré, l'archive ZIP est écrite par le core.
29
-
30
- Ce choix est un exemple de la règle décrite dans [Créer un module](../../02-guides/creer-un-module.md) : tout ce que le site fournit déjà va en `peerDependencies`.
31
-
32
25
  Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
33
26
 
34
- ```bash
27
+ ```dotenv
35
28
  #------ MODULE - MEDIAS ------#
36
29
  FRAZA_MODULE_MEDIAS=true
37
30
  ```
38
31
 
39
32
  Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin, et le registre média du core reste vide.
40
33
 
41
- Puis régénérer les manifestes et créer les tables :
34
+ Régénérer les manifestes, puis créer les tables :
42
35
 
43
36
  ```bash
44
37
  npx fraza-modules sync # déclenché automatiquement au postinstall
45
38
  npx fraza-db init # crée fraza_media et fraza_media_references
46
39
  ```
47
40
 
48
- `fraza-db init` est idempotent. Sur une base qui possède déjà les tables, il applique les migrations en attente sans toucher aux données. Voir [Modèle de données](./modele-de-donnees.md).
41
+ `fraza-db init` est idempotent : sur une base qui a déjà les tables, il applique les migrations en attente sans toucher aux données. Il enregistre aussi les quatre permissions du module, et les attribue au rôle `admin`. Voir [Modèle de données](./06-modele-de-donnees.md).
49
42
 
50
- ## Monter la route de fichier
43
+ ## Installer `sharp`
51
44
 
52
- **C'est l'étape à ne pas oublier.** Sans elle, les médias sont téléversables mais aucune URL publique ne répond.
45
+ `sharp` est une **peer dependency facultative** (`>=0.35.0`) : le core la charge au premier traitement d'image, et Next.js en installe déjà une copie. La déclarer en peer garantit qu'il n'y en a qu'une seule dans le projet, dans une version que le site contrôle.
53
46
 
54
- Créer le fichier suivant dans le projet :
47
+ Sans `sharp`, le module démarre, mais refuse les images JPEG, PNG et WebP tant que l'optimisation retire leurs métadonnées, ce qu'elle fait par défaut. Sur un projet dont le verrou est ancien, `npm update sharp` suffit à remonter au seuil de `0.35.0`.
48
+
49
+ Ce choix suit la règle décrite dans [Créer un module](../../02-guides/creer-un-module.md) : tout ce que le site fournit déjà va en `peerDependencies`. Le module n'a aucune dépendance de production : l'archive ZIP est écrite par le core.
50
+
51
+ ## Monter la route de fichier
52
+
53
+ **C'est l'étape à ne pas oublier sur un projet monté à la main.** Sans elle, les médias sont téléversables mais aucune URL publique ne répond. Le start template officiel fournit déjà ce fichier.
55
54
 
56
55
  ```js
57
56
  // app/za/media/[filename]/route.js
@@ -62,7 +61,17 @@ L'import passe par le **core**, pas par le module. Le core y expose un relais qu
62
61
 
63
62
  Cette route doit rester un Route Handler et non une page : elle diffuse du binaire avec ses en-têtes de type, de cache et de disposition, ce qu'une page ne sait pas faire.
64
63
 
65
- Le start template officiel fournit déjà ce fichier.
64
+ C'est le seul module officiel qui demande un fichier de route dans le projet, parce qu'il sert du binaire.
65
+
66
+ ## Effet sur les autres modules
67
+
68
+ L'installation suffit à activer, dans tout le projet :
69
+
70
+ - le sélecteur d'image du BlockEditor, sur les blocs image et sur les champs `ImageField` des blocs personnalisés ;
71
+ - les champs de type `image`, `thumbnail` et `gallery` de `@fraza/module-posts`, quel que soit le nom que le projet leur donne dans sa variable de type ;
72
+ - le choix de l'image de partage Open Graph quand `FRAZA_SEO` est actif.
73
+
74
+ Aucun de ces modules ne déclare `@fraza/module-medias` en dépendance. Voir [Intégration](./05-integration.md).
66
75
 
67
76
  ## Vérifier
68
77
 
@@ -73,19 +82,7 @@ Le start template officiel fournit déjà ce fichier.
73
82
  2. `Médias` apparaît dans la barre latérale de l'admin.
74
83
  3. Téléverser une image depuis `/admin/media`, puis ouvrir l'URL publique proposée par la fiche du média.
75
84
 
76
- Si le téléversement échoue, la cause est presque toujours la configuration du stockage objet, pas le module. Voir [Configuration](./configuration.md).
77
-
78
- Les permissions du module sont enregistrées et attribuées au rôle `admin` pendant `fraza-db init`. Un module ajouté après coup n'a donc besoin que d'un `npx fraza-db init` pour que les quatre permissions apparaissent dans `/admin/roles`.
79
-
80
- ## Effet sur les autres modules
81
-
82
- L'installation suffit à activer, dans tout le projet :
83
-
84
- - le sélecteur d'image du BlockEditor, sur les blocs image et sur les champs `ImageField` des blocs personnalisés ;
85
- - les champs de type `image`, `thumbnail` et `gallery` de `@fraza/module-posts`, quel que soit le nom que le projet leur donne dans sa variable de type ;
86
- - le choix de l'image de partage Open Graph quand `FRAZA_SEO` est actif.
87
-
88
- Aucun de ces modules ne déclare `@fraza/module-medias` en dépendance. Voir [Intégration](./integration.md).
85
+ Si le téléversement échoue, la cause est presque toujours la configuration du stockage objet, pas le module. Voir [Configuration](./02-configuration.md).
89
86
 
90
87
  ## Mettre à jour
91
88
 
@@ -93,12 +90,12 @@ Aucun de ces modules ne déclare `@fraza/module-medias` en dépendance. Voir [In
93
90
  npx fraza-update
94
91
  ```
95
92
 
96
- La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois : tous les paquets Fraza à leur dernière version fonctionnent ensemble. Mettre à jour `@fraza/module-medias` seul, par `npm i`, laisserait le core et les autres modules en arrière.
93
+ La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois, puis enchaîne `fraza-modules sync`, `fraza-db migrate` et `fraza-doctor`. Tous les paquets Fraza à leur dernière version fonctionnent ensemble : mettre à jour `@fraza/module-medias` seul, par `npm i`, laisserait le core et les autres modules en arrière.
97
94
 
98
- Les notes de version sont livrées avec le package, dans `node_modules/@fraza/module-medias/CHANGELOG.md`.
95
+ Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza/module-medias/CHANGELOG.md`.
99
96
 
100
97
  ## Notes
101
98
 
102
99
  - Le module dépend de `@fraza/core` en `peerDependency`. Il n'embarque pas sa propre copie du core.
103
100
  - Désinstaller le module ne supprime ni les tables, ni les fichiers du stockage objet. `dropTables` est exporté depuis `@fraza/module-medias` pour la partie base.
104
- - Désactiver le module sans le désinstaller laisse les contenus référencer des médias devenus irrésolubles, et les références ne sont plus tenues à jour. Voir [Désactivé avec ses tables](./integration.md#désactivé-avec-ses-tables).
101
+ - Désactiver le module sans le désinstaller laisse les contenus référencer des médias devenus irrésolubles, et les références ne sont plus tenues à jour. Voir [Désactivé avec ses tables](./05-integration.md#désactivé-avec-ses-tables).
@@ -4,7 +4,7 @@ description: Variables d'environnement, stockage objet, optimisation des images,
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/televersement
7
+ - 06-modules/medias/03-televersement
8
8
  - 03-reference/01-cores/storage
9
9
  ---
10
10
 
@@ -24,7 +24,7 @@ Les trois dernières sont sans effet si `FRAZA_MODULE_MEDIAS_OPTIMIZE` vaut `fal
24
24
 
25
25
  L'activation se compare strictement à la chaîne `true`. Les drapeaux d'optimisation fonctionnent en sens inverse : ils sont actifs sauf si la valeur vaut exactement `false`. Une valeur mal orthographiée laisse donc l'optimisation active.
26
26
 
27
- Voir [Téléversement](./televersement.md) pour l'effet précis de ces réglages sur un fichier.
27
+ Voir [Téléversement](./03-televersement.md) pour l'effet précis de ces réglages sur un fichier.
28
28
 
29
29
  ## Stockage objet
30
30
 
@@ -78,11 +78,11 @@ Le module enregistre une section `Médias` et un item `Médias` à l'intérieur.
78
78
 
79
79
  L'ordre 25 de la section place la médiathèque avant les modules de contenu, qui commencent à 60. Voir [Étendre l'admin](../../02-guides/etendre-l-admin.md).
80
80
 
81
- Ce que l'écran permet de faire est décrit dans [Administration](./admin.md).
81
+ Ce que l'écran permet de faire est décrit dans [Administration](./04-admin.md).
82
82
 
83
83
  ## Notes
84
84
 
85
85
  - Aucune variable du module ne contient de secret. Les secrets du stockage sont ceux du core, lisibles côté serveur uniquement.
86
86
  - La configuration d'optimisation est relue à chaque téléversement, pas mise en cache au boot. La changer ne demande pas de redémarrage, mais ne réoptimise évidemment pas les fichiers déjà en place.
87
- - Changer `FRAZA_MODULE_MEDIAS` à `false` désactive le module mais laisse les tables et les fichiers en place, sans plus tenir les références à jour. Voir [Intégration](./integration.md#désactivé-avec-ses-tables).
88
- - `sharp` est requis pour optimiser une image. Voir [Installation](./installation.md#installer).
87
+ - Changer `FRAZA_MODULE_MEDIAS` à `false` désactive le module mais laisse les tables et les fichiers en place, sans plus tenir les références à jour. Voir [Intégration](./05-integration.md#désactivé-avec-ses-tables).
88
+ - `sharp` est requis pour optimiser une image. Voir [Installation](./01-installation.md#installer).
@@ -4,7 +4,7 @@ description: Formats acceptés, limites de taille, validation de contenu, optimi
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/integration
7
+ - 06-modules/medias/05-integration
8
8
  - 03-reference/01-cores/storage
9
9
  ---
10
10
 
@@ -61,7 +61,7 @@ Chaque média porte deux identifiants de fichier, qui ne servent pas à la même
61
61
 
62
62
  La clé de stockage est fixée à la création et n'est jamais réécrite, pas même lors d'un remplacement de fichier. Le nom public, lui, se change librement.
63
63
 
64
- C'est cette séparation qui permet de renommer un média sans casser quoi que ce soit : les contenus référencent l'**identifiant** du média, jamais son nom ni son URL. Voir [Intégration](./integration.md).
64
+ C'est cette séparation qui permet de renommer un média sans casser quoi que ce soit : les contenus référencent l'**identifiant** du média, jamais son nom ni son URL. Voir [Intégration](./05-integration.md).
65
65
 
66
66
  ### Assainissement du nom public
67
67
 
@@ -96,7 +96,7 @@ Une revalidation dont l'`ETag` correspond reçoit un 304 sans corps, sans lectur
96
96
 
97
97
  Un fichier non image est donc **téléchargé** plutôt qu'affiché, y compris un PDF. C'est une mesure de défense : un document affiché dans le contexte du site pourrait exécuter du script sur son origine.
98
98
 
99
- La route n'exige ni session ni permission. Voir [Configuration](./configuration.md).
99
+ La route n'exige ni session ni permission. Voir [Configuration](./02-configuration.md).
100
100
 
101
101
  ## Remplacer un fichier
102
102
 
@@ -112,4 +112,4 @@ Comme l'URL publique ne change pas, un navigateur ou un CDN peut continuer à se
112
112
  - L'auteur d'un média est facultatif. Un dépôt machine, par une tâche planifiée ou un import, laisse le champ nul et la médiathèque n'affiche alors aucun auteur. Seul un identifiant d'utilisateur réel est accepté par ailleurs, la colonne portant une clé étrangère vers la table des utilisateurs.
113
113
  - La médiathèque permet de télécharger jusqu'à cent médias d'un coup, dans une archive sans recompression, écrite par `createZipStream` du core, un objet à la fois. Un objet absent du stockage est sauté. Un stockage qui ne répond pas interrompt le téléchargement. L'archive porte la date du jour dans le fuseau du site.
114
114
  - La taille enregistrée est celle des octets stockés, après optimisation. Le paramètre `size` d'`uploadMedia` et de `replaceMedia` est ignoré.
115
- - Un média encore référencé par un contenu ne peut pas être supprimé. Le détacher d'abord. Voir [Intégration](./integration.md).
115
+ - Un média encore référencé par un contenu ne peut pas être supprimé. Le détacher d'abord. Voir [Intégration](./05-integration.md).
@@ -4,15 +4,15 @@ description: Médiathèque, filtres, téléversement, sélection multiple, actio
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/televersement
8
- - 06-modules/medias/integration
7
+ - 06-modules/medias/03-televersement
8
+ - 06-modules/medias/05-integration
9
9
  ---
10
10
 
11
11
  Le module ajoute un seul écran à l'admin, `/admin/media`. Tout s'y fait : téléverser,
12
12
  chercher, renommer, remplacer, supprimer, récupérer les URL publiques. Cette page décrit
13
13
  ce que fait l'interface, y compris les quelques comportements qui surprennent.
14
14
 
15
- L'accès demande `media.view` : sans elle, `/admin/media` répond 404, comme une page inconnue. Voir [Configuration](./configuration.md).
15
+ L'accès demande `media.view` : sans elle, `/admin/media` répond 404, comme une page inconnue. Voir [Configuration](./02-configuration.md).
16
16
 
17
17
  ## Ce que chaque permission débloque
18
18
 
@@ -58,7 +58,7 @@ Le bouton accepte plusieurs fichiers d'un coup, mais les envoie **un par un**. U
58
58
  refusé, pour un format ou une taille hors limites, produit son propre message et
59
59
  n'interrompt pas les suivants. Le sélecteur de fichier ne propose que les extensions
60
60
  acceptées, et celui du remplacement que celles de la catégorie du média. Voir
61
- [Téléversement](./televersement.md) pour ce qui est accepté.
61
+ [Téléversement](./03-televersement.md) pour ce qui est accepté.
62
62
 
63
63
  À la fin du lot, la vue revient en première page, là où les nouveaux médias apparaissent.
64
64
  La confirmation compte les fichiers qui ont abouti.
@@ -94,7 +94,7 @@ propose de découper la sélection : la réduire est manuel.
94
94
  suppressions réussies disparaissent de la grille ; celles qui échouent restent
95
95
  sélectionnées, ce qui permet de recommencer sans tout re-pointer. Un média encore
96
96
  référencé par un contenu compte parmi les échecs. Voir
97
- [Intégration](./integration.md).
97
+ [Intégration](./05-integration.md).
98
98
 
99
99
  ## Fiche d'un média
100
100
 
@@ -114,7 +114,7 @@ Renommer vers un nom déjà pris fait échouer l'enregistrement complet : le tex
114
114
  alternatif et la légende saisis en même temps ne sont pas écrits non plus. Corriger le
115
115
  nom, puis enregistrer à nouveau. Le message « Ce nom de fichier est déjà utilisé »
116
116
  apparaît en notification plutôt que sous le champ, pour la raison expliquée dans
117
- [API](./api.md).
117
+ [API](./07-api.md).
118
118
 
119
119
  Un fichier qui n'est pas une image n'a pas d'aperçu. Un lien `Ouvrir le fichier` le sert
120
120
  à la place, ce qui déclenche un téléchargement pour tout ce qui n'est pas une image.
@@ -144,4 +144,4 @@ contenu d'abord.
144
144
  réglables.
145
145
  - L'interface ne montre pas qui a téléversé un média, ni la liste des contenus qui le
146
146
  référencent. Ces deux informations existent en base et sont lisibles par
147
- [l'API](./api.md).
147
+ [l'API](./07-api.md).
@@ -4,7 +4,7 @@ description: Tables fraza_media et fraza_media_references, migrations, cycle de
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/integration
7
+ - 06-modules/medias/05-integration
8
8
  - 03-reference/01-cores/database
9
9
  ---
10
10
 
@@ -36,13 +36,13 @@ La suppression d'un compte utilisateur vide `uploaded_by` mais ne touche pas au
36
36
 
37
37
  ### Pourquoi deux noms
38
38
 
39
- `filename` et `storage_key` sont indépendants. Renommer un média réécrit le premier et laisse le second intact, ce qui n'invalide aucune référence puisque les contenus référencent `id`. Voir [Téléversement](./televersement.md).
39
+ `filename` et `storage_key` sont indépendants. Renommer un média réécrit le premier et laisse le second intact, ce qui n'invalide aucune référence puisque les contenus référencent `id`. Voir [Téléversement](./03-televersement.md).
40
40
 
41
41
  ### `alt_text` et `caption` sont la source de vérité
42
42
 
43
43
  Ces deux colonnes ne sont pas des valeurs par défaut : ce sont les valeurs. Les blocs image du BlockEditor ne conservent pas de copie locale, ils relisent la fiche du média à chaque rendu.
44
44
 
45
- Corriger un texte alternatif dans la médiathèque le corrige donc partout où l'image est utilisée, sans toucher aux contenus. C'est la contrepartie de la normalisation stricte décrite dans [Intégration](./integration.md).
45
+ Corriger un texte alternatif dans la médiathèque le corrige donc partout où l'image est utilisée, sans toucher aux contenus. C'est la contrepartie de la normalisation stricte décrite dans [Intégration](./05-integration.md).
46
46
 
47
47
  ## `fraza_media_references`
48
48
 
@@ -85,7 +85,7 @@ Les migrations sont numérotées dans `src/migrations.js` et appliquées une foi
85
85
 
86
86
  | Migration | Effet |
87
87
  |---|---|
88
- | `001-drop-media-visibility` | Retire la colonne `visibility` et son index, ancien correctif rejoué à chaque `init`. **Tous les médias sont publics**, et la route de fichier ne vérifie ni session ni permission. Voir [Configuration](./configuration.md). |
88
+ | `001-drop-media-visibility` | Retire la colonne `visibility` et son index, ancien correctif rejoué à chaque `init`. **Tous les médias sont publics**, et la route de fichier ne vérifie ni session ni permission. Voir [Configuration](./02-configuration.md). |
89
89
  | `002-office-mime-types` | Donne leur type MIME aux `.doc`, `.docx`, `.xls`, `.xlsx`, `.ppt` et `.pptx` enregistrés en `application/octet-stream`, d'après l'extension de leur clé de stockage. |
90
90
 
91
91
  ## Cycle de vie d'un fichier
@@ -4,7 +4,7 @@ description: Routes HTTP d'admin de la médiathèque, route publique de service
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/integration
7
+ - 06-modules/medias/05-integration
8
8
  - 03-reference/03-registres/media-registry
9
9
  ---
10
10
 
@@ -28,7 +28,7 @@ import { getMediaById, buildMediaUrl, attachMedia } from '@fraza/core/media-regi
28
28
 
29
29
  ## API
30
30
 
31
- Les fonctions utilisables depuis du code sont documentées dans [Registre média](../../03-reference/03-registres/media-registry.md), et leur usage dans [Intégration](./integration.md).
31
+ Les fonctions utilisables depuis du code sont documentées dans [Registre média](../../03-reference/03-registres/media-registry.md), et leur usage dans [Intégration](./05-integration.md).
32
32
 
33
33
  | Façade | Rôle |
34
34
  |---|---|
@@ -65,11 +65,11 @@ Un refus répond l'erreur d'API du core, `{ error, code, message }`, voir [API](
65
65
 
66
66
  `kind=other` garde les types MIME que la table des types ne connaît pas.
67
67
 
68
- `POST /media` attend un champ `file`, plus éventuellement `altText` et `caption`. Voir [Téléversement](./televersement.md) pour les formats et les limites. Le corps de `POST /media` et de `POST /media/:id/replace` est plafonné à 101 Mio, la limite d'une vidéo plus 1 Mio d'enveloppe : au-delà, le routeur du core répond 413 sans lire le corps.
68
+ `POST /media` attend un champ `file`, plus éventuellement `altText` et `caption`. Voir [Téléversement](./03-televersement.md) pour les formats et les limites. Le corps de `POST /media` et de `POST /media/:id/replace` est plafonné à 101 Mio, la limite d'une vidéo plus 1 Mio d'enveloppe : au-delà, le routeur du core répond 413 sans lire le corps.
69
69
 
70
70
  `POST /media/bulk-download` attend `{ ids }`, **cent au plus**, et renvoie une archive assemblée à la volée, sans recompression. Les objets absents du stockage sont sautés sans faire échouer l'archive.
71
71
 
72
- `DELETE /media/:id` échoue en `409`, code `in_use`, si le média est encore référencé, avec le nombre de contenus concernés dans le message. Détacher d'abord. Voir [Intégration](./integration.md). Le refus vaut aussi pour une référence écrite pendant la suppression par une transaction encore ouverte : la clé étrangère le garantit, et la réponse est la même.
72
+ `DELETE /media/:id` échoue en `409`, code `in_use`, si le média est encore référencé, avec le nombre de contenus concernés dans le message. Détacher d'abord. Voir [Intégration](./05-integration.md). Le refus vaut aussi pour une référence écrite pendant la suppression par une transaction encore ouverte : la clé étrangère le garantit, et la réponse est la même.
73
73
 
74
74
  ### Publique
75
75
 
@@ -77,11 +77,11 @@ Un refus répond l'erreur d'API du core, `{ error, code, message }`, voir [API](
77
77
  |---|---|---|
78
78
  | `GET` | `/za/media/:filename` | aucune |
79
79
 
80
- Ce n'est **pas** une route du routeur d'API : c'est un Route Handler Next.js monté par le projet, hors du préfixe `/za/api`. Voir [Installation](./installation.md).
80
+ Ce n'est **pas** une route du routeur d'API : c'est un Route Handler Next.js monté par le projet, hors du préfixe `/za/api`. Voir [Installation](./01-installation.md).
81
81
 
82
82
  Elle retrouve la fiche par son nom public, lit l'objet au stockage et diffuse le flux. Elle répond `404` « Fichier introuvable. » si le nom est inconnu ou si le stockage répond 404, `400` « Nom de fichier invalide. » si le nom est illisible, `500` si le stockage ne répond pas, avec le message générique du core. Ces trois réponses sont du texte brut. Ces réponses portent `Cache-Control: no-store` : aucun cache ne les garde. Sans le module, le relais du core répond le même 404, `no-store` compris.
83
83
 
84
- Les en-têtes appliqués sont détaillés dans [Téléversement](./televersement.md). Le point à retenir : seuls JPEG, PNG, GIF et WebP sont servis en affichage direct, tout le reste est forcé en téléchargement.
84
+ Les en-têtes appliqués sont détaillés dans [Téléversement](./03-televersement.md). Le point à retenir : seuls JPEG, PNG, GIF et WebP sont servis en affichage direct, tout le reste est forcé en téléchargement.
85
85
 
86
86
  ## Notes
87
87
 
@@ -4,28 +4,40 @@ description: Médiathèque partagée, téléversement vers un stockage objet, op
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/installation
8
- - 06-modules/medias/admin
9
- - 06-modules/medias/integration
7
+ - 06-modules/medias/01-installation
8
+ - 06-modules/medias/04-admin
9
+ - 06-modules/medias/05-integration
10
10
  ---
11
11
 
12
12
  `@fraza/module-medias` ajoute une médiathèque à l'admin et remplit le [registre média](../../03-reference/03-registres/media-registry.md) du core. Les autres modules l'utilisent sans jamais le déclarer en dépendance : ils appellent les façades du core, qui deviennent actives dès que ce module est installé.
13
13
 
14
+ ```bash
15
+ npm i @fraza/module-medias
16
+ ```
17
+
18
+ | Paquet | `@fraza/module-medias` |
19
+ |---|---|
20
+ | Licence | MIT, Fraza Libre. |
21
+ | Registre | npmjs, sans compte ni configuration. |
22
+ | Activation | `FRAZA_MODULE_MEDIAS=true` |
23
+
24
+ L'activation, la création des tables et la route de fichier sont dans [Installation](./01-installation.md).
25
+
14
26
  ![La médiathèque, sa grille de vignettes, sa recherche et son filtre par type](../../assets/modules/medias/mediatheque.light.webp)
15
27
 
16
- La grille est le point d'entrée humain de la bibliothèque : recherche par nom de fichier, filtre par type, téléversement. C'est le même fonds que vient chercher un bloc image ou un champ média d'un autre module, par le registre plutôt que par un import. Voir [Intégration](./integration.md).
28
+ La grille est le point d'entrée humain de la bibliothèque : recherche par nom de fichier, filtre par type, téléversement. C'est le même fonds que vient chercher un bloc image ou un champ média d'un autre module, par le registre plutôt que par un import. Voir [Intégration](./05-integration.md).
17
29
 
18
30
  ## Pages de cette section
19
31
 
20
32
  | Page | Contenu |
21
33
  |---|---|
22
- | [Installation](./installation.md) | Installer le module, créer les tables, monter la route de fichier. |
23
- | [Configuration](./configuration.md) | Variables d'environnement, stockage objet, permissions, entrée d'admin. |
24
- | [Téléversement](./televersement.md) | Formats acceptés, limites, validation, optimisation, nommage. |
25
- | [Administration](./admin.md) | La médiathèque : filtres, sélection multiple, actions groupées, fiche d'un média. |
26
- | [Intégration](./integration.md) | Référencer un média depuis un autre module ou un bloc. |
27
- | [Modèle de données](./modele-de-donnees.md) | Tables `fraza_media` et `fraza_media_references`. |
28
- | [API](./api.md) | Routes HTTP d'admin et route publique de fichier. |
34
+ | [Installation](./01-installation.md) | Installer le module, créer les tables, monter la route de fichier. |
35
+ | [Configuration](./02-configuration.md) | Variables d'environnement, stockage objet, permissions, entrée d'admin. |
36
+ | [Téléversement](./03-televersement.md) | Formats acceptés, limites, validation, optimisation, nommage. |
37
+ | [Administration](./04-admin.md) | La médiathèque : filtres, sélection multiple, actions groupées, fiche d'un média. |
38
+ | [Intégration](./05-integration.md) | Référencer un média depuis un autre module ou un bloc. |
39
+ | [Modèle de données](./06-modele-de-donnees.md) | Tables `fraza_media` et `fraza_media_references`. |
40
+ | [API](./07-api.md) | Routes HTTP d'admin et route publique de fichier. |
29
41
 
30
42
  ## Ce que le module apporte
31
43
 
@@ -44,7 +56,7 @@ C'est le seul module officiel dont la valeur principale n'est pas sa propre inte
44
56
 
45
57
  Sans ce module, ces façades sont des fonctions neutres : les lectures renvoient vide, les écritures renvoient un échec explicite, le sélecteur d'image se masque. Aucun code appelant n'a donc à se conditionner.
46
58
 
47
- C'est ce contrat qui est documenté dans [Intégration](./integration.md).
59
+ C'est ce contrat qui est documenté dans [Intégration](./05-integration.md).
48
60
 
49
61
  ## Où vivent les fichiers
50
62
 
@@ -55,7 +67,7 @@ Deux noms coexistent donc pour chaque fichier :
55
67
  - une **clé de stockage** privée, jamais exposée, de la forme `media/<année>/<mois>/<nom unique>` ;
56
68
  - un **nom public** assaini, utilisé dans l'URL `/za/media/<nom>`.
57
69
 
58
- Renommer un média change le second sans toucher au premier, ce qui n'invalide aucune référence. Voir [Téléversement](./televersement.md).
70
+ Renommer un média change le second sans toucher au premier, ce qui n'invalide aucune référence. Voir [Téléversement](./03-televersement.md).
59
71
 
60
72
  ## Notes
61
73
 
@@ -1,19 +1,19 @@
1
1
  ---
2
2
  title: Installation
3
- description: Installer @fraza/module-pages, créer la table, activer le module et brancher le rendu public à la racine du site.
3
+ description: Installer @fraza/module-pages, créer la table, brancher le rendu public et fournir le template par défaut.
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/configuration
8
- - 06-modules/pages/templates
7
+ - 06-modules/pages/02-configuration
8
+ - 06-modules/pages/05-templates
9
9
  ---
10
10
 
11
- Cette page couvre l'installation de `@fraza/module-pages` dans un projet déjà structuré par `@fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
11
+ Cette page installe `@fraza/module-pages` dans un projet créé par `npx @fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
12
12
 
13
13
  ## Prérequis
14
14
 
15
- - Un projet généré par `npx @fraza/start`, avec `@fraza/core` installé.
16
- - Aucune configuration ni connexion : le module est gratuit et publié sur npmjs.
15
+ - Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
16
+ - Aucun compte : le paquet est publié sur npmjs.
17
17
 
18
18
  ## Installer
19
19
 
@@ -23,21 +23,21 @@ npm i @fraza/module-pages
23
23
 
24
24
  Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
25
25
 
26
- ```bash
26
+ ```dotenv
27
27
  #------ MODULE - PAGES ------#
28
28
  FRAZA_MODULE_PAGES=true
29
29
  ```
30
30
 
31
- Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. Le détail des variables est dans [Configuration](./configuration.md).
31
+ Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. Le détail des variables est dans [Configuration](./02-configuration.md).
32
32
 
33
- Régénérer les manifestes puis créer la table :
33
+ Régénérer les manifestes, puis créer la table :
34
34
 
35
35
  ```bash
36
36
  npx fraza-modules sync # déclenché automatiquement au postinstall
37
37
  npx fraza-db init # crée fraza_pages_page
38
38
  ```
39
39
 
40
- `fraza-db init` est idempotent. Sur une base qui possède déjà la table, il applique les migrations de schéma en attente sans toucher aux données. Voir [Modèle de données](./modele-de-donnees.md).
40
+ `fraza-db init` est idempotent : sur une base qui a déjà la table, il applique les migrations en attente sans toucher aux données. Il enregistre aussi les permissions `pages.view` et `pages.manage`, et les attribue au rôle `admin`. Voir [Modèle de données](./04-modele-de-donnees.md).
41
41
 
42
42
  ## Brancher le rendu public
43
43
 
@@ -53,7 +53,7 @@ Le catch-all ne couvre pas la racine `/`. L'accueil du site reste `app/(public)/
53
53
 
54
54
  ### Projet sans catch-all dynamique
55
55
 
56
- Si le projet n'utilise pas le registre de résolveurs, la vue publique se re-exporte directement :
56
+ Si le projet n'utilise pas le registre de résolveurs, la vue publique se réexporte directement :
57
57
 
58
58
  ```js
59
59
  // app/(public)/[...slug]/page.js
@@ -68,7 +68,7 @@ Le module n'embarque aucun template. Il résout `page.template`, et retombe sur
68
68
 
69
69
  Le template `default` est fourni par le projet hôte dans `components/fraza/templates/default.js`, et enregistré au boot par le manifeste que génère `fraza-modules sync`. Le start template en fournit un. Sans aucun template enregistré, le module rend les blocs bruts via `BlockListRenderer` du core, sans mise en page.
70
70
 
71
- Voir [Templates](./templates.md) pour en écrire un.
71
+ Voir [Templates](./05-templates.md) pour en écrire un.
72
72
 
73
73
  ## Vérifier
74
74
 
@@ -79,20 +79,18 @@ Voir [Templates](./templates.md) pour en écrire un.
79
79
  2. `Pages` apparaît dans la barre latérale de l'admin.
80
80
  3. Créer une page depuis `/admin/pages`, la laisser en visibilité publique, puis l'ouvrir à `/<slug>`.
81
81
 
82
- Les permissions du module sont enregistrées et attribuées au rôle `admin` pendant `fraza-db init`. Un module ajouté après coup n'a donc besoin que d'un `npx fraza-db init` pour que `pages.view` et `pages.manage` apparaissent dans `/admin/roles`.
83
-
84
82
  ## Mettre à jour
85
83
 
86
84
  ```bash
87
85
  npx fraza-update
88
86
  ```
89
87
 
90
- La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois : tous les paquets Fraza à leur dernière version fonctionnent ensemble. Mettre à jour `@fraza/module-pages` seul, par `npm i`, laisserait le core et les autres modules en arrière.
88
+ La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois, puis enchaîne `fraza-modules sync`, `fraza-db migrate` et `fraza-doctor`. Tous les paquets Fraza à leur dernière version fonctionnent ensemble : mettre à jour `@fraza/module-pages` seul, par `npm i`, laisserait le core et les autres modules en arrière.
91
89
 
92
- Les notes de version sont livrées avec le package, dans `node_modules/@fraza/module-pages/CHANGELOG.md`.
90
+ Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza/module-pages/CHANGELOG.md`.
93
91
 
94
92
  ## Notes
95
93
 
96
94
  - Le module dépend de `@fraza/core` en `peerDependency`. Il n'embarque pas sa propre copie du core.
97
- - Les blocs image utilisent le registre de médias du core. Si `@fraza/module-medias` est installé, le sélecteur d'image et l'image de partage Open Graph deviennent disponibles dans l'éditeur. Le module le déclare comme module optionnel, dans `manifest.optionalModules` : `npx fraza-doctor` le rappelle par une information tant qu'il manque. Voir [Dépendances souples](../../03-reference/01-cores/modules.md#dépendances-souples).
98
95
  - Désinstaller le module ne supprime pas la table. `dropTables` est exporté depuis `@fraza/module-pages` pour le faire explicitement.
96
+ - Les blocs image utilisent le registre de médias du core. Si `@fraza/module-medias` est installé, le sélecteur d'image et l'image de partage Open Graph deviennent disponibles dans l'éditeur. Le module le déclare comme module optionnel, dans `manifest.optionalModules` : `npx fraza-doctor` le rappelle par une information tant qu'il manque. Voir [Dépendances souples](../../03-reference/01-cores/modules.md#dépendances-souples).
@@ -4,7 +4,7 @@ description: Variables d'environnement, permissions et intégration à l'admin d
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/modele-de-donnees
7
+ - 06-modules/pages/04-modele-de-donnees
8
8
  - 03-reference/06-configuration/variables-d-environnement
9
9
  ---
10
10
 
@@ -4,8 +4,8 @@ description: Liste arborescente, formulaire d'édition, sélecteur de parent, da
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/modele-de-donnees
8
- - 06-modules/pages/templates
7
+ - 06-modules/pages/04-modele-de-donnees
8
+ - 06-modules/pages/05-templates
9
9
  ---
10
10
 
11
11
  Le module ajoute une section `Pages` à la barre latérale de l'admin. Tout le contenu d'une page s'y édite : titre, slug, blocs, template, parent, visibilité et SEO. Cette page décrit ce que fait l'interface, y compris les quelques comportements qui surprennent.
@@ -18,7 +18,7 @@ Le module ajoute une section `Pages` à la barre latérale de l'admin. Tout le c
18
18
  | `/admin/pages/new` | Création. |
19
19
  | `/admin/pages/edit/<id>` | Édition. |
20
20
 
21
- L'accès à la section demande `pages.view` : sans elle, `/admin/pages` répond 404, comme une page inconnue. Créer, modifier, dupliquer et supprimer demandent `pages.manage`. Voir [Configuration](./configuration.md).
21
+ L'accès à la section demande `pages.view` : sans elle, `/admin/pages` répond 404, comme une page inconnue. Créer, modifier, dupliquer et supprimer demandent `pages.manage`. Voir [Configuration](./02-configuration.md).
22
22
 
23
23
  ## Liste
24
24
 
@@ -47,7 +47,7 @@ La duplication reprend les blocs, le SEO, le template et la visibilité de l'ori
47
47
 
48
48
  ### Colonne SEO
49
49
 
50
- Quand `FRAZA_SEO` est actif, une colonne affiche le score SEO de chaque page. Le drapeau inactif, la colonne n'existe pas. Voir [Configuration](./configuration.md).
50
+ Quand `FRAZA_SEO` est actif, une colonne affiche le score SEO de chaque page. Le drapeau inactif, la colonne n'existe pas. Voir [Configuration](./02-configuration.md).
51
51
 
52
52
  ## Formulaire
53
53
 
@@ -57,7 +57,7 @@ L'en-tête de l'édition montre l'adresse complète de la page, et le bouton `Vo
57
57
 
58
58
  ### Slug et aperçu d'URL
59
59
 
60
- Sous le champ slug, l'URL publique complète est recalculée à chaque frappe, en préfixant le chemin du parent sélectionné. Le slug saisi est normalisé à l'enregistrement, et suffixé s'il entre en collision avec celui d'une page de même parent. Les règles complètes sont dans [Modèle de données](./modele-de-donnees.md).
60
+ Sous le champ slug, l'URL publique complète est recalculée à chaque frappe, en préfixant le chemin du parent sélectionné. Le slug saisi est normalisé à l'enregistrement, et suffixé s'il entre en collision avec celui d'une page de même parent. Les règles complètes sont dans [Modèle de données](./04-modele-de-donnees.md).
61
61
 
62
62
  ### Contenu
63
63
 
@@ -79,7 +79,7 @@ Les dates s'affichent en français (`fr-CA`), dans le fuseau du navigateur. « C
79
79
 
80
80
  ### Template
81
81
 
82
- Le sélecteur liste les templates de `kind: 'page'` enregistrés dans le projet. Voir [Templates](./templates.md).
82
+ Le sélecteur liste les templates de `kind: 'page'` enregistrés dans le projet. Voir [Templates](./05-templates.md).
83
83
 
84
84
  Si la page porte un template qui n'existe plus, le sélecteur se réaligne sur le premier template disponible, et l'enregistrement suivant écrit cette valeur. Le rendu public, lui, ne réécrit rien : il retombe sur `default` tant que le champ n'a pas été enregistré.
85
85
 
@@ -4,8 +4,8 @@ description: Table fraza_pages_page, hiérarchie par parent_id, règles de slug,
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/api
8
- - 06-modules/pages/templates
7
+ - 06-modules/pages/06-api
8
+ - 06-modules/pages/05-templates
9
9
  ---
10
10
 
11
11
  Le module crée une seule table, `fraza_pages_page`. Comprendre sa forme est nécessaire pour écrire un template, appeler l'API ou diagnostiquer une URL qui ne résout pas.
@@ -109,7 +109,7 @@ Au rendu, le module cherche le template dont l'identifiant vaut `page.template`.
109
109
 
110
110
  Un template supprimé du projet ne casse donc pas les pages qui l'utilisaient : elles retombent sur `default` jusqu'à ce que leur champ soit changé.
111
111
 
112
- L'éditeur, lui, ne se comporte pas pareil. Face à un template inconnu, son sélecteur se réaligne sur le premier template de la liste, et l'enregistrement suivant écrit cette valeur en base. Renommer l'identifiant d'un template déjà utilisé demande donc de repasser sur les pages concernées, sous peine de les voir migrer une à une vers un template arbitraire. Voir [Administration](./admin.md).
112
+ L'éditeur, lui, ne se comporte pas pareil. Face à un template inconnu, son sélecteur se réaligne sur le premier template de la liste, et l'enregistrement suivant écrit cette valeur en base. Renommer l'identifiant d'un template déjà utilisé demande donc de repasser sur les pages concernées, sous peine de les voir migrer une à une vers un template arbitraire. Voir [Administration](./03-admin.md).
113
113
 
114
114
  ## Notes
115
115
 
@@ -4,7 +4,7 @@ description: Routes HTTP d'admin et publiques, et fonctions serveur importables
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/modele-de-donnees
7
+ - 06-modules/pages/04-modele-de-donnees
8
8
  - 03-reference/01-cores/api
9
9
  ---
10
10
 
@@ -24,7 +24,7 @@ Le module expose ses pages de deux façons : des routes HTTP pour le navigateur,
24
24
  import { listPublicChildPages, getPublishedPageBySegments } from '@fraza/module-pages/public';
25
25
  ```
26
26
 
27
- `@fraza/module-pages/public` exporte aussi `default` et `generateMetadata`, destinés au re-export dans un catch-all. Voir [Installation](./installation.md).
27
+ `@fraza/module-pages/public` exporte aussi `default` et `generateMetadata`, destinés au re-export dans un catch-all. Voir [Installation](./01-installation.md).
28
28
 
29
29
  ## API
30
30