@eeacms/volto-clms-theme 1.0.113 → 1.0.116

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.
Files changed (31) hide show
  1. package/CHANGELOG.md +1398 -1779
  2. package/package.json +2 -2
  3. package/src/actions/index.js +2 -0
  4. package/src/actions/profile/delete_profile.js +20 -0
  5. package/src/components/Blocks/CclHomeBgImageBlock/CclGreenBgView.jsx +1 -1
  6. package/src/components/Blocks/CclHomeUsersBlock/CclHomeUsersBlockEdit.jsx +17 -3
  7. package/src/components/Blocks/CclHomeUsersBlock/CclHomeUsersBlockView.jsx +32 -9
  8. package/src/components/Blocks/CclHomeUsersBlock/HomeUsersSchema.js +7 -4
  9. package/src/components/Blocks/CustomTemplates/VoltoListingBlock/CclListingWorkOpportunities.jsx +4 -1
  10. package/src/components/Blocks/CustomTemplates/VoltoSearchBlock/DoubleRangeFacet.jsx +1 -3
  11. package/src/components/Blocks/CustomTemplates/VoltoSearchBlock/rewriteOptions.js +1 -1
  12. package/src/components/Blocks/CustomTemplates/VoltoTabsBlock/RoutingHOC.jsx +6 -1
  13. package/src/components/CLMSDatasetDetailView/DataSetInfoContent.jsx +7 -8
  14. package/src/components/CLMSDatasetDetailView/DownloadDataSetContent.jsx +4 -0
  15. package/src/components/CLMSLoginView/CLMSLogin.jsx +30 -13
  16. package/src/components/CLMSNewsItemView/CLMSNewsItemView.jsx +2 -2
  17. package/src/components/CLMSProfileView/CLMSDeleteProfileView.jsx +53 -0
  18. package/src/components/CLMSProfileView/CLMSProfileView.jsx +4 -0
  19. package/src/components/CLMSProfileView/index.js +1 -0
  20. package/src/components/CLMSSubscriptionView/ConfirmSubscriptionView.jsx +4 -4
  21. package/src/components/CLMSSubscriptionView/SubscriptionView.jsx +76 -33
  22. package/src/components/CLMSWorkOpportunityView/WorkOpportunityView.jsx +7 -1
  23. package/src/components/CclCard/CclCard.jsx +4 -4
  24. package/src/components/CclLoginModal/CclLoginModal.jsx +34 -13
  25. package/src/components/CclUtils/dateFormats.js +18 -0
  26. package/src/components/CclUtils/index.js +6 -1
  27. package/src/customizations/volto/components/manage/UniversalLink/UniversalLink.jsx +2 -1
  28. package/src/customizations/volto/components/theme/Logout/Logout.jsx +4 -4
  29. package/src/reducers/index.js +2 -0
  30. package/src/reducers/profile/delete_profile_reducer.js +41 -0
  31. package/src/reducers/subscription/subscription_reducer.js +5 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-clms-theme",
3
- "version": "1.0.113",
3
+ "version": "1.0.116",
4
4
  "description": "volto-clms-theme: Volto theme for CLMS site",
5
5
  "main": "src/index.js",
6
6
  "author": "CodeSyntax for the European Environment Agency",
@@ -55,7 +55,7 @@
55
55
  "react-svg": "14.0.4",
56
56
  "slick-carousel": "1.8.1",
57
57
  "volto-dropdownmenu": "2.2.7",
58
- "volto-form-block": "2.2.2",
58
+ "volto-form-block": "2.4.1",
59
59
  "react-input-range": "^1.3.0",
60
60
  "lightgallery": "^2.4.0",
61
61
  "validator": "13.7.0"
@@ -92,3 +92,5 @@ export {
92
92
  POST_IMPORT_WMS_FIELDS,
93
93
  postImportWMSFields,
94
94
  } from './import_wms_fields/import_wms_fields';
