@eeacms/volto-n2k 1.0.27 → 1.0.28

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,11 +4,14 @@ 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
- ### [1.0.27](https://github.com/eea/volto-n2k/compare/1.0.26...1.0.27) - 6 June 2023
7
+ ### [1.0.28](https://github.com/eea/volto-n2k/compare/1.0.27...1.0.28) - 7 June 2023
8
8
 
9
9
  #### :hammer_and_wrench: Others
10
10
 
11
- - fix navigation-anchors [Miu Razvan - [`5b140f7`](https://github.com/eea/volto-n2k/commit/5b140f7eea69aa5f310d62c25147a8c153415d2c)]
11
+ - prettier fix [Miu Razvan - [`3bf6510`](https://github.com/eea/volto-n2k/commit/3bf651046ff9f7cfb7e26fe97a2ac61f4ce00a48)]
12
+ - add more custom blocks [Miu Razvan - [`a94fe36`](https://github.com/eea/volto-n2k/commit/a94fe366dbd4fe5c679489e85950437dbed881e5)]
13
+ ### [1.0.27](https://github.com/eea/volto-n2k/compare/1.0.26...1.0.27) - 6 June 2023
14
+
12
15
  ### [1.0.26](https://github.com/eea/volto-n2k/compare/1.0.25...1.0.26) - 29 May 2023
13
16
 
14
17
  ### [1.0.25](https://github.com/eea/volto-n2k/compare/1.0.24...1.0.25) - 26 April 2023
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-n2k",
3
- "version": "1.0.27",
3
+ "version": "1.0.28",
4
4
  "description": "volto-n2k: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
@@ -10,7 +10,6 @@ export default () => ({
10
10
  properties: {
11
11
  theme: {
12
12
  title: 'Theme',
13
- type: 'array',
14
13
  choices: [
15
14
  ['light', 'Light'],
16
15
  ['dark', 'Dark'],
@@ -15,12 +15,10 @@ const getSchema = (props) => {
15
15
  properties: {
16
16
  value: {
17
17
  title: 'Value',
18
- type: 'array',
19
18
  choices,
20
19
  },
21
20
  linkValue: {
22
21
  title: 'Link value',
23
- type: 'array',
24
22
  choices,
25
23
  },
26
24
  textTemplate: {
@@ -14,7 +14,6 @@ const getContactFields = (props) => {
14
14
  properties: {
15
15
  icon: {
16
16
  title: 'Icon',
17
- type: 'array',
18
17
  choices: [
19
18
  ['domain', 'Domain'],
20
19
  ['location', 'Location'],
@@ -23,7 +22,6 @@ const getContactFields = (props) => {
23
22
  },
24
23
  dataEntity: {
25
24
  title: 'Data entity',
26
- type: 'array',
27
25
  choices,
28
26
  },
29
27
  },
@@ -17,7 +17,6 @@ const xColorSchema = (props) => {
17
17
  properties: {
18
18
  label: {
19
19
  title: 'Label',
20
- type: 'array',
21
20
  choices,
22
21
  },
23
22
  color: {
@@ -48,12 +47,10 @@ const getSchema = (props) => {
48
47
  properties: {
49
48
  x: {
50
49
  title: 'Value',
51
- type: 'array',
52
50
  choices,
53
51
  },
54
52
  y: {
55
53
  title: 'Label',
56
- type: 'array',
57
54
  choices,
58
55
  },
59
56
  x_colors: {
@@ -20,7 +20,6 @@ export default () => ({
20
20
  properties: {
21
21
  theme: {
22
22
  title: 'Theme',
23
- type: 'array',
24
23
  choices: [
25
24
  ['light', 'Light'],
26
25
  ['grey', 'Grey'],
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+
3
+ import './style.less';
4
+
5
+ const View = (props) => {
6
+ const { data = {} } = props;
7
+ const provider_data = props.provider_data || {};
8
+ const columns = provider_data[Object.keys(provider_data)?.[0]]?.length || 0;
9
+
10
+ return (
11
+ <div className="connected-labeled-list">
12
+ {props.mode === 'edit' ? <p>Connected labeled list</p> : ''}
13
+ <ul className={data.theme || 'default'}>
14
+ {Array(Math.max(0, columns))
15
+ .fill()
16
+ .map((_, column) => {
17
+ return (
18
+ <li key={`connected-list-${column}`}>
19
+ <span>
20
+ {(data.values || [])
21
+ .map((value) => provider_data[value.field]?.[column])
22
+ .join(data.separator || '')}
23
+ </span>
24
+ </li>
25
+ );
26
+ })}
27
+ </ul>
28
+ </div>
29
+ );
30
+ };
31
+
32
+ export default View;
@@ -0,0 +1,17 @@
1
+ import LabeledListView from './View';
2
+ import getSchema from './schema';
3
+
4
+ export default (config) => {
5
+ config.blocks.blocksConfig.custom_connected_block = {
6
+ ...config.blocks.blocksConfig.custom_connected_block,
7
+ blocks: {
8
+ ...config.blocks.blocksConfig.custom_connected_block.blocks,
9
+ labeled_list: {
10
+ view: LabeledListView,
11
+ getSchema: getSchema,
12
+ title: 'Labeled list',
13
+ },
14
+ },
15
+ };
16
+ return config;
17
+ };
@@ -0,0 +1,56 @@
1
+ import config from '@plone/volto/registry';
2
+
3
+ const getSchema = (props) => {
4
+ const data = props.provider_data || {};
5
+ const choices = Object.keys(data).map((key) => [key, key]);
6
+
7
+ const valueSchema = {
8
+ title: 'Value',
9
+ fieldsets: [{ id: 'default', title: 'Default', fields: ['field'] }],
10
+ properties: {
11
+ field: {
12
+ title: 'Field',
13
+ choices,
14
+ },
15
+ },
16
+ };
17
+
18
+ return {
19
+ title: 'Labeled list',
20
+
21
+ fieldsets: [
22
+ {
23
+ id: 'default',
24
+ title: 'Default',
25
+ fields: ['theme', 'values', 'separator'],
26
+ },
27
+ ],
28
+
29
+ properties: {
30
+ values: {
31
+ title: 'Values',
32
+ widget: 'object_list',
33
+ schema: valueSchema,
34
+ },
35
+ separator: {
36
+ title: 'Separator',
37
+ },
38
+ theme: {
39
+ title: 'Theme',
40
+ widget: 'theme_picker',
41
+ colors: [
42
+ ...(config.settings && config.settings.themeColors
43
+ ? config.settings.themeColors.map(({ value, title }) => ({
44
+ name: value,
45
+ label: title,
46
+ }))
47
+ : []),
48
+ ],
49
+ },
50
+ },
51
+
52
+ required: [],
53
+ };
54
+ };
55
+
56
+ export default getSchema;
@@ -0,0 +1,41 @@
1
+ @import (multiple, reference, optional) '../../theme.config';
2
+
3
+ @type: extra;
4
+ @element: custom;
5
+
6
+ .connected-labeled-list {
7
+ ul {
8
+ padding-left: 0;
9
+ margin-left: -0.5rem;
10
+ list-style-type: none;
11
+
12
+ li {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ padding: 0.25rem 0.5rem;
16
+ margin: 0.5rem;
17
+ border-radius: 6px;
18
+ font-size: 0.9rem;
19
+ font-weight: bold;
20
+ }
21
+
22
+ &.default li {
23
+ background-color: @grey-2;
24
+ }
25
+
26
+ &.primary li {
27
+ background-color: @primaryColor;
28
+ color: #fff;
29
+ }
30
+
31
+ &.secondary li {
32
+ background-color: @secondaryColor;
33
+ color: #fff;
34
+ }
35
+
36
+ &.tertiary li {
37
+ background-color: @tertiaryColor;
38
+ color: #fff;
39
+ }
40
+ }
41
+ }
@@ -1,35 +1,52 @@
1
1
  import React from 'react';
2
- import { Grid } from 'semantic-ui-react';
2
+ import { Icon } from '@plone/volto/components';
3
+
4
+ import arrowSVG from '@plone/volto/icons/up-key.svg';
5
+
3
6
  import './style.less';
4
7
 
5
8
  const View = (props) => {
6
9
  const { data = {} } = props;
7
10
  const provider_data = props.provider_data || {};
8
- const columns = provider_data[Object.keys(provider_data)?.[0]]?.length || 0;
11
+ const columns = React.useMemo(() => {
12
+ const temp = provider_data[Object.keys(provider_data)?.[0]]?.length || 0;
13
+ if (data.count < temp && data.count > 0) {
14
+ return data.count;
15
+ }
16
+
17
+ return temp;
18
+ }, [provider_data, data.count]);
9
19
 
10
20
  return (
11
21
  <div className="connected-list">
12
22
  {props.mode === 'edit' ? <p>Connected list</p> : ''}
13
- <Grid columns={data.grid_size}>
14
- <Grid.Row>
15
- {Array(Math.max(0, columns))
16
- .fill()
17
- .map((_, column) => (
18
- <Grid.Column key={`connected-list-${column}`}>
19
- {(data.labeled ?? true) && data.label ? (
20
- <p className="label">{provider_data[data.label][column]}</p>
21
- ) : (
22
- ''
23
- )}
24
- {data.value ? (
25
- <p className="value">{provider_data[data.value][column]}</p>
26
- ) : (
27
- ''
23
+ <ul className={data.theme || 'default'}>
24
+ {Array(Math.max(0, columns))
25
+ .fill()
26
+ .map((_, column) => {
27
+ return (
28
+ <React.Fragment key={`connected-list-${column}`}>
29
+ <li>
30
+ {(data.labeled ?? true) && data.label ? (
31
+ <p className="label">{provider_data[data.label][column]}</p>
32
+ ) : (
33
+ ''
34
+ )}
35
+ {data.value ? (
36
+ <p className="value">{provider_data[data.value][column]}</p>
37
+ ) : (
38
+ ''
39
+ )}
40
+ </li>
41
+ {column < columns - 1 && data.theme === 'theme_1' && (
42
+ <li>
43
+ <Icon name={arrowSVG} size="64px" />
44
+ </li>
28
45
  )}
29
- </Grid.Column>
30
- ))}
31
- </Grid.Row>
32
- </Grid>
46
+ </React.Fragment>
47
+ );
48
+ })}
49
+ </ul>
33
50
  </div>
34
51
  );
35
52
  };
@@ -11,9 +11,10 @@ const getSchema = (props) => {
11
11
  title: 'Default',
12
12
  fields: [
13
13
  'labeled',
14
+ 'count',
15
+ 'theme',
14
16
  'value',
15
17
  ...(props.data.labeled ?? true ? ['label'] : []),
16
- 'grid_size',
17
18
  ],
18
19
  },
19
20
  ],
@@ -24,21 +25,27 @@ const getSchema = (props) => {
24
25
  type: 'boolean',
25
26
  default: true,
26
27
  },
28
+ theme: {
29
+ title: 'Theme',
30
+ choices: [
31
+ ['default', 'Default'],
32
+ ['theme_1', 'Theme 1'],
33
+ ['theme_2', 'Theme 2'],
34
+ ],
35
+ },
27
36
  value: {
28
37
  title: 'Value',
29
- type: 'array',
30
38
  choices,
31
39
  },
32
40
  label: {
33
41
  title: 'Label',
34
- type: 'array',
35
42
  choices,
36
43
  },
37
- grid_size: {
38
- title: 'Grid size',
39
- widget: 'number',
40
- min: 0,
41
- max: 12,
44
+ count: {
45
+ title: 'Max items',
46
+ type: 'number',
47
+ minimum: 0,
48
+ maximum: Infinity,
42
49
  },
43
50
  },
44
51
 
@@ -1,12 +1,67 @@
1
+ @import (multiple, reference, optional) '../../theme.config';
2
+
3
+ @type: extra;
4
+ @element: custom;
5
+
1
6
  .connected-list {
2
- .column {
3
- .label {
4
- margin-bottom: 0;
5
- font-weight: bold;
7
+ ul {
8
+ padding-left: 0;
9
+ margin-left: -1rem;
10
+ list-style-type: none;
11
+
12
+ li {
13
+ display: inline-flex;
14
+ flex-flow: column;
15
+ align-items: flex-start;
16
+ margin: 1rem;
17
+
18
+ .icon {
19
+ color: @grey-2;
20
+ rotate: 90deg;
21
+ }
22
+
23
+ > * {
24
+ margin-bottom: 0;
25
+ }
26
+
27
+ .label {
28
+ color: @primaryColor;
29
+ font-weight: bold;
30
+ }
6
31
  }
7
32
 
8
- .value {
9
- margin-bottom: 1rem;
33
+ &.theme_1 {
34
+ display: flex;
35
+ align-items: center;
36
+ margin-left: 0;
37
+
38
+ li {
39
+ margin: 0;
40
+ }
41
+ }
42
+
43
+ &.theme_2 {
44
+ display: grid;
45
+ margin-left: 0;
46
+ grid-template-columns: 1fr 1fr;
47
+
48
+ li {
49
+ display: grid;
50
+ align-items: center;
51
+ margin: 0.5rem 0;
52
+ grid-template-columns: auto 1fr;
53
+
54
+ &::before {
55
+ position: relative;
56
+ display: block;
57
+ width: 16px;
58
+ height: 16px;
59
+ margin-right: 1rem;
60
+ background-color: @secondaryColor;
61
+ border-radius: 50%;
62
+ content: '';
63
+ }
64
+ }
10
65
  }
11
66
  }
12
67
  }
@@ -44,7 +44,7 @@ const coloredTableSchema = (props) => {
44
44
  properties: {
45
45
  td_color: {
46
46
  title: 'Table rows color',
47
- widget: 'objectlist',
47
+ widget: 'object_list',
48
48
  schema: colorSchema(props),
49
49
  },
50
50
  },
@@ -0,0 +1,62 @@
1
+ import React from 'react';
2
+ import cx from 'classnames';
3
+ import { Icon } from '@plone/volto/components';
4
+
5
+ import arrowSVG from '@plone/volto/icons/ahead.svg';
6
+
7
+ import './style.less';
8
+
9
+ const status_labels = {
10
+ good: {
11
+ title: 'GOOD',
12
+ value: 'good',
13
+ },
14
+ poor: {
15
+ title: 'POOR',
16
+ value: 'poor',
17
+ },
18
+ bad: {
19
+ title: 'BAD',
20
+ value: 'bad',
21
+ },
22
+ unknown: {
23
+ title: 'UNKNOWN',
24
+ value: 'unkown',
25
+ },
26
+ };
27
+
28
+ const View = (props) => {
29
+ const { data = {} } = props;
30
+ const provider_data = props.provider_data || {};
31
+ const columns = provider_data[Object.keys(provider_data)?.[0]]?.length || 0;
32
+
33
+ return (
34
+ <div className="connected-status-list">
35
+ {props.mode === 'edit' ? <p>Connected status list</p> : ''}
36
+ <ul>
37
+ {Array(Math.max(0, columns))
38
+ .fill()
39
+ .map((_, column) => {
40
+ const status =
41
+ status_labels[
42
+ provider_data[data.status]?.[column]?.toLowerCase()
43
+ ] || status_labels.unknown;
44
+ return (
45
+ <li
46
+ key={`connected-list-${column}`}
47
+ className={cx(`status-${status.value}`)}
48
+ >
49
+ <span className="value">
50
+ {provider_data[data.value][column]}
51
+ </span>
52
+ <Icon name={arrowSVG} size="16px" />
53
+ <span className="status">{status.title}</span>
54
+ </li>
55
+ );
56
+ })}
57
+ </ul>
58
+ </div>
59
+ );
60
+ };
61
+
62
+ export default View;
@@ -0,0 +1,17 @@
1
+ import StatusListView from './View';
2
+ import getSchema from './schema';
3
+
4
+ export default (config) => {
5
+ config.blocks.blocksConfig.custom_connected_block = {
6
+ ...config.blocks.blocksConfig.custom_connected_block,
7
+ blocks: {
8
+ ...config.blocks.blocksConfig.custom_connected_block.blocks,
9
+ status_list: {
10
+ view: StatusListView,
11
+ getSchema: getSchema,
12
+ title: 'Status list',
13
+ },
14
+ },
15
+ };
16
+ return config;
17
+ };
@@ -0,0 +1,31 @@
1
+ const getSchema = (props) => {
2
+ const data = props.provider_data || {};
3
+ const choices = Object.keys(data).map((key) => [key, key]);
4
+
5
+ return {
6
+ title: 'Status list',
7
+
8
+ fieldsets: [
9
+ {
10
+ id: 'default',
11
+ title: 'Default',
12
+ fields: ['value', 'status'],
13
+ },
14
+ ],
15
+
16
+ properties: {
17
+ value: {
18
+ title: 'Value',
19
+ choices,
20
+ },
21
+ status: {
22
+ title: 'Status',
23
+ choices,
24
+ },
25
+ },
26
+
27
+ required: [],
28
+ };
29
+ };
30
+
31
+ export default getSchema;
@@ -0,0 +1,54 @@
1
+ .connected-status-list {
2
+ ul {
3
+ padding-left: 0;
4
+ margin-left: -0.5rem;
5
+ list-style-type: none;
6
+
7
+ li {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ padding: 0.25rem 0.5rem;
11
+ margin: 0.5rem;
12
+ border-radius: 6px;
13
+ font-size: 0.9rem;
14
+ font-weight: bold;
15
+
16
+ .value {
17
+ padding-right: 0.25rem;
18
+ }
19
+
20
+ .status {
21
+ padding-left: 0.25rem;
22
+ }
23
+
24
+ &.status-good {
25
+ background-color: #15957d;
26
+ color: #fff;
27
+
28
+ .icon {
29
+ rotate: -45deg;
30
+ }
31
+ }
32
+
33
+ &.status-poor {
34
+ background-color: #faea8a;
35
+
36
+ .icon {
37
+ rotate: 45deg;
38
+ }
39
+ }
40
+
41
+ &.status-bad {
42
+ background-color: #dd552b;
43
+
44
+ .icon {
45
+ rotate: 45deg;
46
+ }
47
+ }
48
+
49
+ &.status-unkown {
50
+ background-color: #afb0b3;
51
+ }
52
+ }
53
+ }
54
+ }
@@ -54,7 +54,6 @@ export default () => ({
54
54
  },
55
55
  theme: {
56
56
  title: 'Theme',
57
- type: 'array',
58
57
  choices: [
59
58
  ['light', 'Light'],
60
59
  ['grey', 'Grey'],
package/src/index.js CHANGED
@@ -13,6 +13,8 @@ import installBubbleChart from './components/manage/Blocks/BubbleChart';
13
13
  import installCarouselHorizontal from './components/manage/Blocks/CarouselHorizontal';
14
14
  import installCddaShape from './components/manage/Blocks/CddaShape';
15
15
  import installConnectedList from './components/manage/Blocks/List';
16
+ import installConnectedStatusList from './components/manage/Blocks/StatusList';
17
+ import installConnectedLabeledList from './components/manage/Blocks/LabeledList';
16
18
  import installConnectedLinkList from './components/manage/Blocks/ConnectedLinkList';
17
19
  import installContactBlock from './components/manage/Blocks/ContactBlock';
18
20
  import installExplodedPiesChart from './components/manage/Blocks/ExplodedPiesChart';
@@ -127,6 +129,8 @@ const applyConfig = (config) => {
127
129
  installCarouselHorizontal,
128
130
  installCddaShape,
129
131
  installConnectedList,
132
+ installConnectedStatusList,
133
+ installConnectedLabeledList,
130
134
  installConnectedLinkList,
131
135
  installContactBlock,
132
136
  installExplodedPiesChart,