qwc2 2025.10.14 → 2025.10.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/components/IdentifyViewer.js +404 -314
  2. package/components/MapSelection.js +1 -1
  3. package/components/map3d/Map3D.js +1 -1
  4. package/components/style/App.css +4 -0
  5. package/components/style/AttributeTableWidget.css +1 -0
  6. package/components/style/IdentifyViewer.css +51 -80
  7. package/components/widgets/NavBar.js +2 -2
  8. package/components/widgets/style/NavBar.css +0 -1
  9. package/icons/eye-slash.svg +138 -0
  10. package/icons/pin.svg +41 -0
  11. package/icons/unpin.svg +41 -0
  12. package/package.json +1 -1
  13. package/plugins/HeightProfile.js +7 -2
  14. package/plugins/Identify.js +5 -4
  15. package/static/translations/bg-BG.json +3 -1
  16. package/static/translations/ca-ES.json +3 -1
  17. package/static/translations/cs-CZ.json +2 -0
  18. package/static/translations/de-CH.json +4 -2
  19. package/static/translations/de-DE.json +4 -2
  20. package/static/translations/en-US.json +3 -1
  21. package/static/translations/es-ES.json +2 -0
  22. package/static/translations/fi-FI.json +2 -0
  23. package/static/translations/fr-FR.json +3 -1
  24. package/static/translations/hu-HU.json +2 -0
  25. package/static/translations/it-IT.json +3 -1
  26. package/static/translations/ja-JP.json +3 -1
  27. package/static/translations/nl-NL.json +2 -0
  28. package/static/translations/no-NO.json +2 -0
  29. package/static/translations/pl-PL.json +2 -0
  30. package/static/translations/pt-BR.json +2 -0
  31. package/static/translations/pt-PT.json +2 -0
  32. package/static/translations/ro-RO.json +2 -0
  33. package/static/translations/ru-RU.json +2 -0
  34. package/static/translations/sv-SE.json +2 -0
  35. package/static/translations/tr-TR.json +2 -0
  36. package/static/translations/tsconfig.json +2 -0
  37. package/static/translations/uk-UA.json +2 -0
  38. package/utils/MiscUtils.js +53 -0
@@ -169,7 +169,6 @@ var MapSelection = /*#__PURE__*/function (_React$Component) {
169
169
  MeasureUtils.updateFeatureMeasurements(feature, _this.props.geomType, _this.props.projection, settings);
170
170
  });
171
171
  _this.drawInteraction = null;
172
- _this.map = MapUtils.getHook(MapUtils.GET_MAP);
173
172
 
174
173
  // create a layer to draw on
