@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,20 +4,18 @@ description: Installer @fraza-pro/module-booking, créer les tables, poser l'hor
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/booking/configuration
|
|
8
|
-
- 06-modules/booking/reservation-en-ligne
|
|
7
|
+
- 06-modules/booking/02-configuration
|
|
8
|
+
- 06-modules/booking/04-reservation-en-ligne
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
Cette page
|
|
12
|
-
|
|
13
|
-
Ce module est distribué sous la licence Fraza Pro : son utilisation en production demande une licence par projet, renouvelée chaque année, qui comprend les mises à jour, la conformité et le support. Voir [Licence et propriété](../../04-architecture/07-licence-et-propriete.md).
|
|
11
|
+
Cette page installe `@fraza-pro/module-booking` 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). Son utilisation en production demande une licence Fraza Pro : voir [Licence et propriété](../../04-architecture/07-licence-et-propriete.md).
|
|
14
12
|
|
|
15
13
|
## Prérequis
|
|
16
14
|
|
|
17
|
-
- Un projet
|
|
15
|
+
- Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
|
|
16
|
+
- Le token du registre Fraza dans le `.npmrc` du projet, sans lequel `npm i` échoue : `npm login --registry=https://registry.fraza.ca/`, puis `npx fraza-key`. Voir [Modules Pro](../../01-demarrage/01-installation.md#modules-pro).
|
|
18
17
|
- `NEXT_PUBLIC_URL` renseignée, sinon toute réservation en ligne est rejetée par la vérification d'origine du core.
|
|
19
18
|
- La configuration courriel du core, Resend ou SMTP, pour les confirmations et les rappels.
|
|
20
|
-
- La ligne `@fraza-pro:registry=https://registry.fraza.ca/` et le token du registre dans le `.npmrc` du projet, sans lesquels `npm i` échoue. `npx @fraza/start` écrit déjà la ligne de portée. Le token s'obtient avec `npm login --registry=https://registry.fraza.ca/`, puis `npx fraza-key` le reprend dans le projet. Voir [`fraza-key`](../../03-reference/05-cli/fraza-key.md).
|
|
21
19
|
|
|
22
20
|
## Installer
|
|
23
21
|
|
|
@@ -27,29 +25,25 @@ npm i @fraza-pro/module-booking
|
|
|
27
25
|
|
|
28
26
|
Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
|
|
29
27
|
|
|
30
|
-
```
|
|
28
|
+
```dotenv
|
|
31
29
|
#------ MODULE - BOOKING ------#
|
|
32
30
|
FRAZA_MODULE_BOOKING=true
|
|
33
31
|
```
|
|
34
32
|
|
|
35
33
|
Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin.
|
|
36
34
|
|
|
37
|
-
Régénérer les manifestes puis créer les tables :
|
|
35
|
+
Régénérer les manifestes, puis créer les tables :
|
|
38
36
|
|
|
39
37
|
```bash
|
|
40
38
|
npx fraza-modules sync # déclenché automatiquement au postinstall
|
|
41
39
|
npx fraza-db init # crée les dix tables fraza_booking_*
|
|
42
40
|
```
|
|
43
41
|
|
|
44
|
-
|
|
42
|
+
`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 permissions du module, et les attribue au rôle `admin`. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
45
43
|
|
|
46
44
|
## Version du core
|
|
47
45
|
|
|
48
|
-
Le module
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
npx fraza-update
|
|
52
|
-
```
|
|
46
|
+
Le module suit la dernière version de `@fraza/core` : tous les paquets Fraza à leur dernière version fonctionnent ensemble, et `npx fraza-update` les met à jour ensemble.
|
|
53
47
|
|
|
54
48
|
Un core en retard échoue sans bruit. Il ne dériverait pas `FRAZA_MODULE_BOOKING` du nom du paquet, et le module resterait désactivé, sans erreur. Il lui manquerait aussi trois briques :
|
|
55
49
|
|
|
@@ -57,7 +51,7 @@ Un core en retard échoue sans bruit. Il ne dériverait pas `FRAZA_MODULE_BOOKIN
|
|
|
57
51
|
- [`registerAdminIcons`](../../03-reference/04-partage/icones.md#registeradminicons), qui enregistre les icônes de la section et de ses items, et sans lequel le point d'entrée client du module échoue au chargement ;
|
|
58
52
|
- les fonctions de fuseau horaire de [`shared/dates`](../../03-reference/04-partage/dates.md#fuseaux-horaires), sans lesquelles les créneaux glissent d'une heure deux fois par an.
|
|
59
53
|
|
|
60
|
-
Aucune de ces absences ne lève d'erreur claire à l'usage
|
|
54
|
+
Aucune de ces absences ne lève d'erreur claire à l'usage : garder le core à jour avec le module.
|
|
61
55
|
|
|
62
56
|
## Premier réglage, dans l'ordre
|
|
63
57
|
|
|
@@ -70,9 +64,9 @@ Les trois premières étapes se font dans la page Options, un onglet chacune. L'
|
|
|
70
64
|
|
|
71
65
|
## Ouvrir la prise de rendez-vous en ligne
|
|
72
66
|
|
|
73
|
-
Elle est fermée par défaut. Deux gestes :
|
|
67
|
+
Elle est fermée par défaut. Deux gestes : la variable, dans `.env.local` et dans les variables de la plateforme en production,
|
|
74
68
|
|
|
75
|
-
```
|
|
69
|
+
```dotenv
|
|
76
70
|
FRAZA_MODULE_BOOKING_ONLINE=true
|
|
77
71
|
```
|
|
78
72
|
|
|
@@ -82,8 +76,29 @@ Tant que la variable est à false, un lien parfaitement configuré répond 404,
|
|
|
82
76
|
|
|
83
77
|
## Vérifier
|
|
84
78
|
|
|
79
|
+
1. La connexion à la base répond :
|
|
80
|
+
```bash
|
|
81
|
+
npx fraza-db test
|
|
82
|
+
```
|
|
83
|
+
2. `Rendez-vous` apparaît dans la barre latérale de l'admin.
|
|
84
|
+
3. Le projet est cohérent :
|
|
85
|
+
```bash
|
|
86
|
+
npx fraza-doctor
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Le doctor connaît toutes les variables du module par son manifeste : une variable `FRAZA_MODULE_BOOKING_*` que le manifeste ne déclare pas est dénoncée.
|
|
90
|
+
|
|
91
|
+
## Mettre à jour
|
|
92
|
+
|
|
85
93
|
```bash
|
|
86
|
-
npx fraza-
|
|
94
|
+
npx fraza-update
|
|
87
95
|
```
|
|
88
96
|
|
|
89
|
-
|
|
97
|
+
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-pro/module-booking` seul, par `npm i`, laisserait le core et les autres modules en arrière.
|
|
98
|
+
|
|
99
|
+
Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza-pro/module-booking/CHANGELOG.md`.
|
|
100
|
+
|
|
101
|
+
## Notes
|
|
102
|
+
|
|
103
|
+
- Le module dépend de `@fraza/core` en `peerDependency`. Il n'embarque pas sa propre copie du core.
|
|
104
|
+
- Désinstaller le module ne supprime pas les tables. `dropTables` est exporté depuis `@fraza-pro/module-booking` pour le faire explicitement.
|
|
@@ -4,15 +4,15 @@ description: Variables d'environnement de @fraza-pro/module-booking, permissions
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/booking/admin
|
|
8
|
-
- 06-modules/booking/courriels
|
|
7
|
+
- 06-modules/booking/03-admin
|
|
8
|
+
- 06-modules/booking/05-courriels
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Toutes les variables du module portent le préfixe `FRAZA_MODULE_BOOKING`. Elles se lisent une fois par processus et sont gelées : modifier une valeur demande un redémarrage.
|
|
12
12
|
|
|
13
13
|
## Ce qui n'est pas ici
|
|
14
14
|
|
|
15
|
-
Les types de rendez-vous, les intervenants, les horaires et les liens de réservation sont des **données**, pas de la configuration. Ils se créent dans la page Options de l'admin, sous la permission `booking.options`, et changent sans redéploiement. Voir [Administration](./admin.md).
|
|
15
|
+
Les types de rendez-vous, les intervenants, les horaires et les liens de réservation sont des **données**, pas de la configuration. Ils se créent dans la page Options de l'admin, sous la permission `booking.options`, et changent sans redéploiement. Voir [Administration](./03-admin.md).
|
|
16
16
|
|
|
17
17
|
L'environnement ne porte que ce qui vaut pour tout le site : l'ouverture de la prise en ligne, la forme d'un nouveau type de rendez-vous, les fenêtres de réservation et d'annulation, les rappels et la marque de la page publique.
|
|
18
18
|
|
|
@@ -78,7 +78,7 @@ Le plafond par adresse courriel est compté en base, dans la transaction de rés
|
|
|
78
78
|
| `FRAZA_MODULE_BOOKING_ADMIN_EMAIL` | - | Adresse recevant les avis de l'administration. |
|
|
79
79
|
| `FRAZA_MODULE_BOOKING_CONTACT_EMAIL` | l'adresse ci-dessus | Adresse de réponse des courriels du client. |
|
|
80
80
|
|
|
81
|
-
Voir [Courriels](./courriels.md).
|
|
81
|
+
Voir [Courriels](./05-courriels.md).
|
|
82
82
|
|
|
83
83
|
## Intégration
|
|
84
84
|
|
|
@@ -86,7 +86,7 @@ Voir [Courriels](./courriels.md).
|
|
|
86
86
|
|---|---|---|
|
|
87
87
|
| `FRAZA_MODULE_BOOKING_FRAME_ANCESTORS` | vide (tous les sites) | Sites autorisés à afficher l'assistant dans un cadre : origines, `self` ou `none`. La page de gestion n'est jamais affichée dans un cadre. |
|
|
88
88
|
|
|
89
|
-
Voir [Intégration sur un site externe](./reservation-en-ligne.md#intégration-sur-un-site-externe).
|
|
89
|
+
Voir [Intégration sur un site externe](./04-reservation-en-ligne.md#intégration-sur-un-site-externe).
|
|
90
90
|
|
|
91
91
|
## Marque de la page publique
|
|
92
92
|
|
|
@@ -4,8 +4,8 @@ description: Agenda groupé par échéance, calendrier mois semaine jour, et la
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/booking/reservation-en-ligne
|
|
8
|
-
- 06-modules/booking/courriels
|
|
7
|
+
- 06-modules/booking/04-reservation-en-ligne
|
|
8
|
+
- 06-modules/booking/05-courriels
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
La section Rendez-vous compte trois entrées : **Rendez-vous**, **Calendrier** et **Options**.
|
|
@@ -118,7 +118,7 @@ Les fermetures partielles, globales comme personnelles, sont retranchées en der
|
|
|
118
118
|
|
|
119
119
|
### Liens de réservation
|
|
120
120
|
|
|
121
|
-
`/admin/booking/options/liens`. Voir [Réservation en ligne](./reservation-en-ligne.md).
|
|
121
|
+
`/admin/booking/options/liens`. Voir [Réservation en ligne](./04-reservation-en-ligne.md).
|
|
122
122
|
|
|
123
123
|
## Panneau du tableau de bord
|
|
124
124
|
|
|
@@ -4,8 +4,8 @@ description: Liens de réservation, parcours public, intégration en iframe, ann
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/booking/courriels
|
|
8
|
-
- 06-modules/booking/api
|
|
7
|
+
- 06-modules/booking/05-courriels
|
|
8
|
+
- 06-modules/booking/07-api
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
La prise de rendez-vous en ligne est fermée par défaut. Elle demande `FRAZA_MODULE_BOOKING_ONLINE=true` **et** au moins un lien de réservation actif.
|
|
@@ -4,8 +4,8 @@ description: Confirmation, rappel, annulation, avis internes, fichier .ics et re
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/booking/configuration
|
|
8
|
-
- 06-modules/booking/modele-de-donnees
|
|
7
|
+
- 06-modules/booking/02-configuration
|
|
8
|
+
- 06-modules/booking/06-modele-de-donnees
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Le module met ses messages dans la [file d'envoi](../../03-reference/01-cores/email.md#file-denvoi) de `@fraza/core/email`. Il n'ajoute aucune dépendance : le fournisseur, l'expéditeur et le gabarit de base appartiennent au core.
|
|
@@ -4,7 +4,7 @@ description: Routes HTTP d'administration et publiques de @fraza-pro/module-book
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/booking/reservation-en-ligne
|
|
7
|
+
- 06-modules/booking/04-reservation-en-ligne
|
|
8
8
|
- 03-reference/01-cores/api
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -81,7 +81,7 @@ Trois règles tiennent cette surface :
|
|
|
81
81
|
- **Rien d'interne ne sort.** Chaque réponse passe par une projection explicite : pas d'identifiant numérique de rendez-vous, pas de note interne, pas de courriel d'un autre client, et jamais qui occupe une place.
|
|
82
82
|
- **La fenêtre est plafonnée** à 62 jours par appel, sinon un seul appel peut demander cinq ans de créneaux.
|
|
83
83
|
|
|
84
|
-
`GET /booking/public/link/:slug` rend `formToken`, le jeton de formulaire daté par le serveur, et `POST /book` l'attend dans `_token` (plus `_t`). Un jeton absent, falsifié, émis pour un autre lien ou vieux de plus de 24 heures répond 400 avec le motif `form_expired` et « Le formulaire a expiré. Recharger la page pour reprendre. » Voir [Réservation en ligne](./reservation-en-ligne.md#protection-contre-les-robots).
|
|
84
|
+
`GET /booking/public/link/:slug` rend `formToken`, le jeton de formulaire daté par le serveur, et `POST /book` l'attend dans `_token` (plus `_t`). Un jeton absent, falsifié, émis pour un autre lien ou vieux de plus de 24 heures répond 400 avec le motif `form_expired` et « Le formulaire a expiré. Recharger la page pour reprendre. » Voir [Réservation en ligne](./04-reservation-en-ligne.md#protection-contre-les-robots).
|
|
85
85
|
|
|
86
86
|
Un refus répond l'erreur d'API du core, `{ error, code, message }`, voir [API](../../03-reference/01-cores/api.md#catalogue-des-erreurs). Le message est en français, et le `code` d'un refus de réservation est son motif : `slot_taken`, `too_soon`, `form_expired`… Une donnée refusée par une règle de saisie répond 400, code `bad_request`.
|
|
87
87
|
|
|
@@ -4,17 +4,27 @@ description: Agenda et calendrier dans l'admin, types de rendez-vous, intervenan
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/booking/installation
|
|
8
|
-
- 06-modules/booking/reservation-en-ligne
|
|
7
|
+
- 06-modules/booking/01-installation
|
|
8
|
+
- 06-modules/booking/04-reservation-en-ligne
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
`@fraza-pro/module-booking` ajoute une section Rendez-vous à l'admin et, si le projet l'ouvre, une prise de rendez-vous en ligne servie par une page publique à jeton, intégrable en iframe sur un site externe.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
```bash
|
|
14
|
+
npm i @fraza-pro/module-booking
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| Paquet | `@fraza-pro/module-booking` |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Licence | Fraza Pro : une licence par projet en production, renouvelée chaque année, qui comprend les mises à jour, la conformité et le support. Voir [Licence et propriété](../../04-architecture/07-licence-et-propriete.md). |
|
|
20
|
+
| Registre | `https://registry.fraza.ca/`, avec le token du projet. Voir [Modules Pro](../../01-demarrage/01-installation.md#modules-pro). |
|
|
21
|
+
| Activation | `FRAZA_MODULE_BOOKING=true` |
|
|
22
|
+
|
|
23
|
+
L'activation, la création des tables et le premier horaire sont dans [Installation](./01-installation.md).
|
|
14
24
|
|
|
15
25
|
Les deux moitiés sont indépendantes. Un cabinet qui ne veut qu'un agenda interne active le module et laisse `FRAZA_MODULE_BOOKING_ONLINE` à false : les liens de réservation répondent 404 et seule l'administration crée des rendez-vous.
|
|
16
26
|
|
|
17
|
-
La page de gestion d'un rendez-vous existant n'est pas concernée par cet interrupteur. Elle répond sur son jeton seul, même prise en ligne fermée : un rendez-vous créé par l'admin envoie une confirmation qui porte ce lien, et ce lien doit mener quelque part. Voir [Réservation en ligne](./reservation-en-ligne.md).
|
|
27
|
+
La page de gestion d'un rendez-vous existant n'est pas concernée par cet interrupteur. Elle répond sur son jeton seul, même prise en ligne fermée : un rendez-vous créé par l'admin envoie une confirmation qui porte ce lien, et ce lien doit mener quelque part. Voir [Réservation en ligne](./04-reservation-en-ligne.md).
|
|
18
28
|
|
|
19
29
|

|
|
20
30
|
|
|
@@ -24,13 +34,13 @@ L'agenda groupe ce qui vient par échéance, et le bandeau du haut est la fiche
|
|
|
24
34
|
|
|
25
35
|
| Page | Contenu |
|
|
26
36
|
|---|---|
|
|
27
|
-
| [Installation](./installation.md) | Installer le module, créer les tables, poser le premier horaire. |
|
|
28
|
-
| [Configuration](./configuration.md) | Variables d'environnement, permissions, fuseau horaire. |
|
|
29
|
-
| [Administration](./admin.md) | Agenda, calendrier, et la page Options : types, intervenants, horaires, liens. |
|
|
30
|
-
| [Réservation en ligne](./reservation-en-ligne.md) | Liens de réservation, parcours public, iframe, annulation par le client. |
|
|
31
|
-
| [Courriels](./courriels.md) | Confirmation, rappel, avis internes, fichier `.ics`. |
|
|
32
|
-
| [Modèle de données](./modele-de-donnees.md) | Les dix tables `fraza_booking_*`. |
|
|
33
|
-
| [API](./api.md) | Routes HTTP d'admin et publiques. |
|
|
37
|
+
| [Installation](./01-installation.md) | Installer le module, créer les tables, poser le premier horaire. |
|
|
38
|
+
| [Configuration](./02-configuration.md) | Variables d'environnement, permissions, fuseau horaire. |
|
|
39
|
+
| [Administration](./03-admin.md) | Agenda, calendrier, et la page Options : types, intervenants, horaires, liens. |
|
|
40
|
+
| [Réservation en ligne](./04-reservation-en-ligne.md) | Liens de réservation, parcours public, iframe, annulation par le client. |
|
|
41
|
+
| [Courriels](./05-courriels.md) | Confirmation, rappel, avis internes, fichier `.ics`. |
|
|
42
|
+
| [Modèle de données](./06-modele-de-donnees.md) | Les dix tables `fraza_booking_*`. |
|
|
43
|
+
| [API](./07-api.md) | Routes HTTP d'admin et publiques. |
|
|
34
44
|
|
|
35
45
|
## Ce que le module apporte
|
|
36
46
|
|
|
@@ -74,6 +84,6 @@ Le module n'a aucune dépendance de code au-delà du core, mais trois de ses fon
|
|
|
74
84
|
|
|
75
85
|
## Notes
|
|
76
86
|
|
|
77
|
-
- Le fuseau vient de `FRAZA_TIMEZONE` et rien d'autre. Changer cette variable sur un site en production laisse les instants justes mais rend fausse la colonne `local_date` des rendez-vous déjà pris. Voir [Modèle de données](./modele-de-donnees.md).
|
|
87
|
+
- Le fuseau vient de `FRAZA_TIMEZONE` et rien d'autre. Changer cette variable sur un site en production laisse les instants justes mais rend fausse la colonne `local_date` des rendez-vous déjà pris. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
78
88
|
- Un rendez-vous annulé est le seul qui libère son créneau. Un rendez-vous terminé ou marqué absent a bel et bien occupé le temps.
|
|
79
89
|
- La capacité d'un type de rendez-vous n'autorise pas N rendez-vous qui se chevauchent : elle autorise N participants dans le **même** créneau.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Installation
|
|
3
|
+
description: Installer @fraza-pro/module-drive, créer les tables et régler la taille des tranches d'envoi selon le proxy.
|
|
4
|
+
related:
|
|
5
|
+
title: Étapes suivantes
|
|
6
|
+
links:
|
|
7
|
+
- 06-modules/drive/02-configuration
|
|
8
|
+
- 06-modules/drive/04-partages
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Cette page installe `@fraza-pro/module-drive` 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). Son utilisation en production demande une licence Fraza Pro : voir [Licence et propriété](../../04-architecture/07-licence-et-propriete.md).
|
|
12
|
+
|
|
13
|
+
## Prérequis
|
|
14
|
+
|
|
15
|
+
- Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
|
|
16
|
+
- Le token du registre Fraza dans le `.npmrc` du projet, sans lequel `npm i` échoue : `npm login --registry=https://registry.fraza.ca/`, puis `npx fraza-key`. Voir [Modules Pro](../../01-demarrage/01-installation.md#modules-pro).
|
|
17
|
+
- Un **stockage objet compatible S3** configuré, Backblaze B2 ou Cloudflare R2. Sans lui, le module démarre mais aucun dépôt n'aboutit. Voir [Stocker des fichiers](../../02-guides/stocker-des-fichiers.md).
|
|
18
|
+
- Un **PostgreSQL compilé avec ICU**, pour le tri naturel des noms. C'est le cas des images Docker officielles, et de la compilation par défaut depuis la version 16. Sans ICU, la migration du module s'arrête avec un message qui le dit.
|
|
19
|
+
|
|
20
|
+
## Installer
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm i @fraza-pro/module-drive
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
|
|
27
|
+
|
|
28
|
+
```dotenv
|
|
29
|
+
#------ MODULE - DRIVE ------#
|
|
30
|
+
FRAZA_MODULE_DRIVE=true
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin.
|
|
34
|
+
|
|
35
|
+
Régénérer les manifestes, puis créer les tables :
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx fraza-modules sync # déclenché automatiquement au postinstall
|
|
39
|
+
npx fraza-db init # crée les douze tables fraza_drive_*
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`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 permissions du module, et les attribue au rôle `admin`. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
43
|
+
|
|
44
|
+
Redémarrer ensuite le serveur. L'entrée « Fichiers » apparaît dans la barre latérale de l'admin.
|
|
45
|
+
|
|
46
|
+
## Miniatures d'images
|
|
47
|
+
|
|
48
|
+
`sharp`, dépendance de pair facultative du core, produit les miniatures d'images. Sans elle, le module fonctionne à l'identique, sans vignettes. Le module n'a aucune dépendance de production : l'archive ZIP et les miniatures passent par le core.
|
|
49
|
+
|
|
50
|
+
## Aucune configuration du seau
|
|
51
|
+
|
|
52
|
+
Il n'y a **aucune étape d'infrastructure**. Pas de règle CORS, pas de policy de seau, pas d'URL signée à faire circuler : tous les fichiers transitent par l'application, dans les deux sens, et le navigateur ne parle jamais au stockage.
|
|
53
|
+
|
|
54
|
+
## Derrière un proxy
|
|
55
|
+
|
|
56
|
+
Un proxy plafonne le corps d'une requête. Cloudflare l'arrête à 100 Mo sur le forfait gratuit, et refuse la requête avant qu'elle n'atteigne l'application.
|
|
57
|
+
|
|
58
|
+
C'est pourquoi le navigateur découpe les fichiers : chaque tranche part dans sa propre requête, sous le plafond, et le serveur les réassemble dans le seau. Une tranche vaut 8 Mo par défaut, ce qui passe partout.
|
|
59
|
+
|
|
60
|
+
Si votre proxy plafonne plus bas, alignez `FRAZA_MODULE_DRIVE_UPLOAD_CHUNK_MB` sur cette limite. Le minimum est 5, imposé par le stockage, donc un proxy qui plafonne sous 5 Mo empêche tout envoi de fichier volumineux.
|
|
61
|
+
|
|
62
|
+
Le symptôme d'une valeur trop haute est net : les tranches partent puis échouent avec le code d'erreur du proxy, 413 chez la plupart.
|
|
63
|
+
|
|
64
|
+
## Rien à câbler dans le projet
|
|
65
|
+
|
|
66
|
+
Contrairement à `@fraza/module-medias`, ce module n'a **aucun fichier de route à monter**. Les binaires descendent par les routes `/za/api/drive/...`, qui existent déjà, et la page publique de partage passe par la sous-entrée `./public-page`, prise en charge par `npx fraza-modules sync`.
|
|
67
|
+
|
|
68
|
+
## Vérifier
|
|
69
|
+
|
|
70
|
+
1. La connexion à la base répond :
|
|
71
|
+
```bash
|
|
72
|
+
npx fraza-db test
|
|
73
|
+
```
|
|
74
|
+
2. `Fichiers` apparaît dans la barre latérale de l'admin.
|
|
75
|
+
3. Déposer un fichier dans l'espace partagé, puis le télécharger depuis le navigateur de fichiers.
|
|
76
|
+
|
|
77
|
+
## Mettre à jour
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npx fraza-update
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
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-pro/module-drive` seul, par `npm i`, laisserait le core et les autres modules en arrière.
|
|
84
|
+
|
|
85
|
+
Le schéma évolue par migrations versionnées : la migration doit passer avant de servir la nouvelle version. Le code s'appuie sur le schéma migré : sans la collation de tri, par exemple, les listes de fichiers échouent.
|
|
86
|
+
|
|
87
|
+
Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza-pro/module-drive/CHANGELOG.md`.
|
|
88
|
+
|
|
89
|
+
## Notes
|
|
90
|
+
|
|
91
|
+
- Le module dépend de `@fraza/core` en `peerDependency`. Il n'embarque pas sa propre copie du core.
|
|
92
|
+
- Désinstaller le module ne supprime pas les tables. `dropTables` est exporté depuis `@fraza-pro/module-drive` pour le faire explicitement.
|
|
@@ -4,8 +4,8 @@ description: Variables d'environnement du module Fichiers, espaces personnels, q
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/drive/admin
|
|
8
|
-
- 06-modules/drive/fichiers
|
|
7
|
+
- 06-modules/drive/03-admin
|
|
8
|
+
- 06-modules/drive/05-fichiers
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Variables d'environnement
|
|
@@ -37,7 +37,7 @@ related:
|
|
|
37
37
|
| `FRAZA_MODULE_DRIVE_LOGO_URL_DARK` | valeur de `..._LOGO_URL` | Logo de la page publique, thème sombre. |
|
|
38
38
|
| `FRAZA_MODULE_DRIVE_SITE_URL` | `FRAZA_SITE_URL` | Destination du lien posé autour du logo. |
|
|
39
39
|
|
|
40
|
-
La taille de tranche décide aussi de la voie d'envoi : un fichier qui tient dedans part en une requête, un fichier plus gros est découpé. Elle ne concerne que l'envoi, jamais la lecture : un téléchargement est streamé quelle que soit sa taille. Voir [Fichiers acceptés](./fichiers.md).
|
|
40
|
+
La taille de tranche décide aussi de la voie d'envoi : un fichier qui tient dedans part en une requête, un fichier plus gros est découpé. Elle ne concerne que l'envoi, jamais la lecture : un téléchargement est streamé quelle que soit sa taille. Voir [Fichiers acceptés](./05-fichiers.md).
|
|
41
41
|
|
|
42
42
|
Relever `FRAZA_MODULE_DRIVE_MAX_FILE_SIZE_MB` très au delà de 80 Go sans relever la taille de tranche finit par dépasser les 10 000 parts qu'accepte le stockage. Le module refuse alors l'envoi en nommant l'incohérence plutôt que d'échouer à l'assemblage.
|
|
43
43
|
|
|
@@ -55,13 +55,13 @@ Le nom vient de `FRAZA_NAME` par défaut, le logo et la cible du lien de `FRAZA_
|
|
|
55
55
|
|
|
56
56
|
Désactivés par défaut. Une fois `FRAZA_MODULE_DRIVE_PERSONAL_SPACES=true`, un item « Mes fichiers » apparaît dans la barre latérale et chaque utilisateur obtient son espace à sa première visite. Rien n'est créé pour les comptes qui n'y vont jamais.
|
|
57
57
|
|
|
58
|
-
Un espace personnel n'appartient qu'à son propriétaire. Un administrateur ne l'ouvre pas : ce n'est pas du contenu d'équipe. Ce qui doit être vu par d'autres passe par un [partage](./partages.md), lien public ou partage interne.
|
|
58
|
+
Un espace personnel n'appartient qu'à son propriétaire. Un administrateur ne l'ouvre pas : ce n'est pas du contenu d'équipe. Ce qui doit être vu par d'autres passe par un [partage](./04-partages.md), lien public ou partage interne.
|
|
59
59
|
|
|
60
60
|
Désactiver l'option ne supprime rien : les espaces existants deviennent inaccessibles depuis l'interface, et redeviennent visibles si l'option est réactivée.
|
|
61
61
|
|
|
62
62
|
## Favoris
|
|
63
63
|
|
|
64
|
-
Désactivés par défaut. Une fois `FRAZA_MODULE_DRIVE_FAVORITES=true`, un item « Favoris » apparaît dans la barre latérale, sous « Fichiers », et le menu de chaque fichier ou dossier porte « Ajouter aux favoris ». Voir [Les favoris](./admin.md#les-favoris).
|
|
64
|
+
Désactivés par défaut. Une fois `FRAZA_MODULE_DRIVE_FAVORITES=true`, un item « Favoris » apparaît dans la barre latérale, sous « Fichiers », et le menu de chaque fichier ou dossier porte « Ajouter aux favoris ». Voir [Les favoris](./03-admin.md#les-favoris).
|
|
65
65
|
|
|
66
66
|
La table `fraza_drive_favorite` existe que l'option soit active ou non. Désactiver l'option ne supprime rien : les favoris de chacun réapparaissent si elle est réactivée.
|
|
67
67
|
|
|
@@ -4,8 +4,8 @@ description: Le navigateur de fichiers, la recherche, la corbeille, l'historique
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/drive/partages
|
|
8
|
-
- 06-modules/drive/api
|
|
7
|
+
- 06-modules/drive/04-partages
|
|
8
|
+
- 06-modules/drive/07-api
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Cliquer sur « Fichiers » dans la barre latérale ouvre le **navigateur**, à la racine de l'espace partagé. C'est la première fenêtre du module.
|
|
@@ -42,14 +42,14 @@ Plusieurs de ces mesures répondent à une question voisine de celle qu'on leur
|
|
|
42
42
|
- **« Dans la corbeille » est ce que la purge libérerait**, versions antérieures comprises. C'est la réponse à « pourquoi mon quota ne baisse pas après une suppression ». La ligne n'apparaît que lorsque la corbeille occupe quelque chose : sur une corbeille vide, il n'y a rien à récupérer et rien à dire. Voir [La corbeille](#la-corbeille).
|
|
43
43
|
- **Dans « Fichiers récents », un élément est daté de sa dernière modification.** Téléverser une nouvelle version le fait remonter en tête, sous la mention « Modifié » ; un élément neuf porte « Créé ».
|
|
44
44
|
- **La répartition par type compte des fichiers, pas des octets**, et classe par extension. Les familles sont exactement celles qui colorent les icônes du navigateur : un fichier violet dans la liste est compté dans « Images ». Sons, vidéos et présentations tombent dans « Autres », comme ils restent en gris dans la liste. Voir [Le navigateur](#le-navigateur).
|
|
45
|
-
- **« Aucune limite configurée » est l'état par défaut**, pas une panne. Sans `FRAZA_MODULE_DRIVE_QUOTA_TOTAL_GB`, le panneau montre le volume occupé sans barre : une barre sans plafond ne représente rien. Voir [Configuration](./configuration.md).
|
|
45
|
+
- **« Aucune limite configurée » est l'état par défaut**, pas une panne. Sans `FRAZA_MODULE_DRIVE_QUOTA_TOTAL_GB`, le panneau montre le volume occupé sans barre : une barre sans plafond ne représente rien. Voir [Configuration](./02-configuration.md).
|
|
46
46
|
- **La section par espace n'apparaît qu'avec les espaces personnels activés.** Elle montre des volumes, jamais du contenu : la règle qui interdit à un administrateur d'ouvrir l'espace personnel d'un autre reste entière.
|
|
47
47
|
|
|
48
48
|
### La ligne d'alerte
|
|
49
49
|
|
|
50
50
|
« Stockage » en porte une, et elle reste muette tant qu'aucune action n'est attendue. Elle signale les pannes qui ne se voient nulle part ailleurs : personne ne remarque une purge qui ne tourne plus avant que le stockage ne déborde. Une tâche planifiée en échec, un téléversement resté en travers, des objets purgés que le stockage refuse de supprimer ou les tâches planifiées désactivées y passent, parce que tous font gonfler l'occupation sans qu'on le voie.
|
|
51
51
|
|
|
52
|
-
L'état des liens de dépôt ne se lit pas sur le tableau de bord : il se lit sur la page des partages, où chaque lien porte son type, son état, sa cadence d'avis et son dernier accès. Un avis de dépôt resté en souffrance, lui, ne s'annonce nulle part dans l'administration : il se constate dans la file `fraza_drive_notification`. Voir [Partages](./partages.md) et [Modèle de données](./modele-de-donnees.md).
|
|
52
|
+
L'état des liens de dépôt ne se lit pas sur le tableau de bord : il se lit sur la page des partages, où chaque lien porte son type, son état, sa cadence d'avis et son dernier accès. Un avis de dépôt resté en souffrance, lui, ne s'annonce nulle part dans l'administration : il se constate dans la file `fraza_drive_notification`. Voir [Partages](./04-partages.md) et [Modèle de données](./06-modele-de-donnees.md).
|
|
53
53
|
|
|
54
54
|
## Le navigateur
|
|
55
55
|
|
|
@@ -67,7 +67,7 @@ Les dossiers passent toujours avant les fichiers, quel que soit le tri.
|
|
|
67
67
|
|
|
68
68
|
Le tri par nom suit l'ordre naturel des nombres : « Période 2 » vient avant « Période 10 », sans qu'il faille écrire « 02 ». Il ignore la casse, et une lettre accentuée se range avec sa lettre de base. Le même ordre vaut dans « Partagés avec moi », dans la fenêtre « Déplacer » et sur la page publique d'un lien de partage.
|
|
69
69
|
|
|
70
|
-
Chaque ligne porte l'icône pleine de son type : un dossier, ou une feuille dont l'étiquette écrit l'extension (PDF, DOC, XLS, PNG…). Les formats d'image sans étiquette propre (WebP, AVIF, BMP, HEIC) portent « IMG », un type inconnu une feuille nue. Ces icônes sont dessinées par le module, et la même icône pleine sert à l'aperçu du glissement et à l'arborescence de **Déplacer**. Les boutons et les menus, eux, gardent les icônes de l'interface. L'icône est colorée par famille : les dossiers en jaune, les documents et fichiers texte en bleu, les tableurs en vert, les PDF et les archives en rouge, les images en violet. Le reste, sons, vidéos et présentations, garde le gris. La couleur sert à repérer une ligne d'un coup d'œil, jamais à dire un état : un fichier en erreur ou expiré s'annonce ailleurs. Elle vaut partout où une icône de fichier apparaît, jusque sur la page publique d'un lien de partage, et `FRAZA_MODULE_DRIVE_ICON_COLORS=false` ramène l'ensemble au gris. Ces couleurs sont catégorielles : elles ne suivent pas le thème du projet, pour que deux familles ne se confondent jamais sous une couleur de marque. Le gris, lui, est celui du thème. Voir [Configuration](./configuration.md).
|
|
70
|
+
Chaque ligne porte l'icône pleine de son type : un dossier, ou une feuille dont l'étiquette écrit l'extension (PDF, DOC, XLS, PNG…). Les formats d'image sans étiquette propre (WebP, AVIF, BMP, HEIC) portent « IMG », un type inconnu une feuille nue. Ces icônes sont dessinées par le module, et la même icône pleine sert à l'aperçu du glissement et à l'arborescence de **Déplacer**. Les boutons et les menus, eux, gardent les icônes de l'interface. L'icône est colorée par famille : les dossiers en jaune, les documents et fichiers texte en bleu, les tableurs en vert, les PDF et les archives en rouge, les images en violet. Le reste, sons, vidéos et présentations, garde le gris. La couleur sert à repérer une ligne d'un coup d'œil, jamais à dire un état : un fichier en erreur ou expiré s'annonce ailleurs. Elle vaut partout où une icône de fichier apparaît, jusque sur la page publique d'un lien de partage, et `FRAZA_MODULE_DRIVE_ICON_COLORS=false` ramène l'ensemble au gris. Ces couleurs sont catégorielles : elles ne suivent pas le thème du projet, pour que deux familles ne se confondent jamais sous une couleur de marque. Le gris, lui, est celui du thème. Voir [Configuration](./02-configuration.md).
|
|
71
71
|
|
|
72
72
|
### Déposer
|
|
73
73
|
|
|
@@ -91,7 +91,7 @@ C'est aussi le seul chemin vers l'**historique des versions** d'un fichier sans
|
|
|
91
91
|
|
|
92
92
|
La colonne « Partage » porte une icône sur les éléments diffusés, et rien sur les autres. Une icône de chaîne annonce un **lien public actif**, une icône de personnes un **partage interne**. Les deux peuvent figurer ensemble sur la même ligne.
|
|
93
93
|
|
|
94
|
-
Un lien n'est actif que s'il est utilisable : ni révoqué, ni expiré, ni arrivé à son plafond de téléchargements. Un lien épuisé disparaît donc de la colonne sans qu'il faille le révoquer à la main. C'est la même règle que l'état affiché dans [Partages](./partages.md).
|
|
94
|
+
Un lien n'est actif que s'il est utilisable : ni révoqué, ni expiré, ni arrivé à son plafond de téléchargements. Un lien épuisé disparaît donc de la colonne sans qu'il faille le révoquer à la main. C'est la même règle que l'état affiché dans [Partages](./04-partages.md).
|
|
95
95
|
|
|
96
96
|
L'icône ne dit que le **partage direct**. Un fichier rangé dans un dossier diffusé reste vierge : c'est le dossier qui porte la marque, et lui seul. Sinon un même partage marquerait des centaines de lignes sans dire laquelle le porte vraiment.
|
|
97
97
|
|
|
@@ -119,7 +119,7 @@ Choisir un compte, créer un lien ou ouvrir les paramètres d'un lien **remplace
|
|
|
119
119
|
|---|---|
|
|
120
120
|
| **Partager avec une personne** | Le compte, modifiable, et son rôle. |
|
|
121
121
|
| **Nouveau lien** | Un nom facultatif, le rôle, un mot de passe facultatif, une expiration facultative. Sur un dossier, le chevron du bouton « Créer un lien » permet de partir directement d'un autre rôle. À la création, l'adresse est copiée. |
|
|
122
|
-
| **Paramètres du lien** | Nom, échéance, plafond, mot de passe, avis de dépôt, et les droits fins d'un lien de gestion. Voir [Partages](./partages.md#réglages). |
|
|
122
|
+
| **Paramètres du lien** | Nom, échéance, plafond, mot de passe, avis de dépôt, et les droits fins d'un lien de gestion. Voir [Partages](./04-partages.md#réglages). |
|
|
123
123
|
|
|
124
124
|
### Sélectionner
|
|
125
125
|
|
|
@@ -273,6 +273,6 @@ Un dossier partagé qui vit dans un espace que vous ouvrez vous-même, l'espace
|
|
|
273
273
|
|
|
274
274
|
## Ce qui ne se règle pas ici
|
|
275
275
|
|
|
276
|
-
Rien de la configuration du module : quotas, seuils d'envoi, durées de rétention et tâches planifiées sont des variables d'environnement, et l'administration n'en modifie aucune. Voir [Configuration](./configuration.md).
|
|
276
|
+
Rien de la configuration du module : quotas, seuils d'envoi, durées de rétention et tâches planifiées sont des variables d'environnement, et l'administration n'en modifie aucune. Voir [Configuration](./02-configuration.md).
|
|
277
277
|
|
|
278
278
|
Quand l'espace ouvert a un quota, une barre d'occupation apparaît au dessus de la liste **à partir de 90 %**. En dessous, elle reste masquée : la mesure n'appelle aucune décision et la place revient aux fichiers.
|
|
@@ -4,8 +4,8 @@ description: Liens publics avec expiration et mot de passe, rôles de partage, p
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/drive/admin
|
|
8
|
-
- 06-modules/drive/api
|
|
7
|
+
- 06-modules/drive/03-admin
|
|
8
|
+
- 06-modules/drive/07-api
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Deux mécanismes distincts, qui ne répondent pas à la même question.
|
|
@@ -14,7 +14,7 @@ Un **lien public** s'adresse à quelqu'un qui n'a pas de compte : un client, un
|
|
|
14
14
|
|
|
15
15
|
Un **partage interne** s'adresse à un collègue déjà dans l'application. L'élément apparaît dans son écran « Partagé avec moi », et l'accès suit sa session.
|
|
16
16
|
|
|
17
|
-
Les deux se créent depuis la même fenêtre, ouverte par le menu d'une ligne du navigateur, et le navigateur les signale ensuite dans sa colonne « Partage ». Voir [Administration](./admin.md).
|
|
17
|
+
Les deux se créent depuis la même fenêtre, ouverte par le menu d'une ligne du navigateur, et le navigateur les signale ensuite dans sa colonne « Partage ». Voir [Administration](./03-admin.md).
|
|
18
18
|
|
|
19
19
|
## Les rôles
|
|
20
20
|
|
|
@@ -102,7 +102,7 @@ L'écran « Partages » liste les liens de l'espace partagé et de votre espace
|
|
|
102
102
|
|
|
103
103
|
## La page publique
|
|
104
104
|
|
|
105
|
-
Servie à `/za/drive/<jeton>`, hors de l'administration, sans compte. Elle porte le logo et le nom du site, réglés par les variables décrites dans [Configuration](./configuration.md#marque-de-la-page-publique), et une bascule de thème clair / sombre : le destinataire n'a pas d'autre écran pour la régler.
|
|
105
|
+
Servie à `/za/drive/<jeton>`, hors de l'administration, sans compte. Elle porte le logo et le nom du site, réglés par les variables décrites dans [Configuration](./02-configuration.md#marque-de-la-page-publique), et une bascule de thème clair / sombre : le destinataire n'a pas d'autre écran pour la régler.
|
|
106
106
|
|
|
107
107
|
Le cadre est celui du core, commun à toutes les pages publiques des modules : un destinataire qui reçoit ensuite un lien de rendez-vous ou une facture du même site reconnaît la page. Voir [Pages publiques](../../04-architecture/06-design-system.md#pages-publiques).
|
|
108
108
|
|
|
@@ -195,7 +195,7 @@ Avant de partir, la page demande ce que l'archive écartera, au-delà de 500 fic
|
|
|
195
195
|
|
|
196
196
|
### Miniatures et aperçus
|
|
197
197
|
|
|
198
|
-
La liste affiche les miniatures d'images. Un clic ouvre la visionneuse décrite dans [Fichiers acceptés](./fichiers.md#aperçus), la même qu'en administration.
|
|
198
|
+
La liste affiche les miniatures d'images. Un clic ouvre la visionneuse décrite dans [Fichiers acceptés](./05-fichiers.md#aperçus), la même qu'en administration.
|
|
199
199
|
|
|
200
200
|
Les deux suivent le droit de télécharger. Une miniature est une copie réduite du fichier, jusqu'à 512 pixels de côté, assez pour livrer l'essentiel d'une photo ou d'une capture. **Un lien qui ne permet pas de télécharger ne montre donc ni miniature ni aperçu** : la liste garde l'icône du type, et le serveur annonce `has_thumbnail: false`. Sur un lien plafonné, l'aperçu n'est pas proposé, parce qu'il compterait comme un téléchargement.
|
|
201
201
|
|
|
@@ -4,8 +4,8 @@ description: Liste noire d'extensions, taille maximale, envoi par tranches, vers
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/drive/partages
|
|
8
|
-
- 06-modules/drive/modele-de-donnees
|
|
7
|
+
- 06-modules/drive/04-partages
|
|
8
|
+
- 06-modules/drive/06-modele-de-donnees
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Une liste noire, pas une liste blanche
|
|
@@ -48,7 +48,7 @@ Tous les fichiers transitent par l'application. Le navigateur ne parle jamais au
|
|
|
48
48
|
|
|
49
49
|
Un fichier qui tient dans une tranche part en une seule requête. Un fichier plus gros est découpé par le navigateur, et chaque tranche part dans sa propre requête. Le serveur pousse chaque tranche comme une part d'un téléversement en plusieurs parties, et le seau assemble à la fin : la mémoire du serveur vaut une tranche, quelle que soit la taille du fichier.
|
|
50
50
|
|
|
51
|
-
Le découpage n'est pas une optimisation. Un proxy plafonne le corps d'une requête, 100 Mo chez Cloudflare sur le forfait gratuit, et il la refuse avant que l'application ne voie le premier octet : découper à la réception serait sans effet. Voir [Installation](./installation.md#derrière-un-proxy) pour aligner la taille de tranche sur votre proxy.
|
|
51
|
+
Le découpage n'est pas une optimisation. Un proxy plafonne le corps d'une requête, 100 Mo chez Cloudflare sur le forfait gratuit, et il la refuse avant que l'application ne voie le premier octet : découper à la réception serait sans effet. Voir [Installation](./01-installation.md#derrière-un-proxy) pour aligner la taille de tranche sur votre proxy.
|
|
52
52
|
|
|
53
53
|
Une tranche qui échoue est réessayée seule, sans reprendre le fichier depuis le début. Un rechargement de page, lui, perd la référence au fichier : l'envoi doit être relancé.
|
|
54
54
|
|
|
@@ -92,6 +92,6 @@ La vidéo et l'audio sont servis par plages d'octets : la lecture démarre sans
|
|
|
92
92
|
|
|
93
93
|
Les autres aperçus chargent le fichier entier dans l'onglet, ce qui les plafonne à 50 Mo. Au delà, la visionneuse propose le téléchargement plutôt qu'un aperçu qui figerait le navigateur.
|
|
94
94
|
|
|
95
|
-
La visionneuse sert aussi la [page publique de partage](./partages.md#miniatures-et-aperçus), aux mêmes conditions et avec le même code : seules changent les adresses qu'elle interroge. Un lien qui ne permet pas de télécharger n'ouvre aucun aperçu ni miniature, parce que les routes qui servent les octets exigent ce droit.
|
|
95
|
+
La visionneuse sert aussi la [page publique de partage](./04-partages.md#miniatures-et-aperçus), aux mêmes conditions et avec le même code : seules changent les adresses qu'elle interroge. Un lien qui ne permet pas de télécharger n'ouvre aucun aperçu ni miniature, parce que les routes qui servent les octets exigent ce droit.
|
|
96
96
|
|
|
97
97
|
Les miniatures sont dessinées par [`createThumbnail`](../../03-reference/01-cores/image.md) du core, et demandent donc `sharp`. Celui-ci redresse l'orientation EXIF, retire les métadonnées, refuse une image au-delà de `FRAZA_IMAGE_MAX_PIXELS` avant de la décoder, et en traite au plus `FRAZA_IMAGE_CONCURRENCY` à la fois. Sans sharp, ou pour une image refusée, le module montre une icône par type de fichier à la place de la vignette. Un fichier assemblé par tranches n'obtient une miniature que sous 32 Mo : au delà, la relire pour la miniaturiser rouvrirait le problème de mémoire que le découpage vient de fermer.
|
|
@@ -4,8 +4,8 @@ description: Les douze tables fraza_drive_*, la table unique des dossiers et fic
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/drive/api
|
|
8
|
-
- 06-modules/drive/configuration
|
|
7
|
+
- 06-modules/drive/07-api
|
|
8
|
+
- 06-modules/drive/02-configuration
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Douze tables, toutes préfixées `fraza_drive_`. Elles sont créées par `npx fraza-db init` et supprimées par `npx fraza-db drop`.
|
|
@@ -4,8 +4,8 @@ description: Routes d'administration et routes publiques de partage du module Fi
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/drive/partages
|
|
8
|
-
- 06-modules/drive/modele-de-donnees
|
|
7
|
+
- 06-modules/drive/04-partages
|
|
8
|
+
- 06-modules/drive/06-modele-de-donnees
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Toutes les routes sont servies sous `/za/api/` par le gestionnaire générique du core. Aucun fichier de route n'est à monter dans le projet.
|
|
@@ -110,7 +110,7 @@ Les deux voies streament le binaire à travers l'application, sans limite de tai
|
|
|
110
110
|
|
|
111
111
|
Les en-têtes de ces réponses sont ceux de [`buildFileResponse`](../../03-reference/01-cores/api.md#buildfileresponserequest-file) du core. L'`ETag` est une empreinte de la clé de stockage, qui change à chaque version, et ne révèle pas la clé : une revalidation qui correspond reçoit un 304 sans lecture au stockage. Une plage répond 206 et ne lit que sa tranche, une plage hors du fichier répond 416. `Cache-Control` vaut `private, no-cache` : le navigateur garde sa copie mais la revalide à chaque usage, si bien qu'un accès retiré l'est dès la requête suivante. La miniature reste cinq minutes en cache (`private, max-age=300`) avant d'être revalidée, parce qu'une grille en affiche des dizaines. Un objet que le stockage n'a plus répond 404, « Fichier introuvable dans le stockage. » pour `raw` et « Aperçu introuvable. » pour la miniature, sans être gardé en cache : une grille dont une clé manque affiche une case vide, pas une erreur serveur. Un stockage qui ne répond pas donne un 500.
|
|
112
112
|
|
|
113
|
-
`download` sert le bouton de téléchargement, en pièce jointe. Elle refuse les plages et les requêtes conditionnelles, et elle écrit au journal et décompte le plafond d'un partage, comme `raw` depuis le premier octet : un clic vaut une entrée. Sa réponse ne porte ni `ETag` ni `Last-Modified`, et n'est jamais un 304 : le téléchargement est compté avant la réponse, et un 304 sans corps décompterait un partage sans qu'aucun octet ne parte. Elle ouvre l'objet avant de répondre, si bien qu'un fichier absent du stockage répond « introuvable » sans être compté. Voir [Fichiers acceptés](./fichiers.md).
|
|
113
|
+
`download` sert le bouton de téléchargement, en pièce jointe. Elle refuse les plages et les requêtes conditionnelles, et elle écrit au journal et décompte le plafond d'un partage, comme `raw` depuis le premier octet : un clic vaut une entrée. Sa réponse ne porte ni `ETag` ni `Last-Modified`, et n'est jamais un 304 : le téléchargement est compté avant la réponse, et un 304 sans corps décompterait un partage sans qu'aucun octet ne parte. Elle ouvre l'objet avant de répondre, si bien qu'un fichier absent du stockage répond « introuvable » sans être compté. Voir [Fichiers acceptés](./05-fichiers.md).
|
|
114
114
|
|
|
115
115
|
`GET /drive/download-zip?ids=a,b,c` sert l'archive d'une sélection, cent identifiants au plus. Elle s'ouvre par une ancre : le navigateur l'écrit sur le disque au fil de l'eau, et l'annuler ferme la lecture du stockage. Un identifiant que l'appelant n'atteint pas, ou qu'un partage interne lui ouvre sans le droit de télécharger, est écarté sans faire échouer le reste ; la route répond « introuvable » quand il ne reste rien. L'archive est écrite par `createZipStream` du core (sans compression, ZIP64, noms UTF-8, doublons renommés) et plafonnée à 500 fichiers et 5 Go.
|
|
116
116
|
|
|
@@ -272,13 +272,13 @@ Le déverrouillage a deux compteurs. Le préréglage `share_unlock` de la route
|
|
|
272
272
|
| `GET` | `/drive/public/:token/upload/:id` | Tranches déjà reçues. |
|
|
273
273
|
| `DELETE` | `/drive/public/:token/upload/:id` | Abandon de la session. |
|
|
274
274
|
|
|
275
|
-
`GET /drive/public/:token` renvoie `share`, `summary` et `config`. `share` porte le plafond de téléchargements et ce qu'il en reste, `null` en l'absence de plafond. Il ne porte **pas** le nom du lien : ce nom est une note interne du propriétaire, décrite dans [Partages](./partages.md#le-titre-et-la-phrase-den-tête), et la réponse verrouillée qui précède la saisie du mot de passe ne le porte pas davantage. `summary` porte le nombre d'éléments à la racine, ou la taille pour un lien sur un fichier, et vaut `null` en mode dépôt. `config` porte la taille d'une tranche d'envoi, la taille maximale d'un fichier et la couleur des icônes.
|
|
275
|
+
`GET /drive/public/:token` renvoie `share`, `summary` et `config`. `share` porte le plafond de téléchargements et ce qu'il en reste, `null` en l'absence de plafond. Il ne porte **pas** le nom du lien : ce nom est une note interne du propriétaire, décrite dans [Partages](./04-partages.md#le-titre-et-la-phrase-den-tête), et la réponse verrouillée qui précède la saisie du mot de passe ne le porte pas davantage. `summary` porte le nombre d'éléments à la racine, ou la taille pour un lien sur un fichier, et vaut `null` en mode dépôt. `config` porte la taille d'une tranche d'envoi, la taille maximale d'un fichier et la couleur des icônes.
|
|
276
276
|
|
|
277
277
|
`GET /drive/public/:token/nodes` renvoie une **projection** des éléments, pas la ligne de la table : identifiant, nom, nature, taille, type, date de modification, numéro de version, et un booléen `has_thumbnail`. La clé de stockage, la clé de miniature, l'espace d'origine et le nom de l'auteur du dépôt n'en font pas partie. Ce dernier est une donnée personnelle d'un tiers, que rien ne justifiait de servir au détenteur d'un lien.
|
|
278
278
|
|
|
279
279
|
Cette route accepte `parentId`, `sort`, `direction`, `page` et `limit`, et renvoie sa pagination. Elle n'accepte ni `q` ni `scope` : un partage se parcourt, il ne se fouille pas, et relayer `scope` aurait rendu la portée du lien inopérante.
|
|
280
280
|
|
|
281
|
-
`GET /drive/public/:token/download-zip` sert en pièce jointe l'archive du dossier désigné par `parentId`, la racine du partage à défaut. Elle exige le droit de télécharger, refuse un lien qui ne porte qu'un fichier, et n'accepte aucune liste d'identifiants : la cible est un dossier du partage, et le visiteur n'a pas de sélection à composer. L'archive vaut **un seul téléchargement** sur le plafond du lien, pas un par fichier, et une seule entrée au journal. Elle est assemblée à la volée, entrée par entrée, dans les mêmes limites que celle de [l'administration](./admin.md). La page publique appelle d'abord `download-zip/check` (même `parentId`, même réponse que côté administration) : un dossier trop gros répond un message au lieu d'ouvrir une page d'erreur à la place du fichier.
|
|
281
|
+
`GET /drive/public/:token/download-zip` sert en pièce jointe l'archive du dossier désigné par `parentId`, la racine du partage à défaut. Elle exige le droit de télécharger, refuse un lien qui ne porte qu'un fichier, et n'accepte aucune liste d'identifiants : la cible est un dossier du partage, et le visiteur n'a pas de sélection à composer. L'archive vaut **un seul téléchargement** sur le plafond du lien, pas un par fichier, et une seule entrée au journal. Elle est assemblée à la volée, entrée par entrée, dans les mêmes limites que celle de [l'administration](./03-admin.md). La page publique appelle d'abord `download-zip/check` (même `parentId`, même réponse que côté administration) : un dossier trop gros répond un message au lieu d'ouvrir une page d'erreur à la place du fichier.
|
|
282
282
|
|
|
283
283
|
Aucune de ces routes n'est exemptée du contrôle CSRF : les dépôts partent de la page publique du même site, donc le contrôle d'origine du routeur les laisse passer sans exception.
|
|
284
284
|
|