@eeacms/volto-eea-map 0.1.25 → 0.1.27
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 +23 -0
- package/package.json +3 -2
- package/src/components/Blocks/EmbedEEAMap/Edit.jsx +23 -0
- package/src/components/Blocks/EmbedEEAMap/Schema.js +2 -0
- package/src/components/Blocks/EmbedEEAMap/View.jsx +1 -1
- package/src/components/ExtraViews.jsx +1 -0
- package/src/components/Webmap.jsx +101 -12
- package/src/components/visualization/VisualizationEditorWidget.jsx +1 -0
- package/src/components/visualization/panelsSchema.js +5 -1
- package/src/components/widgets/LayerSelectWidget.jsx +32 -7
- package/src/components/widgets/LegendWidget.jsx +9 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,29 @@ All notable changes to this project will be documented in this file. Dates are d
|
|
|
4
4
|
|
|
5
5
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
6
6
|
|
|
7
|
+
### [0.1.27](https://github.com/eea/volto-eea-map/compare/0.1.26...0.1.27) - 6 October 2022
|
|
8
|
+
|
|
9
|
+
#### :hammer_and_wrench: Others
|
|
10
|
+
|
|
11
|
+
- privacy policy inherit height of map [andreiggr - [`dee7281`](https://github.com/eea/volto-eea-map/commit/dee7281caf834d017af8b99da1455c956bc663fe)]
|
|
12
|
+
- set default legend, sources, privacy on [andreiggr - [`fb66ff8`](https://github.com/eea/volto-eea-map/commit/fb66ff8863d13b569955d7a774a9f1ab14729a29)]
|
|
13
|
+
- clear console [andreiggr - [`e1d2841`](https://github.com/eea/volto-eea-map/commit/e1d28419dea2586c98b4df1c9e6dc1d6a4b987b6)]
|
|
14
|
+
- use a custom basemap [andreiggr - [`b11fc62`](https://github.com/eea/volto-eea-map/commit/b11fc62a54730c0fb2229448c438f39f51db494d)]
|
|
15
|
+
### [0.1.26](https://github.com/eea/volto-eea-map/compare/0.1.25...0.1.26) - 4 October 2022
|
|
16
|
+
|
|
17
|
+
#### :hammer_and_wrench: Others
|
|
18
|
+
|
|
19
|
+
- add integration to cypress [andreiggr - [`b92ab76`](https://github.com/eea/volto-eea-map/commit/b92ab764603088013894a0be6f84824fb6586464)]
|
|
20
|
+
- fix plugins cypress [andreiggr - [`61e3194`](https://github.com/eea/volto-eea-map/commit/61e319434b1e877dbb4fd29d5ca3d2028d9b5e0b)]
|
|
21
|
+
- use volto vers from env [andreiggr - [`52db93f`](https://github.com/eea/volto-eea-map/commit/52db93f8561e6b90e5d7569b3005e3ebb5274b26)]
|
|
22
|
+
- replace all alpha with specific alpha version [andreiggr - [`f0f1802`](https://github.com/eea/volto-eea-map/commit/f0f18026298e1cc061d62d82e320bf2066496c77)]
|
|
23
|
+
- update jenkins dependencies [andreiggr - [`d2bc043`](https://github.com/eea/volto-eea-map/commit/d2bc043f4039192d0b18bccb0c26ae8cae3d1089)]
|
|
24
|
+
- use specific volto alpha version [andreiggr - [`209988d`](https://github.com/eea/volto-eea-map/commit/209988df8e23fb5bc4631b8326740ea9d2969195)]
|
|
25
|
+
- Raster layer different centering mechanism [andreiggr - [`74c5fa5`](https://github.com/eea/volto-eea-map/commit/74c5fa57522197e621c9c4ba05f6b9cbed2b0e8f)]
|
|
26
|
+
- show raster layer [andreiggr - [`3193689`](https://github.com/eea/volto-eea-map/commit/3193689982db041ac343389e456db7a79447361d)]
|
|
27
|
+
- changes for hide layer in legend [andreiggr - [`5176df9`](https://github.com/eea/volto-eea-map/commit/5176df9971efb308f1e02f510021bf42d9a7c05c)]
|
|
28
|
+
- clean code [andreiggr - [`be3b1b8`](https://github.com/eea/volto-eea-map/commit/be3b1b86db7e5b243d3650cda17332bbbc70c71b)]
|
|
29
|
+
- hide layer in legend [andreiggr - [`675f1ba`](https://github.com/eea/volto-eea-map/commit/675f1ba4aec7037b2a7c28b73a075c0a93616546)]
|
|
7
30
|
### [0.1.25](https://github.com/eea/volto-eea-map/compare/0.1.24...0.1.25) - 27 September 2022
|
|
8
31
|
|
|
9
32
|
#### :hammer_and_wrench: Others
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eeacms/volto-eea-map",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.27",
|
|
4
4
|
"description": "@eeacms/volto-eea-map: Volto add-on",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"author": "European Environment Agency: IDM2 A-Team",
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@cypress/code-coverage": "^3.9.5",
|
|
33
33
|
"babel-plugin-transform-class-properties": "^6.24.1",
|
|
34
|
-
"cypress": "10.3.1"
|
|
34
|
+
"cypress": "10.3.1",
|
|
35
|
+
"md5": "^2.3.0"
|
|
35
36
|
},
|
|
36
37
|
"scripts": {
|
|
37
38
|
"release": "release-it",
|
|
@@ -17,6 +17,29 @@ const Edit = (props) => {
|
|
|
17
17
|
const { block, data, onChangeBlock, selected, id } = props;
|
|
18
18
|
const schema = React.useMemo(() => Schema(props), [props]);
|
|
19
19
|
|
|
20
|
+
React.useEffect(() => {
|
|
21
|
+
if (!Object.hasOwn(data, 'show_legend')) {
|
|
22
|
+
onChangeBlock(block, {
|
|
23
|
+
...data,
|
|
24
|
+
show_legend: true,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (!Object.hasOwn(data, 'show_sources')) {
|
|
28
|
+
onChangeBlock(block, {
|
|
29
|
+
...data,
|
|
30
|
+
show_sources: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (!Object.hasOwn(data, 'dataprotection')) {
|
|
34
|
+
onChangeBlock(block, {
|
|
35
|
+
...data,
|
|
36
|
+
dataprotection: { enabled: true },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
41
|
+
}, [data]);
|
|
42
|
+
|
|
20
43
|
React.useEffect(() => {
|
|
21
44
|
props.getContent(data.vis_url, null, id);
|
|
22
45
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -10,6 +10,8 @@ const MODULES = [
|
|
|
10
10
|
'esri/layers/FeatureLayer',
|
|
11
11
|
'esri/layers/MapImageLayer',
|
|
12
12
|
'esri/layers/GroupLayer',
|
|
13
|
+
'esri/layers/WebTileLayer',
|
|
14
|
+
'esri/Basemap',
|
|
13
15
|
'esri/widgets/Legend',
|
|
14
16
|
'esri/widgets/Expand',
|
|
15
17
|
'esri/widgets/Print',
|
|
@@ -17,6 +19,50 @@ const MODULES = [
|
|
|
17
19
|
'esri/widgets/ScaleBar',
|
|
18
20
|
];
|
|
19
21
|
|
|
22
|
+
//TODO: set group layers sublayers, for direct group import.
|
|
23
|
+
// const setGroupLayers = async (ids, data, modules) => {
|
|
24
|
+
// const { map_service_url, sublayerDatalayer, fullLayer, query = '' } =
|
|
25
|
+
// data || {};
|
|
26
|
+
// const { FeatureLayer, MapImageLayer, GroupLayer } = modules;
|
|
27
|
+
|
|
28
|
+
// const glLayers = await Promise.all(
|
|
29
|
+
// ids.map(async (id) => {
|
|
30
|
+
// const sublayerUrl = `${map_service_url}/${id}`;
|
|
31
|
+
// let sublayerData = await fetchArcGISData(sublayerUrl);
|
|
32
|
+
// let sublayer;
|
|
33
|
+
// switch (sublayerData.type) {
|
|
34
|
+
// case 'Raster Layer':
|
|
35
|
+
// sublayer = new MapImageLayer({
|
|
36
|
+
// url: map_service_url,
|
|
37
|
+
// minScale: sublayerData?.minScale,
|
|
38
|
+
// maxScale: sublayerData?.maxScale,
|
|
39
|
+
// sublayers: [
|
|
40
|
+
// {
|
|
41
|
+
// id: sublayerData.id,
|
|
42
|
+
// visible: true,
|
|
43
|
+
// definitionExpression: query ? formatQuery(query, 'sql') : '',
|
|
44
|
+
// },
|
|
45
|
+
// ],
|
|
46
|
+
// });
|
|
47
|
+
// break;
|
|
48
|
+
// case 'Feature Layer':
|
|
49
|
+
// sublayer = new FeatureLayer({
|
|
50
|
+
// layerId: sublayerData.id,
|
|
51
|
+
// url: `${map_service_url}/${sublayerData.id}`,
|
|
52
|
+
// definitionExpression: query ? formatQuery(query, 'sql') : '',
|
|
53
|
+
// minScale: sublayerData?.minScale,
|
|
54
|
+
// maxScale: sublayerData?.maxScale,
|
|
55
|
+
// });
|
|
56
|
+
// break;
|
|
57
|
+
// default:
|
|
58
|
+
// break;
|
|
59
|
+
// }
|
|
60
|
+
// return sublayer;
|
|
61
|
+
// }),
|
|
62
|
+
// );
|
|
63
|
+
// return glLayers;
|
|
64
|
+
// };
|
|
65
|
+
|
|
20
66
|
const Webmap = (props) => {
|
|
21
67
|
const { editMode, height, id } = props;
|
|
22
68
|
|
|
@@ -53,6 +99,8 @@ const Webmap = (props) => {
|
|
|
53
99
|
FeatureLayer,
|
|
54
100
|
MapImageLayer,
|
|
55
101
|
GroupLayer,
|
|
102
|
+
WebTileLayer,
|
|
103
|
+
Basemap,
|
|
56
104
|
Legend,
|
|
57
105
|
Expand,
|
|
58
106
|
Print,
|
|
@@ -65,6 +113,8 @@ const Webmap = (props) => {
|
|
|
65
113
|
FeatureLayer,
|
|
66
114
|
MapImageLayer,
|
|
67
115
|
GroupLayer,
|
|
116
|
+
WebTileLayer,
|
|
117
|
+
Basemap,
|
|
68
118
|
Legend,
|
|
69
119
|
Expand,
|
|
70
120
|
Print,
|
|
@@ -84,6 +134,8 @@ const Webmap = (props) => {
|
|
|
84
134
|
FeatureLayer,
|
|
85
135
|
MapImageLayer,
|
|
86
136
|
GroupLayer,
|
|
137
|
+
WebTileLayer,
|
|
138
|
+
Basemap,
|
|
87
139
|
Legend,
|
|
88
140
|
Expand,
|
|
89
141
|
Print,
|
|
@@ -101,8 +153,16 @@ const Webmap = (props) => {
|
|
|
101
153
|
case 'Raster Layer':
|
|
102
154
|
mapLayer = new MapImageLayer({
|
|
103
155
|
url: map_service_url,
|
|
104
|
-
|
|
105
|
-
|
|
156
|
+
sublayers: [
|
|
157
|
+
{
|
|
158
|
+
id: layer.id,
|
|
159
|
+
minScale: layer?.minScale,
|
|
160
|
+
maxScale: layer?.maxScale,
|
|
161
|
+
definitionExpression: query
|
|
162
|
+
? formatQuery(query, 'sql')
|
|
163
|
+
: '',
|
|
164
|
+
},
|
|
165
|
+
],
|
|
106
166
|
});
|
|
107
167
|
break;
|
|
108
168
|
case 'Feature Layer':
|
|
@@ -116,17 +176,39 @@ const Webmap = (props) => {
|
|
|
116
176
|
maxScale: layer?.maxScale,
|
|
117
177
|
});
|
|
118
178
|
break;
|
|
119
|
-
case 'Group Layer':
|
|
120
|
-
mapLayer = new GroupLayer({ url });
|
|
121
|
-
break;
|
|
122
179
|
default:
|
|
123
180
|
break;
|
|
124
181
|
}
|
|
125
182
|
return mapLayer;
|
|
126
183
|
})
|
|
127
184
|
: [];
|
|
185
|
+
|
|
186
|
+
const mapBaseLayer = new WebTileLayer({
|
|
187
|
+
urlTemplate:
|
|
188
|
+
'https://gisco-services.ec.europa.eu/maps/tiles/OSMPositronComposite/EPSG3857/{level}/{col}/{row}.png',
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// Create a Basemap with the WebTileLayer.
|
|
192
|
+
const positronCompositeBasemap = new Basemap({
|
|
193
|
+
baseLayers: [mapBaseLayer],
|
|
194
|
+
title: 'Positron Composite',
|
|
195
|
+
id: 'positron-composite',
|
|
196
|
+
thumbnailUrl:
|
|
197
|
+
'https://gisco-services.ec.europa.eu/maps/tiles/OSMPositronComposite/EPSG3857/0/0/0.png',
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
const setBasemap = (basemap) => {
|
|
201
|
+
if (basemap === 'positron-composite') {
|
|
202
|
+
return positronCompositeBasemap;
|
|
203
|
+
}
|
|
204
|
+
if (!basemap) {
|
|
205
|
+
return 'hybrid';
|
|
206
|
+
}
|
|
207
|
+
return basemap;
|
|
208
|
+
};
|
|
209
|
+
|
|
128
210
|
const map = new Map({
|
|
129
|
-
basemap: base_layer
|
|
211
|
+
basemap: setBasemap(base_layer),
|
|
130
212
|
layers,
|
|
131
213
|
});
|
|
132
214
|
const view = new MapView({
|
|
@@ -152,13 +234,20 @@ const Webmap = (props) => {
|
|
|
152
234
|
|
|
153
235
|
if (layers && layers[0] && general && general.centerOnExtent) {
|
|
154
236
|
const firstLayer = layers[0];
|
|
155
|
-
firstLayer
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
237
|
+
if (firstLayer.type === 'feature') {
|
|
238
|
+
firstLayer
|
|
239
|
+
.when(() => {
|
|
240
|
+
return firstLayer.queryExtent();
|
|
241
|
+
})
|
|
242
|
+
.then((response) => {
|
|
243
|
+
view.goTo(response.extent);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
if (firstLayer.type === 'map-image') {
|
|
247
|
+
firstLayer.when(() => {
|
|
248
|
+
view.goTo(firstLayer.fullExtent);
|
|
161
249
|
});
|
|
250
|
+
}
|
|
162
251
|
}
|
|
163
252
|
|
|
164
253
|
const zoomPosition =
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { base_layers } from '../../constants';
|
|
2
2
|
|
|
3
|
+
const customBaselayers = [['positron-composite', 'positron-composite']];
|
|
4
|
+
|
|
3
5
|
const BaseLayerSchema = {
|
|
4
6
|
title: 'Base Layer',
|
|
5
7
|
fieldsets: [
|
|
@@ -12,7 +14,7 @@ const BaseLayerSchema = {
|
|
|
12
14
|
properties: {
|
|
13
15
|
base_layer: {
|
|
14
16
|
title: 'Base Layer',
|
|
15
|
-
choices: base_layers,
|
|
17
|
+
choices: [...customBaselayers, ...base_layers],
|
|
16
18
|
},
|
|
17
19
|
},
|
|
18
20
|
required: [],
|
|
@@ -102,10 +104,12 @@ const GeneralSchema = ({ data = {} }) => {
|
|
|
102
104
|
long: {
|
|
103
105
|
title: 'Longitude',
|
|
104
106
|
type: 'number',
|
|
107
|
+
description: `Will set the map center long coordinate. See: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-MapView.html#center`,
|
|
105
108
|
},
|
|
106
109
|
lat: {
|
|
107
110
|
title: 'Latitude',
|
|
108
111
|
type: 'number',
|
|
112
|
+
description: `Will set the map center lat coordinate. See: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-MapView.html#center`,
|
|
109
113
|
},
|
|
110
114
|
|
|
111
115
|
print_position: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Icon } from '@plone/volto/components';
|
|
3
|
-
import { Input, Select, Button, Grid } from 'semantic-ui-react';
|
|
3
|
+
import { Input, Select, Button, Grid, Checkbox } from 'semantic-ui-react';
|
|
4
4
|
import { QueryBuilder } from 'react-querybuilder';
|
|
5
5
|
import 'react-querybuilder/dist/query-builder.css';
|
|
6
6
|
|
|
@@ -31,6 +31,7 @@ const LayerSelectWidget = (props) => {
|
|
|
31
31
|
fields = [],
|
|
32
32
|
query = '',
|
|
33
33
|
description = '',
|
|
34
|
+
hide = false,
|
|
34
35
|
} = value;
|
|
35
36
|
|
|
36
37
|
const [mapData, setMapData] = React.useState(map_data);
|
|
@@ -53,11 +54,18 @@ const LayerSelectWidget = (props) => {
|
|
|
53
54
|
setMapData(mapData);
|
|
54
55
|
setServiceUrlError('');
|
|
55
56
|
if (mapData.layers && mapData.layers.length > 0) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
const mappedLayers = mapData.layers
|
|
58
|
+
.filter(
|
|
59
|
+
(layer) => layer && layer.type && layer.type !== 'Group Layer',
|
|
60
|
+
)
|
|
61
|
+
.map((layer, i) => {
|
|
62
|
+
return {
|
|
63
|
+
key: layer.id,
|
|
64
|
+
value: layer,
|
|
65
|
+
text: `${layer.name} (${layer.type})`,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
setAvailableLayers(mappedLayers);
|
|
61
69
|
}
|
|
62
70
|
onChange(id, {
|
|
63
71
|
...value,
|
|
@@ -66,6 +74,7 @@ const LayerSelectWidget = (props) => {
|
|
|
66
74
|
available_layers: availableLayers,
|
|
67
75
|
map_data: mapData,
|
|
68
76
|
description,
|
|
77
|
+
hide,
|
|
69
78
|
});
|
|
70
79
|
} catch (e) {
|
|
71
80
|
setCheckColor('youtube');
|
|
@@ -183,6 +192,14 @@ const LayerSelectWidget = (props) => {
|
|
|
183
192
|
setSelectedLayer(layer);
|
|
184
193
|
setMapData(map_data);
|
|
185
194
|
};
|
|
195
|
+
|
|
196
|
+
const handleHideInLegend = (v) => {
|
|
197
|
+
onChange(id, {
|
|
198
|
+
...value,
|
|
199
|
+
hide: v,
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
|
|
186
203
|
return (
|
|
187
204
|
<div
|
|
188
205
|
style={{
|
|
@@ -266,7 +283,7 @@ const LayerSelectWidget = (props) => {
|
|
|
266
283
|
</Grid.Row>
|
|
267
284
|
</div>
|
|
268
285
|
)}
|
|
269
|
-
{availableLayers && availableLayers.length > 0 && (
|
|
286
|
+
{availableLayers && availableLayers.length > 0 && selectedLayer && (
|
|
270
287
|
<div className="spaced-row">
|
|
271
288
|
<Grid.Row stretched>
|
|
272
289
|
<h5 style={{ padding: '0', margin: '15px 0px 5px 0px' }}>
|
|
@@ -285,6 +302,14 @@ const LayerSelectWidget = (props) => {
|
|
|
285
302
|
/>
|
|
286
303
|
</div>
|
|
287
304
|
</Grid.Row>
|
|
305
|
+
<Grid.Row stretched>
|
|
306
|
+
<h5>Hide in legend:</h5>{' '}
|
|
307
|
+
<Checkbox
|
|
308
|
+
label="Layer will be hidden in legend"
|
|
309
|
+
checked={hide}
|
|
310
|
+
onChange={(e, { checked }) => handleHideInLegend(checked)}
|
|
311
|
+
/>
|
|
312
|
+
</Grid.Row>
|
|
288
313
|
</div>
|
|
289
314
|
)}
|
|
290
315
|
{availableLayers && fields && fields.length > 0 && (
|
|
@@ -107,8 +107,12 @@ const LegendWidget = (props) => {
|
|
|
107
107
|
? layers?.map_layers.slice(0, 3)
|
|
108
108
|
: layers?.map_layers;
|
|
109
109
|
|
|
110
|
+
const visible_layers = map_layers
|
|
111
|
+
? map_layers.filter((l) => !l?.map_layer?.hide)
|
|
112
|
+
: '';
|
|
113
|
+
|
|
110
114
|
const legendColumns =
|
|
111
|
-
|
|
115
|
+
visible_layers && setLegendColumns(visible_layers.length, device);
|
|
112
116
|
return (
|
|
113
117
|
<>
|
|
114
118
|
<div className="legend-container">
|
|
@@ -123,16 +127,16 @@ const LegendWidget = (props) => {
|
|
|
123
127
|
</h3>
|
|
124
128
|
</button>
|
|
125
129
|
<Grid columns={legendColumns}>
|
|
126
|
-
{(!
|
|
130
|
+
{(!visible_layers || visible_layers.length === 0) && (
|
|
127
131
|
<p>
|
|
128
132
|
No layer found for legend. Please add a map layer from editor.
|
|
129
133
|
</p>
|
|
130
134
|
)}
|
|
131
135
|
{expand && (
|
|
132
136
|
<Grid.Row divided>
|
|
133
|
-
{
|
|
134
|
-
|
|
135
|
-
|
|
137
|
+
{visible_layers &&
|
|
138
|
+
visible_layers.length > 0 &&
|
|
139
|
+
visible_layers.map((l, i) => (
|
|
136
140
|
<LayerLegend
|
|
137
141
|
key={i}
|
|
138
142
|
data={l.map_layer}
|