Skip to content

Commit 97a664c

Browse files
authored
Merge branch 'main' into feature/catalog-optimise
2 parents da4ef52 + f8688c6 commit 97a664c

File tree

8 files changed

+109
-14
lines changed

8 files changed

+109
-14
lines changed

DRAFT_CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ __DATE__
2222
- Catalog : refonte et optimisation du widget (#423)
2323
- LayerSwitcher : refonte complète de l'outil (#434)
2424
- Contextual Menu : Changement nom de l'entrée isochrone (3d228a692c8d51155bbdf8c8c32bb51629b6a03f)
25+
- GetFeatureInfo : corrections diverse sur l'UI du panel de résultats (#448)
2526

2627
* 🔥 [Deprecated]
2728

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "geopf-extensions-openlayers",
33
"description": "French Geoportal Extensions for OpenLayers libraries",
44
"version": "1.0.0-beta.6-423",
5-
"date": "15/09/2025",
5+
"date": "23/10/2025",
66
"module": "src/index.js",
77
"directories": {},
88
"engines": {

samples-src/pages/tests/GetFeatureInfo/pages-ol-getfeatureinfo-modules-options-dsfr.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ <h2>Ajout du widget du GetFeatureInfo, avec les options par défaut</h2>
8989
map.addLayer(gpHydro);
9090
// 3. Ajout du GetFeatureInfo
9191
var getFeatureInfo = new ol.control.GetFeatureInfo({
92-
position: "bottom-left"
92+
position: "bottom-left",
93+
noDataMessage : "<h6 style='text-align: center;'> Pas d'infos disponibles </h6> <p style='text-align: center;'> Il n'y a pas de données interrogeables ici </p>"
9394
});
9495
map.addControl(getFeatureInfo);
9596

@@ -195,7 +196,8 @@ <h2>Ajout du widget du GetFeatureInfo, avec les options par défaut</h2>
195196
// 5. Ajout du contrôle de gestion de l'empilement des couches (layerSwitcher)
196197
var layerSwitcher = new ol.control.LayerSwitcher({
197198
options : {
198-
collapsed: false
199+
collapsed: false,
200+
panel: true
199201
}
200202
});
201203
map.addControl(layerSwitcher);

src/packages/CSS/Controls/GetFeatureInfo/DSFRgetFeatureInfoStyle.css

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,42 @@
11
/* GET FEATURE INFO */
2+
.gpf-btn-header_gfi {
3+
z-index: 2;
4+
position: absolute;
5+
}
6+
7+
.gpf-btn-icon-header_gfi {
8+
color: var(--text-action-high-blue-france); /* ou inherit */
9+
background-color: currentColor;
10+
mask: url('img/GFI.svg') no-repeat center / contain;
11+
-webkit-mask: url('img/GFI.svg') no-repeat center / contain;
12+
margin-left: 8px;
13+
width: 16px;
14+
height: 16px;
15+
}
16+
17+
.gpf-panel__body_gfi {
18+
overflow: auto;
19+
max-height: 300px !important;
20+
}
21+
22+
.gpf-panel__title_gfi {
23+
color: #101092;
24+
padding: 12px 15px;
25+
position: relative;
26+
font-size: 1rem;
27+
font-weight: normal;
28+
margin: 0;
29+
right: -16px;
30+
}
31+
.gpf-panel__header_gfi {
32+
display: flex;
33+
flex-direction: row;
34+
align-items: center;
35+
align-content: center;
36+
background: #E3E3FD;
37+
height: 48px;
38+
}
39+
240
.gpf-btn-icon-getfeatureinfo::after {
341
-webkit-mask: url("img/NoGFI.svg") center no-repeat;
442
mask: url("img/NoGFI.svg") center no-repeat;

src/packages/CSS/Controls/GetFeatureInfo/GPFgetFeatureInfo.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ dialog[id^="GPgetFeatureInfoPanel-"] {
3434
.GPgetFeatureInfoAccordionGroup {
3535
overflow-y: scroll;
3636
scrollbar-width: thin;
37-
max-height: calc(52vh - 92px);
3837
}
3938

4039
.GPgetFeatureInfoAccordionContent {

src/packages/CSS/Controls/GetFeatureInfo/GPFgetFeatureInfoStyle.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,8 @@ button[aria-expanded="true"].GPgfiLayerButton span.GPshowGfiLayerFeature {
3636
vertical-align: middle;
3737
background-image: url("img/GPgfiDetails.png");
3838
background-position: -26px 0;
39+
}
40+
41+
.GPgetFeatureInfoAccordionGroup {
42+
max-height: calc(52vh - 92px);
3943
}

src/packages/Controls/GetFeatureInfo/GetFeatureInfo.js

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ class GetFeatureInfo extends Control {
156156
* specify if control is draggable (true) or not (false) */
157157
this.draggable = this.options.draggable;
158158

159+
/**
160+
* @type {String}
161+
* if specified, the given html string will be displayed if no data are returned by the gfi */
162+
this.noDataMessage = this.options.noDataMessage;
163+
159164
/**
160165
* @type {Boolean}
161166
* specify if control add some stuff auto */
@@ -175,6 +180,8 @@ class GetFeatureInfo extends Control {
175180
this.getFeatureInfoAccordionGroup = null;
176181
/** @private */
177182
this.panelGetFeatureInfoEntriesContainer = null;
183+
/** @private */
184+
this.noDataMessageDiv = null;
178185

179186
/** {Array} specify some events listeners */
180187
this.eventsListeners = [];
@@ -210,8 +217,8 @@ class GetFeatureInfo extends Control {
210217
// header
211218
var getFeatureInfoPanelHeader = this.panelGetFeatureInfoHeaderContainer = this._createGetFeatureInfoPanelHeaderElement();
212219
// icone
213-
// var getFeatureInfoPanelIcon = this._createGetFeatureInfoPanelIconElement();
214-
// getFeatureInfoPanelHeader.appendChild(getFeatureInfoPanelIcon);
220+
var getFeatureInfoPanelIcon = this._createGetFeatureInfoPanelIconElement();
221+
getFeatureInfoPanelHeader.appendChild(getFeatureInfoPanelIcon);
215222
// title
216223
var getFeatureInfoPanelTitle = this._createGetFeatureInfoPanelTitleElement();
217224
getFeatureInfoPanelHeader.appendChild(getFeatureInfoPanelTitle);
@@ -224,7 +231,9 @@ class GetFeatureInfo extends Control {
224231
// container for the custom code
225232
var accordionGroup = this.getFeatureInfoAccordionGroup = this._createGetFeatureInfoAccordionGroup();
226233
getFeatureInfoPanelDiv.appendChild(accordionGroup);
227-
234+
if (this.noDataMessage) {
235+
this.noDataMessageDiv = this._createGetFeatureInfoNoData(this.noDataMessage);
236+
}
228237
container.appendChild(getFeatureInfoPanel);
229238

230239
logger.log(container);
@@ -276,6 +285,10 @@ class GetFeatureInfo extends Control {
276285
onMapClick (e) {
277286
if (this.getFeatureInfoIsActive() === "true") {
278287
this.getFeatureInfoAccordionGroup.remove();
288+
if (this.noDataMessage) {
289+
this.noDataMessageDiv.remove();
290+
}
291+
this.buttonGetFeatureInfoClose.setAttribute("aria-pressed", true);
279292
this.layers = e.map.getLayers().getArray().filter((l) => {
280293
// On ne passe au GFI que les layers visibles
281294
if (l.isVisible(e.map.getView()) && l.getOpacity() > 0){
@@ -294,6 +307,10 @@ class GetFeatureInfo extends Control {
294307
}
295308
// Aucun layer visible sur la carte
296309
else {
310+
if (this.noDataMessage) {
311+
// affichage du message no Data donné en option
312+
this.getFeatureInfoPanelDiv.append(this.noDataMessageDiv);
313+
}
297314
// rien à afficher car pas de couches visibles sur la carte, on s'arrête là.
298315
return;
299316
}
@@ -492,8 +509,13 @@ class GetFeatureInfo extends Control {
492509
// s'il n'y a aucun contenu renvoyé par le GFI
493510
if (gfiContent.filter(gfi => gfi.get("pending") === true).length == 0
494511
&& gfiContent.filter(gfi => gfi.get("content")).length == 0) {
495-
// on n'affiche pas la pop-up car pas de données
496-
this.buttonGetFeatureInfoClose.setAttribute("aria-pressed", false);
512+
if (this.noDataMessage) {
513+
// on affiche le message noData donné en option
514+
this.getFeatureInfoPanelDiv.append(this.noDataMessageDiv);
515+
} else {
516+
// on n'affiche pas la pop-up car pas de données
517+
this.buttonGetFeatureInfoClose.setAttribute("aria-pressed", false);
518+
}
497519
}
498520
}
499521
});

src/packages/Controls/GetFeatureInfo/GetFeatureInfoDOM.js

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ var GetFeatureInfoDOM = {
114114

115115
_createGetFeatureInfoPanelDivElement : function () {
116116
var div = document.createElement("div");
117-
div.className = "GPpanelBody gpf-panel__body fr-modal__body";
117+
div.className = "GPpanelBody gpf-panel__body_gfi fr-modal__body";
118118
return div;
119119
},
120120

@@ -125,20 +125,26 @@ var GetFeatureInfoDOM = {
125125
*/
126126
_createGetFeatureInfoPanelHeaderElement : function () {
127127
var container = document.createElement("div");
128-
container.className = "GPpanelHeader gpf-panel__header fr-modal__header";
128+
container.className = "GPpanelHeader gpf-panel__header_gfi";
129129
return container;
130130
},
131+
_createGetFeatureInfoPanelIconElement : function () {
132+
var label = document.createElement("label");
133+
label.className = "GPpanelIcon gpf-btn-header_gfi gpf-btn-icon-header_gfi";
134+
label.title = "Get Feature Info";
135+
return label;
136+
},
131137
_createGetFeatureInfoPanelTitleElement : function () {
132138
var div = document.createElement("div");
133-
div.className = "GPpanelTitle gpf-panel__title fr-modal__title fr-pt-4w";
134-
div.innerHTML = "GetFeatureInfo";
139+
div.className = "GPpanelTitle gpf-panel__title_gfi fr-modal__title";
140+
div.innerHTML = "Infos sur les couches";
135141
return div;
136142
},
137143
_createGetFeatureInfoPanelCloseElement : function () {
138144
var self = this;
139145

140146
var btnClose = document.createElement("button");
141-
btnClose.className = "GPpanelClose GPcloseGetFeatureInfo gpf-btn gpf-btn-icon-close fr-btn--close fr-btn fr-btn--tertiary-no-outline fr-m-1w";
147+
btnClose.className = "GPpanelClose GPcloseGetFeatureInfo gpf-btn gpf-btn-icon-close fr-btn--close fr-btn fr-btn--tertiary-no-outline";
142148
btnClose.title = "Fermer le panneau";
143149

144150
// Link panel close / visibility checkbox
@@ -174,6 +180,21 @@ var GetFeatureInfoDOM = {
174180
return waitingDivString;
175181
},
176182

183+
/**
184+
* String to html
185+
* @param {String} noDataMessage - string à afficher en message de noData du GFI
186+
* @returns {DOMElement} DOM element
187+
*/
188+
_createGetFeatureInfoNoData : function (noDataMessage) {
189+
// contexte d'execution
190+
// var self = this;
191+
var div = document.createElement("div");
192+
div.className = "GPgetFeatureInfoNoData fr-py-2w fr-px-2w";
193+
console.log(this.stringToHTML(noDataMessage));
194+
div.insertAdjacentHTML("beforeend", noDataMessage);
195+
return div;
196+
},
197+
177198
// ################################################################### //
178199
// ####################### Methods for Layer GFI ####################### //
179200
// ################################################################### //
@@ -222,6 +243,14 @@ var GetFeatureInfoDOM = {
222243
if (e.currentTarget.ariaExpanded === "true") {
223244
collapse.classList.add("fr-collapse--expanded");
224245
collapse.classList.remove("GPelementHidden");
246+
// on centre la vue dans le dialog sur le bouton cliqué
247+
requestAnimationFrame(() => {
248+
button.scrollIntoView({
249+
behavior : "smooth",
250+
block : "start",
251+
inline : "nearest"
252+
});
253+
});
225254
} else {
226255
collapse.classList.remove("fr-collapse--expanded");
227256
collapse.classList.add("GPelementHidden");

0 commit comments

Comments
 (0)