io-sanita-theme 2.3.1 → 2.3.2

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
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.2](https://github.com/RedTurtle/io-sanita-theme/compare/2.3.1...2.3.2) (2025-02-26)
4
+
5
+ ### Bug Fixes
6
+
7
+ * a11y search blocks ([439519f](https://github.com/RedTurtle/io-sanita-theme/commit/439519f0763c79771bd0e6638147e24c32997a23))
8
+ * mismatch ssr edit ([6a46afe](https://github.com/RedTurtle/io-sanita-theme/commit/6a46afee597cd372c28f6ec34edea544ce1a652c))
9
+
10
+ ### Maintenance
11
+
12
+ * locales ([e44fb3d](https://github.com/RedTurtle/io-sanita-theme/commit/e44fb3d3b04ac2e12b4c31c47e3ed36c0ae33ac3))
13
+
3
14
  ## [2.3.1](https://github.com/RedTurtle/io-sanita-theme/compare/2.3.0...2.3.1) (2025-02-25)
4
15
 
5
16
  ### Bug Fixes
@@ -2736,7 +2736,7 @@ msgid "search_farmacia_results"
2736
2736
  msgstr ""
2737
2737
 
2738
2738
  #. Default: "Risultati della ricerca farmacie"
2739
- #: components/Blocks/SearchFarmacia/Results
2739
+ #: components/Blocks/SearchFarmacia/Body
2740
2740
  msgid "search_farmacia_results_aria"
2741
2741
  msgstr ""
2742
2742
 
@@ -2755,6 +2755,11 @@ msgstr ""
2755
2755
  msgid "search_farmacia_searchable_text_description"
2756
2756
  msgstr ""
2757
2757
 
2758
+ #. Default: "Farmacia"
2759
+ #: components/Blocks/SearchFarmacia/SearchFilters
2760
+ msgid "search_farmacia_searchable_text_label"
2761
+ msgstr ""
2762
+
2758
2763
  #. Default: "Comune"
2759
2764
  #: components/Blocks/SearchFarmacia/Body
2760
2765
  msgid "search_farmacia_sort_comune"
@@ -2731,7 +2731,7 @@ msgid "search_farmacia_results"
2731
2731
  msgstr "Results"
2732
2732
 
2733
2733
  #. Default: "Risultati della ricerca farmacie"
2734
- #: components/Blocks/SearchFarmacia/Results
2734
+ #: components/Blocks/SearchFarmacia/Body
2735
2735
  msgid "search_farmacia_results_aria"
2736
2736
  msgstr "Search results"
2737
2737
 
@@ -2750,6 +2750,11 @@ msgstr "Search type"
2750
2750
  msgid "search_farmacia_searchable_text_description"
2751
2751
  msgstr "Enter the name of the pharmacy"
2752
2752
 
2753
+ #. Default: "Farmacia"
2754
+ #: components/Blocks/SearchFarmacia/SearchFilters
2755
+ msgid "search_farmacia_searchable_text_label"
2756
+ msgstr "Pharmacy"
2757
+
2753
2758
  #. Default: "Comune"
2754
2759
  #: components/Blocks/SearchFarmacia/Body
2755
2760
  msgid "search_farmacia_sort_comune"
@@ -2738,7 +2738,7 @@ msgid "search_farmacia_results"
2738
2738
  msgstr ""
2739
2739
 
2740
2740
  #. Default: "Risultati della ricerca farmacie"
2741
- #: components/Blocks/SearchFarmacia/Results
2741
+ #: components/Blocks/SearchFarmacia/Body
2742
2742
  msgid "search_farmacia_results_aria"
2743
2743
  msgstr ""
2744
2744
 
@@ -2757,6 +2757,11 @@ msgstr ""
2757
2757
  msgid "search_farmacia_searchable_text_description"
2758
2758
  msgstr ""
2759
2759
 
2760
+ #. Default: "Farmacia"
2761
+ #: components/Blocks/SearchFarmacia/SearchFilters
2762
+ msgid "search_farmacia_searchable_text_label"
2763
+ msgstr ""
2764
+
2760
2765
  #. Default: "Comune"
2761
2766
  #: components/Blocks/SearchFarmacia/Body
2762
2767
  msgid "search_farmacia_sort_comune"
@@ -2738,7 +2738,7 @@ msgid "search_farmacia_results"
2738
2738
  msgstr ""
2739
2739
 
2740
2740
  #. Default: "Risultati della ricerca farmacie"
2741
- #: components/Blocks/SearchFarmacia/Results
2741
+ #: components/Blocks/SearchFarmacia/Body
2742
2742
  msgid "search_farmacia_results_aria"
2743
2743
  msgstr ""
2744
2744
 
@@ -2757,6 +2757,11 @@ msgstr ""
2757
2757
  msgid "search_farmacia_searchable_text_description"
2758
2758
  msgstr ""
2759
2759
 
2760
+ #. Default: "Farmacia"
2761
+ #: components/Blocks/SearchFarmacia/SearchFilters
2762
+ msgid "search_farmacia_searchable_text_label"
2763
+ msgstr ""
2764
+
2760
2765
  #. Default: "Comune"
2761
2766
  #: components/Blocks/SearchFarmacia/Body
2762
2767
  msgid "search_farmacia_sort_comune"
@@ -2731,7 +2731,7 @@ msgid "search_farmacia_results"
2731
2731
  msgstr ""
2732
2732
 
2733
2733
  #. Default: "Risultati della ricerca farmacie"
2734
- #: components/Blocks/SearchFarmacia/Results
2734
+ #: components/Blocks/SearchFarmacia/Body
2735
2735
  msgid "search_farmacia_results_aria"
2736
2736
  msgstr ""
2737
2737
 
@@ -2750,6 +2750,11 @@ msgstr ""
2750
2750
  msgid "search_farmacia_searchable_text_description"
2751
2751
  msgstr ""
2752
2752
 
2753
+ #. Default: "Farmacia"
2754
+ #: components/Blocks/SearchFarmacia/SearchFilters
2755
+ msgid "search_farmacia_searchable_text_label"
2756
+ msgstr ""
2757
+
2753
2758
  #. Default: "Comune"
2754
2759
  #: components/Blocks/SearchFarmacia/Body
2755
2760
  msgid "search_farmacia_sort_comune"
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: 2025-02-25T11:31:39.047Z\n"
4
+ "POT-Creation-Date: 2025-02-26T10:39:52.643Z\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
  "Content-Type: text/plain; charset=utf-8\n"
@@ -2733,7 +2733,7 @@ msgid "search_farmacia_results"
2733
2733
  msgstr ""
2734
2734
 
2735
2735
  #. Default: "Risultati della ricerca farmacie"
2736
- #: components/Blocks/SearchFarmacia/Results
2736
+ #: components/Blocks/SearchFarmacia/Body
2737
2737
  msgid "search_farmacia_results_aria"
2738
2738
  msgstr ""
2739
2739
 
@@ -2752,6 +2752,11 @@ msgstr ""
2752
2752
  msgid "search_farmacia_searchable_text_description"
2753
2753
  msgstr ""
2754
2754
 
2755
+ #. Default: "Farmacia"
2756
+ #: components/Blocks/SearchFarmacia/SearchFilters
2757
+ msgid "search_farmacia_searchable_text_label"
2758
+ msgstr ""
2759
+
2755
2760
  #. Default: "Comune"
2756
2761
  #: components/Blocks/SearchFarmacia/Body
2757
2762
  msgid "search_farmacia_sort_comune"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "io-sanita-theme",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "description": "io-sanita-theme: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "license": "MIT",
@@ -153,6 +153,8 @@ const Body = ({ data, id, inEditMode, path, onChangeBlock, blocksConfig }) => {
153
153
  }
154
154
 
155
155
  const has_results = !loading && items?.length > 0;
156
+
157
+ const resultsWrapperId = `bandi-search-results-${id}`;
156
158
  return filterOne || filterTwo || filterThree ? (
157
159
  <div
158
160
  className={cx('full-width py-4', {
@@ -204,7 +206,12 @@ const Body = ({ data, id, inEditMode, path, onChangeBlock, blocksConfig }) => {
204
206
  }),
205
207
  })}
206
208
 
207
- <Button color="accent" icon={false} className="my-0 my-lg-1">
209
+ <Button
210
+ color="accent"
211
+ icon={false}
212
+ className="my-0 my-lg-1"
213
+ aria-controls={resultsWrapperId}
214
+ >
208
215
  {intl.formatMessage(messages.find)}
209
216
  </Button>
210
217
  </div>
@@ -212,40 +219,42 @@ const Body = ({ data, id, inEditMode, path, onChangeBlock, blocksConfig }) => {
212
219
  </form>
213
220
  </div>
214
221
 
215
- {!loading ? (
216
- items?.length > 0 ? (
217
- <div
218
- className="mt-4"
219
- ref={resultsRef}
220
- aria-live="polite"
221
- aria-label={intl.formatMessage(messages.search_bandi_results)}
222
- role="region"
223
- >
224
- <div className="block listing">
225
- <BandiTemplate items={items} full_width={false} />
226
- </div>
227
- {querystringResults.total > b_size && (
228
- <Pagination
229
- activePage={currentPage}
230
- totalPages={Math.ceil(querystringResults.total / b_size)}
231
- onPageChange={handleQueryPaginationChange}
232
- />
233
- )}
222
+ <div
223
+ className="mt-4"
224
+ ref={resultsRef}
225
+ aria-live="polite"
226
+ aria-label={intl.formatMessage(messages.search_bandi_results)}
227
+ role="region"
228
+ id={resultsWrapperId}
229
+ >
230
+ {!loading ? (
231
+ items?.length > 0 ? (
232
+ <>
233
+ <div className="block listing">
234
+ <BandiTemplate items={items} full_width={false} />
235
+ </div>
236
+ {querystringResults.total > b_size && (
237
+ <Pagination
238
+ activePage={currentPage}
239
+ totalPages={Math.ceil(querystringResults.total / b_size)}
240
+ onPageChange={handleQueryPaginationChange}
241
+ ariaControls={resultsWrapperId}
242
+ />
243
+ )}
244
+ </>
245
+ ) : querystringResults ? (
246
+ <p className="text-center">
247
+ {intl.formatMessage(messages.noResult)}
248
+ </p>
249
+ ) : (
250
+ <></>
251
+ )
252
+ ) : (
253
+ <div className="d-flex justify-content-center">
254
+ <Spinner active />
234
255
  </div>
235
- ) : querystringResults ? (
236
- <>
237
- <div className="mt-4" aria-live="polite">
238
- <p className="text-center">
239
- {intl.formatMessage(messages.noResult)}
240
- </p>
241
- </div>
242
- </>
243
- ) : null
244
- ) : (
245
- <div className="d-flex justify-content-center mt-3">
246
- <Spinner active />
247
- </div>
248
- )}
256
+ )}
257
+ </div>
249
258
  </Container>
250
259
  </div>
251
260
  ) : null;
@@ -36,6 +36,10 @@ const messages = defineMessages({
36
36
  id: 'search_farmacia_sort_localita',
37
37
  defaultMessage: 'Località',
38
38
  },
39
+ farmacie_results_aria: {
40
+ id: 'search_farmacia_results_aria',
41
+ defaultMessage: 'Risultati della ricerca farmacie',
42
+ },
39
43
  });
40
44
 
41
45
  const Body = ({ isEditMode, data, id }) => {
@@ -219,6 +223,7 @@ const Body = ({ isEditMode, data, id }) => {
219
223
  }
220
224
  }, [currentPage, results]);
221
225
 
226
+ const resultsWrapperId = 'search-farmacie-results_' + id;
222
227
  return (
223
228
  <div className="block iosanita-block-search farmacia">
224
229
  <div className="full-width bg-primary-lightest">
@@ -247,6 +252,7 @@ const Body = ({ isEditMode, data, id }) => {
247
252
  searchType={searchType}
248
253
  filters={filters}
249
254
  options={filtersOptions}
255
+ ariaControls={resultsWrapperId}
250
256
  // isEditMode={isEditMode}
251
257
  // doSearch={doSearch}
252
258
  // checkClearComune={checkClearComune}
@@ -287,24 +293,34 @@ const Body = ({ isEditMode, data, id }) => {
287
293
  title: intl.formatMessage(messages.localita),
288
294
  },
289
295
  ]}
296
+ ariaControls={resultsWrapperId}
290
297
  />
291
298
  </Col>
292
299
  </Row>
293
300
  </form>
294
301
 
295
- <Results
296
- items={resultsPage}
297
- isEditMode={isEditMode}
298
- searchType={searchType}
299
- resRef={resultsRef}
300
- />
301
- {results && results.length > b_size && (
302
- <Pagination
303
- activePage={currentPage}
304
- totalPages={Math.ceil(results.length / b_size)}
305
- onPageChange={handleQueryPaginationChange}
302
+ <div
303
+ className="farmacie-results shadow"
304
+ role="region"
305
+ aria-live="polite"
306
+ aria-label={intl.formatMessage(messages.farmacie_results_aria)}
307
+ ref={resultsRef}
308
+ id={resultsWrapperId}
309
+ >
310
+ <Results
311
+ items={resultsPage}
312
+ isEditMode={isEditMode}
313
+ searchType={searchType}
306
314
  />
307
- )}
315
+ {results && results.length > b_size && (
316
+ <Pagination
317
+ activePage={currentPage}
318
+ totalPages={Math.ceil(results.length / b_size)}
319
+ onPageChange={handleQueryPaginationChange}
320
+ ariaControls={resultsWrapperId}
321
+ />
322
+ )}
323
+ </div>
308
324
  </Container>
309
325
  ) : (
310
326
  <Container className="d-flex justify-content-center mt-3">
@@ -80,10 +80,6 @@ const messages = defineMessages({
80
80
  id: 'search_farmacia_no_results',
81
81
  defaultMessage: 'Nessun risultato trovato',
82
82
  },
83
- farmacie_results_aria: {
84
- id: 'search_farmacia_results_aria',
85
- defaultMessage: 'Risultati della ricerca farmacie',
86
- },
87
83
  });
88
84
 
89
85
  const ContactColumns = ({ isEditMode, item, searchType }) => {
@@ -183,112 +179,104 @@ const PeriodsStructure = ({ periods }) => {
183
179
  );
184
180
  };
185
181
 
186
- const Results = ({ items, isEditMode, resRef, searchType }) => {
182
+ const Results = ({ items, isEditMode, searchType }) => {
187
183
  const intl = useIntl();
188
184
 
189
185
  return (
190
186
  <>
191
187
  {items?.length > 0 ? (
192
- <div
193
- className="farmacie-results shadow"
194
- role="region"
195
- aria-live="polite"
196
- aria-label={intl.formatMessage(messages.farmacie_results_aria)}
197
- ref={resRef}
198
- >
199
- <Table>
200
- <Table.Header>
201
- <Table.Row>
202
- <Table.HeaderCell>
203
- {intl.formatMessage(messages.nome)} <br />
204
- {intl.formatMessage(messages.nome_en)}
205
- </Table.HeaderCell>
206
- <Table.HeaderCell>
207
- {intl.formatMessage(messages.comune)} <br />
208
- {intl.formatMessage(messages.comune_en)}
209
- </Table.HeaderCell>
210
- <Table.HeaderCell>
211
- {intl.formatMessage(messages.localita)}
212
- <br />
213
- {intl.formatMessage(messages.localita_en)}
214
- </Table.HeaderCell>
215
- <Table.HeaderCell>
216
- {intl.formatMessage(messages.indirizzo)}
217
- <br />
218
- {intl.formatMessage(messages.indirizzo_en)}
219
- </Table.HeaderCell>
188
+ <Table>
189
+ <Table.Header>
190
+ <Table.Row>
191
+ <Table.HeaderCell>
192
+ {intl.formatMessage(messages.nome)} <br />
193
+ {intl.formatMessage(messages.nome_en)}
194
+ </Table.HeaderCell>
195
+ <Table.HeaderCell>
196
+ {intl.formatMessage(messages.comune)} <br />
197
+ {intl.formatMessage(messages.comune_en)}
198
+ </Table.HeaderCell>
199
+ <Table.HeaderCell>
200
+ {intl.formatMessage(messages.localita)}
201
+ <br />
202
+ {intl.formatMessage(messages.localita_en)}
203
+ </Table.HeaderCell>
204
+ <Table.HeaderCell>
205
+ {intl.formatMessage(messages.indirizzo)}
206
+ <br />
207
+ {intl.formatMessage(messages.indirizzo_en)}
208
+ </Table.HeaderCell>
209
+ <Table.HeaderCell>
210
+ {intl.formatMessage(messages.recapiti)}
211
+ <br />
212
+ {intl.formatMessage(messages.recapiti_en)}
213
+ </Table.HeaderCell>
214
+
215
+ {searchType === 'vacations' ? (
216
+ <>
217
+ <Table.HeaderCell>
218
+ {intl.formatMessage(messages.ferie)}
219
+ <br />
220
+ {intl.formatMessage(messages.ferie_en)}
221
+ </Table.HeaderCell>
222
+ </>
223
+ ) : (
220
224
  <Table.HeaderCell>
221
- {intl.formatMessage(messages.recapiti)}
225
+ {intl.formatMessage(messages.turni)}
222
226
  <br />
223
- {intl.formatMessage(messages.recapiti_en)}
227
+ {intl.formatMessage(messages.turni_en)}
224
228
  </Table.HeaderCell>
229
+ )}
230
+ </Table.Row>
231
+ </Table.Header>
232
+ <tbody>
233
+ {items.map((item, i) => (
234
+ <tr key={i}>
235
+ <td className="nome">
236
+ {item['@id'] && (
237
+ <p>
238
+ <UniversalLink
239
+ item={!isEditMode ? item : null}
240
+ href={isEditMode ? '#' : null}
241
+ >
242
+ {item.title}
243
+ </UniversalLink>
244
+ </p>
245
+ )}
246
+ </td>
247
+ <ContactColumns
248
+ isEditMode={isEditMode}
249
+ item={item}
250
+ searchType={searchType}
251
+ />
252
+
253
+ {/* Periodi di turno */}
254
+ {searchType !== 'vacations' && (
255
+ <td className="turni">
256
+ <div className="th d-lg-none">
257
+ {intl.formatMessage(messages.turni)}
258
+ <br />
259
+ {intl.formatMessage(messages.turni_en)}
260
+ </div>
261
+ <PeriodsStructure periods={item.turni} />
262
+ </td>
263
+ )}
225
264
 
226
- {searchType === 'vacations' ? (
227
- <>
228
- <Table.HeaderCell>
265
+ {/* Periodi di ferie */}
266
+ {searchType === 'vacations' && (
267
+ <td className="ferie">
268
+ <div className="th d-lg-none">
229
269
  {intl.formatMessage(messages.ferie)}
230
270
  <br />
231
271
  {intl.formatMessage(messages.ferie_en)}
232
- </Table.HeaderCell>
233
- </>
234
- ) : (
235
- <Table.HeaderCell>
236
- {intl.formatMessage(messages.turni)}
237
- <br />
238
- {intl.formatMessage(messages.turni_en)}
239
- </Table.HeaderCell>
240
- )}
241
- </Table.Row>
242
- </Table.Header>
243
- <tbody>
244
- {items.map((item, i) => (
245
- <tr key={i}>
246
- <td className="nome">
247
- {item['@id'] && (
248
- <p>
249
- <UniversalLink
250
- item={!isEditMode ? item : null}
251
- href={isEditMode ? '#' : null}
252
- >
253
- {item.title}
254
- </UniversalLink>
255
- </p>
256
- )}
272
+ </div>
273
+ <PeriodsStructure periods={item.ferie} />
257
274
  </td>
258
- <ContactColumns
259
- isEditMode={isEditMode}
260
- item={item}
261
- searchType={searchType}
262
- />
263
-
264
- {/* Periodi di turno */}
265
- {searchType !== 'vacations' && (
266
- <td className="turni">
267
- <div className="th d-lg-none">
268
- {intl.formatMessage(messages.turni)}
269
- <br />
270
- {intl.formatMessage(messages.turni_en)}
271
- </div>
272
- <PeriodsStructure periods={item.turni} />
273
- </td>
274
- )}
275
-
276
- {/* Periodi di ferie */}
277
- {searchType === 'vacations' && (
278
- <td className="ferie">
279
- <div className="th d-lg-none">
280
- {intl.formatMessage(messages.ferie)}
281
- <br />
282
- {intl.formatMessage(messages.ferie_en)}
283
- </div>
284
- <PeriodsStructure periods={item.ferie} />
285
- </td>
286
- )}
287
- </tr>
288
- ))}
289
- </tbody>
290
- </Table>
291
- </div>
275
+ )}
276
+ </tr>
277
+ ))}
278
+ </tbody>
279
+ </Table>
292
280
  ) : (
293
281
  <div className="message px-4">
294
282
  {intl.formatMessage(messages.no_results)}
@@ -28,6 +28,10 @@ const messages = defineMessages({
28
28
  id: 'search_farmacia_searchable_text_description',
29
29
  defaultMessage: 'Inserisci il nome della farmacia',
30
30
  },
31
+ search_input_label: {
32
+ id: 'search_farmacia_searchable_text_label',
33
+ defaultMessage: 'Farmacia',
34
+ },
31
35
  });
32
36
 
33
37
  const SearchFilters = ({
@@ -54,6 +58,7 @@ const SearchFilters = ({
54
58
  onChange={(v) => {
55
59
  setFilters({ ...filters, searchableText: v });
56
60
  }}
61
+ ariaLabel={intl.formatMessage(messages.search_input_label)}
57
62
  />
58
63
  </Col>
59
64
 
@@ -71,6 +76,7 @@ const SearchFilters = ({
71
76
  date: new Date(value).toISOString(),
72
77
  });
73
78
  }}
79
+ title=""
74
80
  />
75
81
  <small className="ps-2">{intl.formatMessage(messages.date)}</small>{' '}
76
82
  </Col>
@@ -78,7 +84,7 @@ const SearchFilters = ({
78
84
  <Col lg="3">
79
85
  <SelectInput
80
86
  id="area_territoriale"
81
- value={filters.area_territoriale}
87
+ value={filters.area_territoriale ?? ''}
82
88
  placeholder={intl.formatMessage(messages.area_territoriale)}
83
89
  onChange={(opt) => {
84
90
  setFilters({ ...filters, area_territoriale: opt });
@@ -328,6 +328,11 @@ const SearchMapBody = ({ data, id, path, properties, block, inEditMode }) => {
328
328
  };
329
329
 
330
330
  const results_region_id = block_id + 'results-region';
331
+ const title =
332
+ data.title ??
333
+ (data.portal_type === 'Struttura'
334
+ ? intl.formatMessage(messages.searchable_text_default_label_strutture)
335
+ : intl.formatMessage(messages.searchable_text_default_label_medici));
331
336
  return (
332
337
  <div className="block iosanita-block-search map">
333
338
  <div className="strutture-search">
@@ -340,29 +345,21 @@ const SearchMapBody = ({ data, id, path, properties, block, inEditMode }) => {
340
345
  }}
341
346
  >
342
347
  <div className="search-top">
343
- {data.title && !data.show_search_bar && (
344
- <LinkedHeadline
345
- isEditMode={inEditMode}
346
- title={data.title}
347
- id={id}
348
- className="h5"
349
- />
350
- )}
348
+ <LinkedHeadline
349
+ isEditMode={inEditMode}
350
+ title={title}
351
+ id={id}
352
+ className={cx('h5', {
353
+ 'visually-hidden': data.show_search_bar, //to prevent a11y issue descendant headings
354
+ })}
355
+ />
356
+
351
357
  {data.show_search_bar && (
352
358
  <Row>
353
359
  <Col lg={8}>
354
360
  <SearchBar
355
361
  id={block_id}
356
- title={data.title}
357
- defaultTitle={
358
- data.portal_type === 'Struttura'
359
- ? intl.formatMessage(
360
- messages.searchable_text_default_label_strutture,
361
- )
362
- : intl.formatMessage(
363
- messages.searchable_text_default_label_medici,
364
- )
365
- }
362
+ title={title}
366
363
  textDescription={intl.formatMessage(
367
364
  messages.searchable_text_decription,
368
365
  )}
@@ -211,6 +211,7 @@ const Body = ({ data, id, path, properties, inEditMode }) => {
211
211
  filterKey="users"
212
212
  sectionTitle={intl.formatMessage(messages.label_utenti)}
213
213
  collapsable={true}
214
+ ariaControls={results_region_id}
214
215
  />
215
216
  </div>
216
217
  )}
@@ -224,24 +225,29 @@ const Body = ({ data, id, path, properties, inEditMode }) => {
224
225
  filters={filters}
225
226
  filterKey="topics"
226
227
  collapsable={true}
228
+ ariaControls={results_region_id}
227
229
  />
228
230
  </div>
229
231
  )}
230
232
  </Col>
231
233
  );
232
234
  };
233
-
235
+ const title =
236
+ data.title ??
237
+ (data.portal_type === 'Servizio'
238
+ ? intl.formatMessage(messages.searchable_text_default_label_servizi)
239
+ : intl.formatMessage(messages.searchable_text_default_label_procedura));
234
240
  return (
235
241
  <div className="block iosanita-block-search servizi-procedure">
236
242
  <div className="full-width bg-primary-lightest py-4">
237
243
  <Container className="px-4">
238
244
  {/* TITOLO DEL BLOCCO */}
239
- {data?.title && (
245
+ {title && (
240
246
  <LinkedHeadline
241
247
  isEditMode={inEditMode}
242
- title={data.title}
248
+ title={title}
243
249
  id={id}
244
- className="search-section-title mb-4"
250
+ className="h5 search-section-title visually-hidden" //visually-hidden for a11y descendant headings
245
251
  />
246
252
  )}
247
253
  <form
@@ -260,16 +266,7 @@ const Body = ({ data, id, path, properties, inEditMode }) => {
260
266
  <SearchBar
261
267
  id={block_id}
262
268
  className="w-100"
263
- title={data.title}
264
- defaultTitle={
265
- data.portal_type === 'Servizio'
266
- ? intl.formatMessage(
267
- messages.searchable_text_default_label_servizi,
268
- )
269
- : intl.formatMessage(
270
- messages.searchable_text_default_label_procedura,
271
- )
272
- }
269
+ title={title}
273
270
  textDescription={
274
271
  data.portal_type === 'Servizio'
275
272
  ? intl.formatMessage(
@@ -361,6 +358,7 @@ const Body = ({ data, id, path, properties, inEditMode }) => {
361
358
  querystringResults.total / b_size,
362
359
  )}
363
360
  onPageChange={handleQueryPaginationChange}
361
+ ariaControls={results_region_id}
364
362
  />
365
363
  )}
366
364
  </div>
@@ -44,6 +44,7 @@ class Pagination extends Component {
44
44
  /** Total number of pages. */
45
45
  totalPages: PropTypes.oneOfType([PropTypes.number, PropTypes.string])
46
46
  .isRequired,
47
+ ariaControls: PropTypes.string,
47
48
  };
48
49
 
49
50
  static defaultProps = {
@@ -71,8 +72,13 @@ class Pagination extends Component {
71
72
  };
72
73
 
73
74
  render() {
74
- const { boundaryRange, ellipsisItem, siblingRange, totalPages } =
75
- this.props;
75
+ const {
76
+ boundaryRange,
77
+ ellipsisItem,
78
+ siblingRange,
79
+ totalPages,
80
+ ariaControls,
81
+ } = this.props;
76
82
  const { activePage } = this.state;
77
83
 
78
84
  const items = createPaginationItems({
@@ -102,6 +108,7 @@ class Pagination extends Component {
102
108
  ellipsisItem={ellipsisItem}
103
109
  isPrevButtonInactive={inactivePrevButton}
104
110
  isForwButtonInactive={inactiveForwButton}
111
+ ariaControls={ariaControls}
105
112
  >
106
113
  {value}
107
114
  </PaginationItem>
@@ -54,6 +54,7 @@ class PaginationItem extends Component {
54
54
 
55
55
  isPrevButtonInactive: PropTypes.bool,
56
56
  isForwButtonInactive: PropTypes.bool,
57
+ ariaControls: PropTypes.string,
57
58
  };
58
59
 
59
60
  handleClick = (e) => {
@@ -75,6 +76,7 @@ class PaginationItem extends Component {
75
76
  ellipsisItem,
76
77
  isPrevButtonInactive,
77
78
  isForwButtonInactive,
79
+ ariaControls,
78
80
  } = this.props;
79
81
  const disabled = this.props.disabled || type === 'ellipsisItem';
80
82
  return (
@@ -84,6 +86,7 @@ class PaginationItem extends Component {
84
86
  onClick={this.handleClick}
85
87
  onKeyDown={this.handleKeyDown}
86
88
  aria-current={active ? 'page' : null}
89
+ aria-controls={ariaControls}
87
90
  >
88
91
  {type === 'prevItem' && (
89
92
  <>
@@ -31,6 +31,7 @@ const SearchBar = React.forwardRef(
31
31
  ariaControls,
32
32
  showSubmit = false,
33
33
  shadow = false,
34
+ ariaLabel,
34
35
  },
35
36
  ref,
36
37
  ) => {
@@ -71,9 +72,11 @@ const SearchBar = React.forwardRef(
71
72
  role="search"
72
73
  aria-label={title ?? defaultTitle}
73
74
  >
74
- <label htmlFor={id + 'searchable-text'} className="active px-0 h5">
75
- {title ?? defaultTitle}
76
- </label>
75
+ {(title || defaultTitle) && (
76
+ <label htmlFor={id + 'searchable-text'} className="active px-0 h5">
77
+ {title ?? defaultTitle}
78
+ </label>
79
+ )}
77
80
 
78
81
  <div className={cx('input-group', { shadow: shadow })}>
79
82
  <span className="input-group-text">
@@ -84,11 +87,12 @@ const SearchBar = React.forwardRef(
84
87
  aria-describedby={id + 'searchable-text-description'}
85
88
  id={id + 'searchable-text'}
86
89
  className="form-control"
87
- value={searchableText}
90
+ value={searchableText ?? ''}
88
91
  aria-controls={ariaControls}
89
92
  onChange={(e) => setSearchableText(e.currentTarget.value)}
90
93
  onKeyDown={onKeyDown}
91
94
  ref={ref}
95
+ aria-label={ariaLabel}
92
96
  />
93
97
  {showSubmit && (
94
98
  <div className="input-group-append">
@@ -141,7 +141,7 @@ const SearchCheckbox = ({
141
141
 
142
142
  return (
143
143
  <div className="search-checkbox">
144
- <h6 className="text-uppercase">
144
+ <div className="text-uppercase h6">
145
145
  {/* SECTION TITLE */}
146
146
  {title}
147
147
 
@@ -159,7 +159,7 @@ const SearchCheckbox = ({
159
159
  {activeOptions}
160
160
  </span>
161
161
  )}
162
- </h6>
162
+ </div>
163
163
  <div className="mt-3">
164
164
  {/* TODO: se serve, attivare anche il 'seleziona tutto' */}
165
165
  {toggleAll && (
@@ -45,8 +45,8 @@ const Header = ({ pathname }) => {
45
45
  {/* <Headers sticky={true} className={mini ? 'is-sticky' : undefined}> */}
46
46
  <Headers
47
47
  className={cx({
48
- 'is-sticky': mini && !isEditMode,
49
- 'it-header-sticky': !isEditMode,
48
+ 'is-sticky': mini, //&& !isEditMode, //rimossa condizione su isEditMode perchè creava problemi di mismatch con il server
49
+ 'it-header-sticky': true, //!isEditMode,
50
50
  })}
51
51
  >
52
52
  <HeaderSlim />
@@ -149,8 +149,9 @@ const Navigation = ({ pathname = '/', isEditMode }) => {
149
149
  {/* Social Links */}
150
150
  <HeaderSearch
151
151
  className={cx({
152
- 'd-none': isEditMode,
153
- 'display-only-when-sticky': !isEditMode,
152
+ //rimossa condizione su isEditMode perchè creava problemi di mismatch con il server
153
+ //'d-none': isEditMode,
154
+ 'display-only-when-sticky': true, //!isEditMode,
154
155
  })}
155
156
  />
156
157
  <SocialHeader mobile={true} />