@eeacms/volto-clms-theme 1.0.183 → 1.0.185
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 +18 -0
- package/package.json +1 -1
- package/src/components/CLMSDatasetDetailView/DataSetInfoContent.jsx +9 -7
- package/src/components/CclUtils/dateFormats.js +1 -1
- package/src/customizations/volto/components/manage/Widgets/ArrayWidget.jsx +424 -0
- package/theme/clms/css/menu.css +35 -24
- package/theme/clms/css/styles.less +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@ 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.0.185](https://github.com/eea/volto-clms-theme/compare/1.0.184...1.0.185) - 13 March 2023
|
|
8
|
+
|
|
9
|
+
#### :hammer_and_wrench: Others
|
|
10
|
+
|
|
11
|
+
- comment MenuList [Unai - [`b8dfeff`](https://github.com/eea/volto-clms-theme/commit/b8dfeff240130c803fd6c33dd6460cd8252f90af)]
|
|
12
|
+
- volto 16 array widget [Unai - [`a29aab8`](https://github.com/eea/volto-clms-theme/commit/a29aab86c035f352e32ca1c20edd926591566094)]
|
|
13
|
+
### [1.0.184](https://github.com/eea/volto-clms-theme/compare/1.0.183...1.0.184) - 10 March 2023
|
|
14
|
+
|
|
15
|
+
#### :rocket: New Features
|
|
16
|
+
|
|
17
|
+
- feat: clms-1924 hide validation status when it is empty [Mikel Larreategi - [`b0326a0`](https://github.com/eea/volto-clms-theme/commit/b0326a07cc12636ad36ccc9335c4e5cb8aff670b)]
|
|
18
|
+
|
|
19
|
+
#### :hammer_and_wrench: Others
|
|
20
|
+
|
|
21
|
+
- subscribe button style fix [Unai - [`af24b06`](https://github.com/eea/volto-clms-theme/commit/af24b06869bb13350b91d7f419bdff99861fee5d)]
|
|
22
|
+
- change date format in Vacancy and Tenders [Mikel Larreategi - [`48ef2c0`](https://github.com/eea/volto-clms-theme/commit/48ef2c0c850c8a9d73c50abd082b9a17d59993f7)]
|
|
23
|
+
- breadcrumbs margin fix [Unai - [`008fbce`](https://github.com/eea/volto-clms-theme/commit/008fbcedf5f36883b73de5efb90ebd68dd3da818)]
|
|
24
|
+
- dateformat utils fix with null dates [Unai - [`bcd620e`](https://github.com/eea/volto-clms-theme/commit/bcd620e9621cec5ccecdd1eb4b87f76b5e620509)]
|
|
7
25
|
### [1.0.183](https://github.com/eea/volto-clms-theme/compare/1.0.182...1.0.183) - 8 March 2023
|
|
8
26
|
|
|
9
27
|
#### :hammer_and_wrench: Others
|
package/package.json
CHANGED
|
@@ -60,13 +60,15 @@ const DataSetInfoContent = (props) => {
|
|
|
60
60
|
}
|
|
61
61
|
return (
|
|
62
62
|
<div>
|
|
63
|
-
{validation?.data &&
|
|
64
|
-
<
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
{validation?.data &&
|
|
64
|
+
validation?.data !== '<p><br/></p>' &&
|
|
65
|
+
validation?.data !== '<p></p>' && (
|
|
66
|
+
<CclCitation
|
|
67
|
+
title="Validation status"
|
|
68
|
+
marginBottom={true}
|
|
69
|
+
children={<StringToHTML string={validation.data} />}
|
|
70
|
+
></CclCitation>
|
|
71
|
+
)}
|
|
70
72
|
<CclInfoContainer>
|
|
71
73
|
{props?.description ? (
|
|
72
74
|
<CclInfoDescription
|
|
@@ -18,7 +18,7 @@ export const cclDateTimeFormat = (date) => {
|
|
|
18
18
|
|
|
19
19
|
export const workOpportunitiesCclDateTimeFormat = (date, lang) => {
|
|
20
20
|
const internal = getInternalValue(date, lang);
|
|
21
|
-
return internal
|
|
21
|
+
return internal?.format('DD.MM.YYYY HH.mm');
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
export const cclDateFormat = (date) => {
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArrayWidget component.
|
|
3
|
+
* @module components/manage/Widgets/ArrayWidget
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React, { Component } from 'react';
|
|
7
|
+
import { defineMessages, injectIntl } from 'react-intl';
|
|
8
|
+
import PropTypes from 'prop-types';
|
|
9
|
+
import { compose } from 'redux';
|
|
10
|
+
import { connect } from 'react-redux';
|
|
11
|
+
import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
|
|
12
|
+
import { find, isObject } from 'lodash';
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
getVocabFromHint,
|
|
16
|
+
getVocabFromField,
|
|
17
|
+
getVocabFromItems,
|
|
18
|
+
} from '@plone/volto/helpers';
|
|
19
|
+
import { getVocabulary } from '@plone/volto/actions';
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
Option,
|
|
23
|
+
DropdownIndicator,
|
|
24
|
+
ClearIndicator,
|
|
25
|
+
selectTheme,
|
|
26
|
+
customSelectStyles,
|
|
27
|
+
// MenuList,
|
|
28
|
+
SortableMultiValue,
|
|
29
|
+
SortableMultiValueLabel,
|
|
30
|
+
MultiValueContainer,
|
|
31
|
+
} from '@plone/volto/components/manage/Widgets/SelectStyling';
|
|
32
|
+
|
|
33
|
+
import { FormFieldWrapper } from '@plone/volto/components';
|
|
34
|
+
|
|
35
|
+
const messages = defineMessages({
|
|
36
|
+
select: {
|
|
37
|
+
id: 'Select…',
|
|
38
|
+
defaultMessage: 'Select…',
|
|
39
|
+
},
|
|
40
|
+
no_value: {
|
|
41
|
+
id: 'No value',
|
|
42
|
+
defaultMessage: 'No value',
|
|
43
|
+
},
|
|
44
|
+
no_options: {
|
|
45
|
+
id: 'No options',
|
|
46
|
+
defaultMessage: 'No options',
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
function arrayMove(array, from, to) {
|
|
51
|
+
const slicedArray = array.slice();
|
|
52
|
+
slicedArray.splice(
|
|
53
|
+
to < 0 ? array.length + to : to,
|
|
54
|
+
0,
|
|
55
|
+
slicedArray.splice(from, 1)[0],
|
|
56
|
+
);
|
|
57
|
+
return slicedArray;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function normalizeArrayValue(choices, value) {
|
|
61
|
+
if (!value || !Array.isArray(value)) return [];
|
|
62
|
+
if (value.length === 0) return value;
|
|
63
|
+
|
|
64
|
+
if (typeof value[0] === 'string') {
|
|
65
|
+
// raw value like ['foo', 'bar']
|
|
66
|
+
return value.map((v) => {
|
|
67
|
+
return {
|
|
68
|
+
label: find(choices, (c) => c.value === v)?.label || v,
|
|
69
|
+
value: v,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (
|
|
75
|
+
isObject(value[0]) &&
|
|
76
|
+
Object.keys(value[0]).includes('token') // Array of objects, w/ label+value
|
|
77
|
+
) {
|
|
78
|
+
return value
|
|
79
|
+
.map((v) => {
|
|
80
|
+
const item = find(choices, (c) => c.value === v.token);
|
|
81
|
+
return item
|
|
82
|
+
? {
|
|
83
|
+
label: item.label || item.title || item.token,
|
|
84
|
+
value: v.token,
|
|
85
|
+
}
|
|
86
|
+
: {
|
|
87
|
+
// avoid a crash if choices doesn't include this item
|
|
88
|
+
label: v.label,
|
|
89
|
+
value: v.token,
|
|
90
|
+
};
|
|
91
|
+
})
|
|
92
|
+
.filter((f) => !!f);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function normalizeChoices(choices) {
|
|
99
|
+
if (Array.isArray(choices) && choices.length && Array.isArray(choices[0])) {
|
|
100
|
+
return choices.map((option) => ({
|
|
101
|
+
value: option[0],
|
|
102
|
+
label:
|
|
103
|
+
// Fix "None" on the serializer, to remove when fixed in p.restapi
|
|
104
|
+
option[1] !== 'None' && option[1] ? option[1] : option[0],
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return choices;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Compare values and return true if equal.
|
|
113
|
+
* Consider upper and lower case.
|
|
114
|
+
* @method compareOption
|
|
115
|
+
* @param {*} inputValue
|
|
116
|
+
* @param {*} option
|
|
117
|
+
* @param {*} accessors
|
|
118
|
+
* @returns {boolean}
|
|
119
|
+
*/
|
|
120
|
+
const compareOption = (inputValue = '', option, accessors) => {
|
|
121
|
+
const candidate = String(inputValue);
|
|
122
|
+
const optionValue = String(accessors.getOptionValue(option));
|
|
123
|
+
const optionLabel = String(accessors.getOptionLabel(option));
|
|
124
|
+
return optionValue === candidate || optionLabel === candidate;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* ArrayWidget component class.
|
|
129
|
+
* @class ArrayWidget
|
|
130
|
+
* @extends Component
|
|
131
|
+
*
|
|
132
|
+
* A createable select array widget will be rendered if the named vocabulary is
|
|
133
|
+
* in the widget definition (hint) like:
|
|
134
|
+
*
|
|
135
|
+
* ```
|
|
136
|
+
* list_field_voc_unconstrained = schema.List(
|
|
137
|
+
* title=u"List field with values from vocabulary but not constrained to them.",
|
|
138
|
+
* description=u"zope.schema.List",
|
|
139
|
+
* value_type=schema.TextLine(),
|
|
140
|
+
* required=False,
|
|
141
|
+
* missing_value=[],
|
|
142
|
+
* )
|
|
143
|
+
* directives.widget(
|
|
144
|
+
* "list_field_voc_unconstrained",
|
|
145
|
+
* AjaxSelectFieldWidget,
|
|
146
|
+
* vocabulary="plone.app.vocabularies.PortalTypes",
|
|
147
|
+
* )
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
class ArrayWidget extends Component {
|
|
151
|
+
/**
|
|
152
|
+
* Property types.
|
|
153
|
+
* @property {Object} propTypes Property types.
|
|
154
|
+
* @static
|
|
155
|
+
*/
|
|
156
|
+
static propTypes = {
|
|
157
|
+
id: PropTypes.string.isRequired,
|
|
158
|
+
title: PropTypes.string.isRequired,
|
|
159
|
+
description: PropTypes.string,
|
|
160
|
+
required: PropTypes.bool,
|
|
161
|
+
error: PropTypes.arrayOf(PropTypes.string),
|
|
162
|
+
getVocabulary: PropTypes.func.isRequired,
|
|
163
|
+
choices: PropTypes.arrayOf(
|
|
164
|
+
PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
|
|
165
|
+
),
|
|
166
|
+
vocabLoading: PropTypes.bool,
|
|
167
|
+
vocabLoaded: PropTypes.bool,
|
|
168
|
+
items: PropTypes.shape({
|
|
169
|
+
vocabulary: PropTypes.object,
|
|
170
|
+
}),
|
|
171
|
+
widgetOptions: PropTypes.shape({
|
|
172
|
+
vocabulary: PropTypes.object,
|
|
173
|
+
}),
|
|
174
|
+
value: PropTypes.arrayOf(
|
|
175
|
+
PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
|
|
176
|
+
),
|
|
177
|
+
placeholder: PropTypes.string,
|
|
178
|
+
onChange: PropTypes.func.isRequired,
|
|
179
|
+
wrapped: PropTypes.bool,
|
|
180
|
+
creatable: PropTypes.bool, //if widget has no vocab and you want to be creatable
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Default properties
|
|
185
|
+
* @property {Object} defaultProps Default properties.
|
|
186
|
+
* @static
|
|
187
|
+
*/
|
|
188
|
+
static defaultProps = {
|
|
189
|
+
description: null,
|
|
190
|
+
required: false,
|
|
191
|
+
items: {
|
|
192
|
+
vocabulary: null,
|
|
193
|
+
},
|
|
194
|
+
widgetOptions: {
|
|
195
|
+
vocabulary: null,
|
|
196
|
+
},
|
|
197
|
+
error: [],
|
|
198
|
+
choices: [],
|
|
199
|
+
value: null,
|
|
200
|
+
creatable: false,
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Constructor
|
|
205
|
+
* @method constructor
|
|
206
|
+
* @param {Object} props Component properties
|
|
207
|
+
* @constructs Actions
|
|
208
|
+
*/
|
|
209
|
+
constructor(props) {
|
|
210
|
+
super(props);
|
|
211
|
+
|
|
212
|
+
this.handleChange = this.handleChange.bind(this);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Component did mount
|
|
217
|
+
* @method componentDidMount
|
|
218
|
+
* @returns {undefined}
|
|
219
|
+
*/
|
|
220
|
+
componentDidMount() {
|
|
221
|
+
if (
|
|
222
|
+
!this.props.items?.choices?.length &&
|
|
223
|
+
!this.props.choices?.length &&
|
|
224
|
+
this.props.vocabBaseUrl
|
|
225
|
+
) {
|
|
226
|
+
this.props.getVocabulary({
|
|
227
|
+
vocabNameOrURL: this.props.vocabBaseUrl,
|
|
228
|
+
size: -1,
|
|
229
|
+
subrequest: this.props.lang,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
componentDidUpdate() {
|
|
235
|
+
if (
|
|
236
|
+
!this.props.items?.choices?.length &&
|
|
237
|
+
!this.props.choices?.length &&
|
|
238
|
+
this.props.vocabLoading === undefined &&
|
|
239
|
+
!this.props.vocabLoaded &&
|
|
240
|
+
this.props.vocabBaseUrl
|
|
241
|
+
) {
|
|
242
|
+
this.props.getVocabulary({
|
|
243
|
+
vocabNameOrURL: this.props.vocabBaseUrl,
|
|
244
|
+
size: -1,
|
|
245
|
+
subrequest: this.props.lang,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Handle the field change, store it in the local state and back to simple
|
|
252
|
+
* array of tokens for correct serialization
|
|
253
|
+
* @method handleChange
|
|
254
|
+
* @param {array} selectedOption The selected options (already aggregated).
|
|
255
|
+
* @returns {undefined}
|
|
256
|
+
*/
|
|
257
|
+
handleChange(selectedOption) {
|
|
258
|
+
this.props.onChange(
|
|
259
|
+
this.props.id,
|
|
260
|
+
selectedOption ? selectedOption.map((item) => item.value) : null,
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
onSortEnd = (selectedOption, { oldIndex, newIndex }) => {
|
|
265
|
+
const newValue = arrayMove(selectedOption, oldIndex, newIndex);
|
|
266
|
+
|
|
267
|
+
this.handleChange(newValue);
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Render method.
|
|
272
|
+
* @method render
|
|
273
|
+
* @returns {string} Markup for the component.
|
|
274
|
+
*/
|
|
275
|
+
render() {
|
|
276
|
+
const choices = normalizeChoices(this.props?.choices || []);
|
|
277
|
+
const selectedOption = normalizeArrayValue(choices, this.props.value);
|
|
278
|
+
|
|
279
|
+
const CreatableSelect = this.props.reactSelectCreateable.default;
|
|
280
|
+
const { SortableContainer } = this.props.reactSortableHOC;
|
|
281
|
+
const Select = this.props.reactSelect.default;
|
|
282
|
+
const SortableSelect =
|
|
283
|
+
// It will be only createable if the named vocabulary is in the widget definition
|
|
284
|
+
// (hint) like:
|
|
285
|
+
// list_field_voc_unconstrained = schema.List(
|
|
286
|
+
// title=u"List field with values from vocabulary but not constrained to them.",
|
|
287
|
+
// description=u"zope.schema.List",
|
|
288
|
+
// value_type=schema.TextLine(),
|
|
289
|
+
// required=False,
|
|
290
|
+
// missing_value=[],
|
|
291
|
+
// )
|
|
292
|
+
// directives.widget(
|
|
293
|
+
// "list_field_voc_unconstrained",
|
|
294
|
+
// AjaxSelectFieldWidget,
|
|
295
|
+
// vocabulary="plone.app.vocabularies.PortalTypes",
|
|
296
|
+
// )
|
|
297
|
+
this.props?.choices &&
|
|
298
|
+
!getVocabFromHint(this.props) &&
|
|
299
|
+
!this.props.creatable
|
|
300
|
+
? SortableContainer(Select)
|
|
301
|
+
: SortableContainer(CreatableSelect);
|
|
302
|
+
|
|
303
|
+
return (
|
|
304
|
+
<FormFieldWrapper {...this.props}>
|
|
305
|
+
<SortableSelect
|
|
306
|
+
useDragHandle
|
|
307
|
+
// react-sortable-hoc props:
|
|
308
|
+
axis="xy"
|
|
309
|
+
onSortEnd={this.onSortEnd}
|
|
310
|
+
menuShouldScrollIntoView={false}
|
|
311
|
+
distance={4}
|
|
312
|
+
// small fix for https://github.com/clauderic/react-sortable-hoc/pull/352:
|
|
313
|
+
getHelperDimensions={({ node }) => node.getBoundingClientRect()}
|
|
314
|
+
id={`field-${this.props.id}`}
|
|
315
|
+
key={this.props.id}
|
|
316
|
+
isDisabled={this.props.disabled || this.props.isDisabled}
|
|
317
|
+
className="react-select-container"
|
|
318
|
+
classNamePrefix="react-select"
|
|
319
|
+
/* eslint-disable jsx-a11y/no-autofocus */
|
|
320
|
+
autoFocus={this.props.focus}
|
|
321
|
+
/* eslint-enable jsx-a11y/no-autofocus */
|
|
322
|
+
options={
|
|
323
|
+
this.props.vocabBaseUrl
|
|
324
|
+
? choices
|
|
325
|
+
: this.props.choices
|
|
326
|
+
? [
|
|
327
|
+
...choices,
|
|
328
|
+
...(this.props.noValueOption && !this.props.default
|
|
329
|
+
? [
|
|
330
|
+
{
|
|
331
|
+
label: this.props.intl.formatMessage(
|
|
332
|
+
messages.no_value,
|
|
333
|
+
),
|
|
334
|
+
value: 'no-value',
|
|
335
|
+
},
|
|
336
|
+
]
|
|
337
|
+
: []),
|
|
338
|
+
]
|
|
339
|
+
: [
|
|
340
|
+
{
|
|
341
|
+
label: this.props.intl.formatMessage(messages.no_value),
|
|
342
|
+
value: 'no-value',
|
|
343
|
+
},
|
|
344
|
+
]
|
|
345
|
+
}
|
|
346
|
+
styles={customSelectStyles}
|
|
347
|
+
theme={selectTheme}
|
|
348
|
+
components={{
|
|
349
|
+
// ...(this.props.choices?.length > 25 && {
|
|
350
|
+
// MenuList,
|
|
351
|
+
// }),
|
|
352
|
+
MultiValueContainer,
|
|
353
|
+
MultiValue: SortableMultiValue,
|
|
354
|
+
MultiValueLabel: SortableMultiValueLabel,
|
|
355
|
+
DropdownIndicator,
|
|
356
|
+
ClearIndicator,
|
|
357
|
+
Option,
|
|
358
|
+
}}
|
|
359
|
+
value={selectedOption || []}
|
|
360
|
+
placeholder={
|
|
361
|
+
this.props.placeholder ??
|
|
362
|
+
this.props.intl.formatMessage(messages.select)
|
|
363
|
+
}
|
|
364
|
+
onChange={this.handleChange}
|
|
365
|
+
isValidNewOption={(
|
|
366
|
+
inputValue,
|
|
367
|
+
selectValue,
|
|
368
|
+
selectOptions,
|
|
369
|
+
accessors,
|
|
370
|
+
) =>
|
|
371
|
+
!(
|
|
372
|
+
!inputValue ||
|
|
373
|
+
selectValue.some((option) =>
|
|
374
|
+
compareOption(inputValue, option, accessors),
|
|
375
|
+
) ||
|
|
376
|
+
selectOptions.some((option) =>
|
|
377
|
+
compareOption(inputValue, option, accessors),
|
|
378
|
+
)
|
|
379
|
+
)
|
|
380
|
+
}
|
|
381
|
+
isClearable
|
|
382
|
+
isMulti
|
|
383
|
+
/>
|
|
384
|
+
</FormFieldWrapper>
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
export const ArrayWidgetComponent = injectIntl(ArrayWidget);
|
|
390
|
+
|
|
391
|
+
export default compose(
|
|
392
|
+
injectIntl,
|
|
393
|
+
injectLazyLibs(['reactSelect', 'reactSelectCreateable', 'reactSortableHOC']),
|
|
394
|
+
connect(
|
|
395
|
+
(state, props) => {
|
|
396
|
+
const vocabBaseUrl =
|
|
397
|
+
getVocabFromHint(props) ||
|
|
398
|
+
getVocabFromField(props) ||
|
|
399
|
+
getVocabFromItems(props);
|
|
400
|
+
|
|
401
|
+
const vocabState =
|
|
402
|
+
state.vocabularies?.[vocabBaseUrl]?.subrequests?.[state.intl.locale];
|
|
403
|
+
|
|
404
|
+
// If the schema already has the choices in it, then do not try to get the vocab,
|
|
405
|
+
// even if there is one
|
|
406
|
+
if (props.items?.choices) {
|
|
407
|
+
return {
|
|
408
|
+
choices: props.items.choices,
|
|
409
|
+
lang: state.intl.locale,
|
|
410
|
+
};
|
|
411
|
+
} else if (vocabState) {
|
|
412
|
+
return {
|
|
413
|
+
choices: vocabState.items,
|
|
414
|
+
vocabBaseUrl,
|
|
415
|
+
vocabLoading: vocabState.loading,
|
|
416
|
+
vocabLoaded: vocabState.loaded,
|
|
417
|
+
lang: state.intl.locale,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
return { vocabBaseUrl, lang: state.intl.locale };
|
|
421
|
+
},
|
|
422
|
+
{ getVocabulary },
|
|
423
|
+
),
|
|
424
|
+
)(ArrayWidget);
|
package/theme/clms/css/menu.css
CHANGED
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
.ccl-breadcrumb .ccl-breadcrumb__segment {
|
|
33
33
|
display: block;
|
|
34
|
+
margin-left: 0 !important;
|
|
34
35
|
font-size: 1rem;
|
|
35
36
|
line-height: 1.25;
|
|
36
37
|
}
|
|
@@ -301,7 +302,8 @@
|
|
|
301
302
|
height: 20px;
|
|
302
303
|
}
|
|
303
304
|
|
|
304
|
-
.filters-element select:focus-visible,
|
|
305
|
+
.filters-element select:focus-visible,
|
|
306
|
+
.filters-element select:focus {
|
|
305
307
|
outline: none;
|
|
306
308
|
}
|
|
307
309
|
|
|
@@ -320,7 +322,10 @@
|
|
|
320
322
|
font-weight: bold;
|
|
321
323
|
}
|
|
322
324
|
|
|
323
|
-
.filters-container
|
|
325
|
+
.filters-container
|
|
326
|
+
.react-select__control
|
|
327
|
+
.react-select__dropdown-indicator
|
|
328
|
+
svg {
|
|
324
329
|
fill: #273b4b !important;
|
|
325
330
|
}
|
|
326
331
|
|
|
@@ -368,14 +373,14 @@
|
|
|
368
373
|
.block.search .filter-list-header .filter-list-title svg {
|
|
369
374
|
margin-right: 0.5rem;
|
|
370
375
|
transform: rotate(0deg) !important;
|
|
371
|
-
-webkit-transition: transform .3s ease-out;
|
|
372
|
-
transition: transform 0.3s ease-out;
|
|
376
|
+
-webkit-transition: transform 0.3s ease-out;
|
|
377
|
+
transition: transform 0.3s ease-out;
|
|
373
378
|
}
|
|
374
379
|
|
|
375
380
|
.block.search .active.filter-list-header .filter-list-title svg {
|
|
376
381
|
transform: rotate(-180deg) !important;
|
|
377
|
-
-webkit-transition: transform .3s ease-out;
|
|
378
|
-
transition: transform 0.3s ease-out;
|
|
382
|
+
-webkit-transition: transform 0.3s ease-out;
|
|
383
|
+
transition: transform 0.3s ease-out;
|
|
379
384
|
}
|
|
380
385
|
|
|
381
386
|
.block.search .filter-listing .trash.icon {
|
|
@@ -398,7 +403,6 @@
|
|
|
398
403
|
margin: 0.25rem !important;
|
|
399
404
|
}
|
|
400
405
|
|
|
401
|
-
|
|
402
406
|
/* Filters modal */
|
|
403
407
|
.modal-filters {
|
|
404
408
|
display: none;
|
|
@@ -422,7 +426,7 @@
|
|
|
422
426
|
width: 100%;
|
|
423
427
|
background: white;
|
|
424
428
|
}
|
|
425
|
-
@media (min-width: 576px) {
|
|
429
|
+
@media (min-width: 576px) {
|
|
426
430
|
.modal-filters-container {
|
|
427
431
|
width: 70%;
|
|
428
432
|
}
|
|
@@ -461,7 +465,7 @@
|
|
|
461
465
|
font-size: 0.85rem;
|
|
462
466
|
padding-right: 1rem;
|
|
463
467
|
margin-right: 1rem;
|
|
464
|
-
border-right: solid 1px #
|
|
468
|
+
border-right: solid 1px #273b4b;
|
|
465
469
|
line-height: 1.5rem;
|
|
466
470
|
cursor: pointer;
|
|
467
471
|
}
|
|
@@ -513,28 +517,28 @@
|
|
|
513
517
|
}
|
|
514
518
|
|
|
515
519
|
.modal-filters-dropdown .ccl-expandable__button::after {
|
|
516
|
-
font-family:
|
|
520
|
+
font-family: 'ccl-icons';
|
|
517
521
|
color: #a0b128;
|
|
518
522
|
margin-right: 1.5rem;
|
|
519
523
|
-moz-osx-font-smoothing: grayscale;
|
|
520
524
|
-webkit-font-smoothing: antialiased;
|
|
521
525
|
position: absolute;
|
|
522
526
|
right: 0;
|
|
523
|
-
-webkit-transition: all .3s ease-in-out;
|
|
524
|
-
transition: all .3s
|
|
527
|
+
-webkit-transition: all 0.3s ease-in-out;
|
|
528
|
+
transition: all 0.3s ease-in-out;
|
|
525
529
|
}
|
|
526
530
|
|
|
527
531
|
.modal-filters-dropdown .ccl-expandable__button[aria-expanded='false']::after {
|
|
528
532
|
content: '\e914';
|
|
529
533
|
transform: rotate(0deg);
|
|
530
|
-
-webkit-transition: transform .3s ease-out;
|
|
531
|
-
transition: transform 0.3s ease-out;
|
|
534
|
+
-webkit-transition: transform 0.3s ease-out;
|
|
535
|
+
transition: transform 0.3s ease-out;
|
|
532
536
|
}
|
|
533
537
|
|
|
534
538
|
.modal-filters-dropdown .ccl-expandable__button[aria-expanded='true']::after {
|
|
535
539
|
content: '\e914';
|
|
536
540
|
transform: rotate(-180deg);
|
|
537
|
-
-webkit-transition: transform .3s ease-out;
|
|
541
|
+
-webkit-transition: transform 0.3s ease-out;
|
|
538
542
|
transition: transform 0.3s ease-out;
|
|
539
543
|
}
|
|
540
544
|
|
|
@@ -563,7 +567,10 @@
|
|
|
563
567
|
padding: 1rem 1.5rem;
|
|
564
568
|
}
|
|
565
569
|
|
|
566
|
-
.modal-filters-dropdown
|
|
570
|
+
.modal-filters-dropdown
|
|
571
|
+
.ccl-expandable__button
|
|
572
|
+
+ .ccl-form
|
|
573
|
+
.ccl-expandable__button {
|
|
567
574
|
background-color: transparent;
|
|
568
575
|
margin: 0;
|
|
569
576
|
padding: 0;
|
|
@@ -573,7 +580,11 @@
|
|
|
573
580
|
margin-top: 1.66rem;
|
|
574
581
|
}
|
|
575
582
|
|
|
576
|
-
.modal-filters-dropdown
|
|
583
|
+
.modal-filters-dropdown
|
|
584
|
+
.ccl-expandable__button
|
|
585
|
+
+ .ccl-form
|
|
586
|
+
.ccl-expandable__button
|
|
587
|
+
.ccl-form {
|
|
577
588
|
padding: 0;
|
|
578
589
|
}
|
|
579
590
|
|
|
@@ -604,10 +615,10 @@
|
|
|
604
615
|
}
|
|
605
616
|
|
|
606
617
|
.modal-filters-dropdown .filters-tag .checkbox input:checked + label {
|
|
607
|
-
color:white;
|
|
618
|
+
color: white;
|
|
608
619
|
background: #a0b128;
|
|
609
|
-
-webkit-transition: all .3s ease-out;
|
|
610
|
-
transition: all .3s ease-out;
|
|
620
|
+
-webkit-transition: all 0.3s ease-out;
|
|
621
|
+
transition: all 0.3s ease-out;
|
|
611
622
|
}
|
|
612
623
|
|
|
613
624
|
.modal-filters-dropdown .filters-tag .checkbox label {
|
|
@@ -617,8 +628,8 @@
|
|
|
617
628
|
border: solid 1px #a0b128;
|
|
618
629
|
cursor: pointer;
|
|
619
630
|
text-align: center;
|
|
620
|
-
-webkit-transition: all .3s ease-out;
|
|
621
|
-
transition: all .3s ease-out;
|
|
631
|
+
-webkit-transition: all 0.3s ease-out;
|
|
632
|
+
transition: all 0.3s ease-out;
|
|
622
633
|
}
|
|
623
634
|
|
|
624
635
|
.modal-filters-dropdown .ui.checkbox input:focus ~ label {
|
|
@@ -626,7 +637,7 @@
|
|
|
626
637
|
}
|
|
627
638
|
|
|
628
639
|
.modal-filters-dropdown .filters-tag .checkbox label:hover {
|
|
629
|
-
color:white;
|
|
640
|
+
color: white;
|
|
630
641
|
background: #a0b128;
|
|
631
642
|
}
|
|
632
643
|
|
|
@@ -643,7 +654,7 @@
|
|
|
643
654
|
.modal-filters-dropdown .ui.checkbox input:checked:focus ~ label:after {
|
|
644
655
|
color: #a0b128;
|
|
645
656
|
}
|
|
646
|
-
.modal-filters-dropdown .ui.checkbox input:checked ~ label:before,
|
|
657
|
+
.modal-filters-dropdown .ui.checkbox input:checked ~ label:before,
|
|
647
658
|
.modal-filters-dropdown .ui.checkbox input:checked:focus ~ label:before {
|
|
648
659
|
border: 1px solid #a0b128;
|
|
649
660
|
}
|