@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,16 +4,17 @@ description: Installer @fraza/module-forms, créer les tables, vérifier les dé
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/configuration
8
- - 06-modules/forms/affichage
7
+ - 06-modules/forms/02-configuration
8
+ - 06-modules/forms/06-affichage
9
9
  ---
10
10
 
11
- Cette page couvre l'installation de `@fraza/module-forms` 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-forms` 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
- - **`NEXT_PUBLIC_URL` renseignée.** Ce n'est pas une recommandation : sans elle, toute soumission est rejetée. Voir plus bas.
15
+ - Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
16
+ - **`NEXT_PUBLIC_URL` renseignée.** Sans elle, toute soumission est rejetée. Voir [Vérifier l'origine publique](#vérifier-lorigine-publique).
17
+ - Aucun compte : le paquet est publié sur npmjs.
17
18
 
18
19
  ## Installer
19
20
 
@@ -23,54 +24,52 @@ npm i @fraza/module-forms
23
24
 
24
25
  Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
25
26
 
26
- ```bash
27
+ ```dotenv
27
28
  #------ MODULE - FORMS ------#
28
29
  FRAZA_MODULE_FORMS=true
29
30
  ```
30
31
 
31
32
  Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin.
32
33
 
33
- Régénérer les manifestes puis créer les tables :
34
+ Régénérer les manifestes, puis créer les tables :
34
35
 
35
36
  ```bash
36
37
  npx fraza-modules sync # déclenché automatiquement au postinstall
37
- npx fraza-db init # crée fraza_forms_form et fraza_forms_submission
38
+ npx fraza-db init # crée les tables fraza_forms_*
38
39
  ```
39
40
 
40
- ## Version de core exigée
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 crée `fraza_forms_form`, `fraza_forms_submission` et `fraza_forms_storage_deletion`, la file des fichiers à retirer du stockage. Il enregistre aussi les permissions `forms.view` et `forms.manage`, et les attribue au rôle `admin`. Voir [Modèle de données](./07-modele-de-donnees.md).
42
+
43
+ La tâche planifiée `forms-retention` demande la table `fraza_cron_runs` du core, créée par `npx fraza-db migrate`.
41
44
 
42
- Le module réclame `@fraza/core` 0.1.0 ou plus, et le boot refuse une combinaison plus ancienne en nommant le module. C'est ce core qui sait générer `app/.fraza/public-pages.server.js`, le manifeste par lequel la page publique `/za/forms/<slug>` s'enregistre.
45
+ ## Projet monté à la main
43
46
 
44
- Si `app/za/[...path]/page.js` ne porte pas encore l'import du manifeste, par exemple sur un projet monté à la main, le doctor l'ajoute :
47
+ La page publique `/za/forms/<slug>` s'enregistre par le manifeste `app/.fraza/public-pages.server.js`, que génère `fraza-modules sync`. Le start template importe déjà ce manifeste dans `app/za/[...path]/page.js`. Sur un projet monté à la main, le doctor ajoute l'import :
45
48
 
46
49
  ```bash
47
50
  npx fraza-doctor --fix
48
51
  npx fraza-modules sync
49
52
  ```
50
53
 
51
- `fraza-db init` saute les tables déjà présentes, et crée aussi `fraza_forms_storage_deletion`. Les migrations `001-truncate-stored-ips` et `002-queue-storage-deletions` passent par `npx fraza-db migrate`. La tâche `forms-retention` demande la table `fraza_cron_runs` du core. Voir [Modèle de données](./modele-de-donnees.md).
52
-
53
54
  ## Vérifier l'origine publique
54
55
 
55
- C'est l'étape que l'on oublie, et elle rend le module inutilisable si elle manque.
56
+ C'est l'étape que l'on oublie, et elle rend le module inutilisable si elle manque. Dans `.env.local`, et dans les variables de la plateforme en production avec l'adresse du site :
56
57
 
57
- ```bash
58
+ ```dotenv
58
59
  NEXT_PUBLIC_URL=https://exemple.com
59
60
  ```
60
61
 
61
62
  Le routeur du core protège toute requête modifiante par une **comparaison d'origine**. L'en-tête `Origin` de la requête doit correspondre à l'origine déclarée dans cette variable. Si elle n'est pas renseignée, la comparaison échoue systématiquement et la soumission remonte en `403`.
62
63
 
63
- En local, placer `NEXT_PUBLIC_URL=http://localhost:3000` dans `.env.local`. Voir [Fichiers d'environnement](../../01-demarrage/03-configuration.md#fichiers-denvironnement).
64
+ En local, `@fraza/start` a déjà écrit `NEXT_PUBLIC_URL=http://localhost:3000` dans `.env.local`. Voir [Fichiers d'environnement](../../01-demarrage/03-configuration.md#fichiers-denvironnement).
64
65
 
65
- Le symptôme est trompeur : le formulaire s'affiche, se remplit, et l'envoi échoue sans message explicite côté visiteur.
66
-
67
- Voir [Soumissions](./soumissions.md) pour le détail de cette protection.
66
+ Le symptôme est trompeur : le formulaire s'affiche, se remplit, et l'envoi échoue sans message explicite côté visiteur. Voir [Soumissions](./05-soumissions.md) pour le détail de cette protection.
68
67
 
69
68
  ## Activer les courriels
70
69
 
71
- Les notifications à l'équipe et les accusés de réception passent par le service de courriel du core, donc par le fournisseur configuré pour le projet.
70
+ Les notifications à l'équipe et les accusés de réception passent par le service de courriel du core, donc par le fournisseur configuré pour le projet. Dans `.env.local` :
72
71
 
73
- ```bash
72
+ ```dotenv
74
73
  FRAZA_EMAIL_RESEND_APIKEY=re_...
75
74
  FRAZA_EMAIL_FROM_ADDRESS=noreply@exemple.com
76
75
  FRAZA_EMAIL_FROM_NAME=Exemple
@@ -78,9 +77,7 @@ FRAZA_EMAIL_FROM_NAME=Exemple
78
77
 
79
78
  Sans ces variables, le module fonctionne : les soumissions sont enregistrées et consultables dans l'admin, seuls les courriels ne partent pas. Leur échec n'a jamais d'effet sur la soumission.
80
79
 
81
- Les courriels passent par la table `fraza_email_outbox` du core, créée par `npx fraza-db migrate`. Sans elle, ils ne sont pas mis en file (erreur journalisée), et la soumission reste enregistrée.
82
-
83
- Voir [core/email](../../03-reference/01-cores/email.md).
80
+ Les courriels passent par la table `fraza_email_outbox` du core, créée par `npx fraza-db migrate`. Sans elle, ils ne sont pas mis en file (erreur journalisée), et la soumission reste enregistrée. Voir [core/email](../../03-reference/01-cores/email.md).
84
81
 
85
82
  ## Activer les champs fichier
86
83
 
@@ -96,7 +93,7 @@ Créer un formulaire depuis `/admin/forms`, lui donner un slug, puis l'ouvrir di
96
93
  /za/forms/<slug>
97
94
  ```
98
95
 
99
- Cette page est enregistrée par le module au boot, il n'y a rien à câbler. Elle sert avant tout à vérifier l'installation : pour un vrai site, préférer un bloc du BlockEditor écrit dans le projet ou le composant `FormEmbed`. Voir [Affichage](./affichage.md).
96
+ Cette page est enregistrée par le module au boot, il n'y a rien à câbler. Elle sert avant tout à vérifier l'installation : pour un vrai site, préférer un bloc du BlockEditor écrit dans le projet ou le composant `FormEmbed`. Voir [Affichage](./06-affichage.md).
100
97
 
101
98
  ## Vérifier
102
99
 
@@ -107,9 +104,7 @@ Cette page est enregistrée par le module au boot, il n'y a rien à câbler. Ell
107
104
  2. `Formulaires` apparaît dans la barre latérale de l'admin, avec les items `Formulaires` et `Soumissions`.
108
105
  3. Créer un formulaire, l'ouvrir à `/za/forms/<slug>`, l'envoyer, puis retrouver la soumission dans `/admin/forms/submissions`.
109
106
 
110
- Si l'envoi échoue, vérifier d'abord `NEXT_PUBLIC_URL`, puis attendre trois secondes avant de valider : un envoi trop rapide est refusé par la protection anti-robot. Voir [Soumissions](./soumissions.md).
111
-
112
- 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 `forms.view` et `forms.manage` apparaissent dans `/admin/roles`.
107
+ Si l'envoi échoue, vérifier d'abord `NEXT_PUBLIC_URL`, puis attendre trois secondes avant de valider : un envoi trop rapide est refusé par la protection anti-robot. Voir [Soumissions](./05-soumissions.md).
113
108
 
114
109
  ## Mettre à jour
115
110
 
@@ -117,9 +112,9 @@ Les permissions du module sont enregistrées et attribuées au rôle `admin` pen
117
112
  npx fraza-update
118
113
  ```
119
114
 
120
- 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-forms` seul, par `npm i`, laisserait le core et les autres modules en arrière.
115
+ 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-forms` seul, par `npm i`, laisserait le core et les autres modules en arrière.
121
116
 
122
- Les notes de version sont livrées avec le package, dans `node_modules/@fraza/module-forms/CHANGELOG.md`.
117
+ Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza/module-forms/CHANGELOG.md`.
123
118
 
124
119
  ## Notes
125
120
 
@@ -4,7 +4,7 @@ description: Variable d'activation, dépendances d'origine, de courriel et de st
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/soumissions
7
+ - 06-modules/forms/05-soumissions
8
8
  - 03-reference/06-configuration/variables-d-environnement
9
9
  ---
10
10
 
@@ -30,7 +30,7 @@ En revanche, trois services du core conditionnent son fonctionnement. Les ignore
30
30
  | `FRAZA_STORAGE_*` | Les champs de type fichier échouent. Le reste du formulaire fonctionne. |
31
31
  | `FRAZA_ENCRYPTION_KEY` | Aucun jeton de délai n'est émis : le délai minimal n'est pas vérifié, avec un avertissement au journal. |
32
32
  | Table `fraza_email_outbox` (`npx fraza-db migrate`) | Aucun courriel n'est mis en file. Les soumissions sont enregistrées. |
33
- | `FRAZA_NAME`, `FRAZA_LOGO_URL`, `FRAZA_SITE_URL` | La [page publique dédiée](./affichage.md#page-publique-dédiée) s'affiche sans marque : ni logo dans la barre, ni nom en pied de page. Le formulaire lui même fonctionne. |
33
+ | `FRAZA_NAME`, `FRAZA_LOGO_URL`, `FRAZA_SITE_URL` | La [page publique dédiée](./06-affichage.md#page-publique-dédiée) s'affiche sans marque : ni logo dans la barre, ni nom en pied de page. Le formulaire lui même fonctionne. |
34
34
 
35
35
  La première ligne mérite d'être répétée : c'est la panne la plus fréquente de ce module, et la moins lisible. Le routeur du core compare l'en-tête `Origin` de la requête à l'origine déclarée. Sans variable, il n'y a rien à comparer et la protection refuse tout.
36
36
 
@@ -56,7 +56,7 @@ La première, `Général`, porte le titre, le slug, la description et le statut.
56
56
 
57
57
  Le mode « redirection » remplace le message par une navigation vers l'URL donnée, exécutée par le navigateur après la réponse du serveur. Une adresse en `https://` ou `http://`, ou une page du site comme `/merci` ; toute autre est refusée à l'enregistrement.
58
58
 
59
- Voir [Soumissions](./soumissions.md) pour l'effet exact de chacun de ces réglages sur le pipeline.
59
+ Voir [Soumissions](./05-soumissions.md) pour l'effet exact de chacun de ces réglages sur le pipeline.
60
60
 
61
61
  ## Statut d'un formulaire
62
62
 
@@ -85,7 +85,7 @@ Elles ne suffisent pas seules : les routes et les écrans d'admin exigent d'abor
85
85
 
86
86
  `forms.view` suffit à **lire le contenu des soumissions**, y compris les données personnelles qu'elles portent et les pièces jointes. Ce n'est pas une permission de simple consultation de structure, à garder en tête au moment de la distribuer.
87
87
 
88
- Le point de soumission public, lui, n'exige aucune permission. Voir [Soumissions](./soumissions.md).
88
+ Le point de soumission public, lui, n'exige aucune permission. Voir [Soumissions](./05-soumissions.md).
89
89
 
90
90
  ## Entrées d'admin
91
91
 
@@ -93,11 +93,11 @@ Le module enregistre une section contenant deux items.
93
93
 
94
94
  | Élément | Valeur |
95
95
  |---|---|
96
- | Section | `Formulaires`, icône `ChecklistIcon`, ordre 75. |
96
+ | Section | `Formulaires`, groupe `content`, icône `ChecklistIcon`, ordre 75. |
97
97
  | Item 1 | `Formulaires`, `/admin/forms`, icône `ChecklistIcon`, permission `forms.view`. |
98
98
  | Item 2 | `Soumissions`, `/admin/forms/submissions`, icône `InboxIcon`, permission `forms.view`. |
99
99
 
100
- L'ordre 75 place la section après les modules de contenu. Voir [Étendre l'admin](../../02-guides/etendre-l-admin.md).
100
+ Le groupe `content` range la section dans la partie Contenu de la barre latérale, et l'ordre 75 la place après les pages. Voir [Étendre l'admin](../../02-guides/etendre-l-admin.md).
101
101
 
102
102
  ## Notes
103
103
 
@@ -4,8 +4,8 @@ description: Catalogue des types de champs, options de configuration, largeurs,
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/soumissions
8
- - 06-modules/forms/affichage
7
+ - 06-modules/forms/05-soumissions
8
+ - 06-modules/forms/06-affichage
9
9
  ---
10
10
 
11
11
  Un formulaire est une liste ordonnée de champs, composée au glisser-déposer dans l'onglet Champs du constructeur. Les champs sont stockés en JSON avec le formulaire, il n'y a pas de table de champs.
@@ -101,7 +101,7 @@ Les champs fichier d'un formulaire totalisent 50 Mo au plus (`maxFiles × maxSiz
101
101
 
102
102
  `ALL` lève la restriction de famille, pas les contrôles de contenu du core : le SVG reste refusé quel que soit le réglage, la signature binaire doit correspondre à l'extension déclarée quand cette extension est connue, et le contenu est inspecté à la recherche de balises exécutables. La taille maximale du champ s'applique toujours.
103
103
 
104
- Le point de soumission compte les fichiers envoyés sous le nom du champ, `maxFiles` au plus, vérifie chacun, puis les téléverse tous une fois la soumission entière validée. Voir [Soumissions](./soumissions.md).
104
+ Le point de soumission compte les fichiers envoyés sous le nom du champ, `maxFiles` au plus, vérifie chacun, puis les téléverse tous une fois la soumission entière validée. Voir [Soumissions](./05-soumissions.md).
105
105
 
106
106
  ### Longueur des textes
107
107
 
@@ -139,6 +139,6 @@ La même lecture (`readSubmission` de `fields.js`) tourne dans le navigateur ava
139
139
 
140
140
  ## Notes
141
141
 
142
- - Les champs sont stockés en JSON dans le formulaire, sans schéma en base. Leur définition est vérifiée à l'enregistrement du formulaire, voir [Modèle de données](./modele-de-donnees.md).
142
+ - Les champs sont stockés en JSON dans le formulaire, sans schéma en base. Leur définition est vérifiée à l'enregistrement du formulaire, voir [Modèle de données](./07-modele-de-donnees.md).
143
143
  - Le type `checkbox` porte une propriété `consentText` créée à l'ajout du champ. Elle n'est ni modifiable dans le constructeur, ni rendue nulle part. Ne pas compter dessus.
144
144
  - L'ordre des champs dans le constructeur est l'ordre de rendu, l'ordre du tableau récapitulatif des courriels, et l'ordre de la fiche de soumission.
@@ -4,13 +4,13 @@ description: Liste des formulaires, constructeur à deux onglets, boîte de réc
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/champs
8
- - 06-modules/forms/soumissions
7
+ - 06-modules/forms/03-champs
8
+ - 06-modules/forms/05-soumissions
9
9
  ---
10
10
 
11
11
  Le module ajoute une section `Formulaires` à la barre latérale de l'admin, avec deux entrées : les formulaires et leurs soumissions. Cette page décrit ce que fait l'interface, y compris les quelques comportements qui surprennent.
12
12
 
13
- L'accès à la section demande `forms.view`, en plus de `admin.access`. Sans elle, `/admin/forms` répond 404, comme une page inconnue. Créer, modifier, dupliquer et supprimer demandent `forms.manage`. Voir [Configuration](./configuration.md).
13
+ L'accès à la section demande `forms.view`, en plus de `admin.access`. Sans elle, `/admin/forms` répond 404, comme une page inconnue. Créer, modifier, dupliquer et supprimer demandent `forms.manage`. Voir [Configuration](./02-configuration.md).
14
14
 
15
15
  ## Écrans
16
16
 
@@ -36,7 +36,7 @@ Sous 1024 px, la liste compacte montre le titre, la date de modification, le nom
36
36
  | Dupliquer | Copie titrée `<titre> (copie)`, slug ré-unicifié, statut `inactive`. Aucune soumission copiée. |
37
37
  | Supprimer | Après confirmation. Supprime **les soumissions du formulaire** et leurs fichiers, dans une transaction. |
38
38
 
39
- La confirmation de suppression nomme les soumissions et leurs pièces jointes. Elle est irréversible, et les pièces jointes sont retirées du stockage objet. Voir [Modèle de données](./modele-de-donnees.md).
39
+ La confirmation de suppression nomme les soumissions et leurs pièces jointes. Elle est irréversible, et les pièces jointes sont retirées du stockage objet. Voir [Modèle de données](./07-modele-de-donnees.md).
40
40
 
41
41
  ## Constructeur
42
42
 
@@ -48,11 +48,11 @@ Un bouton `Voir` ouvre la page publique dans un nouvel onglet. Il n'apparaît qu
48
48
 
49
49
  Trois colonnes : la palette, le canevas, l'inspecteur.
50
50
 
51
- La **palette** liste les types de champs en quatre familles, `Basique`, `Choix`, `Avancé` et `Mise en page`. Cliquer sur un type l'ajoute à la fin, le glisser le dépose à la position visée. Voir [Champs](./champs.md) pour le catalogue.
51
+ La **palette** liste les types de champs en quatre familles, `Basique`, `Choix`, `Avancé` et `Mise en page`. Cliquer sur un type l'ajoute à la fin, le glisser le dépose à la position visée. Voir [Champs](./03-champs.md) pour le catalogue.
52
52
 
53
53
  Le **canevas** affiche les champs à leur largeur réelle, donc côte à côte quand ils sont en demi ou en tiers. Chaque bloc porte son libellé, son type et son nom, et une poignée pour le déplacer. La croix de suppression n'apparaît qu'au survol.
54
54
 
55
- L'**inspecteur** n'apparaît que lorsqu'un champ est sélectionné, et un champ qui vient d'être ajouté l'est automatiquement. Il porte les réglages du type sélectionné, décrits dans [Champs](./champs.md) : pour un champ fichier, « Nombre de fichiers maximal » et « Taille maximale par fichier (Mo) », bornés ; pour un texte ou un paragraphe, « Longueur maximale (caractères) ».
55
+ L'**inspecteur** n'apparaît que lorsqu'un champ est sélectionné, et un champ qui vient d'être ajouté l'est automatiquement. Il porte les réglages du type sélectionné, décrits dans [Champs](./03-champs.md) : pour un champ fichier, « Nombre de fichiers maximal » et « Taille maximale par fichier (Mo) », bornés ; pour un texte ou un paragraphe, « Longueur maximale (caractères) ».
56
56
 
57
57
  ### Onglet Réglages
58
58
 
@@ -94,12 +94,12 @@ La carte `Réponses` affiche les champs **dans l'ordre du formulaire**, avec le
94
94
 
95
95
  Les champs cachés **apparaissent** dans cette carte, contrairement aux courriels qui les excluent. Une case de consentement s'affiche en `Oui` ou `Non`, une liste de cases à cocher en valeurs séparées par des virgules.
96
96
 
97
- La carte `Fichiers` n'apparaît que s'il y en a. Chaque pièce jointe se télécharge par la route protégée du module, dans un nouvel onglet. Voir [API](./api.md).
97
+ La carte `Fichiers` n'apparaît que s'il y en a. Chaque pièce jointe se télécharge par la route protégée du module, dans un nouvel onglet. Voir [API](./08-api.md).
98
98
 
99
- La carte `Détails techniques` expose le statut, le réseau de l'adresse IP (`/24` ou `/48`), ou `—` quand le formulaire n'en garde aucune, le navigateur et la page d'origine. Le navigateur et la page d'origine viennent des en-têtes de la requête et sont falsifiables. Voir [Soumissions](./soumissions.md).
99
+ La carte `Détails techniques` expose le statut, le réseau de l'adresse IP (`/24` ou `/48`), ou `—` quand le formulaire n'en garde aucune, le navigateur et la page d'origine. Le navigateur et la page d'origine viennent des en-têtes de la requête et sont falsifiables. Voir [Soumissions](./05-soumissions.md).
100
100
 
101
101
  ## Notes
102
102
 
103
103
  - Aucun écran n'adapte ses boutons à la permission : un compte qui n'a que `forms.view` voit les actions d'écriture et se fait refuser par l'API au moment de les utiliser.
104
104
  - La duplication d'un formulaire ne demande pas de confirmation. Elle est sans risque, la copie étant créée inactive.
105
- - Le constructeur ne prévisualise pas le formulaire. Pour le voir tel que le visiteur le verra, ouvrir sa page publique avec le bouton `Voir`. Voir [Affichage](./affichage.md).
105
+ - Le constructeur ne prévisualise pas le formulaire. Pour le voir tel que le visiteur le verra, ouvrir sa page publique avec le bouton `Voir`. Voir [Affichage](./06-affichage.md).
@@ -4,8 +4,8 @@ description: Pipeline de soumission, vérification d'origine, anti-robots, pièc
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/modele-de-donnees
8
- - 06-modules/forms/api
7
+ - 06-modules/forms/07-modele-de-donnees
8
+ - 06-modules/forms/08-api
9
9
  ---
10
10
 
11
11
  Une soumission traverse neuf étapes, dans cet ordre. Comprendre lesquelles rejettent et lesquelles laissent passer est la clé du diagnostic quand un formulaire ne fonctionne pas.
@@ -42,13 +42,13 @@ Trois conséquences directes :
42
42
  - Si aucune des deux variables n'est renseignée, **toute** soumission est refusée. C'est la panne la plus fréquente à l'installation.
43
43
  - Une soumission depuis la même origine passe automatiquement, sans jeton à gérer côté client.
44
44
 
45
- Voir [Configuration](./configuration.md).
45
+ Voir [Configuration](./02-configuration.md).
46
46
 
47
47
  ## Format de la requête
48
48
 
49
49
  Le corps doit être un formulaire encodé. Les composants du module envoient du **`multipart/form-data`**, seul encodage capable de porter des fichiers. Le parseur accepte aussi `application/x-www-form-urlencoded` pour un formulaire sans pièce jointe. Un corps JSON est refusé dans tous les cas.
50
50
 
51
- Chaque champ de saisie est envoyé sous son `name`, plus deux champs techniques décrits ci-dessous. Les composants fournis par le module s'en chargent. Voir [Affichage](./affichage.md).
51
+ Chaque champ de saisie est envoyé sous son `name`, plus deux champs techniques décrits ci-dessous. Les composants fournis par le module s'en chargent. Voir [Affichage](./06-affichage.md).
52
52
 
53
53
  ## Anti-robots
54
54
 
@@ -82,7 +82,7 @@ Seules les **métadonnées** sont enregistrées avec la soumission : nom du cham
82
82
 
83
83
  Ces fichiers sont **privés**. Aucune URL publique n'existe : ils ne sont accessibles que par la route de téléchargement de l'admin, protégée par `forms.view`.
84
84
 
85
- Supprimer une soumission retire ses fichiers du stockage, et supprimer un formulaire vide son dossier `forms/<id>/`, après la réponse, depuis la file `fraza_forms_storage_deletion`. Voir [Modèle de données](./modele-de-donnees.md). Une soumission refusée ne laisse aucun fichier : tous sont vérifiés avant le premier téléversement, et ceux déjà envoyés sont retirés si un envoi ou l'enregistrement échoue.
85
+ Supprimer une soumission retire ses fichiers du stockage, et supprimer un formulaire vide son dossier `forms/<id>/`, après la réponse, depuis la file `fraza_forms_storage_deletion`. Voir [Modèle de données](./07-modele-de-donnees.md). Une soumission refusée ne laisse aucun fichier : tous sont vérifiés avant le premier téléversement, et ceux déjà envoyés sont retirés si un envoi ou l'enregistrement échoue.
86
86
 
87
87
  ## Ce qui est enregistré
88
88
 
@@ -97,7 +97,7 @@ L'adresse IP est lue par `getIpFromRequest` du core, comme la clé de limitation
97
97
 
98
98
  L'agent utilisateur et le référent sont pris tels quels dans les en-têtes, **sans la vérification `FRAZA_TRUST_PROXY`** : un appelant peut les falsifier, ils servent au diagnostic.
99
99
 
100
- Voir [Modèle de données](./modele-de-donnees.md).
100
+ Voir [Modèle de données](./07-modele-de-donnees.md).
101
101
 
102
102
  ## Courriels
103
103
 
@@ -135,7 +135,7 @@ Le serveur bascule une soumission `new` en `read` quand il la sert à sa fiche,
135
135
 
136
136
  La liste `/admin/forms/submissions` filtre par statut et par formulaire, cinquante par page, du plus récent au plus ancien.
137
137
 
138
- Il n'existe **pas d'export**. Les soumissions se consultent une par une. Voir [Administration](./admin.md) pour le détail des écrans.
138
+ Il n'existe **pas d'export**. Les soumissions se consultent une par une. Voir [Administration](./04-admin.md) pour le détail des écrans.
139
139
 
140
140
  ## Rétention
141
141
 
@@ -4,7 +4,7 @@ description: Les trois façons de rendre un formulaire sur le site, leurs diffé
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/soumissions
7
+ - 06-modules/forms/05-soumissions
8
8
  - 02-guides/blocs-personnalises
9
9
  ---
10
10
 
@@ -123,5 +123,5 @@ Son rendu suit le [thème du projet](../../02-guides/personnaliser-l-apparence.m
123
123
 
124
124
  ## Notes
125
125
 
126
- - Les trois voies passent par le même point de soumission et sont donc soumises aux mêmes contrôles d'origine et anti-robots. Voir [Soumissions](./soumissions.md).
127
- - Un projet qui veut d'autres champs que ceux de `FormRenderer` écrit son propre îlot client, sur le même contrat : jeton de `/token` dans `_t`, champ `_hp` vide, envoi en `multipart/form-data`, `details.fieldErrors` en retour. Voir [API](./api.md).
126
+ - Les trois voies passent par le même point de soumission et sont donc soumises aux mêmes contrôles d'origine et anti-robots. Voir [Soumissions](./05-soumissions.md).
127
+ - Un projet qui veut d'autres champs que ceux de `FormRenderer` écrit son propre îlot client, sur le même contrat : jeton de `/token` dans `_t`, champ `_hp` vide, envoi en `multipart/form-data`, `details.fieldErrors` en retour. Voir [API](./08-api.md).
@@ -4,7 +4,7 @@ description: Tables fraza_forms_form, fraza_forms_submission et fraza_forms_stor
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/soumissions
7
+ - 06-modules/forms/05-soumissions
8
8
  - 03-reference/01-cores/database
9
9
  ---
10
10
 
@@ -44,7 +44,7 @@ Un tableau d'objets, dans l'ordre de rendu. Chaque champ porte au minimum `id`,
44
44
 
45
45
  Il n'existe aucun schéma de base sur ce JSON : la définition est vérifiée par le module à l'enregistrement du formulaire, qui refuse avec un message en français un nom invalide ou en double, un champ à options sans option ou avec une valeur vide ou répétée, des champs fichier au-delà de 50 Mo au total, plus de 100 champs. À la lecture, chaque champ est normalisé : nombres ramenés dans leurs bornes (`maxLength`, `maxFiles`, `maxSizeMb`), options en chaînes, identifiants remplis.
46
46
 
47
- Voir [Champs](./champs.md) pour la structure complète par type.
47
+ Voir [Champs](./03-champs.md) pour la structure complète par type.
48
48
 
49
49
  ### Structure de `settings`
50
50
 
@@ -133,6 +133,6 @@ Les fichiers laissés par des soumissions supprimées avant cette version, dans
133
133
  ## Notes
134
134
 
135
135
  - `dropTables` supprime les trois tables et la fonction du déclencheur, dans l'ordre qui respecte la clé étrangère. Il ne supprime toujours aucun fichier du stockage objet.
136
- - Une soumission est supprimée après `retentionDays` jours par la tâche `forms-retention`, voir [Soumissions](./soumissions.md#rétention). Sans réglage, elle est gardée sans limite.
136
+ - Une soumission est supprimée après `retentionDays` jours par la tâche `forms-retention`, voir [Soumissions](./05-soumissions.md#rétention). Sans réglage, elle est gardée sans limite.
137
137
  - Migrations, appliquées par `npx fraza-db migrate` : `001-truncate-stored-ips` réduit les adresses déjà enregistrées, par lots de 1000, sans effet si on la relance. `002-queue-storage-deletions` crée la file et le déclencheur, aussi posés par `createTables()` sur une base neuve, et met en file le dossier de chaque formulaire supprimé avant elle (les trous de la séquence des identifiants).
138
138
  - Le commentaire d'en-tête du module mentionne une clé `sourceUrl` dans `meta`. Elle n'est jamais écrite, le tableau de cette page fait foi.
@@ -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/forms/soumissions
7
+ - 06-modules/forms/05-soumissions
8
8
  - 03-reference/01-cores/api
9
9
  ---
10
10
 
@@ -25,7 +25,7 @@ Le module expose ses formulaires de trois façons : des routes HTTP d'admin, tro
25
25
  import { getPublicFormById } from '@fraza/module-forms/server';
26
26
  ```
27
27
 
28
- `@fraza/module-forms/server` est délibérément séparé de `/public` : il ne contient aucun composant, et reste donc importable depuis un Server Component sans tirer de code client. C'est ce qu'utilise un bloc du BlockEditor écrit dans le projet. Voir [Affichage](./affichage.md).
28
+ `@fraza/module-forms/server` est délibérément séparé de `/public` : il ne contient aucun composant, et reste donc importable depuis un Server Component sans tirer de code client. C'est ce qu'utilise un bloc du BlockEditor écrit dans le projet. Voir [Affichage](./06-affichage.md).
29
29
 
30
30
  ## API
31
31
 
@@ -101,7 +101,7 @@ L'ordre de déclaration compte : les chemins de soumissions sont déclarés **av
101
101
 
102
102
  `GET /forms/public/:slug/token` renvoie `{ token }`, le jeton du délai minimal, `null` sans `FRAZA_ENCRYPTION_KEY`. Elle répond `404` si le formulaire est absent ou inactif. `FormRenderer` l'appelle à son montage.
103
103
 
104
- `POST /forms/public/:slug/submit` est le point de soumission, compté par le préréglage `public_form`. Il exige un corps en `multipart/form-data`, refuse le JSON, et attend en plus des champs du formulaire les deux champs techniques `_hp` et `_t`, le jeton de la route précédente. Voir [Soumissions](./soumissions.md).
104
+ `POST /forms/public/:slug/submit` est le point de soumission, compté par le préréglage `public_form`. Il exige un corps en `multipart/form-data`, refuse le JSON, et attend en plus des champs du formulaire les deux champs techniques `_hp` et `_t`, le jeton de la route précédente. Voir [Soumissions](./05-soumissions.md).
105
105
 
106
106
  Chaque formulaire a son plafond de corps : ses champs fichier à leur taille maximale, plus 1 Mio pour le texte. La route, elle, est plafonnée à 51 Mio, le plus grand formulaire possible. Au-delà du plafond du formulaire, la réponse est un 413 « L'envoi dépasse la taille acceptée par ce formulaire (N Mo). ».
107
107
 
@@ -109,7 +109,7 @@ Une réponse d'erreur est l'erreur d'API du core, `{ error, code, message, detai
109
109
 
110
110
  ### Aucune de ces routes n'est ouverte à un autre domaine
111
111
 
112
- Les routes publiques n'exigent ni session ni permission, mais le routeur du core applique une **vérification d'origine** sur toute requête modifiante. La soumission depuis un domaine tiers est donc refusée par construction, et sans `NEXT_PUBLIC_URL` renseignée, toute soumission l'est. Voir [Configuration](./configuration.md).
112
+ Les routes publiques n'exigent ni session ni permission, mais le routeur du core applique une **vérification d'origine** sur toute requête modifiante. La soumission depuis un domaine tiers est donc refusée par construction, et sans `NEXT_PUBLIC_URL` renseignée, toute soumission l'est. Voir [Configuration](./02-configuration.md).
113
113
 
114
114
  ## Notes
115
115
 
@@ -4,28 +4,40 @@ description: Constructeur de formulaires, collecte des soumissions, notification
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/forms/installation
8
- - 06-modules/forms/champs
7
+ - 06-modules/forms/01-installation
8
+ - 06-modules/forms/03-champs
9
9
  ---
10
10
 
11
11
  `@fraza/module-forms` ajoute un constructeur de formulaires à l'admin, une boîte de réception pour les soumissions, et un point de soumission public. Un formulaire se compose au glisser-déposer, sans code.
12
12
 
13
+ ```bash
14
+ npm i @fraza/module-forms
15
+ ```
16
+
17
+ | Paquet | `@fraza/module-forms` |
18
+ |---|---|
19
+ | Licence | MIT, Fraza Libre. |
20
+ | Registre | npmjs, sans compte ni configuration. |
21
+ | Activation | `FRAZA_MODULE_FORMS=true` |
22
+
23
+ L'activation, la création des tables et les services dont dépendent les soumissions sont dans [Installation](./01-installation.md).
24
+
13
25
  ![Le constructeur de formulaire, sa palette de champs à gauche et le formulaire en cours à droite](../../assets/modules/forms/constructeur.light.webp)
14
26
 
15
- La palette range les types de champs par famille, et chaque champ posé porte sa largeur : pleine, demie ou tiers de ligne en écran large. L'URL publique s'affiche sous le titre, le formulaire y est servi dès qu'il est enregistré. Voir [Champs](./champs.md) pour le catalogue complet.
27
+ La palette range les types de champs par famille, et chaque champ posé porte sa largeur : pleine, demie ou tiers de ligne en écran large. L'URL publique s'affiche sous le titre, le formulaire y est servi dès qu'il est enregistré. Voir [Champs](./03-champs.md) pour le catalogue complet.
16
28
 
17
29
  ## Pages de cette section
18
30
 
19
31
  | Page | Contenu |
20
32
  |---|---|
21
- | [Installation](./installation.md) | Installer le module, créer les tables, vérifier les dépendances. |
22
- | [Configuration](./configuration.md) | Variables d'environnement, permissions, entrées d'admin. |
23
- | [Champs](./champs.md) | Catalogue des types de champs et validation appliquée. |
24
- | [Administration](./admin.md) | Constructeur, liste des formulaires et boîte de réception. |
25
- | [Soumissions](./soumissions.md) | Pipeline de soumission, anti-spam, fichiers, courriels, rétention. |
26
- | [Affichage](./affichage.md) | Les trois façons de rendre un formulaire sur le site. |
27
- | [Modèle de données](./modele-de-donnees.md) | Tables `fraza_forms_form`, `fraza_forms_submission` et `fraza_forms_storage_deletion`. |
28
- | [API](./api.md) | Routes HTTP et fonctions serveur importables. |
33
+ | [Installation](./01-installation.md) | Installer le module, créer les tables, vérifier les dépendances. |
34
+ | [Configuration](./02-configuration.md) | Variables d'environnement, permissions, entrées d'admin. |
35
+ | [Champs](./03-champs.md) | Catalogue des types de champs et validation appliquée. |
36
+ | [Administration](./04-admin.md) | Constructeur, liste des formulaires et boîte de réception. |
37
+ | [Soumissions](./05-soumissions.md) | Pipeline de soumission, anti-spam, fichiers, courriels, rétention. |
38
+ | [Affichage](./06-affichage.md) | Les trois façons de rendre un formulaire sur le site. |
39
+ | [Modèle de données](./07-modele-de-donnees.md) | Tables `fraza_forms_form`, `fraza_forms_submission` et `fraza_forms_storage_deletion`. |
40
+ | [API](./08-api.md) | Routes HTTP et fonctions serveur importables. |
29
41
 
30
42
  ## Ce que le module apporte
31
43
 
@@ -50,11 +62,11 @@ Le module n'a aucune dépendance de code au-delà du core, mais deux de ses fonc
50
62
  | Courriels de notification et de confirmation | La configuration courriel du core, Resend ou SMTP. |
51
63
  | Champs de type fichier | Le stockage objet du core. |
52
64
 
53
- La première est la cause de panne la plus fréquente, et la moins visible : le formulaire s'affiche correctement et échoue à l'envoi. Voir [Configuration](./configuration.md).
65
+ La première est la cause de panne la plus fréquente, et la moins visible : le formulaire s'affiche correctement et échoue à l'envoi. Voir [Configuration](./02-configuration.md).
54
66
 
55
67
  ## Ce que le module ne fait pas
56
68
 
57
- - **Il n'enregistre pas de bloc BlockEditor**, et `@fraza/start` n'en livre pas non plus. Un projet écrit le sien en quelques lignes, ou passe par une autre voie d'affichage. Voir [Affichage](./affichage.md).
69
+ - **Il n'enregistre pas de bloc BlockEditor**, et `@fraza/start` n'en livre pas non plus. Un projet écrit le sien en quelques lignes, ou passe par une autre voie d'affichage. Voir [Affichage](./06-affichage.md).
58
70
  - Il ne propose ni logique conditionnelle entre champs, ni étapes multiples, ni calculs.
59
71
  - Il n'exporte pas les soumissions. Elles se consultent une par une dans l'admin.
60
72
 
@@ -62,4 +74,4 @@ La première est la cause de panne la plus fréquente, et la moins visible : le
62
74
 
63
75
  - Le champ `version` du manifeste suit la version du paquet : [`fraza-module sync-version`](../../03-reference/05-cli/fraza-module.md#sync-version), lancé par chaque build, la recopie dans `src/version.js`, et `prepublishOnly` refuse de publier si les deux divergent.
64
76
  - Supprimer un formulaire supprime ses soumissions et leurs fichiers, dans une transaction, c'est explicite et irréversible.
65
- - Chaque valeur est vérifiée selon le type de son champ, dans le navigateur puis sur le serveur. Voir [Champs](./champs.md).
77
+ - Chaque valeur est vérifiée selon le type de son champ, dans le navigateur puis sur le serveur. Voir [Champs](./03-champs.md).
@@ -60,9 +60,9 @@ Ils sont indépendants et cohabitent sans conflit. Une page nommée `blogue` et
60
60
 
61
61
  ## Version documentée
62
62
 
63
- Chaque module suit son propre cycle de publication, indépendant de celui du core. La page d'accueil d'un module indique donc la version qu'elle documente.
63
+ Cette section décrit la dernière version publiée de chaque module. Tous les paquets Fraza à leur dernière version fonctionnent ensemble, et `npx fraza-update` les installe ensemble : un projet à jour lit donc la documentation de ses modules.
64
64
 
65
- Si la version installée est plus récente, ses notes de version sont livrées avec elle, dans `node_modules/<module>/CHANGELOG.md`. Elles sont donc consultables hors ligne, sans accès au dépôt. `npx fraza-update` les affiche automatiquement après une mise à jour.
65
+ Ce qui a changé d'une version à l'autre est dans les notes de version, livrées avec chaque module dans `node_modules/<module>/CHANGELOG.md`, et consultables hors ligne. `npx fraza-update` les affiche automatiquement après une mise à jour.
66
66
 
67
67
  ## Ce qui reste dans le dépôt du module
68
68