design-comuni-plone-theme 8.4.6 → 8.5.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 (27) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/locales/de/LC_MESSAGES/volto.po +10 -0
  3. package/locales/en/LC_MESSAGES/volto.po +10 -0
  4. package/locales/es/LC_MESSAGES/volto.po +10 -0
  5. package/locales/fr/LC_MESSAGES/volto.po +10 -0
  6. package/locales/it/LC_MESSAGES/volto.po +10 -0
  7. package/locales/volto.pot +11 -1
  8. package/package.json +1 -1
  9. package/publiccode.yml +3 -2
  10. package/src/components/ItaliaTheme/Blocks/Listing/PhotogalleryTemplate.jsx +3 -1
  11. package/src/components/ItaliaTheme/Blocks/VideoGallery/Body.jsx +49 -3
  12. package/src/components/ItaliaTheme/Blocks/VideoGallery/Edit.jsx +7 -5
  13. package/src/components/ItaliaTheme/LoginAgid/LoginAgid.jsx +9 -2
  14. package/src/components/ItaliaTheme/Search/Search.jsx +76 -67
  15. package/src/components/ItaliaTheme/Unauthorized/Unauthorized.jsx +9 -6
  16. package/src/components/ItaliaTheme/View/Commons/OfficeCard.jsx +4 -2
  17. package/src/components/ItaliaTheme/View/PersonaView/PersonaRuolo.jsx +44 -13
  18. package/src/components/ItaliaTheme/View/__tests__/PersonaView.test.jsx +938 -928
  19. package/src/customizations/volto/components/manage/Blocks/Listing/withQuerystringResults.jsx +8 -3
  20. package/src/theme/ItaliaTheme/Blocks/_calendar.scss +14 -26
  21. package/src/theme/ItaliaTheme/Blocks/_photogallerytemplate.scss +0 -1
  22. package/src/theme/ItaliaTheme/Blocks/_sliderTemplate.scss +4 -52
  23. package/src/theme/ItaliaTheme/Blocks/_videoGallery.scss +26 -3
  24. package/src/theme/ItaliaTheme/Views/_slider.scss +58 -6
  25. package/src/theme/extras/_search.scss +6 -0
  26. /package/src/customizations/volto/components/theme/View/{View.jsx → disabled_View.jsx} +0 -0
  27. /package/src/customizations/volto/helpers/Api/{Api.jsx → disabled_Api.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
 
2
2
 
3
+ ## [8.5.0](https://github.com/RedTurtle/design-comuni-plone-theme/compare/v8.4.6...v8.5.0) (2023-09-05)
4
+
5
+
6
+ ### Features
7
+
8
+ * added pec to office card info ([#312](https://github.com/RedTurtle/design-comuni-plone-theme/issues/312)) ([a555954](https://github.com/RedTurtle/design-comuni-plone-theme/commit/a555954bbd482f27c711ac314aeda45e01537b06))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * fixed videogallery template block and standardized slider styles ([#301](https://github.com/RedTurtle/design-comuni-plone-theme/issues/301)) ([9abe515](https://github.com/RedTurtle/design-comuni-plone-theme/commit/9abe51584c631a75c6145944f8a14a0c187dd625))
14
+ * incorrect logic for determining if search is ongoing, less layout shifts ([#313](https://github.com/RedTurtle/design-comuni-plone-theme/issues/313)) ([69bc749](https://github.com/RedTurtle/design-comuni-plone-theme/commit/69bc74963760caf6465bdf7cc6e64c0413d8d655))
15
+ * mantiene la querystring nel came_from della login ([#315](https://github.com/RedTurtle/design-comuni-plone-theme/issues/315)) ([5313e8b](https://github.com/RedTurtle/design-comuni-plone-theme/commit/5313e8b4bbcc54b492e07876abf5dc607d5b118b))
16
+ * mostra tutti i campi incarico della persona ([#311](https://github.com/RedTurtle/design-comuni-plone-theme/issues/311)) ([bd9afa2](https://github.com/RedTurtle/design-comuni-plone-theme/commit/bd9afa284f84202fece2f95c6664406bb605d66e))
17
+ * querystring results with additional filters in listing blocks ([#317](https://github.com/RedTurtle/design-comuni-plone-theme/issues/317)) ([ba52c7f](https://github.com/RedTurtle/design-comuni-plone-theme/commit/ba52c7f22b98baf4373ac580cd0a0441dc60ad01))
18
+ * revert SSR redirect backport https://github.com/plone/volto/pull/4854 ([#306](https://github.com/RedTurtle/design-comuni-plone-theme/issues/306)) ([ce80334](https://github.com/RedTurtle/design-comuni-plone-theme/commit/ce803342595693b819e9185990ea4e45777fa055))
19
+
20
+
21
+ ### Documentation
22
+
23
+ * updated publiccode ([973363a](https://github.com/RedTurtle/design-comuni-plone-theme/commit/973363a7ca46654cf79a1cfd7e9151cb97c77221))
24
+
3
25
  ## [8.4.6](https://github.com/redturtle/design-comuni-plone-theme/compare/v8.4.5...v8.4.6) (2023-08-31)
4
26
 
5
27
 
@@ -3897,6 +3897,16 @@ msgstr ""
3897
3897
  msgid "venues"
3898
3898
  msgstr ""
3899
3899
 
3900
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3901
+ # defaultMessage: Prossimo video
3902
+ msgid "videogallery_next_arrow"
3903
+ msgstr ""
3904
+
3905
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3906
+ # defaultMessage: Video precedente
3907
+ msgid "videogallery_prev_arrow"
3908
+ msgstr ""
3909
+
3900
3910
  #: components/ItaliaTheme/Blocks/Listing/SliderTemplate
3901
3911
  # defaultMessage: Sei attualmente in un carosello, per navigare usa le frecce sinistra e destra
3902
3912
  msgid "viewImage"
@@ -3882,6 +3882,16 @@ msgstr "Change in balance sheet"
3882
3882
  msgid "venues"
3883
3883
  msgstr "Venues"
3884
3884
 
3885
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3886
+ # defaultMessage: Prossimo video
3887
+ msgid "videogallery_next_arrow"
3888
+ msgstr "Next video"
3889
+
3890
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3891
+ # defaultMessage: Video precedente
3892
+ msgid "videogallery_prev_arrow"
3893
+ msgstr "Previous video"
3894
+
3885
3895
  #: components/ItaliaTheme/Blocks/Listing/SliderTemplate
3886
3896
  # defaultMessage: Sei attualmente in un carosello, per navigare usa le frecce sinistra e destra
3887
3897
  msgid "viewImage"
@@ -3891,6 +3891,16 @@ msgstr "Cambio en el balance"
3891
3891
  msgid "venues"
3892
3892
  msgstr "Lugares"
3893
3893
 
3894
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3895
+ # defaultMessage: Prossimo video
3896
+ msgid "videogallery_next_arrow"
3897
+ msgstr ""
3898
+
3899
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3900
+ # defaultMessage: Video precedente
3901
+ msgid "videogallery_prev_arrow"
3902
+ msgstr ""
3903
+
3894
3904
  #: components/ItaliaTheme/Blocks/Listing/SliderTemplate
3895
3905
  # defaultMessage: Sei attualmente in un carosello, per navigare usa le frecce sinistra e destra
3896
3906
  msgid "viewImage"
@@ -3899,6 +3899,16 @@ msgstr "Changement de bilan"
3899
3899
  msgid "venues"
3900
3900
  msgstr "Lieux"
3901
3901
 
3902
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3903
+ # defaultMessage: Prossimo video
3904
+ msgid "videogallery_next_arrow"
3905
+ msgstr "Prochaine vidéo"
3906
+
3907
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3908
+ # defaultMessage: Video precedente
3909
+ msgid "videogallery_prev_arrow"
3910
+ msgstr "Vidéo précédente"
3911
+
3902
3912
  #: components/ItaliaTheme/Blocks/Listing/SliderTemplate
3903
3913
  # defaultMessage: Sei attualmente in un carosello, per navigare usa le frecce sinistra e destra
3904
3914
  msgid "viewImage"
@@ -3882,6 +3882,16 @@ msgstr "Variazione situazione patrimoniale"
3882
3882
  msgid "venues"
3883
3883
  msgstr "Luoghi"
3884
3884
 
3885
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3886
+ # defaultMessage: Prossimo video
3887
+ msgid "videogallery_next_arrow"
3888
+ msgstr "Prossimo video"
3889
+
3890
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3891
+ # defaultMessage: Video precedente
3892
+ msgid "videogallery_prev_arrow"
3893
+ msgstr "Video precedente"
3894
+
3885
3895
  #: components/ItaliaTheme/Blocks/Listing/SliderTemplate
3886
3896
  # defaultMessage: Sei attualmente in un carosello, per navigare usa le frecce sinistra e destra
3887
3897
  msgid "viewImage"
package/locales/volto.pot CHANGED
@@ -1,7 +1,7 @@
1
1
  msgid ""
2
2
  msgstr ""
3
3
  "Project-Id-Version: Plone\n"
4
- "POT-Creation-Date: 2023-08-24T08:14:25.576Z\n"
4
+ "POT-Creation-Date: 2023-08-28T07:32:02.134Z\n"
5
5
  "Last-Translator: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
6
6
  "Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
7
7
  "MIME-Version: 1.0\n"
@@ -3884,6 +3884,16 @@ msgstr ""
3884
3884
  msgid "venues"
3885
3885
  msgstr ""
3886
3886
 
3887
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3888
+ # defaultMessage: Prossimo video
3889
+ msgid "videogallery_next_arrow"
3890
+ msgstr ""
3891
+
3892
+ #: components/ItaliaTheme/Blocks/VideoGallery/Body
3893
+ # defaultMessage: Video precedente
3894
+ msgid "videogallery_prev_arrow"
3895
+ msgstr ""
3896
+
3887
3897
  #: components/ItaliaTheme/Blocks/Listing/SliderTemplate
3888
3898
  # defaultMessage: Sei attualmente in un carosello, per navigare usa le frecce sinistra e destra
3889
3899
  msgid "viewImage"
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "design-comuni-plone-theme",
3
3
  "description": "Volto Theme for Italia design guidelines",
4
4
  "license": "GPL-v3",
5
- "version": "8.4.6",
5
+ "version": "8.5.0",
6
6
  "main": "src/index.js",
7
7
  "keywords": [
8
8
  "volto-addon",
package/publiccode.yml CHANGED
@@ -227,9 +227,9 @@ maintenance:
227
227
  name: io-Comune - Il sito AgID per Comuni ed Enti Pubblici
228
228
  platforms:
229
229
  - web
230
- releaseDate: '2023-08-25'
230
+ releaseDate: '2023-09-05'
231
231
  softwareType: standalone/web
232
- softwareVersion: 8.4.3
232
+ softwareVersion: 8.5.0
233
233
  url: 'https://github.com/italia/design-comuni-plone-theme'
234
234
  usedBy:
235
235
  - ASP Comuni Modenesi Area Nord
@@ -253,6 +253,7 @@ usedBy:
253
253
  - Comune di Mirandola
254
254
  - Comune di Modena
255
255
  - Comune di Montecchio Emilia
256
+ - Comune di Novellara
256
257
  - Comune di Parma
257
258
  - Comune di Piacenza
258
259
  - Comune di Reggio Emilia
@@ -130,7 +130,9 @@ const PhotogalleryTemplate = ({
130
130
  />
131
131
  </button>
132
132
  </div>
133
- <ul style={{ margin: '0px' }}> {dots} </ul>
133
+ <ul className="slick-dots" style={{ margin: '0px' }}>
134
+ {dots}
135
+ </ul>
134
136
  </div>
135
137
  ),
136
138
  };
@@ -5,11 +5,12 @@
5
5
 
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container } from 'design-react-kit';
9
8
 
10
9
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
11
-
10
+ import { useIntl, defineMessages } from 'react-intl';
12
11
  import { Icon } from 'design-comuni-plone-theme/components/ItaliaTheme';
12
+ import { FontAwesomeIcon } from 'design-comuni-plone-theme/components/ItaliaTheme';
13
+ import { Button, Container } from 'design-react-kit';
13
14
  import { UniversalLink } from '@plone/volto/components';
14
15
 
15
16
  /**
@@ -17,11 +18,56 @@ import { UniversalLink } from '@plone/volto/components';
17
18
  * @class Body
18
19
  * @extends Component
19
20
  */
21
+
22
+ const messages = defineMessages({
23
+ videogallery_next_arrow: {
24
+ id: 'videogallery_next_arrow',
25
+ defaultMessage: 'Prossimo video',
26
+ },
27
+ videogallery_prev_arrow: {
28
+ id: 'videogallery_prev_arrow',
29
+ defaultMessage: 'Video precedente',
30
+ },
31
+ });
32
+
20
33
  const Body = ({ data, children, nItems = 0, reactSlick }) => {
34
+ const intl = useIntl();
35
+
36
+ const NextArrow = (props) => {
37
+ const { onClick, className } = props;
38
+ return (
39
+ <Button
40
+ outline
41
+ color={'unset'}
42
+ className={className}
43
+ onClick={onClick}
44
+ aria-label={intl.formatMessage(messages.videogallery_next_arrow)}
45
+ >
46
+ <FontAwesomeIcon icon={['fas', 'chevron-right']} />
47
+ </Button>
48
+ );
49
+ };
50
+ const PrevArrow = (props) => {
51
+ const { onClick, className } = props;
52
+ return (
53
+ <Button
54
+ outline
55
+ color={'unset'}
56
+ className={className}
57
+ onClick={onClick}
58
+ aria-label={intl.formatMessage(messages.videogallery_prev_arrow)}
59
+ >
60
+ <FontAwesomeIcon icon={['fas', 'chevron-left']} />
61
+ </Button>
62
+ );
63
+ };
64
+
21
65
  const Slider = reactSlick.default;
22
66
 
23
67
  const settings = {
24
68
  dots: true,
69
+ nextArrow: <NextArrow />,
70
+ prevArrow: <PrevArrow />,
25
71
  infinite: true,
26
72
  speed: 500,
27
73
  slidesToShow: nItems < 3 ? nItems : 3,
@@ -55,7 +101,7 @@ const Body = ({ data, children, nItems = 0, reactSlick }) => {
55
101
  };
56
102
 
57
103
  return (
58
- <div className="full-width py-5">
104
+ <div className="full-width">
59
105
  <Container className="px-md-4">
60
106
  {data?.title && <h2>{data.title}</h2>}
61
107
  {(data?.channel_link || data?.channel_link_title) && (
@@ -6,22 +6,24 @@
6
6
  import React from 'react';
7
7
  import { defineMessages } from 'react-intl';
8
8
  import { SidebarPortal } from '@plone/volto/components';
9
-
10
9
  import {
11
10
  withDNDContext,
12
11
  SubblocksEdit,
13
12
  SubblocksWrapper,
14
13
  } from 'volto-subblocks';
15
- import Sidebar from './Sidebar.jsx';
16
- import EditBlock from './Block/EditBlock';
17
- import Body from './Body';
14
+ import Sidebar from 'design-comuni-plone-theme/components/ItaliaTheme/Blocks/VideoGallery/Sidebar';
15
+ import Body from 'design-comuni-plone-theme/components/ItaliaTheme/Blocks/VideoGallery/Body';
16
+ import EditBlock from 'design-comuni-plone-theme/components/ItaliaTheme/Blocks/VideoGallery/Block/EditBlock';
18
17
 
19
18
  const messages = defineMessages({
20
19
  addItem: {
21
20
  id: 'Add accordion item',
22
21
  defaultMessage: 'Aggiungi elemento',
23
22
  },
24
- titlePlaceholder: { id: 'Title', defaultMessage: 'Titolo' },
23
+ titlePlaceholder: {
24
+ id: 'Title',
25
+ defaultMessage: 'Titolo',
26
+ },
25
27
  noVideos: {
26
28
  id: 'noVideos',
27
29
  defaultMessage:
@@ -58,7 +58,11 @@ const LoginAgid = (props) => {
58
58
  : process.env.RAZZLE_SPID_LOGIN_URL;
59
59
  const showFormLogin = !spidLoginUrl || query.get('login_operatore');
60
60
  const location = useLocation();
61
- const came_from = query.get('came_from') || props.origin || getBaseUrl(location.pathname);
61
+ const came_from =
62
+ query.get('came_from') ||
63
+ props.origin ||
64
+ `${getBaseUrl(location.pathname)}${location.search}` ||
65
+ '/';
62
66
 
63
67
  return (
64
68
  <>
@@ -91,7 +95,10 @@ const LoginAgid = (props) => {
91
95
  <Button
92
96
  color="primary"
93
97
  outline
94
- href={`${came_from}/login?login_operatore=1`}
98
+ href={`/login?${new URLSearchParams({
99
+ login_operatore: 1,
100
+ return_url: came_from,
101
+ }).toString()}`}
95
102
  tag="button"
96
103
  >
97
104
  <span>{intl.formatMessage(messages.loginPloneUser)}</span>
@@ -6,7 +6,7 @@
6
6
  import React, { useState, useEffect } from 'react';
7
7
  import { useDispatch, useSelector } from 'react-redux';
8
8
  import { useIntl, defineMessages } from 'react-intl';
9
- import { values } from 'lodash';
9
+ import { values, isEmpty } from 'lodash';
10
10
  import cx from 'classnames';
11
11
  import qs from 'query-string';
12
12
  import moment from 'moment';
@@ -324,7 +324,7 @@ const Search = () => {
324
324
  true,
325
325
  );
326
326
 
327
- searchResults.result &&
327
+ !isEmpty(searchResults.result) &&
328
328
  history.push(
329
329
  getSearchParamsURL(
330
330
  searchableText,
@@ -349,7 +349,6 @@ const Search = () => {
349
349
  }, 0);
350
350
  let activeTopics = values(topics).filter((t) => t.value).length;
351
351
  let activePortalTypes = values(portalTypes).filter((ct) => ct.value).length;
352
-
353
352
  return (
354
353
  <>
355
354
  <Helmet title={intl.formatMessage(messages.searchResults)} />
@@ -612,72 +611,82 @@ const Search = () => {
612
611
  </aside>
613
612
 
614
613
  <Col lg={9} tag="section" className="py-lg-5">
615
- {searchResults.loadingResults ? (
616
- <Spinner active />
617
- ) : searchResults?.result?.items_total > 0 ? (
618
- <div
619
- className="search-results-wrapper"
620
- role="region"
621
- id="search-results-region"
622
- aria-live="polite"
623
- >
624
- <div className="d-block ordering-widget">
625
- <Row className="pb-3 border-bottom">
626
- <Col xs={6} className="align-self-center">
627
- <p className="d-none d-lg-block" aria-live="polite">
628
- {intl.formatMessage(messages.foundNResults, {
629
- total: searchResults.result.items_total,
630
- })}
631
- </p>
632
- <p className="d-block d-lg-none mb-0 text-end">
633
- {intl.formatMessage(messages.orderBy)}
634
- </p>
635
- </Col>
636
- <Col xs={6}>
637
- <SelectInput
638
- id="search-sort-on"
639
- value={
640
- sortOnOptions.filter((o) => o.value === sortOn)[0]
641
- }
642
- label={intl.formatMessage(messages.orderBy)}
643
- placeholder={intl.formatMessage(messages.orderBy)}
644
- onChange={(opt) => setSortOn(opt.value)}
645
- options={sortOnOptions}
646
- />
647
- </Col>
648
- </Row>
649
- </div>
650
- <Row>
651
- {searchResults?.result?.items?.map((item, index) => (
652
- <Col md={12} key={item['@id']} className="p-0">
653
- <SearchResultItem
654
- item={item}
655
- index={index}
656
- searchableText={searchableText}
657
- section={getSectionFromId(item['@id'])}
658
- />
659
- </Col>
660
- ))}
614
+ <div
615
+ className="search-results-wrapper"
616
+ role="region"
617
+ id="search-results-region"
618
+ aria-live="polite"
619
+ >
620
+ <div className="d-block ordering-widget">
621
+ <Row className="pb-3 border-bottom">
622
+ <Col xs={6} className="align-self-center">
623
+ <p className="d-none d-lg-block" aria-live="polite">
624
+ {intl.formatMessage(messages.foundNResults, {
625
+ total: searchResults?.result?.items_total || 0,
626
+ })}
627
+ </p>
628
+ <p className="d-block d-lg-none mb-0 text-end">
629
+ {intl.formatMessage(messages.orderBy)}
630
+ </p>
631
+ </Col>
632
+ <Col xs={6}>
633
+ <SelectInput
634
+ id="search-sort-on"
635
+ value={
636
+ sortOnOptions.filter((o) => o.value === sortOn)[0]
637
+ }
638
+ label={intl.formatMessage(messages.orderBy)}
639
+ placeholder={intl.formatMessage(messages.orderBy)}
640
+ onChange={(opt) => setSortOn(opt.value)}
641
+ options={sortOnOptions}
642
+ />
643
+ </Col>
661
644
  </Row>
662
- {searchResults?.result?.batching && (
663
- <Pagination
664
- activePage={currentPage}
665
- totalPages={Math.ceil(
666
- (searchResults?.result?.items_total ?? 0) /
667
- config.settings.defaultPageSize,
668
- )}
669
- onPageChange={handleQueryPaginationChange}
670
- />
671
- )}
672
645
  </div>
673
- ) : searchResults.error ? (
674
- <Alert color="danger">
675
- <strong>{intl.formatMessage(messages.attenzione)}</strong>{' '}
676
- {intl.formatMessage(messages.errors_occured)}
677
- </Alert>
678
- ) : (
679
- <p>{intl.formatMessage(messages.no_results)}</p>
680
- )}
646
+
647
+ {searchResults.loadingResults ||
648
+ (!searchResults.hasError && isEmpty(searchResults.result)) ? (
649
+ <div className="searchSpinnerWrapper">
650
+ <Spinner active />
651
+ </div>
652
+ ) : searchResults?.result?.items_total > 0 ? (
653
+ <>
654
+ <Row>
655
+ {searchResults?.result?.items?.map((item, index) => (
656
+ <Col md={12} key={item['@id']} className="p-0">
657
+ <SearchResultItem
658
+ item={item}
659
+ index={index}
660
+ searchableText={searchableText}
661
+ section={getSectionFromId(item['@id'])}
662
+ />
663
+ </Col>
664
+ ))}
665
+ </Row>
666
+ {searchResults?.result?.batching && (
667
+ <Pagination
668
+ activePage={currentPage}
669
+ totalPages={Math.ceil(
670
+ (searchResults?.result?.items_total ?? 0) /
671
+ config.settings.defaultPageSize,
672
+ )}
673
+ onPageChange={handleQueryPaginationChange}
674
+ />
675
+ )}
676
+ </>
677
+ ) : searchResults.error ? (
678
+ <Alert color="danger">
679
+ <strong>{intl.formatMessage(messages.attenzione)}</strong>{' '}
680
+ {intl.formatMessage(messages.errors_occured)}
681
+ </Alert>
682
+ ) : (
683
+ !searchResults?.hasError &&
684
+ !isEmpty(searchResults?.result) &&
685
+ searchResults.result?.items.length === 0 && (
686
+ <p>{intl.formatMessage(messages.no_results)}</p>
687
+ )
688
+ )}
689
+ </div>
681
690
  </Col>
682
691
  </Row>
683
692
  </Container>
@@ -53,6 +53,7 @@ const Unauthorized = (props) => {
53
53
  : process.env.RAZZLE_SPID_LOGIN_URL;
54
54
  // BBB: per retrocompatibilità con il vecchio config arLoginUrl
55
55
  const spidLogin = config.settings.siteProperties?.spidLogin;
56
+ const came_from = `${getBaseUrl(location.pathname)}${location.search}`;
56
57
 
57
58
  return (
58
59
  <div id="unauthorized-agid" className="view-wrapper">
@@ -88,9 +89,10 @@ const Unauthorized = (props) => {
88
89
  <Button
89
90
  color="primary"
90
91
  outline
91
- href={`${getBaseUrl(
92
- location.pathname,
93
- )}/login?login_operatore=1`}
92
+ href={`/login?${new URLSearchParams({
93
+ login_operatore: 1,
94
+ return_url: came_from,
95
+ })}`}
94
96
  tag="button"
95
97
  >
96
98
  <span>{intl.formatMessage(messages.loginPloneUser)}</span>
@@ -117,9 +119,10 @@ const Unauthorized = (props) => {
117
119
  values={{
118
120
  login: (
119
121
  <Link
120
- to={`${getBaseUrl(
121
- location.pathname,
122
- )}/login?login_operatore=1`}
122
+ to={`/login?${new URLSearchParams({
123
+ login_operatore: 1,
124
+ return_url: came_from,
125
+ })}`}
123
126
  >
124
127
  <FormattedMessage id="log in" defaultMessage="log in" />
125
128
  </Link>
@@ -42,7 +42,6 @@ const OfficeCard = ({
42
42
  }, [url]);
43
43
 
44
44
  let office_fo = load_data ? officeContent?.[key]?.data : office;
45
-
46
45
  return office_fo ? (
47
46
  <div
48
47
  className={cx(
@@ -86,7 +85,10 @@ const OfficeCard = ({
86
85
  <ContactLink tel={pdc.pdc_value} label={false} />
87
86
  </div>
88
87
  );
89
- } else if (pdc.pdc_type === 'email')
88
+ } else if (
89
+ pdc.pdc_type === 'email' ||
90
+ pdc.pdc_type === 'pec'
91
+ )
90
92
  return (
91
93
  <div key={i}>
92
94
  <ContactLink email={pdc.pdc_value} label={false} />
@@ -78,7 +78,6 @@ const messages = defineMessages({
78
78
 
79
79
  const PersonaRuolo = ({ content }) => {
80
80
  const intl = useIntl();
81
-
82
81
  return (
83
82
  <>
84
83
  {content?.incarichi_persona?.length > 0 && (
@@ -188,18 +187,50 @@ const PersonaRuolo = ({ content }) => {
188
187
  )}
189
188
  </RichTextSection>
190
189
  )}
191
- <RichTextSection
192
- tag_id="data_insediamento"
193
- title={intl.formatMessage(messages.data_insediamento)}
194
- >
195
- <div className="font-serif">
196
- {viewDate(
197
- intl.locale,
198
- content.incarichi_persona[0].data_inizio_incarico,
199
- 'DD MMMM Y',
200
- )}
201
- </div>
202
- </RichTextSection>
190
+ {content.incarichi_persona[0].data_insediamento && (
191
+ <RichTextSection
192
+ tag_id="data_insediamento"
193
+ title={intl.formatMessage(messages.data_insediamento)}
194
+ >
195
+ <div className="font-serif">
196
+ {viewDate(
197
+ intl.locale,
198
+ content.incarichi_persona[0].data_insediamento,
199
+ 'DD MMMM Y',
200
+ )}
201
+ </div>
202
+ </RichTextSection>
203
+ )}
204
+ {content.incarichi_persona[0].data_inizio_incarico && (
205
+ <RichTextSection
206
+ tag_id="data_inizio_incarico"
207
+ title={intl.formatMessage(messages.data_inizio_incarico)}
208
+ >
209
+ <div className="font-serif">
210
+ {viewDate(
211
+ intl.locale,
212
+ content.incarichi_persona[0].data_inizio_incarico,
213
+ 'DD MMMM Y',
214
+ )}
215
+ </div>
216
+ </RichTextSection>
217
+ )}
218
+ {content.incarichi_persona[0].data_conclusione_incarico && (
219
+ <RichTextSection
220
+ tag_id="data_conclusione_incarico"
221
+ title={intl.formatMessage(messages.data_conclusione_incarico, {
222
+ incarico: content.incarichi_persona[0].title,
223
+ })}
224
+ >
225
+ <div className="font-serif">
226
+ {viewDate(
227
+ intl.locale,
228
+ content.incarichi_persona[0].data_conclusione_incarico,
229
+ 'DD MMMM Y',
230
+ )}
231
+ </div>
232
+ </RichTextSection>
233
+ )}
203
234
  </>
204
235
  )}
205
236
  {content.assessore_di?.length > 0 && (