@opengeoweb/workspace 21.1.0 → 21.2.0-nightly-20261113

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/dist/index.esm.js CHANGED
@@ -1,30 +1,33 @@
1
1
  import { createSlice, createEntityAdapter, createSelector, createListenerMiddleware, isAnyOf, combineReducers, configureStore } from '@reduxjs/toolkit';
2
2
  import { handleResponse, getHeaders, getQueryClient, QueryClientProviderWrapper, useAuthenticationContext as useAuthenticationContext$1, GEOWEB_ROLE_PRESETS_ADMIN as GEOWEB_ROLE_PRESETS_ADMIN$1 } from '@opengeoweb/api';
3
3
  import { soundingsActions, SoundingsTypes, soundingsSelectors, soundingsReducer } from '@opengeoweb/soundings';
4
- import { syncGroupsTypes, FEATURE_GROUP_PREFIX, syncGroupsActions, layerActions, mapActions, uiActions, genericActions, layerTypes, mapEnums, selectorMemoizationOptions, genericSelectors, mapSelectors, syncGroupsSelectors, routerActions, createViewObjectForNewMap, syncConstants, mapListener, serviceListener, layersListener, syncGroupsListener, openlayersListener, uiReducer, loadingIndicatorReducer, syncGroupsReducer, layerReducer, serviceReducer, mapReducer, uiTypes, isWarningsTimelineLinkSourceAllowed, getTakenWarningTimelineIds, linkComponentTypesConstants, constructSyncSourceDisplayName, uiSelectors, loadingIndicatorSelectors, pickList, pickRecord, pickEntities } from '@opengeoweb/store';
5
- import { timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer } from '@opengeoweb/time-series';
6
- import { chunk, cloneDeep, isEqual, isString } from 'lodash';
7
- import { getLeaves, createBalancedTreeFromLeaves, MosaicContext, getAndAssertNodeAtPathExists, MosaicWindow, Mosaic } from 'react-mosaic-component';
8
- import { queryOptions, useQueryClient, useQuery, useMutation, useIsMutating } from '@tanstack/react-query';
9
- import { sessionStorageProvider, SHARED_NAMESPACE, safelyInitI18nForTestsAndStories, sharedTranslations, isAxiosError, getAxiosErrorMessage, isAuthError, isAxiosAuthError, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, usePrevious, AlertBanner, CustomAccordion, CustomTooltip, linkifyText, dateUtils, SystemScope, SearchHighlight, ToggleMenu, SearchField, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, isTargetInteractiveInput, ConfirmationButtons } from '@opengeoweb/shared';
4
+ import { syncGroupsTypes, FEATURE_GROUP_PREFIX, syncGroupsActions, layerActions, mapActions, uiActions, genericActions, layerTypes, mapEnums, selectorMemoizationOptions, genericSelectors, mapSelectors, syncGroupsSelectors, calculateSyncGroupFit, setSyncGroupViewFit, getVisibleArea, syncConstants, routerActions, createViewObjectForNewMap, mapListener, serviceListener, layersListener, syncGroupsListener, openlayersListener, uiReducer, loadingIndicatorReducer, syncGroupsReducer, layerReducer, serviceReducer, mapReducer, uiTypes, isWarningsTimelineLinkSourceAllowed, getTakenWarningTimelineIds, linkComponentTypesConstants, constructSyncSourceDisplayName, uiSelectors, loadingIndicatorSelectors, pickList, pickRecord, pickEntities } from '@opengeoweb/store';
5
+ import { timeseriesTranslations, TIME_SERIES_NAMESPACE, timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer, getUserAddedEDRServices, normalizeEdrServiceUrl, resolveEdrCollectionTarget, EdrCollectionTargetError } from '@opengeoweb/time-series';
6
+ import { chunk, cloneDeep, compact, isEqual, isString } from 'lodash';
7
+ import { snackbarTypes, snackbarActions, snackbarListener, snackbarReducer, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
10
8
  import { pluginsActions, getPluginState, pluginsReducer, PluginProvider, PluginDebugProvider, OverlayPluginMenuButton, usePluginCatalog, OverlayPluginWindows } from '@opengeoweb/plugins';
11
9
  import { warningsTranslations, WARN_NAMESPACE, warningsFiltersActions, publicWarningsSelectors } from '@opengeoweb/warnings';
12
- import { snackbarTypes, snackbarActions, snackbarListener, snackbarReducer, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
10
+ import { getLeaves, createBalancedTreeFromLeaves, MosaicContext, getAndAssertNodeAtPathExists, MosaicWindow, Mosaic } from 'react-mosaic-component';
13
11
  import i18n from 'i18next';
14
12
  import { useTranslation, I18nextProvider } from 'react-i18next';
15
13
  import { coreTranslations, CORE_NAMESPACE, LoadingIndicatorProgressBar } from '@opengeoweb/core';
14
+ import { dataExplorerTranslations, DATA_EXPLORER_NAMESPACE, DataExplorerConnect } from '@opengeoweb/data-explorer';
16
15
  import { formFieldsTranslations, FORM_FIELDS_NAMESPACE, ReactHookFormHiddenInput, ReactHookFormTextField, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
16
+ import { SHARED_NAMESPACE, safelyInitI18nForTestsAndStories, sharedTranslations, sessionStorageProvider, isAxiosError, getAxiosErrorMessage, isAuthError, isAxiosAuthError, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, usePrevious, AlertBanner, CustomAccordion, CustomTooltip, linkifyText, dateUtils, SystemScope, SearchHighlight, ToggleMenu, SearchField, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, isTargetInteractiveInput, ConfirmationButtons } from '@opengeoweb/shared';
17
17
  import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE } from '@opengeoweb/webmap-react';
18
+ import { queryOptions, useQueryClient, useQuery, useMutation, useIsMutating } from '@tanstack/react-query';
18
19
  import { isAxiosError as isAxiosError$1 } from 'axios';
19
20
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
20
21
  import { Provider, useDispatch, useSelector, useStore, shallowEqual } from 'react-redux';
21
22
  import { AuthenticationProvider, useAuthenticationContext, GEOWEB_ROLE_PRESETS_ADMIN } from '@opengeoweb/authentication';
22
23
  import { ThemeWrapper, lightTheme, Link, LinkOff, SplitHorizontal, SplitVertical, SplitHorizontalWithContent, SplitVerticalWithContent, Expand, UnExpand, ChevronDown, Close, ChevronUp, LockLocked, Star, StarOutline, Info, WorkspacePresetsSystemIcon, WorkspacePresetsPluginIcon, SharedPresetsMyUser, SharedPresetsOtherUsers, WorkspacePresetsMyIcon, BackdropStyle, Options, CloudLoading, CloudIdle, WebAssetOff, Exclamation } from '@opengeoweb/theme';
23
24
  import React, { useEffect, useCallback } from 'react';
24
- import { Menu, Typography, List, ListItem, ListItemButton, ListItemIcon, Checkbox, ListItemText, MenuItem, useTheme, Box, LinearProgress, Button, Stack, FormControlLabel, Chip, Popper, ClickAwayListener, Paper, IconButton, Collapse, Divider, Grid, TextField, ListSubheader, Tabs } from '@mui/material';
25
+ import { Menu, Typography, List, ListItem, ListItemButton, ListItemIcon, Checkbox, ListItemText, MenuItem, useTheme, Box, LinearProgress, Button, Stack, FormControlLabel, Chip, Popper, ClickAwayListener, Paper, IconButton, Collapse, Divider, Grid, TextField, ListSubheader, Tabs, linearProgressClasses, Dialog, DialogTitle, DialogActions } from '@mui/material';
25
26
  import 'react-mosaic-component/react-mosaic-component.css';
26
27
  import { useFormContext, useWatch, useForm, FormProvider } from 'react-hook-form';
27
28
  import { List as List$1 } from 'react-window';
29
+ import { keyframes } from '@mui/material/styles';
30
+ import { v4 } from 'uuid';
28
31
  import { http, HttpResponse, delay } from 'msw';
29
32
 
30
33
  var en = {
@@ -36,7 +39,8 @@ var en = {
36
39
  "workspace-new": "New workspace",
37
40
  "workspace-loading": "Loading",
38
41
  "workspace-options": "Options",
39
- "workspace-results": "results",
42
+ "workspace-results_one": "{{count}} result",
43
+ "workspace-results_other": "{{count}} results",
40
44
  "workspace-delete": "Delete",
41
45
  "workspce-clear": "Clear",
42
46
  "workspace-save": "Save",
@@ -123,6 +127,7 @@ var en = {
123
127
  "workspace-viewpreset-success-unshare": "View preset \"{{TITLE}}\" has been successfully unshared",
124
128
  "workspace-loading-indicator-loading": "Loading",
125
129
  "workspace-loading-indicator-idle": "Loaded",
130
+ "workspace-map-views-restore-timeout": "Map views may not match the saved workspace. Reload the workspace to try again.",
126
131
  "workspace-open-tab": "Open in new tab",
127
132
  "workspace-info-title": "Information",
128
133
  "workspace-info-preset-title": "Title:",
@@ -188,40 +193,47 @@ var fi = {
188
193
  "workspace-add-favourite": "Lisää {{title}} suosikkeihin",
189
194
  "workspace-remove-favourite": "Poista {{title}} suosikeista",
190
195
  "workspace-favourites-error": "Suosikkeja ei voitu ladata tai tallentaa. Yritä uudelleen.",
191
- "workspace-menu": "Workspace menu",
192
- "workspace-new": "Uusi workspace",
196
+ "workspace-menu": "Työtilavalikko",
197
+ "workspace-new": "Uusi työtila",
198
+ "workspace-new-soundings": "Uusi luotaustyötila",
199
+ "workspace-template-map": "Uusi map preset",
200
+ "workspace-template-timeseries": "Uusi timeseries preset",
201
+ "workspace-template-soundings": "Uusi luotauspreset",
202
+ "workspace-template-warninglist": "Uusi varoituslistapreset",
203
+ "workspace-template-timeline": "Uusi aikajanapreset",
193
204
  "workspace-loading": "Ladataan",
194
205
  "workspace-options": "Valinnat",
195
- "workspace-results": "tulokset",
206
+ "workspace-results_one": "{{count}} tulos",
207
+ "workspace-results_other": "{{count}} tulosta",
196
208
  "workspace-delete": "Poista",
197
209
  "workspce-clear": "Tyhjennä",
198
210
  "workspace-save": "Tallenna",
199
211
  "workspace-save-as": "Tallenna nimellä",
200
- "workspace-dialog-description": "Short description",
201
- "workspace-char-limit": "Character limitation",
202
- "workspace-edit": "Muokkaa metadata",
212
+ "workspace-dialog-description": "Lyhyt kuvaus",
213
+ "workspace-char-limit": "Merkkirajoitus",
214
+ "workspace-edit": "Muokkaa metatietoja",
203
215
  "workspace-edit-title": "Muokkaa otsikkoa",
204
- "workspace-share": "Missing-translation",
205
- "workspace-stop-share": "Missing-translation",
216
+ "workspace-share": "Jaa",
217
+ "workspace-stop-share": "Lopeta jakaminen",
206
218
  "geoweb-welcome": "Tervetuloa Geoweb-sovellukseen. Valitse jokin preset avataksesi uusia näkymiä",
207
219
  "workspace-modified-new": "muokattu",
208
220
  "workspace-modified-existing": "ei tallennettu",
209
- "workspace-dialog-delete": "Poista workspace",
221
+ "workspace-dialog-delete": "Poista työtila",
210
222
  "workspace-duplicate": "Monista",
211
223
  "workspace-cancel": "Peruuta",
212
224
  "workspace-dialog-name": "Nimi",
213
225
  "workspace-dialog-abstract": "Tiivistelmä",
214
226
  "workspace-dialog-confirm-delete-message": "Oletko varma, että haluat poistaa workspace presetin: \"{{TITLE}}\"?",
215
227
  "workspace-dialog-confirm-reset-message": "ei käännetty",
216
- "workspace-error-fetch": "Workspace listan hakeminen epäonnistui",
217
- "workspace-error-fetch-detail": "Workspacen \"{{WORKSPACE_ID}}\" hakeminen epäonnistui",
228
+ "workspace-error-fetch": "Työtilaluettelon hakeminen epäonnistui",
229
+ "workspace-error-fetch-detail": "Työtilan \"{{WORKSPACE_ID}}\" hakeminen epäonnistui",
218
230
  "workspace-retry": "Yritä uudelleen",
219
231
  "workspace-delete-tooltip": "Poista preset",
220
232
  "workspace-control-split-horizontal": "Jaa ikkuna vaakasuoraan",
221
233
  "workspace-control-split-vertical": "Jaa ikkuna pystysuoraan",
222
234
  "workspace-control-split-shift": "Pidä Shift painettuna kopioidaksesi näkymän sisällön",
223
- "workspace-control-split-horizontal-with-data": "Jaa ikkuna vaakasuunnassa kopioitaessa sisällön päälle",
224
- "workspace-control-split-vertical-with-data": "Jaa ikkuna pystysuunnassa kopioitaessa sisällön päälle",
235
+ "workspace-control-split-horizontal-with-data": "Jaa ikkuna vaakasuoraan ja kopioi näkymän sisältö",
236
+ "workspace-control-split-vertical-with-data": "Jaa ikkuna pystysuoraan ja kopioi näkymän sisältö",
225
237
  "workspace-control-expand": "Laajenna ikkuna",
226
238
  "workspace-control-unexpand": "Supista ikkuna",
227
239
  "workspace-control-show-options": "Näytä asetukset",
@@ -240,15 +252,16 @@ var fi = {
240
252
  "workspace-mappreset-error-fetch": "Map presettien hakeminen epäonnistui",
241
253
  "workspace-list-error": "Workspace presettien hakeminen epäonnistui",
242
254
  "workspace-list-success-save-all": "Workspace \"{{TITLE}}\" ja siihen sisältyvät viewpresetit tallennettu onnistuneesti",
243
- "workspace-list-success-delete": "Workspace \"{{TITLE}}\" poistettu onnistuneesti",
244
- "workspace-list-success-duplicate": "Workspace \"{{TITLE}}\" tallennettu onnistuneesti",
245
- "workspace-list-success-edit": "Workspacea \"{{TITLE}}\" muokattu onnistuneesti",
246
- "workspace-list-success-reset": "ei käännetty",
247
- "workspace-list-success-share": "ei kannetty",
248
- "workspace-list-success-save": "Workspace \"{{TITLE}}\" tallennettu onnistuneesti",
249
- "workspace-save-error": "Workspacen \"{{TITLE}}\" tallentaminen epäonnistui",
255
+ "workspace-list-success-delete": "Työtila \"{{TITLE}}\" on poistettu",
256
+ "workspace-list-success-duplicate": "Työtila \"{{TITLE}}\" on tallennettu",
257
+ "workspace-list-success-edit": "Työtilaa \"{{TITLE}}\" on muokattu",
258
+ "workspace-list-success-reset": "Työtila \"{{TITLE}}\" on palautettu alkuperäiseen tilaan",
259
+ "workspace-list-success-share": "Työtila \"{{TITLE}}\" on jaettu",
260
+ "workspace-list-success-save": "Työtila \"{{TITLE}}\" on tallennettu",
261
+ "workspace-list-success-unshare": "Työtilan \"{{TITLE}}\" jakaminen on lopetettu",
262
+ "workspace-save-error": "Työtilan \"{{TITLE}}\" tallentaminen epäonnistui",
250
263
  "workspace-error-generic": "Jotain meni mönkään. Yritä uudelleen.",
251
- "workspace-error-auth": "ei kaannetty",
264
+ "workspace-error-auth": "Tunnistautumisessa tapahtui virhe",
252
265
  "workspace-viewpreset-success-delete": "Map preset \"{{TITLE}}\" poistettu onnistuneesti",
253
266
  "workspace-viewpreset-success-save-as": "Uusi map preset \"{{TITLE}}\" tallennettu onnistuneesti",
254
267
  "workspace-viewpreset-success-edit": "Map presettiä \"{{TITLE}}\" muokattu onnistuneesti",
@@ -258,75 +271,79 @@ var fi = {
258
271
  "workspace-save-new-viewpreset": "ei käännetty",
259
272
  "workspace-save-new-viewpreset-warning-system": "ei käännetty",
260
273
  "workspace-save-new-viewpreset-warning-user": "ei käännetty",
261
- "workspace-admin-save-workspace": "ei käännetty",
262
- "workspace-admin-save-user-workspace": "ei käännetty",
274
+ "workspace-admin-save-workspace": "Tallenna järjestelmän työtila",
275
+ "workspace-admin-save-user-workspace": "Tallenna työtila",
263
276
  "workspace-admin-select-modified-viewpresets": "ei käännetty",
264
277
  "workspace-admin-save-new-viewpreset": "ei käännetty",
265
278
  "workspace-admin-save-new-viewpreset-warning": "ei käännetty",
266
279
  "workspace-admin-save-new-viewpreset-title": "ei käännetty",
267
280
  "workspace-reset": "Palauta alkuperäinen",
268
- "workspace-reset-title": "ei käännetty",
281
+ "workspace-reset-title": "Palauta alkuperäinen",
282
+ "workspace-dialog-delete-system": "Poista järjestelmän työtila",
269
283
  "workspace-dialog-confirm-delete-system": "ei käännetty",
284
+ "workspace-list-success-delete-system": "\"{{TITLE}}\" on poistettu järjestelmän työtiloista.",
270
285
  "workspace-link-location-header": "Sijainti",
271
286
  "workspace-link": "Link",
272
- "workspace-dialog-confirm-reset-view-message": "ei käännetty",
287
+ "workspace-dialog-confirm-reset-view-message": "Näkymä palautetaan alkuperäiseen tilaan ja kaikki muutokset menetetään. Haluatko varmasti jatkaa?",
273
288
  "workspace-viewpreset-success-reset": "ei käännetty",
274
289
  "workspace-viewpreset-success-share": "ei käännetty",
275
290
  "workspace-viewpreset-success-unshare": "ei käännetty",
276
291
  "workspace-loading-indicator-loading": "Ladataan",
277
292
  "workspace-loading-indicator-idle": "Ladattu",
278
- "workspace-open-tab": "Open in new tab",
279
- "workspace-info-title": "Information",
280
- "workspace-info-short-description": "Short description",
281
- "workspace-info-no-description": "No description available",
282
- "workspace-info-abstract": "Abstract",
283
- "workspace-info-no-abstract": "No abstract available",
293
+ "workspace-open-tab": "Avaa uudessa välilehdessä",
294
+ "workspace-info-title": "Tiedot",
295
+ "workspace-info-preset-title": "Otsikko:",
296
+ "workspace-info-short-description": "Lyhyt kuvaus",
297
+ "workspace-info-no-description": "Kuvausta ei ole saatavilla",
298
+ "workspace-info-abstract": "Tiivistelmä",
299
+ "workspace-info-no-abstract": "Tiivistelmää ei ole saatavilla",
284
300
  "workspace-info-selected-labels": "Selected labels ({{count}})",
285
301
  "workspace-info-no-labels": "No labels selected",
286
- "workspace-info-updated": "Date last changed",
287
- "workspace-info-author": "Author",
288
- "workspace-info-created": "Original made",
289
- "workspace-info-created-by": "Author",
290
- "workspace-info-no-date-provided": "Not provided",
291
- "workspace-info-unknown-author": "Unknown",
302
+ "workspace-info-updated": "Viimeksi muokattu",
303
+ "workspace-info-author": "Tekijä",
304
+ "workspace-info-created": "Luotu",
305
+ "workspace-info-created-by": "Tekijä",
306
+ "workspace-info-no-date-provided": "Ei ilmoitettu",
307
+ "workspace-info-unknown-author": "Tuntematon",
292
308
  "workspace-info-tooltip": "Show preset information",
293
309
  "workspace-currently": "Nykyinen",
294
- "workspace-presets-form-labels-info": "ei käännetty",
295
- "workspace-presets-form-labels-clearAll": "ei käännetty ({{count}})",
296
- "workspace-presets-form-labels-collapseAll": "ei käännetty",
297
- "workspace-presets-form-labels-expandAll": "ei käännetty",
310
+ "workspace-presets-form-labels-info": "Näkymän tyyppiä ei tyhjennetä.",
311
+ "workspace-presets-form-labels-clearAll": "Tyhjennä kaikki suodattimet ({{count}})",
312
+ "workspace-presets-form-labels-collapseAll": "Kutista",
313
+ "workspace-presets-form-labels-expandAll": "Laajenna kaikki",
298
314
  "workspace-presets-form-labels-header": "ei käännetty",
299
- "workspace-labels-purpose": "ei käännetty",
300
- "workspace-labels-parameters": "ei käännetty",
301
- "workspace-labels-phenomena": "ei käännetty",
302
- "workspace-labels-dataType": "ei käännetty",
303
- "workspace-labels-dataSource": "ei käännetty",
304
- "workspace-labels-viewType": "ei käännetty",
315
+ "workspace-labels-purpose": "Käyttötarkoitus",
316
+ "workspace-labels-parameters": "Parametrit",
317
+ "workspace-labels-phenomena": "Sääilmiö",
318
+ "workspace-labels-dataType": "Aineiston tyyppi",
319
+ "workspace-labels-dataSource": "Aineiston lähde",
320
+ "workspace-labels-viewType": "Näkymän tyyppi",
305
321
  "workspace-presets-form-active-labels": "ei käännetty ({{count}})",
306
- "workspace-label-active": "ACTIVE",
322
+ "workspace-label-active": "AKTIIVINEN",
323
+ "fetch-config-error-retry": "Yritä uudelleen",
307
324
  "workspace-versions": "Valitse versio",
308
325
  "workspace-version": "Versio {{version}}",
309
326
  "workspace-version-current": "Versio {{version}} (nykyinen)",
310
327
  "workspace-version-default": "Versio {{version}} (oletus)",
311
- "workspace-copy-to-clipboard": "Copy workspace",
312
- "workspace-paste-from-clipboard": "Paste workspace",
328
+ "workspace-copy-to-clipboard": "Kopioi työtila",
329
+ "workspace-paste-from-clipboard": "Liitä työtila",
313
330
  "workspace-copy-viewpreset-to-clipboard": "Copy view preset",
314
331
  "workspace-paste-viewpreset-from-clipboard": "Paste view preset",
315
- "workspace-paste-dialog-title": "Paste workspace",
332
+ "workspace-paste-dialog-title": "Liitä työtila leikepöydältä",
316
333
  "workspace-paste-viewpreset-dialog-title": "Paste view preset",
317
- "workspace-paste-load-button": "Load workspace",
334
+ "workspace-paste-load-button": "Lataa työtila",
318
335
  "workspace-paste-load-viewpreset-button": "Load view preset",
319
- "workspace-paste-placeholder": "Paste workspace JSON here",
336
+ "workspace-paste-placeholder": "Liitä työtilan JSON-tiedot tähän",
320
337
  "workspace-paste-viewpreset-placeholder": "Paste view preset JSON here",
321
- "workspace-paste-field-label": "Workspace JSON",
338
+ "workspace-paste-field-label": "Työtilan JSON-tiedot",
322
339
  "workspace-paste-viewpreset-field-label": "View preset JSON",
323
- "workspace-copy-success": "Workspace JSON copied to clipboard",
324
- "workspace-paste-success": "Workspace loaded",
340
+ "workspace-copy-success": "Työtila kopioitu",
341
+ "workspace-paste-success": "Työtila ladattu",
325
342
  "workspace-copy-viewpreset-success": "View preset JSON copied to clipboard",
326
343
  "workspace-paste-viewpreset-success": "View preset loaded",
327
- "workspace-paste-validation-invalid-json": "Invalid JSON: {{ERROR}}",
328
- "workspace-paste-validation-not-object": "Input must be a JSON object",
329
- "workspace-paste-validation-missing-field": "Missing required field: \"{{ERROR}}\"",
344
+ "workspace-paste-validation-invalid-json": "Virheellinen JSON: {{ERROR}}",
345
+ "workspace-paste-validation-not-object": "Syötteen on oltava JSON-objekti",
346
+ "workspace-paste-validation-missing-field": "Pakollinen kenttä puuttuu: \"{{ERROR}}\"",
330
347
  "workspace-paste-validation-unexpanded-views": "Workspace contains view preset references. Use the Copy button to get a portable version.",
331
348
  "workspace-paste-validation-wrong-preset-type": "The clipboard contains a view preset, not a workspace preset.",
332
349
  "viewpreset-paste-validation-wrong-preset-type": "The clipboard contains a workspace preset, not a view preset."
@@ -340,7 +357,8 @@ var no = {
340
357
  "workspace-new": "Ny arbeidsflate",
341
358
  "workspace-loading": "Laster",
342
359
  "workspace-options": "Valg",
343
- "workspace-results": "resultater",
360
+ "workspace-results_one": "{{count}} resultat",
361
+ "workspace-results_other": "{{count}} resultater",
344
362
  "workspace-delete": "Slett",
345
363
  "workspce-clear": "Tøm",
346
364
  "workspace-save": "Lagre",
@@ -424,6 +442,7 @@ var no = {
424
442
  "workspace-viewpreset-success-unshare": "Vinduet \"{{TITLE}}\" deles ikke lenger",
425
443
  "workspace-loading-indicator-loading": "Laster inn",
426
444
  "workspace-loading-indicator-idle": "Lastet inn",
445
+ "workspace-map-views-restore-timeout": "Kartvisningene samsvarer kanskje ikke med den lagrede arbeidsflaten. Last inn arbeidsflaten på nytt.",
427
446
  "workspace-open-tab": "Åpne i ny fane",
428
447
  "workspace-info-title": "Informasjon",
429
448
  "workspace-info-short-description": "Kort beskrivelse",
@@ -489,7 +508,8 @@ var nl = {
489
508
  "workspace-new": "Nieuwe workspace",
490
509
  "workspace-loading": "Laden",
491
510
  "workspace-options": "Opties",
492
- "workspace-results": "resultaten",
511
+ "workspace-results_one": "{{count}} resultaat",
512
+ "workspace-results_other": "{{count}} resultaten",
493
513
  "workspace-delete": "Verwijder",
494
514
  "workspce-clear": "Wissen",
495
515
  "workspace-save": "Opslaan",
@@ -575,6 +595,7 @@ var nl = {
575
595
  "workspace-viewpreset-success-unshare": "Viewpreset \"{{TITLE}}\" deling is ongedaan gemaakt",
576
596
  "workspace-loading-indicator-loading": "Aan het laden",
577
597
  "workspace-loading-indicator-idle": "Klaar met laden",
598
+ "workspace-map-views-restore-timeout": "Kaartweergaven komen mogelijk niet overeen met de opgeslagen workspace. Laad de workspace opnieuw.",
578
599
  "workspace-open-tab": "Open in nieuw tabblad",
579
600
  "workspace-info-title": "Informatie",
580
601
  "workspace-info-short-description": "Korte beschrijving",
@@ -666,6 +687,36 @@ function _asyncToGenerator(n) {
666
687
  });
667
688
  };
668
689
  }
690
+ function _construct(t, e, r) {
691
+ if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);
692
+ var o = [null];
693
+ o.push.apply(o, e);
694
+ var p = new (t.bind.apply(t, o))();
695
+ return r && _setPrototypeOf(p, r.prototype), p;
696
+ }
697
+ function _getPrototypeOf(t) {
698
+ return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
699
+ return t.__proto__ || Object.getPrototypeOf(t);
700
+ }, _getPrototypeOf(t);
701
+ }
702
+ function _inheritsLoose(t, o) {
703
+ t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o);
704
+ }
705
+ function _isNativeFunction(t) {
706
+ try {
707
+ return -1 !== Function.toString.call(t).indexOf("[native code]");
708
+ } catch (n) {
709
+ return "function" == typeof t;
710
+ }
711
+ }
712
+ function _isNativeReflectConstruct() {
713
+ try {
714
+ var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
715
+ } catch (t) {}
716
+ return (_isNativeReflectConstruct = function () {
717
+ return !!t;
718
+ })();
719
+ }
669
720
  function _objectDestructuringEmpty(t) {
670
721
  if (null == t) throw new TypeError("Cannot destructure " + t);
671
722
  }
@@ -786,6 +837,76 @@ function _regeneratorDefine(e, r, n, t) {
786
837
  }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
787
838
  }, _regeneratorDefine(e, r, n, t);
788
839
  }
840
+ function _setPrototypeOf(t, e) {
841
+ return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
842
+ return t.__proto__ = e, t;
843
+ }, _setPrototypeOf(t, e);
844
+ }
845
+ function _taggedTemplateLiteralLoose(e, t) {
846
+ return t || (t = e.slice(0)), e.raw = t, e;
847
+ }
848
+ function _wrapNativeSuper(t) {
849
+ var r = "function" == typeof Map ? new Map() : void 0;
850
+ return _wrapNativeSuper = function (t) {
851
+ if (null === t || !_isNativeFunction(t)) return t;
852
+ if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function");
853
+ if (void 0 !== r) {
854
+ if (r.has(t)) return r.get(t);
855
+ r.set(t, Wrapper);
856
+ }
857
+ function Wrapper() {
858
+ return _construct(t, arguments, _getPrototypeOf(this).constructor);
859
+ }
860
+ return Wrapper.prototype = Object.create(t.prototype, {
861
+ constructor: {
862
+ value: Wrapper,
863
+ enumerable: false,
864
+ writable: true,
865
+ configurable: true
866
+ }
867
+ }), _setPrototypeOf(Wrapper, t);
868
+ }, _wrapNativeSuper(t);
869
+ }
870
+
871
+ /* *
872
+ * Licensed under the Apache License, Version 2.0 (the "License");
873
+ * you may not use this file except in compliance with the License.
874
+ * You may obtain a copy of the License at
875
+ *
876
+ * http://www.apache.org/licenses/LICENSE-2.0
877
+ *
878
+ * Unless required by applicable law or agreed to in writing, software
879
+ * distributed under the License is distributed on an "AS IS" BASIS,
880
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
881
+ * See the License for the specific language governing permissions and
882
+ * limitations under the License.
883
+ *
884
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
885
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
886
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
887
+ * */
888
+ var WorkspacePresetAction;
889
+ (function (WorkspacePresetAction) {
890
+ WorkspacePresetAction["DELETE"] = "DELETE";
891
+ WorkspacePresetAction["EDIT"] = "EDIT";
892
+ WorkspacePresetAction["SAVE"] = "SAVE";
893
+ WorkspacePresetAction["SAVE_AS"] = "SAVE_AS";
894
+ WorkspacePresetAction["DUPLICATE"] = "DUPLICATE";
895
+ WorkspacePresetAction["SAVE_SYSTEM_PRESET"] = "SAVE_SYSTEM_PRESET";
896
+ WorkspacePresetAction["SAVE_SYSTEM_PRESET_AS"] = "SAVE_SYSTEM_PRESET_AS";
897
+ WorkspacePresetAction["RESET"] = "RESET";
898
+ WorkspacePresetAction["DELETE_SYSTEM_PRESET"] = "DELETE_SYSTEM_PRESET";
899
+ WorkspacePresetAction["SHARE"] = "SHARE";
900
+ WorkspacePresetAction["OPEN_TAB"] = "OPEN_TAB";
901
+ WorkspacePresetAction["EDIT_TITLE"] = "EDIT_TITLE";
902
+ WorkspacePresetAction["COPY_TO_CLIPBOARD"] = "COPY_TO_CLIPBOARD";
903
+ })(WorkspacePresetAction || (WorkspacePresetAction = {}));
904
+ var WorkspaceErrorType;
905
+ (function (WorkspaceErrorType) {
906
+ WorkspaceErrorType["NOT_FOUND"] = "NOT_FOUND";
907
+ WorkspaceErrorType["GENERIC"] = "GENERIC";
908
+ WorkspaceErrorType["SAVE"] = "SAVE";
909
+ })(WorkspaceErrorType || (WorkspaceErrorType = {}));
789
910
 
790
911
  /* *
791
912
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -927,283 +1048,37 @@ var toViewsArray = function toViewsArray(wsViews) {
927
1048
  });
928
1049
  };
929
1050
 
930
- var workspacePresetsFallback = [
931
- {
932
- id: "newSplitMap2x1Workspace",
933
- title: "Two maps",
934
- scope: "system",
935
- abstract: "",
936
- viewType: "multiWindow",
937
- views: [
938
- {
939
- mosaicNodeId: "left-map",
940
- componentType: "Map",
941
- initialProps: {
942
- mapPreset: {
943
- layers: [
944
- ],
945
- proj: {
946
- bbox: {
947
- left: -2782987.27,
948
- bottom: 3503549.84,
949
- right: 5009377.09,
950
- top: 11753184.62
951
- },
952
- srs: "EPSG:3857"
953
- },
954
- showTimeSlider: false,
955
- displayMapPin: false,
956
- shouldShowZoomControls: true
957
- },
958
- syncGroupsIds: [
959
- ]
960
- },
961
- title: "Map A"
962
- },
963
- {
964
- mosaicNodeId: "right-map",
965
- componentType: "Map",
966
- initialProps: {
967
- mapPreset: {
968
- layers: [
969
- ],
970
- proj: {
971
- bbox: {
972
- left: -2782987.27,
973
- bottom: 3503549.84,
974
- right: 5009377.09,
975
- top: 11753184.62
976
- },
977
- srs: "EPSG:3857"
978
- },
979
- showTimeSlider: false,
980
- displayMapPin: false,
981
- shouldShowZoomControls: true
982
- },
983
- syncGroupsIds: [
984
- ]
985
- },
986
- title: "Map B"
987
- }
988
- ],
989
- syncGroups: [
990
- ],
991
- mosaicNode: {
992
- direction: "row",
993
- first: "left-map",
994
- second: "right-map",
995
- splitPercentage: 50
996
- }
997
- },
998
- {
999
- id: "timeSeriesWorkspace",
1000
- title: "Timeseries",
1001
- scope: "system",
1002
- abstract: "",
1003
- viewType: "multiWindow",
1004
- views: [
1005
- {
1006
- mosaicNodeId: "timeseries-map",
1007
- componentType: "Map",
1008
- initialProps: {
1009
- mapPreset: {
1010
- layers: [
1011
- ],
1012
- proj: {
1013
- bbox: {
1014
- left: -2782987.27,
1015
- bottom: 3503549.84,
1016
- right: 5009377.09,
1017
- top: 11753184.62
1018
- },
1019
- srs: "EPSG:3857"
1020
- },
1021
- showTimeSlider: true,
1022
- displayMapPin: true,
1023
- shouldShowZoomControls: true
1024
- },
1025
- syncGroupsIds: [
1026
- "Area_TimeSeries",
1027
- "Time_TimeSeries"
1028
- ]
1029
- },
1030
- title: "Map"
1031
- },
1032
- {
1033
- mosaicNodeId: "timeseries-panel",
1034
- componentType: "TimeSeries",
1035
- initialProps: {
1036
- plotPreset: {
1037
- mapId: "timeseries-map",
1038
- plots: [
1039
- ],
1040
- parameters: [
1041
- ]
1042
- },
1043
- services: [
1044
- ]
1045
- },
1046
- title: "Timeseries"
1047
- }
1048
- ],
1049
- syncGroups: [
1050
- {
1051
- id: "Area_TimeSeries",
1052
- type: "SYNCGROUPS_TYPE_SETBBOX"
1053
- },
1054
- {
1055
- id: "Time_TimeSeries",
1056
- type: "SYNCGROUPS_TYPE_SETTIME"
1057
- }
1058
- ],
1059
- linking: {
1060
- "timeseries-panel": [
1061
- "timeseries-map"
1062
- ]
1063
- },
1064
- mosaicNode: {
1065
- direction: "row",
1066
- first: "timeseries-map",
1067
- second: "timeseries-panel",
1068
- splitPercentage: 50
1069
- }
1070
- },
1071
- {
1072
- id: "soundingWorkspace",
1073
- title: "Soundings",
1074
- scope: "system",
1075
- abstract: "Vertical profile observations",
1076
- viewType: "multiWindow",
1077
- views: [
1078
- {
1079
- mosaicNodeId: "sounding-map",
1080
- componentType: "Map",
1081
- initialProps: {
1082
- mapPreset: {
1083
- layers: [
1084
- ],
1085
- proj: {
1086
- bbox: {
1087
- left: -2782987.27,
1088
- bottom: 3503549.84,
1089
- right: 5009377.09,
1090
- top: 11753184.62
1091
- },
1092
- srs: "EPSG:3857"
1093
- },
1094
- showTimeSlider: true,
1095
- displayMapPin: true,
1096
- shouldShowZoomControls: true
1097
- },
1098
- syncGroupsIds: [
1099
- "Area_Sounding",
1100
- "Time_Sounding"
1101
- ]
1102
- },
1103
- title: "Map"
1104
- },
1105
- {
1106
- mosaicNodeId: "sounding-panel",
1107
- componentType: "Soundings",
1108
- initialProps: {
1109
- selectedSources: {
1110
- },
1111
- selectedLocations: {
1112
- }
1113
- },
1114
- title: "Sounding"
1115
- }
1116
- ],
1117
- syncGroups: [
1118
- {
1119
- id: "Area_Sounding",
1120
- type: "SYNCGROUPS_TYPE_SETBBOX"
1121
- },
1122
- {
1123
- id: "Time_Sounding",
1124
- type: "SYNCGROUPS_TYPE_SETTIME"
1125
- }
1126
- ],
1127
- linking: {
1128
- "sounding-panel": [
1129
- "sounding-map"
1130
- ]
1131
- },
1132
- mosaicNode: {
1133
- direction: "row",
1134
- first: "sounding-map",
1135
- second: "sounding-panel",
1136
- splitPercentage: 50
1137
- }
1138
- },
1139
- {
1140
- id: "capWarningsWorkspace",
1141
- title: "Cap warnings",
1142
- scope: "system",
1143
- abstract: "",
1144
- viewType: "multiWindow",
1145
- views: [
1146
- {
1147
- mosaicNodeId: "cap-map",
1148
- componentType: "CapWarningMap",
1149
- initialProps: {
1150
- mapPreset: {
1151
- layers: [
1152
- ],
1153
- proj: {
1154
- bbox: {
1155
- left: -2782987.27,
1156
- bottom: 3503549.84,
1157
- right: 5009377.09,
1158
- top: 11753184.62
1159
- },
1160
- srs: "EPSG:3857"
1161
- }
1162
- },
1163
- geoJson: {
1164
- type: "FeatureCollection",
1165
- features: [
1166
- ]
1167
- }
1168
- },
1169
- title: "CAP warnings map"
1170
- },
1171
- {
1172
- mosaicNodeId: "cap-list",
1173
- componentType: "CapWarningList",
1174
- initialProps: {
1175
- mapPreset: {
1176
- layers: [
1177
- ],
1178
- proj: {
1179
- bbox: {
1180
- left: -2782987.27,
1181
- bottom: 3503549.84,
1182
- right: 5009377.09,
1183
- top: 11753184.62
1184
- },
1185
- srs: "EPSG:3857"
1186
- }
1187
- },
1188
- geoJson: {
1189
- type: "FeatureCollection",
1190
- features: [
1191
- ]
1192
- }
1193
- },
1194
- title: "CAP warnings list"
1195
- }
1196
- ],
1197
- syncGroups: [
1198
- ],
1199
- mosaicNode: {
1200
- direction: "row",
1201
- first: "cap-map",
1202
- second: "cap-list",
1203
- splitPercentage: 50
1204
- }
1205
- }
1206
- ];
1051
+ var AVIATION_COMPONENT_TYPES = ['AirmetModule', 'SigmetModule'];
1052
+ var CAP_COMPONENT_TYPES = ['CapWarningList', 'CapWarningMap'];
1053
+ // 1) Map-like components
1054
+ var SUPPORTED_COMPONENT_TYPES = ['Map', 'MultiMap', 'ModelRunInterval', 'HarmonieTempAndPrecipPreset', 'TimeSlider'];
1055
+ // 2) TimeSeries components
1056
+ var SUPPORTED_TIMESERIES_COMPONENT_TYPES = ['TimeSeries'];
1057
+ // or keep your old union type if it already exists
1058
+ // 3) Warning list components
1059
+ var WARNING_LIST_COMPONENT_TYPES = ['WarningList', 'MaritimeWarnings', 'WarningsTimeline'];
1060
+ // TODO: expand it and move to a more centralized place
1061
+ var ALL_COMPONENT_TYPES = [].concat(SUPPORTED_COMPONENT_TYPES, SUPPORTED_TIMESERIES_COMPONENT_TYPES, WARNING_LIST_COMPONENT_TYPES, AVIATION_COMPONENT_TYPES, CAP_COMPONENT_TYPES, ['TafModule', 'TrajksModule', 'SpaceweatherModule', 'Plugin', 'Soundings', 'CrossSection']);
1062
+ var ViewPresetErrorComponent;
1063
+ (function (ViewPresetErrorComponent) {
1064
+ ViewPresetErrorComponent["PRESET_DETAIL"] = "PRESET_DETAIL";
1065
+ ViewPresetErrorComponent["PRESET_LIST"] = "PRESET_LIST";
1066
+ })(ViewPresetErrorComponent || (ViewPresetErrorComponent = {}));
1067
+ var ViewPresetErrorType;
1068
+ (function (ViewPresetErrorType) {
1069
+ ViewPresetErrorType["AUTH"] = "AUTH";
1070
+ ViewPresetErrorType["GENERIC"] = "GENERIC";
1071
+ })(ViewPresetErrorType || (ViewPresetErrorType = {}));
1072
+ var PresetAction;
1073
+ (function (PresetAction) {
1074
+ PresetAction["OPEN"] = "Open";
1075
+ PresetAction["DELETE"] = "Delete";
1076
+ PresetAction["SAVE"] = "Save";
1077
+ PresetAction["SAVE_AS"] = "Save as";
1078
+ PresetAction["SHARE"] = "Share";
1079
+ PresetAction["EDIT"] = "Edit";
1080
+ PresetAction["RESET"] = "Reset";
1081
+ })(PresetAction || (PresetAction = {}));
1207
1082
 
1208
1083
  /* *
1209
1084
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1218,300 +1093,338 @@ var workspacePresetsFallback = [
1218
1093
  * See the License for the specific language governing permissions and
1219
1094
  * limitations under the License.
1220
1095
  *
1221
- * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1222
- * Copyright 2026 - Finnish Meteorological Institute (FMI)
1223
- * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
1096
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1097
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
1098
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1224
1099
  * */
1225
- /*
1226
- configureLibraryDefaults([LIB_KEY], {
1227
- staleTime: 5 * 60 * 1000,
1228
- });
1229
- */
1230
- var LIB_KEY = 'workspace-lib';
1231
- var getPresetBaseUrl = function getPresetBaseUrl() {
1232
- var config = sessionStorageProvider.getConfig();
1233
- return (config == null ? void 0 : config.GW_PRESET_BACKEND_URL) || '';
1234
- };
1235
- var getIdFromUrl = function getIdFromUrl(url) {
1236
- return url && /[^/]+$/.exec(url)[0];
1237
- };
1238
- var ERROR_NOT_FOUND$1 = 'Request failed with status code 400';
1239
- var hasNoPresetBackend = function hasNoPresetBackend() {
1240
- return !getPresetBaseUrl() && process.env.NODE_ENV !== 'test';
1241
- };
1242
- var extractWorkspacePresetFromJSON = function extractWorkspacePresetFromJSON(workspacePresetId) {
1243
- var preset = workspacePresetsFallback.find(function (element) {
1244
- return element.id === workspacePresetId;
1245
- });
1246
- if (!preset) {
1247
- throw new Error(ERROR_NOT_FOUND$1);
1248
- }
1249
- return preset;
1100
+ var WorkspaceListErrorCategory;
1101
+ (function (WorkspaceListErrorCategory) {
1102
+ WorkspaceListErrorCategory["AUTH"] = "AUTH";
1103
+ WorkspaceListErrorCategory["GENERIC"] = "GENERIC";
1104
+ })(WorkspaceListErrorCategory || (WorkspaceListErrorCategory = {}));
1105
+ var WorkspaceListErrorType;
1106
+ (function (WorkspaceListErrorType) {
1107
+ WorkspaceListErrorType["TRANSLATABLE_ERROR"] = "TRANSLATABLE_ERROR";
1108
+ WorkspaceListErrorType["VERBATIM_ERROR"] = "VERBATIM_ERROR";
1109
+ })(WorkspaceListErrorType || (WorkspaceListErrorType = {}));
1110
+ var PresetFilterType;
1111
+ (function (PresetFilterType) {
1112
+ PresetFilterType["personal"] = "personal";
1113
+ PresetFilterType["shared"] = "shared";
1114
+ PresetFilterType["system"] = "system";
1115
+ PresetFilterType["plugin"] = "plugin";
1116
+ PresetFilterType["templates"] = "templates";
1117
+ PresetFilterType["favourites"] = "favourites";
1118
+ })(PresetFilterType || (PresetFilterType = {}));
1119
+
1120
+ /* *
1121
+ * Licensed under the Apache License, Version 2.0 (the "License");
1122
+ * you may not use this file except in compliance with the License.
1123
+ * You may obtain a copy of the License at
1124
+ *
1125
+ * http://www.apache.org/licenses/LICENSE-2.0
1126
+ *
1127
+ * Unless required by applicable law or agreed to in writing, software
1128
+ * distributed under the License is distributed on an "AS IS" BASIS,
1129
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1130
+ * See the License for the specific language governing permissions and
1131
+ * limitations under the License.
1132
+ *
1133
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1134
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
1135
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1136
+ * */
1137
+ var WORKSPACE_NAMESPACE = 'workspace';
1138
+ var initWorkspaceTestI18n = function initWorkspaceTestI18n() {
1139
+ safelyInitI18nForTestsAndStories(i18n, WORKSPACE_NAMESPACE, [{
1140
+ ns: WORKSPACE_NAMESPACE,
1141
+ translations: workspaceTranslations
1142
+ }, {
1143
+ ns: SHARED_NAMESPACE,
1144
+ translations: sharedTranslations
1145
+ }, {
1146
+ ns: CORE_NAMESPACE,
1147
+ translations: coreTranslations
1148
+ }, {
1149
+ ns: WEBMAP_REACT_NAMESPACE,
1150
+ translations: webmapReactTranslations
1151
+ }, {
1152
+ ns: FORM_FIELDS_NAMESPACE,
1153
+ translations: formFieldsTranslations
1154
+ }, {
1155
+ ns: WARN_NAMESPACE,
1156
+ translations: warningsTranslations
1157
+ }, {
1158
+ ns: TIME_SERIES_NAMESPACE,
1159
+ translations: timeseriesTranslations
1160
+ }, {
1161
+ ns: DATA_EXPLORER_NAMESPACE,
1162
+ translations: dataExplorerTranslations
1163
+ }]);
1250
1164
  };
1251
- var filterWorkspacePresetList = function filterWorkspacePresetList(params) {
1252
- var list = workspacePresetsFallback.map(function (preset) {
1253
- var _preset$abstract;
1254
- return {
1255
- id: preset.id,
1256
- title: preset.title,
1257
- scope: preset.scope,
1258
- viewType: preset.viewType,
1259
- "abstract": (_preset$abstract = preset["abstract"]) != null ? _preset$abstract : '',
1260
- description: preset.description,
1261
- username: preset.username
1262
- };
1263
- });
1264
- if (!params) {
1265
- return list;
1266
- }
1267
- return list.filter(function (preset) {
1268
- if (params.scope && preset.scope !== params.scope) {
1269
- return false;
1270
- }
1271
- if (params.search) {
1272
- var query = params.search.toLowerCase();
1273
- return preset.title.toLowerCase().includes(query) || preset["abstract"].toLowerCase().includes(query);
1274
- }
1275
- return true;
1276
- });
1165
+ var ns = [WORKSPACE_NAMESPACE, SHARED_NAMESPACE];
1166
+ var useWorkspaceTranslation = function useWorkspaceTranslation() {
1167
+ return useTranslation(ns);
1277
1168
  };
1278
- var favouritePresetKey = function favouritePresetKey(type, preset) {
1279
- return type + ":" + preset.id;
1169
+
1170
+ var _excluded$7 = ["views"];
1171
+ var getSnackbarMessage$1 = function getSnackbarMessage(action, title, is_shared) {
1172
+ // Trim and add quotes
1173
+ var trimmedTitle = title.trim();
1174
+ switch (action) {
1175
+ case WorkspacePresetAction.DELETE:
1176
+ return {
1177
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1178
+ key: 'workspace-list-success-delete',
1179
+ params: {
1180
+ TITLE: trimmedTitle
1181
+ }
1182
+ };
1183
+ case WorkspacePresetAction.DELETE_SYSTEM_PRESET:
1184
+ return {
1185
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1186
+ key: 'workspace-list-success-delete-system',
1187
+ params: {
1188
+ TITLE: trimmedTitle
1189
+ }
1190
+ };
1191
+ case WorkspacePresetAction.DUPLICATE:
1192
+ return {
1193
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1194
+ key: 'workspace-list-success-duplicate',
1195
+ params: {
1196
+ TITLE: trimmedTitle
1197
+ }
1198
+ };
1199
+ case WorkspacePresetAction.EDIT:
1200
+ return {
1201
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1202
+ key: 'workspace-list-success-edit',
1203
+ params: {
1204
+ TITLE: trimmedTitle
1205
+ }
1206
+ };
1207
+ case WorkspacePresetAction.RESET:
1208
+ return {
1209
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1210
+ key: 'workspace-list-success-reset',
1211
+ params: {
1212
+ TITLE: trimmedTitle
1213
+ }
1214
+ };
1215
+ case WorkspacePresetAction.SHARE:
1216
+ return {
1217
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1218
+ key: is_shared ? 'workspace-list-success-unshare' : 'workspace-list-success-share',
1219
+ params: {
1220
+ TITLE: trimmedTitle
1221
+ }
1222
+ };
1223
+ default:
1224
+ return {
1225
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1226
+ key: 'workspace-list-success-save',
1227
+ params: {
1228
+ TITLE: trimmedTitle
1229
+ }
1230
+ };
1231
+ }
1280
1232
  };
1281
- var updateCachedFavourite = function updateCachedFavourite(client, queryKey, key, isFavourite) {
1282
- client.setQueryData(queryKey, function (preferences) {
1283
- var _preferences$favourit;
1284
- var favourites = (_preferences$favourit = preferences == null ? void 0 : preferences.favouritePresets) != null ? _preferences$favourit : [];
1285
- return Object.assign({}, preferences, {
1286
- favouritePresets: isFavourite ? Array.from(new Set([].concat(favourites, [key]))) : favourites.filter(function (value) {
1287
- return value !== key;
1288
- })
1289
- });
1233
+ function getEmptyWorkspaceListItem(t) {
1234
+ return {
1235
+ id: undefined,
1236
+ title: t ? t('workspace-new') : undefined,
1237
+ labels: undefined,
1238
+ scope: 'system',
1239
+ "abstract": '',
1240
+ viewType: 'singleWindow'
1241
+ };
1242
+ }
1243
+ function getEmptyMapWorkspace(t) {
1244
+ return Object.assign({}, getEmptyWorkspaceListItem(t), {
1245
+ views: {
1246
+ allIds: ['1_screen'],
1247
+ byId: {
1248
+ '1_screen': {
1249
+ title: t ? t('workspace-mappreset-new') : undefined,
1250
+ componentType: 'Map',
1251
+ initialProps: {
1252
+ mapPreset: {
1253
+ shouldShowLayerManager: true,
1254
+ dockedLayerManagerSize: 'sizeSmall'
1255
+ },
1256
+ syncGroupsIds: []
1257
+ }
1258
+ }
1259
+ }
1260
+ },
1261
+ mosaicNode: '1_screen'
1290
1262
  });
1291
- };
1292
-
1293
- var getViewPreset = /*#__PURE__*/function () {
1294
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(viewpresetId, auth) {
1295
- return _regenerator().w(function (_context) {
1296
- while (1) switch (_context.n) {
1297
- case 0:
1298
- if (viewpresetId) {
1299
- _context.n = 1;
1300
- break;
1263
+ }
1264
+ var getEmptyWorkspacePreset = function getEmptyWorkspacePreset() {
1265
+ return {
1266
+ scope: 'system',
1267
+ "abstract": '',
1268
+ views: {
1269
+ allIds: ['1_screen'],
1270
+ byId: {
1271
+ '1_screen': {
1272
+ componentType: 'Map',
1273
+ initialProps: {
1274
+ mapPreset: {
1275
+ shouldShowLayerManager: true,
1276
+ dockedLayerManagerSize: 'sizeSmall'
1277
+ },
1278
+ syncGroupsIds: []
1301
1279
  }
1302
- return _context.a(2, null);
1303
- case 1:
1304
- return _context.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewpresetId, {
1305
- headers: getHeaders(auth)
1306
- }).then(handleResponse));
1280
+ }
1307
1281
  }
1308
- }, _callee);
1309
- }));
1310
- return function getViewPreset(_x, _x2) {
1311
- return _ref.apply(this, arguments);
1282
+ },
1283
+ mosaicNode: '1_screen',
1284
+ viewType: 'singleWindow',
1285
+ username: 'global'
1312
1286
  };
1313
- }();
1314
- var getViewPresets$1 = /*#__PURE__*/function () {
1315
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(auth) {
1316
- var url;
1317
- return _regenerator().w(function (_context2) {
1318
- while (1) switch (_context2.n) {
1319
- case 0:
1320
- url = getPresetBaseUrl() + "/viewpreset";
1321
- return _context2.a(2, fetch(url, {
1322
- headers: getHeaders(auth)
1323
- }).then(handleResponse));
1324
- }
1325
- }, _callee2);
1326
- }));
1327
- return function getViewPresets(_x3) {
1328
- return _ref2.apply(this, arguments);
1287
+ };
1288
+ var createCustomEmptyMapWorkspace = function createCustomEmptyMapWorkspace(emptyWorkspaceTitle, emptyMapWorkspaceTitle, customMapPreset) {
1289
+ var customEmptyMapWorkspace = cloneDeep(getEmptyWorkspacePreset());
1290
+ if (customMapPreset) {
1291
+ customEmptyMapWorkspace.views.byId['1_screen'].initialProps.mapPreset = customMapPreset;
1292
+ }
1293
+ customEmptyMapWorkspace.views.byId['1_screen'].title = emptyMapWorkspaceTitle;
1294
+ var emptyWorkspacePreset = Object.assign({}, customEmptyMapWorkspace, {
1295
+ title: emptyWorkspaceTitle
1296
+ });
1297
+ return emptyWorkspacePreset;
1298
+ };
1299
+ var FALLBACK_TEMPLATE_LANGUAGE = 'en';
1300
+ // Falls back to English and then to the first title, so a template does not
1301
+ // need a title for every language
1302
+ var getTemplatePresetTitle = function getTemplatePresetTitle(title, language) {
1303
+ var _language, _Object$values$;
1304
+ if (language === void 0) {
1305
+ language = i18n.language;
1306
+ }
1307
+ if (typeof title === 'string') {
1308
+ return title;
1309
+ }
1310
+ var languageCode = [language, (_language = language) == null ? void 0 : _language.split('-')[0], FALLBACK_TEMPLATE_LANGUAGE].find(function (code) {
1311
+ return code && title[code];
1312
+ });
1313
+ return languageCode ? title[languageCode] : (_Object$values$ = Object.values(title)[0]) != null ? _Object$values$ : '';
1314
+ };
1315
+ var findWorkspaceTemplatePreset = function findWorkspaceTemplatePreset(defaultPresets, presetId) {
1316
+ return (defaultPresets != null ? defaultPresets : []).find(function (preset) {
1317
+ return (preset.id || undefined) === (presetId || undefined);
1318
+ });
1319
+ };
1320
+ var isWorkspaceTemplatePresetId = function isWorkspaceTemplatePresetId(defaultPresets, presetId) {
1321
+ return findWorkspaceTemplatePreset(defaultPresets, presetId) !== undefined;
1322
+ };
1323
+ var toWorkspacePresetFromTemplate = function toWorkspacePresetFromTemplate(preset, language) {
1324
+ var views = preset.views,
1325
+ rest = _objectWithoutPropertiesLoose(preset, _excluded$7);
1326
+ return Object.assign({}, rest, {
1327
+ title: getTemplatePresetTitle(preset.title, language),
1328
+ views: {
1329
+ allIds: views.allIds,
1330
+ byId: Object.fromEntries(views.allIds.map(function (viewId) {
1331
+ var view = views.byId[viewId];
1332
+ return [viewId, Object.assign({}, view, {
1333
+ title: view.title === undefined ? undefined : getTemplatePresetTitle(view.title, language)
1334
+ })];
1335
+ }))
1336
+ }
1337
+ });
1338
+ };
1339
+ var getEmptyMapWorkspaceTitles = function getEmptyMapWorkspaceTitles(preset, language) {
1340
+ var _views$byId$views$all, _views$byId$views$all2;
1341
+ var _toWorkspacePresetFro = toWorkspacePresetFromTemplate(preset, language),
1342
+ title = _toWorkspacePresetFro.title,
1343
+ views = _toWorkspacePresetFro.views;
1344
+ return {
1345
+ newWorkspaceText: title,
1346
+ newMapPresetText: (_views$byId$views$all = (_views$byId$views$all2 = views.byId[views.allIds[0]]) == null ? void 0 : _views$byId$views$all2.title) != null ? _views$byId$views$all : title
1329
1347
  };
1330
- }();
1331
- var updateViewPreset = /*#__PURE__*/function () {
1332
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(viewpresetId, data, auth) {
1333
- return _regenerator().w(function (_context3) {
1334
- while (1) switch (_context3.n) {
1335
- case 0:
1336
- return _context3.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewpresetId, {
1337
- headers: getHeaders(auth),
1338
- method: 'PUT',
1339
- body: JSON.stringify(data)
1340
- }).then(handleResponse));
1341
- }
1342
- }, _callee3);
1343
- }));
1344
- return function updateViewPreset(_x4, _x5, _x6) {
1345
- return _ref3.apply(this, arguments);
1348
+ };
1349
+ var toWorkspaceTemplateListItem = function toWorkspaceTemplateListItem(preset, language) {
1350
+ var _preset$scope, _preset$abstract, _preset$viewType;
1351
+ return {
1352
+ id: preset.id,
1353
+ title: getTemplatePresetTitle(preset.title, language),
1354
+ labels: preset.labels,
1355
+ scope: (_preset$scope = preset.scope) != null ? _preset$scope : 'system',
1356
+ "abstract": (_preset$abstract = preset["abstract"]) != null ? _preset$abstract : '',
1357
+ viewType: (_preset$viewType = preset.viewType) != null ? _preset$viewType : 'singleWindow',
1358
+ isWorkspaceTemplate: true
1346
1359
  };
1347
- }();
1348
- var saveViewPreset = /*#__PURE__*/function () {
1349
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(viewPresetId, data, auth) {
1350
- var payload;
1351
- return _regenerator().w(function (_context4) {
1352
- while (1) switch (_context4.n) {
1353
- case 0:
1354
- payload = data.initialProps === null ? Object.assign({}, data, {
1355
- initialProps: {}
1356
- }) : data;
1357
- return _context4.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewPresetId + "/", {
1358
- headers: getHeaders(auth),
1359
- method: 'PUT',
1360
- body: JSON.stringify(payload)
1361
- }).then(handleResponse));
1362
- }
1363
- }, _callee4);
1364
- }));
1365
- return function saveViewPreset(_x7, _x8, _x9) {
1366
- return _ref4.apply(this, arguments);
1367
- };
1368
- }();
1369
- var saveViewPresetAs = /*#__PURE__*/function () {
1370
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(data, auth) {
1371
- var _response$headers$get;
1372
- var payload, response, headerLocation;
1373
- return _regenerator().w(function (_context5) {
1374
- while (1) switch (_context5.n) {
1375
- case 0:
1376
- payload = data.initialProps === null ? Object.assign({}, data, {
1377
- initialProps: {}
1378
- }) : data;
1379
- _context5.n = 1;
1380
- return fetch(getPresetBaseUrl() + "/viewpreset/", {
1381
- headers: getHeaders(auth),
1382
- method: 'POST',
1383
- body: JSON.stringify(payload)
1384
- });
1385
- case 1:
1386
- response = _context5.v;
1387
- _context5.n = 2;
1388
- return handleResponse(response);
1389
- case 2:
1390
- headerLocation = (_response$headers$get = response.headers.get('Location')) != null ? _response$headers$get : response.headers.get('location');
1391
- return _context5.a(2, getIdFromUrl(headerLocation));
1392
- }
1393
- }, _callee5);
1394
- }));
1395
- return function saveViewPresetAs(_x0, _x1) {
1396
- return _ref5.apply(this, arguments);
1397
- };
1398
- }();
1399
- var deleteViewPreset = /*#__PURE__*/function () {
1400
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(viewPresetId, auth) {
1401
- return _regenerator().w(function (_context6) {
1402
- while (1) switch (_context6.n) {
1403
- case 0:
1404
- return _context6.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewPresetId, {
1405
- method: 'DELETE',
1406
- headers: getHeaders(auth)
1407
- }).then(handleResponse));
1408
- }
1409
- }, _callee6);
1410
- }));
1411
- return function deleteViewPreset(_x10, _x11) {
1412
- return _ref6.apply(this, arguments);
1413
- };
1414
- }();
1415
-
1416
- var API_KEY$1 = 'viewpreset-api';
1417
- var generateViewPresetQueryKeys = function generateViewPresetQueryKeys() {
1418
- for (var _len = arguments.length, queryKeys = new Array(_len), _key = 0; _key < _len; _key++) {
1419
- queryKeys[_key] = arguments[_key];
1420
- }
1421
- return [LIB_KEY, API_KEY$1].concat(queryKeys);
1422
1360
  };
