@opengeoweb/workspace 12.2.0 → 12.4.1

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/index.esm.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware, combineReducers, configureStore } from '@reduxjs/toolkit';
2
2
  import { syncGroupsTypes, syncGroupsActions, layerActions, mapActions, uiActions, genericActions, layerTypes, mapEnums, selectorMemoizationOptions, genericSelectors, mapSelectors, syncGroupsSelectors, routerActions, createViewObjectForNewMap, mapListener, serviceListener, layersListener, syncGroupsListener, openlayersListener, uiReducer, loadingIndicatorReducer, syncGroupsReducer, layerReducer, serviceReducer, mapReducer, loadingIndicatorSelectors, uiTypes, linkComponentTypesConstants, uiSelectors } from '@opengeoweb/store';
3
- import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, getConfig, getHeaders, handleResponse, useApiContext, useAuthenticationContext as useAuthenticationContext$1, GEOWEB_ROLE_PRESETS_ADMIN as GEOWEB_ROLE_PRESETS_ADMIN$1 } from '@opengeoweb/api';
3
+ import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, getHeaders, handleResponse, useApiContext, useAuthenticationContext as useAuthenticationContext$1, GEOWEB_ROLE_PRESETS_ADMIN as GEOWEB_ROLE_PRESETS_ADMIN$1 } from '@opengeoweb/api';
4
4
  import { chunk, cloneDeep, union, pick, isEmpty, isEqual, isString } from 'lodash';
5
5
  import { getLeaves, createBalancedTreeFromLeaves, MosaicContext, getAndAssertNodeAtPathExists, MosaicWindow, Mosaic } from 'react-mosaic-component';
6
6
  import { timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer } from '@opengeoweb/timeseries';
7
7
  import { publicWarningActions, warningsTranslations, WARN_NAMESPACE, publicWarningsSelectors } from '@opengeoweb/warnings';
8
- import { PROJECTION, getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, ConfirmationServiceProvider, usePrevious, AlertBanner, SystemScope, CustomTooltip, SearchHighlight, ToggleMenu, CustomIconButton, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, useConfirmationDialog, ConfirmationButtons } from '@opengeoweb/shared';
8
+ import { PROJECTION, getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, ConfirmationServiceProvider, usePrevious, AlertBanner, sessionStorageProvider, SystemScope, CustomTooltip, SearchHighlight, ToggleMenu, CustomIconButton, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, useConfirmationDialog, ConfirmationButtons } from '@opengeoweb/shared';
9
9
  import { snackbarTypes, snackbarActions, snackbarListener, snackbarReducer, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
10
10
  import { isAxiosError } from 'axios';
11
11
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -20,7 +20,7 @@ import { coreTranslations, CORE_NAMESPACE } from '@opengeoweb/core';
20
20
  import { formFieldsTranslations, FORM_FIELDS_NAMESPACE, ReactHookFormTextField, ReactHookFormHiddenInput, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
21
21
  import * as React from 'react';
22
22
  import React__default, { useCallback, useEffect } from 'react';
23
- import { LinearProgress, Typography, styled, ListItemIcon, ListItem, ListItemButton, ListItemText, Grid2, Box, Menu, ListSubheader, MenuItem, useTheme, List, Checkbox, FormGroup, FormControlLabel, Tabs } from '@mui/material';
23
+ import { LinearProgress, Typography, styled, ListItemIcon, ListItem, ListItemButton, ListItemText, Grid, Box, Menu, ListSubheader, MenuItem, useTheme, List, Checkbox, FormGroup, FormControlLabel, Tabs } from '@mui/material';
24
24
  import 'react-mosaic-component/react-mosaic-component.css';
25
25
  import AutoSizer from 'react-virtualized-auto-sizer';
26
26
  import { FixedSizeList } from 'react-window';
@@ -782,23 +782,6 @@ var createApi$1 = function createApi(props) {
782
782
  return getApiRoutes$1(props.auth ? authInstance : nonAuthInstance);
783
783
  };
784
784
 
785
- /* *
786
- * Licensed under the Apache License, Version 2.0 (the "License");
787
- * you may not use this file except in compliance with the License.
788
- * You may obtain a copy of the License at
789
- *
790
- * http://www.apache.org/licenses/LICENSE-2.0
791
- *
792
- * Unless required by applicable law or agreed to in writing, software
793
- * distributed under the License is distributed on an "AS IS" BASIS,
794
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
795
- * See the License for the specific language governing permissions and
796
- * limitations under the License.
797
- *
798
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
799
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
800
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
801
- * */
802
785
  var getWorkspaceApi = function getWorkspaceApi() {
803
786
  return getApi(API_NAME);
804
787
  };
@@ -885,6 +868,57 @@ var getErrorMessage = function getErrorMessage(error) {
885
868
  var suffix = (_error$response = error.response) == null || (_error$response = _error$response.data) == null ? void 0 : _error$response.message;
886
869
  return suffix ? prefix + ": " + suffix : prefix;
887
870
  };
871
+ var updateViewPresets = function updateViewPresets(saveViewPreset, getViewPresetEntity, data, scope) {
872
+ return Promise.all(data.views.map( /*#__PURE__*/function () {
873
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(view) {
874
+ var viewPresetEntity, shouldUpdateView, canUpdateView, payload, _payload;
875
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
876
+ while (1) switch (_context.prev = _context.next) {
877
+ case 0:
878
+ viewPresetEntity = getViewPresetEntity(view);
879
+ shouldUpdateView = view.hasChanges && view.isSelected;
880
+ canUpdateView = scope === 'system' || scope === viewPresetEntity.scope; // save existing views
881
+ if (!(shouldUpdateView && view.viewPresetId !== 'emptyMap' && canUpdateView)) {
882
+ _context.next = 6;
883
+ break;
884
+ }
885
+ payload = {
886
+ panelId: view.mosaicNodeId,
887
+ viewPresetId: view.viewPresetId,
888
+ viewPreset: viewPresetEntity
889
+ };
890
+ return _context.abrupt("return", saveViewPreset({
891
+ payload: payload
892
+ }));
893
+ case 6:
894
+ if (!shouldUpdateView) {
895
+ _context.next = 9;
896
+ break;
897
+ }
898
+ _payload = {
899
+ panelId: view.mosaicNodeId,
900
+ viewPresetId: '',
901
+ viewPreset: Object.assign({}, viewPresetEntity, {
902
+ // update scope
903
+ scope: scope
904
+ })
905
+ };
906
+ return _context.abrupt("return", saveViewPreset({
907
+ payload: _payload
908
+ }, true));
909
+ case 9:
910
+ return _context.abrupt("return", viewPresetEntity);
911
+ case 10:
912
+ case "end":
913
+ return _context.stop();
914
+ }
915
+ }, _callee);
916
+ }));
917
+ return function (_x) {
918
+ return _ref.apply(this, arguments);
919
+ };
920
+ }()));
921
+ };
888
922
 
