@eeacms/volto-clms-theme 1.1.0 → 1.1.1
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 +16 -0
- package/package.json +1 -1
- package/src/components/CLMSDownloadsView/CLMSDownloadTasks.jsx +2 -1
- package/src/components/CLMSDownloadsView/CLMSHistoricDownloadsView.jsx +180 -0
- package/src/components/CLMSSubscriptionView/SubscriptionView.jsx +17 -0
- package/src/components/CclCard/CclCard.jsx +61 -3
- package/src/components/CclCard/CclCard.test.jsx +33 -5
- package/src/customizations/volto/components/theme/Footer/Footer.jsx +18 -0
- package/src/customizations/volto/components/theme/Header/Header.jsx +8 -0
- package/src/index.js +6 -0
- package/theme/clms/css/styles.less +2 -10
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@ 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.1.1](https://github.com/eea/volto-clms-theme/compare/1.1.0...1.1.1) - 30 May 2023
|
|
8
|
+
|
|
9
|
+
#### :rocket: New Features
|
|
10
|
+
|
|
11
|
+
- feat: CLMS-1719 show categorization in technical library cards [Mikel Larreategi - [`e4c9422`](https://github.com/eea/volto-clms-theme/commit/e4c9422561bf0561fc1ff3575305cb14c2e5521a)]
|
|
12
|
+
- feat: CLMS-2129 Historic Downloads view [Mikel Larreategi - [`f6bfcc2`](https://github.com/eea/volto-clms-theme/commit/f6bfcc25689c8f006d42515114a43c5e46692eae)]
|
|
13
|
+
|
|
14
|
+
#### :hammer_and_wrench: Others
|
|
15
|
+
|
|
16
|
+
- test [Unai - [`0f12b81`](https://github.com/eea/volto-clms-theme/commit/0f12b81dfeb75c6b9ba010c01c99546fc78380e9)]
|
|
17
|
+
- mail validators unified [Unai - [`cd3c51d`](https://github.com/eea/volto-clms-theme/commit/cd3c51da8b35d6a8173a75dc21f9c775d6f6f4a5)]
|
|
18
|
+
- sitemap indent css [Zaloa Etxaniz - [`fc6f971`](https://github.com/eea/volto-clms-theme/commit/fc6f971b14fb612a3d7c5936a0a22a5b65b221fc)]
|
|
7
19
|
### [1.1.0](https://github.com/eea/volto-clms-theme/compare/1.0.211...1.1.0) - 29 May 2023
|
|
8
20
|
|
|
9
21
|
#### :rocket: New Features
|
|
@@ -1158,6 +1170,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
|
1158
1170
|
#### :hammer_and_wrench: Others
|
|
1159
1171
|
|
|
1160
1172
|
- related products and datasets added to news and meeting views and login-plone route created [Unai - [`5704a1a`](https://github.com/eea/volto-clms-theme/commit/5704a1a766148746162b60efaf232ea90dc20cf4)]
|
|
1173
|
+
- Revert "[JENKINS] Use eeacms/plone-backend and Volto alpha version- Refs #151967" [Mikel Larreategi - [`46eb694`](https://github.com/eea/volto-clms-theme/commit/46eb69415280a3c982405299135027ae4221426a)]
|
|
1161
1174
|
- sort items according to the lowercased label and put those with special meaning at the end [Mikel Larreategi - [`6410abe`](https://github.com/eea/volto-clms-theme/commit/6410abe096f60dcad54dced2026c9df9b7946d68)]
|
|
1162
1175
|
- lint fix [Unai - [`1264a7a`](https://github.com/eea/volto-clms-theme/commit/1264a7adfe8d679fea1bd821ad087add20f4271d)]
|
|
1163
1176
|
- footer newsletter subscription change, global search maxLength change from 8000 to 200 and /login design change [Unai - [`a09d24a`](https://github.com/eea/volto-clms-theme/commit/a09d24adbb6fa053fb2a2cc0071506b906593b42)]
|
|
@@ -1308,6 +1321,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
|
1308
1321
|
- search block new features [ionlizarazu - [`8e814cb`](https://github.com/eea/volto-clms-theme/commit/8e814cbd359782540c21fe37b37ef146d331f0d6)]
|
|
1309
1322
|
- language selector cookie management [ionlizarazu - [`1385ac9`](https://github.com/eea/volto-clms-theme/commit/1385ac95795702206d3623ba6e780faa43a89e0a)]
|
|
1310
1323
|
- toolbar cookie management [ionlizarazu - [`5c23200`](https://github.com/eea/volto-clms-theme/commit/5c23200790b20e1d4f1bc966463c37bf4c808f47)]
|
|
1324
|
+
- Add Sonarqube tag using clms-frontend addons list [EEA Jenkins - [`0316a0d`](https://github.com/eea/volto-clms-theme/commit/0316a0d8b6fb0fa14af13002415f3c95d9f8ede3)]
|
|
1311
1325
|
### [1.0.84](https://github.com/eea/volto-clms-theme/compare/1.0.83...1.0.84) - 18 March 2022
|
|
1312
1326
|
|
|
1313
1327
|
#### :hammer_and_wrench: Others
|
|
@@ -2212,11 +2226,13 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
|
2212
2226
|
#### :hammer_and_wrench: Others
|
|
2213
2227
|
|
|
2214
2228
|
- replace @collective/volto-dropdownmenu with volto-dropdownmenu [ionlizarazu - [`07f004f`](https://github.com/eea/volto-clms-theme/commit/07f004fe0219e403fb51bc045c83d34f3b981f76)]
|
|
2229
|
+
- yarn.lock [ionlizarazu - [`fe1ca04`](https://github.com/eea/volto-clms-theme/commit/fe1ca04889d29fe7b653db4c69af2751b84b8a1a)]
|
|
2215
2230
|
- add NODE_ENV parameter [ionlizarazu - [`101f27c`](https://github.com/eea/volto-clms-theme/commit/101f27c25b8fbd192e1b11865e95cf5ffee08c1b)]
|
|
2216
2231
|
- upgrade volto-dropdownmenu version [ionlizarazu - [`2081855`](https://github.com/eea/volto-clms-theme/commit/2081855301f4c708776e0dbab39db143cee00dbc)]
|
|
2217
2232
|
- HomeSearch block missing url behaviour [ionlizarazu - [`d20a378`](https://github.com/eea/volto-clms-theme/commit/d20a378ce3f254b8343692348f314bf281974542)]
|
|
2218
2233
|
- babel configuration [ionlizarazu - [`203ea2d`](https://github.com/eea/volto-clms-theme/commit/203ea2de07f99ca3403e4ca220ca74d7ce69b61d)]
|
|
2219
2234
|
- prettier [ionlizarazu - [`e79e26b`](https://github.com/eea/volto-clms-theme/commit/e79e26bf2fa40ba7b4eb53a24dabd87928221c28)]
|
|
2235
|
+
- add yarn lock [ionlizarazu - [`e1ab28b`](https://github.com/eea/volto-clms-theme/commit/e1ab28b060d5a74431c368b0de82a68dabce1eab)]
|
|
2220
2236
|
- Jenkinsfile cypress test [ionlizarazu - [`b385d65`](https://github.com/eea/volto-clms-theme/commit/b385d65986f717c60f8c434a08fc11b829d08eb4)]
|
|
2221
2237
|
- cypress [ionlizarazu - [`a243cf0`](https://github.com/eea/volto-clms-theme/commit/a243cf0182fa3dd113c16ff495c71e310252d83b)]
|
|
2222
2238
|
- some fixes [ionlizarazu - [`046279b`](https://github.com/eea/volto-clms-theme/commit/046279b9d05bea8a64eca03eed493e02621534c9)]
|
package/package.json
CHANGED
|
@@ -13,6 +13,7 @@ import { Grid } from 'semantic-ui-react';
|
|
|
13
13
|
import { dynamicSort } from '../CclUtils';
|
|
14
14
|
|
|
15
15
|
const CLMSDownloadTasks = (props) => {
|
|
16
|
+
const { all = false } = props;
|
|
16
17
|
const dispatch = useDispatch();
|
|
17
18
|
const [queued, setQueued] = useState([]);
|
|
18
19
|
const [taskInProgress, setTaskInProgress] = useState([]);
|
|
@@ -92,7 +93,7 @@ const CLMSDownloadTasks = (props) => {
|
|
|
92
93
|
})
|
|
93
94
|
.sort(dynamicSort('-RegistrationDateTime'))
|
|
94
95
|
.filter((item) => {
|
|
95
|
-
return filterItemByDate(item);
|
|
96
|
+
return all || filterItemByDate(item);
|
|
96
97
|
})
|
|
97
98
|
: [];
|
|
98
99
|
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
3
|
+
import { useDispatch, useSelector } from 'react-redux';
|
|
4
|
+
import { Segment } from 'semantic-ui-react';
|
|
5
|
+
|
|
6
|
+
import { Forbidden, Unauthorized } from '@plone/volto/components';
|
|
7
|
+
import { Helmet } from '@plone/volto/helpers';
|
|
8
|
+
import { helmetTitle } from '@eeacms/volto-clms-theme/components/CclUtils';
|
|
9
|
+
import useCartState from '@eeacms/volto-clms-utils/cart/useCartState';
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
getDatasetsByUid,
|
|
13
|
+
getExtraBreadcrumbItems,
|
|
14
|
+
getDownloadtool,
|
|
15
|
+
} from '../../actions';
|
|
16
|
+
import CLMSDownloadTask from './CLMSDownloadTasks';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* CLMSDownloadsView.
|
|
20
|
+
* @module components/CLMSDownloadsView/CLMSDownloadsView
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const useInterval = (f, delay) => {
|
|
24
|
+
const [timer, setTimer] = useState(undefined);
|
|
25
|
+
const start = () => {
|
|
26
|
+
if (timer) return;
|
|
27
|
+
setTimer(setInterval(f, delay));
|
|
28
|
+
};
|
|
29
|
+
const stop = () => {
|
|
30
|
+
if (!timer) return;
|
|
31
|
+
setTimer(clearInterval(timer));
|
|
32
|
+
};
|
|
33
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
34
|
+
useEffect(() => stop, []);
|
|
35
|
+
return start;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const CLMSDownloadsView = (props) => {
|
|
39
|
+
const dispatch = useDispatch();
|
|
40
|
+
const downloadtool = useSelector((state) => state.downloadtool);
|
|
41
|
+
const datasetsByUid = useSelector((state) => state.datasetsByUid);
|
|
42
|
+
const content = useSelector((state) => state.content.data);
|
|
43
|
+
/* DISPATCH THE getDownloadtool ACTION EVERY 60 SECONDS */
|
|
44
|
+
const start = useInterval((_) => dispatch(getDownloadtool()), 60000);
|
|
45
|
+
const { isLoggedIn } = useCartState();
|
|
46
|
+
|
|
47
|
+
const { formatMessage } = useIntl();
|
|
48
|
+
const messages = defineMessages({
|
|
49
|
+
CartDownloads: {
|
|
50
|
+
id: 'Downloads',
|
|
51
|
+
defaultMessage: 'Downloads',
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
dispatch(
|
|
57
|
+
getExtraBreadcrumbItems([
|
|
58
|
+
{
|
|
59
|
+
title: formatMessage(messages.CartDownloads),
|
|
60
|
+
pathname: props.location.pathname,
|
|
61
|
+
},
|
|
62
|
+
]),
|
|
63
|
+
);
|
|
64
|
+
// returned function will be called on component unmount
|
|
65
|
+
return () => {
|
|
66
|
+
dispatch(getExtraBreadcrumbItems([]));
|
|
67
|
+
};
|
|
68
|
+
}, [
|
|
69
|
+
dispatch,
|
|
70
|
+
formatMessage,
|
|
71
|
+
messages.CartDownloads,
|
|
72
|
+
props.location.pathname,
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
function getUIDList(download_data) {
|
|
76
|
+
let uidList = [];
|
|
77
|
+
let data_keys = Object.keys(download_data);
|
|
78
|
+
if (data_keys?.length !== 0) {
|
|
79
|
+
uidList = [
|
|
80
|
+
...new Set(
|
|
81
|
+
data_keys
|
|
82
|
+
.map((taskID) =>
|
|
83
|
+
download_data[taskID].Datasets.map(
|
|
84
|
+
(dataset) => dataset.DatasetID,
|
|
85
|
+
),
|
|
86
|
+
)
|
|
87
|
+
.reduce((elem1, elem2) => elem1.concat(elem2)),
|
|
88
|
+
),
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
return uidList;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (
|
|
96
|
+
downloadtool?.download_queued &&
|
|
97
|
+
downloadtool?.download_in_progress &&
|
|
98
|
+
downloadtool?.download_finished_ok &&
|
|
99
|
+
downloadtool?.download_finished_nok &&
|
|
100
|
+
downloadtool?.download_rejected &&
|
|
101
|
+
downloadtool?.download_cancelled
|
|
102
|
+
) {
|
|
103
|
+
let queuedUidsList = getUIDList(downloadtool.download_queued);
|
|
104
|
+
let downloadInProgressUidsList = getUIDList(
|
|
105
|
+
downloadtool?.download_in_progress,
|
|
106
|
+
);
|
|
107
|
+
let finishedOKUidsList = getUIDList(downloadtool?.download_finished_ok);
|
|
108
|
+
let finishedNOKUidsList = getUIDList(downloadtool?.download_finished_nok);
|
|
109
|
+
let rejectedUidsList = getUIDList(downloadtool?.download_rejected);
|
|
110
|
+
let cancelledUidsList = getUIDList(downloadtool?.download_cancelled);
|
|
111
|
+
let uidsList = [
|
|
112
|
+
...new Set(
|
|
113
|
+
rejectedUidsList.concat(
|
|
114
|
+
finishedNOKUidsList.concat(
|
|
115
|
+
finishedOKUidsList.concat(
|
|
116
|
+
downloadInProgressUidsList.concat(
|
|
117
|
+
queuedUidsList.concat(cancelledUidsList),
|
|
118
|
+
),
|
|
119
|
+
),
|
|
120
|
+
),
|
|
121
|
+
),
|
|
122
|
+
),
|
|
123
|
+
];
|
|
124
|
+
if (uidsList.length > 0) {
|
|
125
|
+
dispatch(getDatasetsByUid(uidsList));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
129
|
+
}, [downloadtool, dispatch]);
|
|
130
|
+
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
if (downloadtool.delete_download_in_progress) {
|
|
133
|
+
dispatch(getDownloadtool());
|
|
134
|
+
start();
|
|
135
|
+
}
|
|
136
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
137
|
+
}, [dispatch, downloadtool.delete_download_in_progress]);
|
|
138
|
+
|
|
139
|
+
return (
|
|
140
|
+
<>
|
|
141
|
+
<Helmet
|
|
142
|
+
title={helmetTitle(formatMessage(messages.CartDownloads), content)}
|
|
143
|
+
/>
|
|
144
|
+
<div className="ui container">
|
|
145
|
+
{!isLoggedIn && (
|
|
146
|
+
<>
|
|
147
|
+
{props.token ? (
|
|
148
|
+
<Forbidden
|
|
149
|
+
pathname={props.pathname}
|
|
150
|
+
staticContext={props.staticContext}
|
|
151
|
+
/>
|
|
152
|
+
) : (
|
|
153
|
+
<Unauthorized
|
|
154
|
+
pathname={props.pathname}
|
|
155
|
+
staticContext={props.staticContext}
|
|
156
|
+
/>
|
|
157
|
+
)}
|
|
158
|
+
</>
|
|
159
|
+
)}
|
|
160
|
+
{isLoggedIn && (
|
|
161
|
+
<>
|
|
162
|
+
<h1 className="page-title">
|
|
163
|
+
{formatMessage(messages.CartDownloads)}
|
|
164
|
+
</h1>
|
|
165
|
+
<div className="ccl-container">
|
|
166
|
+
<Segment
|
|
167
|
+
basic
|
|
168
|
+
loading={downloadtool.loading || datasetsByUid.loading}
|
|
169
|
+
>
|
|
170
|
+
<CLMSDownloadTask all={true} />
|
|
171
|
+
</Segment>
|
|
172
|
+
</div>
|
|
173
|
+
</>
|
|
174
|
+
)}
|
|
175
|
+
</div>
|
|
176
|
+
</>
|
|
177
|
+
);
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export default CLMSDownloadsView;
|
|
@@ -76,6 +76,10 @@ const messages = defineMessages({
|
|
|
76
76
|
defaultMessage:
|
|
77
77
|
'You must agree privacy policy and enter a valid email address',
|
|
78
78
|
},
|
|
79
|
+
invalid_mail: {
|
|
80
|
+
id: 'The entered mail address is not valid',
|
|
81
|
+
defaultMessage: 'The entered email address is not valid',
|
|
82
|
+
},
|
|
79
83
|
subscribe: {
|
|
80
84
|
id: 'Subscribe',
|
|
81
85
|
defaultMessage: 'Subscribe',
|
|
@@ -141,6 +145,19 @@ class SubscriptionView extends Component {
|
|
|
141
145
|
this.setState({
|
|
142
146
|
value: event.target.value,
|
|
143
147
|
});
|
|
148
|
+
const input =
|
|
149
|
+
typeof window !== 'undefined' && document.getElementById('email') !== null
|
|
150
|
+
? document.getElementById('email')
|
|
151
|
+
: '';
|
|
152
|
+
if (!validator.isEmail(event.target.value)) {
|
|
153
|
+
input.setCustomValidity(
|
|
154
|
+
this.props.intl.formatMessage(messages.invalid_mail),
|
|
155
|
+
);
|
|
156
|
+
input.reportValidity();
|
|
157
|
+
} else {
|
|
158
|
+
input.setCustomValidity('');
|
|
159
|
+
input.reportValidity();
|
|
160
|
+
}
|
|
144
161
|
}
|
|
145
162
|
|
|
146
163
|
emptyFieldErrorToast = () => {
|
|
@@ -3,7 +3,6 @@ import './cards.less';
|
|
|
3
3
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
4
4
|
import { Link } from 'react-router-dom';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
|
-
import React from 'react';
|
|
7
6
|
// import { When } from '@plone/volto/components/theme/View/EventDatesInfo';
|
|
8
7
|
import { When } from '@eeacms/volto-clms-theme/components/CclWhen/CclWhen';
|
|
9
8
|
import { Label } from 'semantic-ui-react';
|
|
@@ -14,6 +13,9 @@ import { Icon as VoltoIcon } from '@plone/volto/components';
|
|
|
14
13
|
|
|
15
14
|
import PlaceHolder from '@eeacms/volto-clms-theme/../theme/clms/img/ccl-thumbnail-placeholder.jpg';
|
|
16
15
|
import { cclDateFormat } from '@eeacms/volto-clms-theme/components/CclUtils';
|
|
16
|
+
import React, { useEffect } from 'react';
|
|
17
|
+
import { useDispatch, useSelector } from 'react-redux';
|
|
18
|
+
import { getVocabulary } from '@plone/volto/actions';
|
|
17
19
|
|
|
18
20
|
const CardImage = ({ card, size = 'preview', isCustomCard }) => {
|
|
19
21
|
return card?.image_field ? (
|
|
@@ -49,6 +51,49 @@ const CardLink = ({ url, children, className, condition = true }) => {
|
|
|
49
51
|
};
|
|
50
52
|
|
|
51
53
|
const DocCard = ({ card, url, showEditor, children }) => {
|
|
54
|
+
const dispatch = useDispatch();
|
|
55
|
+
const CATEGORIZATION_VOCABULARY_NAME =
|
|
56
|
+
'collective.taxonomy.technical_library_categorization';
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (card?.taxonomy_technical_library_categorization.length > 0) {
|
|
59
|
+
dispatch(
|
|
60
|
+
getVocabulary({ vocabNameOrURL: CATEGORIZATION_VOCABULARY_NAME }),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
64
|
+
}, [card, dispatch]);
|
|
65
|
+
|
|
66
|
+
const vocabularies_state = useSelector(
|
|
67
|
+
(state) => state.vocabularies[CATEGORIZATION_VOCABULARY_NAME],
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
const vocabItems = vocabularies_state?.loaded
|
|
71
|
+
? vocabularies_state?.items
|
|
72
|
+
: [];
|
|
73
|
+
|
|
74
|
+
const vocabItemsDict = vocabItems.reduce((obj, item) => {
|
|
75
|
+
return {
|
|
76
|
+
...obj,
|
|
77
|
+
[item['value']]: item['label'].replace(/^[0-9][0-9]#/, ''),
|
|
78
|
+
};
|
|
79
|
+
}, {});
|
|
80
|
+
|
|
81
|
+
const TechnicalLibraryCategorization = ({ categorization }) => {
|
|
82
|
+
return vocabularies_state?.loaded && categorization ? (
|
|
83
|
+
<>
|
|
84
|
+
{categorization
|
|
85
|
+
.map((item) => {
|
|
86
|
+
return vocabItemsDict[item].split(' » ').length > 1
|
|
87
|
+
? vocabItemsDict[item].split(' » ').slice(-1)
|
|
88
|
+
: null;
|
|
89
|
+
})
|
|
90
|
+
.map((item) => {
|
|
91
|
+
return item && <Label>{item}</Label>;
|
|
92
|
+
})}
|
|
93
|
+
</>
|
|
94
|
+
) : null;
|
|
95
|
+
};
|
|
96
|
+
|
|
52
97
|
return (
|
|
53
98
|
<>
|
|
54
99
|
<div className="card-doc-header">
|
|
@@ -59,7 +104,7 @@ const DocCard = ({ card, url, showEditor, children }) => {
|
|
|
59
104
|
<Link to={url}>{card?.title}</Link>
|
|
60
105
|
)}
|
|
61
106
|
{card?.Type === 'TechnicalLibrary' && showEditor && (
|
|
62
|
-
<Link to={`${url}/edit`}
|
|
107
|
+
<Link to={`${url}/edit`} className="technical-library-edit-link">
|
|
63
108
|
<VoltoIcon
|
|
64
109
|
name={penSVG}
|
|
65
110
|
size="12px"
|
|
@@ -74,8 +119,21 @@ const DocCard = ({ card, url, showEditor, children }) => {
|
|
|
74
119
|
)}
|
|
75
120
|
</div>
|
|
76
121
|
{card?.Type === 'TechnicalLibrary' &&
|
|
77
|
-
(card.publication_date ||
|
|
122
|
+
(card.publication_date ||
|
|
123
|
+
card.version ||
|
|
124
|
+
card.taxonomy_technical_library_categorization) && (
|
|
78
125
|
<div className="card-doc-extrametadata">
|
|
126
|
+
{card?.Type === 'TechnicalLibrary' &&
|
|
127
|
+
vocabItemsDict &&
|
|
128
|
+
card.taxonomy_technical_library_categorization && (
|
|
129
|
+
<TechnicalLibraryCategorization
|
|
130
|
+
categorization={
|
|
131
|
+
card.taxonomy_technical_library_categorization
|
|
132
|
+
}
|
|
133
|
+
/>
|
|
134
|
+
)}{' '}
|
|
135
|
+
<br />
|
|
136
|
+
<br />
|
|
79
137
|
{card?.Type === 'TechnicalLibrary' && card.publication_date && (
|
|
80
138
|
<>
|
|
81
139
|
<strong>Publication date: </strong>
|
|
@@ -2,8 +2,32 @@ import React from 'react';
|
|
|
2
2
|
import renderer from 'react-test-renderer';
|
|
3
3
|
import CclCard from './CclCard';
|
|
4
4
|
import { MemoryRouter } from 'react-router-dom';
|
|
5
|
+
import configureStore from 'redux-mock-store';
|
|
6
|
+
import { Provider } from 'react-intl-redux';
|
|
7
|
+
|
|
8
|
+
const mockStore = configureStore();
|
|
5
9
|
|
|
6
10
|
describe('CclCard', () => {
|
|
11
|
+
const store = mockStore({
|
|
12
|
+
content: {
|
|
13
|
+
create: {},
|
|
14
|
+
data: {},
|
|
15
|
+
},
|
|
16
|
+
intl: {
|
|
17
|
+
locale: 'en',
|
|
18
|
+
messages: {},
|
|
19
|
+
},
|
|
20
|
+
users: {
|
|
21
|
+
user: {
|
|
22
|
+
roles: ['Manager'],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
vocabularies: {
|
|
26
|
+
'Product manuals': ['Technical guidelines', 'User manuals'],
|
|
27
|
+
'Product methodological': ['Metodology', 'Description'],
|
|
28
|
+
},
|
|
29
|
+
taxonomy_technical_library_categorization: ['1', '2', '3'],
|
|
30
|
+
});
|
|
7
31
|
const card = {
|
|
8
32
|
title: 'title example',
|
|
9
33
|
description: 'description example',
|
|
@@ -28,6 +52,7 @@ describe('CclCard', () => {
|
|
|
28
52
|
download: 'false',
|
|
29
53
|
alt: 'Placeholder',
|
|
30
54
|
},
|
|
55
|
+
taxonomy_technical_library_categorization: ['1', '2', '3'],
|
|
31
56
|
file: {
|
|
32
57
|
'content-type': 'text/html',
|
|
33
58
|
src:
|
|
@@ -40,11 +65,14 @@ describe('CclCard', () => {
|
|
|
40
65
|
it('Check doc card', () => {
|
|
41
66
|
const cardtest = renderer
|
|
42
67
|
.create(
|
|
43
|
-
<
|
|
44
|
-
<
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
|
|
68
|
+
<Provider store={store}>
|
|
69
|
+
<MemoryRouter>
|
|
70
|
+
<CclCard type="doc" card={card}>
|
|
71
|
+
<p>Doc card test</p>
|
|
72
|
+
</CclCard>
|
|
73
|
+
</MemoryRouter>
|
|
74
|
+
,
|
|
75
|
+
</Provider>,
|
|
48
76
|
)
|
|
49
77
|
.toJSON();
|
|
50
78
|
expect(cardtest).toBeDefined();
|
|
@@ -93,6 +93,10 @@ const messages = defineMessages({
|
|
|
93
93
|
id: 'Success',
|
|
94
94
|
defaultMessage: 'Success',
|
|
95
95
|
},
|
|
96
|
+
invalid_mail: {
|
|
97
|
+
id: 'The entered mail address is not valid',
|
|
98
|
+
defaultMessage: 'The entered email address is not valid',
|
|
99
|
+
},
|
|
96
100
|
agreePrivacyPolicyCheck: {
|
|
97
101
|
id: 'agreePrivacyPolicyCheck',
|
|
98
102
|
defaultMessage: 'You have to agree to the privacy policy',
|
|
@@ -150,6 +154,19 @@ class Footer extends Component {
|
|
|
150
154
|
this.setState({
|
|
151
155
|
value: event.target.value,
|
|
152
156
|
});
|
|
157
|
+
const input =
|
|
158
|
+
typeof window !== 'undefined' && document.getElementById('email') !== null
|
|
159
|
+
? document.getElementById('email')
|
|
160
|
+
: '';
|
|
161
|
+
if (!validator.isEmail(event.target.value)) {
|
|
162
|
+
input.setCustomValidity(
|
|
163
|
+
this.props.intl.formatMessage(messages.invalid_mail),
|
|
164
|
+
);
|
|
165
|
+
input.reportValidity();
|
|
166
|
+
} else {
|
|
167
|
+
input.setCustomValidity('');
|
|
168
|
+
input.reportValidity();
|
|
169
|
+
}
|
|
153
170
|
}
|
|
154
171
|
|
|
155
172
|
emptyFieldErrorToast = () => {
|
|
@@ -359,6 +376,7 @@ class Footer extends Component {
|
|
|
359
376
|
maxLength="8000"
|
|
360
377
|
placeholder="Enter an email adress"
|
|
361
378
|
type="text"
|
|
379
|
+
id="email"
|
|
362
380
|
value={this.state.value}
|
|
363
381
|
onChange={this.handleChange}
|
|
364
382
|
/>
|
|
@@ -73,6 +73,14 @@ const HeaderDropdown = ({ user }) => {
|
|
|
73
73
|
Downloads
|
|
74
74
|
</Link>
|
|
75
75
|
</li>
|
|
76
|
+
<li>
|
|
77
|
+
<Link
|
|
78
|
+
to={`/${intl.locale}/all-downloads`}
|
|
79
|
+
className="header-login-link"
|
|
80
|
+
>
|
|
81
|
+
Historic Downloads
|
|
82
|
+
</Link>
|
|
83
|
+
</li>
|
|
76
84
|
<li>
|
|
77
85
|
<Link to="/logout" className="header-login-link">
|
|
78
86
|
<FormattedMessage id="logout" defaultMessage="Logout" />
|
package/src/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import CLMSDatasetDetailView from '@eeacms/volto-clms-theme/components/CLMSDatas
|
|
|
10
10
|
import CLMSDownloadCartView from './components/CLMSDownloadCartView/CLMSDownloadCartView';
|
|
11
11
|
import CLMSDownloadableFileView from '@eeacms/volto-clms-theme/components/CLMSDownloadableFileView/CLMSDownloadableFileView';
|
|
12
12
|
import CLMSDownloadsView from './components/CLMSDownloadsView/CLMSDownloadsView';
|
|
13
|
+
import CLMSHistoricDownloadsView from './components/CLMSDownloadsView/CLMSHistoricDownloadsView';
|
|
13
14
|
import CLMSMapViewerView from './components/CLMSMapViewerView/CLMSMapViewerView';
|
|
14
15
|
import CLMSMeetingEmailView from '@eeacms/volto-clms-theme/components/CLMSMeetingView/CLMSMeetingEmailView';
|
|
15
16
|
import CLMSMeetingEmailsView from '@eeacms/volto-clms-theme/components/CLMSMeetingView/CLMSMeetingEmailsView';
|
|
@@ -128,6 +129,7 @@ const applyConfig = (config) => {
|
|
|
128
129
|
'/download-by-area',
|
|
129
130
|
'/cart',
|
|
130
131
|
'/cart-downloads',
|
|
132
|
+
'/all-downloads',
|
|
131
133
|
'/newsletter-notification-subscription',
|
|
132
134
|
'/newsletter-notification-unsubscription',
|
|
133
135
|
],
|
|
@@ -263,6 +265,10 @@ const applyConfig = (config) => {
|
|
|
263
265
|
path: '/**/cart-downloads',
|
|
264
266
|
component: CLMSDownloadsView,
|
|
265
267
|
},
|
|
268
|
+
{
|
|
269
|
+
path: '/**/all-downloads',
|
|
270
|
+
component: CLMSHistoricDownloadsView,
|
|
271
|
+
},
|
|
266
272
|
{
|
|
267
273
|
path: `/(${config.settings.supportedLanguages.join('|')})/sitemap`,
|
|
268
274
|
component: Sitemap,
|
|
@@ -1249,19 +1249,11 @@ div#page-document h1.documentFirstHeading {
|
|
|
1249
1249
|
}
|
|
1250
1250
|
|
|
1251
1251
|
/*Sitemap*/
|
|
1252
|
-
#page-sitemap ul li {
|
|
1253
|
-
margin-left: 2rem;
|
|
1254
|
-
line-height: 2.25rem;
|
|
1255
|
-
}
|
|
1256
1252
|
|
|
1257
|
-
#page-sitemap ul > li {
|
|
1258
|
-
margin-bottom: 1rem;
|
|
1259
|
-
}
|
|
1260
1253
|
|
|
1261
|
-
#page-
|
|
1262
|
-
margin-
|
|
1254
|
+
.section-portal-sitemap #page-document ul > ul {
|
|
1255
|
+
margin-left: 35px;
|
|
1263
1256
|
}
|
|
1264
|
-
|
|
1265
1257
|
.slate-editor ul > ul {
|
|
1266
1258
|
margin-left: 35px;
|
|
1267
1259
|
}
|