1423
- var viewpresetQueryOptions = {
1424
- keys: {
1425
- all: function all() {
1426
- return generateViewPresetQueryKeys();
1427
- },
1428
- views: function views() {
1429
- return [].concat(viewpresetQueryOptions.keys.all(), ['view']);
1430
- },
1431
- lists: function lists() {
1432
- return [].concat(viewpresetQueryOptions.keys.all(), ['list']);
1433
- }
1434
- },
1435
- getViewPreset: function getViewPreset$1(id, credentials) {
1436
- return queryOptions({
1437
- queryKey: [].concat(viewpresetQueryOptions.keys.views(), [id]),
1438
- queryFn: function () {
1439
- var _queryFn = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1440
- return _regenerator().w(function (_context) {
1441
- while (1) switch (_context.n) {
1442
- case 0:
1443
- return _context.a(2, getViewPreset(id, credentials));
1444
- }
1445
- }, _callee);
1446
- }));
1447
- function queryFn() {
1448
- return _queryFn.apply(this, arguments);
1449
- }
1450
- return queryFn;
1451
- }()
1452
- });
1453
- },
1454
- getViewPresets: function getViewPresets(credentials) {
1455
- return queryOptions({
1456
- queryKey: viewpresetQueryOptions.keys.lists(),
1457
- queryFn: function () {
1458
- var _queryFn2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
1459
- return _regenerator().w(function (_context2) {
1460
- while (1) switch (_context2.n) {
1461
- case 0:
1462
- return _context2.a(2, getViewPresets$1(credentials));
1463
- }
1464
- }, _callee2);
1465
- }));
1466
- function queryFn() {
1467
- return _queryFn2.apply(this, arguments);
1468
- }
1469
- return queryFn;
1470
- }(),
1471
- staleTime: 2 * 60 * 1000,
1472
- refetchOnMount: true
1473
- });
1474
- },
1475
- saveViewPreset: function saveViewPreset$1(id, data, credentials) {
1476
- return queryOptions({
1477
- queryKey: [].concat(viewpresetQueryOptions.keys.views(), [id, 'save']),
1478
- staleTime: 0,
1479
- queryFn: function () {
1480
- var _queryFn3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
1481
- return _regenerator().w(function (_context3) {
1482
- while (1) switch (_context3.n) {
1483
- case 0:
1484
- return _context3.a(2, saveViewPreset(id, data, credentials));
1485
- }
1486
- }, _callee3);
1487
- }));
1488
- function queryFn() {
1489
- return _queryFn3.apply(this, arguments);
1490
- }
1491
- return queryFn;
1492
- }()
1493
- });
1494
- },
1495
- saveViewPresetAs: function saveViewPresetAs$1(data, credentials) {
1496
- return queryOptions({
1497
- queryKey: [].concat(viewpresetQueryOptions.keys.views(), ['save-as']),
1498
- staleTime: 0,
1499
- queryFn: function () {
1500
- var _queryFn4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
1501
- return _regenerator().w(function (_context4) {
1502
- while (1) switch (_context4.n) {
1503
- case 0:
1504
- return _context4.a(2, saveViewPresetAs(data, credentials));
1505
- }
1506
- }, _callee4);
1507
- }));
1508
- function queryFn() {
1509
- return _queryFn4.apply(this, arguments);
1510
- }
1511
- return queryFn;
1512
- }()
1361
+ var toWorkspaceTemplateListItems = function toWorkspaceTemplateListItems(defaultPresets, language) {
1362
+ return (defaultPresets != null ? defaultPresets : []).map(function (preset) {
1363
+ return toWorkspaceTemplateListItem(preset, language);
1364
+ });
1365
+ };
1366
+ var getBEViewsFromState = function getBEViewsFromState(workspace) {
1367
+ var _workspace$views$allI, _workspace$views;
1368
+ var result = [];
1369
+ ((_workspace$views$allI = workspace == null || (_workspace$views = workspace.views) == null ? void 0 : _workspace$views.allIds) != null ? _workspace$views$allI : []).forEach(function (id) {
1370
+ var _workspace$views$byId;
1371
+ var view = (_workspace$views$byId = workspace.views.byId[id]) != null ? _workspace$views$byId : {};
1372
+ result.push({
1373
+ mosaicNodeId: id,
1374
+ title: typeof view.title === 'string' && view.title.trim() ? view.title : id,
1375
+ componentType: view.componentType,
1376
+ initialProps: view.initialProps
1513
1377
  });
1378
+ });
1379
+ return result;
1380
+ };
1381
+ var togglePresetFilter = function togglePresetFilter(filters, id, isSelected, isAdmin, isFavouritesEnabled, isTemplatesEnabled) {
1382
+ if (isAdmin === void 0) {
1383
+ isAdmin = false;
1514
1384
  }
1385
+ if (isFavouritesEnabled === void 0) {
1386
+ isFavouritesEnabled = true;
1387
+ }
1388
+ if (isTemplatesEnabled === void 0) {
1389
+ isTemplatesEnabled = true;
1390
+ }
1391
+ if (!filters.some(function (filter) {
1392
+ return filter.id === id;
1393
+ })) {
1394
+ return filters;
1395
+ }
1396
+ var availableFilters = filters.filter(function (filter) {
1397
+ if (filter.id === PresetFilterType.favourites) {
1398
+ return isFavouritesEnabled;
1399
+ }
1400
+ if (filter.id === PresetFilterType.templates && !isTemplatesEnabled) {
1401
+ return false;
1402
+ }
1403
+ return !isAdmin || filter.id === PresetFilterType.system || filter.id === PresetFilterType.shared || filter.id === PresetFilterType.templates;
1404
+ });
1405
+ var allSelected = availableFilters.every(function (filter) {
1406
+ return filter.isSelected;
1407
+ });
1408
+ var allUnselected = availableFilters.every(function (filter) {
1409
+ return filter.id === id ? !isSelected : !filter.isSelected;
1410
+ });
1411
+ return filters.map(function (filter) {
1412
+ if (allSelected) {
1413
+ return Object.assign({}, filter, {
1414
+ isSelected: filter.id === id && isSelected
1415
+ });
1416
+ }
1417
+ // Admins select one scope at a time, deselecting goes through the
1418
+ // regular flow so the last deselected chip falls back to all
1419
+ if (isAdmin && isSelected && id !== PresetFilterType.favourites && filter.id !== PresetFilterType.favourites) {
1420
+ return Object.assign({}, filter, {
1421
+ isSelected: filter.id === id
1422
+ });
1423
+ }
1424
+ return Object.assign({}, filter, {
1425
+ isSelected: allUnselected || (filter.id === id ? isSelected : filter.isSelected)
1426
+ });
1427
+ });
1515
1428
  };
