@fraza/core 0.3.7 → 0.3.10

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 (88) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +4 -0
  3. package/THIRD-PARTY-NOTICES.md +2 -2
  4. package/changelog.json +61 -0
  5. package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
  6. package/dist/docs/01-demarrage/01-installation.md +9 -15
  7. package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
  8. package/dist/docs/01-demarrage/03-configuration.md +1 -1
  9. package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
  10. package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
  11. package/dist/docs/02-guides/blocs-personnalises.md +1 -1
  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/03-registres/media-registry.md +4 -4
  17. package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
  18. package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
  19. package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
  20. package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
  21. package/dist/docs/04-architecture/05-securite.md +1 -1
  22. package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
  23. package/dist/docs/05-contribution/03-redaction.md +10 -0
  24. package/dist/docs/05-contribution/05-publication.md +0 -1
  25. package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
  26. package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
  27. package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
  28. package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
  29. package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
  30. package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
  31. package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
  32. package/dist/docs/06-modules/booking/index.md +22 -12
  33. package/dist/docs/06-modules/drive/01-installation.md +92 -0
  34. package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
  35. package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
  36. package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
  37. package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
  38. package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
  39. package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
  40. package/dist/docs/06-modules/drive/index.md +22 -12
  41. package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
  42. package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
  43. package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
  44. package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
  45. package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
  46. package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
  47. package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
  48. package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
  49. package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
  50. package/dist/docs/06-modules/facturation/index.md +26 -16
  51. package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
  52. package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +4 -4
  53. package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
  54. package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
  55. package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
  56. package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
  57. package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
  58. package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
  59. package/dist/docs/06-modules/forms/index.md +26 -14
  60. package/dist/docs/06-modules/index.md +2 -2
  61. package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
  62. package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
  63. package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
  64. package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
  65. package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
  66. package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
  67. package/dist/docs/06-modules/medias/index.md +25 -13
  68. package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
  69. package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
  70. package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
  71. package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
  72. package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
  73. package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
  74. package/dist/docs/06-modules/pages/index.md +21 -9
  75. package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
  76. package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
  77. package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
  78. package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
  79. package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
  80. package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
  81. package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
  82. package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
  83. package/dist/docs/06-modules/posts/index.md +25 -13
  84. package/dist/shared/lib/version.js +1 -1
  85. package/package.json +1 -1
  86. package/supported.json +1 -1
  87. package/dist/docs/06-modules/drive/installation.md +0 -69
  88. /package/dist/docs/06-modules/medias/{integration.md → 05-integration.md} +0 -0
@@ -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
 
@@ -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
 
@@ -4,18 +4,17 @@ description: Installer @fraza/module-medias, configurer le stockage objet, crée
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/configuration
8
- - 06-modules/medias/integration
7
+ - 06-modules/medias/02-configuration
8
+ - 06-modules/medias/05-integration
9
9
  ---
10
10
 
11
- Cette page couvre l'installation de `@fraza/module-medias` dans un projet déjà structuré par `@fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
12
-
13
- C'est le seul module officiel qui demande une étape de câblage manuelle dans le projet, parce qu'il sert du binaire.
11
+ Cette page installe `@fraza/module-medias` dans un projet créé par `npx @fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
14
12
 
15
13
  ## Prérequis
16
14
 
17
- - Un projet généré par `npx @fraza/start`, avec `@fraza/core` installé.
18
- - Un **stockage objet compatible S3** configuré. Sans lui, le module démarre mais aucun téléversement n'aboutit. Voir [Configuration](./configuration.md).
15
+ - Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
16
+ - Un **stockage objet compatible S3** configuré. Sans lui, le module démarre mais aucun téléversement n'aboutit. Voir [Configuration](./02-configuration.md).
17
+ - Aucun compte : le paquet est publié sur npmjs.
19
18
 
20
19
  ## Installer
21
20
 
@@ -23,35 +22,35 @@ C'est le seul module officiel qui demande une étape de câblage manuelle dans l
23
22
  npm i @fraza/module-medias
24
23
  ```
25
24
 