889
923
  /* *
890
924
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -5142,6 +5176,7 @@ workspaceListener.startListening({
5142
5176
  actionCreator: workspaceActions.updateWorkspaceViews,
5143
5177
  effect: function () {
5144
5178
  var _effect9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12(_, listenerApi) {
5179
+ var viewIds;
5145
5180
  return _regeneratorRuntime().wrap(function _callee12$(_context12) {
5146
5181
  while (1) switch (_context12.prev = _context12.next) {
5147
5182
  case 0:
@@ -5154,7 +5189,24 @@ workspaceListener.startListening({
5154
5189
  /* This will trigger all maps and other components
5155
5190
  to get the correct size after views are updated */
5156
5191
  window.dispatchEvent(new Event('resize'));
5157
- case 4:
5192
+ // Adjust the bbox of the original view after the new map is added. This is a temporal solution until the OpenLayers ticket
5193
+ // https://github.com/openlayers/openlayers/issues/16572 is solved.
5194
+ _context12.next = 6;
5195
+ return listenerApi.delay(10);
5196
+ case 6:
5197
+ viewIds = getViewIds(listenerApi.getState());
5198
+ viewIds.forEach(function (viewId) {
5199
+ var bbox = mapSelectors.getBbox(listenerApi.getState(), viewId);
5200
+ var srs = mapSelectors.getSrs(listenerApi.getState(), viewId);
5201
+ if (bbox && bbox.left !== undefined && srs) {
5202
+ listenerApi.dispatch(mapActions.setBbox({
5203
+ mapId: viewId,
5204
+ bbox: bbox,
5205
+ srs: srs
5206
+ }));
5207
+ }
5208
+ });
5209
+ case 8:
5158
5210
  case "end":
5159
5211
  return _context12.stop();
5160
5212
  }
