@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 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.25",
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
@@ -90,6 +90,8 @@ export const Schema = (props) => {
90
90
  },
91
91
  height: {
92
92
  title: 'Height',
93
+ description:
94
+ 'Map block height in px. Default is 500px. Change only if necessary',
93
95
  type: 'number',
94
96
  },
95
97
  description: {
@@ -75,7 +75,7 @@ const View = (props) => {
75
75
 
76
76
  return (
77
77
  <div>
78
- <PrivacyProtection data={data} {...props}>
78
+ <PrivacyProtection data={data} height={height} {...props}>
79
79
  {mapData && (
80
80
  <div>
81
81
  <Webmap data={mapData} height={height} />
@@ -52,6 +52,7 @@ const ExtraViews = ({ data }) => {
52
52
  show_sources,
53
53
  data_provenance = {},
54
54
  } = data;
55
+
55
56
  return (
56
57
  <div className="extra-eea-map-content">
57
58
  {show_legend && map_data && (
@@ -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
- minScale: layer?.minScale,
105
- maxScale: layer?.maxScale,
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 || 'hybrid',
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
- .when(() => {
157
- return firstLayer.queryExtent();
158
- })
159
- .then((response) => {
160
- view.goTo(response.extent);
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 =
@@ -39,6 +39,7 @@ const VisualizationEditorWidget = (props) => {
39
39
  print_position: 'top-right',
40
40
  zoom_position: 'top-right',
41
41
  centerOnExtent: true,
42
+ scalebar: 'metric',
42
43
  },
43
44
  });
44
45
  }
@@ -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
- setAvailableLayers(
57
- mapData.layers.map((layer, i) => {
58
- return { key: layer.id, value: layer, text: layer.name };
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
- map_layers && setLegendColumns(map_layers.length, device);
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
- {(!map_layers || map_layers.length === 0) && (
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
- {map_layers &&
134
- map_layers.length > 0 &&
135
- map_layers.map((l, i) => (
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}