design-comuni-plone-theme 11.25.3 → 11.26.0

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.
Files changed (49) hide show
  1. package/.github/workflows/main.yml +1 -1
  2. package/.github/workflows/prs.yml +1 -1
  3. package/.github/workflows/release.yml +1 -1
  4. package/.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-8d306efaca.zip +0 -0
  5. package/.yarn/cache/nanoid-npm-3.3.8-d22226208b-dfe0adbc0c.zip +0 -0
  6. package/.yarn/cache/{volto-blocks-widget-npm-3.4.1-c4d451e2c2-4f5c183698.zip → volto-blocks-widget-npm-3.4.3-d7e305af36-68490569a4.zip} +0 -0
  7. package/.yarn/cache/{volto-feedback-npm-0.3.2-ff5b075c7c-bfc7951ca5.zip → volto-feedback-npm-0.5.2-c3471099a1-48c0763678.zip} +0 -0
  8. package/.yarn/cache/volto-gdpr-privacy-npm-2.2.12-fbc24c3b6f-ba1b9c0127.zip +0 -0
  9. package/.yarn/install-state.gz +0 -0
  10. package/CHANGELOG.md +56 -0
  11. package/Makefile +1 -1
  12. package/RELEASE.md +19 -0
  13. package/locales/de/LC_MESSAGES/volto.po +5 -0
  14. package/locales/en/LC_MESSAGES/volto.po +5 -0
  15. package/locales/es/LC_MESSAGES/volto.po +5 -0
  16. package/locales/fr/LC_MESSAGES/volto.po +5 -0
  17. package/locales/it/LC_MESSAGES/volto.po +5 -0
  18. package/locales/volto.pot +6 -1
  19. package/package.json +5 -5
  20. package/publiccode.yml +2 -2
  21. package/src/components/ImageWithErrors/ImageWithErrors.jsx +11 -11
  22. package/src/components/ItaliaTheme/Blocks/Calendar/Body.jsx +1 -0
  23. package/src/components/ItaliaTheme/Blocks/Common/SearchFilters/SelectFilter.jsx +9 -3
  24. package/src/components/ItaliaTheme/Blocks/EventSearch/DefaultFilters.js +1 -0
  25. package/src/components/ItaliaTheme/Cards/CardCategory.jsx +2 -3
  26. package/src/components/ItaliaTheme/View/Commons/Dates.jsx +16 -16
  27. package/src/components/ItaliaTheme/View/Commons/PageHeader/PageHeaderEventDates.jsx +30 -8
  28. package/src/customizations/volto/actions/vocabularies/vocabularies.js +6 -2
  29. package/src/customizations/volto/components/manage/Blocks/Search/SearchBlockView.jsx +9 -15
  30. package/src/customizations/volto/components/manage/Blocks/Search/schema.js +16 -0
  31. package/src/customizations/volto/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +4 -7
  32. package/src/customizations/volto-form-block/components/View.jsx +11 -10
  33. package/src/helpers/dates.js +21 -1
  34. package/src/helpers/index.js +1 -0
  35. package/src/theme/ItaliaTheme/Blocks/_contacts.scss +5 -12
  36. package/src/theme/ItaliaTheme/Print/_all_pages.scss +98 -15
  37. package/src/theme/ItaliaTheme/Print/_blocks.scss +903 -8
  38. package/src/theme/ItaliaTheme/Print/_page.scss +0 -6
  39. package/src/theme/ItaliaTheme/_main.scss +3 -0
  40. package/src/theme/_cms-ui.scss +58 -0
  41. package/src/theme/bootstrap-override/bootstrap/_print.scss +1 -0
  42. package/src/theme/bootstrap-override/bootstrap-italia/_card.scss +12 -2
  43. package/src/theme/extras/_tables.scss +12 -13
  44. package/src/theme/site.scss +0 -2
  45. package/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip +0 -0
  46. package/.yarn/cache/nanoid-npm-3.3.6-e6d6ae7e71-7d0eda6570.zip +0 -0
  47. package/.yarn/cache/volto-gdpr-privacy-npm-2.2.9-a1e4258e06-fe530fe8ee.zip +0 -0
  48. package/src/theme/ItaliaTheme/Print/_bandi.scss +0 -9
  49. package/src/theme/ItaliaTheme/Print/_news_items.scss +0 -19