26
- `sharp` est une **peer dependency facultative** (`>=0.35.0`) : le core la charge au premier traitement d'image, et Next.js en installe déjà une copie. La déclarer en peer garantit qu'il n'y en a qu'une seule dans le projet, dans une version que le site contrôle. Sans `sharp`, le module démarre, mais refuse les images JPEG, PNG et WebP tant que l'optimisation retire leurs métadonnées, ce qu'elle fait par défaut. Sur un projet dont le verrou est ancien, `npm update sharp` suffit à remonter au seuil de `0.35.0`.
27
-
28
- Le module n'a plus aucune dépendance de production : `archiver` a été retiré, l'archive ZIP est écrite par le core.
29
-
30
- Ce choix est un exemple de la règle décrite dans [Créer un module](../../02-guides/creer-un-module.md) : tout ce que le site fournit déjà va en `peerDependencies`.
31
-
32
25
  Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
33
26
 
34
- ```bash
27
+ ```dotenv
35
28
  #------ MODULE - MEDIAS ------#
36
29
  FRAZA_MODULE_MEDIAS=true
37
30
  ```
38
31
 
39
32
  Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin, et le registre média du core reste vide.
40
33
 
41
- Puis régénérer les manifestes et créer les tables :
34
+ Régénérer les manifestes, puis créer les tables :
42
35
 
43
36
  ```bash
44
37
  npx fraza-modules sync # déclenché automatiquement au postinstall
45
38
  npx fraza-db init # crée fraza_media et fraza_media_references
46
39
  ```
47
40
 
48
- `fraza-db init` est idempotent. Sur une base qui possède déjà les tables, il applique les migrations en attente sans toucher aux données. Voir [Modèle de données](./modele-de-donnees.md).
41
+ `fraza-db init` est idempotent : sur une base qui a déjà les tables, il applique les migrations en attente sans toucher aux données. Il enregistre aussi les quatre permissions du module, et les attribue au rôle `admin`. Voir [Modèle de données](./06-modele-de-donnees.md).
49
42
 
50
- ## Monter la route de fichier
43
+ ## Installer `sharp`
51
44
 
52
- **C'est l'étape à ne pas oublier.** Sans elle, les médias sont téléversables mais aucune URL publique ne répond.
45
+ `sharp` est une **peer dependency facultative** (`>=0.35.0`) : le core la charge au premier traitement d'image, et Next.js en installe déjà une copie. La déclarer en peer garantit qu'il n'y en a qu'une seule dans le projet, dans une version que le site contrôle.
53
46
 
54
- Créer le fichier suivant dans le projet :
47
+ Sans `sharp`, le module démarre, mais refuse les images JPEG, PNG et WebP tant que l'optimisation retire leurs métadonnées, ce qu'elle fait par défaut. Sur un projet dont le verrou est ancien, `npm update sharp` suffit à remonter au seuil de `0.35.0`.
48
+
49
+ Ce choix suit la règle décrite dans [Créer un module](../../02-guides/creer-un-module.md) : tout ce que le site fournit déjà va en `peerDependencies`. Le module n'a aucune dépendance de production : l'archive ZIP est écrite par le core.
50
+
51
+ ## Monter la route de fichier
52
+
53
+ **C'est l'étape à ne pas oublier sur un projet monté à la main.** Sans elle, les médias sont téléversables mais aucune URL publique ne répond. Le start template officiel fournit déjà ce fichier.
55
54
 
56
55
  ```js
57
56
  // app/za/media/[filename]/route.js
@@ -62,7 +61,17 @@ L'import passe par le **core**, pas par le module. Le core y expose un relais qu
62
61
 
63
62
  Cette route doit rester un Route Handler et non une page : elle diffuse du binaire avec ses en-têtes de type, de cache et de disposition, ce qu'une page ne sait pas faire.
64
63
 
65
- Le start template officiel fournit déjà ce fichier.
64
+ C'est le seul module officiel qui demande un fichier de route dans le projet, parce qu'il sert du binaire.
65
+
66
+ ## Effet sur les autres modules
67
+
68
+ L'installation suffit à activer, dans tout le projet :
69
+
70
+ - le sélecteur d'image du BlockEditor, sur les blocs image et sur les champs `ImageField` des blocs personnalisés ;
71
+ - les champs de type `image`, `thumbnail` et `gallery` de `@fraza/module-posts`, quel que soit le nom que le projet leur donne dans sa variable de type ;
72
+ - le choix de l'image de partage Open Graph quand `FRAZA_SEO` est actif.
73
+
74
+ Aucun de ces modules ne déclare `@fraza/module-medias` en dépendance. Voir [Intégration](./05-integration.md).
66
75
 
