@opengeoweb/workspace 20.2.0 → 21.0.0-nightly-20261030

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,25 +1,25 @@
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 } from '@opengeoweb/store';
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
5
  import { timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer } from '@opengeoweb/time-series';
6
6
  import { chunk, cloneDeep, isEqual, isString } from 'lodash';
7
7
  import { getLeaves, createBalancedTreeFromLeaves, MosaicContext, getAndAssertNodeAtPathExists, MosaicWindow, Mosaic } from 'react-mosaic-component';
8
8
  import { queryOptions, useQueryClient, useQuery, useMutation, useIsMutating } from '@tanstack/react-query';
9
- import { sessionStorageProvider, isAxiosError, getAxiosErrorMessage, isAuthError, isAxiosAuthError, SHARED_NAMESPACE, safelyInitI18nForTestsAndStories, sharedTranslations, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, usePrevious, AlertBanner, CustomAccordion, CustomTooltip, linkifyText, dateUtils, SystemScope, SearchHighlight, ToggleMenu, SearchField, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, isTargetInteractiveInput, ConfirmationButtons } from '@opengeoweb/shared';
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';
10
10
  import { pluginsActions, getPluginState, pluginsReducer, PluginProvider, PluginDebugProvider, OverlayPluginMenuButton, usePluginCatalog, OverlayPluginWindows } from '@opengeoweb/plugins';
