@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.
- package/CHANGELOG.md +32 -0
- package/THIRD-PARTY-NOTICES.md +2 -2
- package/changelog.json +86 -0
- package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
- package/dist/docs/01-demarrage/01-installation.md +9 -15
- package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
- package/dist/docs/01-demarrage/03-configuration.md +1 -1
- package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
- package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
- package/dist/docs/02-guides/blocs-personnalises.md +1 -1
- package/dist/docs/02-guides/etendre-l-admin.md +2 -2
- package/dist/docs/02-guides/gerer-les-medias.md +1 -1
- package/dist/docs/02-guides/index.md +1 -1
- package/dist/docs/02-guides/seo-et-metadonnees.md +1 -1
- package/dist/docs/03-reference/01-cores/templates.md +3 -3
- package/dist/docs/03-reference/02-features/admin.md +13 -2
- package/dist/docs/03-reference/03-registres/media-registry.md +4 -4
- package/dist/docs/03-reference/04-partage/composants.md +2 -0
- package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
- package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
- package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
- package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
- package/dist/docs/04-architecture/05-securite.md +1 -1
- package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
- package/dist/docs/05-contribution/03-redaction.md +10 -0
- package/dist/docs/05-contribution/05-publication.md +0 -1
- package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
- package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
- package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
- package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
- package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
- package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
- package/dist/docs/06-modules/booking/index.md +22 -12
- package/dist/docs/06-modules/drive/01-installation.md +92 -0
- package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
- package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
- package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
- package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
- package/dist/docs/06-modules/drive/index.md +23 -13
- package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
- package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
- package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
- package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
- package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
- package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
- package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
- package/dist/docs/06-modules/facturation/index.md +26 -16
- package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
- package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +6 -6
- package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
- package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
- package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
- package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
- package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
- package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
- package/dist/docs/06-modules/forms/index.md +26 -14
- package/dist/docs/06-modules/index.md +2 -2
- package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
- package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
- package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
- package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
- package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
- package/dist/docs/06-modules/medias/index.md +25 -13
- package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
- package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
- package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
- package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
- package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
- package/dist/docs/06-modules/pages/index.md +21 -9
- package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
- package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
- package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
- package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
- package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
- package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
- package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
- package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
- package/dist/docs/06-modules/posts/index.md +25 -13
- package/dist/docs/assets/decouverte/tableau-de-bord.dark.webp +0 -0
- package/dist/docs/assets/decouverte/tableau-de-bord.light.webp +0 -0
- package/dist/docs/assets/demarrage/connexion.dark.webp +0 -0
- package/dist/docs/assets/demarrage/connexion.light.webp +0 -0
- package/dist/docs/assets/demarrage/roles.dark.webp +0 -0
- package/dist/docs/assets/demarrage/roles.light.webp +0 -0
- package/dist/docs/assets/demarrage/tableau-de-bord-neuf.dark.webp +0 -0
- package/dist/docs/assets/demarrage/tableau-de-bord-neuf.light.webp +0 -0
- package/dist/docs/assets/modules/booking/agenda.dark.webp +0 -0
- package/dist/docs/assets/modules/booking/agenda.light.webp +0 -0
- package/dist/docs/assets/modules/drive/navigateur.dark.webp +0 -0
- package/dist/docs/assets/modules/drive/navigateur.light.webp +0 -0
- package/dist/docs/assets/modules/facturation/factures.dark.webp +0 -0
- package/dist/docs/assets/modules/facturation/factures.light.webp +0 -0
- package/dist/docs/assets/modules/forms/constructeur.dark.webp +0 -0
- package/dist/docs/assets/modules/forms/constructeur.light.webp +0 -0
- package/dist/docs/assets/modules/medias/mediatheque.dark.webp +0 -0
- package/dist/docs/assets/modules/medias/mediatheque.light.webp +0 -0
- package/dist/docs/assets/modules/pages/liste.dark.webp +0 -0
- package/dist/docs/assets/modules/pages/liste.light.webp +0 -0
- package/dist/docs/assets/modules/posts/liste.dark.webp +0 -0
- package/dist/docs/assets/modules/posts/liste.light.webp +0 -0
- package/dist/docs/assets/reference/liste-compacte.dark.webp +0 -0
- package/dist/docs/assets/reference/liste-compacte.light.webp +0 -0
- package/dist/features/admin/components/dashboard/DashboardGrid.client.js +34 -23
- package/dist/shared/lib/version.js +1 -1
- package/package.json +1 -1
- package/supported.json +1 -1
- package/dist/docs/06-modules/drive/installation.md +0 -69
- /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
|
|
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
|
|
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
|
-
```
|
|
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
|
-
|
|
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
|
|
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
|
-
##
|
|
43
|
+
## Installer `sharp`
|
|
51
44
|
|
|
52
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|

|
|
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,
|
|
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
|
|
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
|
|
16
|
-
-
|
|
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
|
-
```
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|