67
76
  ## Vérifier
68
77
 
@@ -73,19 +82,7 @@ Le start template officiel fournit déjà ce fichier.
73
82
  2. `Médias` apparaît dans la barre latérale de l'admin.
74
83
  3. Téléverser une image depuis `/admin/media`, puis ouvrir l'URL publique proposée par la fiche du média.
75
84
 
76
- Si le téléversement échoue, la cause est presque toujours la configuration du stockage objet, pas le module. Voir [Configuration](./configuration.md).
77
-
78
- Les permissions du module sont enregistrées et attribuées au rôle `admin` pendant `fraza-db init`. Un module ajouté après coup n'a donc besoin que d'un `npx fraza-db init` pour que les quatre permissions apparaissent dans `/admin/roles`.
79
-
80
- ## Effet sur les autres modules
81
-
82
- L'installation suffit à activer, dans tout le projet :
83
-
84
- - le sélecteur d'image du BlockEditor, sur les blocs image et sur les champs `ImageField` des blocs personnalisés ;
85
- - les champs de type `image`, `thumbnail` et `gallery` de `@fraza/module-posts`, quel que soit le nom que le projet leur donne dans sa variable de type ;
86
- - le choix de l'image de partage Open Graph quand `FRAZA_SEO` est actif.
87
-
88
- Aucun de ces modules ne déclare `@fraza/module-medias` en dépendance. Voir [Intégration](./integration.md).
85
+ Si le téléversement échoue, la cause est presque toujours la configuration du stockage objet, pas le module. Voir [Configuration](./02-configuration.md).
89
86
 
90
87
  ## Mettre à jour
91
88
 