95
+
96
+ export { DELETE_PROFILE, delProfile } from './profile/delete_profile';
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Delete profle.
3
+ * @module actions/newsletter
4
+ */
5
+ export const DELETE_PROFILE = 'DELETE_PROFILE';
6
+
7
+ /**
8
+ * Delete profle.
9
+ * @function delProfile
10
+ * @returns {Object} Get extra items action.
11
+ */
12
+ export function delProfile() {
13
+ return {
14
+ type: DELETE_PROFILE,
15
+ request: {
16
+ op: 'del',
17
+ path: `/@delete-user-profile`,
18
+ },
19
+ };
20
+ }
@@ -10,7 +10,7 @@ const CclGreenBgView = (props) => {
10
10
  <div
11
11
  className="ccl-banner-top-main"
12
12
  style={{
13
- backgroundImage: `url(${data?.image?.url}/@@images/image/large)`,
13
+ backgroundImage: `url(${data?.image?.url}/@@images/image/huge)`,
14
14
  }}
15
15
  >
16
16
  {isEditMode && <CclHomeImageEditor {...props} />}
@@ -57,7 +57,7 @@ const CclHomeUsersBlockEdit = ({
57
57
  }}
58
58
  aria-hidden="true"
59
59
  >
60
- {data.title}
60
+ {data.title || 'Home users block'}
61
61
  </div>
62
62
  <div>
63
63
  <div className={'line'}>
@@ -91,8 +91,22 @@ const CclHomeUsersBlockEdit = ({
91
91
  />
92
92
  </div>
93
93
  <div className={'card-text'}>
94
- <div className="card-title">{panel?.title}</div>
95
- <div className="card-description">{panel?.description}</div>
94
+ <div className="card-title">
95
+ {panel.title
96
+ ? panel.title
97
+ : panel.productUrl &&
98
+ panel.productUrl.length > 0 &&
99
+ panel.productUrl[0]['@id'].indexOf('http') !== 0
100
+ ? panel.productUrl[0].title
101
+ : panel.title}
102
+ </div>
103
+ <div className="card-description">
104
+ {panel.description
105
+ ? panel.description
106
+ : panel.productUrl && panel.productUrl.length > 0
107
+ ? panel.productUrl[0].description
108
+ : panel.description}
109
+ </div>
96
110
  </div>
97
111
  </div>
98
112
  </div>
@@ -4,7 +4,7 @@ import CclButton from '@eeacms/volto-clms-theme/components/CclButton/CclButton';
4
4
  import 'slick-carousel/slick/slick.css';
5
5
  import 'slick-carousel/slick/slick-theme.css';
6
6
  import './styles.less';
7
- import { flattenToAppURL } from '@plone/volto/helpers/Url/Url';
7
+ import { ConditionalLink } from '@plone/volto/components';
8
8
 
9
9
  const CclHomeUsersBlockView = (props) => {
10
10
  const settings = {
@@ -42,7 +42,6 @@ const CclHomeUsersBlockView = (props) => {
42
42
  let cards = data?.customCards?.blocks_layout?.items.map(
43
43
  (uid) => data.customCards.blocks[uid],
44
44
  );
45
-
46
45
  return (
47
46
  <div className="home-meet-container">
48
47
  <div className="ccl-container">
@@ -57,6 +56,13 @@ const CclHomeUsersBlockView = (props) => {
57
56
  src={`${card.image.url}/@@images/image`}
58
57
  alt={card.image.alt}
59
58
  />
59
+ ) : card.productUrl &&
60
+ card.productUrl.length > 0 &&
61
+ card.productUrl[0].image_field ? (
62
+ <img
63
+ src={`${card.productUrl[0]['@id']}/@@images/${card.productUrl[0].image_field}/preview`}
64
+ alt={card?.productUrl[0].title || 'Placeholder'}
65
+ />
60
66
  ) : (
61
67
  <img
62
68
  src={
@@ -66,14 +72,31 @@ const CclHomeUsersBlockView = (props) => {
66
72
  />
67
73
  )}
68
74
  </div>
69
- <a
70
- href={flattenToAppURL(card.url)}
71
- target={'_blank'}
72
- rel="noreferrer"
75
+ <ConditionalLink
76
+ condition={card.productUrl && card.productUrl.length > 0}
77
+ item={
78
+ card.productUrl && card.productUrl.length > 0
79
+ ? card.productUrl[0]
80
+ : {}
81
+ }
73
82
  >
74
- <h4>{card.title}</h4>
75
- </a>
76
- <p>{card.description}</p>
83
+ <h4>
84
+ {card.title
85
+ ? card.title
86
+ : card.productUrl &&
87
+ card.productUrl.length > 0 &&
88
+ card.productUrl[0]['@id'].indexOf('http') !== 0
89
+ ? card.productUrl[0].title
90
+ : card.title}
91
+ </h4>
92
+ </ConditionalLink>
93
+ <p>
94
+ {card.description
95
+ ? card.description
96
+ : card.productUrl && card.productUrl.length > 0
97
+ ? card.productUrl[0].description
98
+ : card.description}
99
+ </p>
77
100
  </div>
78
101
  </div>
79
102
  ))}
@@ -28,7 +28,7 @@ export const CardBlockSchema = () => ({
28
28
  {
29
29
  id: 'default',
30
30
  title: 'Default',
31
- fields: ['title', 'description', 'url'],
31
+ fields: ['title', 'description', 'productUrl'],
32
32
  },
33
33
  ],
34
34
  properties: {
@@ -42,9 +42,12 @@ export const CardBlockSchema = () => ({
42
42
  title: 'Product description',
43
43
  type: 'string',
44
44
  },
45
- url: {
46
- title: 'url',
47
- type: 'string',
45
+ productUrl: {
46
+ title: 'Object or url',
47
+ widget: 'object_browser',
48
+ mode: 'link',
49
+ selectedItemAttrs: ['description', 'image_field'],
50
+ allowExternals: true,
48
51
  },
49
52
  },
50
53
  required: ['product'],
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { defineMessages, useIntl } from 'react-intl';
4
4
  import { useSelector } from 'react-redux';
5
5
  import { Link } from 'react-router-dom';
6
+ import { workOpportunitiesCclDateTimeFormat } from '@eeacms/volto-clms-theme/components/CclUtils';
6
7
 
7
8
  const messages = defineMessages({
8
9
  ProcurementNo: {
@@ -21,6 +22,8 @@ const messages = defineMessages({
21
22
 
22
23
  const CclWorkOpportunity = (props) => {
23
24
  const { item, intl, user } = props;
25
+ const lang = useSelector((state) => state.intl.locale);
26
+
24
27
  return (
25
28
  <div className="card-work">
26
29
  {user.roles && user.roles.includes('Manager') && (
@@ -52,7 +55,7 @@ const CclWorkOpportunity = (props) => {
52
55
  <span className="card-work-title">
53
56
  {intl.formatMessage(messages.SubmissionDeadline)}
54
57
  </span>
55
- {new Date(item.submission_deadline).toLocaleString()}
58
+ {workOpportunitiesCclDateTimeFormat(item.submission_deadline, lang)}
56
59
  </div>
57
60
  </div>
58
61
  );
@@ -57,9 +57,7 @@ const DoubleRangeFacet = (props) => {
57
57
  tabIndex={0}
58
58
  role={'button'}
59
59
  >
60
- <legend className="ccl-form-legend">
61
- {facet.title} {startingValues.min} - {startingValues.max}
62
- </legend>
60
+ <legend className="ccl-form-legend">{facet.title}</legend>
63
61
  </div>
64
62
  <div>
65
63
  <Segment basic padded>
@@ -4,7 +4,7 @@ export const portal_types_labels = {
4
4
  'News Item': 'News',
5
5
  'eea.meeting': 'Event',
6
6
  UseCase: 'Use case',
7
- WorkOpportunity: 'Work opportunity',
7
+ WorkOpportunity: 'Job vacancy',
8
8
  Tender: 'Tender',
9
9
  TechnicalLibrary: 'Product documentation',
10
10
  };
@@ -16,7 +16,12 @@ const RoutingHOC = (TabView) =>
16
16
  ) {
17
17
  return rTabsList[0];
18
18
  }
19
- return rTabsList[window.location.hash.match(/.*&?#?tab=(.*)/)[1] - 1];
19
+ if (
20
+ window.location.hash.match(/.*&?#?tab=(.*)/) &&
21
+ window.location.hash.match(/.*&?#?tab=(.*)/).length > 1
22
+ ) {
23
+ return rTabsList[window.location.hash.match(/.*&?#?tab=(.*)/)[1] - 1];
24
+ }
20
25
  }
21
26
  React.useEffect(() => {
22
27
  const isReload =
@@ -85,6 +85,13 @@ const DataSetInfoContent = (props) => {
85
85
  ></CclInfoDescription>
86
86
  )}
87
87
  </CclInfoContainer>
88
+ {citation?.data && citation?.data !== '<p><br/></p>' && (
89
+ <CclCitation
90
+ title="Citation status"
91
+ marginBottom={true}
92
+ children={<StringToHTML string={citation?.data} />}
93
+ ></CclCitation>
94
+ )}
88
95
  <div className="dataset-info-documents dropdown">
89
96
  <div className="accordion-block">
90
97
  {renderAccordion(geonetwork_identifiers?.items, libraries) && (
@@ -192,14 +199,6 @@ const DataSetInfoContent = (props) => {
192
199
  )}
193
200
  </div>
194
201
  </div>
195
-
196
- {citation?.data && citation?.data !== '<p><br/></p>' && (
197
- <CclCitation
198
- title="Citation status"
199
- marginBottom={true}
200
- children={<StringToHTML string={citation?.data} />}
201
- ></CclCitation>
202
- )}
203
202
  </div>
204
203
  );
205
204
  };
@@ -34,6 +34,10 @@ const DownloadDataSetContent = (data) => {
34
34
  >
35
35
  Go to download by area
36
36
  </CclButton>
37
+ ) : data.mapviewer_istimeseries === true ? (
38
+ <CclButton url={location.pathname + '/download-by-area'}>
39
+ Go to download by area and time
40
+ </CclButton>
37
41
  ) : (
38
42
  <CclButton url={location.pathname + '/download-by-area'}>
39
43
  Go to download by area
@@ -1,6 +1,7 @@
1
1
  import React, { useEffect } from 'react';
2
2
  import { useSelector } from 'react-redux';
3
3
  import config from '@plone/volto/registry';
4
+ import { UniversalLink } from '@plone/volto/components';
4
5
  import { toPublicURL } from '@plone/volto/helpers/Url/Url';
5
6
  import './CLMSLogin.css';
6
7
 
@@ -29,33 +30,49 @@ function CLMSLoginView(props) {
29
30
  <h1 className="page-title">Registration / Login</h1>
30
31
  <div className="modal-login-text">
31
32
  <p>
32
- This site uses EU Login to handle user registration and login. You
33
- can read more about this service in the{' '}
34
- <a href="https://ecas.ec.europa.eu/cas/about.html">
35
- EU Login site help
36
- </a>
33
+ EU Login, the European Commission Authentication Service, enables
34
+ you to access various web applications centrally using the same
35
+ e-mail and password. You can read more{' '}
36
+ <UniversalLink
37
+ openLinkInNewTab
38
+ href="https://ecas.ec.europa.eu/cas/about.html"
39
+ >
40
+ here
41
+ </UniversalLink>
37
42
  .
38
43
  </p>
39
44
  <p>
40
- {' '}
41
- When you clik on the following link, you will be sent to EU Login
42
- and after a successful login there you will be redirected back to
43
- this site.
45
+ If you have EU Login account, please click 'Login using EU Login'.
44
46
  </p>
45
47
  <p>
46
- If you have any issues or questions, please contact us using the
47
- <a href="/en/contact-service-helpdesk"> helpdesk</a>.
48
+ If you don't have EU Login account, please folloe this{' '}
49
+ <UniversalLink
50
+ openLinkInNewTab
51
+ href="https://ecas.ec.europa.eu/cas/eim/external/register.cgi"
52
+ >
53
+ link
54
+ </UniversalLink>{' '}
55
+ to create it
56
+ </p>
57
+ <p>
58
+ If you have othe questions, please contact our
59
+ <UniversalLink openLinkInNewTab href="/en/service-desk">
60
+ {' '}
61
+ Service desk
62
+ </UniversalLink>
63
+ .
48
64
  </p>
49
65
  </div>
50
66
  </div>
51
67
  <div className="login-button">
52
68
  <div className="modal-buttons">
53
- <a
69
+ <UniversalLink
54
70
  href={toPublicURL(loginUrl) || '#'}
71
+ openLinkInNewTab
55
72
  className="ccl-button ccl-button-green"
56
73
  >
57
74
  Login using EU Login
58
- </a>
75
+ </UniversalLink>
59
76
  </div>
60
77
  </div>
61
78
  </>
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { StringToHTML } from '@eeacms/volto-clms-theme/components/CclUtils';
3
3
  import { hasBlocksData } from '@plone/volto/helpers';
4
4
  import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
5
- import { cclDateTimeFormat } from '@eeacms/volto-clms-theme/components/CclUtils';
5
+ import { cclDateFormat } from '@eeacms/volto-clms-theme/components/CclUtils';
6
6
  import { LightGalleryListing } from '@eeacms/volto-clms-theme/components/CLMSMeetingView/CclLightGallery';
7
7
  import CclListingCards from '@eeacms/volto-clms-theme/components/Blocks/CustomTemplates/VoltoListingBlock/CclListingCards';
8
8
  import config from '@plone/volto/registry';
@@ -54,7 +54,7 @@ const CLMSNewsItemView = (props) => {
54
54
  <h1 className="page-title">{content.title}</h1>
55
55
  <div className="news-detail">
56
56
  <div className="news-detail-date">
57
- {cclDateTimeFormat(content?.effective)}
57
+ {cclDateFormat(content?.effective)}
58
58
  </div>
59
59
  {content?.image && (
60
60
  <figure className="news-detail-image">
@@ -0,0 +1,53 @@
1
+ /**
2
+ * CLMSProfileView container.
3
+ * @module components/CLMSProfileView/CLMSProfileView
4
+ */
5
+
6
+ import React from 'react';
7
+
8
+ import { injectIntl } from 'react-intl';
9
+ import { Container } from 'semantic-ui-react';
10
+ import CclButton from '@eeacms/volto-clms-theme/components/CclButton/CclButton';
11
+ import { delProfile } from '../../actions';
12
+ import { useDispatch, useSelector } from 'react-redux';
13
+ import { useHistory } from 'react-router-dom';
14
+ import { logout } from '@plone/volto/actions';
15
+
16
+ export const CLMSDeleteProfileView = (props) => {
17
+ const dispatch = useDispatch();
18
+ let history = useHistory();
19
+
20
+ const isDeleted = useSelector((state) => state.profile_delete.loaded)
21
+ ? true
22
+ : false;
23
+
24
+ function handleClick() {
25
+ dispatch(delProfile());
26
+ }
27
+
28
+ if (isDeleted === true) {
29
+ history.push('/');
30
+ dispatch(logout());
31
+ }
32
+
33
+ return (
34
+ <Container>
35
+ <div>
36
+ <h1 className="page-title">Delete your profile</h1>
37
+ <p>Click in the button bellow to your profile.</p>
38
+
39
+ <CclButton
40
+ to="profile#Delete-profile"
41
+ mode={'filled'}
42
+ onClick={() => {
43
+ handleClick();
44
+ }}
45
+ >
46
+ Delete
47
+ </CclButton>
48
+ </div>
49
+ </Container>
50
+ );
51
+ };
52
+
53
+ export default injectIntl(CLMSDeleteProfileView);
@@ -11,6 +11,7 @@ import {
11
11
  CLMSApiTokensView,
12
12
  CLMSNewsletterSubscriberView,
13
13
  CLMSUserProfileView,
14
+ CLMSDeleteProfileView,
14
15
  } from '@eeacms/volto-clms-theme/components/CLMSProfileView';
15
16
  import React, { Component } from 'react';
16
17
 
@@ -75,6 +76,9 @@ class CLMSProfileView extends Component {
75
76
  <SubscriptionView type={subscription?.type} />
76
77
  </div>
77
78
  ))}
79
+ <div tabTitle="Delete profile">
80
+ <CLMSDeleteProfileView />
81
+ </div>
78
82
  </CclTabs>
79
83
  ) : (
80
84
  <Unauthorized />
@@ -2,3 +2,4 @@ export CLMSProfileView from './CLMSProfileView';
2
2
  export CLMSUserProfileView from './CLMSUserProfileView';
3
3
  export CLMSApiTokensView from './CLMSApiTokensView';
4
4
  export CLMSNewsletterSubscriberView from './CLMSNewsletterSubscriberView';
5
+ export CLMSDeleteProfileView from './CLMSDeleteProfileView';
@@ -111,8 +111,8 @@ class ConfirmSubscriptionView extends Component {
111
111
  type:
112
112
  this.props.type[0].toUpperCase() + this.props.type.slice(1),
113
113
  subscribe_or_unsubscribe: this.props.isUnsubscribe
114
- ? 'unsubscribe'
115
- : 'subscribe',
114
+ ? 'unsubscription'
115
+ : 'subscription',
116
116
  })}
117
117
  </h1>
118
118
  <div className="event-detail">
@@ -120,8 +120,8 @@ class ConfirmSubscriptionView extends Component {
120
120
  <p>
121
121
  {this.props.intl.formatMessage(messages.description, {
122
122
  subscribe_or_unsubscribe: this.props.isUnsubscribe
123
- ? 'unsubscribe'
124
- : 'subscribe',
123
+ ? 'unsubscription'
124
+ : 'subscription',
125
125
  })}
126
126
  </p>
127
127
  </div>