11
- import { warningsFiltersActions, publicWarningsSelectors, warningsTranslations, WARN_NAMESPACE } from '@opengeoweb/warnings';
11
+ import { warningsTranslations, WARN_NAMESPACE, warningsFiltersActions, publicWarningsSelectors } from '@opengeoweb/warnings';
12
12
  import { snackbarTypes, snackbarActions, snackbarListener, snackbarReducer, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
13
+ import i18n from 'i18next';
14
+ import { useTranslation, I18nextProvider } from 'react-i18next';
15
+ import { coreTranslations, CORE_NAMESPACE, LoadingIndicatorProgressBar } from '@opengeoweb/core';
16
+ import { formFieldsTranslations, FORM_FIELDS_NAMESPACE, ReactHookFormHiddenInput, ReactHookFormTextField, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
17
+ import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE } from '@opengeoweb/webmap-react';
13
18
  import { isAxiosError as isAxiosError$1 } from 'axios';
14
19
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
15
- import { useTranslation, I18nextProvider } from 'react-i18next';
16
20
  import { Provider, useDispatch, useSelector, useStore, shallowEqual } from 'react-redux';
17
21
  import { AuthenticationProvider, useAuthenticationContext, GEOWEB_ROLE_PRESETS_ADMIN } from '@opengeoweb/authentication';
18
22
  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';
19
- import i18n from 'i18next';
20
- import { coreTranslations, CORE_NAMESPACE, LoadingIndicatorProgressBar } from '@opengeoweb/core';
21
- import { formFieldsTranslations, FORM_FIELDS_NAMESPACE, ReactHookFormHiddenInput, ReactHookFormTextField, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
22
- import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE } from '@opengeoweb/webmap-react';
23
23
  import React, { useEffect, useCallback } from 'react';
24
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
25
  import 'react-mosaic-component/react-mosaic-component.css';
@@ -34,12 +34,6 @@ var en = {
34
34
  "workspace-favourites-error": "Could not load or save favourites. Please try again.",
35
35
  "workspace-menu": "Workspace menu",
36
36
  "workspace-new": "New workspace",
37
- "workspace-new-soundings": "New soundings workspace",
38
- "workspace-template-map": "New map preset",
39
- "workspace-template-timeseries": "New timeseries preset",
40
- "workspace-template-soundings": "New sounding preset",
41
- "workspace-template-warninglist": "New warninglist preset",
42
- "workspace-template-timeline": "New timeline preset",
43
37
  "workspace-loading": "Loading",
44
38
  "workspace-options": "Options",
45
39
  "workspace-results": "results",
@@ -196,12 +190,6 @@ var fi = {
196
190
  "workspace-favourites-error": "Suosikkeja ei voitu ladata tai tallentaa. Yritä uudelleen.",
197
191
  "workspace-menu": "Workspace menu",
198
192
  "workspace-new": "Uusi workspace",
199
- "workspace-new-soundings": "Uusi luotaustyötila",
200
- "workspace-template-map": "Uusi map preset",
201
- "workspace-template-timeseries": "Uusi timeseries preset",
202
- "workspace-template-soundings": "Uusi luotauspreset",
203
- "workspace-template-warninglist": "Uusi varoituslistapreset",
204
- "workspace-template-timeline": "Uusi aikajanapreset",
205
193
  "workspace-loading": "Ladataan",
206
194
  "workspace-options": "Valinnat",
207
195
  "workspace-results": "tulokset",
@@ -350,12 +338,6 @@ var no = {
350
338
  "workspace-favourites-error": "Kunne ikke laste eller lagre favoritter. Vennligst prøv igjen.",
351
339
  "workspace-menu": "Arbeidsflater",
352
340
  "workspace-new": "Ny arbeidsflate",
353
- "workspace-new-soundings": "New soundings workspace",
354
- "workspace-template-map": "Ny kartpreset",
355
- "workspace-template-timeseries": "Ny tidsseriepreset",
356
- "workspace-template-soundings": "Ny sonderingspreset",
357
- "workspace-template-warninglist": "Ny varsellistepreset",
358
- "workspace-template-timeline": "Ny tidslinjepreset",
359
341
  "workspace-loading": "Laster",
360
342
  "workspace-options": "Valg",
361
343
  "workspace-results": "resultater",
@@ -505,12 +487,6 @@ var nl = {
505
487
  "workspace-favourites-error": "Kon favorieten niet laden of opslaan. Probeer het opnieuw.",
506
488
  "workspace-menu": "Workspace menu",
507
489
  "workspace-new": "Nieuwe workspace",
508
- "workspace-new-soundings": "Nieuwe soundings workspace",
509
- "workspace-template-map": "Nieuwe map preset",
510
- "workspace-template-timeseries": "Nieuwe timeseries preset",
511
- "workspace-template-soundings": "Nieuwe sounding preset",
512
- "workspace-template-warninglist": "Nieuwe warninglist preset",
513
- "workspace-template-timeline": "Nieuwe timeline preset",
514
490
  "workspace-loading": "Laden",
515
491
  "workspace-options": "Opties",
516
492
  "workspace-results": "resultaten",
@@ -1673,7 +1649,6 @@ var PresetFilterType;
1673
1649
  PresetFilterType["favourites"] = "favourites";
1674
1650
  })(PresetFilterType || (PresetFilterType = {}));
1675
1651
 
1676
- /* eslint-disable no-redeclare */
1677
1652
  /* *
1678
1653
  * Licensed under the Apache License, Version 2.0 (the "License");
1679
1654
  * you may not use this file except in compliance with the License.
@@ -1691,6 +1666,34 @@ var PresetFilterType;
1691
1666
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
1692
1667
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1693
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);
1694
+ };
1695
+
1696
+ var _excluded$7 = ["views"];
1694
1697
  var getSnackbarMessage$1 = function getSnackbarMessage(action, title, is_shared) {
1695
1698
  // Trim and add quotes
1696
1699
  var trimmedTitle = title.trim();
@@ -1819,61 +1822,73 @@ var createCustomEmptyMapWorkspace = function createCustomEmptyMapWorkspace(empty
1819
1822
  });
1820
1823
  return emptyWorkspacePreset;
1821
1824
  };
1822
- var getTemplatePresetTitle = function getTemplatePresetTitle(preset, t) {
1823
- return preset.titleKey && t ? t(preset.titleKey, {
1824
- defaultValue: preset.title
1825
- }) : preset.title;
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$ : '';
1826
1840
  };
1827
- var LOCAL_SOUNDINGS_ID = 'newSoundingsWorkspace';
1828
- var getNewSoundingsWorkspaceListItem = function getNewSoundingsWorkspaceListItem(t) {
1829
- return {
1830
- id: LOCAL_SOUNDINGS_ID,
1831
- title: t ? t('workspace-new-soundings') : 'New soundings workspace',
1832
- labels: undefined,
1833
- scope: 'system',
1834
- "abstract": '',
1835
- viewType: 'multiWindow'
1836
- };
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;
1837
1848
  };
1838
- function getNewSoundingsWorkspace(t) {
1839
- return Object.assign({}, getNewSoundingsWorkspaceListItem(t), {
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),
1840
1854
  views: {
1841
- allIds: ['1_screen', '2_screen'],
1842
- byId: {
1843
- '1_screen': {
1844
- mosaicNodeId: '1_screen',
1845
- title: 'New soundings map',
1846
- componentType: 'Map',
1847
- initialProps: {
1848
- mapPreset: {
1849
- shouldShowLegend: false,
1850
- shouldShowLayerManager: false
1851
- }
1852
- }
1853
- },
1854
- '2_screen': {
1855
- mosaicNodeId: '2_screen',
1856
- title: 'New soundings view',
1857
- componentType: 'Soundings',
1858
- initialProps: {}
1859
- }
1860
- }
1861
- },
1862
- linking: {
1863
- '2_screen': ['1_screen']
1864
- },
1865
- syncGroups: [{
1866
- id: 'Features_2_screen',
1867
- sourcePanelId: '2_screen',
1868
- type: 'SYNCGROUPS_TYPE_SETFEATURES'
1869
- }],
1870
- mosaicNode: {
1871
- direction: 'row',
1872
- first: '1_screen',
1873
- second: '2_screen'
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
+ }))
1874
1862
  }
1875
1863
  });
1876
- }
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
+ };
1877
1892
  var getBEViewsFromState = function getBEViewsFromState(workspace) {
1878
1893
  var _workspace$views$allI, _workspace$views;
1879
1894
  var result = [];
@@ -1889,13 +1904,16 @@ var getBEViewsFromState = function getBEViewsFromState(workspace) {
1889
1904
  });
1890
1905
  return result;
1891
1906
  };
1892
- var togglePresetFilter = function togglePresetFilter(filters, id, isSelected, isAdmin, isFavouritesEnabled) {
1907
+ var togglePresetFilter = function togglePresetFilter(filters, id, isSelected, isAdmin, isFavouritesEnabled, isTemplatesEnabled) {
1893
1908
  if (isAdmin === void 0) {
1894
1909
  isAdmin = false;
1895
1910
  }
1896
1911
  if (isFavouritesEnabled === void 0) {
1897
1912
  isFavouritesEnabled = true;
1898
1913
  }
1914
+ if (isTemplatesEnabled === void 0) {
1915
+ isTemplatesEnabled = true;
1916
+ }
1899
1917
  if (!filters.some(function (filter) {
1900
1918
  return filter.id === id;
1901
1919
  })) {
@@ -1905,6 +1923,9 @@ var togglePresetFilter = function togglePresetFilter(filters, id, isSelected, is
1905
1923
  if (filter.id === PresetFilterType.favourites) {
1906
1924
  return isFavouritesEnabled;
1907
1925
  }
1926
+ if (filter.id === PresetFilterType.templates && !isTemplatesEnabled) {
1927
+ return false;
1928
+ }
1908
1929
  return !isAdmin || filter.id === PresetFilterType.system || filter.id === PresetFilterType.shared || filter.id === PresetFilterType.templates;
1909
1930
  });
1910
1931
  var allSelected = availableFilters.every(function (filter) {
@@ -1919,7 +1940,9 @@ var togglePresetFilter = function togglePresetFilter(filters, id, isSelected, is
1919
1940
  isSelected: filter.id === id && isSelected
1920
1941
  });
1921
1942
  }
1922
- if (isAdmin && id !== PresetFilterType.favourites && filter.id !== PresetFilterType.favourites) {
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) {
1923
1946
  return Object.assign({}, filter, {
1924
1947
  isSelected: filter.id === id
1925
1948
  });
@@ -1967,13 +1990,20 @@ var sharedFilterState = {
1967
1990
  };
1968
1991
  ({
1969
1992
  id: PresetFilterType.plugin});
1993
+ var templatesFilterState = {
1994
+ label: 'shared-filter-template-presets',
1995
+ id: PresetFilterType.templates,
1996
+ isSelected: true,
1997
+ isDisabled: false
1998
+ };
1970
1999
  var favouriteFilterState = {
1971
2000
  label: 'workspace-favourites',
1972
2001
  id: PresetFilterType.favourites,
1973
2002
  isSelected: true,
1974
2003
  isDisabled: false
1975
2004
  };
1976
- var defaultPresetFilterState = [personalFilterState, systemFilterState, sharedFilterState, favouriteFilterState];
2005
+ var defaultPresetFilterState = [personalFilterState, systemFilterState, sharedFilterState, templatesFilterState, favouriteFilterState];
2006
+ var ADMIN_WORKSPACE_FILTER_IDS = [PresetFilterType.system, PresetFilterType.shared, PresetFilterType.templates, PresetFilterType.favourites];
1977
2007
  var initialState$2 = {
1978
2008
  error: undefined,
1979
2009
  isWorkspaceListDialogOpen: false,
@@ -2031,8 +2061,9 @@ var slice$2 = createSlice({
2031
2061
  id = _action$payload.id,
2032
2062
  isSelected = _action$payload.isSelected,
2033
2063
  isAdmin = _action$payload.isAdmin,
2034
- isFavouritesEnabled = _action$payload.isFavouritesEnabled;
2035
- draft.workspaceListFilters = togglePresetFilter(draft.workspaceListFilters, id, isSelected, isAdmin, isFavouritesEnabled);
2064
+ isFavouritesEnabled = _action$payload.isFavouritesEnabled,
2065
+ isTemplatesEnabled = _action$payload.isTemplatesEnabled;
2066
+ draft.workspaceListFilters = togglePresetFilter(draft.workspaceListFilters, id, isSelected, isAdmin, isFavouritesEnabled, isTemplatesEnabled);
2036
2067
  },
2037
2068
  setSelectAllFilterChip: function setSelectAllFilterChip(draft) {
2038
2069
  draft.workspaceListFilters = draft.workspaceListFilters.map(function (filter) {
@@ -2124,7 +2155,7 @@ var warningsPresetChangeActions = [warningsFiltersActions.setWarningFilters, war
2124
2155
  var syncGroupChangeActions = [syncGroupsActions.syncGroupRemoveTarget, syncGroupsActions.syncGroupAddTarget];
2125
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];
2126
2157
  var pluginPresetChangeActions = [pluginsActions.setGeoWebPluginState];
2127
- var timeSeriesPresetChangeActions = [timeSeriesActions.addParameter, timeSeriesActions.addPlot, timeSeriesActions.deleteParameter, timeSeriesActions.deletePlot, timeSeriesActions.moveParameter, timeSeriesActions.movePlot, timeSeriesActions.toggleParameter, timeSeriesActions.togglePlot, timeSeriesActions.patchParameter, timeSeriesActions.updateTitle, timeSeriesActions.setLocationMenuSizeAndPosition, timeSeriesActions.setLocationsDialogOpen];
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];
2128
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];
2129
2160
  var supportedMapActionOrigins = [layerTypes.LayerActionOrigin.layerManager, layerTypes.LayerActionOrigin.legend, layerTypes.LayerActionOrigin.wmsLoader, mapEnums.MapActionOrigin.map];
2130
2161
  var supportedTimeSeriesActionOrigins = [TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesManager, TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesSelect];
@@ -2973,28 +3004,27 @@ var findViewTemplatePresetForComponentType = function findViewTemplatePresetForC
2973
3004
  return template.componentType === componentType;
2974
3005
  }) : undefined;
2975
3006
  };
2976
- var toTranslatedViewTemplatePreset = function toTranslatedViewTemplatePreset(template, t) {
3007
+ var toTranslatedViewTemplatePreset = function toTranslatedViewTemplatePreset(template, language) {
2977
3008
  return Object.assign({}, template, {
2978
- title: getTemplatePresetTitle(template, t),
2979
- titleKey: undefined
3009
+ title: getTemplatePresetTitle(template.title, language)
2980
3010
  });
2981
3011
  };
2982
- var toViewPresetFromTemplate = function toViewPresetFromTemplate(template, t) {
3012
+ var toViewPresetFromTemplate = function toViewPresetFromTemplate(template, language) {
2983
3013
  var _template$initialProp;
2984
3014
  var componentType = template.componentType;
2985
3015
  var emptyPreset = emptyViewPreset(componentType);
2986
3016
  return Object.assign({}, emptyPreset, {
2987
- title: getTemplatePresetTitle(template, t),
3017
+ title: getTemplatePresetTitle(template.title, language),
2988
3018
  "abstract": template["abstract"],
2989
3019
  description: template.description,
2990
3020
  initialProps: (_template$initialProp = template.initialProps) != null ? _template$initialProp : emptyPreset.initialProps
2991
3021
  });
2992
3022
  };
2993
- var toViewTemplateListItem = function toViewTemplateListItem(template, t) {
3023
+ var toViewTemplateListItem = function toViewTemplateListItem(template, language) {
2994
3024
  var _template$abstract;
2995
3025
  return {
2996
3026
  id: template.id,
2997
- title: getTemplatePresetTitle(template, t),
3027
+ title: getTemplatePresetTitle(template.title, language),
2998
3028
  date: '',
2999
3029
  scope: 'system',
3000
3030
  "abstract": (_template$abstract = template["abstract"]) != null ? _template$abstract : '',
@@ -3003,9 +3033,9 @@ var toViewTemplateListItem = function toViewTemplateListItem(template, t) {
3003
3033
  isViewTemplate: true
3004
3034
  };
3005
3035
  };
3006
- var toViewTemplateListItems = function toViewTemplateListItems(templates, t) {
3036
+ var toViewTemplateListItems = function toViewTemplateListItems(templates, language) {
3007
3037
  return (templates != null ? templates : []).map(function (template) {
3008
- return toViewTemplateListItem(template, t);
3038
+ return toViewTemplateListItem(template, language);
3009
3039
  });
3010
3040
  };
3011
3041
 
@@ -3441,6 +3471,10 @@ var getTemplatePresetsFilename = function getTemplatePresetsFilename() {
3441
3471
  var _sessionStorageProvid;
3442
3472
  return ((_sessionStorageProvid = sessionStorageProvider.getConfig()) == null ? void 0 : _sessionStorageProvid.GW_TEMPLATE_PRESETS_FILENAME) || TEMPLATE_PRESETS_FILENAME;
3443
3473
  };
3474
+ var isTemplatePresetsEnabled = function isTemplatePresetsEnabled() {
3475
+ var _sessionStorageProvid2;
3476
+ return ((_sessionStorageProvid2 = sessionStorageProvider.getConfig()) == null ? void 0 : _sessionStorageProvid2.GW_FEATURE_TEMPLATE_PRESETS) !== false;
3477
+ };
3444
3478
  var getTemplatePresets = /*#__PURE__*/function () {
3445
3479
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(filename) {
3446
3480
  var _response$workspacePr, _response$viewPresets;
@@ -3451,9 +3485,18 @@ var getTemplatePresets = /*#__PURE__*/function () {
3451
3485
  if (filename === void 0) {
3452
3486
  filename = getTemplatePresetsFilename();
3453
3487
  }
3454
- _context.n = 1;
3455
- return fetch("./assets/" + encodeURIComponent(filename)).then(handleResponse);
3488
+ if (isTemplatePresetsEnabled()) {
3489
+ _context.n = 1;
3490
+ break;
3491
+ }
3492
+ return _context.a(2, {
3493
+ workspacePresets: [],
3494
+ viewPresets: []
3495
+ });
3456
3496
  case 1:
3497
+ _context.n = 2;
3498
+ return fetch("./assets/" + encodeURIComponent(filename)).then(handleResponse);
3499
+ case 2:
3457
3500
  response = _context.v;
3458
3501
  return _context.a(2, {
3459
3502
  workspacePresets: (_response$workspacePr = response == null ? void 0 : response.workspacePresets) != null ? _response$workspacePr : [],
@@ -3698,7 +3741,10 @@ var workspaceQueryOptions = {
3698
3741
  }
3699
3742
  return queryFn;
3700
3743
  }(),
3701
- staleTime: Infinity
3744
+ staleTime: Infinity,
3745
+ // A missing static file will not appear by retrying, and opening a
3746
+ // workspace waits for this query
3747
+ retry: false
3702
3748
  });
3703
3749
  },
3704
3750
  getWorkspacePreset: function getWorkspacePreset$1(id, credentials) {
@@ -3862,13 +3908,17 @@ var getWorkspaceListFilters = createSelector(function (store) {
3862
3908
  return scope;
3863
3909
  }, function (_store, _scope, isAdmin) {
3864
3910
  return isAdmin;
3865
- }, function (state, _scope, isAdmin) {
3911
+ }, function (_store, _scope, _isAdmin, isTemplatesEnabled) {
3912
+ return isTemplatesEnabled !== false;
3913
+ }, function (state, _scope, isAdmin, isTemplatesEnabled) {
3866
3914
  var _state$workspaceListF;
3867
- var filters = (_state$workspaceListF = state == null ? void 0 : state.workspaceListFilters) != null ? _state$workspaceListF : [];
3915
+ var filters = ((_state$workspaceListF = state == null ? void 0 : state.workspaceListFilters) != null ? _state$workspaceListF : []).filter(function (filter) {
3916
+ return isTemplatesEnabled || filter.id !== PresetFilterType.templates;
3917
+ });
3868
3918
  if (isAdmin) {
3869
- // Only return system and shared for admins
3919
+ // Only return system, shared, template and favourite filters for admins
3870
3920
  return filters.filter(function (filter) {
3871
- return filter.id === 'system' || filter.id === 'shared' || filter.id === 'favourites';
3921
+ return ADMIN_WORKSPACE_FILTER_IDS.includes(filter.id);
3872
3922
  }).map(function (filter) {
3873
3923
  return Object.assign({}, filter, {
3874
3924
  isDisabled: false
@@ -3953,7 +4003,7 @@ workspaceListListener.startListening({
3953
4003
  effect: function () {
3954
4004
  var _effect2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref2, listenerApi) {
3955
4005
  var _listenerApi$getState2;
3956
- var payload, workspaceState, credentials, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, emptySoundingsPresetTitle, scope, originalData, workspaceDataNewTitle, _originalData$views, _data$views2, _originalData, mergedViews, payloadToSave, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, workspaceData, newWorkspace, _listenerApi$getState3, _credentials, hasChanges, message, _listenerApi$getState4, category, _t;
4006
+ var payload, workspaceState, credentials, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, defaultPreset, scope, originalData, workspaceDataNewTitle, _originalData$views, _data$views2, _originalData, mergedViews, payloadToSave, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, workspaceData, newWorkspace, _listenerApi$getState3, _credentials, hasChanges, message, _listenerApi$getState4, category, _t;
3957
4007
  return _regenerator().w(function (_context2) {
3958
4008
  while (1) switch (_context2.p = _context2.n) {
3959
4009
  case 0:
@@ -3961,7 +4011,7 @@ workspaceListListener.startListening({
3961
4011
  listenerApi.cancelActiveListeners();
3962
4012
  workspaceState = listenerApi.getState();
3963
4013
  credentials = (_listenerApi$getState2 = listenerApi.getState().common) == null || (_listenerApi$getState2 = _listenerApi$getState2.auth) == null ? void 0 : _listenerApi$getState2.credentials;
3964
- presetId = payload.presetId, presetAction = payload.presetAction, data = payload.data, emptyMapPresetTitle = payload.emptyMapPresetTitle, emptyWorkspacePresetTitle = payload.emptyWorkspacePresetTitle, emptySoundingsPresetTitle = payload.emptySoundingsPresetTitle;
4014
+ presetId = payload.presetId, presetAction = payload.presetAction, data = payload.data, emptyMapPresetTitle = payload.emptyMapPresetTitle, emptyWorkspacePresetTitle = payload.emptyWorkspacePresetTitle, defaultPreset = payload.defaultPreset;
3965
4015
  scope = data.scope || 'user';
3966
4016
  _context2.p = 1;
3967
4017
  // duplicate
@@ -4113,17 +4163,15 @@ workspaceListListener.startListening({
4113
4163
  case 14:
4114
4164
  // Reset
4115
4165
  if (presetAction === WorkspacePresetAction.RESET) {
4116
- // In case we're resetting the `New workspace` preset
4117
- if (presetId === getEmptyMapWorkspace().id) {
4166
+ // In case we're resetting the default preset that opens the empty workspace
4167
+ if (!presetId) {
4118
4168
  listenerApi.dispatch(workspaceActions.changeToEmptyMapWorkspace({
4119
4169
  newMapPresetText: emptyMapPresetTitle,
4120
4170
  newWorkspaceText: emptyWorkspacePresetTitle
4121
4171
  }));
4122
- } else if (presetId === LOCAL_SOUNDINGS_ID) {
4172
+ } else if (defaultPreset) {
4123
4173
  listenerApi.dispatch(workspaceActions.changePreset({
4124
- workspacePreset: Object.assign({}, getNewSoundingsWorkspace(), {
4125
- title: emptySoundingsPresetTitle || getNewSoundingsWorkspace().title
4126
- })
4174
+ workspacePreset: defaultPreset
4127
4175
  }));
4128
4176
  } else {
4129
4177
  listenerApi.dispatch(workspaceActions.fetchWorkspace({
@@ -4414,20 +4462,50 @@ workspaceListener.startListening({
4414
4462
  return effect;
4415
4463
  }()
4416
4464
  });
4465
+ var getWorkspaceTemplatePreset = /*#__PURE__*/function () {
4466
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(workspaceId) {
4467
+ var _yield$getQueryClient, workspacePresets;
4468
+ return _regenerator().w(function (_context7) {
4469
+ while (1) switch (_context7.p = _context7.n) {
4470
+ case 0:
4471
+ if (workspaceId) {
4472
+ _context7.n = 1;
4473
+ break;
4474
+ }
4475
+ return _context7.a(2, undefined);
4476
+ case 1:
4477
+ _context7.p = 1;
4478
+ _context7.n = 2;
4479
+ return getQueryClient().ensureQueryData(workspaceQueryOptions.getTemplatePresets());
4480
+ case 2:
4481
+ _yield$getQueryClient = _context7.v;
4482
+ workspacePresets = _yield$getQueryClient.workspacePresets;
4483
+ return _context7.a(2, findWorkspaceTemplatePreset(workspacePresets, workspaceId));
4484
+ case 3:
4485
+ _context7.p = 3;
4486
+ _context7.v;
4487
+ return _context7.a(2, undefined);
4488
+ }
4489
+ }, _callee7, null, [[1, 3]]);
4490
+ }));
4491
+ return function getWorkspaceTemplatePreset(_x12) {
4492
+ return _ref7.apply(this, arguments);
4493
+ };
4494
+ }();
4417
4495
  workspaceListener.startListening({
4418
4496
  matcher: isAnyOf(workspaceActions.fetchWorkspace, routerActions.navigateBackOrForward),
4419
4497
  effect: function () {
4420
- var _effect5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9(action, listenerApi) {
4421
- var _listenerApi$getState2, common, payload, workspaceId, _common$auth, _workspaceData$linkin, workspaceData, fullLoadingWorkspace, workspaceIdsInBatches, actionsToDispatch, errorType, _t2;
4422
- return _regenerator().w(function (_context9) {
4423
- while (1) switch (_context9.p = _context9.n) {
4498
+ var _effect5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0(action, listenerApi) {
4499
+ var _listenerApi$getState2, common, payload, workspaceId, _common$auth, _workspaceData$linkin, templatePreset, workspacePreset, workspaceData, fullLoadingWorkspace, workspaceIdsInBatches, actionsToDispatch, errorType, _t3;
4500
+ return _regenerator().w(function (_context0) {
4501
+ while (1) switch (_context0.p = _context0.n) {
4424
4502
  case 0:
4425
4503
  // Cancel any in-progress instances of this listener
4426
4504
  listenerApi.cancelActiveListeners();
4427
4505
  _listenerApi$getState2 = listenerApi.getState(), common = _listenerApi$getState2.common;
4428
4506
  payload = action.payload;
4429
4507
  workspaceId = payload.workspaceId;
4430
- _context9.p = 1;
4508
+ _context0.p = 1;
4431
4509
  if (action.type === workspaceActions.fetchWorkspace.type) {
4432
4510
  listenerApi.dispatch(routerActions.navigateToUrl({
4433
4511
  url: getWorkspaceRouteUrl(workspaceId)
@@ -4436,17 +4514,34 @@ workspaceListener.startListening({
4436
4514
  listenerApi.dispatch(workspaceListActions.toggleWorkspaceDialog({
4437
4515
  isWorkspaceListDialogOpen: false
4438
4516
  }));
4439
- // fetch workspace
4440
- _context9.n = 2;
4441
- return getQueryClient().fetchQuery(workspaceQueryOptions.getWorkspacePreset(workspaceId, common == null || (_common$auth = common.auth) == null ? void 0 : _common$auth.credentials));
4517
+ _context0.n = 2;
4518
+ return getWorkspaceTemplatePreset(workspaceId);
4442
4519
  case 2:
4443
- workspaceData = _context9.v;
4520
+ templatePreset = _context0.v;
4521
+ if (!templatePreset) {
4522
+ _context0.n = 3;
4523
+ break;
4524
+ }
4525
+ workspacePreset = toWorkspacePresetFromTemplate(templatePreset);
4526
+ listenerApi.dispatch(workspaceActions.loadedWorkspace({
4527
+ workspaceId: workspaceId,
4528
+ workspace: workspacePreset
4529
+ }));
4530
+ listenerApi.dispatch(workspaceActions.changePreset({
4531
+ workspacePreset: workspacePreset
4532
+ }));
4533
+ return _context0.a(2);
4534
+ case 3:
4535
+ _context0.n = 4;
4536
+ return getQueryClient().fetchQuery(workspaceQueryOptions.getWorkspacePreset(workspaceId, common == null || (_common$auth = common.auth) == null ? void 0 : _common$auth.credentials));
4537
+ case 4:
4538
+ workspaceData = _context0.v;
4444
4539
  if (workspaceData) {
4445
- _context9.n = 3;
4540
+ _context0.n = 5;
4446
4541
  break;
4447
4542
  }
4448
4543
  throw new Error(ERROR_NOT_FOUND);
4449
- case 3:
4544
+ case 5:
4450
4545
  listenerApi.dispatch(workspaceActions.loadedWorkspace({
4451
4546
  workspaceId: workspaceId,
4452
4547
  workspace: workspaceData
@@ -4456,83 +4551,82 @@ workspaceListener.startListening({
4456
4551
  listenerApi.dispatch(workspaceActions.changePreset({
4457
4552
  workspacePreset: fullLoadingWorkspace
4458
4553
  }));
4459
- _context9.n = 4;
4554
+ _context0.n = 6;
4460
4555
  return listenerApi.condition(function (_, state) {
4461
4556
  var _state$workspace;
4462
4557
  return ((_state$workspace = state.workspace) == null ? void 0 : _state$workspace.id) === fullLoadingWorkspace.id;
4463
4558
  });
4464
- case 4:
4559
+ case 6:
4465
4560
  // fetch all individual view presets in batches and collect all actions
4466
4561
  workspaceIdsInBatches = getListInChunks(workspaceData.views);
4467
4562
  actionsToDispatch = [];
4468
- _context9.n = 5;
4563
+ _context0.n = 7;
4469
4564
  return Promise.all(workspaceIdsInBatches.map(/*#__PURE__*/function () {
4470
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(batchCall) {
4471
- return _regenerator().w(function (_context8) {
4472
- while (1) switch (_context8.n) {
4565
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9(batchCall) {
4566
+ return _regenerator().w(function (_context9) {
4567
+ while (1) switch (_context9.n) {
4473
4568
  case 0:
4474
- _context8.n = 1;
4569
+ _context9.n = 1;
4475
4570
  return Promise.all(batchCall.map(/*#__PURE__*/function () {
4476
- var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(view) {
4477
- return _regenerator().w(function (_context7) {
4478
- while (1) switch (_context7.n) {
4571
+ var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(view) {
4572
+ return _regenerator().w(function (_context8) {
4573
+ while (1) switch (_context8.n) {
4479
4574
  case 0:
4480
4575
  if (view.viewPresetId) {
4481
- _context7.n = 1;
4576
+ _context8.n = 1;
4482
4577
  break;
4483
4578
  }
4484
- return _context7.a(2);
4579
+ return _context8.a(2);
4485
4580
  case 1:
4486
- return _context7.a(2, fetchWorkspaceViewPreset(listenerApi.dispatch, view.viewPresetId, view.mosaicNodeId, common == null ? void 0 : common.auth.credentials));
4581
+ return _context8.a(2, fetchWorkspaceViewPreset(listenerApi.dispatch, view.viewPresetId, view.mosaicNodeId, common == null ? void 0 : common.auth.credentials));
4487
4582
  }
4488
- }, _callee7);
4583
+ }, _callee8);
4489
4584
  }));
4490
- return function (_x15) {
4491
- return _ref8.apply(this, arguments);
4585
+ return function (_x16) {
4586
+ return _ref9.apply(this, arguments);
4492
4587
  };
4493
4588
  }()));
4494
4589
  case 1:
4495
- return _context8.a(2);
4590
+ return _context9.a(2);
4496
4591
  }
4497
- }, _callee8);
4592
+ }, _callee9);
4498
4593
  }));
4499
- return function (_x14) {
4500
- return _ref7.apply(this, arguments);
4594
+ return function (_x15) {
4595
+ return _ref8.apply(this, arguments);
4501
4596
  };
4502
4597
  }()));
4503
- case 5:
4598
+ case 7:
4504
4599
  // Re-apply feature links
4505
4600
  listenerApi.dispatch(genericActions.setLinkedMap({
4506
4601
  newLinks: (_workspaceData$linkin = workspaceData.linking) != null ? _workspaceData$linkin : {}
4507
4602
  }));
4508
- // Trigger all actions at once
4509
4603
  actionsToDispatch.map(listenerApi.dispatch);
4510
- _context9.n = 8;
4604
+ _context0.n = 10;
4511
4605
  break;
4512
- case 6:
4513
- _context9.p = 6;
4514
- _t2 = _context9.v;
4606
+ case 8:
4607
+ _context0.p = 8;
4608
+ _t3 = _context0.v;
4515
4609
  if (!listenerApi.signal.aborted) {
4516
- _context9.n = 7;
4610
+ _context0.n = 9;
4517
4611
  break;
4518
4612
  }
4519
4613
  console.warn('Fetch workspace listener was canceled, this should not happen too often. Triggers on mount in strict mode.');
4520
- return _context9.a(2);
4521
- case 7:
4522
- errorType = _t2.message === ERROR_NOT_FOUND ? WorkspaceErrorType.NOT_FOUND : WorkspaceErrorType.GENERIC;
4614
+ return _context0.a(2);
4615
+ case 9:
4616
+ errorType = _t3.message === ERROR_NOT_FOUND ? WorkspaceErrorType.NOT_FOUND : WorkspaceErrorType.GENERIC;
4523
4617
  listenerApi.dispatch(workspaceActions.errorWorkspace({
4524
4618
  workspaceId: workspaceId,
4525
4619
  error: {
4526
- message: getErrorMessage(_t2),
4620
+ message: getErrorMessage(_t3),
4527
4621
  type: errorType
4528
4622
  }
4529
4623
  }));
4530
- case 8:
4531
- return _context9.a(2);
4624
+ case 10:
4625
+ return _context0.a(2);
4532
4626
  }
4533
- }, _callee9, null, [[1, 6]]);
4627
+ }, _callee0, null, [[1, 8]]);
4534
4628
  }));
4535
- function effect(_x12, _x13) {
4629
+ function effect(_x13, _x14) {
4536
4630
  return _effect5.apply(this, arguments);
4537
4631
  }
4538
4632
  return effect;
@@ -4541,21 +4635,21 @@ workspaceListener.startListening({
4541
4635
  workspaceListener.startListening({
4542
4636
  actionCreator: workspaceActions.saveWorkspacePreset,
4543
4637
  effect: function () {
4544
- var _effect6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0(_ref9, listenerApi) {
4545
- var payload, workspace, _listenerApi$getState3, _workspace$scope, _workspace$username, credentials, _t3;
4546
- return _regenerator().w(function (_context0) {
4547
- while (1) switch (_context0.p = _context0.n) {
4638
+ var _effect6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1(_ref0, listenerApi) {
4639
+ var payload, workspace, _listenerApi$getState3, _workspace$scope, _workspace$username, credentials, _t4;
4640
+ return _regenerator().w(function (_context1) {
4641
+ while (1) switch (_context1.p = _context1.n) {
4548
4642
  case 0:
4549
- payload = _ref9.payload;
4643
+ payload = _ref0.payload;
4550
4644
  // Cancel any in-progress instances of this listener
4551
4645
  listenerApi.cancelActiveListeners();
4552
4646
  workspace = payload.workspace;
4553
- _context0.p = 1;
4647
+ _context1.p = 1;
4554
4648
  credentials = (_listenerApi$getState3 = listenerApi.getState().common) == null || (_listenerApi$getState3 = _listenerApi$getState3.auth) == null ? void 0 : _listenerApi$getState3.credentials;
4555
- _context0.n = 2;
4649
+ _context1.n = 2;
4556
4650
  return getQueryClient().fetchQuery(workspaceQueryOptions.saveWorkspacePreset(workspace.id, workspace, credentials));
4557
4651
  case 2:
4558
- _context0.n = 3;
4652
+ _context1.n = 3;
4559
4653
  return getQueryClient().invalidateQueries(workspaceQueryOptions.getWorkspacePreset(workspace.id, credentials));
4560
4654
  case 3:
4561
4655
  listenerApi.dispatch(workspaceActions.loadedWorkspace(undefined));
@@ -4567,24 +4661,24 @@ workspaceListener.startListening({
4567
4661
  views: workspace.views || [emptyWorkspaceBEData],
4568
4662
  username: (_workspace$username = workspace.username) != null ? _workspace$username : ''
4569
4663
  }));
4570
- _context0.n = 5;
4664
+ _context1.n = 5;
4571
4665
  break;
4572
4666
  case 4:
4573
- _context0.p = 4;
4574
- _t3 = _context0.v;
4667
+ _context1.p = 4;
4668
+ _t4 = _context1.v;
4575
4669
  listenerApi.dispatch(workspaceActions.errorWorkspace({
4576
4670
  workspaceId: workspace.id,
4577
4671
  error: {
4578
- message: _t3.message,
4672
+ message: _t4.message,
4579
4673
  type: WorkspaceErrorType.SAVE
4580
4674
  }
4581
4675
  }));
4582
4676
  case 5:
4583
- return _context0.a(2);
4677
+ return _context1.a(2);
4584
4678
  }
4585
- }, _callee0, null, [[1, 4]]);
4679
+ }, _callee1, null, [[1, 4]]);
4586
4680
  }));
4587
- function effect(_x16, _x17) {
4681
+ function effect(_x17, _x18) {
4588
4682
  return _effect6.apply(this, arguments);
4589
4683
  }
4590
4684
  return effect;
@@ -4593,30 +4687,30 @@ workspaceListener.startListening({
4593
4687
  workspaceListener.startListening({
4594
4688
  actionCreator: workspaceActions.changeToEmptyMapWorkspace,
4595
4689
  effect: function () {
4596
- var _effect7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1(action, listenerApi) {
4690
+ var _effect7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee10(action, listenerApi) {
4597
4691
  var _action$payload, newMapPresetText, newWorkspaceText, currentWorkspace, intialViewMapPreset;
4598
- return _regenerator().w(function (_context1) {
4599
- while (1) switch (_context1.n) {
4692
+ return _regenerator().w(function (_context10) {
4693
+ while (1) switch (_context10.n) {
4600
4694
  case 0:
4601
4695
  _action$payload = action.payload, newMapPresetText = _action$payload.newMapPresetText, newWorkspaceText = _action$payload.newWorkspaceText; // Cancel any in-progress instances of this listener
4602
4696
  listenerApi.cancelActiveListeners();
4603
4697
  currentWorkspace = listenerApi.getState().workspace;
4604
4698
  if (!((currentWorkspace == null ? void 0 : currentWorkspace.id) === '' && currentWorkspace != null && currentWorkspace.mosaicNode)) {
4605
- _context1.n = 1;
4699
+ _context10.n = 1;
4606
4700
  break;
4607
4701
  }
4608
- return _context1.a(2);
4702
+ return _context10.a(2);
4609
4703
  case 1:
4610
4704
  intialViewMapPreset = mapSelectors.getdefaultMapSettings(listenerApi.getState());
4611
4705
  listenerApi.dispatch(workspaceActions.changePreset({
4612
4706
  workspacePreset: createCustomEmptyMapWorkspace(newWorkspaceText, newMapPresetText, intialViewMapPreset)
4613
4707
  }));
4614
4708
  case 2:
4615
- return _context1.a(2);
4709
+ return _context10.a(2);
4616
4710
  }
4617
- }, _callee1);
4711
+ }, _callee10);
4618
4712
  }));
4619
- function effect(_x18, _x19) {
4713
+ function effect(_x19, _x20) {
4620
4714
  return _effect7.apply(this, arguments);
4621
4715
  }
4622
4716
  return effect;
@@ -4654,13 +4748,13 @@ var generateInitialProps = function generateInitialProps(componentType, original
4654
4748
  workspaceListener.startListening({
4655
4749
  actionCreator: workspaceActions.setNewWorkspaceView,
4656
4750
  effect: function () {
4657
- var _effect8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee10(_ref0, listenerApi) {
4751
+ var _effect8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee11(_ref1, listenerApi) {
4658
4752
  var _getViewPresetToSendT, _initialProps$mapPres;
4659
4753
  var payload, mosaicNodeId, componentType, newId, copyOriginalcontent, originalInitialProps, initialProps, _originalInitialProps2, linkedMapIds;
4660
- return _regenerator().w(function (_context10) {
4661
- while (1) switch (_context10.n) {
4754
+ return _regenerator().w(function (_context11) {
4755
+ while (1) switch (_context11.n) {
4662
4756
  case 0:
4663
- payload = _ref0.payload;
4757
+ payload = _ref1.payload;
4664
4758
  mosaicNodeId = payload.mosaicNodeId, componentType = payload.componentType, newId = payload.newId, copyOriginalcontent = payload.copyOriginalcontent;
4665
4759
  if (componentType === 'Map') {
4666
4760
  // TODO: this would be nice to move into the openlayers store
@@ -4718,40 +4812,40 @@ workspaceListener.startListening({
4718
4812
  }));
4719
4813
  }
4720
4814
  case 1:
4721
- return _context10.a(2);
4815
+ return _context11.a(2);
4722
4816
  }
4723
- }, _callee10);
4817
+ }, _callee11);
4724
4818
  }));
4725
- function effect(_x20, _x21) {
4819
+ function effect(_x21, _x22) {
4726
4820
  return _effect8.apply(this, arguments);
4727
4821
  }
4728
4822
  return effect;
4729
4823
  }()
4730
4824
  });
4731
4825
  var waitForFrame = /*#__PURE__*/function () {
4732
- var _ref1 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee11() {
4733
- return _regenerator().w(function (_context11) {
4734
- while (1) switch (_context11.n) {
4826
+ var _ref10 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee12() {
4827
+ return _regenerator().w(function (_context12) {
4828
+ while (1) switch (_context12.n) {
4735
4829
  case 0:
4736
- return _context11.a(2, new Promise(function (resolve) {
4830
+ return _context12.a(2, new Promise(function (resolve) {
4737
4831
  requestAnimationFrame(function () {
4738
4832
  return resolve();
4739
4833
  });
4740
4834
  }));
4741
4835
  }
4742
- }, _callee11);
4836
+ }, _callee12);
4743
4837
  }));
4744
4838
  return function waitForFrame() {
4745
- return _ref1.apply(this, arguments);
4839
+ return _ref10.apply(this, arguments);
4746
4840
  };
4747
4841
  }();
4748
4842
  workspaceListener.startListening({
4749
4843
  actionCreator: workspaceActions.updateWorkspaceViews,
4750
4844
  effect: function () {
4751
- var _effect9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee12(_, listenerApi) {
4845
+ var _effect9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee13(_, listenerApi) {
4752
4846
  var viewCountBefore, viewCountAfter, aViewWasClosed, viewIds;
4753
- return _regenerator().w(function (_context12) {
4754
- while (1) switch (_context12.n) {
4847
+ return _regenerator().w(function (_context13) {
4848
+ while (1) switch (_context13.n) {
4755
4849
  case 0:
4756
4850
  // Cancel any in-progress instances of this listener
4757
4851
  listenerApi.cancelActiveListeners();
@@ -4760,7 +4854,7 @@ workspaceListener.startListening({
4760
4854
  viewCountBefore = getViewIds(listenerApi.getOriginalState()).length;
4761
4855
  viewCountAfter = getViewIds(listenerApi.getState()).length;
4762
4856
  aViewWasClosed = viewCountAfter < viewCountBefore;
4763
- _context12.n = 1;
4857
+ _context13.n = 1;
4764
4858
  return waitForFrame();
4765
4859
  case 1:
4766
4860
  /* This will trigger all maps and other components
@@ -4774,7 +4868,7 @@ workspaceListener.startListening({
4774
4868
  }
4775
4869
  // Adjust the bbox of the original view after the new map is added. This is a temporal solution until the OpenLayers ticket
4776
4870
  // https://github.com/openlayers/openlayers/issues/16572 is solved.
4777
- _context12.n = 2;
4871
+ _context13.n = 2;
4778
4872
  return waitForFrame();
4779
4873
  case 2:
4780
4874
  viewIds = getViewIds(listenerApi.getState());
@@ -4790,11 +4884,11 @@ workspaceListener.startListening({
4790
4884
  }
4791
4885
  });
4792
4886
  case 3:
4793
- return _context12.a(2);
4887
+ return _context13.a(2);
4794
4888
  }
4795
- }, _callee12);
4889
+ }, _callee13);
4796
4890
  }));
4797
- function effect(_x22, _x23) {
4891
+ function effect(_x23, _x24) {
4798
4892
  return _effect9.apply(this, arguments);
4799
4893
  }
4800
4894
  return effect;
@@ -5123,50 +5217,6 @@ var createMockStore = function createMockStore(mockState) {
5123
5217
  });
5124
5218
  };
5125
5219
 
5126
- /* *
5127
- * Licensed under the Apache License, Version 2.0 (the "License");
5128
- * you may not use this file except in compliance with the License.
5129
- * You may obtain a copy of the License at
5130
- *
5131
- * http://www.apache.org/licenses/LICENSE-2.0
5132
- *
5133
- * Unless required by applicable law or agreed to in writing, software
5134
- * distributed under the License is distributed on an "AS IS" BASIS,
5135
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5136
- * See the License for the specific language governing permissions and
5137
- * limitations under the License.
5138
- *
5139
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5140
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
5141
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
5142
- * */
5143
- var WORKSPACE_NAMESPACE = 'workspace';
5144
- var initWorkspaceTestI18n = function initWorkspaceTestI18n() {
5145
- safelyInitI18nForTestsAndStories(i18n, WORKSPACE_NAMESPACE, [{
5146
- ns: WORKSPACE_NAMESPACE,
5147
- translations: workspaceTranslations
5148
- }, {
5149
- ns: SHARED_NAMESPACE,
5150
- translations: sharedTranslations
5151
- }, {
5152
- ns: CORE_NAMESPACE,
5153
- translations: coreTranslations
5154
- }, {
5155
- ns: WEBMAP_REACT_NAMESPACE,
5156
- translations: webmapReactTranslations
5157
- }, {
5158
- ns: FORM_FIELDS_NAMESPACE,
5159
- translations: formFieldsTranslations
5160
- }, {
5161
- ns: WARN_NAMESPACE,
5162
- translations: warningsTranslations
5163
- }]);
5164
- };
5165
- var ns = [WORKSPACE_NAMESPACE, SHARED_NAMESPACE];
5166
- var useWorkspaceTranslation = function useWorkspaceTranslation() {
5167
- return useTranslation(ns);
5168
- };
5169
-
5170
5220
  var WorkspaceThemeProvider = function WorkspaceThemeProvider(_ref) {
5171
5221
  var children = _ref.children,
5172
5222
  _ref$theme = _ref.theme,
@@ -5890,6 +5940,12 @@ var useResetViewPresetFiltersOnRoleChange = function useResetViewPresetFiltersOn
5890
5940
  }, {
5891
5941
  id: PresetFilterType.shared,
5892
5942
  isSelected: true
5943
+ }, {
5944
+ id: PresetFilterType.templates,
5945
+ isSelected: true
5946
+ }, {
5947
+ id: PresetFilterType.favourites,
5948
+ isSelected: true
5893
5949
  }];
5894
5950
  dispatch(viewPresetActions.setFilterChips({
5895
5951
  panelId: panelId,
@@ -6960,6 +7016,13 @@ var PresetLabelsPanel = function PresetLabelsPanel(_ref) {
6960
7016
  });
6961
7017
  };
6962
7018
 
7019
+ var useWorkspaceTemplatePresets = function useWorkspaceTemplatePresets() {
7020
+ return useQuery(Object.assign({}, workspaceQueryOptions.getTemplatePresets(), {
7021
+ select: function select(response) {
7022
+ return response.workspacePresets;
7023
+ }
7024
+ }));
7025
+ };
6963
7026
  var useWorkspaceLabelsConfig = function useWorkspaceLabelsConfig() {
6964
7027
  var _useAuthenticationCon = useAuthenticationContext(),
6965
7028
  auth = _useAuthenticationCon.auth;
@@ -7615,7 +7678,7 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
7615
7678
  var isViewTemplate = Boolean(workspacePreset.isViewTemplate);
7616
7679
  var isTemplate = isViewTemplate || Boolean(workspacePreset.isWorkspaceTemplate);
7617
7680
  var canDelete = (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin) && Boolean(workspacePreset.id) && !isTemplate;
7618
- var isNewPreset = !workspacePreset.id || workspacePreset.id === LOCAL_SOUNDINGS_ID || isTemplate;
7681
+ var isNewPreset = !workspacePreset.id || isTemplate;
7619
7682
  var menuItems = [{
7620
7683
  text: t('workspace-duplicate'),
7621
7684
  action: function action() {
@@ -7634,7 +7697,7 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
7634
7697
  isDisabled: isNewPreset
7635
7698
  }];
7636
7699
  // Show "Edit" if it's your own user-scoped preset OR you're an admin
7637
- if (!isTemplate && (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin)) {
7700
+ if (!isNewPreset && (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin)) {
7638
7701
  menuItems.push({
7639
7702
  text: t('workspace-edit'),
7640
7703
  action: function action() {
@@ -7685,7 +7748,7 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
7685
7748
  }
7686
7749
  return 'workspace-version';
7687
7750
  };
7688
- var showInfoIcon = !!workspacePreset.id && workspacePreset.id !== LOCAL_SOUNDINGS_ID && !isTemplate;
7751
+ var showInfoIcon = !!workspacePreset.id && !isTemplate;
7689
7752
  return jsx(ListItem, {
7690
7753
  disablePadding: true,
7691
7754
  sx: {
@@ -7914,11 +7977,9 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref2) {
7914
7977
  currentSelectedId = _ref2.currentSelectedId,
7915
7978
  onClickWorkspacePreset = _ref2.onClickWorkspacePreset,
7916
7979
  onClickWorkspacePresetOption = _ref2.onClickWorkspacePresetOption,
7917
- hideNewWorkspace = _ref2.hideNewWorkspace,
7918
7980
  isEditable = _ref2.isEditable,
7919
7981
  isAdmin = _ref2.isAdmin,
7920
7982
  searchQuery = _ref2.searchQuery,
7921
- newPresets = _ref2.newPresets,
7922
7983
  _ref2$testIdPrefix = _ref2.testIdPrefix,
7923
7984
  testIdPrefix = _ref2$testIdPrefix === void 0 ? 'workspace' : _ref2$testIdPrefix,
7924
7985
  onOpenPresetInfo = _ref2.onOpenPresetInfo,
@@ -7930,15 +7991,14 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref2) {
7930
7991
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
7931
7992
  t = _useWorkspaceTranslat.t;
7932
7993
  var items = React.useMemo(function () {
7933
- var newPresetsTruthy = newPresets != null ? newPresets : [];
7934
7994
  var favourites = workspacePresets.filter(function (preset) {
7935
7995
  return isFavourite == null ? void 0 : isFavourite(preset);
7936
7996
  });
7937
7997
  var otherPresets = workspacePresets.filter(function (preset) {
7938
7998
  return !(isFavourite != null && isFavourite(preset));
7939
7999
  });
7940
- return [].concat(favourites, !hideNewWorkspace ? newPresetsTruthy : [], otherPresets);
7941
- }, [hideNewWorkspace, newPresets, workspacePresets, isFavourite]);
8000
+ return [].concat(favourites, otherPresets);
8001
+ }, [workspacePresets, isFavourite]);
7942
8002
  return jsxs(Box, {
7943
8003
  "data-testid": testIdPrefix + "-selectList",
7944
8004
  sx: {
@@ -7992,7 +8052,8 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
7992
8052
  _ref$hasSpaceForLabel = _ref.hasSpaceForLabelFilter,
7993
8053
  hasSpaceForLabelFilter = _ref$hasSpaceForLabel === void 0 ? true : _ref$hasSpaceForLabel;
7994
8054
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
7995
- t = _useWorkspaceTranslat.t;
8055
+ t = _useWorkspaceTranslat.t,
8056
+ i18n = _useWorkspaceTranslat.i18n;
7996
8057
  var favourites = useFavouritePresets('view');
7997
8058
  var dispatch = useDispatch();
7998
8059
  var queryClient = useQueryClient();
@@ -8049,8 +8110,8 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
8049
8110
  var _useViewTemplatePrese = useViewTemplatePresets(),
8050
8111
  viewTemplatePresets = _useViewTemplatePrese.data;
8051
8112
  var templateListItems = React.useMemo(function () {
8052
- return toViewTemplateListItems(viewTemplatePresets, t);
8053
- }, [viewTemplatePresets, t]);
8113
+ return toViewTemplateListItems(viewTemplatePresets, i18n.language);
8114
+ }, [viewTemplatePresets, i18n.language]);
8054
8115
  var viewPresetListFilters = useSelector(function (store) {
8055
8116
  return getViewPresetListFiltersForView(store, panelId, scope, isAdmin);
8056
8117
  });
@@ -8151,7 +8212,7 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
8151
8212
  } else if (template) {
8152
8213
  dispatch(viewPresetActions.selectViewTemplate({
8153
8214
  panelId: panelId,
8154
- template: toTranslatedViewTemplatePreset(template, t)
8215
+ template: toTranslatedViewTemplatePreset(template, i18n.language)
8155
8216
  }));
8156
8217
  } else {
8157
8218
  dispatch(viewPresetActions.selectViewPreset({
@@ -8167,7 +8228,7 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
8167
8228
  return function (_x) {
8168
8229
  return _ref4.apply(this, arguments);
8169
8230
  };
8170
- }(), [dispatch, panelId, pluginCatalog, t, viewTemplatePresets]);
8231
+ }(), [dispatch, i18n.language, panelId, pluginCatalog, viewTemplatePresets]);
8171
8232
  var refreshViewPresets = React.useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
8172
8233
  return _regenerator().w(function (_context2) {
8173
8234
  while (1) switch (_context2.n) {
@@ -8646,6 +8707,11 @@ var _ViewPresetMenu = function ViewPresetMenu(_ref) {
8646
8707
  event.stopPropagation();
8647
8708
  },
8648
8709
  onClose: closeMenu,
8710
+ onKeyDownCapture: function onKeyDownCapture(event) {
8711
+ if (event.key === 'Escape' && event.target instanceof HTMLInputElement) {
8712
+ closeMenu == null || closeMenu();
8713
+ }
8714
+ },
8649
8715
  style: {
8650
8716
  width: '100%',
8651
8717
  height: '100%'
@@ -8778,7 +8844,8 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8778
8844
  var favourites = useFavouritePresets('workspace');
8779
8845
  var dispatch = useDispatch();
8780
8846
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
8781
- t = _useWorkspaceTranslat.t;
8847
+ t = _useWorkspaceTranslat.t,
8848
+ i18n = _useWorkspaceTranslat.i18n;
8782
8849
  var _useAuthenticationCon = useAuthenticationContext(),
8783
8850
  currentRole = _useAuthenticationCon.currentRole,
8784
8851
  isLoggedIn = _useAuthenticationCon.isLoggedIn,
@@ -8795,18 +8862,18 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8795
8862
  isFetching = _useWorkspacePresets.isFetching,
8796
8863
  queryError = _useWorkspacePresets.error,
8797
8864
  refreshWorkspacePresets = _useWorkspacePresets.refetch;
8798
- var selectedFilters = useSelector(getWorkspaceListFilters);
8865
+ var _useWorkspaceTemplate = useWorkspaceTemplatePresets(),
8866
+ defaultPresets = _useWorkspaceTemplate.data;
8867
+ var isTemplatesEnabled = isTemplatePresetsEnabled();
8868
+ var workspaceTemplateListItems = React.useMemo(function () {
8869
+ return toWorkspaceTemplateListItems(defaultPresets, i18n.language);
8870
+ }, [defaultPresets, i18n.language]);
8871
+ var selectedFilters = useSelector(function (store) {
8872
+ return getWorkspaceListFilters(store, undefined, undefined, isTemplatesEnabled);
8873
+ });
8799
8874
  var labelFilters = useSelector(function (store) {
8800
8875
  return getWorkspaceLabelFilters(store);
8801
8876
  });
8802
- var hasActiveLabelFilters = React.useMemo(function () {
8803
- if (!labelFilters) {
8804
- return false;
8805
- }
8806
- return Object.values(labelFilters).some(function (group) {
8807
- return Array.isArray(group) && group.length > 0;
8808
- });
8809
- }, [labelFilters]);
8810
8877
  var activeLabelFilterCount = React.useMemo(function () {
8811
8878
  if (!labelFilters) {
8812
8879
  return 0;
@@ -8814,8 +8881,8 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8814
8881
  return Object.values(labelFilters).flat().length;
8815
8882
  }, [labelFilters]);
8816
8883
  var filteredPresets = React.useMemo(function () {
8817
- return filterAndSortPresets(workspacePresets, selectedFilters, username, isAdmin, labelFilters != null ? labelFilters : undefined, workspaceSearchQuery, favourites.isFavourite);
8818
- }, [workspacePresets, selectedFilters, username, isAdmin, labelFilters, workspaceSearchQuery, favourites.isFavourite]);
8884
+ return filterAndSortPresets([].concat(workspacePresets, workspaceTemplateListItems), selectedFilters, username, isAdmin, labelFilters != null ? labelFilters : undefined, workspaceSearchQuery, favourites.isFavourite);
8885
+ }, [workspacePresets, workspaceTemplateListItems, selectedFilters, username, isAdmin, labelFilters, workspaceSearchQuery, favourites.isFavourite]);
8819
8886
  var infoPanelAnchorRef = React.useRef(null);
8820
8887
  var _React$useState = React.useState(),
8821
8888
  infoPreset = _React$useState[0],
@@ -8829,7 +8896,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8829
8896
  return getWorkspaceState(store);
8830
8897
  });
8831
8898
  var workspaceListFilters = useSelector(function (store) {
8832
- return getWorkspaceListFilters(store, scope, isAdmin);
8899
+ return getWorkspaceListFilters(store, scope, isAdmin, isTemplatesEnabled);
8833
8900
  });
8834
8901
  var error = (_useSelector = useSelector(function (store) {
8835
8902
  return getWorkspaceListError(store);
@@ -8849,11 +8916,6 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8849
8916
  workspaceId: workspaceId
8850
8917
  }));
8851
8918
  }, [dispatch]);
8852
- var setPreset = React.useCallback(function (workspacePreset) {
8853
- dispatch(workspaceActions.changePreset({
8854
- workspacePreset: workspacePreset
8855
- }));
8856
- }, [dispatch]);
8857
8919
  var setWorkspaceActionDialogOptions = React.useCallback(function (dialogOptions) {
8858
8920
  dispatch(workspaceListActions.openWorkspaceActionDialogOptions(dialogOptions));
8859
8921
  }, [dispatch]);
@@ -8862,9 +8924,10 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8862
8924
  id: id,
8863
8925
  isSelected: isSelected,
8864
8926
  isAdmin: isAdmin,
8865
- isFavouritesEnabled: isLoggedIn
8927
+ isFavouritesEnabled: isLoggedIn,
8928
+ isTemplatesEnabled: isTemplatesEnabled
8866
8929
  }));
8867
- }, [dispatch, isAdmin, isLoggedIn]);
8930
+ }, [dispatch, isAdmin, isLoggedIn, isTemplatesEnabled]);
8868
8931
  var setSelectAllFilterChip = React.useCallback(function () {
8869
8932
  dispatch(workspaceListActions.setSelectAllFilterChip());
8870
8933
  }, [dispatch]);
@@ -8873,34 +8936,23 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8873
8936
  searchQuery: searchQuery
8874
8937
  }));
8875
8938
  }, [dispatch]);
8876
- // If we're loading the `New workspace` preset as defined in the FE, use this instead of retrieving from BE
8877
- var onClickNewPreset = React.useCallback(function () {
8939
+ // The template preset without an id opens the empty workspace, which has its
8940
+ // own action so the configured default map settings are applied
8941
+ var openEmptyWorkspace = React.useCallback(function (templatePreset) {
8878
8942
  dispatch(routerActions.navigateToUrl({
8879
8943
  url: getWorkspaceRouteUrl()
8880
8944
  }));
8881
8945
  dispatch(workspaceListActions.toggleWorkspaceDialog({
8882
8946
  isWorkspaceListDialogOpen: false
8883
8947
  }));
8884
- dispatch(workspaceActions.changeToEmptyMapWorkspace({
8885
- newMapPresetText: t('workspace-mappreset-new'),
8886
- newWorkspaceText: t('workspace-new')
8887
- }));
8888
- }, [dispatch, t]);
8889
- var onClickNewSoundingsPreset = React.useCallback(function (id) {
8890
- dispatch(routerActions.navigateToUrl({
8891
- url: getWorkspaceRouteUrl(id)
8892
- }));
8893
- dispatch(workspaceListActions.toggleWorkspaceDialog({
8894
- isWorkspaceListDialogOpen: false
8895
- }));
8896
- setPreset(getNewSoundingsWorkspace(t));
8897
- }, [dispatch, setPreset, t]);
8948
+ dispatch(workspaceActions.changeToEmptyMapWorkspace(getEmptyMapWorkspaceTitles(templatePreset, i18n.language)));
8949
+ }, [dispatch, i18n.language]);
8898
8950
  var onClickWorkspacePreset = function onClickWorkspacePreset(id) {
8899
- if (id === LOCAL_SOUNDINGS_ID) {
8900
- onClickNewSoundingsPreset(id);
8901
- } else if (id === getEmptyMapWorkspace(t).id) {
8902
- onClickNewPreset();
8903
- } else if (!isFetching) {
8951
+ var templatePreset = findWorkspaceTemplatePreset(defaultPresets, id);
8952
+ if (templatePreset && !templatePreset.id) {
8953
+ openEmptyWorkspace(templatePreset);
8954
+ } else if (templatePreset || !isFetching) {
8955
+ // The fetchWorkspace listener opens template presets from the asset
8904
8956
  fetchWorkspace(id);
8905
8957
  }
8906
8958
  };
@@ -8922,12 +8974,14 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8922
8974
  return _regenerator().w(function (_context2) {
8923
8975
  while (1) switch (_context2.p = _context2.n) {
8924
8976
  case 0:
8925
- // If affectedPreset is the FE defined `New workspace` - use the definition from FE instead of BE
8977
+ // If affectedPreset is a default preset - use the definition from the
8978
+ // `templatePresets.json` asset instead of the BE
8926
8979
  affectedPreset = function () {
8927
- if (presetId === LOCAL_SOUNDINGS_ID) {
8928
- return getNewSoundingsWorkspace(t);
8980
+ var defaultPreset = findWorkspaceTemplatePreset(defaultPresets, presetId);
8981
+ if (defaultPreset) {
8982
+ return toWorkspacePresetFromTemplate(defaultPreset, i18n.language);
8929
8983
  }
8930
- return !presetId ? getEmptyMapWorkspace(t) : workspacePresets.find(function (preset) {
8984
+ return workspacePresets.find(function (preset) {
8931
8985
  return preset.id === presetId;
8932
8986
  });
8933
8987
  }();
@@ -8936,11 +8990,11 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
8936
8990
  _context2.n = _t === WorkspacePresetAction.DUPLICATE ? 1 : _t === WorkspacePresetAction.EDIT ? 3 : _t === WorkspacePresetAction.DELETE ? 5 : _t === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 6 : _t === WorkspacePresetAction.SHARE ? 7 : _t === WorkspacePresetAction.OPEN_TAB ? 8 : _t === WorkspacePresetAction.COPY_TO_CLIPBOARD ? 9 : 15;
8937
8991
  break;
8938
8992
  case 1:
8939
- if (!(!presetId || presetId === LOCAL_SOUNDINGS_ID)) {
8993
+ if (!(!presetId || isWorkspaceTemplatePresetId(defaultPresets, presetId))) {
8940
8994
  _context2.n = 2;
8941
8995
  break;
8942
8996
  }
8943
- // We are creating a duplicate workspace from new workspace/new soundings workspace
8997
+ // We are creating a duplicate workspace from a default preset
8944
8998
  views = getBEViewsFromState(affectedPreset);
8945
8999
  setWorkspaceActionDialogOptions({
8946
9000
  action: workspaceAction,
@@ -9125,7 +9179,6 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
9125
9179
  }).every(function (filter) {
9126
9180
  return filter.isSelected;
9127
9181
  });
9128
- var shouldHideNewWorkspace = !isAllSelected || workspaceSearchQuery.length > 0 || hasActiveLabelFilters;
9129
9182
  var closeInfo = React.useCallback(function () {
9130
9183
  setInfoPreset(undefined);
9131
9184
  }, []);
@@ -9272,12 +9325,10 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
9272
9325
  children: [jsx(WorkspaceSelectList, {
9273
9326
  currentSelectedId: currentView.id || '',
9274
9327
  favouritesDisabled: favourites.disabled,
9275
- hideNewWorkspace: shouldHideNewWorkspace,
9276
9328
  infoOpenPresetId: infoPreset == null ? void 0 : infoPreset.id,
9277
9329
  isAdmin: isAdmin,
9278
9330
  isEditable: isLoggedIn,
9279
9331
  isFavourite: favourites.isFavourite,
9280
- newPresets: [getEmptyWorkspaceListItem(t), getNewSoundingsWorkspaceListItem(t)],
9281
9332
  onClickWorkspacePreset: onClickWorkspacePreset,
9282
9333
  onClickWorkspacePresetOption: onClickWorkspacePresetOption,
9283
9334
  onOpenPresetInfo: onOpenPresetInfo,
@@ -10084,13 +10135,17 @@ var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref) {
10084
10135
  useResetViewPresetFiltersOnRoleChange(mosaicNodeId);
10085
10136
  var viewPresetsFilters = React.useMemo(function () {
10086
10137
  var _sessionStorageProvid;
10087
- var hasPluginsConfigured = !!((_sessionStorageProvid = sessionStorageProvider.getConfig()) != null && _sessionStorageProvid.GW_PLUGIN_BACKEND_URL);
10088
- if (hasPluginsConfigured) {
10089
- return defaultViewPresetsFilters.flatMap(function (filter) {
10090
- return filter.id === 'favourites' ? [pluginViewPresetsFilter, filter] : [filter];
10091
- });
10092
- }
10093
- return defaultViewPresetsFilters;
10138
+ var hasPlugins = !!((_sessionStorageProvid = sessionStorageProvider.getConfig()) != null && _sessionStorageProvid.GW_PLUGIN_BACKEND_URL);
10139
+ var hasTemplates = isTemplatePresetsEnabled();
10140
+ return defaultViewPresetsFilters.flatMap(function (filter) {
10141
+ if (filter.id === PresetFilterType.templates && !hasTemplates) {
10142
+ return [];
10143
+ }
10144
+ if (filter.id === PresetFilterType.favourites && hasPlugins) {
10145
+ return [pluginViewPresetsFilter, filter];
10146
+ }
10147
+ return [filter];
10148
+ });
10094
10149
  }, []);
10095
10150
  var view = useSelector(function (store) {
10096
10151
  return getViewById(store, mosaicNodeId);
@@ -10423,6 +10478,33 @@ var WorkspaceViewConnect = function WorkspaceViewConnect(_ref) {
10423
10478
  return window.removeEventListener('orientationchange', handleOrientationChange);
10424
10479
  };
10425
10480
  }, [handleOrientationChange]);
10481
+ var isWorkspaceListDialogOpen = useSelector(function (store) {
10482
+ return getIsWorkspaceListDialogOpen(store);
10483
+ });
10484
+ React.useEffect(function () {
10485
+ if (isWorkspaceListDialogOpen) {
10486
+ return undefined;
10487
+ }
10488
+ var handleKeyDown = function handleKeyDown(event) {
10489
+ if (event.code !== 'KeyP' || event.ctrlKey || event.metaKey || event.altKey || event.repeat || event.defaultPrevented || isTargetInteractiveInput(event.target)) {
10490
+ return;
10491
+ }
10492
+ var panelIds = getLeaves(mosaicNode);
10493
+ var panelId = panelIds.includes(activeWindowId) ? activeWindowId : panelIds[0];
10494
+ if (!panelId) {
10495
+ return;
10496
+ }
10497
+ event.preventDefault();
10498
+ dispatch(viewPresetActions.toggleViewPresetListDialog({
10499
+ panelId: panelId,
10500
+ isViewPresetListDialogOpen: true
10501
+ }));
10502
+ };
10503
+ document.addEventListener('keydown', handleKeyDown);
10504
+ return function () {
10505
+ document.removeEventListener('keydown', handleKeyDown);
10506
+ };
10507
+ }, [activeWindowId, dispatch, isWorkspaceListDialogOpen, mosaicNode]);
10426
10508
  React.useEffect(function () {
10427
10509
  if (!mosaicNode) {
10428
10510
  dispatch(workspaceActions.teardownComplete());
@@ -10476,6 +10558,12 @@ var useResetWorkspaceFiltersOnRoleChange = function useResetWorkspaceFiltersOnRo
10476
10558
  }, {
10477
10559
  id: PresetFilterType.shared,
10478
10560
  isSelected: true
10561
+ }, {
10562
+ id: PresetFilterType.templates,
10563
+ isSelected: true
10564
+ }, {
10565
+ id: PresetFilterType.favourites,
10566
+ isSelected: true
10479
10567
  }];
10480
10568
  dispatch(workspaceListActions.setFilterChips(filters));
10481
10569
  }
@@ -11311,9 +11399,12 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
11311
11399
  appTitle = _ref.appTitle;
11312
11400
  var dispatch = useDispatch();
11313
11401
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
11314
- t = _useWorkspaceTranslat.t;
11402
+ t = _useWorkspaceTranslat.t,
11403
+ i18n = _useWorkspaceTranslat.i18n;
11315
11404
  var _useAuthenticationCon = useAuthenticationContext(),
11316
11405
  auth = _useAuthenticationCon.auth;
11406
+ var _useWorkspaceTemplate = useWorkspaceTemplatePresets(),
11407
+ defaultPresets = _useWorkspaceTemplate.data;
11317
11408
  var _useDeleteWorkspacePr = useDeleteWorkspacePreset(),
11318
11409
  deleteWorkspace = _useDeleteWorkspacePr.mutate,
11319
11410
  isDeletePending = _useDeleteWorkspacePr.isPending;
@@ -11331,10 +11422,11 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
11331
11422
  }, [dispatch]);
11332
11423
  var onSubmitForm = /*#__PURE__*/function () {
11333
11424
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(presetAction, presetId, data) {
11334
- var _oldWorkspace$views, _data$labels, _data$scope, oldWorkspace, viewsToDuplicate, duplicatedWorkspace, _t2, _t3;
11425
+ var defaultPreset, _oldWorkspace$views, _data$labels, _data$scope, oldWorkspace, viewsToDuplicate, duplicatedWorkspace, _t2, _t3;
11335
11426
  return _regenerator().w(function (_context2) {
11336
11427
  while (1) switch (_context2.n) {
11337
11428
  case 0:
11429
+ defaultPreset = findWorkspaceTemplatePreset(defaultPresets, presetId);
11338
11430
  _t2 = presetAction;
11339
11431
  _context2.n = _t2 === WorkspacePresetAction.DELETE ? 1 : _t2 === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 1 : _t2 === WorkspacePresetAction.DUPLICATE ? 2 : 8;
11340
11432
  break;
@@ -11344,7 +11436,7 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
11344
11436
  });
11345
11437
  return _context2.a(3, 9);
11346
11438
  case 2:
11347
- if (!(!presetId || presetId === LOCAL_SOUNDINGS_ID)) {
11439
+ if (!(!presetId || defaultPreset)) {
11348
11440
  _context2.n = 3;
11349
11441
  break;
11350
11442
  }
@@ -11436,7 +11528,7 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
11436
11528
  data: data,
11437
11529
  emptyMapPresetTitle: t('workspace-mappreset-new'),
11438
11530
  emptyWorkspacePresetTitle: t('workspace-new'),
11439
- emptySoundingsPresetTitle: t('workspace-new-soundings')
11531
+ defaultPreset: defaultPreset ? toWorkspacePresetFromTemplate(defaultPreset, i18n.language) : undefined
11440
11532
  }));
11441
11533
  return _context2.a(3, 9);
11442
11534
  case 9:
@@ -12093,11 +12185,6 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
12093
12185
  changeToEmptyMapWorkspace();
12094
12186
  navigateToUrl(routes.root);
12095
12187
  };
12096
- var setPreset = React.useCallback(function (workspacePreset) {
12097
- dispatch(workspaceActions.changePreset({
12098
- workspacePreset: workspacePreset
12099
- }));
12100
- }, [dispatch]);
12101
12188
  React.useEffect(function () {
12102
12189
  var idToFetch = workspaceId || initialWorkspaceId;
12103
12190
  var hasWorkspaceData = workspaceState.views.allIds.length > 0;
@@ -12108,10 +12195,8 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
12108
12195
  isWorkspaceListDialogOpen: true
12109
12196
  }));
12110
12197
  }
12111
- } else if (idToFetch === LOCAL_SOUNDINGS_ID) {
12112
- // If the workspaceId is the local soundings id, we don't want to fetch it from the backend, but instead set it to an empty soundings workspace
12113
- setPreset(getNewSoundingsWorkspace(t));
12114
12198
  } else if (idToFetch) {
12199
+ // The fetchWorkspace listener also opens template presets
12115
12200
  fetchWorkspace(idToFetch);
12116
12201
  }
12117
12202
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -12181,10 +12266,128 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
12181
12266
  });
12182
12267
  };
12183
12268
 
12269
+ /* *
12270
+ * Licensed under the Apache License, Version 2.0 (the "License");
12271
+ * you may not use this file except in compliance with the License.
12272
+ * You may obtain a copy of the License at
12273
+ *
12274
+ * http://www.apache.org/licenses/LICENSE-2.0
12275
+ *
12276
+ * Unless required by applicable law or agreed to in writing, software
12277
+ * distributed under the License is distributed on an "AS IS" BASIS,
12278
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12279
+ * See the License for the specific language governing permissions and
12280
+ * limitations under the License.
12281
+ *
12282
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12283
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
12284
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
12285
+ * */
12286
+ var isSystemScope = function isSystemScope(scope) {
12287
+ return scope === SystemScope.system;
12288
+ };
12289
+ var pickWorkspaceListError = function pickWorkspaceListError(error) {
12290
+ if (!error) {
12291
+ return undefined;
12292
+ }
12293
+ return error.type === WorkspaceListErrorType.TRANSLATABLE_ERROR ? {
12294
+ type: error.type,
12295
+ category: error.category,
12296
+ key: error.key
12297
+ } : {
12298
+ type: error.type,
12299
+ category: error.category
12300
+ };
12301
+ };
12302
+ var workspaceSentryStateMap = {
12303
+ workspace: function workspace(_workspace) {
12304
+ return {
12305
+ id: isSystemScope(_workspace.scope) ? _workspace.id : undefined,
12306
+ scope: _workspace.scope,
12307
+ viewType: _workspace.viewType,
12308
+ isLoading: _workspace.isLoading,
12309
+ hasChanges: _workspace.hasChanges,
12310
+ error: _workspace.error && {
12311
+ type: _workspace.error.type,
12312
+ message: _workspace.error.message
12313
+ },
12314
+ isTimeScrollingEnabled: _workspace.isTimeScrollingEnabled,
12315
+ syncGroups: pickList(_workspace.syncGroups, function (syncGroup) {
12316
+ return {
12317
+ id: syncGroup.id,
12318
+ type: syncGroup.type,
12319
+ sourcePanelId: syncGroup.sourcePanelId
12320
+ };
12321
+ }),
12322
+ views: pickEntities(_workspace.views, function (view) {
12323
+ return {
12324
+ id: isSystemScope(view.scope) ? view.id : undefined,
12325
+ mosaicNodeId: view.mosaicNodeId,
12326
+ componentType: view.componentType,
12327
+ scope: view.scope,
12328
+ activeLayerId: view.activeLayerId
12329
+ };
12330
+ })
12331
+ };
12332
+ },
12333
+ viewPresets: function viewPresets(_viewPresets) {
12334
+ return {
12335
+ ids: _viewPresets.ids,
12336
+ entities: pickRecord(_viewPresets.entities, function (entity) {
12337
+ return {
12338
+ panelId: entity.panelId,
12339
+ hasChanges: entity.hasChanges,
12340
+ isFetching: entity.isFetching,
12341
+ isViewPresetListDialogOpen: entity.isViewPresetListDialogOpen,
12342
+ error: entity.error && {
12343
+ component: entity.error.component,
12344
+ errorType: entity.error.errorType,
12345
+ message: entity.error.message
12346
+ },
12347
+ filters: pickList(entity.filters, function (filter) {
12348
+ return {
12349
+ id: filter.id,
12350
+ isSelected: filter.isSelected,
12351
+ isDisabled: filter.isDisabled
12352
+ };
12353
+ })
12354
+ };
12355
+ }),
12356
+ viewPresetDialog: _viewPresets.viewPresetDialog && {
12357
+ action: _viewPresets.viewPresetDialog.action,
12358
+ panelId: _viewPresets.viewPresetDialog.panelId,
12359
+ shouldSetActiveViewPreset: _viewPresets.viewPresetDialog.shouldSetActiveViewPreset
12360
+ }
12361
+ };
12362
+ },
12363
+ workspaceList: function workspaceList(_workspaceList) {
12364
+ return {
12365
+ isWorkspaceListDialogOpen: _workspaceList.isWorkspaceListDialogOpen,
12366
+ error: pickWorkspaceListError(_workspaceList.error),
12367
+ workspaceListFilters: pickList(_workspaceList.workspaceListFilters, function (filter) {
12368
+ return {
12369
+ id: filter.id,
12370
+ isSelected: filter.isSelected,
12371
+ isDisabled: filter.isDisabled
12372
+ };
12373
+ }),
12374
+ workspaceActionDialog: _workspaceList.workspaceActionDialog && {
12375
+ action: _workspaceList.workspaceActionDialog.action,
12376
+ hasSaved: _workspaceList.workspaceActionDialog.hasSaved,
12377
+ error: pickWorkspaceListError(_workspaceList.workspaceActionDialog.error)
12378
+ }
12379
+ };
12380
+ }
12381
+ };
12382
+
12184
12383
  var workspacePresets$1 = [
12185
12384
  {
12186
- titleKey: "workspace-new",
12187
- title: "New workspace",
12385
+ title: {
12386
+ en: "New workspace",
12387
+ fi: "Uusi workspace",
12388
+ no: "Ny arbeidsflate",
12389
+ nl: "Nieuwe workspace"
12390
+ },
12188
12391
  scope: "system",
12189
12392
  abstract: "",
12190
12393
  viewType: "singleWindow",
@@ -12195,8 +12398,12 @@ var workspacePresets$1 = [
12195
12398
  ],
12196
12399
  byId: {
12197
12400
  "1_screen": {
12198
- titleKey: "workspace-mappreset-new",
12199
- title: "New map preset",
12401
+ title: {
12402
+ en: "New map preset",
12403
+ fi: "Uusi map preset",
12404
+ no: "Ny snarvei",
12405
+ nl: "Nieuwe map preset"
12406
+ },
12200
12407
  componentType: "Map",
12201
12408
  initialProps: {
12202
12409
  mapPreset: {
@@ -12214,8 +12421,12 @@ var workspacePresets$1 = [
12214
12421
  var viewPresets = [
12215
12422
  {
12216
12423
  id: "template-map",
12217
- titleKey: "workspace-template-map",
12218
- title: "New map preset",
12424
+ title: {
12425
+ en: "New map preset",
12426
+ fi: "Uusi map preset",
12427
+ no: "Ny kartpreset",
12428
+ nl: "Nieuwe map preset"
12429
+ },
12219
12430
  componentType: "Map",
12220
12431
  initialProps: {
12221
12432
  mapPreset: {
@@ -12228,8 +12439,12 @@ var viewPresets = [
12228
12439
  },
12229
12440
  {
12230
12441
  id: "template-timeseries",
12231
- titleKey: "workspace-template-timeseries",
12232
- title: "New timeseries preset",
12442
+ title: {
12443
+ en: "New timeseries preset",
12444
+ fi: "Uusi timeseries preset",
12445
+ no: "Ny tidsseriepreset",
12446
+ nl: "Nieuwe timeseries preset"
12447
+ },
12233
12448
  componentType: "TimeSeries",
12234
12449
  initialProps: {
12235
12450
  plotPreset: {
@@ -12247,8 +12462,12 @@ var viewPresets = [
12247
12462
  },
12248
12463
  {
12249
12464
  id: "template-soundings",
12250
- titleKey: "workspace-template-soundings",
12251
- title: "New sounding preset",
12465
+ title: {
12466
+ en: "New sounding preset",
12467
+ fi: "Uusi luotauspreset",
12468
+ no: "Ny sonderingspreset",
12469
+ nl: "Nieuwe sounding preset"
12470
+ },
12252
12471
  componentType: "Soundings",
12253
12472
  initialProps: {
12254
12473
  selectedSources: {
@@ -12261,16 +12480,24 @@ var viewPresets = [
12261
12480
  },
12262
12481
  {
12263
12482
  id: "template-warninglist",
12264
- titleKey: "workspace-template-warninglist",
12265
- title: "New warninglist preset",
12483
+ title: {
12484
+ en: "New warninglist preset",
12485
+ fi: "Uusi varoituslistapreset",
12486
+ no: "Ny varsellistepreset",
12487
+ nl: "Nieuwe warninglist preset"
12488
+ },
12266
12489
  componentType: "WarningList",
12267
12490
  initialProps: {
12268
12491
  }
12269
12492
  },
12270
12493
  {
12271
12494
  id: "template-timeline",
12272
- titleKey: "workspace-template-timeline",
12273
- title: "New timeline preset",
12495
+ title: {
12496
+ en: "New timeline preset",
12497
+ fi: "Uusi aikajanapreset",
12498
+ no: "Ny tidslinjepreset",
12499
+ nl: "Nieuwe timeline preset"
12500
+ },
12274
12501
  componentType: "WarningsTimeline",
12275
12502
  initialProps: {
12276
12503
  }
@@ -13679,4 +13906,4 @@ var workspaceEndpoints = [].concat(createUserPreferencesEndpoints(), [http.get(/
13679
13906
  }, _callee6);
13680
13907
  })))]);
13681
13908
 
13682
- 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, workspaceTranslations };
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 };