@@ -5604,7 +5656,7 @@ workspaceListListener.startListening({
5604
5656
  effect: function () {
5605
5657
  var _effect2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2, listenerApi) {
5606
5658
  var _listenerApi$getOrigi;
5607
- var payload, currentWorkspaceId, action, workspaceId, title, is_shared, workspaceFilters, searchQuery;
5659
+ var payload, currentWorkspaceId, action, workspaceId, title, is_shared, searchQuery;
5608
5660
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5609
5661
  while (1) switch (_context2.prev = _context2.next) {
5610
5662
  case 0:
@@ -5626,11 +5678,10 @@ workspaceListListener.startListening({
5626
5678
  url: getWorkspaceRouteUrl(workspaceId)
5627
5679
  }));
5628
5680
  }
5629
- // Retrieve new list with current filter
5630
- workspaceFilters = getWorkspaceListFilters(listenerApi.getState());
5681
+ // Retrieve new list with current search query
5631
5682
  searchQuery = getWorkspaceListSearchQuery(listenerApi.getState());
5632
- listenerApi.dispatch(workspaceListActions.fetchWorkspaceList(constructFilterParams(workspaceFilters, searchQuery)));
5633
- case 11:
5683
+ listenerApi.dispatch(workspaceListActions.fetchWorkspaceList(constructFilterParams([], searchQuery)));
5684
+ case 10:
5634
5685
  case "end":
5635
5686
  return _context2.stop();
5636
5687
  }
@@ -5645,15 +5696,16 @@ workspaceListListener.startListening({
5645
5696
  workspaceListListener.startListening({
5646
5697
  actionCreator: workspaceListActions.submitFormWorkspaceActionDialogOptions,
5647
5698
  effect: function () {
5648
- var _effect3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref3, listenerApi) {
5649
- var payload, workspaceApi, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, _yield$workspaceApi$g2, originalData, workspaceDataNewTitle, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, viewPresetResults, hasError, _hasError$message, errorMessage, workspaceData, newWorkspace, message, category;
5650
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
5651
- while (1) switch (_context4.prev = _context4.next) {
5699
+ var _effect3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref3, listenerApi) {
5700
+ var payload, workspaceApi, workspaceState, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, _yield$workspaceApi$g2, originalData, workspaceDataNewTitle, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, saveViewPreset, getViewPresetEntity, viewPresetResults, hasError, _hasError$message, errorMessage, workspaceData, newWorkspace, message, category;
5701
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5702
+ while (1) switch (_context3.prev = _context3.next) {
5652
5703
  case 0:
5653
5704
  payload = _ref3.payload;
5654
5705
  listenerApi.cancelActiveListeners();
5655
5706
  workspaceApi = getWorkspaceApi();
5656
- _context4.prev = 3;
5707
+ workspaceState = listenerApi.getState();
5708
+ _context3.prev = 4;
5657
5709
  presetId = payload.presetId, presetAction = payload.presetAction, data = payload.data, emptyMapPresetTitle = payload.emptyMapPresetTitle, emptyWorkspacePresetTitle = payload.emptyWorkspacePresetTitle;
5658
5710
  scope = data.scope || 'user'; // duplicate
5659
5711
  if (presetAction === WorkspacePresetAction.DUPLICATE) ;
@@ -5661,21 +5713,21 @@ workspaceListListener.startListening({
5661
5713
  if (presetAction === WorkspacePresetAction.DELETE || presetAction === WorkspacePresetAction.DELETE_SYSTEM_PRESET) ;
5662
5714
  // edit
5663
5715
  if (!(presetAction === WorkspacePresetAction.EDIT)) {
5664
- _context4.next = 17;
5716
+ _context3.next = 18;
5665
5717
  break;
5666
5718
  }
5667
- _context4.next = 11;
5719
+ _context3.next = 12;
5668
5720
  return workspaceApi.getWorkspacePreset(presetId);
5669
- case 11:
5670
- _yield$workspaceApi$g2 = _context4.sent;
5721
+ case 12:
5722
+ _yield$workspaceApi$g2 = _context3.sent;
5671
5723
  originalData = _yield$workspaceApi$g2.data;
5672
5724
  workspaceDataNewTitle = Object.assign({}, originalData, {
5673
5725
  title: data.title,
5674
5726
  "abstract": data["abstract"]
5675
5727
  });
5676
- _context4.next = 16;
5728
+ _context3.next = 17;
5677
5729
  return workspaceApi.saveWorkspacePreset(presetId, workspaceDataNewTitle);
5678
- case 16:
5730
+ case 17:
5679
5731
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
5680
5732
  workspaceId: presetId,
5681
5733
  action: presetAction,
@@ -5683,97 +5735,48 @@ workspaceListListener.startListening({
5683
5735
  "abstract": data["abstract"],
5684
5736
  scope: scope
5685
5737
  }));
5686
- case 17:
5738
+ case 18:
5687
5739
  // save (as) user/system presets
5688
5740
  isSaveWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET || presetAction === WorkspacePresetAction.SAVE;
5689
5741
  isSaveAsWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || presetAction === WorkspacePresetAction.SAVE_AS;
5690
5742
  if (!(isSaveWorkspaceAction || isSaveAsWorkspaceAction)) {
5691
- _context4.next = 44;
5743
+ _context3.next = 44;
5692
5744
  break;
5693
5745
  }
5694
- hasWorkspaceAlreadyBeenSaved = getWorkspaceDialogIsSaved(listenerApi.getState());
5746
+ hasWorkspaceAlreadyBeenSaved = getWorkspaceDialogIsSaved(workspaceState);
5695
5747
  workspaceId = presetId;
5696
5748
  if (!(!hasWorkspaceAlreadyBeenSaved && isSaveAsWorkspaceAction)) {
5697
- _context4.next = 26;
5749
+ _context3.next = 27;
5698
5750
  break;
5699
5751
  }
5700
- _context4.next = 25;
5752
+ _context3.next = 26;
5701
5753
  return workspaceApi.saveWorkspacePresetAs(data);
5702
- case 25:
5703
- workspaceId = _context4.sent;
5704
5754
  case 26:
5705
- if (!isSaveWorkspaceAction) {
5706
- _context4.next = 29;
5707
- break;
5708
- }
5709
- _context4.next = 29;
5710
- return workspaceApi.saveWorkspacePreset(workspaceId, data);
5711
- case 29:
5755
+ workspaceId = _context3.sent;
5756
+ case 27:
5712
5757
  // lock the workspace
5713
5758
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspaceSaveDialog({
5714
5759
  presetId: workspaceId
5715
5760
  }));
5716
- _context4.next = 32;
5717
- return Promise.all(data.views.map( /*#__PURE__*/function () {
5718
- var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(view) {
5719
- var viewPresetEntity, shouldUpdateView, canUpdateView, _payload, _payload2;
5720
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5721
- while (1) switch (_context3.prev = _context3.next) {
5722
- case 0:
5723
- viewPresetEntity = Object.assign({}, getViewPresetToSendToBackend(listenerApi.getState(), view.mosaicNodeId), {
5724
- title: view.title
5725
- }, view["abstract"] && {
5726
- "abstract": view["abstract"]
5727
- });
5728
- shouldUpdateView = view.hasChanges && view.isSelected;
5729
- canUpdateView = scope === 'system' || scope === viewPresetEntity.scope; // save existing views
5730
- if (!(shouldUpdateView && view.viewPresetId !== 'emptyMap' && canUpdateView)) {
5731
- _context3.next = 6;
5732
- break;
5733
- }
5734
- _payload = {
5735
- panelId: view.mosaicNodeId,
5736
- viewPresetId: view.viewPresetId,
5737
- viewPreset: viewPresetEntity
5738
- };
5739
- return _context3.abrupt("return", saveViewPresetEffect({
5740
- payload: _payload
5741
- }, listenerApi));
5742
- case 6:
5743
- if (!shouldUpdateView) {
5744
- _context3.next = 9;
5745
- break;
5746
- }
5747
- _payload2 = {
5748
- panelId: view.mosaicNodeId,
5749
- viewPresetId: '',
5750
- viewPreset: Object.assign({}, viewPresetEntity, {
5751
- // update scope
5752
- scope: scope
5753
- })
5754
- };
5755
- return _context3.abrupt("return", saveViewPresetAsEffect({
5756
- payload: _payload2
5757
- }, listenerApi));
5758
- case 9:
5759
- return _context3.abrupt("return", viewPresetEntity);
5760
- case 10:
5761
- case "end":
5762
- return _context3.stop();
5763
- }
5764
- }, _callee3);
5765
- }));
5766
- return function (_x7) {
5767
- return _ref4.apply(this, arguments);
5768
- };
5769
- }()));
5761
+ saveViewPreset = function saveViewPreset(payloadAction, saveAs) {
5762
+ return saveAs ? saveViewPresetAsEffect(payloadAction, listenerApi) : saveViewPresetEffect(payloadAction, listenerApi);
5763
+ };
5764
+ getViewPresetEntity = function getViewPresetEntity(view) {
5765
+ return Object.assign({}, getViewPresetToSendToBackend(workspaceState, view.mosaicNodeId), {
5766
+ title: view.title
5767
+ }, view["abstract"] && {
5768
+ "abstract": view["abstract"]
5769
+ });
5770
+ };
5771
+ _context3.next = 32;
5772
+ return updateViewPresets(saveViewPreset, getViewPresetEntity, data, scope);
5770
5773
  case 32:
5771
- viewPresetResults = _context4.sent;
5774
+ viewPresetResults = _context3.sent;
5772
5775
  hasError = viewPresetResults.find(function (view) {
5773
5776
  return view.message;
5774
5777
  });
5775
5778
  if (!hasError) {
5776
- _context4.next = 38;
5779
+ _context3.next = 38;
5777
5780
  break;
5778
5781
  }
5779
5782
  // maybe we can use another action, but this resets fetching of the form
@@ -5785,7 +5788,7 @@ workspaceListListener.startListening({
5785
5788
  category: WorkspaceListErrorCategory.GENERIC
5786
5789
  }
5787
5790
  }));
5788
- return _context4.abrupt("return");
5791
+ return _context3.abrupt("return");
5789
5792
  case 38:
5790
5793
  workspaceData = getWorkspaceData(listenerApi.getState());
5791
5794
  newWorkspace = Object.assign({}, workspaceData, {
@@ -5794,7 +5797,7 @@ workspaceListListener.startListening({
5794
5797
  "abstract": data["abstract"],
5795
5798
  scope: scope
5796
5799
  });
5797
- _context4.next = 42;
5800
+ _context3.next = 42;
5798
5801
  return workspaceApi.saveWorkspacePreset(workspaceId, newWorkspace);
5799
5802
  case 42:
5800
5803
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
@@ -5830,13 +5833,13 @@ workspaceListListener.startListening({
5830
5833
  scope: scope
5831
5834
  }));
5832
5835
  }
5833
- _context4.next = 52;
5836
+ _context3.next = 52;
5834
5837
  break;
5835
5838
  case 47:
5836
- _context4.prev = 47;
5837
- _context4.t0 = _context4["catch"](3);
5838
- message = isAxiosError$1(_context4.t0) ? getAxiosErrorMessage(_context4.t0) : _context4.t0.message;
5839
- category = isAxiosAuthError(_context4.t0) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
5839
+ _context3.prev = 47;
5840
+ _context3.t0 = _context3["catch"](4);
5841
+ message = isAxiosError$1(_context3.t0) ? getAxiosErrorMessage(_context3.t0) : _context3.t0.message;
5842
+ category = isAxiosAuthError(_context3.t0) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
5840
5843
  listenerApi.dispatch(workspaceListActions.onErrorWorkspacePresetAction({
5841
5844
  error: {
5842
5845
  type: WorkspaceListErrorType.VERBATIM_ERROR,
@@ -5846,9 +5849,9 @@ workspaceListListener.startListening({
5846
5849
  }));
5847
5850
  case 52:
5848
5851
  case "end":
5849
- return _context4.stop();
5852
+ return _context3.stop();
5850
5853
  }
5851
- }, _callee4, null, [[3, 47]]);
5854
+ }, _callee3, null, [[4, 47]]);
5852
5855
  }));
