@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 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.246](https://github.com/eea/volto-clms-theme/compare/1.1.245...1.1.246) - 7 August 2025
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 #286059 - Histogram fix: make tooltips visible. [GhitaB - [`8cd8a43`](https://github.com/eea/volto-clms-theme/commit/8cd8a43d19b1fd13acf7859cf0753c1464a1ba4a)]
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-clms-theme",
3
- "version": "1.1.246",
3
+ "version": "1.1.248",
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",
@@ -98,22 +98,24 @@ const CclProductToggleView = (props) => {
98
98
  return (
99
99
  <div className="product-tab-view">
100
100
  <div className="container">
101
- {props.data.productIcon === 'Landscape green bg' ? (
102
- <ReactSVG src={LandCoverImage} />
103
- ) : props.data.productIcon === 'Warning green bg' ? (
104
- <ReactSVG src={PriorityAreaImage} />
105
- ) : props.data.productIcon === 'Leaf green bg' ? (
106
- <ReactSVG src={BioGeoPhysicalImage} />
107
- ) : props.data.productIcon === 'Computer green bg' ? (
108
- <ReactSVG src={GroundMotionImage} />
109
- ) : props.data.productIcon === 'Database green bg' ? (
110
- <ReactSVG src={ReferenceAndValidationImage} />
111
- ) : props.data.productIcon === 'Satellite green bg' ? (
112
- <ReactSVG src={SatelliteImage} />
113
- ) : (
114
- ''
115
- )}
116
- <div className="product-title">{props.data.title}</div>
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: ${item?.FMETaskId}`}</Header.Subheader>
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
- .injected-svg {
11
+ .header-row {
12
12
  display: flex;
13
13
  align-items: center;
14
- margin-right: 0.5rem;
15
- }
14
+
15
+ .injected-svg {
16
+ display: flex;
17
+ align-items: center;
18
+ margin-right: 0.5rem;
19
+ }
16
20
 
17
- .product-title {
18
- font-size: 18px;
19
- font-weight: bold;
20
- color: #273b4b;
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
+ }