1516
1429
 
1517
1430
  /* *
@@ -1531,14 +1444,134 @@ var viewpresetQueryOptions = {
1531
1444
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
1532
1445
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1533
1446
  * */
1534
- var routes = {
1535
- root: '/',
1536
- workspace: '/workspace',
1537
- workspaceDetail: '/workspace/:workspaceId'
1447
+ var personalFilterState = {
1448
+ label: 'shared-filter-my-presets',
1449
+ id: PresetFilterType.personal,
1450
+ isSelected: true,
1451
+ isDisabled: false
1538
1452
  };
1539
- var getWorkspaceRouteUrl = function getWorkspaceRouteUrl(workspaceId) {
1540
- return workspaceId ? routes.workspaceDetail.replace(':workspaceId', workspaceId) : routes.workspace;
1453
+ var systemFilterState = {
1454
+ label: 'shared-filter-system-presets',
1455
+ id: PresetFilterType.system,
1456
+ isSelected: true,
1457
+ isDisabled: false
1541
1458
  };
1459
+ var sharedFilterState = {
1460
+ label: 'shared-filter-shared-presets',
1461
+ id: PresetFilterType.shared,
1462
+ isSelected: true,
1463
+ isDisabled: false
1464
+ };
1465
+ ({
1466
+ id: PresetFilterType.plugin});
1467
+ var templatesFilterState = {
1468
+ label: 'shared-filter-template-presets',
1469
+ id: PresetFilterType.templates,
1470
+ isSelected: true,
1471
+ isDisabled: false
1472
+ };
1473
+ var favouriteFilterState = {
1474
+ label: 'workspace-favourites',
1475
+ id: PresetFilterType.favourites,
1476
+ isSelected: true,
1477
+ isDisabled: false
1478
+ };
1479
+ var defaultPresetFilterState = [personalFilterState, systemFilterState, sharedFilterState, templatesFilterState, favouriteFilterState];
1480
+ var ADMIN_WORKSPACE_FILTER_IDS = [PresetFilterType.system, PresetFilterType.shared, PresetFilterType.templates, PresetFilterType.favourites];
1481
+ var initialState$2 = {
1482
+ error: undefined,
1483
+ isWorkspaceListDialogOpen: false,
1484
+ searchQuery: '',
1485
+ workspaceListFilters: defaultPresetFilterState,
1486
+ workspaceLabelFilters: undefined
1487
+ };
1488
+ var slice$2 = createSlice({
1489
+ initialState: initialState$2,
1490
+ name: 'workspaceList',
1491
+ reducers: {
1492
+ openWorkspaceActionDialogOptions: function openWorkspaceActionDialogOptions(draft, action) {
1493
+ draft.workspaceActionDialog = Object.assign({}, action.payload, {
1494
+ error: undefined
1495
+ });
1496
+ },
1497
+ onSuccessWorkspaceSaveDialog: function onSuccessWorkspaceSaveDialog(draft, action) {
1498
+ if (!draft.workspaceActionDialog) {
1499
+ return;
1500
+ }
1501
+ var presetId = action.payload.presetId;
1502
+ if (presetId) {
1503
+ draft.workspaceActionDialog.presetId = presetId;
1504
+ }
1505
+ draft.workspaceActionDialog.hasSaved = true;
1506
+ },
1507
+ submitFormWorkspaceActionDialogOptions: function submitFormWorkspaceActionDialogOptions(draft, _action) {
1508
+ if (!draft.workspaceActionDialog) {
1509
+ return;
1510
+ }
1511
+ draft.workspaceActionDialog.error = undefined;
1512
+ },
1513
+ closeWorkspaceActionDialogOptions: function closeWorkspaceActionDialogOptions(draft) {
1514
+ delete draft.workspaceActionDialog;
1515
+ },
1516
+ // action is intercepted in mapPresets/listener
1517
+ onSuccessWorkspacePresetAction: function onSuccessWorkspacePresetAction(draft, _action) {
1518
+ delete draft.workspaceActionDialog;
1519
+ },
1520
+ onErrorWorkspacePresetAction: function onErrorWorkspacePresetAction(draft, action) {
1521
+ var error = action.payload.error;
1522
+ if (draft.workspaceActionDialog) {
1523
+ draft.workspaceActionDialog.error = error;
1524
+ } else {
1525
+ // fallback if dialog isn't open (e.g. SHARE action)
1526
+ draft.error = error;
1527
+ }
1528
+ },
1529
+ toggleWorkspaceDialog: function toggleWorkspaceDialog(draft, action) {
1530
+ var isListDialogOpen = action.payload.isWorkspaceListDialogOpen;
1531
+ draft.isWorkspaceListDialogOpen = isListDialogOpen;
1532
+ },
1533
+ toggleSelectFilterChip: function toggleSelectFilterChip(draft, action) {
1534
+ var _action$payload = action.payload,
1535
+ id = _action$payload.id,
1536
+ isSelected = _action$payload.isSelected,
1537
+ isAdmin = _action$payload.isAdmin,
1538
+ isFavouritesEnabled = _action$payload.isFavouritesEnabled,
1539
+ isTemplatesEnabled = _action$payload.isTemplatesEnabled;
1540
+ draft.workspaceListFilters = togglePresetFilter(draft.workspaceListFilters, id, isSelected, isAdmin, isFavouritesEnabled, isTemplatesEnabled);
1541
+ },
1542
+ setSelectAllFilterChip: function setSelectAllFilterChip(draft) {
1543
+ draft.workspaceListFilters = draft.workspaceListFilters.map(function (filter) {
1544
+ return Object.assign({}, filter, {
1545
+ isSelected: true
1546
+ });
1547
+ });
1548
+ },
1549
+ setFilterChips: function setFilterChips(draft, action) {
1550
+ var payload = action.payload;
1551
+ draft.workspaceListFilters.forEach(function (filter, index) {
1552
+ var existingFilter = payload.find(function (existingFilter) {
1553
+ return existingFilter.id === filter.id;
1554
+ });
1555
+ var updatedFilter = Object.assign({}, filter, {
1556
+ isSelected: existingFilter ? existingFilter.isSelected : filter.isSelected
1557
+ });
1558
+ draft.workspaceListFilters[index] = updatedFilter;
1559
+ });
1560
+ },
1561
+ setWorkspaceLabelFilters: function setWorkspaceLabelFilters(draft, action) {
1562
+ draft.workspaceLabelFilters = action.payload.labels;
1563
+ },
1564
+ clearLabelFilters: function clearLabelFilters(draft) {
1565
+ draft.workspaceLabelFilters = undefined;
1566
+ },
1567
+ searchFilter: function searchFilter(draft, action) {
1568
+ var searchQuery = action.payload.searchQuery;
1569
+ draft.searchQuery = searchQuery;
1570
+ }
1571
+ }
1572
+ });
1573
+ var workspaceListReducer = slice$2.reducer,
1574
+ workspaceListActions = slice$2.actions;
1542
1575
 
1543
1576
  /* *
1544
1577
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1557,866 +1590,307 @@ var getWorkspaceRouteUrl = function getWorkspaceRouteUrl(workspaceId) {
1557
1590
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
1558
1591
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1559
1592
  * */
1560
- var WorkspacePresetAction;
1561
- (function (WorkspacePresetAction) {
1562
- WorkspacePresetAction["DELETE"] = "DELETE";
1563
- WorkspacePresetAction["EDIT"] = "EDIT";
1564
- WorkspacePresetAction["SAVE"] = "SAVE";
1565
- WorkspacePresetAction["SAVE_AS"] = "SAVE_AS";
1566
- WorkspacePresetAction["DUPLICATE"] = "DUPLICATE";
1567
- WorkspacePresetAction["SAVE_SYSTEM_PRESET"] = "SAVE_SYSTEM_PRESET";
1568
- WorkspacePresetAction["SAVE_SYSTEM_PRESET_AS"] = "SAVE_SYSTEM_PRESET_AS";
1569
- WorkspacePresetAction["RESET"] = "RESET";
1570
- WorkspacePresetAction["DELETE_SYSTEM_PRESET"] = "DELETE_SYSTEM_PRESET";
1571
- WorkspacePresetAction["SHARE"] = "SHARE";
1572
- WorkspacePresetAction["OPEN_TAB"] = "OPEN_TAB";
1573
- WorkspacePresetAction["EDIT_TITLE"] = "EDIT_TITLE";
1574
- WorkspacePresetAction["COPY_TO_CLIPBOARD"] = "COPY_TO_CLIPBOARD";
1575
- })(WorkspacePresetAction || (WorkspacePresetAction = {}));
1576
- var WorkspaceErrorType;
1577
- (function (WorkspaceErrorType) {
1578
- WorkspaceErrorType["NOT_FOUND"] = "NOT_FOUND";
1579
- WorkspaceErrorType["GENERIC"] = "GENERIC";
1580
- WorkspaceErrorType["SAVE"] = "SAVE";
1581
- })(WorkspaceErrorType || (WorkspaceErrorType = {}));
1582
-
1583
- var AVIATION_COMPONENT_TYPES = ['AirmetModule', 'SigmetModule'];
1584
- var CAP_COMPONENT_TYPES = ['CapWarningList', 'CapWarningMap'];
1585
- // 1) Map-like components
1586
- var SUPPORTED_COMPONENT_TYPES = ['Map', 'MultiMap', 'ModelRunInterval', 'HarmonieTempAndPrecipPreset', 'TimeSlider'];
1587
- // 2) TimeSeries components
1588
- var SUPPORTED_TIMESERIES_COMPONENT_TYPES = ['TimeSeries'];
1589
- // or keep your old union type if it already exists
1590
- // 3) Warning list components
1591
- var WARNING_LIST_COMPONENT_TYPES = ['WarningList', 'MaritimeWarnings', 'WarningsTimeline'];
1592
- // TODO: expand it and move to a more centralized place
1593
- var ALL_COMPONENT_TYPES = [].concat(SUPPORTED_COMPONENT_TYPES, SUPPORTED_TIMESERIES_COMPONENT_TYPES, WARNING_LIST_COMPONENT_TYPES, AVIATION_COMPONENT_TYPES, CAP_COMPONENT_TYPES, ['TafModule', 'TrajksModule', 'SpaceweatherModule', 'Plugin', 'Soundings']);
1594
- var ViewPresetErrorComponent;
1595
- (function (ViewPresetErrorComponent) {
1596
- ViewPresetErrorComponent["PRESET_DETAIL"] = "PRESET_DETAIL";
1597
- ViewPresetErrorComponent["PRESET_LIST"] = "PRESET_LIST";
1598
- })(ViewPresetErrorComponent || (ViewPresetErrorComponent = {}));
1599
- var ViewPresetErrorType;
1600
- (function (ViewPresetErrorType) {
1601
- ViewPresetErrorType["AUTH"] = "AUTH";
1602
- ViewPresetErrorType["GENERIC"] = "GENERIC";
1603
- })(ViewPresetErrorType || (ViewPresetErrorType = {}));
1604
- var PresetAction;
1605
- (function (PresetAction) {
1606
- PresetAction["OPEN"] = "Open";
1607
- PresetAction["DELETE"] = "Delete";
1608
- PresetAction["SAVE"] = "Save";
1609
- PresetAction["SAVE_AS"] = "Save as";
1610
- PresetAction["SHARE"] = "Share";
1611
- PresetAction["EDIT"] = "Edit";
1612
- PresetAction["RESET"] = "Reset";
1613
- })(PresetAction || (PresetAction = {}));
1614
-
1615
- /* *
1616
- * Licensed under the Apache License, Version 2.0 (the "License");
1617
- * you may not use this file except in compliance with the License.
1618
- * You may obtain a copy of the License at
1619
- *
1620
- * http://www.apache.org/licenses/LICENSE-2.0
1621
- *
1622
- * Unless required by applicable law or agreed to in writing, software
1623
- * distributed under the License is distributed on an "AS IS" BASIS,
1624
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1625
- * See the License for the specific language governing permissions and
1626
- * limitations under the License.
1627
- *
1628
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1629
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
1630
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1631
- * */
1632
- var WorkspaceListErrorCategory;
1633
- (function (WorkspaceListErrorCategory) {
1634
- WorkspaceListErrorCategory["AUTH"] = "AUTH";
1635
- WorkspaceListErrorCategory["GENERIC"] = "GENERIC";
1636
- })(WorkspaceListErrorCategory || (WorkspaceListErrorCategory = {}));
1637
- var WorkspaceListErrorType;
1638
- (function (WorkspaceListErrorType) {
1639
- WorkspaceListErrorType["TRANSLATABLE_ERROR"] = "TRANSLATABLE_ERROR";
1640
- WorkspaceListErrorType["VERBATIM_ERROR"] = "VERBATIM_ERROR";
1641
- })(WorkspaceListErrorType || (WorkspaceListErrorType = {}));
1642
- var PresetFilterType;
1643
- (function (PresetFilterType) {
1644
- PresetFilterType["personal"] = "personal";
1645
- PresetFilterType["shared"] = "shared";
1646
- PresetFilterType["system"] = "system";
1647
- PresetFilterType["plugin"] = "plugin";
1648
- PresetFilterType["templates"] = "templates";
1649
- PresetFilterType["favourites"] = "favourites";
1650
- })(PresetFilterType || (PresetFilterType = {}));
1651
-
1652
- /* *
1653
- * Licensed under the Apache License, Version 2.0 (the "License");
1654
- * you may not use this file except in compliance with the License.
1655
- * You may obtain a copy of the License at
1656
- *
1657
- * http://www.apache.org/licenses/LICENSE-2.0
1658
- *
1659
- * Unless required by applicable law or agreed to in writing, software
1660
- * distributed under the License is distributed on an "AS IS" BASIS,
1661
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1662
- * See the License for the specific language governing permissions and
1663
- * limitations under the License.
1664
- *
1665
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1666
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
1667
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1668
- * */
1669
- var WORKSPACE_NAMESPACE = 'workspace';
1670
- var initWorkspaceTestI18n = function initWorkspaceTestI18n() {
1671
- safelyInitI18nForTestsAndStories(i18n, WORKSPACE_NAMESPACE, [{
1672
- ns: WORKSPACE_NAMESPACE,
1673
- translations: workspaceTranslations
1674
- }, {
1675
- ns: SHARED_NAMESPACE,
1676
- translations: sharedTranslations
1677
- }, {
1678
- ns: CORE_NAMESPACE,
1679
- translations: coreTranslations
1680
- }, {
1681
- ns: WEBMAP_REACT_NAMESPACE,
1682
- translations: webmapReactTranslations
1683
- }, {
1684
- ns: FORM_FIELDS_NAMESPACE,
1685
- translations: formFieldsTranslations
1686
- }, {
1687
- ns: WARN_NAMESPACE,
1688
- translations: warningsTranslations
1689
- }]);
1690
- };
1691
- var ns = [WORKSPACE_NAMESPACE, SHARED_NAMESPACE];
1692
- var useWorkspaceTranslation = function useWorkspaceTranslation() {
1693
- return useTranslation(ns);
1593
+ var defaultViewPresetsFilters = [{
1594
+ label: 'shared-filter-my-view-presets',
1595
+ id: PresetFilterType.personal,
1596
+ isSelected: true,
1597
+ isDisabled: false
1598
+ }, {
1599
+ label: 'shared-filter-system-view-presets',
1600
+ id: PresetFilterType.system,
1601
+ isSelected: true,
1602
+ isDisabled: false
1603
+ }, {
1604
+ label: 'shared-filter-shared-view-presets',
1605
+ id: PresetFilterType.shared,
1606
+ isSelected: true,
1607
+ isDisabled: false
1608
+ }, {
1609
+ label: 'shared-filter-template-presets',
1610
+ id: PresetFilterType.templates,
1611
+ isSelected: true,
1612
+ isDisabled: false
1613
+ }, favouriteFilterState];
1614
+ var ADMIN_VIEW_PRESET_FILTER_IDS = [PresetFilterType.system, PresetFilterType.shared, PresetFilterType.templates, PresetFilterType.favourites];
1615
+ var pluginViewPresetsFilter = {
1616
+ label: 'shared-filter-plugin-view-presets',
1617
+ id: PresetFilterType.plugin,
1618
+ isSelected: true,
1619
+ isDisabled: false
1694
1620
  };
1695
-
1696
- var _excluded$7 = ["views"];
1697
- var getSnackbarMessage$1 = function getSnackbarMessage(action, title, is_shared) {
1698
- // Trim and add quotes
1699
- var trimmedTitle = title.trim();
1700
- switch (action) {
1701
- case WorkspacePresetAction.DELETE:
1702
- return {
1703
- type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1704
- key: 'workspace-list-success-delete',
1705
- params: {
1706
- TITLE: trimmedTitle
1707
- }
1708
- };
1709
- case WorkspacePresetAction.DELETE_SYSTEM_PRESET:
1710
- return {
1711
- type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1712
- key: 'workspace-list-success-delete-system',
1713
- params: {
1714
- TITLE: trimmedTitle
1715
- }
1716
- };
1717
- case WorkspacePresetAction.DUPLICATE:
1718
- return {
1719
- type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1720
- key: 'workspace-list-success-duplicate',
1721
- params: {
1722
- TITLE: trimmedTitle
1723
- }
1724
- };
1725
- case WorkspacePresetAction.EDIT:
1726
- return {
1727
- type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1728
- key: 'workspace-list-success-edit',
1729
- params: {
1730
- TITLE: trimmedTitle
1731
- }
1732
- };
1733
- case WorkspacePresetAction.RESET:
1734
- return {
1735
- type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1736
- key: 'workspace-list-success-reset',
1737
- params: {
1738
- TITLE: trimmedTitle
1739
- }
1740
- };
1741
- case WorkspacePresetAction.SHARE:
1742
- return {
1743
- type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1744
- key: is_shared ? 'workspace-list-success-unshare' : 'workspace-list-success-share',
1745
- params: {
1746
- TITLE: trimmedTitle
1747
- }
1748
- };
1749
- default:
1750
- return {
1751
- type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1752
- key: 'workspace-list-success-save',
1753
- params: {
1754
- TITLE: trimmedTitle
1755
- }
1756
- };
1621
+ var viewPresetsAdapter = createEntityAdapter({
1622
+ // we use panelId as id (panelId can be mapId or viewId)
1623
+ selectId: function selectId(mapPreset) {
1624
+ return mapPreset.panelId;
1757
1625
  }
1758
- };
1759
- function getEmptyWorkspaceListItem(t) {
1760
- return {
1761
- id: undefined,
1762
- title: t ? t('workspace-new') : undefined,
1763
- labels: undefined,
1764
- scope: 'system',
1765
- "abstract": '',
1766
- viewType: 'singleWindow'
1767
- };
1768
- }
1769
- function getEmptyMapWorkspace(t) {
1770
- return Object.assign({}, getEmptyWorkspaceListItem(t), {
1771
- views: {
1772
- allIds: ['1_screen'],
1773
- byId: {
1774
- '1_screen': {
1775
- title: t ? t('workspace-mappreset-new') : undefined,
1776
- componentType: 'Map',
1777
- initialProps: {
1778
- mapPreset: {
1779
- shouldShowLayerManager: true,
1780
- dockedLayerManagerSize: 'sizeSmall'
1781
- },
1782
- syncGroupsIds: []
1783
- }
1626
+ });
1627
+ var initialState$1 = viewPresetsAdapter.getInitialState();
1628
+ var warningsPresetChangeActions = [warningsFiltersActions.setWarningFilters, warningsFiltersActions.setExpandedSectionsForPanel];
1629
+ var syncGroupChangeActions = [syncGroupsActions.syncGroupRemoveTarget, syncGroupsActions.syncGroupAddTarget];
1630
+ var mapPresetChangeActions = [layerActions.setBaseLayers, layerActions.layerDelete, layerActions.addLayer, layerActions.duplicateMapLayer, layerActions.layerChangeEnabled, layerActions.layerChangeName, layerActions.layerChangeStyle, layerActions.layerChangeOpacity, layerActions.layerChangeDimension, layerActions.layerChangeAcceptanceTime, layerActions.SetLayerLegendVisibilityPayload, mapActions.layerMoveLayer, mapActions.setAutoLayerId, mapActions.setAutoTimestepLayerId, mapActions.setAutoUpdateLayerId, mapActions.toggleAutoUpdate, mapActions.mapStartAnimation, mapActions.mapStopAnimation, mapActions.toggleTimeSliderIsVisible, mapActions.setTimeStep, mapActions.setTimeSliderSpan, mapActions.toggleTimeSpanAuto, mapActions.setAnimationDelay, mapActions.toggleTimestepAuto, mapActions.setAnimationStartTime, mapActions.setAnimationEndTime, mapActions.setAnimationLength, mapActions.changeOverlayer, uiActions.setActiveMapIdForDialog, uiActions.setToggleOpenDialog, genericActions.setBbox, mapActions.setBbox, mapActions.toggleClock, mapActions.toggleClockOptions, mapActions.setClockPositionSize, mapActions.setLegendPositionSize, mapActions.setDockedLayerManagerSize, mapActions.setDockedLayerManagerPosition, mapActions.setDockedLayerManagerDimensions];
1631
+ var pluginPresetChangeActions = [pluginsActions.setGeoWebPluginState];
1632
+ var timeSeriesPresetChangeActions = [timeSeriesActions.addParameter, timeSeriesActions.addPlot, timeSeriesActions.duplicatePlot, timeSeriesActions.deleteParameter, timeSeriesActions.deletePlot, timeSeriesActions.moveParameter, timeSeriesActions.movePlot, timeSeriesActions.toggleParameter, timeSeriesActions.togglePlot, timeSeriesActions.patchParameter, timeSeriesActions.updateTitle, timeSeriesActions.setLocationMenuSizeAndPosition, timeSeriesActions.setLocationsDialogOpen, timeSeriesActions.reorderPlots, timeSeriesActions.setPlotIsOpen, timeSeriesActions.setPlotSize];
1633
+ var soundingsChangeActions = [soundingsActions.updateSelectedSource, soundingsActions.updateSelectedLocation, soundingsActions.updateDiagramType, soundingsActions.toggleLocationMarkers, soundingsActions.updateProfileDataPreferences, soundingsActions.changeSoundingPanelOrder, soundingsActions.toggleSoundingPanelVisibility, soundingsActions.setPanelIsOpen, soundingsActions.setPanelCustomWidth, soundingsActions.toggleLegendVisibility, soundingsActions.updateSelectedTime, soundingsActions.toggleTimeSliderVisibility, soundingsActions.setLocationMenuSizeAndPosition, soundingsActions.setLocationsMenuOpen];
1634
+ var supportedMapActionOrigins = [layerTypes.LayerActionOrigin.layerManager, layerTypes.LayerActionOrigin.legend, layerTypes.LayerActionOrigin.wmsLoader, mapEnums.MapActionOrigin.map];
1635
+ var supportedTimeSeriesActionOrigins = [TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesManager, TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesSelect];
1636
+ var supportedSoundingsActionOrigins = [SoundingsTypes.SoundingsActionOrigin.soundingsComponent, SoundingsTypes.SoundingsActionOrigin.soundingsManager];
1637
+ var slice$1 = createSlice({
1638
+ initialState: initialState$1,
1639
+ name: 'viewPresets',
1640
+ reducers: {
1641
+ // fetch list actions
1642
+ fetchViewPresets: function fetchViewPresets(draft, action) {
1643
+ var panelId = action.payload.panelId;
1644
+ var entity = draft.entities[panelId];
1645
+ if (entity) {
1646
+ entity.isFetching = true;
1647
+ entity.error = undefined;
1648
+ viewPresetsAdapter.setOne(draft, entity);
1649
+ }
1650
+ },
1651
+ fetchedViewPreset: function fetchedViewPreset(draft, action) {
1652
+ var _action$payload = action.payload,
1653
+ panelId = _action$payload.panelId,
1654
+ mapPresetId = _action$payload.viewPresetId;
1655
+ var entity = draft.entities[panelId];
1656
+ if (entity) {
1657
+ entity.isFetching = false;
1658
+ entity.activeViewPresetId = mapPresetId;
1659
+ entity.hasChanges = false;
1660
+ entity.error = undefined;
1661
+ viewPresetsAdapter.setOne(draft, entity);
1662
+ }
1663
+ },
1664
+ saveViewPreset: function saveViewPreset(draft, action) {
1665
+ var panelId = action.payload.panelId;
1666
+ var entity = draft.entities[panelId];
1667
+ if (entity) {
1668
+ entity.isFetching = true;
1669
+ entity.error = undefined;
1670
+ viewPresetsAdapter.setOne(draft, entity);
1671
+ }
1672
+ },
1673
+ savedViewPreset: function savedViewPreset(draft, action) {
1674
+ var _action$payload2 = action.payload,
1675
+ panelId = _action$payload2.panelId,
1676
+ viewPresetId = _action$payload2.viewPresetId;
1677
+ var entity = draft.entities[panelId];
1678
+ if (entity) {
1679
+ entity.isFetching = false;
1680
+ entity.hasChanges = false;
1681
+ entity.activeViewPresetId = viewPresetId;
1682
+ viewPresetsAdapter.setOne(draft, entity);
1683
+ }
1684
+ },
1685
+ errorViewPreset: function errorViewPreset(draft, action) {
1686
+ var _action$payload3 = action.payload,
1687
+ panelId = _action$payload3.panelId,
1688
+ error = _action$payload3.error;
1689
+ var entity = draft.entities[panelId];
1690
+ if (entity) {
1691
+ entity.error = error;
1692
+ entity.isFetching = false;
1693
+ viewPresetsAdapter.setOne(draft, entity);
1694
+ }
1695
+ },
1696
+ // map actions
1697
+ setViewPresetHasChanges: function setViewPresetHasChanges(draft, action) {
1698
+ var _action$payload4 = action.payload,
1699
+ panelId = _action$payload4.panelId,
1700
+ hasChanges = _action$payload4.hasChanges;
1701
+ var entity = draft.entities[panelId];
1702
+ if (entity) {
1703
+ entity.hasChanges = hasChanges;
1704
+ viewPresetsAdapter.setOne(draft, entity);
1705
+ }
1706
+ },
1707
+ setViewPresetInline: function setViewPresetInline(draft, action) {
1708
+ var _action$payload5 = action.payload,
1709
+ panelId = _action$payload5.panelId,
1710
+ isInline = _action$payload5.isInline;
1711
+ var entity = draft.entities[panelId];
1712
+ if (entity) {
1713
+ if (isInline) {
1714
+ entity.activeViewPresetId = '';
1784
1715
  }
1716
+ viewPresetsAdapter.setOne(draft, entity);
1785
1717
  }
1786
1718
  },
1787
- mosaicNode: '1_screen'
1788
- });
1789
- }
1790
- var getEmptyWorkspacePreset = function getEmptyWorkspacePreset() {
1791
- return {
1792
- scope: 'system',
1793
- "abstract": '',
1794
- views: {
1795
- allIds: ['1_screen'],
1796
- byId: {
1797
- '1_screen': {
1798
- componentType: 'Map',
1799
- initialProps: {
1800
- mapPreset: {
1801
- shouldShowLayerManager: true,
1802
- dockedLayerManagerSize: 'sizeSmall'
1803
- },
1804
- syncGroupsIds: []
1805
- }
1719
+ setActiveViewPresetId: function setActiveViewPresetId(draft, action) {
1720
+ var _action$payload6 = action.payload,
1721
+ panelId = _action$payload6.panelId,
1722
+ mapPresetId = _action$payload6.viewPresetId;
1723
+ var entity = draft.entities[panelId];
1724
+ if (entity) {
1725
+ entity.activeViewPresetId = mapPresetId;
1726
+ entity.hasChanges = false;
1727
+ viewPresetsAdapter.setOne(draft, entity);
1728
+ }
1729
+ },
1730
+ selectViewPreset: function selectViewPreset(draft, action) {
1731
+ var _action$payload7 = action.payload,
1732
+ panelId = _action$payload7.panelId,
1733
+ mapPresetId = _action$payload7.viewPresetId;
1734
+ var entity = draft.entities[panelId];
1735
+ if (entity) {
1736
+ // only update activeMapPresetId after selecting a NEW preset
1737
+ // existing mapPresets are getting an activeMapPresetId after a succesfull fetch
1738
+ if (mapPresetId === '') {
1739
+ entity.activeViewPresetId = '';
1740
+ entity.error = undefined;
1806
1741
  }
1742
+ entity.isViewPresetListDialogOpen = false;
1743
+ viewPresetsAdapter.setOne(draft, entity);
1807
1744
  }
1808
1745
  },
1809
- mosaicNode: '1_screen',
1810
- viewType: 'singleWindow',
1811
- username: 'global'
1812
- };
1813
- };
1814
- var createCustomEmptyMapWorkspace = function createCustomEmptyMapWorkspace(emptyWorkspaceTitle, emptyMapWorkspaceTitle, customMapPreset) {
1815
- var customEmptyMapWorkspace = cloneDeep(getEmptyWorkspacePreset());
1816
- if (customMapPreset) {
1817
- customEmptyMapWorkspace.views.byId['1_screen'].initialProps.mapPreset = customMapPreset;
1818
- }
1819
- customEmptyMapWorkspace.views.byId['1_screen'].title = emptyMapWorkspaceTitle;
1820
- var emptyWorkspacePreset = Object.assign({}, customEmptyMapWorkspace, {
1821
- title: emptyWorkspaceTitle
1822
- });
1823
- return emptyWorkspacePreset;
1824
- };
1825
- var FALLBACK_TEMPLATE_LANGUAGE = 'en';
1826
- // Falls back to English and then to the first title, so a template does not
1827
- // need a title for every language
1828
- var getTemplatePresetTitle = function getTemplatePresetTitle(title, language) {
1829
- var _language, _Object$values$;
1830
- if (language === void 0) {
1831
- language = i18n.language;
1832
- }
1833
- if (typeof title === 'string') {
1834
- return title;
1835
- }
1836
- var languageCode = [language, (_language = language) == null ? void 0 : _language.split('-')[0], FALLBACK_TEMPLATE_LANGUAGE].find(function (code) {
1837
- return code && title[code];
1838
- });
1839
- return languageCode ? title[languageCode] : (_Object$values$ = Object.values(title)[0]) != null ? _Object$values$ : '';
1840
- };
1841
- var findWorkspaceTemplatePreset = function findWorkspaceTemplatePreset(defaultPresets, presetId) {
1842
- return (defaultPresets != null ? defaultPresets : []).find(function (preset) {
1843
- return (preset.id || undefined) === (presetId || undefined);
1844
- });
1845
- };
1846
- var isWorkspaceTemplatePresetId = function isWorkspaceTemplatePresetId(defaultPresets, presetId) {
1847
- return findWorkspaceTemplatePreset(defaultPresets, presetId) !== undefined;
1848
- };
1849
- var toWorkspacePresetFromTemplate = function toWorkspacePresetFromTemplate(preset, language) {
1850
- var views = preset.views,
1851
- rest = _objectWithoutPropertiesLoose(preset, _excluded$7);
1852
- return Object.assign({}, rest, {
1853
- title: getTemplatePresetTitle(preset.title, language),
1854
- views: {
1855
- allIds: views.allIds,
1856
- byId: Object.fromEntries(views.allIds.map(function (viewId) {
1857
- var view = views.byId[viewId];
1858
- return [viewId, Object.assign({}, view, {
1859
- title: view.title === undefined ? undefined : getTemplatePresetTitle(view.title, language)
1860
- })];
1861
- }))
1862
- }
1863
- });
1864
- };
1865
- var getEmptyMapWorkspaceTitles = function getEmptyMapWorkspaceTitles(preset, language) {
1866
- var _views$byId$views$all, _views$byId$views$all2;
1867
- var _toWorkspacePresetFro = toWorkspacePresetFromTemplate(preset, language),
1868
- title = _toWorkspacePresetFro.title,
1869
- views = _toWorkspacePresetFro.views;
1870
- return {
1871
- newWorkspaceText: title,
1872
- newMapPresetText: (_views$byId$views$all = (_views$byId$views$all2 = views.byId[views.allIds[0]]) == null ? void 0 : _views$byId$views$all2.title) != null ? _views$byId$views$all : title
1873
- };
1874
- };
1875
- var toWorkspaceTemplateListItem = function toWorkspaceTemplateListItem(preset, language) {
1876
- var _preset$scope, _preset$abstract, _preset$viewType;
1877
- return {
1878
- id: preset.id,
1879
- title: getTemplatePresetTitle(preset.title, language),
1880
- labels: preset.labels,
1881
- scope: (_preset$scope = preset.scope) != null ? _preset$scope : 'system',
1882
- "abstract": (_preset$abstract = preset["abstract"]) != null ? _preset$abstract : '',
1883
- viewType: (_preset$viewType = preset.viewType) != null ? _preset$viewType : 'singleWindow',
1884
- isWorkspaceTemplate: true
1885
- };
1886
- };
1887
- var toWorkspaceTemplateListItems = function toWorkspaceTemplateListItems(defaultPresets, language) {
1888
- return (defaultPresets != null ? defaultPresets : []).map(function (preset) {
1889
- return toWorkspaceTemplateListItem(preset, language);
1890
- });
1891
- };
1892
- var getBEViewsFromState = function getBEViewsFromState(workspace) {
1893
- var _workspace$views$allI, _workspace$views;
1894
- var result = [];
1895
- ((_workspace$views$allI = workspace == null || (_workspace$views = workspace.views) == null ? void 0 : _workspace$views.allIds) != null ? _workspace$views$allI : []).forEach(function (id) {
1896
- var _workspace$views$byId;
1897
- var view = (_workspace$views$byId = workspace.views.byId[id]) != null ? _workspace$views$byId : {};
1898
- result.push({
1899
- mosaicNodeId: id,
1900
- title: typeof view.title === 'string' && view.title.trim() ? view.title : id,
1901
- componentType: view.componentType,
1902
- initialProps: view.initialProps
1903
- });
1904
- });
1905
- return result;
1906
- };
1907
- var togglePresetFilter = function togglePresetFilter(filters, id, isSelected, isAdmin, isFavouritesEnabled, isTemplatesEnabled) {
1908
- if (isAdmin === void 0) {
1909
- isAdmin = false;
1910
- }
1911
- if (isFavouritesEnabled === void 0) {
1912
- isFavouritesEnabled = true;
1913
- }
1914
- if (isTemplatesEnabled === void 0) {
1915
- isTemplatesEnabled = true;
1916
- }
1917
- if (!filters.some(function (filter) {
1918
- return filter.id === id;
1919
- })) {
1920
- return filters;
1921
- }
1922
- var availableFilters = filters.filter(function (filter) {
1923
- if (filter.id === PresetFilterType.favourites) {
1924
- return isFavouritesEnabled;
1925
- }
1926
- if (filter.id === PresetFilterType.templates && !isTemplatesEnabled) {
1927
- return false;
1928
- }
1929
- return !isAdmin || filter.id === PresetFilterType.system || filter.id === PresetFilterType.shared || filter.id === PresetFilterType.templates;
1930
- });
1931
- var allSelected = availableFilters.every(function (filter) {
1932
- return filter.isSelected;
1933
- });
1934
- var allUnselected = availableFilters.every(function (filter) {
1935
- return filter.id === id ? !isSelected : !filter.isSelected;
1936
- });
1937
- return filters.map(function (filter) {
1938
- if (allSelected) {
1939
- return Object.assign({}, filter, {
1940
- isSelected: filter.id === id && isSelected
1941
- });
1942
- }
1943
- // Admins select one scope at a time, deselecting goes through the
1944
- // regular flow so the last deselected chip falls back to all
1945
- if (isAdmin && isSelected && id !== PresetFilterType.favourites && filter.id !== PresetFilterType.favourites) {
1946
- return Object.assign({}, filter, {
1947
- isSelected: filter.id === id
1948
- });
1949
- }
1950
- return Object.assign({}, filter, {
1951
- isSelected: allUnselected || (filter.id === id ? isSelected : filter.isSelected)
1952
- });
1953
- });
1954
- };
1955
-
1956
- /* *
1957
- * Licensed under the Apache License, Version 2.0 (the "License");
1958
- * you may not use this file except in compliance with the License.
1959
- * You may obtain a copy of the License at
1960
- *
1961
- * http://www.apache.org/licenses/LICENSE-2.0
1962
- *
1963
- * Unless required by applicable law or agreed to in writing, software
1964
- * distributed under the License is distributed on an "AS IS" BASIS,
1965
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1966
- * See the License for the specific language governing permissions and
1967
- * limitations under the License.
1968
- *
1969
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1970
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
1971
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1972
- * */
1973
- var personalFilterState = {
1974
- label: 'shared-filter-my-presets',
1975
- id: PresetFilterType.personal,
1976
- isSelected: true,
1977
- isDisabled: false
1978
- };
1979
- var systemFilterState = {
1980
- label: 'shared-filter-system-presets',
1981
- id: PresetFilterType.system,
1982
- isSelected: true,
1983
- isDisabled: false
1984
- };
1985
- var sharedFilterState = {
1986
- label: 'shared-filter-shared-presets',
1987
- id: PresetFilterType.shared,
1988
- isSelected: true,
1989
- isDisabled: false
1990
- };
1991
- ({
1992
- id: PresetFilterType.plugin});
1993
- var templatesFilterState = {
1994
- label: 'shared-filter-template-presets',
1995
- id: PresetFilterType.templates,
1996
- isSelected: true,
1997
- isDisabled: false
1998
- };
1999
- var favouriteFilterState = {
2000
- label: 'workspace-favourites',
2001
- id: PresetFilterType.favourites,
2002
- isSelected: true,
2003
- isDisabled: false
2004
- };
2005
- var defaultPresetFilterState = [personalFilterState, systemFilterState, sharedFilterState, templatesFilterState, favouriteFilterState];
2006
- var ADMIN_WORKSPACE_FILTER_IDS = [PresetFilterType.system, PresetFilterType.shared, PresetFilterType.templates, PresetFilterType.favourites];
2007
- var initialState$2 = {
2008
- error: undefined,
2009
- isWorkspaceListDialogOpen: false,
2010
- searchQuery: '',
2011
- workspaceListFilters: defaultPresetFilterState,
2012
- workspaceLabelFilters: undefined
2013
- };
2014
- var slice$2 = createSlice({
2015
- initialState: initialState$2,
2016
- name: 'workspaceList',
2017
- reducers: {
2018
- openWorkspaceActionDialogOptions: function openWorkspaceActionDialogOptions(draft, action) {
2019
- draft.workspaceActionDialog = Object.assign({}, action.payload, {
2020
- error: undefined
2021
- });
2022
- },
2023
- onSuccessWorkspaceSaveDialog: function onSuccessWorkspaceSaveDialog(draft, action) {
2024
- if (!draft.workspaceActionDialog) {
2025
- return;
2026
- }
2027
- var presetId = action.payload.presetId;
2028
- if (presetId) {
2029
- draft.workspaceActionDialog.presetId = presetId;
2030
- }
2031
- draft.workspaceActionDialog.hasSaved = true;
2032
- },
2033
- submitFormWorkspaceActionDialogOptions: function submitFormWorkspaceActionDialogOptions(draft, _action) {
2034
- if (!draft.workspaceActionDialog) {
2035
- return;
1746
+ // the view itself is replaced in viewPresets/listener
1747
+ selectViewTemplate: function selectViewTemplate(draft, action) {
1748
+ var panelId = action.payload.panelId;
1749
+ var entity = draft.entities[panelId];
1750
+ if (entity) {
1751
+ entity.activeViewPresetId = '';
1752
+ entity.error = undefined;
1753
+ entity.isViewPresetListDialogOpen = false;
1754
+ viewPresetsAdapter.setOne(draft, entity);
2036
1755
  }
2037
- draft.workspaceActionDialog.error = undefined;
2038
1756
  },
2039
- closeWorkspaceActionDialogOptions: function closeWorkspaceActionDialogOptions(draft) {
2040
- delete draft.workspaceActionDialog;
1757
+ selectViewPlugin: function selectViewPlugin(draft, action) {
1758
+ var _action$payload8 = action.payload,
1759
+ panelId = _action$payload8.panelId,
1760
+ pluginMetaData = _action$payload8.pluginMetaData;
1761
+ var entity = draft.entities[panelId];
1762
+ entity.activeViewPresetId = (pluginMetaData == null ? void 0 : pluginMetaData.id) || '';
1763
+ entity.error = undefined;
1764
+ entity.isViewPresetListDialogOpen = false;
2041
1765
  },
2042
1766
  // action is intercepted in mapPresets/listener
2043
- onSuccessWorkspacePresetAction: function onSuccessWorkspacePresetAction(draft, _action) {
2044
- delete draft.workspaceActionDialog;
1767
+ onSuccessViewPresetAction: function onSuccessViewPresetAction(_draft, _action) {},
1768
+ registerViewPreset: function registerViewPreset(draft, action) {
1769
+ var _action$payload9 = action.payload,
1770
+ mapId = _action$payload9.panelId,
1771
+ mapPresetId = _action$payload9.viewPresetId,
1772
+ filters = _action$payload9.filters;
1773
+ viewPresetsAdapter.setOne(draft, {
1774
+ panelId: mapId,
1775
+ activeViewPresetId: mapPresetId,
1776
+ hasChanges: false,
1777
+ isFetching: false,
1778
+ error: undefined,
1779
+ isViewPresetListDialogOpen: false,
1780
+ filters: filters != null ? filters : defaultViewPresetsFilters,
1781
+ searchQuery: '',
1782
+ filterResults: {
1783
+ ids: [],
1784
+ entities: {}
1785
+ }
1786
+ });
2045
1787
  },
2046
- onErrorWorkspacePresetAction: function onErrorWorkspacePresetAction(draft, action) {
2047
- var error = action.payload.error;
2048
- if (draft.workspaceActionDialog) {
2049
- draft.workspaceActionDialog.error = error;
2050
- } else {
2051
- // fallback if dialog isn't open (e.g. SHARE action)
2052
- draft.error = error;
2053
- }
1788
+ unregisterViewPreset: function unregisterViewPreset(draft, action) {
1789
+ var panelId = action.payload.panelId;
1790
+ viewPresetsAdapter.removeOne(draft, panelId);
2054
1791
  },
2055
- toggleWorkspaceDialog: function toggleWorkspaceDialog(draft, action) {
2056
- var isListDialogOpen = action.payload.isWorkspaceListDialogOpen;
2057
- draft.isWorkspaceListDialogOpen = isListDialogOpen;
1792
+ // dialog actions
1793
+ openViewPresetDialog: function openViewPresetDialog(draft, action) {
1794
+ var viewPresetDialog = action.payload.viewPresetDialog;
1795
+ draft.viewPresetDialog = viewPresetDialog;
2058
1796
  },
2059
- toggleSelectFilterChip: function toggleSelectFilterChip(draft, action) {
2060
- var _action$payload = action.payload,
2061
- id = _action$payload.id,
2062
- isSelected = _action$payload.isSelected,
2063
- isAdmin = _action$payload.isAdmin,
2064
- isFavouritesEnabled = _action$payload.isFavouritesEnabled,
2065
- isTemplatesEnabled = _action$payload.isTemplatesEnabled;
2066
- draft.workspaceListFilters = togglePresetFilter(draft.workspaceListFilters, id, isSelected, isAdmin, isFavouritesEnabled, isTemplatesEnabled);
2067
- },
2068
- setSelectAllFilterChip: function setSelectAllFilterChip(draft) {
2069
- draft.workspaceListFilters = draft.workspaceListFilters.map(function (filter) {
2070
- return Object.assign({}, filter, {
2071
- isSelected: true
2072
- });
2073
- });
2074
- },
2075
- setFilterChips: function setFilterChips(draft, action) {
2076
- var payload = action.payload;
2077
- draft.workspaceListFilters.forEach(function (filter, index) {
2078
- var existingFilter = payload.find(function (existingFilter) {
2079
- return existingFilter.id === filter.id;
2080
- });
2081
- var updatedFilter = Object.assign({}, filter, {
2082
- isSelected: existingFilter ? existingFilter.isSelected : filter.isSelected
2083
- });
2084
- draft.workspaceListFilters[index] = updatedFilter;
2085
- });
2086
- },
2087
- setWorkspaceLabelFilters: function setWorkspaceLabelFilters(draft, action) {
2088
- draft.workspaceLabelFilters = action.payload.labels;
2089
- },
2090
- clearLabelFilters: function clearLabelFilters(draft) {
2091
- draft.workspaceLabelFilters = undefined;
1797
+ closeViewPresetDialog: function closeViewPresetDialog(draft) {
1798
+ delete draft.viewPresetDialog;
2092
1799
  },
2093
- searchFilter: function searchFilter(draft, action) {
2094
- var searchQuery = action.payload.searchQuery;
2095
- draft.searchQuery = searchQuery;
2096
- }
2097
- }
2098
- });
2099
- var workspaceListReducer = slice$2.reducer,
2100
- workspaceListActions = slice$2.actions;
2101
-
2102
- /* *
2103
- * Licensed under the Apache License, Version 2.0 (the "License");
2104
- * you may not use this file except in compliance with the License.
2105
- * You may obtain a copy of the License at
2106
- *
2107
- * http://www.apache.org/licenses/LICENSE-2.0
2108
- *
2109
- * Unless required by applicable law or agreed to in writing, software
2110
- * distributed under the License is distributed on an "AS IS" BASIS,
2111
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2112
- * See the License for the specific language governing permissions and
2113
- * limitations under the License.
2114
- *
2115
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
2116
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
2117
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
2118
- * */
2119
- var defaultViewPresetsFilters = [{
2120
- label: 'shared-filter-my-view-presets',
2121
- id: PresetFilterType.personal,
2122
- isSelected: true,
2123
- isDisabled: false
2124
- }, {
2125
- label: 'shared-filter-system-view-presets',
2126
- id: PresetFilterType.system,
2127
- isSelected: true,
2128
- isDisabled: false
2129
- }, {
2130
- label: 'shared-filter-shared-view-presets',
2131
- id: PresetFilterType.shared,
2132
- isSelected: true,
2133
- isDisabled: false
2134
- }, {
2135
- label: 'shared-filter-template-presets',
2136
- id: PresetFilterType.templates,
2137
- isSelected: true,
2138
- isDisabled: false
2139
- }, favouriteFilterState];
2140
- var ADMIN_VIEW_PRESET_FILTER_IDS = [PresetFilterType.system, PresetFilterType.shared, PresetFilterType.templates, PresetFilterType.favourites];
2141
- var pluginViewPresetsFilter = {
2142
- label: 'shared-filter-plugin-view-presets',
2143
- id: PresetFilterType.plugin,
2144
- isSelected: true,
2145
- isDisabled: false
2146
- };
2147
- var viewPresetsAdapter = createEntityAdapter({
2148
- // we use panelId as id (panelId can be mapId or viewId)
2149
- selectId: function selectId(mapPreset) {
2150
- return mapPreset.panelId;
2151
- }
2152
- });
2153
- var initialState$1 = viewPresetsAdapter.getInitialState();
2154
- var warningsPresetChangeActions = [warningsFiltersActions.setWarningFilters, warningsFiltersActions.setExpandedSectionsForPanel];
2155
- var syncGroupChangeActions = [syncGroupsActions.syncGroupRemoveTarget, syncGroupsActions.syncGroupAddTarget];
2156
- var mapPresetChangeActions = [layerActions.setBaseLayers, layerActions.layerDelete, layerActions.addLayer, layerActions.duplicateMapLayer, layerActions.layerChangeEnabled, layerActions.layerChangeName, layerActions.layerChangeStyle, layerActions.layerChangeOpacity, layerActions.layerChangeDimension, layerActions.layerChangeAcceptanceTime, layerActions.SetLayerLegendVisibilityPayload, mapActions.layerMoveLayer, mapActions.setAutoLayerId, mapActions.setAutoTimestepLayerId, mapActions.setAutoUpdateLayerId, mapActions.toggleAutoUpdate, mapActions.mapStartAnimation, mapActions.mapStopAnimation, mapActions.toggleTimeSliderIsVisible, mapActions.setTimeStep, mapActions.setTimeSliderSpan, mapActions.toggleTimeSpanAuto, mapActions.setAnimationDelay, mapActions.toggleTimestepAuto, mapActions.setAnimationStartTime, mapActions.setAnimationEndTime, mapActions.setAnimationLength, mapActions.changeOverlayer, uiActions.setActiveMapIdForDialog, uiActions.setToggleOpenDialog, genericActions.setBbox, mapActions.setBbox, mapActions.toggleClock, mapActions.toggleClockOptions, mapActions.setClockPositionSize, mapActions.setLegendPositionSize, mapActions.setDockedLayerManagerSize, mapActions.setDockedLayerManagerPosition, mapActions.setDockedLayerManagerDimensions];
2157
- var pluginPresetChangeActions = [pluginsActions.setGeoWebPluginState];
2158
- var timeSeriesPresetChangeActions = [timeSeriesActions.addParameter, timeSeriesActions.addPlot, timeSeriesActions.duplicatePlot, timeSeriesActions.deleteParameter, timeSeriesActions.deletePlot, timeSeriesActions.moveParameter, timeSeriesActions.movePlot, timeSeriesActions.toggleParameter, timeSeriesActions.togglePlot, timeSeriesActions.patchParameter, timeSeriesActions.updateTitle, timeSeriesActions.setLocationMenuSizeAndPosition, timeSeriesActions.setLocationsDialogOpen, timeSeriesActions.reorderPlots, timeSeriesActions.setPlotIsOpen, timeSeriesActions.setPlotSize];
2159
- var soundingsChangeActions = [soundingsActions.updateSelectedSource, soundingsActions.updateSelectedLocation, soundingsActions.updateDiagramType, soundingsActions.toggleLocationMarkers, soundingsActions.updateProfileDataPreferences, soundingsActions.changeSoundingPanelOrder, soundingsActions.toggleSoundingPanelVisibility, soundingsActions.setPanelIsOpen, soundingsActions.setPanelCustomWidth, soundingsActions.toggleLegendVisibility, soundingsActions.updateSelectedTime, soundingsActions.toggleTimeSliderVisibility, soundingsActions.setLocationMenuSizeAndPosition, soundingsActions.setLocationsMenuOpen];
2160
- var supportedMapActionOrigins = [layerTypes.LayerActionOrigin.layerManager, layerTypes.LayerActionOrigin.legend, layerTypes.LayerActionOrigin.wmsLoader, mapEnums.MapActionOrigin.map];
2161
- var supportedTimeSeriesActionOrigins = [TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesManager, TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesSelect];
2162
- var supportedSoundingsActionOrigins = [SoundingsTypes.SoundingsActionOrigin.soundingsComponent, SoundingsTypes.SoundingsActionOrigin.soundingsManager];
2163
- var slice$1 = createSlice({
2164
- initialState: initialState$1,
2165
- name: 'viewPresets',
2166
- reducers: {
2167
- // fetch list actions
2168
- fetchViewPresets: function fetchViewPresets(draft, action) {
2169
- var panelId = action.payload.panelId;
1800
+ toggleViewPresetListDialog: function toggleViewPresetListDialog(draft, action) {
1801
+ var _action$payload0 = action.payload,
1802
+ isViewPresetDialogOpen = _action$payload0.isViewPresetListDialogOpen,
1803
+ panelId = _action$payload0.panelId;
2170
1804
  var entity = draft.entities[panelId];
2171
1805
  if (entity) {
2172
- entity.isFetching = true;
2173
- entity.error = undefined;
1806
+ entity.isViewPresetListDialogOpen = isViewPresetDialogOpen;
2174
1807
  viewPresetsAdapter.setOne(draft, entity);
2175
1808
  }
2176
1809
  },
2177
- fetchedViewPreset: function fetchedViewPreset(draft, action) {
2178
- var _action$payload = action.payload,
2179
- panelId = _action$payload.panelId,
2180
- mapPresetId = _action$payload.viewPresetId;
1810
+ toggleSelectFilterChip: function toggleSelectFilterChip(draft, action) {
1811
+ var _action$payload1 = action.payload,
1812
+ id = _action$payload1.id,
1813
+ isSelected = _action$payload1.isSelected,
1814
+ panelId = _action$payload1.panelId,
1815
+ isAdmin = _action$payload1.isAdmin,
1816
+ isFavouritesEnabled = _action$payload1.isFavouritesEnabled;
2181
1817
  var entity = draft.entities[panelId];
2182
1818
  if (entity) {
2183
- entity.isFetching = false;
2184
- entity.activeViewPresetId = mapPresetId;
2185
- entity.hasChanges = false;
2186
- entity.error = undefined;
2187
- viewPresetsAdapter.setOne(draft, entity);
1819
+ entity.filters = togglePresetFilter(entity.filters, id, isSelected, isAdmin, isFavouritesEnabled);
2188
1820
  }
2189
1821
  },
2190
- saveViewPreset: function saveViewPreset(draft, action) {
1822
+ setSelectAllFilterChip: function setSelectAllFilterChip(draft, action) {
2191
1823
  var panelId = action.payload.panelId;
2192
1824
  var entity = draft.entities[panelId];
2193
1825
  if (entity) {
2194
- entity.isFetching = true;
2195
- entity.error = undefined;
2196
- viewPresetsAdapter.setOne(draft, entity);
2197
- }
2198
- },
2199
- savedViewPreset: function savedViewPreset(draft, action) {
2200
- var _action$payload2 = action.payload,
2201
- panelId = _action$payload2.panelId,
2202
- viewPresetId = _action$payload2.viewPresetId;
2203
- var entity = draft.entities[panelId];
2204
- if (entity) {
2205
- entity.isFetching = false;
2206
- entity.hasChanges = false;
2207
- entity.activeViewPresetId = viewPresetId;
2208
- viewPresetsAdapter.setOne(draft, entity);
1826
+ entity.filters = entity.filters.map(function (filter) {
1827
+ return Object.assign({}, filter, {
1828
+ isSelected: true
1829
+ });
1830
+ });
2209
1831
  }
2210
1832
  },
2211
- errorViewPreset: function errorViewPreset(draft, action) {
2212
- var _action$payload3 = action.payload,
2213
- panelId = _action$payload3.panelId,
2214
- error = _action$payload3.error;
1833
+ setFilterChips: function setFilterChips(draft, action) {
1834
+ var _action$payload10 = action.payload,
1835
+ panelId = _action$payload10.panelId,
1836
+ filters = _action$payload10.filters;
2215
1837
  var entity = draft.entities[panelId];
2216
- if (entity) {
2217
- entity.error = error;
2218
- entity.isFetching = false;
2219
- viewPresetsAdapter.setOne(draft, entity);
1838
+ if (!entity) {
1839
+ return;
2220
1840
  }
1841
+ entity.filters.forEach(function (filter, index) {
1842
+ var existingFilter = filters.find(function (existingFilter) {
1843
+ return existingFilter.id === filter.id;
1844
+ });
1845
+ var updatedFilter = Object.assign({}, filter, {
1846
+ isSelected: existingFilter ? existingFilter.isSelected : filter.isSelected
1847
+ });
1848
+ entity.filters[index] = updatedFilter;
1849
+ });
2221
1850
  },
2222
- // map actions
2223
- setViewPresetHasChanges: function setViewPresetHasChanges(draft, action) {
2224
- var _action$payload4 = action.payload,
2225
- panelId = _action$payload4.panelId,
2226
- hasChanges = _action$payload4.hasChanges;
1851
+ searchFilter: function searchFilter(draft, action) {
1852
+ var _action$payload11 = action.payload,
1853
+ searchQuery = _action$payload11.searchQuery,
1854
+ panelId = _action$payload11.panelId;
2227
1855
  var entity = draft.entities[panelId];
2228
1856
  if (entity) {
2229
- entity.hasChanges = hasChanges;
2230
- viewPresetsAdapter.setOne(draft, entity);
1857
+ entity.searchQuery = searchQuery;
2231
1858
  }
2232
1859
  },
2233
- setViewPresetInline: function setViewPresetInline(draft, action) {
2234
- var _action$payload5 = action.payload,
2235
- panelId = _action$payload5.panelId,
2236
- isInline = _action$payload5.isInline;
1860
+ setViewPresetLabelFilters: function setViewPresetLabelFilters(draft, action) {
1861
+ var _action$payload12 = action.payload,
1862
+ panelId = _action$payload12.panelId,
1863
+ labels = _action$payload12.labels;
2237
1864
  var entity = draft.entities[panelId];
2238
- if (entity) {
2239
- if (isInline) {
2240
- entity.activeViewPresetId = '';
2241
- }
2242
- viewPresetsAdapter.setOne(draft, entity);
1865
+ if (!entity) {
1866
+ return;
2243
1867
  }
1868
+ entity.labelFilters = labels;
1869
+ viewPresetsAdapter.setOne(draft, entity);
2244
1870
  },
2245
- setActiveViewPresetId: function setActiveViewPresetId(draft, action) {
2246
- var _action$payload6 = action.payload,
2247
- panelId = _action$payload6.panelId,
2248
- mapPresetId = _action$payload6.viewPresetId;
1871
+ clearViewPresetLabelFilters: function clearViewPresetLabelFilters(draft, action) {
1872
+ var panelId = action.payload.panelId;
2249
1873
  var entity = draft.entities[panelId];
2250
- if (entity) {
2251
- entity.activeViewPresetId = mapPresetId;
2252
- entity.hasChanges = false;
2253
- viewPresetsAdapter.setOne(draft, entity);
1874
+ if (!entity) {
1875
+ return;
2254
1876
  }
2255
- },
2256
- selectViewPreset: function selectViewPreset(draft, action) {
2257
- var _action$payload7 = action.payload,
2258
- panelId = _action$payload7.panelId,
2259
- mapPresetId = _action$payload7.viewPresetId;
2260
- var entity = draft.entities[panelId];
1877
+ entity.labelFilters = undefined;
1878
+ viewPresetsAdapter.setOne(draft, entity);
1879
+ }
1880
+ },
1881
+ extraReducers: function extraReducers(builder) {
1882
+ builder.addCase(mapActions.setMapPresetError, function (draft, action) {
1883
+ var _action$payload13 = action.payload,
1884
+ mapId = _action$payload13.mapId,
1885
+ error = _action$payload13.error;
1886
+ var entity = draft.entities[mapId];
2261
1887
  if (entity) {
2262
- // only update activeMapPresetId after selecting a NEW preset
2263
- // existing mapPresets are getting an activeMapPresetId after a succesfull fetch
2264
- if (mapPresetId === '') {
2265
- entity.activeViewPresetId = '';
2266
- entity.error = undefined;
2267
- }
2268
- entity.isViewPresetListDialogOpen = false;
2269
- viewPresetsAdapter.setOne(draft, entity);
2270
- }
2271
- },
2272
- // the view itself is replaced in viewPresets/listener
2273
- selectViewTemplate: function selectViewTemplate(draft, action) {
2274
- var panelId = action.payload.panelId;
2275
- var entity = draft.entities[panelId];
2276
- if (entity) {
2277
- entity.activeViewPresetId = '';
2278
- entity.error = undefined;
2279
- entity.isViewPresetListDialogOpen = false;
2280
- viewPresetsAdapter.setOne(draft, entity);
2281
- }
2282
- },
2283
- selectViewPlugin: function selectViewPlugin(draft, action) {
2284
- var _action$payload8 = action.payload,
2285
- panelId = _action$payload8.panelId,
2286
- pluginMetaData = _action$payload8.pluginMetaData;
2287
- var entity = draft.entities[panelId];
2288
- entity.activeViewPresetId = (pluginMetaData == null ? void 0 : pluginMetaData.id) || '';
2289
- entity.error = undefined;
2290
- entity.isViewPresetListDialogOpen = false;
2291
- },
2292
- // action is intercepted in mapPresets/listener
2293
- onSuccessViewPresetAction: function onSuccessViewPresetAction(_draft, _action) {},
2294
- registerViewPreset: function registerViewPreset(draft, action) {
2295
- var _action$payload9 = action.payload,
2296
- mapId = _action$payload9.panelId,
2297
- mapPresetId = _action$payload9.viewPresetId,
2298
- filters = _action$payload9.filters;
2299
- viewPresetsAdapter.setOne(draft, {
2300
- panelId: mapId,
2301
- activeViewPresetId: mapPresetId,
2302
- hasChanges: false,
2303
- isFetching: false,
2304
- error: undefined,
2305
- isViewPresetListDialogOpen: false,
2306
- filters: filters != null ? filters : defaultViewPresetsFilters,
2307
- searchQuery: '',
2308
- filterResults: {
2309
- ids: [],
2310
- entities: {}
2311
- }
2312
- });
2313
- },
2314
- unregisterViewPreset: function unregisterViewPreset(draft, action) {
2315
- var panelId = action.payload.panelId;
2316
- viewPresetsAdapter.removeOne(draft, panelId);
2317
- },
2318
- // dialog actions
2319
- openViewPresetDialog: function openViewPresetDialog(draft, action) {
2320
- var viewPresetDialog = action.payload.viewPresetDialog;
2321
- draft.viewPresetDialog = viewPresetDialog;
2322
- },
2323
- closeViewPresetDialog: function closeViewPresetDialog(draft) {
2324
- delete draft.viewPresetDialog;
2325
- },
2326
- toggleViewPresetListDialog: function toggleViewPresetListDialog(draft, action) {
2327
- var _action$payload0 = action.payload,
2328
- isViewPresetDialogOpen = _action$payload0.isViewPresetListDialogOpen,
2329
- panelId = _action$payload0.panelId;
2330
- var entity = draft.entities[panelId];
2331
- if (entity) {
2332
- entity.isViewPresetListDialogOpen = isViewPresetDialogOpen;
2333
- viewPresetsAdapter.setOne(draft, entity);
2334
- }
2335
- },
2336
- toggleSelectFilterChip: function toggleSelectFilterChip(draft, action) {
2337
- var _action$payload1 = action.payload,
2338
- id = _action$payload1.id,
2339
- isSelected = _action$payload1.isSelected,
2340
- panelId = _action$payload1.panelId,
2341
- isAdmin = _action$payload1.isAdmin,
2342
- isFavouritesEnabled = _action$payload1.isFavouritesEnabled;
2343
- var entity = draft.entities[panelId];
2344
- if (entity) {
2345
- entity.filters = togglePresetFilter(entity.filters, id, isSelected, isAdmin, isFavouritesEnabled);
2346
- }
2347
- },
2348
- setSelectAllFilterChip: function setSelectAllFilterChip(draft, action) {
2349
- var panelId = action.payload.panelId;
2350
- var entity = draft.entities[panelId];
2351
- if (entity) {
2352
- entity.filters = entity.filters.map(function (filter) {
2353
- return Object.assign({}, filter, {
2354
- isSelected: true
2355
- });
2356
- });
2357
- }
2358
- },
2359
- setFilterChips: function setFilterChips(draft, action) {
2360
- var _action$payload10 = action.payload,
2361
- panelId = _action$payload10.panelId,
2362
- filters = _action$payload10.filters;
2363
- var entity = draft.entities[panelId];
2364
- if (!entity) {
2365
- return;
2366
- }
2367
- entity.filters.forEach(function (filter, index) {
2368
- var existingFilter = filters.find(function (existingFilter) {
2369
- return existingFilter.id === filter.id;
2370
- });
2371
- var updatedFilter = Object.assign({}, filter, {
2372
- isSelected: existingFilter ? existingFilter.isSelected : filter.isSelected
2373
- });
2374
- entity.filters[index] = updatedFilter;
2375
- });
2376
- },
2377
- searchFilter: function searchFilter(draft, action) {
2378
- var _action$payload11 = action.payload,
2379
- searchQuery = _action$payload11.searchQuery,
2380
- panelId = _action$payload11.panelId;
2381
- var entity = draft.entities[panelId];
2382
- if (entity) {
2383
- entity.searchQuery = searchQuery;
2384
- }
2385
- },
2386
- setViewPresetLabelFilters: function setViewPresetLabelFilters(draft, action) {
2387
- var _action$payload12 = action.payload,
2388
- panelId = _action$payload12.panelId,
2389
- labels = _action$payload12.labels;
2390
- var entity = draft.entities[panelId];
2391
- if (!entity) {
2392
- return;
2393
- }
2394
- entity.labelFilters = labels;
2395
- viewPresetsAdapter.setOne(draft, entity);
2396
- },
2397
- clearViewPresetLabelFilters: function clearViewPresetLabelFilters(draft, action) {
2398
- var panelId = action.payload.panelId;
2399
- var entity = draft.entities[panelId];
2400
- if (!entity) {
2401
- return;
2402
- }
2403
- entity.labelFilters = undefined;
2404
- viewPresetsAdapter.setOne(draft, entity);
2405
- }
2406
- },
2407
- extraReducers: function extraReducers(builder) {
2408
- builder.addCase(mapActions.setMapPresetError, function (draft, action) {
2409
- var _action$payload13 = action.payload,
2410
- mapId = _action$payload13.mapId,
2411
- error = _action$payload13.error;
2412
- var entity = draft.entities[mapId];
2413
- if (entity) {
2414
- entity.error = error ? {
2415
- message: error,
2416
- component: ViewPresetErrorComponent.PRESET_DETAIL,
2417
- errorType: ViewPresetErrorType.GENERIC
2418
- } : undefined;
2419
- entity.isFetching = false;
1888
+ entity.error = error ? {
1889
+ message: error,
1890
+ component: ViewPresetErrorComponent.PRESET_DETAIL,
1891
+ errorType: ViewPresetErrorType.GENERIC
1892
+ } : undefined;
1893
+ entity.isFetching = false;
2420
1894
  viewPresetsAdapter.setOne(draft, entity);
2421
1895
  }
2422
1896
  });
@@ -2975,6 +2449,9 @@ var emptyViewPreset = function emptyViewPreset(componentType) {
2975
2449
  },
2976
2450
  Soundings: undefined,
2977
2451
  // TODO: empty soundings preset https://gitlab.com/opengeoweb/opengeoweb/-/issues/6029
2452
+ CrossSection: {
2453
+ syncGroupsIds: []
2454
+ },
2978
2455
  ViewError: undefined,
2979
2456
  ViewLoading: undefined,
2980
2457
  MultiMap: undefined,
@@ -3248,6 +2725,9 @@ var getViewPresetToSendToBackend = createSelector(getViewById, getViewComponentT
3248
2725
  Soundings: Object.assign({}, soundingsPreset, {
3249
2726
  syncGroupsIds: syncGroupsIds
3250
2727
  }),
2728
+ CrossSection: Object.assign({}, workspaceView == null ? void 0 : workspaceView.initialProps, {
2729
+ syncGroupsIds: syncGroupsIds
2730
+ }),
3251
2731
  Plugin: Object.assign({}, workspaceView == null ? void 0 : workspaceView.initialProps, {
3252
2732
  syncGroupsIds: syncGroupsIds
3253
2733
  }, pluginState && {
@@ -3279,27 +2759,764 @@ var getWorkspaceToSendToBackend = function getWorkspaceToSendToBackend(store) {
3279
2759
  });
3280
2760
  };
3281
2761
 
3282
- var selectors$1 = /*#__PURE__*/Object.freeze({
3283
- __proto__: null,
3284
- getComponentTypesFromActiveViews: getComponentTypesFromActiveViews,
3285
- getMosaicNode: getMosaicNode,
3286
- getSelectedWorkspaceScope: getSelectedWorkspaceScope,
3287
- getSelectedWorkspaceTitle: getSelectedWorkspaceTitle,
3288
- getShouldPreventClose: getShouldPreventClose,
3289
- getViewById: getViewById,
3290
- getViewComponentType: getViewComponentType,
3291
- getViewIds: getViewIds,
3292
- getViewPresetToSendToBackend: getViewPresetToSendToBackend,
3293
- getViewType: getViewType,
3294
- getViewsById: getViewsById,
3295
- getWorkspaceData: getWorkspaceData,
3296
- getWorkspaceError: getWorkspaceError,
3297
- getWorkspaceId: getWorkspaceId,
3298
- getWorkspaceState: getWorkspaceState,
3299
- getWorkspaceToSendToBackend: getWorkspaceToSendToBackend,
3300
- hasWorkspaceChanges: hasWorkspaceChanges,
3301
- isWorkspaceLoading: isWorkspaceLoading
3302
- });
2762
+ var selectors$1 = /*#__PURE__*/Object.freeze({
2763
+ __proto__: null,
2764
+ getComponentTypesFromActiveViews: getComponentTypesFromActiveViews,
2765
+ getMosaicNode: getMosaicNode,
2766
+ getSelectedWorkspaceScope: getSelectedWorkspaceScope,
2767
+ getSelectedWorkspaceTitle: getSelectedWorkspaceTitle,
2768
+ getShouldPreventClose: getShouldPreventClose,
2769
+ getViewById: getViewById,
2770
+ getViewComponentType: getViewComponentType,
2771
+ getViewIds: getViewIds,
2772
+ getViewPresetToSendToBackend: getViewPresetToSendToBackend,
2773
+ getViewType: getViewType,
2774
+ getViewsById: getViewsById,
2775
+ getWorkspaceData: getWorkspaceData,
2776
+ getWorkspaceError: getWorkspaceError,
2777
+ getWorkspaceId: getWorkspaceId,
2778
+ getWorkspaceState: getWorkspaceState,
2779
+ getWorkspaceToSendToBackend: getWorkspaceToSendToBackend,
2780
+ hasWorkspaceChanges: hasWorkspaceChanges,
2781
+ isWorkspaceLoading: isWorkspaceLoading
2782
+ });
2783
+
2784
+ var VIEW_PRESETS_DOWNLOAD_TIMEOUT_MS = 30000;
2785
+ var MAP_SIZES_TIMEOUT_MS = 10000;
2786
+ var restoreTimeoutMessage = {
2787
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
2788
+ key: 'workspace-map-views-restore-timeout'
2789
+ };
2790
+ /** Resolves true once the state is ready, or false when the timeout passes first. */
2791
+ var waitForState = /*#__PURE__*/function () {
2792
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(listenerApi, isReady, timeout) {
2793
+ return _regenerator().w(function (_context) {
2794
+ while (1) switch (_context.n) {
2795
+ case 0:
2796
+ return _context.a(2, isReady(listenerApi.getState()) || listenerApi.condition(function (_action, currentState) {
2797
+ return isReady(currentState);
2798
+ }, timeout));
2799
+ }
2800
+ }, _callee);
2801
+ }));
2802
+ return function waitForState(_x, _x2, _x3) {
2803
+ return _ref.apply(this, arguments);
2804
+ };
2805
+ }();
2806
+ var areViewPresetsDownloaded = function areViewPresetsDownloaded(state) {
2807
+ return getViewIds(state).every(function (viewId) {
2808
+ var _getViewById;
2809
+ return ((_getViewById = getViewById(state, viewId)) == null ? void 0 : _getViewById.componentType) !== 'ViewLoading';
2810
+ });
2811
+ };
2812
+ var collectSavedBboxes = function collectSavedBboxes(state) {
2813
+ return getViewIds(state).reduce(function (savedBboxes, viewId) {
2814
+ var _getViewById2, _initialProps$mapPres, _proj$bbox, _Object$assign;
2815
+ var initialProps = (_getViewById2 = getViewById(state, viewId)) == null ? void 0 : _getViewById2.initialProps;
2816
+ var proj = initialProps == null || (_initialProps$mapPres = initialProps.mapPreset) == null ? void 0 : _initialProps$mapPres.proj;
2817
+ return getViewComponentType(state, viewId) === 'Map' && (proj == null || (_proj$bbox = proj.bbox) == null ? void 0 : _proj$bbox.left) !== undefined ? Object.assign({}, savedBboxes, (_Object$assign = {}, _Object$assign[viewId] = {
2818
+ bbox: proj.bbox,
2819
+ srs: proj.srs
2820
+ }, _Object$assign)) : savedBboxes;
2821
+ }, {});
2822
+ };
2823
+ var getBboxSyncGroupMembers = function getBboxSyncGroupMembers(state, mapIds) {
2824
+ var _syncGroupsSelectors$, _groups$allIds;
2825
+ var groups = (_syncGroupsSelectors$ = syncGroupsSelectors.getSynchronizationGroupState(state)) == null ? void 0 : _syncGroupsSelectors$.groups;
2826
+ return ((_groups$allIds = groups == null ? void 0 : groups.allIds) != null ? _groups$allIds : []).reduce(function (membersByGroupId, groupId) {
2827
+ var _Object$assign2;
2828
+ var group = groups.byId[groupId];
2829
+ var memberMapIds = group.type === syncConstants.SYNCGROUPS_TYPE_SETBBOX ? group.targets.allIds.filter(function (targetId) {
2830
+ return mapIds.includes(targetId);
2831
+ }) : [];
2832
+ return memberMapIds.length ? Object.assign({}, membersByGroupId, (_Object$assign2 = {}, _Object$assign2[groupId] = memberMapIds, _Object$assign2)) : membersByGroupId;
2833
+ }, {});
2834
+ };
2835
+ var haveMapSizes = function haveMapSizes(state, mapIds) {
2836
+ return mapIds.every(function (mapId) {
2837
+ return !!mapSelectors.getMapSize(state, mapId);
2838
+ });
2839
+ };
2840
+ var getSizedFitMembers = function getSizedFitMembers(state, memberMapIds, presetBboxes) {
2841
+ return compact(memberMapIds.map(function (mapId) {
2842
+ var mapSize = mapSelectors.getMapSize(state, mapId);
2843
+ return mapSize && {
2844
+ mapId: mapId,
2845
+ bbox: presetBboxes[mapId].bbox,
2846
+ mapSize: mapSize
2847
+ };
2848
+ }));
2849
+ };
2850
+ /** Sets the group view once and stores what the members show, so a save right after the restore keeps this view. */
2851
+ var applySyncGroupFit = function applySyncGroupFit(listenerApi, groupId, memberMapIds, savedBboxes) {
2852
+ var members = getSizedFitMembers(listenerApi.getState(), memberMapIds, savedBboxes);
2853
+ var fit = calculateSyncGroupFit(members);
2854
+ if (!fit) {
2855
+ return;
2856
+ }
2857
+ var chosenMember = members.find(function (member) {
2858
+ return member.mapId === fit.mapId;
2859
+ });
2860
+ var srs = savedBboxes[chosenMember.mapId].srs;
2861
+ setSyncGroupViewFit(groupId, fit, srs);
2862
+ listenerApi.dispatch(genericActions.setBbox({
2863
+ sourceId: chosenMember.mapId,
2864
+ bbox: getVisibleArea(fit, chosenMember.mapSize),
2865
+ srs: srs,
2866
+ origin: 'restoreSyncGroupViews'
2867
+ }));
2868
+ };
2869
+ /** Restores each zoom sync group's shared view once every view preset is downloaded and every member map has its size. */
2870
+ var restoreSyncGroupViews = /*#__PURE__*/function () {
2871
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(listenerApi) {
2872
+ var isDownloaded, savedBboxes, membersByGroupId, memberMapIds, areMapsSized;
2873
+ return _regenerator().w(function (_context2) {
2874
+ while (1) switch (_context2.n) {
2875
+ case 0:
2876
+ _context2.n = 1;
2877
+ return waitForState(listenerApi, areViewPresetsDownloaded, VIEW_PRESETS_DOWNLOAD_TIMEOUT_MS);
2878
+ case 1:
2879
+ isDownloaded = _context2.v;
2880
+ savedBboxes = collectSavedBboxes(listenerApi.getState());
2881
+ membersByGroupId = getBboxSyncGroupMembers(listenerApi.getState(), Object.keys(savedBboxes));
2882
+ memberMapIds = Object.values(membersByGroupId).flat();
2883
+ _context2.n = 2;
2884
+ return waitForState(listenerApi, function (state) {
2885
+ return haveMapSizes(state, memberMapIds);
2886
+ }, MAP_SIZES_TIMEOUT_MS);
2887
+ case 2:
2888
+ areMapsSized = _context2.v;
2889
+ Object.entries(membersByGroupId).forEach(function (_ref3) {
2890
+ var groupId = _ref3[0],
2891
+ groupMemberMapIds = _ref3[1];
2892
+ return applySyncGroupFit(listenerApi, groupId, groupMemberMapIds, savedBboxes);
2893
+ });
2894
+ listenerApi.dispatch(mapActions.endViewsSettling());
2895
+ if (!isDownloaded || !areMapsSized) {
2896
+ listenerApi.dispatch(snackbarActions.openSnackbar(restoreTimeoutMessage));
2897
+ }
2898
+ case 3:
2899
+ return _context2.a(2);
2900
+ }
2901
+ }, _callee2);
2902
+ }));
2903
+ return function restoreSyncGroupViews(_x4) {
2904
+ return _ref2.apply(this, arguments);
2905
+ };
2906
+ }();
2907
+
2908
+ var workspacePresetsFallback = [
2909
+ {
2910
+ id: "newSplitMap2x1Workspace",
2911
+ title: "Two maps",
2912
+ scope: "system",
2913
+ abstract: "",
2914
+ viewType: "multiWindow",
2915
+ views: [
2916
+ {
2917
+ mosaicNodeId: "left-map",
2918
+ componentType: "Map",
2919
+ initialProps: {
2920
+ mapPreset: {
2921
+ layers: [
2922
+ ],
2923
+ proj: {
2924
+ bbox: {
2925
+ left: -2782987.27,
2926
+ bottom: 3503549.84,
2927
+ right: 5009377.09,
2928
+ top: 11753184.62
2929
+ },
2930
+ srs: "EPSG:3857"
2931
+ },
2932
+ showTimeSlider: false,
2933
+ displayMapPin: false,
2934
+ shouldShowZoomControls: true
2935
+ },
2936
+ syncGroupsIds: [
2937
+ ]
2938
+ },
2939
+ title: "Map A"
2940
+ },
2941
+ {
2942
+ mosaicNodeId: "right-map",
2943
+ componentType: "Map",
2944
+ initialProps: {
2945
+ mapPreset: {
2946
+ layers: [
2947
+ ],
2948
+ proj: {
2949
+ bbox: {
2950
+ left: -2782987.27,
2951
+ bottom: 3503549.84,
2952
+ right: 5009377.09,
2953
+ top: 11753184.62
2954
+ },
2955
+ srs: "EPSG:3857"
2956
+ },
2957
+ showTimeSlider: false,
2958
+ displayMapPin: false,
2959
+ shouldShowZoomControls: true
2960
+ },
2961
+ syncGroupsIds: [
2962
+ ]
2963
+ },
2964
+ title: "Map B"
2965
+ }
2966
+ ],
2967
+ syncGroups: [
2968
+ ],
2969
+ mosaicNode: {
2970
+ direction: "row",
2971
+ first: "left-map",
2972
+ second: "right-map",
2973
+ splitPercentage: 50
2974
+ }
2975
+ },
2976
+ {
2977
+ id: "timeSeriesWorkspace",
2978
+ title: "Timeseries",
2979
+ scope: "system",
2980
+ abstract: "",
2981
+ viewType: "multiWindow",
2982
+ views: [
2983
+ {
2984
+ mosaicNodeId: "timeseries-map",
2985
+ componentType: "Map",
2986
+ initialProps: {
2987
+ mapPreset: {
2988
+ layers: [
2989
+ ],
2990
+ proj: {
2991
+ bbox: {
2992
+ left: -2782987.27,
2993
+ bottom: 3503549.84,
2994
+ right: 5009377.09,
2995
+ top: 11753184.62
2996
+ },
2997
+ srs: "EPSG:3857"
2998
+ },
2999
+ showTimeSlider: true,
3000
+ displayMapPin: true,
3001
+ shouldShowZoomControls: true
3002
+ },
3003
+ syncGroupsIds: [
3004
+ "Area_TimeSeries",
3005
+ "Time_TimeSeries"
3006
+ ]
3007
+ },
3008
+ title: "Map"
3009
+ },
3010
+ {
3011
+ mosaicNodeId: "timeseries-panel",
3012
+ componentType: "TimeSeries",
3013
+ initialProps: {
3014
+ plotPreset: {
3015
+ mapId: "timeseries-map",
3016
+ plots: [
3017
+ ],
3018
+ parameters: [
3019
+ ]
3020
+ },
3021
+ services: [
3022
+ ]
3023
+ },
3024
+ title: "Timeseries"
3025
+ }
3026
+ ],
3027
+ syncGroups: [
3028
+ {
3029
+ id: "Area_TimeSeries",
3030
+ type: "SYNCGROUPS_TYPE_SETBBOX"
3031
+ },
3032
+ {
3033
+ id: "Time_TimeSeries",
3034
+ type: "SYNCGROUPS_TYPE_SETTIME"
3035
+ }
3036
+ ],
3037
+ linking: {
3038
+ "timeseries-panel": [
3039
+ "timeseries-map"
3040
+ ]
3041
+ },
3042
+ mosaicNode: {
3043
+ direction: "row",
3044
+ first: "timeseries-map",
3045
+ second: "timeseries-panel",
3046
+ splitPercentage: 50
3047
+ }
3048
+ },
3049
+ {
3050
+ id: "soundingWorkspace",
3051
+ title: "Soundings",
3052
+ scope: "system",
3053
+ abstract: "Vertical profile observations",
3054
+ viewType: "multiWindow",
3055
+ views: [
3056
+ {
3057
+ mosaicNodeId: "sounding-map",
3058
+ componentType: "Map",
3059
+ initialProps: {
3060
+ mapPreset: {
3061
+ layers: [
3062
+ ],
3063
+ proj: {
3064
+ bbox: {
3065
+ left: -2782987.27,
3066
+ bottom: 3503549.84,
3067
+ right: 5009377.09,
3068
+ top: 11753184.62
3069
+ },
3070
+ srs: "EPSG:3857"
3071
+ },
3072
+ showTimeSlider: true,
3073
+ displayMapPin: true,
3074
+ shouldShowZoomControls: true
3075
+ },
3076
+ syncGroupsIds: [
3077
+ "Area_Sounding",
3078
+ "Time_Sounding"
3079
+ ]
3080
+ },
3081
+ title: "Map"
3082
+ },
3083
+ {
3084
+ mosaicNodeId: "sounding-panel",
3085
+ componentType: "Soundings",
3086
+ initialProps: {
3087
+ selectedSources: {
3088
+ },
3089
+ selectedLocations: {
3090
+ }
3091
+ },
3092
+ title: "Sounding"
3093
+ }
3094
+ ],
3095
+ syncGroups: [
3096
+ {
3097
+ id: "Area_Sounding",
3098
+ type: "SYNCGROUPS_TYPE_SETBBOX"
3099
+ },
3100
+ {
3101
+ id: "Time_Sounding",
3102
+ type: "SYNCGROUPS_TYPE_SETTIME"
3103
+ }
3104
+ ],
3105
+ linking: {
3106
+ "sounding-panel": [
3107
+ "sounding-map"
3108
+ ]
3109
+ },
3110
+ mosaicNode: {
3111
+ direction: "row",
3112
+ first: "sounding-map",
3113
+ second: "sounding-panel",
3114
+ splitPercentage: 50
3115
+ }
3116
+ },
3117
+ {
3118
+ id: "capWarningsWorkspace",
3119
+ title: "Cap warnings",
3120
+ scope: "system",
3121
+ abstract: "",
3122
+ viewType: "multiWindow",
3123
+ views: [
3124
+ {
3125
+ mosaicNodeId: "cap-map",
3126
+ componentType: "CapWarningMap",
3127
+ initialProps: {
3128
+ mapPreset: {
3129
+ layers: [
3130
+ ],
3131
+ proj: {
3132
+ bbox: {
3133
+ left: -2782987.27,
3134
+ bottom: 3503549.84,
3135
+ right: 5009377.09,
3136
+ top: 11753184.62
3137
+ },
3138
+ srs: "EPSG:3857"
3139
+ }
3140
+ },
3141
+ geoJson: {
3142
+ type: "FeatureCollection",
3143
+ features: [
3144
+ ]
3145
+ }
3146
+ },
3147
+ title: "CAP warnings map"
3148
+ },
3149
+ {
3150
+ mosaicNodeId: "cap-list",
3151
+ componentType: "CapWarningList",
3152
+ initialProps: {
3153
+ mapPreset: {
3154
+ layers: [
3155
+ ],
3156
+ proj: {
3157
+ bbox: {
3158
+ left: -2782987.27,
3159
+ bottom: 3503549.84,
3160
+ right: 5009377.09,
3161
+ top: 11753184.62
3162
+ },
3163
+ srs: "EPSG:3857"
3164
+ }
3165
+ },
3166
+ geoJson: {
3167
+ type: "FeatureCollection",
3168
+ features: [
3169
+ ]
3170
+ }
3171
+ },
3172
+ title: "CAP warnings list"
3173
+ }
3174
+ ],
3175
+ syncGroups: [
3176
+ ],
3177
+ mosaicNode: {
3178
+ direction: "row",
3179
+ first: "cap-map",
3180
+ second: "cap-list",
3181
+ splitPercentage: 50
3182
+ }
3183
+ }
3184
+ ];
3185
+
3186
+ /* *
3187
+ * Licensed under the Apache License, Version 2.0 (the "License");
3188
+ * you may not use this file except in compliance with the License.
3189
+ * You may obtain a copy of the License at
3190
+ *
3191
+ * http://www.apache.org/licenses/LICENSE-2.0
3192
+ *
3193
+ * Unless required by applicable law or agreed to in writing, software
3194
+ * distributed under the License is distributed on an "AS IS" BASIS,
3195
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3196
+ * See the License for the specific language governing permissions and
3197
+ * limitations under the License.
3198
+ *
3199
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3200
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
3201
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
3202
+ * */
3203
+ /*
3204
+ configureLibraryDefaults([LIB_KEY], {
3205
+ staleTime: 5 * 60 * 1000,
3206
+ });
3207
+ */
3208
+ var LIB_KEY = 'workspace-lib';
3209
+ var getPresetBaseUrl = function getPresetBaseUrl() {
3210
+ var config = sessionStorageProvider.getConfig();
3211
+ return (config == null ? void 0 : config.GW_PRESET_BACKEND_URL) || '';
3212
+ };
3213
+ var getIdFromUrl = function getIdFromUrl(url) {
3214
+ return url && /[^/]+$/.exec(url)[0];
3215
+ };
3216
+ var ERROR_NOT_FOUND$1 = 'Request failed with status code 400';
3217
+ var hasNoPresetBackend = function hasNoPresetBackend() {
3218
+ return !getPresetBaseUrl() && process.env.NODE_ENV !== 'test';
3219
+ };
3220
+ var extractWorkspacePresetFromJSON = function extractWorkspacePresetFromJSON(workspacePresetId) {
3221
+ var preset = workspacePresetsFallback.find(function (element) {
3222
+ return element.id === workspacePresetId;
3223
+ });
3224
+ if (!preset) {
3225
+ throw new Error(ERROR_NOT_FOUND$1);
3226
+ }
3227
+ return preset;
3228
+ };
3229
+ var filterWorkspacePresetList = function filterWorkspacePresetList(params) {
3230
+ var list = workspacePresetsFallback.map(function (preset) {
3231
+ var _preset$abstract;
3232
+ return {
3233
+ id: preset.id,
3234
+ title: preset.title,
3235
+ scope: preset.scope,
3236
+ viewType: preset.viewType,
3237
+ "abstract": (_preset$abstract = preset["abstract"]) != null ? _preset$abstract : '',
3238
+ description: preset.description,
3239
+ username: preset.username
3240
+ };
3241
+ });
3242
+ if (!params) {
3243
+ return list;
3244
+ }
3245
+ return list.filter(function (preset) {
3246
+ if (params.scope && preset.scope !== params.scope) {
3247
+ return false;
3248
+ }
3249
+ if (params.search) {
3250
+ var query = params.search.toLowerCase();
3251
+ return preset.title.toLowerCase().includes(query) || preset["abstract"].toLowerCase().includes(query);
3252
+ }
3253
+ return true;
3254
+ });
3255
+ };
3256
+ var favouritePresetKey = function favouritePresetKey(type, preset) {
3257
+ return type + ":" + preset.id;
3258
+ };
3259
+ var updateCachedFavourite = function updateCachedFavourite(client, queryKey, key, isFavourite) {
3260
+ client.setQueryData(queryKey, function (preferences) {
3261
+ var _preferences$favourit;
3262
+ var favourites = (_preferences$favourit = preferences == null ? void 0 : preferences.favouritePresets) != null ? _preferences$favourit : [];
3263
+ return Object.assign({}, preferences, {
3264
+ favouritePresets: isFavourite ? Array.from(new Set([].concat(favourites, [key]))) : favourites.filter(function (value) {
3265
+ return value !== key;
3266
+ })
3267
+ });
3268
+ });
3269
+ };
3270
+
3271
+ var getViewPreset = /*#__PURE__*/function () {
3272
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(viewpresetId, auth) {
3273
+ return _regenerator().w(function (_context) {
3274
+ while (1) switch (_context.n) {
3275
+ case 0:
3276
+ if (viewpresetId) {
3277
+ _context.n = 1;
3278
+ break;
3279
+ }
3280
+ return _context.a(2, null);
3281
+ case 1:
3282
+ return _context.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewpresetId, {
3283
+ headers: getHeaders(auth)
3284
+ }).then(handleResponse));
3285
+ }
3286
+ }, _callee);
3287
+ }));
3288
+ return function getViewPreset(_x, _x2) {
3289
+ return _ref.apply(this, arguments);
3290
+ };
3291
+ }();
3292
+ var getViewPresets$1 = /*#__PURE__*/function () {
3293
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(auth) {
3294
+ var url;
3295
+ return _regenerator().w(function (_context2) {
3296
+ while (1) switch (_context2.n) {
3297
+ case 0:
3298
+ url = getPresetBaseUrl() + "/viewpreset";
3299
+ return _context2.a(2, fetch(url, {
3300
+ headers: getHeaders(auth)
3301
+ }).then(handleResponse));
3302
+ }
3303
+ }, _callee2);
3304
+ }));
3305
+ return function getViewPresets(_x3) {
3306
+ return _ref2.apply(this, arguments);
3307
+ };
3308
+ }();
3309
+ var updateViewPreset = /*#__PURE__*/function () {
3310
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(viewpresetId, data, auth) {
3311
+ return _regenerator().w(function (_context3) {
3312
+ while (1) switch (_context3.n) {
3313
+ case 0:
3314
+ return _context3.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewpresetId, {
3315
+ headers: getHeaders(auth),
3316
+ method: 'PUT',
3317
+ body: JSON.stringify(data)
3318
+ }).then(handleResponse));
3319
+ }
3320
+ }, _callee3);
3321
+ }));
3322
+ return function updateViewPreset(_x4, _x5, _x6) {
3323
+ return _ref3.apply(this, arguments);
3324
+ };
3325
+ }();
3326
+ var saveViewPreset = /*#__PURE__*/function () {
3327
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(viewPresetId, data, auth) {
3328
+ var payload;
3329
+ return _regenerator().w(function (_context4) {
3330
+ while (1) switch (_context4.n) {
3331
+ case 0:
3332
+ payload = data.initialProps === null ? Object.assign({}, data, {
3333
+ initialProps: {}
3334
+ }) : data;
3335
+ return _context4.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewPresetId + "/", {
3336
+ headers: getHeaders(auth),
3337
+ method: 'PUT',
3338
+ body: JSON.stringify(payload)
3339
+ }).then(handleResponse));
3340
+ }
3341
+ }, _callee4);
3342
+ }));
3343
+ return function saveViewPreset(_x7, _x8, _x9) {
3344
+ return _ref4.apply(this, arguments);
3345
+ };
3346
+ }();
3347
+ var saveViewPresetAs = /*#__PURE__*/function () {
3348
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(data, auth) {
3349
+ var _response$headers$get;
3350
+ var payload, response, headerLocation;
3351
+ return _regenerator().w(function (_context5) {
3352
+ while (1) switch (_context5.n) {
3353
+ case 0:
3354
+ payload = data.initialProps === null ? Object.assign({}, data, {
3355
+ initialProps: {}
3356
+ }) : data;
3357
+ _context5.n = 1;
3358
+ return fetch(getPresetBaseUrl() + "/viewpreset/", {
3359
+ headers: getHeaders(auth),
3360
+ method: 'POST',
3361
+ body: JSON.stringify(payload)
3362
+ });
3363
+ case 1:
3364
+ response = _context5.v;
3365
+ _context5.n = 2;
3366
+ return handleResponse(response);
3367
+ case 2:
3368
+ headerLocation = (_response$headers$get = response.headers.get('Location')) != null ? _response$headers$get : response.headers.get('location');
3369
+ return _context5.a(2, getIdFromUrl(headerLocation));
3370
+ }
3371
+ }, _callee5);
3372
+ }));
3373
+ return function saveViewPresetAs(_x0, _x1) {
3374
+ return _ref5.apply(this, arguments);
3375
+ };
3376
+ }();
3377
+ var deleteViewPreset = /*#__PURE__*/function () {
3378
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(viewPresetId, auth) {
3379
+ return _regenerator().w(function (_context6) {
3380
+ while (1) switch (_context6.n) {
3381
+ case 0:
3382
+ return _context6.a(2, fetch(getPresetBaseUrl() + "/viewpreset/" + viewPresetId, {
3383
+ method: 'DELETE',
3384
+ headers: getHeaders(auth)
3385
+ }).then(handleResponse));
3386
+ }
3387
+ }, _callee6);
3388
+ }));
3389
+ return function deleteViewPreset(_x10, _x11) {
3390
+ return _ref6.apply(this, arguments);
3391
+ };
3392
+ }();
3393
+
3394
+ var API_KEY$1 = 'viewpreset-api';
3395
+ var generateViewPresetQueryKeys = function generateViewPresetQueryKeys() {
3396
+ for (var _len = arguments.length, queryKeys = new Array(_len), _key = 0; _key < _len; _key++) {
3397
+ queryKeys[_key] = arguments[_key];
3398
+ }
3399
+ return [LIB_KEY, API_KEY$1].concat(queryKeys);
3400
+ };
3401
+ var viewpresetQueryOptions = {
3402
+ keys: {
3403
+ all: function all() {
3404
+ return generateViewPresetQueryKeys();
3405
+ },
3406
+ views: function views() {
3407
+ return [].concat(viewpresetQueryOptions.keys.all(), ['view']);
3408
+ },
3409
+ lists: function lists() {
3410
+ return [].concat(viewpresetQueryOptions.keys.all(), ['list']);
3411
+ }
3412
+ },
3413
+ getViewPreset: function getViewPreset$1(id, credentials) {
3414
+ return queryOptions({
3415
+ queryKey: [].concat(viewpresetQueryOptions.keys.views(), [id]),
3416
+ queryFn: function () {
3417
+ var _queryFn = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
3418
+ return _regenerator().w(function (_context) {
3419
+ while (1) switch (_context.n) {
3420
+ case 0:
3421
+ return _context.a(2, getViewPreset(id, credentials));
3422
+ }
3423
+ }, _callee);
3424
+ }));
3425
+ function queryFn() {
3426
+ return _queryFn.apply(this, arguments);
3427
+ }
3428
+ return queryFn;
3429
+ }()
3430
+ });
3431
+ },
3432
+ getViewPresets: function getViewPresets(credentials) {
3433
+ return queryOptions({
3434
+ queryKey: viewpresetQueryOptions.keys.lists(),
3435
+ queryFn: function () {
3436
+ var _queryFn2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
3437
+ return _regenerator().w(function (_context2) {
3438
+ while (1) switch (_context2.n) {
3439
+ case 0:
3440
+ return _context2.a(2, getViewPresets$1(credentials));
3441
+ }
3442
+ }, _callee2);
3443
+ }));
3444
+ function queryFn() {
3445
+ return _queryFn2.apply(this, arguments);
3446
+ }
3447
+ return queryFn;
3448
+ }(),
3449
+ staleTime: 2 * 60 * 1000,
3450
+ refetchOnMount: true
3451
+ });
3452
+ },
3453
+ saveViewPreset: function saveViewPreset$1(id, data, credentials) {
3454
+ return queryOptions({
3455
+ queryKey: [].concat(viewpresetQueryOptions.keys.views(), [id, 'save']),
3456
+ staleTime: 0,
3457
+ queryFn: function () {
3458
+ var _queryFn3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
3459
+ return _regenerator().w(function (_context3) {
3460
+ while (1) switch (_context3.n) {
3461
+ case 0:
3462
+ return _context3.a(2, saveViewPreset(id, data, credentials));
3463
+ }
3464
+ }, _callee3);
3465
+ }));
3466
+ function queryFn() {
3467
+ return _queryFn3.apply(this, arguments);
3468
+ }
3469
+ return queryFn;
3470
+ }()
3471
+ });
3472
+ },
3473
+ saveViewPresetAs: function saveViewPresetAs$1(data, credentials) {
3474
+ return queryOptions({
3475
+ queryKey: [].concat(viewpresetQueryOptions.keys.views(), ['save-as']),
3476
+ staleTime: 0,
3477
+ queryFn: function () {
3478
+ var _queryFn4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
3479
+ return _regenerator().w(function (_context4) {
3480
+ while (1) switch (_context4.n) {
3481
+ case 0:
3482
+ return _context4.a(2, saveViewPresetAs(data, credentials));
3483
+ }
3484
+ }, _callee4);
3485
+ }));
3486
+ function queryFn() {
3487
+ return _queryFn4.apply(this, arguments);
3488
+ }
3489
+ return queryFn;
3490
+ }()
3491
+ });
3492
+ }
3493
+ };
3494
+
3495
+ /* *
3496
+ * Licensed under the Apache License, Version 2.0 (the "License");
3497
+ * you may not use this file except in compliance with the License.
3498
+ * You may obtain a copy of the License at
3499
+ *
3500
+ * http://www.apache.org/licenses/LICENSE-2.0
3501
+ *
3502
+ * Unless required by applicable law or agreed to in writing, software
3503
+ * distributed under the License is distributed on an "AS IS" BASIS,
3504
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3505
+ * See the License for the specific language governing permissions and
3506
+ * limitations under the License.
3507
+ *
3508
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3509
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
3510
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
3511
+ * */
3512
+ var routes = {
3513
+ root: '/',
3514
+ workspace: '/workspace',
3515
+ workspaceDetail: '/workspace/:workspaceId'
3516
+ };
3517
+ var getWorkspaceRouteUrl = function getWorkspaceRouteUrl(workspaceId) {
3518
+ return workspaceId ? routes.workspaceDetail.replace(':workspaceId', workspaceId) : routes.workspace;
3519
+ };
3303
3520
 
3304
3521
  /* *
3305
3522
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -4307,6 +4524,7 @@ workspaceListener.startListening({
4307
4524
  case 1:
4308
4525
  listenerApi.dispatch(timeSeriesActions.resetTimeSeriesPanels());
4309
4526
  listenerApi.dispatch(syncGroupsActions.syncGroupClear());
4527
+ listenerApi.dispatch(mapActions.startViewsSettling());
4310
4528
  listenerApi.dispatch(workspaceActions.setPreset(payload));
4311
4529
  allSyncGroups = getSyncGroups(payload.workspacePreset.syncGroups);
4312
4530
  allSyncGroups.map(function (syncGroup) {
@@ -4369,6 +4587,8 @@ workspaceListener.startListening({
4369
4587
  url: getWorkspaceRouteUrl()
4370
4588
  }));
4371
4589
  }
4590
+ _context4.n = 3;
4591
+ return restoreSyncGroupViews(listenerApi);
4372
4592
  case 3:
4373
4593
  return _context4.a(2);
4374
4594
  }
@@ -4843,7 +5063,7 @@ workspaceListener.startListening({
4843
5063
  actionCreator: workspaceActions.updateWorkspaceViews,
4844
5064
  effect: function () {
4845
5065
  var _effect9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee13(_, listenerApi) {
4846
- var viewCountBefore, viewCountAfter, aViewWasClosed, viewIds;
5066
+ var viewCountBefore, viewCountAfter, aViewWasClosed;
4847
5067
  return _regenerator().w(function (_context13) {
4848
5068
  while (1) switch (_context13.n) {
4849
5069
  case 0:
@@ -4866,24 +5086,7 @@ workspaceListener.startListening({
4866
5086
  if (aViewWasClosed) {
4867
5087
  listenerApi.dispatch(soundingsActions.notifyViewClosed());
4868
5088
  }
4869
- // Adjust the bbox of the original view after the new map is added. This is a temporal solution until the OpenLayers ticket
4870
- // https://github.com/openlayers/openlayers/issues/16572 is solved.
4871
- _context13.n = 2;
4872
- return waitForFrame();
4873
5089
  case 2:
4874
- viewIds = getViewIds(listenerApi.getState());
4875
- viewIds.forEach(function (viewId) {
4876
- var bbox = mapSelectors.getBbox(listenerApi.getState(), viewId);
4877
- var srs = mapSelectors.getSrs(listenerApi.getState(), viewId);
4878
- if ((bbox == null ? void 0 : bbox.left) !== undefined && srs) {
4879
- listenerApi.dispatch(mapActions.setBbox({
4880
- mapId: viewId,
4881
- bbox: bbox,
4882
- srs: srs
4883
- }));
4884
- }
4885
- });
4886
- case 3:
4887
5090
  return _context13.a(2);
4888
5091
  }
4889
5092
  }, _callee13);
@@ -8006,13 +8209,15 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref2) {
8006
8209
  minHeight: MIN_HEIGHT_SCROLLABLE_LIST,
8007
8210
  overflow: 'hidden'
8008
8211
  },
8009
- children: [jsxs(Box, {
8212
+ children: [jsx(Box, {
8010
8213
  sx: {
8011
8214
  marginBottom: '4px',
8012
8215
  fontSize: '12px',
8013
8216
  ml: 0.5
8014
8217
  },
8015
- children: [workspacePresets.length, " ", t('workspace-results')]
8218
+ children: t('workspace-results', {
8219
+ count: workspacePresets.length
8220
+ })
8016
8221
  }), jsx(Box, {
8017
8222
  sx: {
8018
8223
  paddingTop: LIST_PADDING_TOP + "px",
@@ -9784,6 +9989,7 @@ var _WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(
9784
9989
  syncGroupsIds: relatedSyncGroupIds
9785
9990
  };
9786
9991
  case 'Plugin':
9992
+ case 'CrossSection':
9787
9993
  return getViewPresetToSendToBackend(store.getState(), panelId).initialProps;
9788
9994
  default:
9789
9995
  return undefined;
@@ -12139,6 +12345,17 @@ var ViewPresetsFormDialogConnect = function ViewPresetsFormDialogConnect(_ref) {
12139
12345
  });
12140
12346
  };
12141
12347
 
12348
+ var _templateObject, _templateObject2, _offMainThreadBarAnim;
12349
+ var bar1SlideKeyframes = keyframes(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n 0% { transform: translateX(-35%) scaleX(0.35); }\n 60%, 100% { transform: translateX(100%) scaleX(0.9); }\n"])));
12350
+ var bar2SlideKeyframes = keyframes(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["\n 0% { transform: translateX(-200%) scaleX(2); }\n 60%, 100% { transform: translateX(107%) scaleX(0.01); }\n"])));
12351
+ /** MUI's indeterminate motion as transforms, which keep animating while the main thread mounts views. */
12352
+ var offMainThreadBarAnimation = (_offMainThreadBarAnim = {}, _offMainThreadBarAnim["& ." + linearProgressClasses.bar1 + ", & ." + linearProgressClasses.bar2] = {
12353
+ width: '100%'
12354
+ }, _offMainThreadBarAnim["& ." + linearProgressClasses.bar1] = {
12355
+ animation: bar1SlideKeyframes + " 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite"
12356
+ }, _offMainThreadBarAnim["& ." + linearProgressClasses.bar2] = {
12357
+ animation: bar2SlideKeyframes + " 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite"
12358
+ }, _offMainThreadBarAnim);
12142
12359
  var WorkspaceDetail = function WorkspaceDetail(_ref) {
12143
12360
  var initialWorkspaceId = _ref.initialWorkspaceId,
12144
12361
  workspaceId = _ref.workspaceId,
@@ -12158,6 +12375,7 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
12158
12375
  return getWorkspaceError(store);
12159
12376
  });