5853
5856
  function effect(_x5, _x6) {
5854
5857
  return _effect3.apply(this, arguments);
@@ -6304,7 +6307,7 @@ var defaultComponentsLookUp = function defaultComponentsLookUp(_ref3) {
6304
6307
  * Copyright 2025 - Finnish Meteorological Institute (FMI)
6305
6308
  * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
6306
6309
  * */
6307
- var config$1 = getConfig();
6310
+ var config$1 = sessionStorageProvider.getConfig();
6308
6311
  var presetBaseUrl$1 = (config$1 == null ? void 0 : config$1.GW_PRESET_BACKEND_URL) || '';
6309
6312
  var getViewPreset = function getViewPreset(viewpresetId, auth) {
6310
6313
  return fetch(presetBaseUrl$1 + "/viewpreset/" + viewpresetId, {
@@ -6452,12 +6455,12 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6452
6455
  margin: 0
6453
6456
  }
6454
6457
  })
6455
- }), isEditable && jsx(Grid2, {
6458
+ }), isEditable && jsx(Grid, {
6456
6459
  sx: {
6457
6460
  minWidth: 56,
6458
6461
  marginLeft: 2
6459
6462
  },
6460
- children: jsxs(Grid2, {
6463
+ children: jsxs(Grid, {
6461
6464
  children: [jsx(ToggleMenu, {
6462
6465
  buttonTestId: testIdPrefix + "-listOptionsButton",
6463
6466
  menuPosition: "right",
@@ -7261,26 +7264,56 @@ var createBalancedMosaicNode = function createBalancedMosaicNode(currentNode) {
7261
7264
  var leaves = getLeaves(currentNode);
7262
7265
  return createBalancedTreeFromLeaves(leaves);
7263
7266
  };
7264
- var closeTimeSeriesDialogsWhenChangingPreset = function closeTimeSeriesDialogsWhenChangingPreset(componentTypes, dispatch) {
7265
- if (componentTypes) {
7266
- if (componentTypes.length > 0 && !componentTypes.some(function (componentType) {
7267
- return componentType.toLowerCase().includes('viewloading');
7268
- }) && !componentTypes.some(function (componentType) {
7269
- return componentType.toLowerCase().includes('timeseries');
7270
- })) {
7271
- dispatch(uiActions.setToggleOpenDialog({
7272
- setOpen: false,
7273
- type: uiTypes.DialogTypes.TimeSeriesManager
7274
- }));
7275
- dispatch(uiActions.setToggleOpenDialog({
7276
- setOpen: false,
7277
- type: uiTypes.DialogTypes.TimeSeriesSelect
7278
- }));
7279
- dispatch(uiActions.setToggleOpenDialog({
7280
- setOpen: false,
7281
- type: uiTypes.DialogTypes.TimeseriesInfo
7282
- }));
7283
- }
7267
+ var closeDialogsWhenChangingPreset = function closeDialogsWhenChangingPreset(componentTypes, dispatch) {
7268
+ if (!componentTypes || componentTypes.length === 0 || componentTypes.some(function (componentType) {
7269
+ return componentType.toLowerCase().includes('viewloading');
7270
+ })) {
7271
+ return;
7272
+ }
7273
+ // Close all dialogs related to timeseries
7274
+ if (!componentTypes.some(function (componentType) {
7275
+ return componentType.toLowerCase().includes('timeseries');
7276
+ })) {
7277
+ dispatch(uiActions.setToggleOpenDialog({
7278
+ setOpen: false,
7279
+ type: uiTypes.DialogTypes.TimeSeriesManager
7280
+ }));
7281
+ dispatch(uiActions.setToggleOpenDialog({
7282
+ setOpen: false,
7283
+ type: uiTypes.DialogTypes.TimeSeriesSelect
7284
+ }));
7285
+ dispatch(uiActions.setToggleOpenDialog({
7286
+ setOpen: false,
7287
+ type: uiTypes.DialogTypes.TimeSeriesInfo
7288
+ }));
7289
+ dispatch(uiActions.setToggleOpenDialog({
7290
+ setOpen: false,
7291
+ type: uiTypes.DialogTypes.TimeSeriesLocationInfo
7292
+ }));
7293
+ }
7294
+ // Close all dialogs related to soundings
7295
+ if (!componentTypes.some(function (componentType) {
7296
+ return componentType.toLowerCase().includes('soundings');
7297
+ })) {
7298
+ dispatch(uiActions.setToggleOpenDialog({
7299
+ setOpen: false,
7300
+ type: uiTypes.DialogTypes.SoundingsLocations
7301
+ }));
7302
+ dispatch(uiActions.setToggleOpenDialog({
7303
+ setOpen: false,
7304
+ type: uiTypes.DialogTypes.SoundingsSources
7305
+ }));
7306
+ }
7307
+ // Close dialogs related to the warninglist
7308
+ if (!componentTypes.some(function (componentType) {
7309
+ return componentType.toLowerCase().includes('warninglist');
7310
+ }) && !componentTypes.some(function (componentType) {
7311
+ return componentType.toLowerCase().includes('map');
7312
+ })) {
7313
+ dispatch(uiActions.setToggleOpenDialog({
7314
+ setOpen: false,
7315
+ type: uiTypes.DialogTypes.PublicWarnings
7316
+ }));
7284
7317
  }
7285
7318
  };
7286
7319
 
@@ -7840,7 +7873,7 @@ var WorkspaceViewConnect = function WorkspaceViewConnect(_ref) {
7840
7873
  return getComponentTypesFromActiveViews(store);
7841
7874
  });
7842
7875
  React__default.useEffect(function () {
7843
- closeTimeSeriesDialogsWhenChangingPreset(componentTypes, dispatch);
7876
+ closeDialogsWhenChangingPreset(componentTypes, dispatch);
7844
7877
  }, [componentTypes, dispatch]);
7845
7878
  React__default.useEffect(function () {
7846
7879
  window.addEventListener('orientationchange', handleOrientationChange);
@@ -7875,7 +7908,7 @@ var WorkspaceViewConnect = function WorkspaceViewConnect(_ref) {
7875
7908
  * Copyright 2025 - Finnish Meteorological Institute (FMI)
7876
7909
  * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
7877
7910
  * */
7878
- var config = getConfig();
7911
+ var config = sessionStorageProvider.getConfig();
7879
7912
  var presetBaseUrl = (config == null ? void 0 : config.GW_PRESET_BACKEND_URL) || '';
7880
7913
  var getWorkspace = function getWorkspace(workspaceId, auth) {
7881
7914
  return fetch(presetBaseUrl + "/workspacepreset/" + workspaceId, {
@@ -8284,9 +8317,8 @@ var useFetchWorkspacePresets = function useFetchWorkspacePresets() {
8284
8317
  }, [dispatch]);
8285
8318
  useEffect(function () {
8286
8319
  if (workspaceSearchQuery !== prevSearch) {
8287
- workspaceSearchQuery.trim() === '' ? fetchWorkspacePresets({}) : fetchWorkspacePresets({
8288
- search: workspaceSearchQuery
8289
- });
8320
+ var filterParams = constructFilterParams([], workspaceSearchQuery);
8321
+ fetchWorkspacePresets(filterParams);
8290
8322
  }
8291
8323
  }, [fetchWorkspacePresets, prevSearch, workspaceSearchQuery]);
8292
8324
  useEffect(function () {
@@ -8901,7 +8933,6 @@ var WorkspacePresetsFormDialog = function WorkspacePresetsFormDialog(_ref) {
8901
8933
  open: isOpen,
8902
8934
  description: "",
8903
8935
  onClose: onClose,
8904
- onSubmit: onSubmit,
8905
8936
  isResizable: true,
8906
8937
  resizableDefaultSize: {
8907
8938
  width: 500,
@@ -9019,6 +9050,35 @@ var useCreateWorkspacePreset = function useCreateWorkspacePreset() {
9019
9050
  }
9020
9051
  });
9021
9052
  };
9053
+ var useUpdateWorkspacePreset = function useUpdateWorkspacePreset() {
9054
+ var _useAuthenticationCon3 = useAuthenticationContext(),
9055
+ auth = _useAuthenticationCon3.auth;
9056
+ var dispatch = useDispatch();
9057
+ var _useWorkspaceTranslat3 = useWorkspaceTranslation(),
9058
+ t = _useWorkspaceTranslat3.t;
9059
+ return useMutation({
9060
+ mutationFn: function mutationFn(_ref3) {
9061
+ var id = _ref3.id,
9062
+ data = _ref3.data;
9063
+ if (!auth) {
9064
+ throw new Error('Authentication context not found');
9065
+ }
9066
+ return updateWorkspace(id, data, auth);
9067
+ },
9068
+ onSuccess: function onSuccess(data, variables) {
9069
+ var scope = variables.data.scope || 'user';
9070
+ dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
9071
+ workspaceId: variables.id,
9072
+ action: variables.action || WorkspacePresetAction.SAVE,
9073
+ title: variables.data.title,
9074
+ scope: scope
9075
+ }));
9076
+ },
9077
+ onError: function onError(error) {
9078
+ onWorkspaceApiError(dispatch, error, t);
9079
+ }
9080
+ });
9081
+ };
9022
9082
 
9023
9083
  var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
9024
9084
  var workspaceId = _ref.workspaceId,
@@ -9032,6 +9092,8 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
9032
9092
  deleteWorkspace = _useDeleteWorkspacePr.mutate;
9033
9093
  var _useCreateWorkspacePr = useCreateWorkspacePreset(),
9034
9094
  createWorkspace = _useCreateWorkspacePr.mutate;
9095
+ var _useUpdateWorkspacePr = useUpdateWorkspacePreset(),
9096
+ updateWorkspace = _useUpdateWorkspacePr.mutate;
9035
9097
  var title = useSelector(function (store) {
9036
9098
  return getSelectedWorkspaceTitle(store);
9037
9099
  });
@@ -9048,13 +9110,13 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
9048
9110
  while (1) switch (_context.prev = _context.next) {
9049
9111
  case 0:
9050
9112
  _context.t0 = presetAction;
9051
- _context.next = _context.t0 === WorkspacePresetAction.DELETE ? 3 : _context.t0 === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 3 : _context.t0 === WorkspacePresetAction.DUPLICATE ? 5 : 15;
9113
+ _context.next = _context.t0 === WorkspacePresetAction.DELETE ? 3 : _context.t0 === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 3 : _context.t0 === WorkspacePresetAction.DUPLICATE ? 5 : _context.t0 === WorkspacePresetAction.SAVE ? 15 : _context.t0 === WorkspacePresetAction.SAVE_SYSTEM_PRESET ? 15 : 17;
9052
9114
  break;
9053
9115
  case 3:
9054
9116
  deleteWorkspace({
9055
9117
  id: presetId
9056
9118
  });
9057
- return _context.abrupt("break", 16);
9119
+ return _context.abrupt("break", 18);
9058
9120
  case 5:
9059
9121
  if (!presetId) {
9060
9122
  _context.next = 11;
@@ -9074,8 +9136,15 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
9074
9136
  data: Object.assign({}, oldWorkspace, data),
9075
9137
  action: presetAction
9076
9138
  });
9077
- return _context.abrupt("break", 16);
9139
+ return _context.abrupt("break", 18);
9078
9140
  case 15:
9141
+ updateWorkspace({
9142
+ id: presetId,
9143
+ data: data,
9144
+ action: presetAction
9145
+ });
9146
+ return _context.abrupt("break", 18);
9147
+ case 17:
9079
9148
  dispatch(workspaceListActions.submitFormWorkspaceActionDialogOptions({
9080
9149
  presetAction: presetAction,
9081
9150
  presetId: presetId,
@@ -9083,7 +9152,7 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
9083
9152
  emptyMapPresetTitle: t('workspace-mappreset-new'),
9084
9153
  emptyWorkspacePresetTitle: t('workspace-new')
9085
9154
  }));
9086
- case 16:
9155
+ case 18:
9087
9156
  case "end":
9088
9157
  return _context.stop();
9089
9158
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/workspace",
3
- "version": "12.2.0",
3
+ "version": "12.4.1",
4
4
  "description": "GeoWeb Workspace library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -8,31 +8,31 @@
8
8
  "url": "git@gitlab.com:opengeoweb/opengeoweb.git"
9
9
  },
10
10
  "dependencies": {
11
- "react-redux": "^8.1.3",
12
- "@opengeoweb/shared": "12.2.0",
13
- "@opengeoweb/store": "12.2.0",
14
- "@opengeoweb/api": "12.2.0",
11
+ "react-redux": "^9.2.0",
12
+ "@opengeoweb/shared": "12.4.1",
13
+ "@opengeoweb/store": "12.4.1",
14
+ "@opengeoweb/api": "12.4.1",
15
15
  "react-hook-form": "^7.50.1",
16
- "@opengeoweb/theme": "12.2.0",
17
- "@reduxjs/toolkit": "^1.9.7",
18
- "@opengeoweb/snackbar": "12.2.0",
16
+ "@opengeoweb/theme": "12.4.1",
17
+ "@reduxjs/toolkit": "^2.6.1",
18
+ "@opengeoweb/snackbar": "12.4.1",
19
19
  "react-window": "^1.8.10",
20
20
  "lodash": "^4.17.21",
21
21
  "axios": "^1.7.7",
22
22
  "react-virtualized-auto-sizer": "^1.0.21",
23
23
  "react-mosaic-component": "^6.1.0",
24
- "@opengeoweb/form-fields": "12.2.0",
25
- "@opengeoweb/timeseries": "12.2.0",
26
- "@opengeoweb/authentication": "12.2.0",
27
- "@opengeoweb/core": "12.2.0",
28
- "@opengeoweb/taf": "12.2.0",
29
- "@opengeoweb/sigmet-airmet": "12.2.0",
30
- "@opengeoweb/warnings": "12.2.0",
31
- "@opengeoweb/spaceweather": "12.2.0",
32
- "i18next": "^23.11.5",
24
+ "@opengeoweb/form-fields": "12.4.1",
25
+ "@opengeoweb/timeseries": "12.4.1",
26
+ "@opengeoweb/authentication": "12.4.1",
27
+ "@opengeoweb/core": "12.4.1",
28
+ "@opengeoweb/taf": "12.4.1",
29
+ "@opengeoweb/sigmet-airmet": "12.4.1",
30
+ "@opengeoweb/warnings": "12.4.1",
31
+ "@opengeoweb/spaceweather": "12.4.1",
32
+ "i18next": "^25.0.1",
33
33
  "react-i18next": "^15.1.1",
34
- "@mui/material": "^6.1.1",
35
- "@opengeoweb/webmap-react": "12.2.0",
34
+ "@mui/material": "^7.0.1",
35
+ "@opengeoweb/webmap-react": "12.4.1",
36
36
  "@tanstack/react-query": "^5.69.2"
37
37
  },
38
38
  "peerDependencies": {