@lystech/sections 0.4.6 → 0.5.0

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/README.md CHANGED
@@ -93,6 +93,42 @@ si la personne est administratrice : un lien qui fuite ne peut pas ouvrir la
93
93
  console. Le droit est relu dans les rôles à chaque requête, donc retirer un
94
94
  accès ferme les jetons déjà émis sur-le-champ.
95
95
 
96
+ ### Des gestes propres au site : `appelEdition`
97
+
98
+ Un site peut offrir, à la personne connectée, des gestes que l'éditeur
99
+ générique ne connaît pas — retirer un résultat, masquer un évènement. Le
100
+ contexte fournit un appel qui porte le jeton, sans jamais en livrer la valeur :
101
+
102
+ ```tsx
103
+ const ctx = useSectionsContext();
104
+ if (ctx?.modeEdition) {
105
+ const r = await ctx.appelEdition("/results/site/droits");
106
+ }
107
+ ```
108
+
109
+ Seuls les chemins de l'API sont acceptés. Un `401` fait sortir du mode édition
110
+ (jeton expiré) ; un `403` revient tel quel. C'est la ROUTE qui décide de ce que
111
+ le jeton ouvre : plafonné à l'éditeur partout, il n'obtient plus qu'en de rares
112
+ routes qui le disent explicitement (ex. `/results/site`, admins seulement).
113
+
114
+ ### Des boutons qui restent des boutons
115
+
116
+ En mode « modifier », cliquer un texte le corrige au lieu de l'actionner — mais
117
+ seulement un texte qui a un bloc déclaré où s'enregistrer. Pour qu'une zone
118
+ reste actionnable quoi qu'il arrive (une suppression et sa confirmation), posez
119
+ `CLASSE_HORS_EDITION` dessus — et sur `rootClassName` des fenêtres surgissantes,
120
+ qui se rendent hors de l'arbre :
121
+
122
+ ```tsx
123
+ <section className={CLASSE_HORS_EDITION}>…</section>
124
+ <Popconfirm rootClassName={CLASSE_HORS_EDITION} …>
125
+ ```
126
+
127
+ ### Un site qui signe déjà
128
+
129
+ `<SignatureLystech mention={null} />` ne garde que le bouton « Connexion » —
130
+ pour un pied de page qui porte déjà sa propre mention de Lystech.
131
+
96
132
  ## Sites prérendus
97
133
 
98
134
  Un site généré au build affiche les replis du code dans son HTML, puis bascule
@@ -35,6 +35,25 @@ type Contexte = {
35
35
  * marchait.
36
36
  */
37
37
  declarerRepli: (blockType: string, defaut: unknown) => void;
38
+ /**
39
+ * APPELER L'API LYSTECH AU NOM DE LA PERSONNE CONNECTÉE.
40
+ *
41
+ * Pour les gestes propres à un site — retirer un résultat, masquer un
42
+ * évènement — que l'éditeur générique ne connaît pas. Le site ne reçoit
43
+ * jamais la valeur du jeton : il obtient un appel qui le porte, et c'est
44
+ * le paquet qui décide où il part. Seuls les chemins de l'API sont
45
+ * acceptés (« /results/site/droits ») : collé à `apiBaseUrl`, un chemin ne
46
+ * peut pas changer de serveur.
47
+ *
48
+ * Le serveur reste seul juge de ce que le jeton autorise : ce que l'appel
49
+ * ouvre, c'est ce que la route accepte pour cette personne, pas plus.
50
+ *
51
+ * Un 401 veut dire que le jeton ne vaut plus rien : on sort du mode
52
+ * édition, comme l'éditeur le fait pour ses propres appels. Un 403, lui,
53
+ * est une réponse normale (« pas pour vous ») et revient telle quelle.
54
+ * Hors mode édition, l'appel échoue sans rien envoyer.
55
+ */
56
+ appelEdition: (chemin: string, init?: RequestInit) => Promise<Response>;
38
57
  };
39
58
  export declare function SectionsProvider({ site, page, langue, apiBaseUrl, sectionsInitiales, sourceTexte, pagesPartagees, children, }: {
40
59
  /** Sous-domaine de l'organisation (ex. « armoise »). */
@@ -1,10 +1,17 @@
1
+ import { ReactNode } from 'react';
1
2
  export declare function SignatureLystech({ site, apiBaseUrl, className, mention, connexion, methodes, }: {
2
3
  /** Sous-domaine de l'organisation. Pris du fournisseur si omis. */
3
4
  site?: string | undefined;
4
5
  apiBaseUrl?: string | undefined;
5
6
  className?: string | undefined;
6
- /** Les mots de la mention, si le site en préfère d'autres. */
7
- mention?: string | undefined;
7
+ /**
8
+ * Les mots de la mention, si le site en préfère d'autres.
9
+ *
10
+ * `null` la retire : pour un site qui signe déjà à sa façon (un logo, une
11
+ * phrase à lui), il ne reste que « Connexion » — deux liens vers Lystech
12
+ * côte à côte, c'est un de trop.
13
+ */
14
+ mention?: ReactNode | undefined;
8
15
  connexion?: string | undefined;
9
16
  /**
10
17
  * Les facons de se connecter proposees a la personne qui edite.
@@ -0,0 +1,14 @@
1
+ /**
2
+ * LA ZONE QUE L'ÉDITION EN PLACE NE TOUCHE PAS.
3
+ *
4
+ * En mode « modifier », un clic sur un texte du site le corrige au lieu de
5
+ * l'actionner. C'est voulu pour un titre ou un lien de menu ; c'est une panne
6
+ * pour un bouton qui doit AGIR même en mode édition — une suppression, sa
7
+ * confirmation. Un élément portant cette classe (ou dans un parent qui la
8
+ * porte) n'est jamais repéré : ses clics passent.
9
+ *
10
+ * Une classe plutôt qu'un attribut : les fenêtres surgissantes des
11
+ * bibliothèques (antd, etc.) se rendent hors de l'arbre, et n'acceptent en
12
+ * général qu'un nom de classe (`rootClassName`).
13
+ */
14
+ export declare const CLASSE_HORS_EDITION = "lystech-hors-edition";
@@ -1,7 +1,12 @@
1
1
  import { SourceTexte } from '../sourceTexte';
2
- export declare function TexteEnPlace({ source, actif, surModification, }: {
2
+ export declare function TexteEnPlace({ source, actif, modifiable, surModification, }: {
3
3
  source: SourceTexte;
4
4
  /** Faux pendant qu'un panneau est ouvert : on ne veut pas deux modes. */
5
5
  actif: boolean;
6
+ /**
7
+ * Ce texte a-t-il un bloc où s'enregistrer ? Change quand le catalogue
8
+ * arrive : avant lui, rien n'est repéré — c'est le bon défaut.
9
+ */
10
+ modifiable: (ns: string, chemin: string) => boolean;
6
11
  surModification: (ns: string, chemin: string, langue: string, valeur: string) => void | Promise<void>;
7
12
  }): import("react").JSX.Element | null;