@eeacms/volto-cca-policy 0.3.39 → 0.3.41

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,47 @@ 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.3.41](https://github.com/eea/volto-cca-policy/compare/0.3.40...0.3.41) - 14 May 2025
8
+
9
+ #### :rocket: Dependency updates
10
+
11
+ - Release @eeacms/volto-globalsearch@2.1.1 [EEA Jenkins - [`95087df`](https://github.com/eea/volto-cca-policy/commit/95087dfc874dfac0186dbaad184666ab9b8649df)]
12
+
13
+ #### :bug: Bug Fixes
14
+
15
+ - fix(mission): fix signatory profile actions order - refs #286863 [kreafox - [`48de556`](https://github.com/eea/volto-cca-policy/commit/48de556432efa9c88676f6b938e451d18cce9582)]
16
+ - fix: update test [kreafox - [`951460d`](https://github.com/eea/volto-cca-policy/commit/951460d723278de41e9749e432aff1891497d4fa)]
17
+ - fix: update test [kreafox - [`4608fc9`](https://github.com/eea/volto-cca-policy/commit/4608fc90c2f68c8625a4ad00d8dca5c79c78551c)]
18
+
19
+ #### :nail_care: Enhancements
20
+
21
+ - change(mission): move signatory profile CSS to theme folder [kreafox - [`be3744f`](https://github.com/eea/volto-cca-policy/commit/be3744ff175412dbca210a25ac6d1ac686ff4d83)]
22
+ - change(mission): add statitic for Governance section - refs #285296 [kreafox - [`67774d2`](https://github.com/eea/volto-cca-policy/commit/67774d24334b213dc9e870403df9cd15d005219d)]
23
+ - change: adjust tab labels order from backend response - refs #287273 [kreafox - [`6fc277d`](https://github.com/eea/volto-cca-policy/commit/6fc277d8479198d2307de9c092d460a6676a8a51)]
24
+
25
+ ### [0.3.40](https://github.com/eea/volto-cca-policy/compare/0.3.39...0.3.40) - 13 May 2025
26
+
27
+ #### :bug: Bug Fixes
28
+
29
+ - fix: tests [kreafox - [`1852df4`](https://github.com/eea/volto-cca-policy/commit/1852df43cde6f0f173fcd28d79a0576407d9b313)]
30
+ - fix: class -> className [kreafox - [`56124bc`](https://github.com/eea/volto-cca-policy/commit/56124bc768fafcd59fc280d5ed9f8a6840969691)]
31
+ - fix: tests [kreafox - [`4f95457`](https://github.com/eea/volto-cca-policy/commit/4f954579aed4ed94e796be0de712ab1fc025d96a)]
32
+
33
+ #### :nail_care: Enhancements
34
+
35
+ - change: update Assessment section to render html tags [kreafox - [`011d752`](https://github.com/eea/volto-cca-policy/commit/011d752a949ca08ece75bed5aed46103216875ba)]
36
+ - change: update mission signatory profile templates - refs #286863, #286151 [kreafox - [`fde31e1`](https://github.com/eea/volto-cca-policy/commit/fde31e1ccb694a6109a49155010edf3fba34e512)]
37
+ - change(view): add footer text - refs #287671 [kreafox - [`864a247`](https://github.com/eea/volto-cca-policy/commit/864a247e754117b56a42608779ea60b0da8b71e2)]
38
+
39
+ #### :house: Internal changes
40
+
41
+ - style: Automated code fix [eea-jenkins - [`b301fff`](https://github.com/eea/volto-cca-policy/commit/b301fff27818a9317be2b6c4a992ddd9d1672663)]
42
+ - style: Automated code fix [eea-jenkins - [`3aa5289`](https://github.com/eea/volto-cca-policy/commit/3aa52897989a36dae14a0f0c00f4addd233eef18)]
43
+
44
+ #### :hammer_and_wrench: Others
45
+
46
+ - Refs #287520 - eslint [Tripon Eugen - [`fe3883e`](https://github.com/eea/volto-cca-policy/commit/fe3883ede70439de7f42cc817f9471996ad98696)]
47
+ - Refs #287520 - test resposition [Tripon Eugen - [`3114d1b`](https://github.com/eea/volto-cca-policy/commit/3114d1b8bb2d1017c590b1405f83cddeda5f5d35)]
7
48
  ### [0.3.39](https://github.com/eea/volto-cca-policy/compare/0.3.38...0.3.39) - 9 May 2025
8
49
 
9
50
  #### :nail_care: Enhancements
@@ -2301,13 +2342,10 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
2301
2342
  - Refs #260715 rast-block wip [Tripon Eugen - [`f19d54e`](https://github.com/eea/volto-cca-policy/commit/f19d54e0b9a6a86bf344eb85b6a1cda7f3de91bf)]
2302
2343
  - Refs #260715 rast-block wip [Tripon Eugen - [`2828537`](https://github.com/eea/volto-cca-policy/commit/2828537b6c084cd1a82162d552fb4ef025b71f9f)]
2303
2344
  - Refs #260715 rast-block updates [Tripon Eugen - [`1e803e5`](https://github.com/eea/volto-cca-policy/commit/1e803e5bd3d3fb7558f261c76c68866be7beb8b5)]
2304
- - test: [JENKINS] Use java17 for sonarqube scanner [valentinab25 - [`0a15e1b`](https://github.com/eea/volto-cca-policy/commit/0a15e1b2ad081233685e80d5b3c60a8663f6b896)]
2305
- - test: [JENKINS] Run cypress in started frontend container [valentinab25 - [`9554e44`](https://github.com/eea/volto-cca-policy/commit/9554e44c92a621a52b2adb5a4830fb084ee5734b)]
2306
2345
  ### [0.1.49](https://github.com/eea/volto-cca-policy/compare/0.1.48...0.1.49) - 15 November 2023
2307
2346
 
2308
2347
  #### :house: Internal changes
2309
2348
 
2310
- - chore: [JENKINS] Refactor automated testing [valentinab25 - [`7b820a6`](https://github.com/eea/volto-cca-policy/commit/7b820a6369c2ddd5203b1a4abe352cb4bb43db7a)]
2311
2349
  - chore: husky, lint-staged use fixed versions [valentinab25 - [`f0a8061`](https://github.com/eea/volto-cca-policy/commit/f0a8061c275c236deb00087c23fac9860a073106)]
2312
2350
 
2313
2351
  #### :hammer_and_wrench: Others
@@ -2324,9 +2362,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
2324
2362
  - Refs #259267 - jenkins test [Tripon Eugen - [`cacd31e`](https://github.com/eea/volto-cca-policy/commit/cacd31e7b1afe0983674ed5c7632d2e1d7fa752e)]
2325
2363
  - Refs #259267 - jenkins [Tripon Eugen - [`5b3affe`](https://github.com/eea/volto-cca-policy/commit/5b3affee8401239de10097884c1b7f2349d15ec0)]
2326
2364
  - Refs #259267 - add When, lead image and title to files [Tripon Eugen - [`2cedb23`](https://github.com/eea/volto-cca-policy/commit/2cedb237f898af9057e13fba94b615ef71077204)]
2327
- - test: [JENKINS] Add cpu limit on cypress docker [valentinab25 - [`4d607a5`](https://github.com/eea/volto-cca-policy/commit/4d607a576e9d0a5c34e48c41b409e7df616ee3d6)]
2328
- - test: [JENKINS] Increase shm-size to cypress docker [valentinab25 - [`b7f74d5`](https://github.com/eea/volto-cca-policy/commit/b7f74d53513a6edbfbca5cb6d19687929bb1e5db)]
2329
- - test: [JENKINS] Improve cypress time [valentinab25 - [`db65617`](https://github.com/eea/volto-cca-policy/commit/db656173391f65157098d95d388c25f6429753d8)]
2330
2365
  - Refs #259267 - cca event blocks attachments and check not mandatoty fields [Tripon Eugen - [`3138e5a`](https://github.com/eea/volto-cca-policy/commit/3138e5afb5bfbdbed14e27ed457b16867b7fa414)]
2331
2366
  - Refs #256681 - Fix error in CCA Event view menu. ([React Intl] An id must be provided to format a message.) [GhitaB - [`517eeb8`](https://github.com/eea/volto-cca-policy/commit/517eeb817264a47bbfd6b9b7d22aaf22d44ed224)]
2332
2367
  - Refs #161485 - Fix ECDE name conflict. [GhitaB - [`8bfd99f`](https://github.com/eea/volto-cca-policy/commit/8bfd99ff68bb82a04d1c0ed625fa514fcf46289e)]
@@ -2543,7 +2578,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
2543
2578
 
2544
2579
  #### :house: Internal changes
2545
2580
 
2546
- - chore: [JENKINS] Remove alpha testing version [valentinab25 - [`ad1ced0`](https://github.com/eea/volto-cca-policy/commit/ad1ced0971ba116c13a3b5fcc039172cc915c919)]
2547
2581
 
2548
2582
  #### :hammer_and_wrench: Others
2549
2583
 
@@ -3024,7 +3058,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
3024
3058
  #### :hammer_and_wrench: Others
3025
3059
 
3026
3060
  - Refs #158294 - Update supported languages list. [GhitaB - [`0a4f91f`](https://github.com/eea/volto-cca-policy/commit/0a4f91f39b7edc367bd4c127d6a8f273c7788361)]
3027
- - Add Sonarqube tag using cca-frontend addons list [EEA Jenkins - [`8f1f9ce`](https://github.com/eea/volto-cca-policy/commit/8f1f9ce6c22805670cc0800d3c779b6d619d0f31)]
3028
3061
  ### [0.1.1](https://github.com/eea/volto-cca-policy/compare/0.1.0...0.1.1) - 13 December 2022
3029
3062
 
3030
3063
  #### :hammer_and_wrench: Others
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-cca-policy",
3
- "version": "0.3.39",
3
+ "version": "0.3.41",
4
4
  "description": "@eeacms/volto-cca-policy: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
@@ -32,7 +32,7 @@
32
32
  "@eeacms/volto-eea-design-system": "<=1.36.3",
33
33
  "@eeacms/volto-eea-website-theme": "^1.35.0",
34
34
  "@eeacms/volto-embed": "^9.1.1",
35
- "@eeacms/volto-globalsearch": "2.1.0",
35
+ "@eeacms/volto-globalsearch": "2.1.1",
36
36
  "@eeacms/volto-hero-block": "^7.1.0",
37
37
  "@eeacms/volto-openlayers-map": "*",
38
38
  "@eeacms/volto-searchlib": "2.0.16",
@@ -47,25 +47,38 @@ export function filterCases(cases, activeFilters) {
47
47
  impacts: false,
48
48
  };
49
49
 
50
- activeFilters.sectors.forEach((filter) => {
51
- if (_case.properties.sectors.includes(',' + filter + ','))
52
- flag.sectors = true;
53
- });
54
-
55
- activeFilters.elements.forEach((filter) => {
56
- if (_case.properties.elements.includes(',' + filter + ','))
57
- flag.elements = true;
58
- });
59
-
60
- activeFilters.impacts.forEach((filter) => {
61
- if (_case.properties.impacts.includes(',' + filter + ','))
62
- flag.impacts = true;
63
- });
64
-
65
- activeFilters.measures.forEach((filter) => {
66
- if (_case.properties.ktms.includes(',' + filter + ','))
67
- flag.measures = true;
68
- });
50
+ // activeFilters.sectors.forEach((filter) => {
51
+ // if (_case.properties.sectors.includes(',' + filter + ','))
52
+ // flag.sectors = true;
53
+ // });
54
+ flag.sectors = activeFilters.sectors.every((sub) =>
55
+ _case.properties.sectors.includes(sub),
56
+ );
57
+
58
+ // ADAPTATION APPROACHES
59
+ // activeFilters.elements.forEach((filter) => {
60
+ // if (_case.properties.elements.includes(',' + filter + ','))
61
+ // flag.elements = true;
62
+ // });
63
+ flag.elements = activeFilters.elements.every((sub) =>
64
+ _case.properties.elements.includes(sub),
65
+ );
66
+
67
+ // activeFilters.impacts.forEach((filter) => {
68
+ // if (_case.properties.impacts.includes(',' + filter + ','))
69
+ // flag.impacts = true;
70
+ // });
71
+ flag.impacts = activeFilters.impacts.every((sub) =>
72
+ _case.properties.impacts.includes(sub),
73
+ );
74
+
75
+ // activeFilters.measures.forEach((filter) => {
76
+ // if (_case.properties.ktms.includes(',' + filter + ','))
77
+ // flag.measures = true;
78
+ // });
79
+ flag.measures = activeFilters.measures.every((sub) =>
80
+ _case.properties.ktms.includes(sub),
81
+ );
69
82
 
70
83
  return (activeFilters.sectors.length ? flag.sectors : true) &&
71
84
  (activeFilters.elements.length ? flag.elements : true) &&
@@ -35,7 +35,7 @@ export default function View(props) {
35
35
  return (
36
36
  <>
37
37
  {isNonEN && (
38
- <Message class="eea callout">
38
+ <Message className="eea callout">
39
39
  <FormattedMessage
40
40
  id="officiallyInEnglish"
41
41
  defaultMessage="Officially reported governmental information is only available in English"
@@ -43,7 +43,7 @@ export default function View(props) {
43
43
  </Message>
44
44
  )}
45
45
  {dataJson.message_top ? (
46
- <div class="eea callout">{dataJson.message_top}</div>
46
+ <div className="eea callout">{dataJson.message_top}</div>
47
47
  ) : null}
48
48
  {dataJson.top_accordeon ? (
49
49
  <div className="top-accordion">
@@ -1,12 +1,17 @@
1
1
  import React from 'react';
2
- import { Tab, Container } from 'semantic-ui-react';
2
+ import { Tab, Container, Divider } from 'semantic-ui-react';
3
3
  import { BannerTitle } from '@eeacms/volto-cca-policy/helpers';
4
4
  import GovernanceTab from './TabSections/GovernanceTab';
5
5
  import AssessmentTab from './TabSections/AssessmentTab';
6
6
  import PlanningTab from './TabSections/PlanningTab';
7
7
  import ActionPagesTab from './TabSections/ActionPagesTab';
8
8
 
9
- import './style.less';
9
+ const tabRenderers = {
10
+ Governance_Label: (data) => <GovernanceTab result={data} />,
11
+ Assessment_Label: (data) => <AssessmentTab result={data} />,
12
+ Planning_Label: (data) => <PlanningTab result={data} />,
13
+ Action_Label: (data) => <ActionPagesTab result={data} />,
14
+ };
10
15
 
11
16
  const MissionSignatoryProfileView = (props) => {
12
17
  const { content } = props || {};
@@ -14,16 +19,32 @@ const MissionSignatoryProfileView = (props) => {
14
19
  props?.content?.['@components']?.missionsignatoryprofile || {};
15
20
 
16
21
  const result = dataJson?.result || {};
17
- const governance = result?.governance?.[0] || [];
22
+ const governance = result?.governance?.[0] || {};
18
23
  const planning = result?.planning || {};
19
24
  const assessment = result?.assessment || {};
20
25
  const action = result?.action || {};
21
- const tab_labels = result?.tab_labels || {};
22
- const { Governance_Label, Assessment_Label, Planning_Label, Action_Label } =
23
- tab_labels || {};
26
+ const footer_text = result?.footer_text || {};
27
+ const tab_labels = result?.tab_labels || [];
24
28
 
25
29
  const [activeIndex, setActiveIndex] = React.useState(0);
26
30
 
31
+ const panes = tab_labels
32
+ .filter(({ key }) => key !== 'Language')
33
+ .map(({ key, value }) => {
34
+ const renderTab = tabRenderers[key];
35
+ const dataMap = {
36
+ Governance_Label: governance,
37
+ Assessment_Label: assessment,
38
+ Planning_Label: planning,
39
+ Action_Label: action,
40
+ };
41
+
42
+ return {
43
+ menuItem: value,
44
+ render: () => (renderTab ? renderTab(dataMap[key]) : null),
45
+ };
46
+ });
47
+
27
48
  return (
28
49
  <Container>
29
50
  <BannerTitle
@@ -38,7 +59,7 @@ const MissionSignatoryProfileView = (props) => {
38
59
  hideShareButton: false,
39
60
  }}
40
61
  />
41
- <div className="signatories-profile">
62
+ <div className="signatory-profile">
42
63
  <br />
43
64
 
44
65
  <Tab
@@ -51,25 +72,16 @@ const MissionSignatoryProfileView = (props) => {
51
72
  grid={{ paneWidth: 9, tabWidth: 3, stackable: true }}
52
73
  activeIndex={activeIndex}
53
74
  onTabChange={(e, { activeIndex }) => setActiveIndex(activeIndex)}
54
- panes={[
55
- {
56
- menuItem: Governance_Label || 'Governance',
57
- render: () => <GovernanceTab result={governance} />,
58
- },
59
- {
60
- menuItem: Assessment_Label || 'Assessment',
61
- render: () => <AssessmentTab result={assessment} />,
62
- },
63
- {
64
- menuItem: Planning_Label || 'Planning',
65
- render: () => <PlanningTab result={planning} />,
66
- },
67
- {
68
- menuItem: Action_Label || 'Action',
69
- render: () => <ActionPagesTab result={action} />,
70
- },
71
- ]}
75
+ panes={panes}
72
76
  />
77
+
78
+ {footer_text.Disclaimer && (
79
+ <div className="footer-text">
80
+ <Divider />
81
+ <strong>{footer_text.Disclaimer_Title}</strong>
82
+ <p>{footer_text.Disclaimer}</p>
83
+ </div>
84
+ )}
73
85
  </div>
74
86
  </Container>
75
87
  );
@@ -17,27 +17,42 @@ jest.mock('@eeacms/volto-cca-policy/helpers', () => ({
17
17
  }));
18
18
 
19
19
  describe('MissionSignatoryProfileView', () => {
20
- const data = {
21
- _v_results: {
22
- planning: {
23
- planning_titles: [{}],
20
+ const content = {
21
+ '@components': {
22
+ missionsignatoryprofile: {
23
+ result: {
24
+ governance: [{}],
25
+ assessment: {},
26
+ planning: {},
27
+ action: {},
28
+ footer_text: {
29
+ Disclaimer_Title: 'Disclaimer Title',
30
+ Disclaimer: 'This is a disclaimer.',
31
+ },
32
+ tab_labels: [
33
+ { key: 'Governance_Label', value: 'Governance' },
34
+ { key: 'Assessment_Label', value: 'Assessment' },
35
+ { key: 'Planning_Label', value: 'Planning & Target' },
36
+ { key: 'Action_Label', value: 'Action' },
37
+ { key: 'Language', value: 'en' }, // will be filtered out
38
+ ],
39
+ },
24
40
  },
25
- governance: [{}],
26
41
  },
27
42
  };
28
43
 
29
44
  it('renders tab labels and default content', () => {
30
- render(<MissionSignatoryProfileView data={data} />);
45
+ render(<MissionSignatoryProfileView content={content} />);
31
46
 
32
47
  // Tab labels
33
48
  expect(screen.getByText('Governance')).toBeInTheDocument();
34
49
  expect(screen.getByText('Assessment')).toBeInTheDocument();
35
- expect(screen.getByText('Planning')).toBeInTheDocument();
50
+ expect(screen.getByText('Planning & Target')).toBeInTheDocument();
36
51
  expect(screen.getByText('Action')).toBeInTheDocument();
37
52
  });
38
53
 
39
54
  it('switches tabs and renders corresponding content', () => {
40
- render(<MissionSignatoryProfileView data={data} />);
55
+ render(<MissionSignatoryProfileView content={content} />);
41
56
 
42
57
  fireEvent.click(screen.getByText('Governance'));
43
58
  expect(screen.getByText('Mocked Governance')).toBeInTheDocument();
@@ -45,10 +60,16 @@ describe('MissionSignatoryProfileView', () => {
45
60
  fireEvent.click(screen.getByText('Assessment'));
46
61
  expect(screen.getByText('Mocked Assessment')).toBeInTheDocument();
47
62
 
48
- fireEvent.click(screen.getByText('Planning'));
63
+ fireEvent.click(screen.getByText('Planning & Target'));
49
64
  expect(screen.getByText('Mocked Planning')).toBeInTheDocument();
50
65
 
51
66
  fireEvent.click(screen.getByText('Action'));
52
67
  expect(screen.getByText('Mocked Action')).toBeInTheDocument();
53
68
  });
69
+
70
+ it('renders footer disclaimer text if present', () => {
71
+ render(<MissionSignatoryProfileView content={content} />);
72
+ expect(screen.getByText('Disclaimer Title')).toBeInTheDocument();
73
+ expect(screen.getByText('This is a disclaimer.')).toBeInTheDocument();
74
+ });
54
75
  });
@@ -1,5 +1,3 @@
1
- import React from 'react';
2
-
3
1
  import {
4
2
  Statistic,
5
3
  StatisticValue,
@@ -7,10 +5,10 @@ import {
7
5
  StatisticGroup,
8
6
  } from 'semantic-ui-react';
9
7
 
10
- const StatisticsSection = ({ statistics }) => {
8
+ const StatisticSection = ({ statistic }) => {
11
9
  return (
12
10
  <StatisticGroup widths="two" size="small">
13
- {statistics.map((stat, index) => (
11
+ {statistic.map((stat, index) => (
14
12
  <Statistic key={index}>
15
13
  <StatisticValue>{stat.value}</StatisticValue>
16
14
  <StatisticLabel>{stat.label}</StatisticLabel>
@@ -20,4 +18,4 @@ const StatisticsSection = ({ statistics }) => {
20
18
  );
21
19
  };
22
20
 
23
- export default StatisticsSection;
21
+ export default StatisticSection;
@@ -1,12 +1,14 @@
1
- import React from 'react';
2
1
  import { Tab, Grid } from 'semantic-ui-react';
3
2
  import { Callout } from '@eeacms/volto-eea-design-system/ui';
3
+ import { HTMLField } from '@eeacms/volto-cca-policy/helpers';
4
+ import { formatTextToHTML } from '@eeacms/volto-cca-policy/utils';
4
5
  import AccordionList from '../AccordionList';
5
6
 
6
7
  const ActionsTabContent = ({ action }) => {
7
8
  const hasHazards = action?.Climate_Hazards?.length > 0;
8
- const hasSectors = !!action?.Sectors;
9
- const hasBenefits = !!action?.Co_Benefits;
9
+ const hasSectors = action?.Sectors.length > 0;
10
+ const hasBenefits = action?.Co_Benefits.length > 0;
11
+
10
12
  return (
11
13
  <>
12
14
  <Grid columns="12">
@@ -63,30 +65,28 @@ const ActionPagesTab = ({ result }) => {
63
65
  const { Title, Abstract, Abstract_Line } = result.action_text?.[0] || [];
64
66
  const actions = result.actions || [];
65
67
 
66
- const sortedActions = [...actions].sort((a, b) => {
67
- const aNum = parseInt(a.Action_Id.replace(/\D/g, ''), 10);
68
- const bNum = parseInt(b.Action_Id.replace(/\D/g, ''), 10);
69
- return aNum - bNum;
70
- });
68
+ const sortedActions = [...actions].sort((a, b) => a.Order - b.Order);
71
69
 
72
70
  return (
73
71
  <Tab.Pane>
74
72
  {Title && <h2>{Title}</h2>}
75
- {Abstract && <p>{Abstract}</p>}
76
- {Abstract_Line && <Callout>{Abstract_Line}</Callout>}
77
-
78
- <br />
73
+ {Abstract && <HTMLField value={{ data: formatTextToHTML(Abstract) }} />}
74
+ {Abstract_Line && (
75
+ <Callout>
76
+ <HTMLField value={{ data: formatTextToHTML(Abstract_Line) }} />
77
+ </Callout>
78
+ )}
79
79
 
80
80
  {sortedActions.map((action, index) => {
81
81
  return (
82
82
  <div key={index} className="section-wrapper">
83
83
  <h5 className="section-title">
84
84
  <span className="section-number">{action.Order}. </span>
85
- <span>{action?.Action}</span>
85
+ <HTMLField value={{ data: formatTextToHTML(action?.Action) }} />
86
86
  </h5>
87
87
 
88
88
  <AccordionList
89
- variation="tertiary"
89
+ variation="secondary"
90
90
  accordions={[
91
91
  {
92
92
  title: action?.More_Details_Label || 'More details',
@@ -61,7 +61,7 @@ describe('ActionPagesTab', () => {
61
61
  };
62
62
 
63
63
  it('renders action tab content correctly', () => {
64
- const { getByText, getAllByText } = render(
64
+ const { getByText, container } = render(
65
65
  <ActionPagesTab result={mockResult} />,
66
66
  );
67
67
 
@@ -71,9 +71,7 @@ describe('ActionPagesTab', () => {
71
71
  ).toBeInTheDocument();
72
72
  expect(getByText('Summary line here.')).toBeInTheDocument();
73
73
 
74
- const sections = getAllByText(/^\d+\./).map((el) =>
75
- el.closest('.section-wrapper'),
76
- );
74
+ const sections = container.querySelectorAll('.section-wrapper');
77
75
 
78
76
  // First action
79
77
  const firstAction = within(sections[0]);
@@ -1,6 +1,7 @@
1
- import React from 'react';
2
1
  import { Tab, Image, Segment, Item } from 'semantic-ui-react';
3
2
  import { Callout } from '@eeacms/volto-eea-design-system/ui';
3
+ import { HTMLField } from '@eeacms/volto-cca-policy/helpers';
4
+ import { formatTextToHTML } from '@eeacms/volto-cca-policy/utils';
4
5
  import AccordionList from '../AccordionList';
5
6
 
6
7
  import image from '@eeacms/volto-cca-policy/../theme//assets/images/image-narrow.svg';
@@ -38,7 +39,7 @@ const AssessmentAccordionContent = ({ result }) => {
38
39
 
39
40
  <h5>{result.Further_Details_Label}</h5>
40
41
  <Segment className="border">
41
- <p>{result.Please_Explain}</p>
42
+ <HTMLField value={{ data: formatTextToHTML(result.Please_Explain) }} />
42
43
  </Segment>
43
44
  </>
44
45
  );
@@ -63,9 +64,13 @@ const AssessmentTab = ({ result }) => {
63
64
  return (
64
65
  <Tab.Pane>
65
66
  {Title && <h2>{Title}</h2>}
66
- {Subheading && <Callout>{Subheading}</Callout>}
67
+ {Subheading && (
68
+ <Callout>
69
+ <HTMLField value={{ data: formatTextToHTML(Subheading) }} />
70
+ </Callout>
71
+ )}
67
72
 
68
- {Abstract && <p>{Abstract}</p>}
73
+ {Abstract && <HTMLField value={{ data: formatTextToHTML(Abstract) }} />}
69
74
 
70
75
  <div className="tab-section-wrapper assessment">
71
76
  {Cra_Title && <h3>{Cra_Title}</h3>}
@@ -99,7 +104,9 @@ const AssessmentTab = ({ result }) => {
99
104
 
100
105
  {Hazards_Title && <h3>{Hazards_Title}</h3>}
101
106
 
102
- {Hazards_Abstract && <p>{Hazards_Abstract}</p>}
107
+ {Hazards_Abstract && (
108
+ <HTMLField value={{ data: formatTextToHTML(Hazards_Abstract) }} />
109
+ )}
103
110
 
104
111
  <br />
105
112
 
@@ -1,9 +1,9 @@
1
- import React from 'react';
2
1
  import { Tab } from 'semantic-ui-react';
3
2
  import { Callout } from '@eeacms/volto-eea-design-system/ui';
4
3
  import { HTMLField } from '@eeacms/volto-cca-policy/helpers';
5
4
  import { formatTextToHTML } from '@eeacms/volto-cca-policy/utils';
6
5
  import AccordionList from '../AccordionList';
6
+ import StatisticSection from '../StatisticSection';
7
7
 
8
8
  const GovernanceTab = ({ result }) => {
9
9
  const {
@@ -13,14 +13,43 @@ const GovernanceTab = ({ result }) => {
13
13
  Describe,
14
14
  Provide_Title,
15
15
  Provide,
16
+ Statistic_Area,
17
+ Statistic_Area_Label,
18
+ Statistic_Jurisdiction_Range,
19
+ Statistic_Jurisdiction_Range_Label,
20
+ Statistic_Population_Size,
21
+ Statistic_Population_Size_Label,
22
+ Statistic_Population_Year,
23
+ Statistic_Population_Year_Label,
16
24
  } = result;
17
25
 
26
+ const statisticData = [
27
+ {
28
+ value: Statistic_Area,
29
+ label: Statistic_Area_Label,
30
+ },
31
+ {
32
+ value: Statistic_Jurisdiction_Range,
33
+ label: Statistic_Jurisdiction_Range_Label,
34
+ },
35
+ {
36
+ value: Statistic_Population_Size,
37
+ label: Statistic_Population_Size_Label,
38
+ },
39
+ {
40
+ value: Statistic_Population_Year,
41
+ label: Statistic_Population_Year_Label,
42
+ },
43
+ ].filter((stat) => stat.value && stat.label);
44
+
18
45
  return (
19
46
  <Tab.Pane>
20
47
  {Title && <h2>{Title}</h2>}
21
48
 
22
49
  {Introduction && <Callout>{Introduction}</Callout>}
23
50
 
51
+ <StatisticSection statistic={statisticData} />
52
+
24
53
  {Describe_Title && <h3>{Describe_Title}</h3>}
25
54
 
26
55
  {Describe && <HTMLField value={{ data: formatTextToHTML(Describe) }} />}
@@ -88,17 +88,25 @@ const PlanningTab = ({ result }) => {
88
88
  return (
89
89
  <Tab.Pane>
90
90
  {titleData?.Title && <h2>{titleData.Title}</h2>}
91
- {titleData?.Abstract_Line && <Callout>{titleData.Abstract_Line}</Callout>}
91
+ {titleData?.Abstract_Line && (
92
+ <Callout>
93
+ <HTMLField
94
+ value={{ data: formatTextToHTML(titleData?.Abstract_Line) }}
95
+ />
96
+ </Callout>
97
+ )}
92
98
 
93
99
  {sortedGoals.map((goal, index) => {
94
100
  return (
95
101
  <div key={index} className="section-wrapper">
96
- <span className="goal-title-label">{goal?.Title_Label}</span>
102
+ <h5 className="section-title">
103
+ <span className="section-number">{goal?.Title_Label} </span>
97
104
 
98
- <HTMLField value={{ data: formatTextToHTML(goal?.Title) }} />
105
+ <HTMLField value={{ data: formatTextToHTML(goal?.Title) }} />
106
+ </h5>
99
107
 
100
108
  <AccordionList
101
- variation="tertiary"
109
+ variation="secondary"
102
110
  accordions={[
103
111
  {
104
112
  title: goal?.More_Details_Label || 'More details',
@@ -115,7 +123,11 @@ const PlanningTab = ({ result }) => {
115
123
  )}
116
124
 
117
125
  {goalData?.Climate_Action_Abstract && (
118
- <Callout>{goalData.Climate_Action_Abstract}</Callout>
126
+ <Callout>
127
+ <HTMLField
128
+ value={{ data: formatTextToHTML(goalData.Climate_Action_Abstract) }}
129
+ />
130
+ </Callout>
119
131
  )}
120
132
 
121
133
  {planning_climate_action.map((action, index) => {
@@ -124,12 +136,22 @@ const PlanningTab = ({ result }) => {
124
136
  <br />
125
137
  {action?.Sectors_Introduction && (
126
138
  <Message>
127
- <p>{action.Sectors_Introduction}</p>
139
+ <HTMLField
140
+ value={{
141
+ data: formatTextToHTML(action.Sectors_Introduction),
142
+ }}
143
+ />
128
144
  </Message>
129
145
  )}
130
146
 
131
147
  <ItemsSection items={action?.Sectors} />
132
- {action?.Description && <p>{action.Description}</p>}
148
+
149
+ {action?.Description && (
150
+ <HTMLField
151
+ className="description"
152
+ value={{ data: formatTextToHTML(action.Description) }}
153
+ />
154
+ )}
133
155
 
134
156
  {(action?.Approval_Year || action?.End_Year) && (
135
157
  <p>
@@ -9,13 +9,13 @@ import {
9
9
  } from '@eeacms/volto-cca-policy/helpers';
10
10
  import {
11
11
  Container,
12
- Segment,
12
+ // Segment,
13
13
  Divider,
14
14
  Grid,
15
15
  ListItem,
16
16
  List,
17
17
  } from 'semantic-ui-react';
18
- import { UniversalLink } from '@plone/volto/components';
18
+ // import { UniversalLink } from '@plone/volto/components';
19
19
  import {
20
20
  ShareInfoButton,
21
21
  PortalMessage,
@@ -253,9 +253,12 @@ function AdaptationOptionView(props) {
253
253
  computer={4}
254
254
  className="col-right"
255
255
  >
256
- <ContentMetadata {...props} />
256
+ <ContentMetadata
257
+ {...props}
258
+ related_case_studies={related_case_studies}
259
+ />
257
260
 
258
- {related_case_studies?.length > 0 && (
261
+ {/* {related_case_studies?.length > 0 && (
259
262
  <Segment>
260
263
  <h5>
261
264
  <FormattedMessage
@@ -273,7 +276,7 @@ function AdaptationOptionView(props) {
273
276
  ))}
274
277
  </ul>
275
278
  </Segment>
276
- )}
279
+ )} */}
277
280
  </Grid.Column>
278
281
  </div>
279
282
  </Grid>
@@ -1,8 +1,7 @@
1
- import React from 'react';
2
1
  import { MemoryRouter } from 'react-router-dom';
3
2
  import configureStore from 'redux-mock-store';
4
3
  import '@testing-library/jest-dom/extend-expect';
5
- import { render } from '@testing-library/react';
4
+ import { render, waitFor } from '@testing-library/react';
6
5
  import { Provider } from 'react-intl-redux';
7
6
  import { BrokenLinksComponent } from './BrokenLinks';
8
7
 
@@ -17,7 +16,18 @@ describe('BrokenLinksComponent', () => {
17
16
  messages: {},
18
17
  },
19
18
  });
19
+
20
+ global.fetch = jest.fn(() =>
21
+ Promise.resolve({
22
+ json: () =>
23
+ Promise.resolve({
24
+ broken_links: {},
25
+ }),
26
+ }),
27
+ );
28
+
20
29
  const reactTable = await import('@tanstack/react-table');
30
+
21
31
  const { container } = render(
22
32
  <Provider store={store}>
23
33
  <MemoryRouter>
@@ -25,6 +35,9 @@ describe('BrokenLinksComponent', () => {
25
35
  </MemoryRouter>
26
36
  </Provider>,
27
37
  );
28
- expect(container).toBeTruthy();
38
+
39
+ await waitFor(() => {
40
+ expect(container).toBeTruthy();
41
+ });
29
42
  });
30
43
  });
@@ -13,6 +13,7 @@ import {
13
13
  PUBLICATION_REPORT,
14
14
  } from '@eeacms/volto-cca-policy/helpers/Constants';
15
15
  import { MetadataItemList } from '@eeacms/volto-cca-policy/helpers';
16
+ import { UniversalLink } from '@plone/volto/components';
16
17
 
17
18
  const messages = defineMessages({
18
19
  default_info_tooltip: {
@@ -342,6 +343,11 @@ function ContentMetadata(props) {
342
343
  key_type_measures,
343
344
  funding_programme,
344
345
  } = content;
346
+ // const related_case_studies = props.hasAttribute('related_case_studies')
347
+ // ? props['related_case_studies']
348
+ // : [];
349
+ const related_case_studies = props['related_case_studies'];
350
+
345
351
  const type = content['@type'];
346
352
  const hasGeoChars = geochars !== null || spatial_layer.length > 0;
347
353
 
@@ -364,6 +370,26 @@ function ContentMetadata(props) {
364
370
  portaltype={type}
365
371
  />
366
372
 
373
+ {related_case_studies?.length > 0 && (
374
+ <>
375
+ <h5>
376
+ <FormattedMessage
377
+ id="Case studies related to this option:"
378
+ defaultMessage="Case studies related to this option:"
379
+ />
380
+ </h5>
381
+ <ul className="related-case-studies">
382
+ {related_case_studies.map((item, index) => (
383
+ <li key={index}>
384
+ <UniversalLink key={index} href={item.url}>
385
+ {item.title}
386
+ </UniversalLink>
387
+ </li>
388
+ ))}
389
+ </ul>
390
+ </>
391
+ )}
392
+
367
393
  {keywords && keywords?.length > 0 && (
368
394
  <>
369
395
  <h5>
@@ -116,6 +116,103 @@ body.subsite-mkh {
116
116
  #mega-menu .ui.accordion .content {
117
117
  background: @subsiteBackgroundGradient;
118
118
  }
119
+
120
+ /* Mission signatory profile */
121
+ .signatory-profile {
122
+ .ui.items.items-group {
123
+ margin: 2em 0 !important;
124
+ }
125
+
126
+ .column > .ui.segment {
127
+ background-color: #fff !important;
128
+ }
129
+
130
+ .section-wrapper-info {
131
+ display: flex;
132
+ justify-content: space-between;
133
+ font-size: 14px;
134
+
135
+ .date {
136
+ position: relative;
137
+ top: 5px;
138
+ }
139
+ }
140
+
141
+ .description > p {
142
+ margin-bottom: 1em;
143
+ }
144
+
145
+ .tab-section-wrapper {
146
+ padding: 1.5em;
147
+ margin: 2em 0;
148
+ background-color: #f9f9f9;
149
+
150
+ &.assessment {
151
+ .ui.accordion {
152
+ margin-top: 1em;
153
+
154
+ .content.active {
155
+ padding: 1rem 1rem !important;
156
+ background-color: @white;
157
+ }
158
+
159
+ .ui.segment.border {
160
+ border: 1px solid #e6e7e8;
161
+ }
162
+ }
163
+ }
164
+ }
165
+
166
+ .section-wrapper {
167
+ padding: 1em;
168
+ margin: 1em 0;
169
+ background-color: #f9f9f9;
170
+
171
+ .section-title {
172
+ display: flex;
173
+ align-items: baseline;
174
+ gap: 0.5em;
175
+ }
176
+
177
+ .ui.accordion {
178
+ margin-top: 1em;
179
+
180
+ .content.active {
181
+ padding-bottom: 1rem !important;
182
+ }
183
+ }
184
+
185
+ .small-label {
186
+ font-size: 1em;
187
+ }
188
+ }
189
+
190
+ .section-number {
191
+ color: @pineGreen;
192
+ }
193
+
194
+ strong.date {
195
+ margin-right: 0.5em;
196
+ }
197
+
198
+ .items-group {
199
+ display: block !important;
200
+ column-count: 2;
201
+
202
+ .item {
203
+ padding: 0.5em 0 !important;
204
+ break-inside: avoid-column;
205
+
206
+ .content {
207
+ padding-left: 0.5rem !important;
208
+ }
209
+ }
210
+ }
211
+
212
+ .footer-text {
213
+ margin-top: 3em;
214
+ }
215
+ }
119
216
  }
120
217
 
121
218
  /* Latest news updates, Latest events */
@@ -1,86 +0,0 @@
1
- @type: 'extra';
2
- @element: 'custom';
3
-
4
- @import (multiple, reference, optional) '../../theme.config';
5
-
6
- .signatories-profile {
7
- .ui.items.items-group {
8
- margin: 2em 0 !important;
9
- }
10
-
11
- .column > .ui.segment {
12
- background-color: #fff !important;
13
- }
14
-
15
- .section-wrapper-info {
16
- display: flex;
17
- justify-content: space-between;
18
- font-size: 14px;
19
-
20
- .date {
21
- position: relative;
22
- top: 5px;
23
- }
24
- }
25
-
26
- .tab-section-wrapper {
27
- padding: 1.5em;
28
- margin: 2em 0;
29
- background-color: #f9f9f9;
30
-
31
- &.assessment {
32
- .ui.accordion {
33
- margin-top: 1em;
34
-
35
- .content.active {
36
- padding: 1rem 1rem !important;
37
- background-color: @white;
38
- }
39
-
40
- .ui.segment.border {
41
- border: 1px solid #e6e7e8;
42
- }
43
- }
44
- }
45
- }
46
-
47
- .section-wrapper {
48
- margin: 1em 0;
49
-
50
- .goal-title-label {
51
- display: inline-block;
52
- padding: 0.3em 0.5em;
53
- margin: 1em 0;
54
- background-color: #dbe7f4;
55
- font-size: 14px;
56
- font-weight: bold;
57
- text-transform: uppercase;
58
- }
59
-
60
- .ui.accordion {
61
- margin-top: 1em;
62
- }
63
-
64
- .small-label {
65
- font-size: 1em;
66
- }
67
- }
68
-
69
- strong.date {
70
- margin-right: 0.5em;
71
- }
72
-
73
- .items-group {
74
- display: block !important;
75
- column-count: 2;
76
-
77
- .item {
78
- padding: 0.5em 0 !important;
79
- break-inside: avoid-column;
80
-
81
- .content {
82
- padding-left: 0.5rem !important;
83
- }
84
- }
85
- }
86
- }