@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-clms-theme",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
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",
@@ -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`} class="technical-library-edit-link">
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 || card.version) && (
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
- <MemoryRouter>
44
- <CclCard type="doc" card={card}>
45
- <p>Doc card test</p>
46
- </CclCard>
47
- </MemoryRouter>,
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-sitemap ul > li > ul > li {
1262
- margin-bottom: 0;
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
  }