@eeacms/volto-eea-map 2.0.6 → 2.0.7

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,33 @@ 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
+ ### [2.0.7](https://github.com/eea/volto-eea-map/compare/2.0.6...2.0.7) - 10 November 2023
8
+
9
+ #### :rocket: New Features
10
+
11
+ - feat: mobile toolbar [Miu Razvan - [`0c8d2fa`](https://github.com/eea/volto-eea-map/commit/0c8d2fa66d175f97f5bed3fbb26de5841fa71905)]
12
+ - feat: use toolbar [Miu Razvan - [`d1c76bb`](https://github.com/eea/volto-eea-map/commit/d1c76bba44c7bf357276b908b00224a4d7837eae)]
13
+ - feat: share option, design improvements [dana-cfc4 - [`33a0d5e`](https://github.com/eea/volto-eea-map/commit/33a0d5e4c386b8507cfba4a59ea73131256e25a8)]
14
+
15
+ #### :bug: Bug Fixes
16
+
17
+ - fix: same background colour for popups [dana-cfc4 - [`61e465f`](https://github.com/eea/volto-eea-map/commit/61e465f36a272ee76311665d1a249c070524741d)]
18
+ - fix: volto version 16 [dana-cfc4 - [`abe9ac2`](https://github.com/eea/volto-eea-map/commit/abe9ac29e3657ff8773001d8a9e9b03f72c026a4)]
19
+ - fix: display figure note [dana-cfc4 - [`7f3d58f`](https://github.com/eea/volto-eea-map/commit/7f3d58f9828b9a0fd43075aed2c76559a16bd8fe)]
20
+
21
+ #### :house: Internal changes
22
+
23
+ - chore: husky, lint-staged use fixed versions [valentinab25 - [`0ee38a7`](https://github.com/eea/volto-eea-map/commit/0ee38a7bee84694a5e0230e2d17083fbc071f0c8)]
24
+ - chore:volto 16 in tests, update docs, fix stylelint overrides [valentinab25 - [`8efeb44`](https://github.com/eea/volto-eea-map/commit/8efeb4423da70e421a88cabdeb559eb3613fb96e)]
25
+ - chore: display legend for content type item, fix case when no note is set [dana-cfc4 - [`ae630a8`](https://github.com/eea/volto-eea-map/commit/ae630a88cffa2a8ef60e0bbfead392508b015497)]
26
+ - chore: display figureNote [dana-cfc4 - [`19fa10c`](https://github.com/eea/volto-eea-map/commit/19fa10c92a96d8362af5fbe460085405c4bad517)]
27
+ - chore: add toggle for more info -refs#257682 [dana-cfc4 - [`65d6b7b`](https://github.com/eea/volto-eea-map/commit/65d6b7ba7ae0a2aaf513c8ced0d2bb977e43ef1b)]
28
+ - chore: add figure note and more info extra views, display legend for content type item -refs#257682 [dana-cfc4 - [`720ab02`](https://github.com/eea/volto-eea-map/commit/720ab022cd99947d71c5b598a1637b12255d17af)]
29
+
30
+ #### :hammer_and_wrench: Others
31
+
32
+ - Refs #260203: make background_image required [laszlocseh - [`baa5c4f`](https://github.com/eea/volto-eea-map/commit/baa5c4fa2fe618af51df12d48b4512ecafc357a8)]
33
+ - use toolbar from volto-embed [Miu Razvan - [`29b73fb`](https://github.com/eea/volto-eea-map/commit/29b73fb8378ca56b3634bf1f7d57ce69a242b18e)]
7
34
  ### [2.0.6](https://github.com/eea/volto-eea-map/compare/2.0.5...2.0.6) - 29 September 2023
8
35
 
9
36
  #### :house: Internal changes
@@ -19,7 +46,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
19
46
 
20
47
  - test: EN locales, pre-commit fix, feature PRs checks Refs #257193 [valentinab25 - [`4c6d141`](https://github.com/eea/volto-eea-map/commit/4c6d1413b67ffc3fe27a7d09dcc99ef98867cec9)]
21
48
  - test: Fix package.json scripts to use makefile [Alin Voinea - [`1cd6751`](https://github.com/eea/volto-eea-map/commit/1cd675118165d8631c41d35c00a8c902c7edd803)]
22
- - test: Fix eslint and yarn i18n [Alin Voinea - [`0184641`](https://github.com/eea/volto-eea-map/commit/018464116ba5b86b2c1e0a4ebc9b2fd95b772b66)]
23
49
  - i18n: Add en [Alin Voinea - [`1d29304`](https://github.com/eea/volto-eea-map/commit/1d293049a21e138fa933cd5ed9a04cceac1a5cff)]
24
50
  ### [2.0.5](https://github.com/eea/volto-eea-map/compare/2.0.4...2.0.5) - 23 August 2023
25
51
 
@@ -76,14 +102,11 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
76
102
  #### :hammer_and_wrench: Others
77
103
 
78
104
  - Release 2.0.0 [Alin Voinea - [`7be280d`](https://github.com/eea/volto-eea-map/commit/7be280d4809186e663f422687aca3c33dd732904)]
79
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`ba6ed22`](https://github.com/eea/volto-eea-map/commit/ba6ed22118406db979457384d4739cced2096137)]
80
105
  ### [1.0.2](https://github.com/eea/volto-eea-map/compare/1.0.1...1.0.2) - 21 July 2023
81
106
 
82
107
  #### :hammer_and_wrench: Others
83
108
 
84
109
  - Allow blocks in content type [Tiberiu Ichim - [`2ac09a6`](https://github.com/eea/volto-eea-map/commit/2ac09a613aba07f6cbaf42c386660f2d7d09bd13)]
85
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`403b4c0`](https://github.com/eea/volto-eea-map/commit/403b4c009e5aaded58203bc292ba3baa4631488b)]
86
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`aedb654`](https://github.com/eea/volto-eea-map/commit/aedb6544fd45b147a3385425aba46ffba108f5ca)]
87
110
  ### [1.0.1](https://github.com/eea/volto-eea-map/compare/1.0.0...1.0.1) - 22 June 2023
88
111
 
89
112
  #### :rocket: New Features
@@ -144,7 +167,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
144
167
 
145
168
  - chore: clear unused #254131 [andreiggr - [`ccec2ea`](https://github.com/eea/volto-eea-map/commit/ccec2eaab173c905cd4ea0190a9c6cfd630250f9)]
146
169
  - chore: clear block style #254131 [andreiggr - [`af500bc`](https://github.com/eea/volto-eea-map/commit/af500bc10a5f280eff0335f45bae1596d66a7e6b)]
147
- - chore: [JENKINS] Remove alpha testing version [valentinab25 - [`76b29e5`](https://github.com/eea/volto-eea-map/commit/76b29e510f5156590723831a524bc39dfba6deba)]
148
170
 
149
171
  #### :hammer_and_wrench: Others
150
172
 
@@ -154,7 +176,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
154
176
  - * versions [andreiggr - [`6d9ff2b`](https://github.com/eea/volto-eea-map/commit/6d9ff2b26a236b6445678e3d84698d1c3c0826f4)]
155
177
  - add razzle-plugin-scss dep [andreiggr - [`d74cee5`](https://github.com/eea/volto-eea-map/commit/d74cee51d30c866afe55730e5b25e0bf11d2caea)]
156
178
  - volto-object-widget [andreiggr - [`18d0ed7`](https://github.com/eea/volto-eea-map/commit/18d0ed72c1ba7b0f7159a0eefc09ccea9acee5cb)]
157
- - Add Sonarqube tag using bise-frontend addons list [EEA Jenkins - [`5911d01`](https://github.com/eea/volto-eea-map/commit/5911d01f7f3bc79a2c834fab75a9a4ac05d2d042)]
158
179
  ### [0.1.32](https://github.com/eea/volto-eea-map/compare/0.1.31...0.1.32) - 20 February 2023
159
180
 
160
181
  #### :hammer_and_wrench: Others
@@ -162,7 +183,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
162
183
  - remove console.log [tedw87 - [`3aeb3e8`](https://github.com/eea/volto-eea-map/commit/3aeb3e8ec5474387f3cd22eb9b387c6681e17120)]
163
184
  - refactor code [tedw87 - [`6d7830e`](https://github.com/eea/volto-eea-map/commit/6d7830eb934f56c255eea5642bdefba30d892946)]
164
185
  - add Blossom basemap layer [tedw87 - [`5226ee2`](https://github.com/eea/volto-eea-map/commit/5226ee218df3401cf467afbc7a4d720dc30719e1)]
165
- - Add Sonarqube tag using cca-frontend addons list [EEA Jenkins - [`1dad5c6`](https://github.com/eea/volto-eea-map/commit/1dad5c6617096ff85223165a6dd2b1d5d7deea6a)]
166
186
  ### [0.1.31](https://github.com/eea/volto-eea-map/compare/0.1.30...0.1.31) - 11 November 2022
167
187
 
168
188
  #### :hammer_and_wrench: Others
package/README.md CHANGED
@@ -34,6 +34,8 @@ Sources (Data provenance) should be set on the visualization. To enable this, "E
34
34
 
35
35
  After this, sources can be added from the visualization edit interface. "Data Provenance" tab => "Add source"
36
36
 
37
+ [EEA MAP](https://raw.githubusercontent.com/eea/volto-eea-map/master/docs/volto-eea-map.gif)
38
+
37
39
  ## Getting started
38
40
 
39
41
  ### Try volto-eea-map with Docker
package/RELEASE.md CHANGED
@@ -20,9 +20,9 @@ You need to first install the [release-it](https://github.com/release-it/release
20
20
  ```
21
21
  npm install -g release-it
22
22
  ```
23
-
23
+
24
24
  Release-it uses the configuration written in the [`.release-it.json`](./.release-it.json) file located in the root of the repository.
25
-
25
+
26
26
  Release-it is a tool that automates 4 important steps in the release process:
27
27
 
28
28
  1. Version increase in `package.json` ( increased from the current version in `package.json`)
@@ -30,45 +30,45 @@ Release-it is a tool that automates 4 important steps in the release process:
30
30
  3. GitHub release on the commit with the changelog and package.json modification on the develop branch
31
31
  4. NPM release ( by default it's disabled, but can be enabled in the configuration file )
32
32
 
33
- To configure the authentification, you need to export GITHUB_TOKEN for [GitHub](https://github.com/settings/tokens)
33
+ To configure the authentification, you need to export GITHUB_TOKEN for [GitHub](https://github.com/settings/tokens)
34
34
 
35
35
  ```
36
36
  export GITHUB_TOKEN=XXX-XXXXXXXXXXXXXXXXXXXXXX
37
37
  ```
38
-
38
+
39
39
  To configure npm, you can use the `npm login` command or use a configuration file with a TOKEN :
40
-
40
+
41
41
  ```
42
42
  echo "//registry.npmjs.org/:_authToken=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" > .npmrc
43
43
  ```
44
44
 
45
45
  #### Using release-it tool
46
-
46
+
47
47
  There are 3 yarn scripts that can be run to do the release
48
48
 
49
49
  ##### yarn release-beta
50
50
 
51
- Automatically calculates and presents 3 beta versions - patch, minor and major for you to choose ( or Other for manual input).
51
+ Automatically calculates and presents 3 beta versions - patch, minor and major for you to choose ( or Other for manual input).
52
52
 
53
53
  ```
54
- ? Select increment (next version):
55
- ❯ prepatch (0.1.1-beta.0)
56
- preminor (0.2.0-beta.0)
57
- premajor (1.0.0-beta.0)
58
- Other, please specify...
54
+ ? Select increment (next version):
55
+ ❯ prepatch (0.1.1-beta.0)
56
+ preminor (0.2.0-beta.0)
57
+ premajor (1.0.0-beta.0)
58
+ Other, please specify...
59
59
  ```
60
60
 
61
61
  ##### yarn release-major-beta
62
62
 
63
63
  Same as `yarn release-beta`, but with premajor version pre-selected.
64
-
64
+
65
65
  ##### yarn release
66
66
 
67
67
  Generic command, does not automatically add the `beta` to version, but you can still manually write it if you choose Other.
68
68
 
69
69
  #### Important notes
70
70
 
71
- > Do not use release-it tool on master branch, the commit on CHANGELOG.md file and the version increase in the package.json file can't be done without a PULL REQUEST.
71
+ > Do not use release-it tool on master branch, the commit on CHANGELOG.md file and the version increase in the package.json file can't be done without a PULL REQUEST.
72
72
 
73
73
  > Do not keep Pull Requests from develop to master branches open when you are doing beta releases from the develop branch. As long as a PR to master is open, an automatic script will run on every commit and will update both the version and the changelog to a production-ready state - ( MAJOR.MINOR.PATCH mandatory format for version).
74
74
 
package/cypress.config.js CHANGED
@@ -2,12 +2,12 @@ const { defineConfig } = require('cypress');
2
2
 
3
3
  module.exports = defineConfig({
4
4
  viewportWidth: 1280,
5
- defaultCommandTimeout: 5000,
5
+ defaultCommandTimeout: 8888,
6
6
  chromeWebSecurity: false,
7
7
  reporter: 'junit',
8
- video: true,
8
+ video: false,
9
9
  retries: {
10
- runMode: 1,
10
+ runMode: 2,
11
11
  openMode: 0,
12
12
  },
13
13
  reporterOptions: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-eea-map",
3
- "version": "2.0.6",
3
+ "version": "2.0.7",
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",
@@ -36,8 +36,8 @@
36
36
  "babel-plugin-transform-class-properties": "^6.24.1",
37
37
  "cypress": "10.3.1",
38
38
  "cypress-fail-fast": "^5.0.1",
39
- "husky": "*",
40
- "lint-staged": "*",
39
+ "husky": "^8.0.3",
40
+ "lint-staged": "^14.0.1",
41
41
  "md5": "^2.3.0"
42
42
  },
43
43
  "lint-staged": {
@@ -16,7 +16,13 @@ import { applyQueriesToMapLayers } from '@eeacms/volto-eea-map/utils';
16
16
  import { getVisualization } from '@eeacms/volto-eea-map/actions';
17
17
 
18
18
  const Edit = (props) => {
19
- const { block, onChangeBlock, selected, data_provenance = {} } = props;
19
+ const {
20
+ block,
21
+ onChangeBlock,
22
+ selected,
23
+ data_provenance = {},
24
+ figure_note = [],
25
+ } = props;
20
26
  const schema = Schema(props);
21
27
  const [mapData, setMapData] = React.useState('');
22
28
  const data = React.useMemo(() => props.data, [props.data]);
@@ -29,20 +35,45 @@ const Edit = (props) => {
29
35
  show_legend: true,
30
36
  });
31
37
  }
38
+ if (!Object.hasOwn(data, 'show_note')) {
39
+ onChangeBlock(block, {
40
+ ...data,
41
+ show_note: true,
42
+ });
43
+ }
32
44
  if (!Object.hasOwn(data, 'show_sources')) {
33
45
  onChangeBlock(block, {
34
46
  ...data,
35
47
  show_sources: true,
36
48
  });
37
49
  }
50
+ if (!Object.hasOwn(data, 'show_more_info')) {
51
+ onChangeBlock(block, {
52
+ ...data,
53
+ show_more_info: true,
54
+ });
55
+ }
38
56
  if (!Object.hasOwn(data, 'dataprotection')) {
39
57
  onChangeBlock(block, {
40
58
  ...data,
41
59
  dataprotection: { enabled: true },
42
60
  });
43
61
  }
62
+ if (!Object.hasOwn(data, 'show_share')) {
63
+ onChangeBlock(block, {
64
+ ...data,
65
+ show_share: true,
66
+ });
67
+ }
44
68
  // eslint-disable-next-line react-hooks/exhaustive-deps
45
- }, [data.show_legend, data.show_sources, data.dataprotection]);
69
+ }, [
70
+ data.show_legend,
71
+ data.show_note,
72
+ data.show_sources,
73
+ data.show_more_info,
74
+ data.dataprotection,
75
+ data.show_share,
76
+ ]);
46
77
 
47
78
  React.useEffect(() => {
48
79
  if (props.data.vis_url) {
@@ -74,6 +105,7 @@ const Edit = (props) => {
74
105
  data={{
75
106
  ...data,
76
107
  data_provenance,
108
+ figure_note,
77
109
  map_data: props.map_visualization,
78
110
  }}
79
111
  />
@@ -104,6 +136,11 @@ export default compose(
104
136
  connect(
105
137
  (state, props) => ({
106
138
  data_query: state.content.data.data_query,
139
+ '@id': props.data.vis_url
140
+ ? state.map_visualizations?.data[
141
+ expandToBackendURL(props.data.vis_url)
142
+ ]?.['@id']
143
+ : props.content?.['@id'],
107
144
  map_visualization: props.data.vis_url
108
145
  ? state.map_visualizations?.data[expandToBackendURL(props.data.vis_url)]
109
146
  ?.data
@@ -112,6 +149,10 @@ export default compose(
112
149
  ? state.map_visualizations?.data[expandToBackendURL(props.data.vis_url)]
113
150
  ?.data_provenance
114
151
  : '',
152
+ figure_note: props.data.vis_url
153
+ ? state.map_visualizations?.data[expandToBackendURL(props.data.vis_url)]
154
+ ?.figure_note
155
+ : '',
115
156
  }),
116
157
  {
117
158
  getVisualization,
@@ -60,10 +60,11 @@ const ProtectionSchema = () => ({
60
60
  background_image: {
61
61
  title: 'Static map preview image',
62
62
  widget: 'file',
63
+ required: true,
63
64
  },
64
65
  },
65
66
 
66
- required: [],
67
+ required: ['background_image'],
67
68
  });
68
69
 
69
70
  export const Schema = (props) => {
@@ -83,14 +84,26 @@ export const Schema = (props) => {
83
84
  'vis_url',
84
85
  'description',
85
86
  'height',
87
+ 'enable_queries',
88
+ ...(props.data.enable_queries ? ['data_query_params'] : []),
89
+ ],
90
+ },
91
+ {
92
+ id: 'toolbar',
93
+ title: 'Toolbar',
94
+ fields: [
86
95
  'show_legend',
87
96
  'show_viewer',
97
+ 'show_note',
88
98
  'show_sources',
89
- 'enable_queries',
90
- ...(props.data.enable_queries ? ['data_query_params'] : []),
91
- 'dataprotection',
99
+ 'show_more_info',
100
+ 'show_share',
92
101
  ],
93
102
  },
103
+ {
104
+ fields: ['dataprotection'],
105
+ title: 'Data Protection',
106
+ },
94
107
  ],
95
108
  properties: {
96
109
  vis_url: {
@@ -107,10 +120,26 @@ export const Schema = (props) => {
107
120
  title: 'Description',
108
121
  widget: 'slate',
109
122
  },
123
+ show_note: {
124
+ title: 'Show note',
125
+ type: 'boolean',
126
+ defaultValue: true,
127
+ },
110
128
  show_sources: {
111
129
  title: 'Show sources',
112
130
  description: 'Will show sources set in this page Data provenance',
113
131
  type: 'boolean',
132
+ defaultValue: true,
133
+ },
134
+ show_more_info: {
135
+ title: 'Show more info',
136
+ type: 'boolean',
137
+ defaultValue: true,
138
+ },
139
+ show_share: {
140
+ title: 'Show share button',
141
+ type: 'boolean',
142
+ defaultValue: true,
114
143
  },
115
144
  show_legend: {
116
145
  title: 'Show legend',
@@ -13,7 +13,7 @@ import { applyQueriesToMapLayers } from '@eeacms/volto-eea-map/utils';
13
13
  import { getVisualization } from '@eeacms/volto-eea-map/actions';
14
14
 
15
15
  const View = (props) => {
16
- const { data, data_provenance = {} } = props || {};
16
+ const { data, data_provenance = {}, figure_note = [] } = props || {};
17
17
  const { height = '' } = data;
18
18
 
19
19
  const [mapData, setMapData] = React.useState('');
@@ -44,18 +44,24 @@ const View = (props) => {
44
44
  ]);
45
45
 
46
46
  return (
47
- <PrivacyProtection data={data} {...props}>
47
+ <PrivacyProtection
48
+ data={data}
49
+ className="embed-map-visualization"
50
+ {...props}
51
+ >
48
52
  {mapData && (
49
- <div>
53
+ <>
50
54
  <Webmap data={mapData} height={height} />
51
55
  <ExtraViews
52
56
  data={{
53
57
  ...data,
54
58
  data_provenance,
59
+ figure_note,
55
60
  map_data: props.map_visualization,
61
+ '@id': props['@id'],
56
62
  }}
57
63
  />
58
- </div>
64
+ </>
59
65
  )}
60
66
  {!mapData && (
61
67
  <p>No map view to show. Set visualization in block configuration.</p>
@@ -67,6 +73,11 @@ const View = (props) => {
67
73
  export default compose(
68
74
  connect(
69
75
  (state, props) => ({
76
+ '@id': props.data.vis_url
77
+ ? state.map_visualizations?.data[
78
+ expandToBackendURL(props.data.vis_url)
79
+ ]?.['@id']
80
+ : props.content?.['@id'],
70
81
  map_visualization: props.data.vis_url
71
82
  ? state.map_visualizations?.data[expandToBackendURL(props.data.vis_url)]
72
83
  ?.data
@@ -75,6 +86,10 @@ export default compose(
75
86
  ? state.map_visualizations?.data[expandToBackendURL(props.data.vis_url)]
76
87
  ?.data_provenance
77
88
  : '',
89
+ figure_note: props.data.vis_url
90
+ ? state.map_visualizations?.data[expandToBackendURL(props.data.vis_url)]
91
+ ?.figure_note
92
+ : '',
78
93
  }),
79
94
  {
80
95
  getVisualization,
@@ -2,7 +2,7 @@ import { updateBlockQueryFromPageQuery } from '@eeacms/volto-eea-map/utils';
2
2
 
3
3
  const deepUpdateDataQueryParams = (block, data, data_query, onChangeBlock) => {
4
4
  // If block data_query_params do not exist, init them
5
- if (!data?.data_query_params) {
5
+ if (!data?.data_query_params && data_query) {
6
6
  onChangeBlock(block, {
7
7
  ...data,
8
8
  data_query_params: [...data_query],
@@ -1,27 +1,65 @@
1
- import React from 'react';
1
+ import React, { useEffect, useState, useRef } from 'react';
2
+ import { connect } from 'react-redux';
3
+ import cx from 'classnames';
2
4
  import { serializeNodes } from '@plone/volto-slate/editor/render';
5
+ import {
6
+ FigureNote,
7
+ Sources,
8
+ MoreInfo,
9
+ Share,
10
+ } from '@eeacms/volto-embed/Toolbar';
3
11
  import LegendView from '@eeacms/volto-eea-map/components/LegendView';
4
- import Sources from './Sources';
5
12
 
6
- const ExtraViews = ({ data }) => {
13
+ import '@eeacms/volto-embed/Toolbar/styles.less';
14
+
15
+ const ExtraViews = ({ data, screen }) => {
16
+ const toolbar = useRef();
17
+ const [mobile, setMobile] = useState(false);
7
18
  const {
8
19
  map_data = {},
9
20
  description,
10
21
  show_legend,
11
22
  show_viewer,
12
- show_sources,
23
+ show_note = true,
24
+ show_sources = true,
25
+ show_more_info = true,
26
+ show_share = true,
13
27
  data_provenance = {},
28
+ figure_note = [],
14
29
  } = data;
15
30
 
31
+ useEffect(() => {
32
+ if (toolbar.current) {
33
+ const toolbarParentWidth = toolbar.current.parentElement.offsetWidth;
34
+
35
+ if (toolbarParentWidth < 600 && !mobile) {
36
+ setMobile(true);
37
+ } else if (toolbarParentWidth >= 600 && mobile) {
38
+ setMobile(false);
39
+ }
40
+ }
41
+ }, [screen, mobile]);
42
+
16
43
  return (
17
- <div className="extra-eea-map-content">
44
+ <>
18
45
  {show_legend && map_data && (
19
46
  <LegendView data={map_data} show_viewer={show_viewer} />
20
47
  )}
21
- {show_sources && <Sources sources={data_provenance?.data} />}
48
+ <div className={cx('visualization-toolbar', { mobile })} ref={toolbar}>
49
+ <div className="left-col">
50
+ {show_note && <FigureNote note={figure_note || []} />}
51
+ {show_sources && <Sources sources={data_provenance?.data} />}
52
+ {show_more_info && <MoreInfo href={data['@id']} />}
53
+ </div>
54
+ <div className="right-col">
55
+ {show_share && <Share href={data['@id']} />}
56
+ </div>
57
+ </div>
22
58
  {description && serializeNodes(description)}
23
- </div>
59
+ </>
24
60
  );
25
61
  };
26
62
 
27
- export default ExtraViews;
63
+ export default connect((state) => ({
64
+ screen: state.screen,
65
+ }))(ExtraViews);
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import cx from 'classnames';
3
+ import { Popup } from 'semantic-ui-react';
4
+ import {
5
+ serializeNodes,
6
+ serializeNodesToText,
7
+ } from '@plone/volto-slate/editor/render';
8
+ import { isArray } from 'lodash';
9
+
10
+ export const serializeText = (note) => {
11
+ if (!serializeNodesToText(note))
12
+ return <p>There are no notes set for this visualization</p>;
13
+ return isArray(note) ? serializeNodes(note) : note;
14
+ };
15
+
16
+ const FigureNote = ({ note = [] }) => {
17
+ const [expanded, setExpanded] = React.useState(false);
18
+ return (
19
+ <div className="eea-map-note-container">
20
+ <Popup
21
+ position="bottom left"
22
+ popper={{ id: 'eea-map-note-popup' }}
23
+ trigger={
24
+ <button className={cx('eea-map-note-button', { expanded })}>
25
+ Note
26
+ </button>
27
+ }
28
+ on="click"
29
+ onClose={() => {
30
+ setExpanded(false);
31
+ }}
32
+ onOpen={() => {
33
+ setExpanded(true);
34
+ }}
35
+ >
36
+ <Popup.Content>{serializeText(note)}</Popup.Content>
37
+ </Popup>
38
+ </div>
39
+ );
40
+ };
41
+
42
+ export default FigureNote;
@@ -1,11 +1,9 @@
1
1
  import React from 'react';
2
2
  import { Button, Grid } from 'semantic-ui-react';
3
+ import cx from 'classnames';
3
4
  import { fetchArcGISData, setLegendColumns } from '../utils';
4
- import { Icon } from '@plone/volto/components';
5
5
  import { serializeNodes } from '@plone/volto-slate/editor/render';
6
6
 
7
- import rightKeySVG from '@plone/volto/icons/right-key.svg';
8
- import downKeySVG from '@plone/volto/icons/down-key.svg';
9
7
  import { withDeviceSize } from '@eeacms/volto-eea-map/hocs';
10
8
 
11
9
  import codeSVG from '@eeacms/volto-eea-map/static/code-line.svg';
@@ -40,14 +38,7 @@ const LayerLegend = ({ data, show_viewer }) => {
40
38
  justifyContent: 'space-between',
41
39
  }}
42
40
  >
43
- <h5
44
- style={{
45
- marginTop: '15px',
46
- marginBottom: '5px',
47
- }}
48
- >
49
- {name}
50
- </h5>
41
+ <h5 style={{ marginBottom: '0.5rem' }}>{name}</h5>
51
42
  {show_viewer && map_service_url && (
52
43
  <a
53
44
  target="_blank"
@@ -112,41 +103,42 @@ const LegendView = (props) => {
112
103
 
113
104
  const legendColumns =
114
105
  map_layers && setLegendColumns(map_layers.length, device);
106
+
115
107
  return (
116
- <>
117
- <div className="legend-container">
118
- <button className="legend-action" onClick={() => setExpand(!expand)}>
119
- {/* <h3 role="presentation" className="legend-title"> */}
120
- <Icon
121
- name={expand ? downKeySVG : rightKeySVG}
122
- title={expand ? 'Collapse' : 'Expand'}
123
- size="17px"
124
- />
125
- Legend:
126
- {/* </h3> */}
127
- </button>
128
- <Grid columns={legendColumns}>
129
- {(!map_layers || map_layers.length === 0) && (
130
- <p>
131
- No layer found for legend. Please add a map layer from editor.
132
- </p>
133
- )}
134
- {expand && (
135
- <Grid.Row divided>
136
- {map_layers &&
137
- map_layers.length > 0 &&
138
- map_layers.map((l, i) => (
139
- <LayerLegend
140
- key={i}
141
- data={l.map_layer}
142
- show_viewer={show_viewer}
143
- />
144
- ))}
145
- </Grid.Row>
146
- )}
108
+ <div className={cx('legend-toolbar', { open: expand })}>
109
+ <button
110
+ className={cx('trigger-button', { open: expand })}
111
+ onClick={() => setExpand(!expand)}
112
+ >
113
+ Legend
114
+ <i
115
+ className={cx({
116
+ 'ri-arrow-right-s-line': !expand,
117
+ 'ri-arrow-down-s-line': expand,
118
+ })}
119
+ />
120
+ </button>
121
+ {expand && (
122
+ <Grid className="legend-container" columns={legendColumns}>
123
+ <Grid.Row divided>
124
+ {(!map_layers || map_layers.length === 0) && (
125
+ <Grid.Column>
126
+ <p>
127
+ No layer found for legend. Please add a map layer from editor.
128
+ </p>
129
+ </Grid.Column>
130
+ )}
131
+ {map_layers?.map((l, i) => (
132
+ <LayerLegend
133
+ key={i}
134
+ data={l.map_layer}
135
+ show_viewer={show_viewer}
136
+ />
137
+ ))}
138
+ </Grid.Row>
147
139
  </Grid>
148
- </div>
149
- </>
140
+ )}
141
+ </div>
150
142
  );
151
143
  };
152
144
 
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import cx from 'classnames';
3
+ import { UniversalLink } from '@plone/volto/components';
4
+
5
+ const Link = ({ children, ...props }) => {
6
+ if (props.href) {
7
+ return <UniversalLink {...props}>{children}</UniversalLink>;
8
+ }
9
+ return <span {...props}>{children}</span>;
10
+ };
11
+
12
+ const MoreInfoLink = ({ contentTypeLink }) => {
13
+ return (
14
+ <Link href={contentTypeLink}>
15
+ <button className={cx('eea-map-more-info-button')}>
16
+ More info <i class="ri-external-link-line"></i>
17
+ </button>
18
+ </Link>
19
+ );
20
+ };
21
+
22
+ export default MoreInfoLink;
@@ -0,0 +1,69 @@
1
+ import React from 'react';
2
+ import { Popup, Input, Button } from 'semantic-ui-react';
3
+ import { useCopyToClipboard } from '../utils.js';
4
+ import cx from 'classnames';
5
+
6
+ const Share = ({ contentTypeLink = '' }) => {
7
+ const [expanded, setExpanded] = React.useState(false);
8
+ const popupRef = React.useRef();
9
+
10
+ const CopyUrlButton = ({ className, url, buttonText }) => {
11
+ const [copyUrlStatus, copyUrl] = useCopyToClipboard(url);
12
+
13
+ if (copyUrlStatus === 'copied') {
14
+ buttonText = 'Copied!';
15
+ } else if (copyUrlStatus === 'failed') {
16
+ buttonText = 'Copy failed. Please try again.';
17
+ }
18
+
19
+ return (
20
+ <Button
21
+ primary
22
+ onClick={copyUrl}
23
+ className={cx('copy-button', className)}
24
+ >
25
+ {buttonText}
26
+ </Button>
27
+ );
28
+ };
29
+
30
+ return (
31
+ <Popup
32
+ popper={{ id: 'eea-map-share-popup' }}
33
+ trigger={
34
+ <div className="eea-map-share-container">
35
+ <button className={cx('eea-map-share-button', { expanded })}>
36
+ <span>Share</span>
37
+ <i class="ri-share-fill"></i>
38
+ </button>
39
+ </div>
40
+ }
41
+ position="bottom left"
42
+ on="click"
43
+ onClose={() => {
44
+ setExpanded(false);
45
+ }}
46
+ onOpen={() => {
47
+ setExpanded(true);
48
+ }}
49
+ ref={popupRef}
50
+ >
51
+ <div>
52
+ <span className="eea-map-share-popup-text">Copy link</span>
53
+ <div className="eea-map-share-popup-container">
54
+ <Input
55
+ className="eea-map-share-link"
56
+ defaultValue={contentTypeLink}
57
+ />
58
+ <CopyUrlButton
59
+ className="eea-map-copy-button"
60
+ url={contentTypeLink}
61
+ buttonText="Copy"
62
+ />
63
+ </div>
64
+ </div>
65
+ </Popup>
66
+ );
67
+ };
68
+
69
+ export default Share;
@@ -360,7 +360,7 @@ const Webmap = (props) => {
360
360
  `;
361
361
 
362
362
  return (
363
- <div>
363
+ <div className="esri-map-wrapper">
364
364
  <style>{dynamicStyle}</style>
365
365
  <div ref={mapRef} className="esri-map"></div>
366
366
  </div>
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import Webmap from '../Webmap';
3
+ import LegendView from '../LegendView';
3
4
  import { hasBlocksData } from '@plone/volto/helpers';
4
5
  import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
5
6
 
@@ -13,7 +14,10 @@ const VisualizationView = (props) => {
13
14
  {hasBlocksData(content) ? (
14
15
  <RenderBlocks {...props} />
15
16
  ) : (
16
- <Webmap data={map_visualization_data} />
17
+ <>
18
+ <Webmap data={map_visualization_data} />
19
+ <LegendView data={map_visualization_data} show_viewer={true} />
20
+ </>
17
21
  )}
18
22
  </div>
19
23
  );
@@ -1,6 +1,12 @@
1
1
  import Webmap from '../Webmap';
2
+ import LegendView from '../LegendView';
2
3
 
3
4
  export default function VisualizationViewWidget(props) {
4
5
  const { value: map_visualization_data = {} } = props;
5
- return <Webmap data={map_visualization_data} />;
6
+ return (
7
+ <>
8
+ <Webmap data={map_visualization_data} />
9
+ <LegendView data={map_visualization_data} show_viewer={true} />
10
+ </>
11
+ );
6
12
  }
@@ -15,6 +15,10 @@
15
15
 
16
16
  @import './variables.less';
17
17
 
18
+ .esri-map-wrapper {
19
+ margin-bottom: 1rem;
20
+ }
21
+
18
22
  // TODO: pull out colors and dimensions into variables
19
23
  .map-edit-container {
20
24
  display: flex;
@@ -182,7 +186,6 @@
182
186
  .legend-container {
183
187
  display: flex;
184
188
  flex-direction: column;
185
- margin: 15px 0;
186
189
  }
187
190
 
188
191
  .map_source_param_container {
@@ -198,23 +201,6 @@
198
201
  padding: 2px 15px !important;
199
202
  }
200
203
 
201
- .legend-action {
202
- z-index: 22;
203
- display: inline-flex;
204
- align-items: center;
205
- padding-bottom: 3px;
206
- border: none;
207
- background: transparent;
208
- background-color: transparent;
209
- color: #3d5265;
210
- cursor: pointer;
211
- font-weight: bold;
212
-
213
- &:hover {
214
- color: @secondaryColor;
215
- }
216
- }
217
-
218
204
  .map-number-input {
219
205
  padding: 5px !important;
220
206
  }
@@ -225,43 +211,25 @@
225
211
  color: green;
226
212
  }
227
213
 
228
- /* sources */
229
-
230
- .eea-map-sources-list {
231
- margin: 0;
232
- list-style: decimal inside;
233
- padding-inline-start: 0;
234
- }
235
-
236
- #eea-map-sources-popup .ui.popup {
237
- min-width: 600px;
238
- background-color: #f9f9f9;
239
- box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px;
240
- }
214
+ .eea-map-info {
215
+ display: flex;
216
+ flex-direction: row;
241
217
 
242
- .eea-map-sources-button {
243
- display: inline-flex;
244
- align-items: center;
245
- padding-top: 10px;
246
- padding-bottom: 3px;
247
- border: none;
248
- background-color: transparent;
249
- color: @textColor;
250
- cursor: pointer;
251
- font-weight: bold;
218
+ > * {
219
+ padding: 0 0.5rem;
220
+ border-collapse: collapse;
221
+ }
252
222
 
253
- .icon {
254
- margin-left: 0.5rem;
223
+ > *:first-child {
224
+ padding-left: 0;
255
225
  }
256
226
 
257
- &:hover {
258
- color: @secondaryColor;
227
+ > *:last-child {
228
+ padding-right: 0;
259
229
  }
260
230
 
261
- &.expanded {
262
- padding-bottom: 0;
263
- border-bottom: 3px solid @secondaryColor;
264
- color: @secondaryColor;
231
+ > *:not(:last-child) {
232
+ border-right: 1px solid @textColor;
265
233
  }
266
234
  }
267
235
 
@@ -282,9 +250,4 @@
282
250
  max-width: 0.2cm;
283
251
  height: 0.2cm;
284
252
  }
285
-
286
- .eea-map-sources-container,
287
- #eea-map-sources-popup {
288
- display: none;
289
- }
290
253
  }
package/src/utils.js CHANGED
@@ -1,5 +1,7 @@
1
1
  /* eslint-disable no-throw-literal */
2
+ import React from 'react';
2
3
  import { getBaseUrl } from '@plone/volto/helpers';
4
+
3
5
  const setLegendColumns = (legendsNo, device) => {
4
6
  switch (device) {
5
7
  case 'widescreen':
@@ -118,9 +120,32 @@ const updateBlockQueryFromPageQuery = (data_query, data_query_params) => {
118
120
  return newDataQuery;
119
121
  };
120
122
 
123
+ const useCopyToClipboard = (text) => {
124
+ const [copyStatus, setCopyStatus] = React.useState('inactive');
125
+ const copy = React.useCallback(() => {
126
+ navigator.clipboard.writeText(text).then(
127
+ () => setCopyStatus('copied'),
128
+ () => setCopyStatus('failed'),
129
+ );
130
+ }, [text]);
131
+
132
+ React.useEffect(() => {
133
+ if (copyStatus === 'inactive') {
134
+ return;
135
+ }
136
+
137
+ const timeout = setTimeout(() => setCopyStatus('inactive'), 3000);
138
+
139
+ return () => clearTimeout(timeout);
140
+ }, [copyStatus]);
141
+
142
+ return [copyStatus, copy];
143
+ };
144
+
121
145
  export {
122
146
  setLegendColumns,
123
147
  fetchArcGISData,
124
148
  applyQueriesToMapLayers,
125
149
  updateBlockQueryFromPageQuery,
150
+ useCopyToClipboard,
126
151
  };