@@ -93,12 +90,12 @@ Aucun de ces modules ne déclare `@fraza/module-medias` en dépendance. Voir [In
93
90
  npx fraza-update
94
91
  ```
95
92
 
96
- La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois : tous les paquets Fraza à leur dernière version fonctionnent ensemble. Mettre à jour `@fraza/module-medias` seul, par `npm i`, laisserait le core et les autres modules en arrière.
93
+ La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois, puis enchaîne `fraza-modules sync`, `fraza-db migrate` et `fraza-doctor`. Tous les paquets Fraza à leur dernière version fonctionnent ensemble : mettre à jour `@fraza/module-medias` seul, par `npm i`, laisserait le core et les autres modules en arrière.
97
94
 
98
- Les notes de version sont livrées avec le package, dans `node_modules/@fraza/module-medias/CHANGELOG.md`.
95
+ Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza/module-medias/CHANGELOG.md`.
99
96
 
100
97
  ## Notes
101
98
 
102
99
  - Le module dépend de `@fraza/core` en `peerDependency`. Il n'embarque pas sa propre copie du core.
103
100
  - Désinstaller le module ne supprime ni les tables, ni les fichiers du stockage objet. `dropTables` est exporté depuis `@fraza/module-medias` pour la partie base.
104
- - Désactiver le module sans le désinstaller laisse les contenus référencer des médias devenus irrésolubles, et les références ne sont plus tenues à jour. Voir [Désactivé avec ses tables](./integration.md#désactivé-avec-ses-tables).
101
+ - Désactiver le module sans le désinstaller laisse les contenus référencer des médias devenus irrésolubles, et les références ne sont plus tenues à jour. Voir [Désactivé avec ses tables](./05-integration.md#désactivé-avec-ses-tables).
@@ -4,7 +4,7 @@ description: Variables d'environnement, stockage objet, optimisation des images,
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/televersement
7
+ - 06-modules/medias/03-televersement
8
8
  - 03-reference/01-cores/storage
9
9
  ---
10
10
 
@@ -24,7 +24,7 @@ Les trois dernières sont sans effet si `FRAZA_MODULE_MEDIAS_OPTIMIZE` vaut `fal
24
24
 
25
25
  L'activation se compare strictement à la chaîne `true`. Les drapeaux d'optimisation fonctionnent en sens inverse : ils sont actifs sauf si la valeur vaut exactement `false`. Une valeur mal orthographiée laisse donc l'optimisation active.
26
26
 
27
- Voir [Téléversement](./televersement.md) pour l'effet précis de ces réglages sur un fichier.
27
+ Voir [Téléversement](./03-televersement.md) pour l'effet précis de ces réglages sur un fichier.
28
28
 
29
29
  ## Stockage objet
30
30
 
@@ -78,11 +78,11 @@ Le module enregistre une section `Médias` et un item `Médias` à l'intérieur.
78
78
 
79
79
  L'ordre 25 de la section place la médiathèque avant les modules de contenu, qui commencent à 60. Voir [Étendre l'admin](../../02-guides/etendre-l-admin.md).
80
80
 
81
- Ce que l'écran permet de faire est décrit dans [Administration](./admin.md).
81
+ Ce que l'écran permet de faire est décrit dans [Administration](./04-admin.md).
82
82
 
83
83
  ## Notes
84
84
 
85
85
  - Aucune variable du module ne contient de secret. Les secrets du stockage sont ceux du core, lisibles côté serveur uniquement.
86
86
  - La configuration d'optimisation est relue à chaque téléversement, pas mise en cache au boot. La changer ne demande pas de redémarrage, mais ne réoptimise évidemment pas les fichiers déjà en place.
87
- - Changer `FRAZA_MODULE_MEDIAS` à `false` désactive le module mais laisse les tables et les fichiers en place, sans plus tenir les références à jour. Voir [Intégration](./integration.md#désactivé-avec-ses-tables).
88
- - `sharp` est requis pour optimiser une image. Voir [Installation](./installation.md#installer).
87
+ - Changer `FRAZA_MODULE_MEDIAS` à `false` désactive le module mais laisse les tables et les fichiers en place, sans plus tenir les références à jour. Voir [Intégration](./05-integration.md#désactivé-avec-ses-tables).
88
+ - `sharp` est requis pour optimiser une image. Voir [Installation](./01-installation.md#installer).
@@ -4,7 +4,7 @@ description: Formats acceptés, limites de taille, validation de contenu, optimi
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/integration
7
+ - 06-modules/medias/05-integration
8
8
  - 03-reference/01-cores/storage
9
9
  ---
10
10
 
@@ -61,7 +61,7 @@ Chaque média porte deux identifiants de fichier, qui ne servent pas à la même
61
61
 
62
62
  La clé de stockage est fixée à la création et n'est jamais réécrite, pas même lors d'un remplacement de fichier. Le nom public, lui, se change librement.
63
63
 
64
- C'est cette séparation qui permet de renommer un média sans casser quoi que ce soit : les contenus référencent l'**identifiant** du média, jamais son nom ni son URL. Voir [Intégration](./integration.md).
64
+ C'est cette séparation qui permet de renommer un média sans casser quoi que ce soit : les contenus référencent l'**identifiant** du média, jamais son nom ni son URL. Voir [Intégration](./05-integration.md).
65
65
 
66
66
  ### Assainissement du nom public
67
67
 
@@ -96,7 +96,7 @@ Une revalidation dont l'`ETag` correspond reçoit un 304 sans corps, sans lectur
96
96
 
97
97
  Un fichier non image est donc **téléchargé** plutôt qu'affiché, y compris un PDF. C'est une mesure de défense : un document affiché dans le contexte du site pourrait exécuter du script sur son origine.
98
98
 
99
- La route n'exige ni session ni permission. Voir [Configuration](./configuration.md).
99
+ La route n'exige ni session ni permission. Voir [Configuration](./02-configuration.md).
100
100
 
101
101
  ## Remplacer un fichier
102
102
 
@@ -112,4 +112,4 @@ Comme l'URL publique ne change pas, un navigateur ou un CDN peut continuer à se
112
112
  - L'auteur d'un média est facultatif. Un dépôt machine, par une tâche planifiée ou un import, laisse le champ nul et la médiathèque n'affiche alors aucun auteur. Seul un identifiant d'utilisateur réel est accepté par ailleurs, la colonne portant une clé étrangère vers la table des utilisateurs.
113
113
  - La médiathèque permet de télécharger jusqu'à cent médias d'un coup, dans une archive sans recompression, écrite par `createZipStream` du core, un objet à la fois. Un objet absent du stockage est sauté. Un stockage qui ne répond pas interrompt le téléchargement. L'archive porte la date du jour dans le fuseau du site.
114
114
  - La taille enregistrée est celle des octets stockés, après optimisation. Le paramètre `size` d'`uploadMedia` et de `replaceMedia` est ignoré.
115
- - Un média encore référencé par un contenu ne peut pas être supprimé. Le détacher d'abord. Voir [Intégration](./integration.md).
115
+ - Un média encore référencé par un contenu ne peut pas être supprimé. Le détacher d'abord. Voir [Intégration](./05-integration.md).
@@ -4,15 +4,15 @@ description: Médiathèque, filtres, téléversement, sélection multiple, actio
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/televersement
8
- - 06-modules/medias/integration
7
+ - 06-modules/medias/03-televersement
8
+ - 06-modules/medias/05-integration
9
9
  ---
10
10
 
11
11
  Le module ajoute un seul écran à l'admin, `/admin/media`. Tout s'y fait : téléverser,
12
12
  chercher, renommer, remplacer, supprimer, récupérer les URL publiques. Cette page décrit
13
13
  ce que fait l'interface, y compris les quelques comportements qui surprennent.
14
14
 
15
- L'accès demande `media.view` : sans elle, `/admin/media` répond 404, comme une page inconnue. Voir [Configuration](./configuration.md).
15
+ L'accès demande `media.view` : sans elle, `/admin/media` répond 404, comme une page inconnue. Voir [Configuration](./02-configuration.md).
16
16
 
17
17
  ## Ce que chaque permission débloque
18
18
 
@@ -58,7 +58,7 @@ Le bouton accepte plusieurs fichiers d'un coup, mais les envoie **un par un**. U
58
58
  refusé, pour un format ou une taille hors limites, produit son propre message et
59
59
  n'interrompt pas les suivants. Le sélecteur de fichier ne propose que les extensions
60
60
  acceptées, et celui du remplacement que celles de la catégorie du média. Voir
61
- [Téléversement](./televersement.md) pour ce qui est accepté.
61
+ [Téléversement](./03-televersement.md) pour ce qui est accepté.
62
62
 
63
63
  À la fin du lot, la vue revient en première page, là où les nouveaux médias apparaissent.
64
64
  La confirmation compte les fichiers qui ont abouti.
@@ -94,7 +94,7 @@ propose de découper la sélection : la réduire est manuel.
94
94
  suppressions réussies disparaissent de la grille ; celles qui échouent restent
95
95
  sélectionnées, ce qui permet de recommencer sans tout re-pointer. Un média encore
96
96
  référencé par un contenu compte parmi les échecs. Voir
97
- [Intégration](./integration.md).
97
+ [Intégration](./05-integration.md).
98
98
 
99
99
  ## Fiche d'un média
100
100
 
@@ -114,7 +114,7 @@ Renommer vers un nom déjà pris fait échouer l'enregistrement complet : le tex
114
114
  alternatif et la légende saisis en même temps ne sont pas écrits non plus. Corriger le
115
115
  nom, puis enregistrer à nouveau. Le message « Ce nom de fichier est déjà utilisé »
116
116
  apparaît en notification plutôt que sous le champ, pour la raison expliquée dans
117
- [API](./api.md).
117
+ [API](./07-api.md).
118
118
 
119
119
  Un fichier qui n'est pas une image n'a pas d'aperçu. Un lien `Ouvrir le fichier` le sert
120
120
  à la place, ce qui déclenche un téléchargement pour tout ce qui n'est pas une image.
@@ -144,4 +144,4 @@ contenu d'abord.
144
144
  réglables.
145
145
  - L'interface ne montre pas qui a téléversé un média, ni la liste des contenus qui le
146
146
  référencent. Ces deux informations existent en base et sont lisibles par
147
- [l'API](./api.md).
147
+ [l'API](./07-api.md).