Skip to content

Commit c300f6c

Browse files
authored
feat(LayerSwitcher) : Possibilité d'ajouter des outils externes (#418)
* jsdoc * fix ajv dans les dependencies du package.json
1 parent 3a8712b commit c300f6c

File tree

9 files changed

+790
-71
lines changed

9 files changed

+790
-71
lines changed

DRAFT_CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ __DATE__
1616
*[Added]
1717

1818
- Territories : Ajout d'un menu option pour permettre de charger une configuration des territoires (#408)
19+
- LayerSwitcher : Possibilité d'ajouter des outils externes (#418)
1920
- LayerSwitcher : Option pour verrouiller une couche (#414)
2021

2122
* 🔨 [Changed]
@@ -30,7 +31,7 @@ __DATE__
3031
* 🐛 [Fixed]
3132

3233
- MousePosition : Edition des coordonnées (#407 #416)
33-
- Layerswitcher : Menu contextuel en mode mobile snas items vides (#417)
34+
- Layerswitcher : Menu contextuel en mode mobile sans items vides (#417)
3435

3536
* 🔒 [Security]
3637

doc/NOTE-LAYERSWITCHER.md

Lines changed: 368 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,368 @@
1+
# Informations utiles sur le gestionnaire de couches (Copilot)
2+
3+
> Questions / Réponses realisées avec Copilot
4+
5+
## Voici un résumé de l’utilisation de la classe `LayerSwitcher`
6+
7+
### Résumé d’utilisation de la classe LayerSwitcher
8+
9+
La classe `LayerSwitcher` est un contrôle OpenLayers permettant à l’utilisateur de gérer dynamiquement les couches d’une carte :
10+
- **Afficher/Masquer** les couches,
11+
- **Changer l’ordre** des couches (drag & drop),
12+
- **Modifier l’opacité**,
13+
- **Basculer en niveaux de gris** (pour les couches compatibles),
14+
- **Afficher les informations** (titre, description, légende, métadonnées, aperçu),
15+
- **Zoomer sur l’étendue** d’une couche,
16+
- **Supprimer** une couche,
17+
- **Déclencher des actions avancées** via des outils personnalisés.
18+
19+
### Principales fonctionnalités
20+
21+
- Prend en charge tous types de couches OpenLayers (WMS, WMTS, vecteur, etc.).
22+
- Permet de configurer chaque couche (titre, description, légendes, métadonnées, etc.).
23+
- Gère les événements liés aux couches (ajout, suppression, modification de visibilité, opacité, etc.).
24+
- S’intègre facilement à la carte via `map.addControl(new LayerSwitcher(...))`.
25+
- Offre une API d’événements pour réagir aux actions utilisateur.
26+
27+
### Exemple d’utilisation
28+
29+
```javascript
30+
import LayerSwitcher from "gpf-ext-ol/controls/LayerSwitcher";
31+
32+
const layerSwitcher = new LayerSwitcher({
33+
layers: [
34+
{
35+
layer: myLayer,
36+
config: {
37+
title: "Ma couche",
38+
description: "Description de la couche"
39+
}
40+
}
41+
],
42+
options: {
43+
collapsed: false,
44+
panel: true,
45+
counter: true,
46+
allowEdit: true,
47+
allowGrayScale: true
48+
}
49+
});
50+
51+
map.addControl(layerSwitcher);
52+
```
53+
54+
### Événements disponibles
55+
56+
Vous pouvez écouter les événements pour réagir aux actions :
57+
58+
```javascript
59+
layerSwitcher.on("layerswitcher:add", e => console.log("Ajout couche", e.layer));
60+
layerSwitcher.on("layerswitcher:remove", e => console.log("Suppression couche", e.layer));
61+
layerSwitcher.on("layerswitcher:change:opacity", e => console.log("Opacité", e.opacity));
62+
layerSwitcher.on("layerswitcher:change:visibility", e => console.log("Visibilité", e.visibility));
63+
```
64+
65+
---
66+
67+
**En résumé :**
68+
`LayerSwitcher` facilite la gestion interactive des couches sur une carte OpenLayers,
69+
tout en offrant de nombreuses options de personnalisation et une API d’événements riche pour les développeurs.
70+
71+
## Voici une explication sur la notion de couches « grisées » (hors plage de visibilité, via `isInRange`) dans la classe `LayerSwitcher`
72+
73+
### Couches grisées (isInRange)
74+
75+
Dans le widget **LayerSwitcher**, une couche peut apparaître « grisée » dans la liste des couches. Cela signifie que la couche n’est **pas visible** dans la vue courante de la carte, pour l’une des raisons suivantes :
76+
77+
- **Niveau de zoom inadapté** :
78+
La résolution actuelle de la carte (zoom) ne correspond pas à la plage de zoom définie pour la couche (`minResolution`/`maxResolution`).
79+
Exemple : une couche n’est visible qu’à grande échelle, mais l’utilisateur est trop dézoomé.
80+
81+
- **Étendue géographique non couverte** :
82+
L’emprise actuelle de la carte (la zone affichée) ne recoupe pas l’étendue spatiale définie pour la couche (`extent`).
83+
Exemple : la couche ne couvre que la France, mais l’utilisateur regarde l’Afrique.
84+
85+
### Fonctionnement dans le code
86+
87+
La méthode `isInRange(layer, map)` vérifie ces deux critères :
88+
- Si la résolution de la carte est hors de la plage de la couche, ou
89+
- Si l’étendue de la carte n’intersecte pas celle de la couche.
90+
91+
Si l’un de ces cas est vrai, la couche est considérée comme « hors plage » et la classe CSS `outOfRange` est ajoutée à son élément DOM dans la liste.
92+
Visuellement, cela la grise et affiche un message d’information au survol.
93+
94+
### Utilité
95+
96+
- **Informer l’utilisateur** que la couche n’est pas visible dans la vue courante, sans la masquer de la liste.
97+
- **Éviter la confusion** : l’utilisateur comprend pourquoi une couche n’apparaît pas sur la carte.
98+
- **Accessibilité** : un message d’info est ajouté au survol du nom de la couche.
99+
100+
---
101+
102+
**Résumé :**
103+
Une couche « grisée » dans le LayerSwitcher indique qu’elle n’est pas visible à cause du zoom ou de l’emprise courante. Cela améliore l’expérience utilisateur en rendant explicite la raison de l’absence de la couche sur la carte.
104+
105+
## Voici une explication concernant les couches verrouillées dans le LayerSwitcher
106+
107+
### Couches verrouillées (locked)
108+
109+
Dans le widget **LayerSwitcher**, une couche peut être affichée comme « verrouillée ».
110+
Cela signifie que certaines actions sur cette couche sont désactivées pour l’utilisateur, généralement pour éviter sa suppression ou la modification de ses propriétés essentielles.
111+
112+
### Fonctionnement
113+
114+
- Une couche verrouillée affiche une icône de cadenas ou un indicateur visuel spécifique dans la liste des couches.
115+
- Les boutons d’action associés à la couche (suppression, édition, modification de visibilité, etc.) peuvent être désactivés ou masqués.
116+
- Le verrouillage peut être défini lors de la configuration de la couche, par exemple via une propriété `locked: true` dans la configuration passée au LayerSwitcher.
117+
118+
### Utilité
119+
120+
- **Protéger les couches critiques** : Empêcher la suppression ou la modification accidentelle de couches de fond, de référence ou indispensables à l’application.
121+
- **Clarifier l’interface** : L’utilisateur comprend immédiatement qu’il ne peut pas agir sur cette couche, ce qui évite les erreurs et la confusion.
122+
123+
### Exemple de configuration
124+
125+
```javascript
126+
const layerSwitcher = new LayerSwitcher({
127+
layers: [
128+
{
129+
layer: baseLayer,
130+
config: {
131+
title: "Fond de carte",
132+
locked: true // Cette couche sera verrouillée
133+
}
134+
}
135+
]
136+
});
137+
```
138+
139+
---
140+
141+
**Résumé :**
142+
Une couche verrouillée dans le LayerSwitcher est protégée contre certaines actions utilisateur (suppression, édition, etc.), ce qui garantit la stabilité et la cohérence de la carte affichée.
143+
144+
## Voici une explication concernant les couches dites **éditables** dans le LayerSwitcher
145+
146+
### Couches éditables (editable)
147+
148+
Dans le widget **LayerSwitcher**, une couche peut être marquée comme « éditable ».
149+
Cela signifie que l’utilisateur a la possibilité de modifier le contenu ou le style de cette couche directement depuis l’interface du LayerSwitcher.
150+
151+
### Fonctionnement
152+
153+
- Une couche éditable affiche un bouton ou une icône d’édition dans la liste des couches.
154+
- En cliquant sur ce bouton, l’utilisateur peut accéder à des outils permettant :
155+
- d’ajouter, modifier ou supprimer des objets géographiques (pour les couches vecteur),
156+
- de changer le style ou les propriétés de la couche,
157+
- ou d’ouvrir un panneau d’édition dédié selon la configuration.
158+
- L’éditabilité est généralement activée pour les couches de type vecteur, via une propriété `allowEdit: true` dans la configuration du LayerSwitcher ou de la couche.
159+
160+
### Utilité
161+
162+
- **Permettre la saisie ou la correction de données** directement sur la carte.
163+
- **Personnaliser l’apparence** ou le contenu d’une couche sans quitter l’application.
164+
- **Faciliter la gestion collaborative** des données cartographiques.
165+
166+
### Exemple de configuration
167+
168+
```javascript
169+
const layerSwitcher = new LayerSwitcher({
170+
layers: [
171+
{
172+
layer: vectorLayer,
173+
config: {
174+
title: "Annotations",
175+
// L’option allowEdit peut aussi être définie globalement dans options
176+
}
177+
}
178+
],
179+
options: {
180+
allowEdit: true // Active l’édition pour les couches compatibles
181+
}
182+
});
183+
```
184+
185+
---
186+
187+
**Résumé :**
188+
Une couche éditable dans le LayerSwitcher permet à l’utilisateur de modifier son contenu ou son style via l’interface, principalement pour les couches vecteur, ce qui enrichit l’interactivité et la personnalisation de la carte.
189+
190+
## Voici une explication concernant les couches en mode **N&B** (niveaux de gris) dans le LayerSwitcher
191+
192+
### Couches en mode N&B (niveaux de gris)
193+
194+
Dans le widget **LayerSwitcher**, certaines couches peuvent être affichées en mode « noir et blanc » (N&B), aussi appelé mode **niveaux de gris**.
195+
Cette fonctionnalité permet de désaturer l’affichage d’une couche pour la rendre visuellement moins dominante ou pour mettre en valeur d’autres informations cartographiques superposées.
196+
197+
### Fonctionnement
198+
199+
- Un bouton ou une option « N&B » (grayscale) est disponible pour chaque couche compatible (principalement les couches raster, comme WMS ou WMTS).
200+
- Lorsque l’utilisateur active ce mode, la couche est affichée en niveaux de gris sur la carte.
201+
- Techniquement, cela peut être réalisé via un filtre CSS appliqué au rendu de la couche, ou via une modification du style côté serveur ou client.
202+
- L’état N&B est conservé tant que l’utilisateur ne le désactive pas.
203+
204+
### Utilité
205+
206+
- **Améliorer la lisibilité** : Le mode N&B permet de faire ressortir des couches thématiques ou des annotations colorées en atténuant le fond cartographique.
207+
- **Personnalisation** : L’utilisateur peut adapter l’apparence des couches selon ses besoins d’analyse ou de présentation.
208+
- **Accessibilité** : Peut aider certains utilisateurs à mieux distinguer les informations importantes.
209+
210+
### Exemple de configuration
211+
212+
```javascript
213+
const layerSwitcher = new LayerSwitcher({
214+
layers: [
215+
{
216+
layer: rasterLayer,
217+
config: {
218+
title: "Ortho N&B"
219+
}
220+
}
221+
],
222+
options: {
223+
allowGrayScale: true // Active le bouton N&B pour les couches compatibles
224+
}
225+
});
226+
```
227+
228+
---
229+
230+
**Résumé :**
231+
Le mode N&B dans le LayerSwitcher permet d’afficher certaines couches en niveaux de gris, offrant ainsi une meilleure lisibilité et une personnalisation avancée de la carte pour l’utilisateur.
232+
233+
## Voici une explication à ajouter à votre documentation concernant les **actions utilisateurs via l’option `advancedTools`** dans le LayerSwitcher
234+
235+
### Actions utilisateurs via l’option `advancedTools`
236+
237+
L’option **`advancedTools`** du LayerSwitcher permet d’ajouter des boutons ou outils personnalisés pour chaque couche dans la liste des couches.
238+
Ces outils offrent à l’utilisateur des actions avancées ou spécifiques, adaptées à vos besoins métier.
239+
240+
### Fonctionnement
241+
242+
- L’option `advancedTools` est un tableau d’objets, chaque objet représentant un outil personnalisé.
243+
- Pour chaque outil, vous pouvez définir :
244+
- `label` : le texte affiché sur le bouton,
245+
- `icon` : une icône SVG ou une URL d’image,
246+
- `cb` : une fonction callback exécutée lors du clic sur l’outil (reçoit en paramètres l’événement, le LayerSwitcher, la couche concernée, et les options de l’outil),
247+
- `styles` : des styles CSS personnalisés pour le bouton.
248+
- Les outils apparaissent dans l’interface du LayerSwitcher, à côté de chaque couche.
249+
250+
### Utilité
251+
252+
- **Ajouter des fonctionnalités spécifiques** à vos couches (export, analyse, affichage de popups, etc.).
253+
- **Personnaliser l’expérience utilisateur** en proposant des actions adaptées à chaque couche.
254+
- **Centraliser les outils** liés à la gestion des couches dans une interface unique.
255+
256+
### Exemple de configuration
257+
258+
```javascript
259+
const layerSwitcher = new LayerSwitcher({
260+
layers: [
261+
{
262+
layer: myLayer,
263+
config: {
264+
title: "Ma couche"
265+
}
266+
}
267+
],
268+
options: {
269+
advancedTools: [
270+
{
271+
label: "Exporter",
272+
icon: "📤",
273+
cb: (e, layerSwitcher, layer, options) => {
274+
// Action personnalisée à exécuter
275+
alert("Export de la couche : " + layer.get("title"));
276+
},
277+
styles: {
278+
color: "blue"
279+
}
280+
}
281+
]
282+
}
283+
});
284+
```
285+
286+
### Exemples de possibilités des actions utilisateurs (`advancedTools`)
287+
288+
L’option `advancedTools` permet d’ajouter une grande variété de boutons d’action personnalisés pour chaque couche dans le LayerSwitcher.
289+
Voici quelques exemples concrets :
290+
291+
- **Bouton avec icône SVG inline**
292+
Permet d’ajouter un bouton avec une icône vectorielle personnalisée et une action JavaScript :
293+
```javascript
294+
{
295+
label: 'One',
296+
icon: '<svg ...></svg>',
297+
cb: (e, instance, layer, options) => {
298+
console.log("Action One", e, instance, layer, options);
299+
}
300+
}
301+
```
302+
303+
- **Bouton sans icône (icône par défaut)**
304+
Un simple bouton texte qui déclenche une action :
305+
```javascript
306+
{
307+
label: 'Two',
308+
cb: (e, instance, layer, options) => {
309+
console.log("Action Two", e, instance, layer, options);
310+
}
311+
}
312+
```
313+
314+
- **Bouton avec icône depuis une URL**
315+
Pratique pour réutiliser des pictogrammes existants :
316+
```javascript
317+
{
318+
label: 'Three',
319+
icon: 'url/vers/mon-icone.svg',
320+
cb: () => window.history.back()
321+
}
322+
```
323+
324+
- **Bouton de notification ou d’intégration avec d’autres systèmes**
325+
Par exemple, pour publier un événement ou notifier l’application :
326+
```javascript
327+
{
328+
label: 'Four',
329+
icon: '<svg ...></svg>',
330+
cb: (e, instance, layer, options) => {
331+
// Publier une notification, ouvrir un panneau, etc.
332+
}
333+
}
334+
```
335+
336+
- **Bouton stylisé**
337+
Vous pouvez personnaliser le style du bouton via la propriété `styles` :
338+
```javascript
339+
{
340+
label: 'Exporter',
341+
icon: '📤',
342+
cb: (e, instance, layer, options) => {
343+
alert("Export de la couche : " + layer.get("title"));
344+
},
345+
styles: {
346+
color: "blue"
347+
}
348+
}
349+
```
350+
351+
Si l’option `cb` n’est pas renseignée dans un objet `advancedTools`, le bouton est tout de même affiché et, lors du clic, **un événement personnalisé est déclenché** par le LayerSwitcher (généralement `layerswitcher:custom`).
352+
Cet événement contient les informations sur le bouton cliqué, la couche concernée, etc.
353+
354+
**Exemple d’utilisation :**
355+
356+
```javascript
357+
layerSwitcher.on("layerswitcher:custom", (e) => {
358+
// e contient : event, layerSwitcher, layer, options (du bouton)
359+
console.log("Action custom déclenchée :", e);
360+
});
361+
```
362+
363+
Cela permet de centraliser la gestion des actions non définies directement par une fonction `cb`, et d’ajouter des comportements dynamiques ou contextuels selon le bouton cliqué.
364+
365+
---
366+
367+
**Résumé :**
368+
L’option `advancedTools` du LayerSwitcher permet d’ajouter facilement des boutons d’action personnalisés pour chaque couche, afin d’enrichir l’interface et de proposer des fonctionnalités avancées adaptées à vos besoins.

0 commit comments

Comments
 (0)