@eeacms/volto-eea-map 0.1.24 → 0.1.26
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 +20 -1
- package/package.json +3 -2
- package/src/components/Blocks/EmbedEEAMap/Edit.jsx +1 -2
- package/src/components/Blocks/EmbedEEAMap/Schema.js +70 -0
- package/src/components/Webmap.jsx +76 -10
- package/src/components/visualization/VisualizationEditorWidget.jsx +1 -0
- package/src/components/widgets/LayerSelectWidget.jsx +32 -7
- package/src/components/widgets/LegendWidget.jsx +9 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,12 +4,31 @@ 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.26](https://github.com/eea/volto-eea-map/compare/0.1.25...0.1.26) - 4 October 2022
|
|
8
|
+
|
|
9
|
+
#### :hammer_and_wrench: Others
|
|
10
|
+
|
|
11
|
+
- add integration to cypress [andreiggr - [`b92ab76`](https://github.com/eea/volto-eea-map/commit/b92ab764603088013894a0be6f84824fb6586464)]
|
|
12
|
+
- fix plugins cypress [andreiggr - [`61e3194`](https://github.com/eea/volto-eea-map/commit/61e319434b1e877dbb4fd29d5ca3d2028d9b5e0b)]
|
|
13
|
+
- use volto vers from env [andreiggr - [`52db93f`](https://github.com/eea/volto-eea-map/commit/52db93f8561e6b90e5d7569b3005e3ebb5274b26)]
|
|
14
|
+
- replace all alpha with specific alpha version [andreiggr - [`f0f1802`](https://github.com/eea/volto-eea-map/commit/f0f18026298e1cc061d62d82e320bf2066496c77)]
|
|
15
|
+
- update jenkins dependencies [andreiggr - [`d2bc043`](https://github.com/eea/volto-eea-map/commit/d2bc043f4039192d0b18bccb0c26ae8cae3d1089)]
|
|
16
|
+
- use specific volto alpha version [andreiggr - [`209988d`](https://github.com/eea/volto-eea-map/commit/209988df8e23fb5bc4631b8326740ea9d2969195)]
|
|
17
|
+
- Raster layer different centering mechanism [andreiggr - [`74c5fa5`](https://github.com/eea/volto-eea-map/commit/74c5fa57522197e621c9c4ba05f6b9cbed2b0e8f)]
|
|
18
|
+
- show raster layer [andreiggr - [`3193689`](https://github.com/eea/volto-eea-map/commit/3193689982db041ac343389e456db7a79447361d)]
|
|
19
|
+
- changes for hide layer in legend [andreiggr - [`5176df9`](https://github.com/eea/volto-eea-map/commit/5176df9971efb308f1e02f510021bf42d9a7c05c)]
|
|
20
|
+
- clean code [andreiggr - [`be3b1b8`](https://github.com/eea/volto-eea-map/commit/be3b1b86db7e5b243d3650cda17332bbbc70c71b)]
|
|
21
|
+
- hide layer in legend [andreiggr - [`675f1ba`](https://github.com/eea/volto-eea-map/commit/675f1ba4aec7037b2a7c28b73a075c0a93616546)]
|
|
22
|
+
### [0.1.25](https://github.com/eea/volto-eea-map/compare/0.1.24...0.1.25) - 27 September 2022
|
|
23
|
+
|
|
24
|
+
#### :hammer_and_wrench: Others
|
|
25
|
+
|
|
26
|
+
- Edit privacy schema [andreiggr - [`be71616`](https://github.com/eea/volto-eea-map/commit/be716166e61a11ab76a0081bf4c578f1ff748819)]
|
|
7
27
|
### [0.1.24](https://github.com/eea/volto-eea-map/compare/0.1.23...0.1.24) - 21 September 2022
|
|
8
28
|
|
|
9
29
|
#### :hammer_and_wrench: Others
|
|
10
30
|
|
|
11
31
|
- remove renderer module [andreiggr - [`d55e99c`](https://github.com/eea/volto-eea-map/commit/d55e99c189b79727f6e076ded737b920bead4c7d)]
|
|
12
|
-
- map layer proper url [andreiggr - [`297186d`](https://github.com/eea/volto-eea-map/commit/297186daeb52c7a01f134bd4c2f0ed778aa01238)]
|
|
13
32
|
### [0.1.23](https://github.com/eea/volto-eea-map/compare/0.1.22...0.1.23) - 15 September 2022
|
|
14
33
|
|
|
15
34
|
#### :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.26",
|
|
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",
|
|
@@ -9,7 +9,6 @@ import { getContent } from '@plone/volto/actions';
|
|
|
9
9
|
import BlockDataForm from '@plone/volto/components/manage/Form/BlockDataForm';
|
|
10
10
|
import View from './View';
|
|
11
11
|
import { Schema } from './Schema';
|
|
12
|
-
import { addPrivacyProtectionToSchema } from '@eeacms/volto-embed';
|
|
13
12
|
import '../../../styles/map.css';
|
|
14
13
|
|
|
15
14
|
import _ from 'lodash';
|
|
@@ -42,7 +41,7 @@ const Edit = (props) => {
|
|
|
42
41
|
<BlockDataForm
|
|
43
42
|
block={block}
|
|
44
43
|
title={schema.title}
|
|
45
|
-
schema={
|
|
44
|
+
schema={schema}
|
|
46
45
|
onChangeField={(id, value) => {
|
|
47
46
|
onChangeBlock(block, {
|
|
48
47
|
...data,
|
|
@@ -1,3 +1,68 @@
|
|
|
1
|
+
const ProtectionSchema = () => ({
|
|
2
|
+
title: 'Data Protection',
|
|
3
|
+
|
|
4
|
+
fieldsets: [
|
|
5
|
+
{
|
|
6
|
+
id: 'default',
|
|
7
|
+
title: 'Default',
|
|
8
|
+
fields: [
|
|
9
|
+
'privacy_statement',
|
|
10
|
+
'privacy_cookie_key',
|
|
11
|
+
'enabled',
|
|
12
|
+
'background_image',
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
|
|
17
|
+
properties: {
|
|
18
|
+
privacy_statement: {
|
|
19
|
+
title: 'Privacy statement',
|
|
20
|
+
description: 'Defined in template. Change only if necessary',
|
|
21
|
+
widget: 'slate_richtext',
|
|
22
|
+
className: 'slate-Widget',
|
|
23
|
+
defaultValue: [
|
|
24
|
+
{
|
|
25
|
+
children: [
|
|
26
|
+
{
|
|
27
|
+
text:
|
|
28
|
+
'This map is hosted by a third party, Environmental Systems Research Institute. By showing the external content you accept the terms and conditions of ',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: 'a',
|
|
32
|
+
url: 'https://www.esri.com',
|
|
33
|
+
children: [
|
|
34
|
+
{
|
|
35
|
+
text: 'esri.com',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
text:
|
|
41
|
+
'. This includes their cookie policies, which we have no control over.',
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
privacy_cookie_key: {
|
|
48
|
+
title: 'Privacy cookie key',
|
|
49
|
+
description: 'Use default for Esri maps, otherwise change',
|
|
50
|
+
defaultValue: 'esri-maps',
|
|
51
|
+
},
|
|
52
|
+
enabled: {
|
|
53
|
+
title: 'Data protection disclaimer enabled',
|
|
54
|
+
description: 'Enable/disable the privacy protection',
|
|
55
|
+
type: 'boolean',
|
|
56
|
+
},
|
|
57
|
+
background_image: {
|
|
58
|
+
title: 'Static map preview image',
|
|
59
|
+
widget: 'file',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
required: [],
|
|
64
|
+
});
|
|
65
|
+
|
|
1
66
|
export const Schema = (props) => {
|
|
2
67
|
return {
|
|
3
68
|
title: 'Embed EEA Map Block',
|
|
@@ -14,6 +79,7 @@ export const Schema = (props) => {
|
|
|
14
79
|
'show_sources',
|
|
15
80
|
'enable_queries',
|
|
16
81
|
...(props.data.enable_queries ? ['data_query_params'] : []),
|
|
82
|
+
'dataprotection',
|
|
17
83
|
],
|
|
18
84
|
},
|
|
19
85
|
],
|
|
@@ -56,6 +122,10 @@ export const Schema = (props) => {
|
|
|
56
122
|
'When using page level parameters to filter the map, please map those to the corresponding field name from the ArcGIS service',
|
|
57
123
|
widget: 'data_query_widget',
|
|
58
124
|
},
|
|
125
|
+
dataprotection: {
|
|
126
|
+
widget: 'object',
|
|
127
|
+
schema: ProtectionSchema(),
|
|
128
|
+
},
|
|
59
129
|
},
|
|
60
130
|
required: [],
|
|
61
131
|
};
|
|
@@ -17,6 +17,50 @@ const MODULES = [
|
|
|
17
17
|
'esri/widgets/ScaleBar',
|
|
18
18
|
];
|
|
19
19
|
|
|
20
|
+
//TODO: set group layers sublayers, for direct group import. Maybe also
|
|
21
|
+
// const setGroupLayers = async (ids, data, modules) => {
|
|
22
|
+
// const { map_service_url, sublayerDatalayer, fullLayer, query = '' } =
|
|
23
|
+
// data || {};
|
|
24
|
+
// const { FeatureLayer, MapImageLayer, GroupLayer } = modules;
|
|
25
|
+
|
|
26
|
+
// const glLayers = await Promise.all(
|
|
27
|
+
// ids.map(async (id) => {
|
|
28
|
+
// const sublayerUrl = `${map_service_url}/${id}`;
|
|
29
|
+
// let sublayerData = await fetchArcGISData(sublayerUrl);
|
|
30
|
+
// let sublayer;
|
|
31
|
+
// switch (sublayerData.type) {
|
|
32
|
+
// case 'Raster Layer':
|
|
33
|
+
// sublayer = new MapImageLayer({
|
|
34
|
+
// url: map_service_url,
|
|
35
|
+
// minScale: sublayerData?.minScale,
|
|
36
|
+
// maxScale: sublayerData?.maxScale,
|
|
37
|
+
// sublayers: [
|
|
38
|
+
// {
|
|
39
|
+
// id: sublayerData.id,
|
|
40
|
+
// visible: true,
|
|
41
|
+
// definitionExpression: query ? formatQuery(query, 'sql') : '',
|
|
42
|
+
// },
|
|
43
|
+
// ],
|
|
44
|
+
// });
|
|
45
|
+
// break;
|
|
46
|
+
// case 'Feature Layer':
|
|
47
|
+
// sublayer = new FeatureLayer({
|
|
48
|
+
// layerId: sublayerData.id,
|
|
49
|
+
// url: `${map_service_url}/${sublayerData.id}`,
|
|
50
|
+
// definitionExpression: query ? formatQuery(query, 'sql') : '',
|
|
51
|
+
// minScale: sublayerData?.minScale,
|
|
52
|
+
// maxScale: sublayerData?.maxScale,
|
|
53
|
+
// });
|
|
54
|
+
// break;
|
|
55
|
+
// default:
|
|
56
|
+
// break;
|
|
57
|
+
// }
|
|
58
|
+
// return sublayer;
|
|
59
|
+
// }),
|
|
60
|
+
// );
|
|
61
|
+
// return glLayers;
|
|
62
|
+
// };
|
|
63
|
+
|
|
20
64
|
const Webmap = (props) => {
|
|
21
65
|
const { editMode, height, id } = props;
|
|
22
66
|
|
|
@@ -101,8 +145,16 @@ const Webmap = (props) => {
|
|
|
101
145
|
case 'Raster Layer':
|
|
102
146
|
mapLayer = new MapImageLayer({
|
|
103
147
|
url: map_service_url,
|
|
104
|
-
|
|
105
|
-
|
|
148
|
+
sublayers: [
|
|
149
|
+
{
|
|
150
|
+
id: layer.id,
|
|
151
|
+
minScale: layer?.minScale,
|
|
152
|
+
maxScale: layer?.maxScale,
|
|
153
|
+
definitionExpression: query
|
|
154
|
+
? formatQuery(query, 'sql')
|
|
155
|
+
: '',
|
|
156
|
+
},
|
|
157
|
+
],
|
|
106
158
|
});
|
|
107
159
|
break;
|
|
108
160
|
case 'Feature Layer':
|
|
@@ -116,8 +168,15 @@ const Webmap = (props) => {
|
|
|
116
168
|
maxScale: layer?.maxScale,
|
|
117
169
|
});
|
|
118
170
|
break;
|
|
119
|
-
|
|
120
|
-
mapLayer = new GroupLayer({
|
|
171
|
+
//// case 'Group Layer':
|
|
172
|
+
// mapLayer = new GroupLayer({ title: layer.title });
|
|
173
|
+
// // mapLayer.addMany(
|
|
174
|
+
// // setGroupLayers(
|
|
175
|
+
// // layer.sublayersIds,
|
|
176
|
+
// // { map_service_url, layer, fullLayer, query },
|
|
177
|
+
// // modules,
|
|
178
|
+
// // ),
|
|
179
|
+
// // );
|
|
121
180
|
break;
|
|
122
181
|
default:
|
|
123
182
|
break;
|
|
@@ -152,13 +211,20 @@ const Webmap = (props) => {
|
|
|
152
211
|
|
|
153
212
|
if (layers && layers[0] && general && general.centerOnExtent) {
|
|
154
213
|
const firstLayer = layers[0];
|
|
155
|
-
firstLayer
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
214
|
+
if (firstLayer.type === 'feature') {
|
|
215
|
+
firstLayer
|
|
216
|
+
.when(() => {
|
|
217
|
+
return firstLayer.queryExtent();
|
|
218
|
+
})
|
|
219
|
+
.then((response) => {
|
|
220
|
+
view.goTo(response.extent);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
if (firstLayer.type === 'map-image') {
|
|
224
|
+
firstLayer.when(() => {
|
|
225
|
+
view.goTo(firstLayer.fullExtent);
|
|
161
226
|
});
|
|
227
|
+
}
|
|
162
228
|
}
|
|
163
229
|
|
|
164
230
|
const zoomPosition =
|
|
@@ -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}
|