@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,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
|
|
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
|
|
16
|
-
- **`NEXT_PUBLIC_URL` renseignée.**
|
|
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
|
-
```
|
|
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
|
|
38
|
+
npx fraza-db init # crée les tables fraza_forms_*
|
|
38
39
|
```
|
|
39
40
|
|
|
40
|
-
|
|
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
|
-
|
|
45
|
+
## Projet monté à la main
|
|
43
46
|
|
|
44
|
-
|
|
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
|
-
```
|
|
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,
|
|
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
|
-
```
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|

|
|
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
|
-
|
|
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
|
-
|
|
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
|
|