12160
12377
  var isLoading = useSelector(isWorkspaceLoading);
12378
+ var areViewsSettling = useSelector(mapSelectors.areViewsSettling);
12161
12379
  var workspaceData = useSelector(getWorkspaceData);
12162
12380
  var workspaceState = useSelector(getWorkspaceState);
12163
12381
  var fetchWorkspace = React.useCallback(function (newWorkspaceId) {
@@ -12207,15 +12425,15 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
12207
12425
  width: '100%',
12208
12426
  height: '100%'
12209
12427
  },
12210
- children: [!!isLoading && jsx(LinearProgress, {
12428
+ children: [!!(isLoading || areViewsSettling) && jsx(LinearProgress, {
12211
12429
  color: "secondary",
12212
12430
  "data-testid": "loading-bar",
12213
- sx: {
12431
+ sx: Object.assign({
12214
12432
  position: 'absolute',
12215
12433
  width: '100%',
12216
12434
  top: 0,
12217
12435
  zIndex: 100
12218
- }
12436
+ }, offMainThreadBarAnimation)
12219
12437
  }), !!error && error.type !== WorkspaceErrorType.SAVE && jsx(AlertBanner, Object.assign({
12220
12438
  info: error.message,
12221
12439
  shouldClose: true,
@@ -12266,6 +12484,351 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
12266
12484
  });
12267
12485
  };
12268
12486
 
12487
+ /** Error whose message is already translated and can be shown to the user as is. */
12488
+ var TranslatedError = /*#__PURE__*/function (_Error) {
12489
+ function TranslatedError() {
12490
+ return _Error.apply(this, arguments) || this;
12491
+ }
12492
+ _inheritsLoose(TranslatedError, _Error);
12493
+ return TranslatedError;
12494
+ }(/*#__PURE__*/_wrapNativeSuper(Error));
12495
+ /**
12496
+ * Coordinates the Data Explorer with the workspace and Timeseries panels.
12497
+ * Data Explorer itself does not depend on workspace or Timeseries.
12498
+ */
12499
+ var DataExplorerTimeseriesConnect = function DataExplorerTimeseriesConnect(_ref) {
12500
+ var productConfigKey = _ref.productConfigKey;
12501
+ var store = useStore();
12502
+ var _useTranslation = useTranslation([DATA_EXPLORER_NAMESPACE, SHARED_NAMESPACE]),
12503
+ t = _useTranslation.t;
12504
+ var _React$useState = React.useState(),
12505
+ choice = _React$useState[0],
12506
+ setChoice = _React$useState[1];
12507
+ var resolveChoice = React.useRef(undefined);
12508
+ var mounted = React.useRef(true);
12509
+ React.useEffect(function () {
12510
+ mounted.current = true;
12511
+ return function () {
12512
+ mounted.current = false;
12513
+ resolveChoice.current == null || resolveChoice.current(undefined);
12514
+ };
12515
+ }, []);
12516
+ var choose = React.useCallback(/*#__PURE__*/function () {
12517
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(nextChoice) {
12518
+ return _regenerator().w(function (_context) {
12519
+ while (1) switch (_context.n) {
12520
+ case 0:
12521
+ setChoice(nextChoice);
12522
+ return _context.a(2, new Promise(function (resolve) {
12523
+ resolveChoice.current = resolve;
12524
+ }));
12525
+ }
12526
+ }, _callee);
12527
+ }));
12528
+ return function (_x) {
12529
+ return _ref2.apply(this, arguments);
12530
+ };
12531
+ }(), []);
12532
+ var finishChoice = function finishChoice(id) {
12533
+ setChoice(undefined);
12534
+ resolveChoice.current == null || resolveChoice.current(id);
12535
+ resolveChoice.current = undefined;
12536
+ };
12537
+ var addTimeseriesToWorkspace = React.useCallback(/*#__PURE__*/function () {
12538
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref3) {
12539
+ var _store$getState$works, _state$workspace, _state$workspace2, _state$workspace3, _state$workspace4, _getViewById3, _timeSeriesSelectors$2;
12540
+ var title, collectionLinks, targetMapId, workspaceId, collectionUrl, target, state, panels, linkedPanels, candidates, panelId, existingService, service, plotId, isNewPanel, plotPreset, mosaicNode, _t;
12541
+ return _regenerator().w(function (_context2) {
12542
+ while (1) switch (_context2.n) {
12543
+ case 0:
12544
+ title = _ref3.title, collectionLinks = _ref3.collectionLinks, targetMapId = _ref3.targetMapId;
12545
+ workspaceId = (_store$getState$works = store.getState().workspace) == null ? void 0 : _store$getState$works.id;
12546
+ if (!(collectionLinks.length === 1)) {
12547
+ _context2.n = 1;
12548
+ break;
12549
+ }
12550
+ _t = collectionLinks[0].href;
12551
+ _context2.n = 3;
12552
+ break;
12553
+ case 1:
12554
+ _context2.n = 2;
12555
+ return choose({
12556
+ title: t('dataexplorer-select-data-link'),
12557
+ options: collectionLinks.map(function (link) {
12558
+ return {
12559
+ id: link.href,
12560
+ title: link.title || link.href
12561
+ };
12562
+ })
12563
+ });
12564
+ case 2:
12565
+ _t = _context2.v;
12566
+ case 3:
12567
+ collectionUrl = _t;
12568
+ if (!(!collectionUrl || !mounted.current)) {
12569
+ _context2.n = 4;
12570
+ break;
12571
+ }
12572
+ return _context2.a(2);
12573
+ case 4:
12574
+ _context2.n = 5;
12575
+ return resolveEdrCollectionTarget(collectionUrl);
12576
+ case 5:
12577
+ target = _context2.v;
12578
+ if (mounted.current) {
12579
+ _context2.n = 6;
12580
+ break;
12581
+ }
12582
+ return _context2.a(2);
12583
+ case 6:
12584
+ state = store.getState();
12585
+ if (!(((_state$workspace = state.workspace) == null ? void 0 : _state$workspace.id) !== workspaceId || (_state$workspace2 = state.workspace) != null && _state$workspace2.isLoading)) {
12586
+ _context2.n = 7;
12587
+ break;
12588
+ }
12589
+ throw new TranslatedError(t('dataexplorer-timeseries-error-workspace-changed'));
12590
+ case 7:
12591
+ panels = getViewIds(state).filter(function (id) {
12592
+ var _getViewById;
12593
+ return ((_getViewById = getViewById(state, id)) == null ? void 0 : _getViewById.componentType) === 'TimeSeries';
12594
+ });
12595
+ linkedPanels = targetMapId ? panels.filter(function (id) {
12596
+ var linkedMaps = genericSelectors.getLinkedTargetIds(state, id);
12597
+ return linkedMaps.length > 0 ? linkedMaps.includes(targetMapId) : timeSeriesSelectors.getMapId(state, id) === targetMapId;
12598
+ }) : [];
12599
+ candidates = linkedPanels.length > 0 ? linkedPanels : panels;
12600
+ panelId = candidates.length === 1 ? candidates[0] : undefined;
12601
+ if (!(candidates.length > 1)) {
12602
+ _context2.n = 9;
12603
+ break;
12604
+ }
12605
+ _context2.n = 8;
12606
+ return choose({
12607
+ title: t('dataexplorer-select-timeseries-panel'),
12608
+ options: candidates.map(function (id, index) {
12609
+ var _getViewById2, _timeSeriesSelectors$;
12610
+ return {
12611
+ id: id,
12612
+ title: ((_getViewById2 = getViewById(state, id)) == null ? void 0 : _getViewById2.title) || t('dataexplorer-timeseries-panel', {
12613
+ number: index + 1
12614
+ }),
12615
+ description: (_timeSeriesSelectors$ = timeSeriesSelectors.getPlotState(state, id)) == null ? void 0 : _timeSeriesSelectors$.plots.map(function (plot) {
12616
+ return plot.title;
12617
+ }).join(', ')
12618
+ };
12619
+ })
12620
+ });
12621
+ case 8:
12622
+ panelId = _context2.v;
12623
+ if (panelId) {
12624
+ _context2.n = 9;
12625
+ break;
12626
+ }
12627
+ return _context2.a(2);
12628
+ case 9:
12629
+ state = store.getState();
12630
+ if (mounted.current) {
12631
+ _context2.n = 10;
12632
+ break;
12633
+ }
12634
+ return _context2.a(2);
12635
+ case 10:
12636
+ if (!(((_state$workspace3 = state.workspace) == null ? void 0 : _state$workspace3.id) !== workspaceId || (_state$workspace4 = state.workspace) != null && _state$workspace4.isLoading || panelId && ((_getViewById3 = getViewById(state, panelId)) == null ? void 0 : _getViewById3.componentType) !== 'TimeSeries')) {
12637
+ _context2.n = 11;
12638
+ break;
12639
+ }
12640
+ throw new TranslatedError(t('dataexplorer-timeseries-error-workspace-changed'));
12641
+ case 11:
12642
+ // Saved services may not have loaded yet when creating the first panel.
12643
+ // Hydrate them before service actions persist the current service list.
12644
+ store.dispatch(timeSeriesActions.loadUserAddedTimeSeriesServices(getUserAddedEDRServices()));
12645
+ state = store.getState();
12646
+ existingService = (_timeSeriesSelectors$2 = timeSeriesSelectors.getServices(state)) == null ? void 0 : _timeSeriesSelectors$2.find(function (service) {
12647
+ return service.type === 'EDR' && normalizeEdrServiceUrl(service.url) === normalizeEdrServiceUrl(target.serviceUrl);
12648
+ });
12649
+ service = existingService != null ? existingService : {
12650
+ id: v4(),
12651
+ url: target.serviceUrl,
12652
+ type: 'EDR',
12653
+ name: target.serviceInformation.title || new URL(target.serviceUrl).hostname,
12654
+ description: target.serviceInformation.description || ''
12655
+ };
12656
+ plotId = v4();
12657
+ isNewPanel = !panelId;
12658
+ panelId != null ? panelId : panelId = v4();
12659
+ if (!(!isNewPanel && !timeSeriesSelectors.getPlotState(state, panelId))) {
12660
+ _context2.n = 12;
12661
+ break;
12662
+ }
12663
+ throw new TranslatedError(t('dataexplorer-timeseries-error-panel-loading'));
12664
+ case 12:
12665
+ if (!existingService) {
12666
+ store.dispatch(timeSeriesActions.upsertService(Object.assign({}, service, {
12667
+ panelId: panelId,
12668
+ isUpdate: false
12669
+ })));
12670
+ store.dispatch(snackbarActions.openSnackbar({
12671
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
12672
+ message: t('dataexplorer-timeseries-service-added', {
12673
+ service: service.name,
12674
+ host: new URL(service.url).host
12675
+ })
12676
+ }));
12677
+ }
12678
+ if (isNewPanel) {
12679
+ plotPreset = {
12680
+ mapId: targetMapId || '',
12681
+ plots: [{
12682
+ plotId: plotId,
12683
+ title: title
12684
+ }],
12685
+ parameters: []
12686
+ };
12687
+ store.dispatch(workspaceActions.addWorkspaceView({
12688
+ id: panelId,
12689
+ componentType: 'TimeSeries',
12690
+ initialProps: {
12691
+ plotPreset: plotPreset,
12692
+ services: [],
12693
+ syncGroupsIds: []
12694
+ }
12695
+ }));
12696
+ store.dispatch(viewPresetActions.setViewPresetInline({
12697
+ panelId: panelId,
12698
+ isInline: true
12699
+ }));
12700
+ mosaicNode = getMosaicNode(store.getState());
12701
+ store.dispatch(workspaceActions.updateWorkspaceViews({
12702
+ mosaicNode: mosaicNode ? {
12703
+ direction: 'row',
12704
+ first: mosaicNode,
12705
+ second: panelId
12706
+ } : panelId
12707
+ }));
12708
+ // Use the same preset at mount time, so registration preserves this plot.
12709
+ store.dispatch(timeSeriesActions.registerTimeSeriesPreset({
12710
+ panelId: panelId,
12711
+ plotPreset: plotPreset
12712
+ }));
12713
+ if (targetMapId) {
12714
+ store.dispatch(syncGroupsActions.updateLinkedMap({
12715
+ panelId: panelId,
12716
+ mapIds: [targetMapId]
12717
+ }));
12718
+ }
12719
+ } else {
12720
+ store.dispatch(timeSeriesActions.addPlot({
12721
+ panelId: panelId,
12722
+ plotId: plotId,
12723
+ title: title,
12724
+ origin: 'dataExplorer'
12725
+ }));
12726
+ }
12727
+ store.dispatch(viewPresetActions.setViewPresetHasChanges({
12728
+ panelId: panelId,
12729
+ hasChanges: true
12730
+ }));
12731
+ store.dispatch(workspaceActions.markWorkspaceChanged());
12732
+ store.dispatch(timeSeriesActions.openCollectionSelection({
12733
+ panelId: panelId,
12734
+ plotId: plotId,
12735
+ serviceId: service.id,
12736
+ collectionId: target.collection.id
12737
+ }));
12738
+ store.dispatch(uiActions.setActiveWindowId({
12739
+ activeWindowId: panelId
12740
+ }));
12741
+ [uiTypes.DialogTypes.TimeSeriesManager, uiTypes.DialogTypes.TimeSeriesSelect].forEach(function (type) {
12742
+ return store.dispatch(uiActions.setToggleOpenDialog({
12743
+ type: type,
12744
+ setOpen: true,
12745
+ sourcePanelId: panelId
12746
+ }));
12747
+ });
12748
+ case 13:
12749
+ return _context2.a(2);
12750
+ }
12751
+ }, _callee2);
12752
+ }));
12753
+ return function (_x2) {
12754
+ return _ref4.apply(this, arguments);
12755
+ };
12756
+ }(), [choose, store, t]);
12757
+ var addTimeseries = React.useCallback(/*#__PURE__*/function () {
12758
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(request) {
12759
+ var _t2;
12760
+ return _regenerator().w(function (_context3) {
12761
+ while (1) switch (_context3.p = _context3.n) {
12762
+ case 0:
12763
+ _context3.p = 0;
12764
+ _context3.n = 1;
12765
+ return addTimeseriesToWorkspace(request);
12766
+ case 1:
12767
+ _context3.n = 5;
12768
+ break;
12769
+ case 2:
12770
+ _context3.p = 2;
12771
+ _t2 = _context3.v;
12772
+ if (!(_t2 instanceof TranslatedError)) {
12773
+ _context3.n = 3;
12774
+ break;
12775
+ }
12776
+ throw _t2;
12777
+ case 3:
12778
+ if (!(_t2 instanceof EdrCollectionTargetError)) {
12779
+ _context3.n = 4;
12780
+ break;
12781
+ }
12782
+ throw new TranslatedError(t("dataexplorer-timeseries-error-" + _t2.code));
12783
+ case 4:
12784
+ console.error('Unable to add dataset as Timeseries: ', _t2);
12785
+ throw new TranslatedError(t('dataexplorer-timeseries-error-generic'));
12786
+ case 5:
12787
+ return _context3.a(2);
12788
+ }
12789
+ }, _callee3, null, [[0, 2]]);
12790
+ }));
12791
+ return function (_x3) {
12792
+ return _ref5.apply(this, arguments);
12793
+ };
12794
+ }(), [addTimeseriesToWorkspace, t]);
12795
+ return jsxs(Fragment, {
12796
+ children: [jsx(DataExplorerConnect, {
12797
+ onAddTimeseries: addTimeseries,
12798
+ productConfigKey: productConfigKey
12799
+ }), jsxs(Dialog, {
12800
+ onClose: function onClose() {
12801
+ return finishChoice();
12802
+ },
12803
+ open: !!choice,
12804
+ children: [jsx(DialogTitle, {
12805
+ children: choice == null ? void 0 : choice.title
12806
+ }), jsx(List, {
12807
+ children: choice == null ? void 0 : choice.options.map(function (option) {
12808
+ return jsx(ListItemButton, {
12809
+ onClick: function onClick() {
12810
+ return finishChoice(option.id);
12811
+ },
12812
+ children: jsx(ListItemText, {
12813
+ primary: option.title,
12814
+ secondary: option.description
12815
+ })
12816
+ }, option.id);
12817
+ })
12818
+ }), jsx(DialogActions, {
12819
+ children: jsx(Button, {
12820
+ onClick: function onClick() {
12821
+ return finishChoice();
12822
+ },
12823
+ children: t('shared-confirmation-cancel', {
12824
+ ns: SHARED_NAMESPACE
12825
+ })
12826
+ })
12827
+ })]
12828
+ })]
12829
+ });
12830
+ };
12831
+
12269
12832
  /* *
12270
12833
  * Licensed under the Apache License, Version 2.0 (the "License");
12271
12834
  * you may not use this file except in compliance with the License.
@@ -12478,6 +13041,20 @@ var viewPresets = [
12478
13041
  ]
12479
13042
  }
12480
13043
  },
13044
+ {
13045
+ id: "template-crosssection",
13046
+ title: {
13047
+ en: "New cross section preset",
13048
+ fi: "Uusi poikkileikkauspreset",
13049
+ no: "Ny tverrsnittpreset",
13050
+ nl: "Nieuwe cross section preset"
13051
+ },
13052
+ componentType: "CrossSection",
13053
+ initialProps: {
13054
+ syncGroupsIds: [
13055
+ ]
13056
+ }
13057
+ },
12481
13058
  {
12482
13059
  id: "template-warninglist",
12483
13060
  title: {
@@ -13906,4 +14483,4 @@ var workspaceEndpoints = [].concat(createUserPreferencesEndpoints(), [http.get(/
13906
14483
  }, _callee6);
13907
14484
  })))]);
13908
14485
 
13909
- export { ALL_COMPONENT_TYPES, AVIATION_COMPONENT_TYPES, CAP_COMPONENT_TYPES, ComponentsLookUpWrapper, DemoWrapper, PresetAction, SUPPORTED_COMPONENT_TYPES, SUPPORTED_TIMESERIES_COMPONENT_TYPES, ViewPresetErrorComponent, ViewPresetErrorType, WARNING_LIST_COMPONENT_TYPES, WORKSPACE_NAMESPACE, WorkspaceDetail, WorkspaceErrorType, WorkspaceI18nProvider, WorkspacePresetAction, WorkspaceStoreWrapper, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProviderWithStore, createBalancedMosaicNode, createCustomEmptyMapWorkspace, defaultAuthConfig, defaultViewPresetsFilters, getEmptyMapWorkspace, getWorkspaceRouteUrl, selectors$1 as selectors, templatePresetsFixture, viewPresetActions, viewPresetsListener, viewPresetsReducer, workspaceActions, workspaceEndpoints, workspaceListActions, workspaceListListener, workspaceListReducer, workspaceListener, workspaceMiddlewares, workspaceReducer, workspaceReducersMap, routes as workspaceRoutes, workspaceSentryStateMap, workspaceTranslations };
14486
+ export { ALL_COMPONENT_TYPES, AVIATION_COMPONENT_TYPES, CAP_COMPONENT_TYPES, ComponentsLookUpWrapper, DataExplorerTimeseriesConnect, DemoWrapper, PresetAction, SUPPORTED_COMPONENT_TYPES, SUPPORTED_TIMESERIES_COMPONENT_TYPES, ViewPresetErrorComponent, ViewPresetErrorType, WARNING_LIST_COMPONENT_TYPES, WORKSPACE_NAMESPACE, WorkspaceDetail, WorkspaceErrorType, WorkspaceI18nProvider, WorkspacePresetAction, WorkspaceStoreWrapper, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProviderWithStore, createBalancedMosaicNode, createCustomEmptyMapWorkspace, defaultAuthConfig, defaultViewPresetsFilters, getEmptyMapWorkspace, getWorkspaceRouteUrl, selectors$1 as selectors, templatePresetsFixture, viewPresetActions, viewPresetsListener, viewPresetsReducer, workspaceActions, workspaceEndpoints, workspaceListActions, workspaceListListener, workspaceListReducer, workspaceListener, workspaceMiddlewares, workspaceReducer, workspaceReducersMap, routes as workspaceRoutes, workspaceSentryStateMap, workspaceTranslations };