@eeacms/volto-clms-theme 1.1.246 → 1.1.248
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 -2
- package/package.json +1 -1
- package/src/components/Blocks/CustomTemplates/VoltoTabsBlock/CclProductToggleView.jsx +18 -16
- package/src/components/CLMSDatasetDetailView/datasetinfocontent.less +37 -0
- package/src/components/CLMSDownloadsView/FileCard.jsx +5 -1
- package/src/components/Widgets/DatasetDownloadInformationWidget.jsx +7 -0
- package/src/customizations/volto/helpers/Html/Html.jsx +210 -0
- package/theme/site/extras/ccl-tabs.less +55 -0
- package/theme/site/extras/product-tab-toggle.less +41 -7
package/CHANGELOG.md
CHANGED
|
@@ -4,11 +4,25 @@ 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.
|
|
7
|
+
### [1.1.248](https://github.com/eea/volto-clms-theme/compare/1.1.247...1.1.248) - 29 August 2025
|
|
8
|
+
|
|
9
|
+
#### :rocket: New Features
|
|
10
|
+
|
|
11
|
+
- feat: add status updates on download cart page for cdse datasets -refs #291057 [ana-oprea - [`dcb3ae0`](https://github.com/eea/volto-clms-theme/commit/dcb3ae0ebe2a572bfc07ccfc2aa6768b784c2f6e)]
|
|
8
12
|
|
|
9
13
|
#### :hammer_and_wrench: Others
|
|
10
14
|
|
|
11
|
-
- Refs #
|
|
15
|
+
- Refs #291136 - Add BYOC Collection field in DatasetDownloadInformationWidget. [GhitaB - [`107de57`](https://github.com/eea/volto-clms-theme/commit/107de57cacb9ea6691722937b42d625cc154e6b3)]
|
|
16
|
+
### [1.1.247](https://github.com/eea/volto-clms-theme/compare/1.1.246...1.1.247) - 8 August 2025
|
|
17
|
+
|
|
18
|
+
#### :bug: Bug Fixes
|
|
19
|
+
|
|
20
|
+
- fix: stylelint [ana-oprea - [`c1ae7f6`](https://github.com/eea/volto-clms-theme/commit/c1ae7f6c223abefc96b1552192faae729df23bc4)]
|
|
21
|
+
- fix: stylelint [ana-oprea - [`8afa2ec`](https://github.com/eea/volto-clms-theme/commit/8afa2ecce08e741046f6225f3e9f4064b775a930)]
|
|
22
|
+
- fix: stylelint [ana-oprea - [`806f269`](https://github.com/eea/volto-clms-theme/commit/806f26984b501516ea5bff5b057b4fd594208ce9)]
|
|
23
|
+
|
|
24
|
+
### [1.1.246](https://github.com/eea/volto-clms-theme/compare/1.1.245...1.1.246) - 7 August 2025
|
|
25
|
+
|
|
12
26
|
### [1.1.245](https://github.com/eea/volto-clms-theme/compare/1.1.244...1.1.245) - 23 July 2025
|
|
13
27
|
|
|
14
28
|
#### :hammer_and_wrench: Others
|
package/package.json
CHANGED
|
@@ -98,22 +98,24 @@ const CclProductToggleView = (props) => {
|
|
|
98
98
|
return (
|
|
99
99
|
<div className="product-tab-view">
|
|
100
100
|
<div className="container">
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
101
|
+
<div className="header-row">
|
|
102
|
+
{props.data.productIcon === 'Landscape green bg' ? (
|
|
103
|
+
<ReactSVG src={LandCoverImage} />
|
|
104
|
+
) : props.data.productIcon === 'Warning green bg' ? (
|
|
105
|
+
<ReactSVG src={PriorityAreaImage} />
|
|
106
|
+
) : props.data.productIcon === 'Leaf green bg' ? (
|
|
107
|
+
<ReactSVG src={BioGeoPhysicalImage} />
|
|
108
|
+
) : props.data.productIcon === 'Computer green bg' ? (
|
|
109
|
+
<ReactSVG src={GroundMotionImage} />
|
|
110
|
+
) : props.data.productIcon === 'Database green bg' ? (
|
|
111
|
+
<ReactSVG src={ReferenceAndValidationImage} />
|
|
112
|
+
) : props.data.productIcon === 'Satellite green bg' ? (
|
|
113
|
+
<ReactSVG src={SatelliteImage} />
|
|
114
|
+
) : (
|
|
115
|
+
''
|
|
116
|
+
)}
|
|
117
|
+
<div className="product-title">{props.data.title}</div>
|
|
118
|
+
</div>
|
|
117
119
|
<TabsComponent {...props} />
|
|
118
120
|
</div>
|
|
119
121
|
<div className="product-description">{props.data.description}</div>
|
|
@@ -1,3 +1,40 @@
|
|
|
1
1
|
.characteristic-row {
|
|
2
2
|
padding-bottom: 0.85rem !important;
|
|
3
3
|
}
|
|
4
|
+
|
|
5
|
+
@media (max-width: 768px) {
|
|
6
|
+
.dataset-info-documents .accordion-block {
|
|
7
|
+
.grid {
|
|
8
|
+
.column {
|
|
9
|
+
width: 50% !important;
|
|
10
|
+
max-width: 50% !important;
|
|
11
|
+
flex: 0 0 50% !important;
|
|
12
|
+
padding: 0.5rem !important;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.row {
|
|
16
|
+
margin: 0 !important;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.characteristic-row {
|
|
22
|
+
padding-bottom: 1.2rem !important;
|
|
23
|
+
margin-bottom: 0.5rem;
|
|
24
|
+
|
|
25
|
+
strong {
|
|
26
|
+
font-size: 0.9rem;
|
|
27
|
+
line-height: 1.3;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.ui.label {
|
|
31
|
+
display: inline-block;
|
|
32
|
+
max-width: 100%;
|
|
33
|
+
padding: 0.5em 0.7em !important;
|
|
34
|
+
margin-top: 0.4rem;
|
|
35
|
+
font-size: 0.85rem !important;
|
|
36
|
+
white-space: normal;
|
|
37
|
+
word-break: break-word;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -164,7 +164,11 @@ const FileCard = (props) => {
|
|
|
164
164
|
width={['In_progress', 'Queued'].includes(item?.Status) ? 8 : 10}
|
|
165
165
|
>
|
|
166
166
|
<Header as="h3">{`Task ID: ${item?.TaskID}`}</Header>
|
|
167
|
-
<Header.Subheader as="h4">{`Job ID: ${
|
|
167
|
+
<Header.Subheader as="h4">{`Job ID: ${
|
|
168
|
+
item?.cdse_task_role === 'parent'
|
|
169
|
+
? 'CDSE PROCESSING...'
|
|
170
|
+
: item?.FMETaskId
|
|
171
|
+
}`}</Header.Subheader>
|
|
168
172
|
<Segment basic className="file-datetimes">
|
|
169
173
|
{item?.RegistrationDateTime && (
|
|
170
174
|
<>
|
|
@@ -14,6 +14,12 @@ const ItemSchema = () => ({
|
|
|
14
14
|
description: '',
|
|
15
15
|
type: 'string',
|
|
16
16
|
},
|
|
17
|
+
byoc_collection: {
|
|
18
|
+
title: 'BYOC Collection',
|
|
19
|
+
description:
|
|
20
|
+
'To download the datasets via CDSE, it is necessary to include a BYOC identifier. Example: 3fdh95a1-rc49-4676-b285-c1d00g4bag1a',
|
|
21
|
+
type: 'string',
|
|
22
|
+
},
|
|
17
23
|
full_path: {
|
|
18
24
|
title: 'Enter the path to the full dataset download file',
|
|
19
25
|
description:
|
|
@@ -69,6 +75,7 @@ const ItemSchema = () => ({
|
|
|
69
75
|
fields: [
|
|
70
76
|
'name',
|
|
71
77
|
'collection',
|
|
78
|
+
'byoc_collection',
|
|
72
79
|
'full_path',
|
|
73
80
|
'full_format',
|
|
74
81
|
'full_source',
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Html helper.
|
|
3
|
+
* @module helpers/Html
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React, { Component } from 'react';
|
|
7
|
+
import PropTypes from 'prop-types';
|
|
8
|
+
import Helmet from '@plone/volto/helpers/Helmet/Helmet';
|
|
9
|
+
import serialize from 'serialize-javascript';
|
|
10
|
+
import { join } from 'lodash';
|
|
11
|
+
import BodyClass from '@plone/volto/helpers/BodyClass/BodyClass';
|
|
12
|
+
import { runtimeConfig } from '@plone/volto/runtime_config';
|
|
13
|
+
import config from '@plone/volto/registry';
|
|
14
|
+
|
|
15
|
+
const CRITICAL_CSS_TEMPLATE = `function alter() {
|
|
16
|
+
document.querySelectorAll("head link[rel='prefetch']").forEach(function(el) { el.rel = 'stylesheet'});
|
|
17
|
+
}
|
|
18
|
+
if (window.addEventListener) {
|
|
19
|
+
window.addEventListener('DOMContentLoaded', alter, false)
|
|
20
|
+
} else {
|
|
21
|
+
window.onload=alter
|
|
22
|
+
}`;
|
|
23
|
+
|
|
24
|
+
export const loadReducers = (state = {}) => {
|
|
25
|
+
const { settings } = config;
|
|
26
|
+
return Object.assign(
|
|
27
|
+
{},
|
|
28
|
+
...Object.keys(state).map((name) =>
|
|
29
|
+
settings.initialReducersBlacklist.includes(name)
|
|
30
|
+
? {}
|
|
31
|
+
: { [name]: state[name] },
|
|
32
|
+
),
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Html class.
|
|
38
|
+
* Wrapper component containing HTML metadata and boilerplate tags.
|
|
39
|
+
* Used in server-side code only to wrap the string output of the
|
|
40
|
+
* rendered route component.
|
|
41
|
+
*
|
|
42
|
+
* The only thing this component doesn't (and can't) include is the
|
|
43
|
+
* HTML doctype declaration, which is added to the rendered output
|
|
44
|
+
* by the server.js file.
|
|
45
|
+
*
|
|
46
|
+
* Critical.css behaviour: when a file `public/critical.css` is present, the
|
|
47
|
+
* loading of stylesheets is changed. The styles in critical.css are inlined in
|
|
48
|
+
* the generated HTML, and the whole story needs to change completely: instead
|
|
49
|
+
* of treating stylesheets as priority for rendering, we want to defer their
|
|
50
|
+
* loading as much as possible. So we change the stylesheets to be prefetched
|
|
51
|
+
* and we switch their rel back to stylesheets at document ready event.
|
|
52
|
+
*
|
|
53
|
+
* @function Html
|
|
54
|
+
* @param {Object} props Component properties.
|
|
55
|
+
* @param {Object} props.assets Assets to be rendered.
|
|
56
|
+
* @param {Object} props.component Content to be rendered as child node.
|
|
57
|
+
* @param {Object} props.store Store object.
|
|
58
|
+
* @returns {string} Markup of the not found page.
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Html class.
|
|
63
|
+
* @class Html
|
|
64
|
+
* @extends Component
|
|
65
|
+
*/
|
|
66
|
+
class Html extends Component {
|
|
67
|
+
/**
|
|
68
|
+
* Property types.
|
|
69
|
+
* @property {Object} propTypes Property types.
|
|
70
|
+
* @static
|
|
71
|
+
*/
|
|
72
|
+
static propTypes = {
|
|
73
|
+
extractor: PropTypes.shape({
|
|
74
|
+
getLinkElements: PropTypes.func.isRequired,
|
|
75
|
+
getScriptElements: PropTypes.func.isRequired,
|
|
76
|
+
getStyleElements: PropTypes.func.isRequired,
|
|
77
|
+
}).isRequired,
|
|
78
|
+
markup: PropTypes.string.isRequired,
|
|
79
|
+
store: PropTypes.shape({
|
|
80
|
+
getState: PropTypes.func,
|
|
81
|
+
}).isRequired,
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Render method.
|
|
86
|
+
* @method render
|
|
87
|
+
* @returns {string} Markup for the component.
|
|
88
|
+
*/
|
|
89
|
+
render() {
|
|
90
|
+
const {
|
|
91
|
+
extractor,
|
|
92
|
+
markup,
|
|
93
|
+
store,
|
|
94
|
+
criticalCss,
|
|
95
|
+
apiPath,
|
|
96
|
+
publicURL,
|
|
97
|
+
} = this.props;
|
|
98
|
+
const head = Helmet.rewind();
|
|
99
|
+
const bodyClass = join(BodyClass.rewind(), ' ');
|
|
100
|
+
const htmlAttributes = head.htmlAttributes.toComponent();
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<html lang={htmlAttributes.lang}>
|
|
104
|
+
<head>
|
|
105
|
+
<meta charSet="utf-8" />
|
|
106
|
+
{head.base.toComponent()}
|
|
107
|
+
{head.title.toComponent()}
|
|
108
|
+
{head.meta.toComponent()}
|
|
109
|
+
{head.link.toComponent()}
|
|
110
|
+
{head.script.toComponent()}
|
|
111
|
+
|
|
112
|
+
<script
|
|
113
|
+
dangerouslySetInnerHTML={{
|
|
114
|
+
__html: `window.env = ${serialize({
|
|
115
|
+
...runtimeConfig,
|
|
116
|
+
// Seamless mode requirement, the client need to know where the API is located
|
|
117
|
+
// if not set in the API_PATH
|
|
118
|
+
...(apiPath && {
|
|
119
|
+
apiPath,
|
|
120
|
+
}),
|
|
121
|
+
...(publicURL && {
|
|
122
|
+
publicURL,
|
|
123
|
+
}),
|
|
124
|
+
})};`,
|
|
125
|
+
}}
|
|
126
|
+
/>
|
|
127
|
+
|
|
128
|
+
<link rel="icon" href="/favicon.ico" sizes="any" />
|
|
129
|
+
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
|
130
|
+
<link
|
|
131
|
+
rel="apple-touch-icon"
|
|
132
|
+
sizes="180x180"
|
|
133
|
+
href="/apple-touch-icon.png"
|
|
134
|
+
/>
|
|
135
|
+
<link rel="manifest" href="/site.webmanifest" />
|
|
136
|
+
<meta name="generator" content="Plone 6 - https://plone.org" />
|
|
137
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
138
|
+
<meta name="mobile-web-app-capable" content="yes" />
|
|
139
|
+
{process.env.NODE_ENV === 'production' && criticalCss && (
|
|
140
|
+
<style
|
|
141
|
+
dangerouslySetInnerHTML={{ __html: this.props.criticalCss }}
|
|
142
|
+
/>
|
|
143
|
+
)}
|
|
144
|
+
{/* Add the crossorigin while in development */}
|
|
145
|
+
{extractor.getLinkElements().map((elem) =>
|
|
146
|
+
React.cloneElement(elem, {
|
|
147
|
+
crossOrigin:
|
|
148
|
+
process.env.NODE_ENV === 'production' ? undefined : 'true',
|
|
149
|
+
rel: !criticalCss
|
|
150
|
+
? elem.props.rel
|
|
151
|
+
: elem.props.as === 'style'
|
|
152
|
+
? 'prefetch'
|
|
153
|
+
: elem.props.rel,
|
|
154
|
+
}),
|
|
155
|
+
)}
|
|
156
|
+
{/* Styles in development are loaded with Webpack's style-loader, in production,
|
|
157
|
+
they need to be static*/}
|
|
158
|
+
{process.env.NODE_ENV === 'production' ? (
|
|
159
|
+
criticalCss ? (
|
|
160
|
+
<>
|
|
161
|
+
<script
|
|
162
|
+
dangerouslySetInnerHTML={{
|
|
163
|
+
__html: CRITICAL_CSS_TEMPLATE,
|
|
164
|
+
}}
|
|
165
|
+
></script>
|
|
166
|
+
{extractor.getStyleElements().map((elem) => (
|
|
167
|
+
<noscript>
|
|
168
|
+
{React.cloneElement(elem, {
|
|
169
|
+
rel: 'stylesheet',
|
|
170
|
+
crossOrigin:
|
|
171
|
+
process.env.NODE_ENV === 'production'
|
|
172
|
+
? undefined
|
|
173
|
+
: 'true',
|
|
174
|
+
})}
|
|
175
|
+
</noscript>
|
|
176
|
+
))}
|
|
177
|
+
</>
|
|
178
|
+
) : (
|
|
179
|
+
extractor.getStyleElements()
|
|
180
|
+
)
|
|
181
|
+
) : undefined}
|
|
182
|
+
</head>
|
|
183
|
+
<body className={bodyClass}>
|
|
184
|
+
<div role="navigation" aria-label="Toolbar" id="toolbar" />
|
|
185
|
+
<div id="main" dangerouslySetInnerHTML={{ __html: markup }} />
|
|
186
|
+
<div role="complementary" aria-label="Sidebar" id="sidebar" />
|
|
187
|
+
<script
|
|
188
|
+
dangerouslySetInnerHTML={{
|
|
189
|
+
__html: `window.__data=${serialize(
|
|
190
|
+
loadReducers(store.getState()),
|
|
191
|
+
)};`,
|
|
192
|
+
}}
|
|
193
|
+
charSet="UTF-8"
|
|
194
|
+
/>
|
|
195
|
+
{/* Add the crossorigin while in development */}
|
|
196
|
+
{this.props.extractScripts !== false
|
|
197
|
+
? extractor.getScriptElements().map((elem) =>
|
|
198
|
+
React.cloneElement(elem, {
|
|
199
|
+
crossOrigin:
|
|
200
|
+
process.env.NODE_ENV === 'production' ? undefined : 'true',
|
|
201
|
+
}),
|
|
202
|
+
)
|
|
203
|
+
: ''}
|
|
204
|
+
</body>
|
|
205
|
+
</html>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export default Html;
|
|
@@ -87,3 +87,58 @@
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
+
|
|
91
|
+
// Mobile responsive styles
|
|
92
|
+
@media (max-width: 768px) {
|
|
93
|
+
.ccl-container.ccl-container-flex.tab-container.tabs-vertical-product {
|
|
94
|
+
flex-direction: column !important;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.tabs-vertical-product {
|
|
98
|
+
&.tab-container {
|
|
99
|
+
.tabs {
|
|
100
|
+
width: 100% !important;
|
|
101
|
+
|
|
102
|
+
nav {
|
|
103
|
+
flex-direction: column;
|
|
104
|
+
width: 100% !important;
|
|
105
|
+
max-width: 100% !important;
|
|
106
|
+
|
|
107
|
+
.tab {
|
|
108
|
+
flex: none !important;
|
|
109
|
+
width: 100% !important;
|
|
110
|
+
max-width: 100% !important;
|
|
111
|
+
margin-right: 0 !important;
|
|
112
|
+
margin-bottom: 0.5rem;
|
|
113
|
+
min-height: 48px;
|
|
114
|
+
box-sizing: border-box;
|
|
115
|
+
|
|
116
|
+
&:last-of-type {
|
|
117
|
+
margin-bottom: 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
&:first-of-type {
|
|
121
|
+
border: 1px solid @clmsGreen;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.tab > a,
|
|
126
|
+
.tab > span {
|
|
127
|
+
min-height: 44px;
|
|
128
|
+
display: flex !important;
|
|
129
|
+
align-items: center;
|
|
130
|
+
padding: 0.75rem 1rem !important;
|
|
131
|
+
width: 100% !important;
|
|
132
|
+
max-width: 100% !important;
|
|
133
|
+
box-sizing: border-box;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.panels {
|
|
139
|
+
margin-top: 1rem;
|
|
140
|
+
width: 100% !important;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -8,16 +8,21 @@
|
|
|
8
8
|
cursor: pointer;
|
|
9
9
|
transition: all 0.5s ease;
|
|
10
10
|
|
|
11
|
-
.
|
|
11
|
+
.header-row {
|
|
12
12
|
display: flex;
|
|
13
13
|
align-items: center;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
|
|
15
|
+
.injected-svg {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
margin-right: 0.5rem;
|
|
19
|
+
}
|
|
16
20
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
.product-title {
|
|
22
|
+
font-size: 18px;
|
|
23
|
+
font-weight: bold;
|
|
24
|
+
color: #273b4b;
|
|
25
|
+
}
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
.product-description {
|
|
@@ -48,3 +53,32 @@
|
|
|
48
53
|
background-color: @clmsGreen;
|
|
49
54
|
color: white;
|
|
50
55
|
}
|
|
56
|
+
|
|
57
|
+
@media (max-width: 768px) {
|
|
58
|
+
.CCLTabsProductViewToggle .product-tab-view {
|
|
59
|
+
.container {
|
|
60
|
+
flex-direction: column;
|
|
61
|
+
align-items: flex-start;
|
|
62
|
+
gap: 0.75rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.header-row {
|
|
66
|
+
display: flex;
|
|
67
|
+
align-items: center;
|
|
68
|
+
width: 100%;
|
|
69
|
+
|
|
70
|
+
.injected-svg {
|
|
71
|
+
margin-right: 0.5rem;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.product-title {
|
|
75
|
+
flex: 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.button-group {
|
|
81
|
+
margin-left: 0;
|
|
82
|
+
align-self: center;
|
|
83
|
+
}
|
|
84
|
+
}
|