175
174
  _this.selectionLayer = new ol.layer.Vector({
@@ -186,6 +185,7 @@ var MapSelection = /*#__PURE__*/function (_React$Component) {
186
185
  return _createClass(MapSelection, [{
187
186
  key: "componentDidMount",
188
187
  value: function componentDidMount() {
188
+ this.map = MapUtils.getHook(MapUtils.GET_MAP);
189
189
  this.map.addLayer(this.selectionLayer);
190
190
  if (this.props.active) {
191
191
  this.addDrawInteraction();
@@ -618,7 +618,7 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
618
618
  // Setup map
619
619
  var initialBbox = (_this2$props$theme$ma = (_this2$props$theme$ma2 = _this2.props.theme.map3d) === null || _this2$props$theme$ma2 === void 0 ? void 0 : _this2$props$theme$ma2.extent) !== null && _this2$props$theme$ma !== void 0 ? _this2$props$theme$ma : _this2.props.theme.initialBbox;
620
620
  var bounds = CoordinatesUtils.reprojectBbox(initialBbox.bounds, initialBbox.crs, projection);
621
- var extent = new Extent(crs, bounds[0], bounds[2], bounds[1], bounds[3]);
621
+ var extent = new Extent(projection, bounds[0], bounds[2], bounds[1], bounds[3]);
622
622
  _this2.map = new Map({
623
623
  extent: extent,
624
624
  backgroundColor: "white"
@@ -179,6 +179,10 @@ div.controlgroup > .controlgroup-fillitem {
179
179
  width: 0;
180
180
  }
181
181
 
182
+ div.controlgroup > .controlgroup-expanditem {
183
+ flex: 1 0 auto;
184
+ }
185
+
182
186
  div.controlgroup > *:not(:last-child):not(span) {
183
187
  margin-right: -1px;
184
188
  }
@@ -192,6 +192,7 @@ table.attribtable-table tr.row-disabled * {
192
192
  div.attribtable-footbar {
193
193
  display: flex;
194
194
  align-items: center;
195
+ margin: 0 -0.25em;
195
196
  }
196
197
 
197
198
  div.attribtable-footbar > div {
@@ -9,7 +9,7 @@ span.identify-body-message {
9
9
  padding: 0.25em;
10
10
  }
11
11
 
12
- div.identify-body div.identify-results-container {
12
+ div.identify-body div.identify-results-tree {
13
13
  overflow-y: auto;
14
14
  flex: 1 1 50%;
15
15
  min-height: 0;
@@ -20,79 +20,44 @@ div.identify-body div.identify-results-container {
20
20
  font-size: small;
21
21
  }
22
22
 
23
- div.identify-layer-expandable {
24
- position: relative;
25
- margin-left: 1em;
26
- }
27
-
28
- div.identify-layer-expandable > div.identify-layer-entries {
29
- display: none;
30
- }
31
-
32
- div.identify-layer-expanded > div.identify-layer-entries {
33
- display: block;
34
- }
35
-
36
- div.identify-layer-expandable:before {
37
- content: "";
38
- border-color: transparent var(--text-color);
39
- border-width: 0.35em 0 0.35em 0.45em;
40
- border-style: solid;
41
- display: block;
42
- height: 0;
43
- width: 0;
44
- left: -1em;
45
- top: 0.3em;
46
- position: absolute;
47
- }
48
-
49
- div.identify-layer-expanded:before {
50
- border-color: var(--text-color) transparent;
51
- border-width: 0.45em 0.35em 0 0.35em;
52
- top: 0.4em;
53
- }
54
-
55
- div.identify-layer-entries {
56
- padding: 0.25em 0.25em 0.25em 1em;
57
- }
58
-
59
- div.identify-result-entry {
23
+ div.identify-results-tree-entry {
60
24
  display: flex;
61
25
  }
62
26
 
63
- div.identify-result-entry span.clickable {
27
+ div.identify-results-tree-entry > span:first-child {
28
+ display: flex;
29
+ align-items: center;
64
30
  cursor: pointer;
31
+ flex: 1 1 auto;
65
32
  }
66
33
 
67
- div.identify-result-entry span.active {
34
+ span.identify-results-tree-entry-active {
68
35
  font-weight: bold;
69
36
  }
70
37
 
71
- div.identify-result-entry > span:first-child {
72
- flex: 1 1 auto;
73
- }
74
-
75
- div.identify-result-entry span.identify-remove-result,
76
- div.identify-result-entry span.identify-export-result {
38
+ div.identify-results-tree-entry span.identify-remove-result,
39
+ div.identify-results-tree-entry span.identify-export-result {
77
40
  margin: 0 0.25em;
78
- color: var(--border-color);
79
41
  cursor: pointer;
80
42
  visibility: hidden;
81
- font-size: large;
82
43
  flex: 0 0 auto;
83
44
  }
84
45
 
85
- div.identify-result-entry:hover > span.identify-remove-result,
86
- div.identify-result-entry:hover > span.identify-export-result {
46
+ div.identify-results-tree-entry:hover > span.identify-remove-result,
47
+ div.identify-results-tree-entry:hover > span.identify-export-result {
87
48
  visibility: visible;
88
49
  }
89
50
 
51
+ div.identify-results-tree-entries {
52
+ padding: 0.25em 0.25em 0.25em 1em;
53
+ }
54
+
90
55
  div.identify-body div.identify-flat-results-list {
91
56
  overflow: auto;
92
57
  flex: 1 1 auto;
93
58
  }
94
59
 
95
- div.identify-body .identify-result-tree-frame {
60
+ div.identify-body div.identify-result-tree-frame {
96
61
  flex: 1 1 50%;
97
62
  min-height: 0;
98
63
  display: flex;
@@ -100,13 +65,12 @@ div.identify-body .identify-result-tree-frame {
100
65
  border: 1px solid var(--border-color);
101
66
  }
102
67
 
103
- div.identify-body .identify-result-frame-normal {
104
- margin-top: 0.25em;
68
+ div.identify-body div.identify-result-frame {
69
+ margin-bottom: 0.25em;
105
70
  border: 1px solid var(--border-color);
106
71
  }
107
72
 
108
- div.identify-body .identify-result-frame-highlighted {
109
- margin-top: 0.25em;
73
+ div.identify-body div.identify-result-frame:hover {
110
74
  border: 1px solid var(--color-active);
111
75
  }
112
76
 
@@ -142,6 +106,17 @@ div.identify-body .identify-result-tree-frame > div.identify-result-container {
142
106
  overflow-y: auto;
143
107
  }
144
108
 
109
+ div.identify-compare-results {
110
+ display: flex;
111
+ flex-wrap: wrap;
112
+ overflow: auto;
113
+ flex: 1 1 auto;
114
+ }
115
+
116
+ div.identify-compare-results > div.identify-result-frame {
117
+ flex: 1 1 20em;
118
+ }
119
+
145
120
  div.identify-body .identify-result-box {
146
121
  border: 0;
147
122
  background-color: var(--list-bg-color);
@@ -195,21 +170,34 @@ div.identify-body td.identify-attr-value > a > img {
195
170
  max-width: 100%;
196
171
  }
197
172
 
198
- div.identify-body div.identify-buttonbox {
199
- margin-top: 0.5em;
173
+ div.identify-body div.identify-toolbar {
174
+ background-color: var(--container-bg-color);
175
+ margin-top: -0.25em;
200
176
  flex: 0 0 auto;
201
177
  display: flex;
202
178
  align-items: center;
179
+ position: relative;
180
+ border-top: 1px solid var(--border-color);
181
+ padding-top: 0.25em;
203
182
  }
204
183
 
205
- div.identify-body div.identify-selectbox {
206
- flex: 0 0 auto;
207
- display: flex;
208
- align-items: center;
184
+ span.identify-toolbar-spacer {
185
+ flex: 1 1 auto;
186
+ }
187
+
188
+ div.identify-settings-menu {
189
+ position: absolute;
190
+ bottom: 100%;
191
+ left: 0;
192
+ border: 1px solid var(--border-color);
193
+ background-color: var(--container-bg-color);
194
+ box-shadow: 0px 0px 5px rgba(136, 136, 136, 1);
195
+ z-index: 1;
196
+ padding: 0.25em;
209
197
  }
210
198
 
211
- select:focus {
212
- outline: none;
199
+ div.identify-settings-menu table td > div.controlgroup {
200
+ width: 100%;
213
201
  }
214
202
 
215
203
  div.identify-body table.identify-attr-subtable {
@@ -224,20 +212,3 @@ div.identify-body td.identify-attr-spacer {
224
212
  height: 2px;
225
213
  background-color: var(--list-section-bg-color);
226
214
  }
227
-
228
- span.identify-buttonbox-spacer {
229
- flex: 1 1 auto;
230
- }
231
-
232
- div.identify-body div.identify-result-feature-report-frame {
233
- padding: 0.25em 0.5em;
234
- font-size: small;
235
- display: flex;
236
- align-items: center;
237
- }
238
-
239
- div.identify-body div.identify-result-feature-report-frame > div.spinner {
240
- width: 1em;
241
- height: 1em;
242
- margin-left: 0.5em;
243
- }
@@ -94,7 +94,7 @@ var NavBar = /*#__PURE__*/function (_React$Component) {
94
94
  }
95
95
  }, /*#__PURE__*/React.createElement(Icon, {
96
96
  icon: "chevron-right"
97
- })), /*#__PURE__*/React.createElement("select", {
97
+ })), this.props.pageSizes.length > 1 ? /*#__PURE__*/React.createElement("select", {
98
98
  disabled: this.props.disabled,
99
99
  onChange: function onChange(ev) {
100
100
  return _this2.props.pageSizeChanged(parseInt(ev.target.value, 10));
@@ -105,7 +105,7 @@ var NavBar = /*#__PURE__*/function (_React$Component) {
105
105
  key: pageSize,
106
106
  value: pageSize
107
107
  }, pageSize, " ", LocaleUtils.tr("navbar.perpage"));
108
- })));
108
+ })) : null);
109
109
  }
110
110
  }]);
111
111
  }(React.Component);
@@ -1,6 +1,5 @@
1
1
  div.navbar {
2
2
  display: inline-flex;
3
- margin-right: 1em;
4
3
  }
5
4
 
6
5
  div.navbar > select {
@@ -0,0 +1,138 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ version="1.1"
6
+ id="Capa_1"
7
+ x="0px"
8
+ y="0px"
9
+ width="24"
10
+ height="24"
11
+ viewBox="0 0 24 24"
12
+ xml:space="preserve"
13
+ sodipodi:docname="eye-slash.svg"
14
+ inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
15
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
16
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
17
+ xmlns="http://www.w3.org/2000/svg"
18
+ xmlns:svg="http://www.w3.org/2000/svg"
19
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
20
+ xmlns:cc="http://creativecommons.org/ns#"
21
+ xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata
22
+ id="metadata47"><rdf:RDF><cc:Work
23
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
24
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
25
+ id="defs45" /><sodipodi:namedview
26
+ pagecolor="#ffffff"
27
+ bordercolor="#666666"
28
+ borderopacity="1"
29
+ objecttolerance="10"
30
+ gridtolerance="10"
31
+ guidetolerance="10"
32
+ inkscape:pageopacity="0"
33
+ inkscape:pageshadow="2"
34
+ inkscape:window-width="1920"
35
+ inkscape:window-height="1172"
36
+ id="namedview43"
37
+ showgrid="true"
38
+ inkscape:zoom="30.603581"
39
+ inkscape:cx="12.759945"
40
+ inkscape:cy="13.315435"
41
+ inkscape:window-x="0"
42
+ inkscape:window-y="0"
43
+ inkscape:window-maximized="1"
44
+ inkscape:current-layer="g8"
45
+ inkscape:showpageshadow="2"
46
+ inkscape:pagecheckerboard="0"
47
+ inkscape:deskcolor="#d1d1d1"><inkscape:grid
48
+ id="grid1"
49
+ units="px"
50
+ originx="0"
51
+ originy="0"
52
+ spacingx="1"
53
+ spacingy="1"
54
+ empcolor="#0099e5"
55
+ empopacity="0.30196078"
56
+ color="#0099e5"
57
+ opacity="0.14901961"
58
+ empspacing="5"
59
+ enabled="true"
60
+ visible="true" /></sodipodi:namedview>
61
+ <g
62
+ id="g10"
63
+ transform="matrix(0.04424334,0,0,0.04424334,1.1456098,0.91230727)">
64
+ <g
65
+ id="g8">
66
+ <path
67
+ d="m 264.45888,248.625 a 19.125,19.125 0 0 1 -19.125,19.125 19.125,19.125 0 0 1 -19.125,-19.125 19.125,19.125 0 0 1 19.125,-19.125 19.125,19.125 0 0 1 19.125,19.125 z"
68
+ id="circle2" />
69
+ <path
70
+ d="m 245.33388,172.125 c -42.075,0 -76.5,34.425 -76.5,76.5 0,42.075 34.425,76.5 76.5,76.5 42.075,0 76.5,-34.425 76.5,-76.5 0,-42.075 -34.425,-76.5 -76.5,-76.5 z m 0,133.875 c -32.513,0 -57.375,-24.862 -57.375,-57.375 0,-32.513 24.862,-57.375 57.375,-57.375 32.513,0 57.375,24.862 57.375,57.375 0,32.513 -24.862,57.375 -57.375,57.375 z"
71
+ id="path4"
72
+ inkscape:connector-curvature="0" />
73
+ <path
74
+ id="path6"
75
+ d="M 471.93048 1.9820549 A 22.602272 22.602272 0 0 0 466.05919 2.6000858 A 22.602272 22.602272 0 0 0 455.77339 8.2065087 L 347.30897 111.24108 C 316.97091 99.588181 282.89825 92.126272 245.33388 92.126272 C 73.208879 92.126272 -25.893384 248.62052 -25.893384 248.62052 C -25.893384 248.62052 14.167601 311.89415 87.603571 357.96784 L 3.7279526 437.64967 A 22.602272 22.602272 0 0 0 2.9333415 469.6107 A 22.602272 22.602272 0 0 0 34.894367 470.40531 L 129.67382 380.34938 C 163.32244 395.17836 202.0213 405.11476 245.33388 405.11476 C 417.45888 405.11476 516.56114 248.62052 516.56114 248.62052 C 516.56114 248.62052 472.0872 178.43975 391.01258 132.07755 L 486.9398 40.962145 A 22.602272 22.602272 0 0 0 487.73442 9.0011198 A 22.602272 22.602272 0 0 0 471.93048 1.9820549 z M 245.33388 133.8875 C 270.63714 133.8875 293.74181 136.992 314.68577 142.23092 L 115.19423 331.74567 C 50.776781 297.77898 19.66432 248.62052 19.66432 248.62052 C 19.66432 248.62052 92.333879 133.8875 245.33388 133.8875 z M 362.53902 159.13848 C 435.70043 192.92371 471.00344 248.62052 471.00344 248.62052 C 471.00344 248.62052 398.33388 363.35353 245.33388 363.35353 C 213.79639 363.35353 185.66308 358.46918 160.88437 350.72805 L 362.53902 159.13848 z " />
76
+ </g>
77
+ </g>
78
+ <g
79
+ id="g12"
80
+ transform="translate(0,-473.25)">
81
+ </g>
82
+ <g
83
+ id="g14"
84
+ transform="translate(0,-473.25)">
85
+ </g>
86
+ <g
87
+ id="g16"
88
+ transform="translate(0,-473.25)">
89
+ </g>
90
+ <g
91
+ id="g18"
92
+ transform="translate(0,-473.25)">
93
+ </g>
94
+ <g
95
+ id="g20"
96
+ transform="translate(0,-473.25)">
97
+ </g>
98
+ <g
99
+ id="g22"
100
+ transform="translate(0,-473.25)">
101
+ </g>
102
+ <g
103
+ id="g24"
104
+ transform="translate(0,-473.25)">
105
+ </g>
106
+ <g
107
+ id="g26"
108
+ transform="translate(0,-473.25)">
109
+ </g>
110
+ <g
111
+ id="g28"
112
+ transform="translate(0,-473.25)">
113
+ </g>
114
+ <g
115
+ id="g30"
116
+ transform="translate(0,-473.25)">
117
+ </g>
118
+ <g
119
+ id="g32"
120
+ transform="translate(0,-473.25)">
121
+ </g>
122
+ <g
123
+ id="g34"
124
+ transform="translate(0,-473.25)">
125
+ </g>
126
+ <g
127
+ id="g36"
128
+ transform="translate(0,-473.25)">
129
+ </g>
130
+ <g
131
+ id="g38"
132
+ transform="translate(0,-473.25)">
133
+ </g>
134
+ <g
135
+ id="g40"
136
+ transform="translate(0,-473.25)">
137
+ </g>
138
+ </svg>
package/icons/pin.svg ADDED
@@ -0,0 +1,41 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+
4
+ <svg
5
+ fill="#000000"
6
+ width="24"
7
+ height="24"
8
+ viewBox="0 0 1.68 1.68"
9
+ version="1.1"
10
+ id="svg1"
11
+ sodipodi:docname="pin.svg"
12
+ inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
13
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
14
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
15
+ xmlns="http://www.w3.org/2000/svg"
16
+ xmlns:svg="http://www.w3.org/2000/svg">
17
+ <defs
18
+ id="defs1" />
19
+ <sodipodi:namedview
20
+ id="namedview1"
21
+ pagecolor="#ffffff"
22
+ bordercolor="#666666"
23
+ borderopacity="1.0"
24
+ inkscape:showpageshadow="2"
25
+ inkscape:pageopacity="0.0"
26
+ inkscape:pagecheckerboard="0"
27
+ inkscape:deskcolor="#d1d1d1"
28
+ inkscape:zoom="5.544301"
29
+ inkscape:cx="16.593616"
30
+ inkscape:cy="45.361895"
31
+ inkscape:window-width="1600"
32
+ inkscape:window-height="842"
33
+ inkscape:window-x="0"
34
+ inkscape:window-y="0"
35
+ inkscape:window-maximized="1"
36
+ inkscape:current-layer="svg1" />
37
+ <path
38
+ d="m 0.423659,1.0813605 h 0.354229 v 0.3648746 c 0,0.1079012 0.04472,0.1987655 0.06247,0.1987655 0.01774,0 0.06247,-0.090864 0.06247,-0.1987655 V 1.0813605 h 0.35352 c 0.04898,0 0.08447,-0.031236 0.08447,-0.078797 0,-0.029815 -0.0092,-0.051111 -0.02981,-0.073115 L 1.093783,0.69376685 c -0.01491,-0.015617 -0.02414,-0.026975 -0.02059,-0.056082 l 0.0362,-0.2591025 c 0.0021,-0.014908 0.0035,-0.023428 0.01633,-0.032657 l 0.174629,-0.1263559 c 0.03904,-0.028398 0.05608,-0.063181 0.05608,-0.095126 0,-0.047562 -0.03834,-0.089444 -0.09299,-0.089444 H 0.416558 c -0.05466,0 -0.09299,0.041883 -0.09299,0.089444 0,0.031945 0.01704,0.066728 0.05537,0.095126 l 0.174629,0.1263559 c 0.01349,0.00923 0.01491,0.017749 0.01704,0.032657 l 0.03621,0.2591025 c 0.0035,0.029107 -0.0057,0.040465 -0.02059,0.056082 l -0.217224,0.2356807 c -0.02059,0.022004 -0.02981,0.0433 -0.02981,0.0731151 0,0.047562 0.03549,0.078797 0.08447,0.078797 z"
39
+ id="path1"
40
+ style="stroke-width:0.0302881" />
41
+ </svg>
@@ -0,0 +1,41 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+
4
+ <svg
5
+ fill="#000000"
6
+ width="24"
7
+ height="24"
8
+ viewBox="0 0 1.68 1.68"
9
+ version="1.1"
10
+ id="svg1"
11
+ sodipodi:docname="unpin.svg"
12
+ inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
13
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
14
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
15
+ xmlns="http://www.w3.org/2000/svg"
16
+ xmlns:svg="http://www.w3.org/2000/svg">
17
+ <defs
18
+ id="defs1" />
19
+ <sodipodi:namedview
20
+ id="namedview1"
21
+ pagecolor="#ffffff"
22
+ bordercolor="#666666"
23
+ borderopacity="1.0"
24
+ inkscape:showpageshadow="2"
25
+ inkscape:pageopacity="0.0"
26
+ inkscape:pagecheckerboard="0"
27
+ inkscape:deskcolor="#d1d1d1"
28
+ inkscape:zoom="6.2020459"
29
+ inkscape:cx="11.286598"
30
+ inkscape:cy="9.4323713"
31
+ inkscape:window-width="1920"
32
+ inkscape:window-height="1052"
33
+ inkscape:window-x="0"
34
+ inkscape:window-y="0"
35
+ inkscape:window-maximized="1"
36
+ inkscape:current-layer="svg1" />
37
+ <path
38
+ d="m 1.309234,0.2833384 c 0.020817,-0.020817 0.020817,-0.053729 0,-0.073201 -0.020145,-0.020133 -0.052379,-0.020808 -0.073196,0 L 0.05010853,1.3967415 c -0.0201447,0.020148 -0.0201447,0.053723 0,0.073868 0.0194756,0.019476 0.053723,0.019476 0.0731986,0 z M 0.72835739,0.6090335 0.44698636,0.5700852 c -0.0147747,-0.00134 -0.0235045,-0.00403 -0.0322344,-0.01746 L 0.29656305,0.3894434 c -0.0268615,-0.036935 -0.0597679,-0.052379 -0.0899864,-0.052379 -0.0449932,0 -0.0846135,0.035591 -0.0846135,0.08797 V 1.2154277 Z M 1.1118045,1.2664657 V 0.90786711 h 0.3451678 c 0.1020703,0 0.1880277,-0.04298 0.1880277,-0.059096 0,-0.016788 -0.085957,-0.059768 -0.1880277,-0.059768 H 1.1118045 V 0.6003034 l -0.50499589,0.504993 0.0852854,-0.011415 c 0.0275335,-0.00403 0.0382792,0.00537 0.053051,0.018801 l 0.22295,0.2054903 c 0.020817,0.019476 0.040964,0.028202 0.06917,0.028202 0.04499,0 0.07454,-0.032903 0.07454,-0.07991 z"
39
+ id="path1"
40
+ style="stroke-width:0.0288399" />
41
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.10.14",
3
+ "version": "2025.10.16",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -47,6 +47,7 @@ import { changeMeasurementState } from '../actions/measurement';
47
47
  import Icon from '../components/Icon';
48
48
  import ResizeableWindow from '../components/ResizeableWindow';
49
49
  import Spinner from '../components/widgets/Spinner';
50
+ import CoordinatesUtils from '../utils/CoordinatesUtils';
50
51
  import { getElevationInterface } from '../utils/ElevationInterface';
51
52
  import LayerUtils from '../utils/LayerUtils';
52
53
  import LocaleUtils from '../utils/LocaleUtils';
@@ -134,6 +135,10 @@ var HeightProfilePrintDialog_ = /*#__PURE__*/function (_React$PureComponent) {
134
135
  var scale = Math.round(MapUtils.computeForZoom(_this.props.map.scales, _this.props.map.zoom));
135
136
  var exportParams = LayerUtils.collectPrintParams(_this.props.layers, _this.props.theme, scale, mapCrs, true, false);
136
137
  var highlightParams = VectorLayerUtils.createPrintHighlighParams([layer], mapCrs, scale);
138
+ var bounds = _toConsumableArray(_this.props.map.bbox.bounds);
139
+ if (CoordinatesUtils.getAxisOrder(_this.props.map.projection).substr(0, 2) === 'ne') {
140
+ bounds = [bounds[1], bounds[0], bounds[3], bounds[2]];
141
+ }
137
142
  var imageParams = _objectSpread({
138
143
  SERVICE: 'WMS',
139
144
  VERSION: '1.3.0',
@@ -141,7 +146,7 @@ var HeightProfilePrintDialog_ = /*#__PURE__*/function (_React$PureComponent) {
141
146
  TRANSPARENT: 'true',
142
147
  TILED: 'false',
143
148
  CRS: _this.props.map.projection,
144
- BBOX: _this.props.map.bbox.bounds,
149
+ BBOX: bounds,
145
150
  WIDTH: _this.props.map.size.width,
146
151
  HEIGHT: _this.props.map.size.height,
147
152
  HIGHLIGHT_GEOM: highlightParams.geoms.join(";"),
@@ -414,7 +419,7 @@ var HeightProfile = /*#__PURE__*/function (_React$Component) {
414
419
  } : undefined
415
420
  };
416
421
  var datasetSelector = null;
417
- if (_this3.state.data.length > 1) {
422
+ if (interactive && _this3.state.data.length > 1) {
418
423
  datasetSelector = /*#__PURE__*/React.createElement("div", {
419
424
  className: "height-profile-dataset-select"
420
425
  }, _this3.state.data.map(function (dataset, idx) {
@@ -403,8 +403,8 @@ var Identify = /*#__PURE__*/function (_React$Component) {
403
403
  attributeCalculator: this.props.attributeCalculator,
404
404
  attributeTransform: this.props.attributeTransform,
405
405
  customExporters: this.props.customExporters,
406
- displayResultTree: this.props.displayResultTree,
407
406
  enableAggregatedReports: this.props.enableAggregatedReports,
407
+ enableCompare: true,
408
408
  enableExport: this.props.enableExport,
409
409
  exportGeometry: this.props.exportGeometry,
410
410
  highlightAllResults: this.props.highlightAllResults,
@@ -412,6 +412,7 @@ var Identify = /*#__PURE__*/function (_React$Component) {
412
412
  iframeDialogsInitiallyDocked: this.props.iframeDialogsInitiallyDocked,
413
413
  longAttributesDisplay: this.props.longAttributesDisplay,
414
414
  replaceImageUrls: this.props.replaceImageUrls,
415
+ resultDisplayMode: this.props.resultDisplayMode,
415
416
  role: "body",
416
417
  showLayerSelector: this.props.showLayerSelector
417
418
  });
@@ -469,8 +470,6 @@ _defineProperty(Identify, "propTypes", {
469
470
  currentTask: PropTypes.string,
470
471
  /** Optional list of custom exporters to offer along with the built-in exporters. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */
471
472
  customExporters: PropTypes.array,
472
- /** Whether to display a tree overview of results (as opposed to a flat list of results). */
473
- displayResultTree: PropTypes.bool,
474
473
  /** Whether to enable the aggregated report download button. */
475
474
  enableAggregatedReports: PropTypes.bool,
476
475
  /** Whether to enable the export functionality. Either `true|false` or a list of single allowed formats (builtin formats: `json`, `geojson`, `csv`, `csvzip`, `shapefile`, `xlsx`). If a list is provided, the export formats will be sorted according to that list, and the default format will be the first format of the list. */
@@ -505,6 +504,8 @@ _defineProperty(Identify, "propTypes", {
505
504
  removeMarker: PropTypes.func,
506
505
  /** Whether to replace an attribute value containing an URL to an image with an inline image. */
507
506
  replaceImageUrls: PropTypes.bool,
507
+ /** Result display mode, one of `tree`, `flat`, `paginated`. */
508
+ resultDisplayMode: PropTypes.string,
508
509
  selection: PropTypes.object,
509
510
  setCurrentTask: PropTypes.func,
510
511
  /** Whether to show a layer selector to filter the identify results by layer. */
@@ -519,7 +520,7 @@ _defineProperty(Identify, "defaultProps", {
519
520
  clearResultsOnClose: true,
520
521
  customExporters: [],
521
522
  longAttributesDisplay: 'ellipsis',
522
- displayResultTree: true,
523
+ resultDisplayMode: 'flat',
523
524
  replaceImageUrls: true,
524
525
  featureInfoReturnsLayerName: true,
525
526
  geometry: {
@@ -244,16 +244,18 @@
244
244
  "identify": {
245
245
  "aggregatedreport": "Обобщен доклад",
246
246
  "clipboard": "Копиране в клипборда",
247
+ "comparing": "",
247
248
  "download": "Изтегляне",
248
249
  "export": "Експорт",
249
250
  "featureReport": "Отчет за функциите",
250
- "featurecount": "Брой функции",
251
+ "featurecount": "",
251
252
  "layerall": "Всички слоеве",
252
253
  "link": "Връзка към",
253
254
  "noattributes": "Без атрибути",
254
255
  "noresults": "Няма налична информация за избраната точка",
255
256
  "querying": "Запитване...",
256
257
  "reportfail": "Неуспешно генериране на отчет",
258
+ "results": "",
257
259
  "selectreport": "",
258
260
  "title": "Информация за функциите"
259
261
  },
@@ -244,16 +244,18 @@
244
244
  "identify": {
245
245
  "aggregatedreport": "Informe agregat",
246
246
  "clipboard": "Copiar al porta-retalls",
247
+ "comparing": "",
247
248
  "download": "Descarregar",
248
249
  "export": "Exportar",
249
250
  "featureReport": "Informe d'element",
250
- "featurecount": "Nombre d'elements",
251
+ "featurecount": "{0} element(s)",
251
252
  "layerall": "Totes les capes",
252
253
  "link": "Link",
253
254
  "noattributes": "Sense atributs",
254
255
  "noresults": "Sense informació disponible sobre el punt seleccionat",
255
256
  "querying": "Consultant...",
256
257
  "reportfail": "No s'ha pogut generar l'informe",
258
+ "results": "",
257
259
  "selectreport": "Seleccionar informe...",
258
260
  "title": "Informació del element"
259
261
  },
@@ -244,6 +244,7 @@
244
244
  "identify": {
245
245
  "aggregatedreport": "",
246
246
  "clipboard": "Zkopírovat do schránky",
247
+ "comparing": "",
247
248
  "download": "",
248
249
  "export": "Exportovat",
249
250
  "featureReport": "Report prvku",
@@ -254,6 +255,7 @@
254
255
  "noresults": "V tomto bodu nejsou k dispozici informace o žádném prvku",
255
256
  "querying": "Dotazování...",
256
257
  "reportfail": "",
258
+ "results": "",
257
259
  "selectreport": "",
258
260
  "title": "Informace o prvku"
259
261
  },
@@ -244,16 +244,18 @@
244
244
  "identify": {
245
245
  "aggregatedreport": "Aggregierter Bericht",
246
246
  "clipboard": "Nach Zwischenablage kopieren",
247
+ "comparing": "Vergleich von {0} Objekte",
247
248
  "download": "Herunterladen",
248
249
  "export": "Exportieren",
249
250
  "featureReport": "Objektblatt",
250
- "featurecount": "Anzahl Objekte",
251
+ "featurecount": "{0} Objekt(e)",
251
252
  "layerall": "Alle Ebenen",
252
253
  "link": "Link",
253
254
  "noattributes": "Keine Attribute",
254
- "noresults": "Keine Resultate an der ausgewählten Position",
255
+ "noresults": "Keine Treffer an der ausgewählten Position",
255
256
  "querying": "Objekte werden abgefragt...",
256
257
  "reportfail": "Bericht konnt nicht erstellt werden",
258
+ "results": "Ergebnisse",
257
259
  "selectreport": "Bericht auswählen...",
258
260
  "title": "Objektinformationen"
259
261
  },