@@ -4,7 +4,7 @@
4
4
  existing listing template styles
5
5
  - Inspired from
6
6
  https://github.com/plone/volto/commit/211d9bea13119cc430db9d53a4740a860781ca2e
7
- the way to handle search sort
7
+ the way to handle search sort. If searchableText is setted, discard default sorting and uses plone's ranking only if is configured from sidebar. (Changed applyDefaults fn passing usePloneRanking)
8
8
  */
9
9
 
10
10
  import React from 'react';
@@ -52,7 +52,7 @@ const blockPropsAreChanged = (prevProps, nextProps) => {
52
52
  return isEqual(prev, next);
53
53
  };
54
54
 
55
- const applyDefaults = (data, root) => {
55
+ const applyDefaults = (data, root, usePloneRanking) => {
56
56
  const defaultQuery = [
57
57
  {
58
58
  i: 'path',
@@ -65,19 +65,13 @@ const applyDefaults = (data, root) => {
65
65
  (item) => item['i'] === 'SearchableText',
66
66
  ).length;
67
67
 
68
- const sort_on =
69
- searchBySearchableText === 0
70
- ? data?.sort_on
71
- ? { sort_on: data.sort_on }
72
- : { sort_on: 'effective' }
73
- : undefined;
68
+ let sort_on = { sort_on: data?.sort_on ?? 'effective' };
69
+ let sort_order = { sort_order: data?.sort_order ?? 'descending' };
74
70
 
75
- const sort_order =
76
- searchBySearchableText === 0
77
- ? data?.sort_order
78
- ? { sort_order: data.sort_order }
79
- : { sort_order: 'descending' }
80
- : undefined;
71
+ if (usePloneRanking && searchBySearchableText > 0) {
72
+ sort_on = undefined;
73
+ sort_order = undefined;
74
+ }
81
75
 
82
76
  const result = {
83
77
  ...data,
@@ -115,7 +109,7 @@ const SearchBlockView = (props) => {
115
109
  }, [dataListingBodyVariation, mode]);
116
110
 
117
111
  const root = useSelector((state) => state.breadcrumbs.root);
118
- const listingBodyData = applyDefaults(searchData, root);
112
+ const listingBodyData = applyDefaults(searchData, root, data.usePloneRanking);
119
113
  const { variations } = config.blocks.blocksConfig.listing;
120
114
  const listingBodyVariation = variations.find(({ id }) => id === selectedView);
121
115
  if (!Layout) return null;
@@ -153,6 +153,15 @@ const messages = defineMessages({
153
153
  id: 'Link to',
154
154
  defaultMessage: 'Link to',
155
155
  },
156
+ usePloneRanking: {
157
+ id: "Usa l'ordinamento dei risultati di Plone",
158
+ defaultMessage: "Usa l'ordinamento dei risultati di Plone",
159
+ },
160
+ usePloneRankingDescription: {
161
+ id: "Usa l'ordinamento dei risultati di Plone - descrizione",
162
+ defaultMessage:
163
+ "Se impostato, nel momento in cui un utente effettua una ricerca testuale per parola chiave, non viene usato l'ordinamento di default impostato nella sezione 'Ricerca iniziale', ma l'ordinamento di Plone in base all'ordine di importanza dei risultati da esso stabilito.",
164
+ },
156
165
  });
157
166
 
158
167
  const enhanceSchema = (originalSchema, formData) => {
@@ -285,6 +294,7 @@ const SearchSchema = ({ data = {}, intl }) => {
285
294
  ...(data.showSearchInput ?? true ? ['showSearchButton'] : []),
286
295
  // ...(data.showSearchInput ? ['searchInputPrompt'] : []),
287
296
  // ...(data.showSearchButton ? ['searchButtonLabel'] : []),
297
+ 'usePloneRanking',
288
298
  'showTotalResults',
289
299
  ],
290
300
  },
@@ -316,6 +326,12 @@ const SearchSchema = ({ data = {}, intl }) => {
316
326
  title: intl.formatMessage(messages.showTotalResults),
317
327
  default: true,
318
328
  },
329
+ usePloneRanking: {
330
+ type: 'boolean',
331
+ title: intl.formatMessage(messages.usePloneRanking),
332
+ description: intl.formatMessage(messages.usePloneRankingDescription),
333
+ default: false,
334
+ },
319
335
  searchButtonLabel: {
320
336
  title: intl.formatMessage(messages.searchButtonLabel),
321
337
  placeholder: intl.formatMessage(messages.searchButtonPlaceholder),
@@ -409,8 +409,8 @@ class RecurrenceWidget extends Component {
409
409
  formValues['freq'] = FREQUENCES.MONDAYFRIDAY;
410
410
  } else
411
411
  formValues[option] = value.map((d) => {
412
- return this.getWeekday(d);
413
- });
412
+ return this.getWeekday(d);
413
+ });
414
414
  }
415
415
  break;
416
416
  case 'bymonthday':
@@ -538,7 +538,7 @@ class RecurrenceWidget extends Component {
538
538
  }
539
539
  let exdates = Object.assign([], rruleSet.exdates());
540
540
  let rdates = Object.assign([], rruleSet.rdates());
541
- if (field === 'dstart') dstart = value;
541
+ if (field === 'dtstart') dstart = value;
542
542
  else if (field === 'exdates') exdates = value;
543
543
  else if (field === 'rdates') rdates = value;
544
544
  else if (field === 'freq') {
@@ -990,6 +990,7 @@ class RecurrenceWidget extends Component {
990
990
  )}
991
991
  value={formValues.freq}
992
992
  onChange={this.onChangeRule}
993
+ noValueOption={false}
993
994
  />
994
995
  {OPTIONS.frequences[formValues.freq].interval && (
995
996
  <IntervalField
@@ -1004,7 +1005,6 @@ class RecurrenceWidget extends Component {
1004
1005
  onChange={this.onChangeRule}
1005
1006
  />
1006
1007
  )}
1007
-
1008
1008
  {/***** byday *****/}
1009
1009
  {OPTIONS.frequences[formValues.freq].byday && (
1010
1010
  <ByDayField
@@ -1013,7 +1013,6 @@ class RecurrenceWidget extends Component {
1013
1013
  onChange={this.onChangeRule}
1014
1014
  />
1015
1015
  )}
1016
-
1017
1016
  {/***** bymonth *****/}
1018
1017
  {OPTIONS.frequences[formValues.freq].bymonth && (
1019
1018
  <ByMonthField
@@ -1027,7 +1026,6 @@ class RecurrenceWidget extends Component {
1027
1026
  onChange={this.onChangeRule}
1028
1027
  />
1029
1028
  )}
1030
-
1031
1029
  {/***** byyear *****/}
1032
1030
  {OPTIONS.frequences[formValues.freq].byyear && (
1033
1031
  <ByYearField
@@ -1042,7 +1040,6 @@ class RecurrenceWidget extends Component {
1042
1040
  onChange={this.onChangeRule}
1043
1041
  />
1044
1042
  )}
1045
-
1046
1043
  {/*-- ends after N recurrence or date --*/}
1047
1044
  <EndField
1048
1045
  value={formValues.recurrenceEnds}
@@ -1,5 +1,6 @@
1
1
  // CUSTOMIZATION:
2
2
  // - added warning state to form
3
+ // - backport for https://github.com/collective/volto-form-block/pull/122
3
4
 
4
5
  import React, { useState, useEffect, useReducer, useRef } from 'react';
5
6
  import { useSelector, useDispatch } from 'react-redux';
@@ -8,7 +9,6 @@ import { useIntl, defineMessages } from 'react-intl';
8
9
  import { submitForm, resetOTP } from 'volto-form-block/actions';
9
10
  import { getFieldName } from 'volto-form-block/components/utils';
10
11
  import FormView from 'volto-form-block/components/FormView';
11
- import { formatDate } from '@plone/volto/helpers/Utils/Date';
12
12
  import config from '@plone/volto/registry';
13
13
  import { Captcha } from 'volto-form-block/components/Widget';
14
14
  import { isValidEmail } from 'volto-form-block/helpers/validators';
@@ -260,20 +260,21 @@ const View = ({ data, id, path }) => {
260
260
  config.blocks.blocksConfig.form.attachment_fields.includes(
261
261
  subblock.field_type,
262
262
  );
263
- const isDate = subblock.field_type === 'date';
263
+ // const isDate = subblock.field_type === 'date';
264
264
 
265
265
  if (isAttachment) {
266
266
  attachments[name] = formattedFormData[name].value;
267
267
  delete formattedFormData[name];
268
268
  }
269
269
 
270
- if (isDate) {
271
- formattedFormData[name].value = formatDate({
272
- date: formattedFormData[name].value,
273
- format: 'DD-MM-YYYY',
274
- locale: intl.locale,
275
- });
276
- }
270
+ // XXX: dates should be sent as ISO format, not DD-MM-YYYY !
271
+ // if (isDate) {
272
+ // formattedFormData[name].value = formatDate({
273
+ // date: formattedFormData[name].value,
274
+ // format: 'DD-MM-YYYY',
275
+ // locale: intl.locale,
276
+ // });
277
+ // }
277
278
  }
278
279
  });
279
280
  dispatch(
@@ -323,7 +324,7 @@ const View = ({ data, id, path }) => {
323
324
 
324
325
  useEffect(() => {
325
326
  if (submitResults?.loaded) {
326
- if (submitResults?.result?.data?.waiting_list) {
327
+ if (submitResults?.result?.waiting_list) {
327
328
  setFormState({
328
329
  type: FORM_STATES.warning,
329
330
  result: {
@@ -48,8 +48,28 @@ export const getRealStartAndEndWithRecurrence = (
48
48
 
49
49
  export const getRealEventEnd = (content, rruleSet) => {
50
50
  let actualEndDate = content.end;
51
- if (content.recurrence) {
51
+
52
+ if (content.recurrence && rruleSet.rrules()[0].options.until) {
52
53
  actualEndDate = rruleSet.rrules()[0].options.until;
53
54
  }
54
55
  return actualEndDate;
55
56
  };
57
+
58
+ export const getRecurrenceExceptionDates = (rruleSet) => {
59
+ const rdates = rruleSet?.rdates() ?? [];
60
+ const exdates = rruleSet?.exdates() ?? [];
61
+
62
+ const additionalDates = rdates.reduce((acc, curr) => {
63
+ const isExdate = exdates.some((b) => b.toString() === curr.toString());
64
+ if (!isExdate) {
65
+ return [...acc, curr];
66
+ } else return acc;
67
+ }, []);
68
+
69
+ const exceptionDates = {
70
+ additionalDates: additionalDates,
71
+ removedDates: exdates,
72
+ };
73
+
74
+ return exceptionDates;
75
+ };
@@ -22,6 +22,7 @@ export {
22
22
  viewDate,
23
23
  getRealStartAndEndWithRecurrence,
24
24
  getRealEventEnd,
25
+ getRecurrenceExceptionDates,
25
26
  } from 'design-comuni-plone-theme/helpers/dates';
26
27
  export { getSiteProperty } from 'design-comuni-plone-theme/helpers/config';
27
28
  export { useDebouncedEffect } from 'design-comuni-plone-theme/helpers/debounce';
@@ -112,6 +112,8 @@
112
112
  }
113
113
 
114
114
  .contact-title {
115
+
116
+ margin-bottom: 1rem;
115
117
  font-size: 1.35rem;
116
118
  font-weight: bold;
117
119
  line-height: 1.4em;
@@ -123,20 +125,11 @@
123
125
 
124
126
  .contact-info {
125
127
  display: flex;
126
-
127
- &:first-of-type {
128
- align-items: center;
129
-
130
- .icon-wrapper {
131
- margin-top: 0;
132
- }
133
- }
134
-
135
- &:not(:last-of-type) {
136
- margin-bottom: 1rem;
137
- }
128
+ align-items: center;
138
129
 
139
130
  .icon-wrapper {
131
+ display: flex;
132
+ align-items: center;
140
133
  margin-top: 0.2rem;
141
134
  margin-right: 1rem;
142
135
  }
@@ -1,13 +1,26 @@
1
1
  @media print {
2
+ @page {
3
+ margin: 0 !important;
4
+ }
5
+
2
6
  body {
3
7
  display: block !important;
4
8
  }
5
9
 
6
10
  .public-ui {
7
- // removed underlining from links
8
11
  a {
9
12
  font-weight: 600 !important;
10
- text-decoration: none !important;
13
+ // text-decoration: none !important;
14
+ /* i link che non devono essere sottolineati hanno già regole specifiche,
15
+ a video è necessario mostare che i tag a sono link */
16
+
17
+ &.read-more {
18
+ display: none !important; // omesso il read more nelle card
19
+ }
20
+ }
21
+
22
+ .text-secondary {
23
+ color: $body-color !important;
11
24
  }
12
25
 
13
26
  .content-area,
@@ -17,6 +30,24 @@
17
30
  page-break-inside: avoid;
18
31
  }
19
32
 
33
+ .container {
34
+ max-width: 98%;
35
+ }
36
+
37
+ // padding/margin
38
+ .py-5 {
39
+ padding-top: 20px !important;
40
+ padding-bottom: 20px !important;
41
+ }
42
+
43
+ .pb-5 {
44
+ padding-bottom: 20px !important;
45
+ }
46
+
47
+ .pt-5 {
48
+ padding-top: 20px !important;
49
+ }
50
+
20
51
  // removed part of header header
21
52
  .it-header-slim-wrapper {
22
53
  display: none;
@@ -41,10 +72,8 @@
41
72
  }
42
73
 
43
74
  .it-brand-text {
44
- .no_toc {
45
- color: $link-color;
46
- font-size: 2rem !important;
47
- }
75
+ color: $link-color;
76
+ font-size: 2rem !important;
48
77
  }
49
78
  }
50
79
  }
@@ -76,6 +105,10 @@
76
105
  }
77
106
  }
78
107
 
108
+ .section {
109
+ padding: 1.2rem;
110
+ }
111
+
79
112
  /* Removed shadow and card's padding. Add border*/
80
113
  .card {
81
114
  border: 1px solid $gray-border !important;
@@ -89,15 +122,34 @@
89
122
  border: none !important;
90
123
  border-left-width: 0 !important;
91
124
  }
125
+
126
+ &::after {
127
+ display: none;
128
+ }
129
+
130
+ &.card-bg {
131
+ background-color: white !important;
132
+ color: $body-color !important;
133
+ }
92
134
  }
93
135
 
94
- //card teaser 3
136
+ // Card teaser
95
137
  .card-wrapper.card-teaser-wrapper.card-teaser-block-3 {
96
138
  > .card-teaser {
97
- flex: 0 0 32%;
139
+ flex: 0 0 32.5%;
98
140
  }
99
141
  }
100
142
 
143
+ .card.card-teaser.simple-card-default-item .card-body .card-title a,
144
+ .card.card-teaser .card-body .card-title a,
145
+ .card .card-title a {
146
+ font-size: 1.1rem !important;
147
+ }
148
+
149
+ .card .card-body .category-top {
150
+ flex-wrap: wrap;
151
+ }
152
+
101
153
  #text-tempi_e_scadenze > div > p {
102
154
  padding: 1rem 0 0 0 !important;
103
155
  box-shadow: none !important;
@@ -155,7 +207,7 @@
155
207
  .it-page-sections-container {
156
208
  border-top: none;
157
209
 
158
- .it-carousel-wrapper {
210
+ .it-carousel-wrapper:not(#galleria) {
159
211
  display: none;
160
212
  }
161
213
 
@@ -223,18 +275,49 @@
223
275
  box-shadow: none;
224
276
  font-size: 1rem;
225
277
  }
278
+
279
+ .callout {
280
+ page-break-inside: avoid;
281
+
282
+ .callout-inner {
283
+ // padding-top: 0px;
284
+ p {
285
+ margin-top: -2rem;
286
+ }
287
+ }
288
+ }
289
+ // buttons
290
+ button.btn,
291
+ .btn.btn-primary,
292
+ .draftjs-buttons a {
293
+ padding: 0.5rem 1rem;
294
+ border: 1px solid $link-color;
295
+ background-color: white;
296
+ color: $link-color;
297
+
298
+ svg.icon {
299
+ color: $link-color;
300
+ fill: $link-color;
301
+ }
302
+ }
303
+
304
+ // blockquote text
305
+ blockquote.blockquote-card.dark,
306
+ .blockquote.blockquote-card.dark {
307
+ border: 1px solid $body-color;
308
+ background-color: white;
309
+ color: $body-color;
310
+
311
+ a:not(.btn) {
312
+ color: $body-color;
313
+ }
314
+ }
226
315
  }
227
316
 
228
317
  .draft-text-larger {
229
318
  font-size: 1.2rem;
230
319
  }
231
320
 
232
- .public-ui .draftjs-buttons a {
233
- padding: 0rem;
234
- background-color: white;
235
- color: $link-color;
236
- }
237
-
238
321
  //external link icon
239
322
  svg.external-link {
240
323
  display: none;