@opengeoweb/workspace 12.0.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/index.esm.js +471 -242
  2. package/package.json +28 -44
  3. package/src/lib/Workspace.stories.d.ts +10 -19
  4. package/src/lib/WorkspaceAdmin.stories.d.ts +1 -0
  5. package/src/lib/api/workspace-api/api.d.ts +6 -0
  6. package/src/lib/api/workspace-api/fakeApi.d.ts +1 -0
  7. package/src/lib/api/workspace-api/hooks.d.ts +11 -0
  8. package/src/lib/components/Providers/Providers.d.ts +6 -2
  9. package/src/lib/components/ViewPresetMenu/ViewPresetMenu.stories.d.ts +6 -21
  10. package/src/lib/components/ViewPresetMenu/ViewPresetsError.stories.d.ts +1 -0
  11. package/src/lib/components/ViewPresetsFormDialog/ViewPresetsFormDialog.d.ts +1 -1
  12. package/src/lib/components/ViewPresetsFormDialog/ViewPresetsFormDialog.stories.d.ts +11 -22
  13. package/src/lib/components/WorkspaceDetail/WorkspaceDetail.stories.d.ts +1 -0
  14. package/src/lib/components/WorkspaceDetail/WorkspaceDetailError.stories.d.ts +1 -1
  15. package/src/lib/components/WorkspaceMenu/WorkspaceMenu.stories.d.ts +7 -13
  16. package/src/lib/components/WorkspaceMenu/WorkspaceMenuButton.stories.d.ts +7 -23
  17. package/src/lib/components/WorkspaceOptions/WorkspaceOptions.stories.d.ts +10 -39
  18. package/src/lib/components/WorkspacePresetsFormDialog/WorkspacePresetsForm.d.ts +2 -1
  19. package/src/lib/components/WorkspacePresetsFormDialog/WorkspacePresetsFormDialog.stories.d.ts +22 -72
  20. package/src/lib/components/WorkspaceSelectList/WorkspaceSelectListError.stories.d.ts +1 -0
  21. package/src/lib/components/WorkspaceSelectList/WorkspaceSelectListRow.stories.d.ts +8 -19
  22. package/src/lib/components/WorkspaceTopBar/WorkspaceTopBar.stories.d.ts +11 -53
  23. package/src/lib/hooks/useFetchWorkspacePresets.d.ts +1 -0
  24. package/src/lib/store/viewPresets/reducer.d.ts +3 -3
  25. package/src/lib/store/viewPresets/types.d.ts +3 -3
  26. package/src/lib/store/workspace/types.d.ts +6 -2
  27. package/src/lib/store/workspaceList/reducer.d.ts +1 -1
  28. package/src/lib/store/workspaceList/selectors.d.ts +9 -0
  29. package/src/lib/store/workspaceList/types.d.ts +5 -2
  30. package/src/lib/storyUtils/StoryWrapper.d.ts +1 -3
  31. package/src/lib/storyUtils/componentsLookUp.stories.d.ts +22 -49
  32. package/src/lib/utils/api.d.ts +0 -1
  33. package/src/lib/utils/fakeApi.stories.d.ts +1 -0
  34. package/src/lib/utils/utils.d.ts +3 -0
package/index.esm.js CHANGED
@@ -1,26 +1,26 @@
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, mapReducer, serviceReducer, layerReducer, syncGroupsReducer, loadingIndicatorReducer, uiReducer, linkComponentTypesConstants, uiTypes, loadingIndicatorSelectors, uiSelectors } from '@opengeoweb/store';
3
- import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, 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, getConfig, 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, pick, isEmpty, isEqual, isString } from 'lodash';
5
5
  import { getLeaves, MosaicContext, getAndAssertNodeAtPathExists, createBalancedTreeFromLeaves, MosaicWindow, Mosaic } from 'react-mosaic-component';
6
6
  import { timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer } from '@opengeoweb/timeseries';
7
7
  import { publicWarningActions, WARN_NAMESPACE, warningsTranslations, publicWarningsSelectors } from '@opengeoweb/warnings';
8
- import { PROJECTION, getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, SHARED_NAMESPACE, sharedTranslations, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, AlertBanner, PresetScope, CustomTooltip, SearchHighlight, ToggleMenu, DEFAULT_FILTER_HEIGHT, Filter, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, usePrevious, ConfirmationButtons } from '@opengeoweb/shared';
8
+ import { PresetScope, PROJECTION, getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, SHARED_NAMESPACE, sharedTranslations, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, AlertBanner, CustomTooltip, SearchHighlight, ToggleMenu, DEFAULT_FILTER_HEIGHT, Filter, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, usePrevious, 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';
12
- import { ThemeWrapper, lightTheme, Link, LinkOff, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, Delete, Preset, PresetWorkspace, PresetTiles, CloudLoading, CloudIdle, WebAssetOff, Exclamation } from '@opengeoweb/theme';
12
+ import { ThemeWrapper, lightTheme, Link, LinkOff, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, SharedPresetsMyUser, SharedPresetsOtherUsers, Delete, Preset, PresetWorkspace, PresetTiles, CloudLoading, CloudIdle, WebAssetOff, Exclamation } from '@opengeoweb/theme';
13
13
  import { Provider, useDispatch, useSelector, useStore, shallowEqual } from 'react-redux';
14
14
  import { initReactI18next, useTranslation, I18nextProvider } from 'react-i18next';
15
15
  import { AuthenticationProvider, useAuthenticationContext, GEOWEB_ROLE_PRESETS_ADMIN } from '@opengeoweb/authentication';
16
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
16
+ import { QueryClient, QueryClientProvider, useMutation } from '@tanstack/react-query';
17
17
  import i18n from 'i18next';
18
18
  import { WEBMAP_REACT_NAMESPACE, webmapReactTranslations } from '@opengeoweb/webmap-react';
19
19
  import { CORE_NAMESPACE, coreTranslations } from '@opengeoweb/core';
20
20
  import { FORM_FIELDS_NAMESPACE, formFieldsTranslations, ReactHookFormTextField, ReactHookFormHiddenInput, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
21
21
  import * as React from 'react';
22
- import React__default, { useCallback } from 'react';
23
- import { Menu, Typography, List, ListItem, ListItemButton, ListItemIcon, Checkbox, ListItemText, LinearProgress, Grid2, Box, ListSubheader, MenuItem, useTheme, FormGroup, FormControlLabel, Tabs } from '@mui/material';
22
+ import React__default, { useCallback, useEffect } from 'react';
23
+ import { Menu, Typography, List, ListItem, ListItemButton, ListItemIcon, Checkbox, ListItemText, LinearProgress, styled, Grid2, Box, ListSubheader, MenuItem, useTheme, 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';
@@ -731,9 +731,6 @@ var getApiRoutes$1 = function getApiRoutes(axiosInstance) {
731
731
  return getIdFromUrl(headerLocation);
732
732
  });
733
733
  },
734
- deleteWorkspacePreset: function deleteWorkspacePreset(workspacePresetId) {
735
- return axiosInstance["delete"]("/workspacepreset/" + workspacePresetId);
736
- },
737
734
  // view presets
738
735
  getViewPresets: function getViewPresets(params) {
739
736
  return axiosInstance.get('/viewpreset', {
@@ -908,6 +905,40 @@ var WorkspaceErrorType;
908
905
  WorkspaceErrorType["SAVE"] = "SAVE";
909
906
  })(WorkspaceErrorType || (WorkspaceErrorType = {}));
910
907
 
908
+ /* *
909
+ * Licensed under the Apache License, Version 2.0 (the "License");
910
+ * you may not use this file except in compliance with the License.
911
+ * You may obtain a copy of the License at
912
+ *
913
+ * http://www.apache.org/licenses/LICENSE-2.0
914
+ *
915
+ * Unless required by applicable law or agreed to in writing, software
916
+ * distributed under the License is distributed on an "AS IS" BASIS,
917
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
918
+ * See the License for the specific language governing permissions and
919
+ * limitations under the License.
920
+ *
921
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
922
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
923
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
924
+ * */
925
+ var WorkspaceListErrorCategory;
926
+ (function (WorkspaceListErrorCategory) {
927
+ WorkspaceListErrorCategory["AUTH"] = "AUTH";
928
+ WorkspaceListErrorCategory["GENERIC"] = "GENERIC";
929
+ })(WorkspaceListErrorCategory || (WorkspaceListErrorCategory = {}));
930
+ var WorkspaceListErrorType;
931
+ (function (WorkspaceListErrorType) {
932
+ WorkspaceListErrorType["TRANSLATABLE_ERROR"] = "TRANSLATABLE_ERROR";
933
+ WorkspaceListErrorType["VERBATIM_ERROR"] = "VERBATIM_ERROR";
934
+ })(WorkspaceListErrorType || (WorkspaceListErrorType = {}));
935
+ var PresetFilterType;
936
+ (function (PresetFilterType) {
937
+ PresetFilterType["personal"] = "personal";
938
+ PresetFilterType["shared"] = "shared";
939
+ PresetFilterType["system"] = "system";
940
+ })(PresetFilterType || (PresetFilterType = {}));
941
+
911
942
  /* *
912
943
  * Licensed under the Apache License, Version 2.0 (the "License");
913
944
  * you may not use this file except in compliance with the License.
@@ -927,14 +958,17 @@ var WorkspaceErrorType;
927
958
  * */
928
959
  var workspaceListFilterOptions = [{
929
960
  label: 'shared-filter-my-presets',
930
- id: 'user',
931
- type: 'scope',
961
+ id: PresetFilterType.personal,
932
962
  isSelected: true,
933
963
  isDisabled: false
934
964
  }, {
935
965
  label: 'shared-filter-system-presets',
936
- id: 'system',
937
- type: 'scope',
966
+ id: PresetFilterType.system,
967
+ isSelected: true,
968
+ isDisabled: false
969
+ }, {
970
+ label: 'shared-filter-shared-presets',
971
+ id: PresetFilterType.shared,
938
972
  isSelected: true,
939
973
  isDisabled: false
940
974
  }];
@@ -1110,16 +1144,21 @@ var PresetAction;
1110
1144
  * */
1111
1145
  var viewPresetsListFilterOptions = [{
1112
1146
  label: 'shared-filter-my-presets',
1113
- id: 'user',
1147
+ id: PresetScope.user,
1114
1148
  type: 'scope',
1115
1149
  isSelected: true,
1116
1150
  isDisabled: false
1117
1151
  }, {
1118
1152
  label: 'shared-filter-system-presets',
1119
- id: 'system',
1153
+ id: PresetScope.system,
1120
1154
  type: 'scope',
1121
1155
  isSelected: true,
1122
1156
  isDisabled: false
1157
+ }, {
1158
+ label: 'shared-filter-shared-presets',
1159
+ id: PresetScope.shared,
1160
+ isSelected: true,
1161
+ isDisabled: true
1123
1162
  }];
1124
1163
  var viewPresetsAdapter = createEntityAdapter({
1125
1164
  // we use panelId as id (panelId can be mapId or viewId)
@@ -1508,6 +1547,29 @@ var setDocumentTitle = function setDocumentTitle(workspaceTitle, appTitle) {
1508
1547
  var fallbackAppTitle = appTitle || 'GeoWeb';
1509
1548
  document.title = workspaceTitle ? workspaceTitle + " - " + fallbackAppTitle : fallbackAppTitle;
1510
1549
  };
1550
+ var filterWorkspacePresets = function filterWorkspacePresets(workspacePresets, selectedFilters, username) {
1551
+ var isAllSelected = selectedFilters.every(function (filter) {
1552
+ return filter.isSelected;
1553
+ });
1554
+ if (isAllSelected) {
1555
+ return workspacePresets;
1556
+ }
1557
+ var selectedIds = selectedFilters.filter(function (filter) {
1558
+ return filter.isSelected;
1559
+ }).map(function (filter) {
1560
+ return filter.id;
1561
+ });
1562
+ return workspacePresets.filter(function (preset) {
1563
+ return (
1564
+ // System
1565
+ selectedIds.includes('system') && preset.scope === 'system' ||
1566
+ // Personal
1567
+ selectedIds.includes('personal') && preset.username === username ||
1568
+ // Shared
1569
+ selectedIds.includes('shared') && preset.username !== username && preset.is_shared
1570
+ );
1571
+ });
1572
+ };
1511
1573
 
1512
1574
  /* *
1513
1575
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1667,7 +1729,7 @@ var createCustomEmptyMapWorkspace = function createCustomEmptyMapWorkspace(empty
1667
1729
  var constructFilterParams = function constructFilterParams(filters, searchQuery) {
1668
1730
  // get filters
1669
1731
  var _filters$reduce = filters.reduce(function (filterList, filter) {
1670
- if (filter.isSelected && filter.type === 'scope') {
1732
+ if (filter.isSelected && 'type' in filter && filter.type === 'scope') {
1671
1733
  return Object.assign({}, filter, {
1672
1734
  scope: filterList.scope.concat(filter.id)
1673
1735
  });
@@ -4519,17 +4581,13 @@ var filterWorkspacePresetList = function filterWorkspacePresetList(params) {
4519
4581
  return workspacePresetsList;
4520
4582
  }
4521
4583
  return workspacePresetsList.reduce(function (list, workspacePresetRaw) {
4522
- var _params$scope;
4523
4584
  var workspacePreset = workspacePresetRaw;
4524
- if (params != null && (_params$scope = params.scope) != null && _params$scope.includes(workspacePreset.scope)) {
4525
- if (params.search) {
4526
- var searchQuery = getCleanSearchQuery(params.search);
4527
- var hasResult = searchQuery.split(',').every(function (query) {
4528
- return workspacePreset.title.toLowerCase().includes(query.toLowerCase()) || workspacePreset["abstract"].toLowerCase().includes(query.toLowerCase());
4529
- });
4530
- return hasResult ? list.concat(workspacePreset) : list;
4531
- }
4532
- return list.concat(workspacePreset);
4585
+ if (params.search) {
4586
+ var searchQuery = getCleanSearchQuery(params.search);
4587
+ var hasResult = searchQuery.split(',').every(function (query) {
4588
+ return workspacePreset.title.toLowerCase().includes(query.toLowerCase()) || workspacePreset["abstract"].toLowerCase().includes(query.toLowerCase());
4589
+ });
4590
+ return hasResult ? list.concat(workspacePreset) : list;
4533
4591
  }
4534
4592
  return list;
4535
4593
  }, []);
@@ -4539,9 +4597,9 @@ var filterViewPresetList = function filterViewPresetList(params) {
4539
4597
  return viewPresetsList;
4540
4598
  }
4541
4599
  return viewPresetsList.reduce(function (list, viewPresetRaw) {
4542
- var _params$scope2;
4600
+ var _params$scope;
4543
4601
  var workspacePreset = viewPresetRaw;
4544
- if (params != null && (_params$scope2 = params.scope) != null && _params$scope2.includes(workspacePreset.scope)) {
4602
+ if (params != null && (_params$scope = params.scope) != null && _params$scope.includes(workspacePreset.scope)) {
4545
4603
  return list.concat(workspacePreset);
4546
4604
  }
4547
4605
  return list;
@@ -4590,11 +4648,6 @@ var getApiRoutes = function getApiRoutes(axiosInstance) {
4590
4648
  return null;
4591
4649
  });
4592
4650
  },
4593
- deleteWorkspacePreset: function deleteWorkspacePreset(workspacePresetId) {
4594
- // eslint-disable-next-line no-console
4595
- console.log('api: delete workspace preset', workspacePresetId);
4596
- return axiosInstance["delete"]("/workspacepreset/" + workspacePresetId);
4597
- },
4598
4651
  // view presets
4599
4652
  getViewPresets: function getViewPresets(params) {
4600
4653
  return axiosInstance.get('/viewpreset', {
@@ -5073,34 +5126,6 @@ workspaceListener.startListening({
5073
5126
  }()
5074
5127
  });
5075
5128
 
5076
- /* *
5077
- * Licensed under the Apache License, Version 2.0 (the "License");
5078
- * you may not use this file except in compliance with the License.
5079
- * You may obtain a copy of the License at
5080
- *
5081
- * http://www.apache.org/licenses/LICENSE-2.0
5082
- *
5083
- * Unless required by applicable law or agreed to in writing, software
5084
- * distributed under the License is distributed on an "AS IS" BASIS,
5085
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5086
- * See the License for the specific language governing permissions and
5087
- * limitations under the License.
5088
- *
5089
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5090
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
5091
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
5092
- * */
5093
- var WorkspaceListErrorCategory;
5094
- (function (WorkspaceListErrorCategory) {
5095
- WorkspaceListErrorCategory["AUTH"] = "AUTH";
5096
- WorkspaceListErrorCategory["GENERIC"] = "GENERIC";
5097
- })(WorkspaceListErrorCategory || (WorkspaceListErrorCategory = {}));
5098
- var WorkspaceListErrorType;
5099
- (function (WorkspaceListErrorType) {
5100
- WorkspaceListErrorType["TRANSLATABLE_ERROR"] = "TRANSLATABLE_ERROR";
5101
- WorkspaceListErrorType["VERBATIM_ERROR"] = "VERBATIM_ERROR";
5102
- })(WorkspaceListErrorType || (WorkspaceListErrorType = {}));
5103
-
5104
5129
  /* *
5105
5130
  * Licensed under the Apache License, Version 2.0 (the "License");
5106
5131
  * you may not use this file except in compliance with the License.
@@ -5119,7 +5144,7 @@ var WorkspaceListErrorType;
5119
5144
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
5120
5145
  * */
5121
5146
  var getWorkspaceListStore = function getWorkspaceListStore(store) {
5122
- if (store && store.workspaceList) {
5147
+ if (store != null && store.workspaceList) {
5123
5148
  return store.workspaceList;
5124
5149
  }
5125
5150
  return null;
@@ -5148,6 +5173,10 @@ var getWorkspaceListError = createSelector(getWorkspaceListStore, function (stor
5148
5173
  }, function (state) {
5149
5174
  return (state == null ? void 0 : state.error) || undefined;
5150
5175
  }, selectorMemoizationOptions);
5176
+ var getWorkspaceActionFormValues = createSelector(getWorkspaceListStore, function (store) {
5177
+ var _store$workspaceActio;
5178
+ return ((_store$workspaceActio = store.workspaceActionDialog) == null ? void 0 : _store$workspaceActio.formValues) || {};
5179
+ }, selectorMemoizationOptions);
5151
5180
  var getWorkspaceActionDialogDetails = createSelector(getWorkspaceListStore, getWorkspaceState, getViewPresetsStore, function (workspaceListState, workspaceState, viewpresetState) {
5152
5181
  var dialog = (workspaceListState == null ? void 0 : workspaceListState.workspaceActionDialog) || false;
5153
5182
  if (dialog) {
@@ -5532,16 +5561,18 @@ workspaceListListener.startListening({
5532
5561
  actionCreator: workspaceListActions.onSuccessWorkspacePresetAction,
5533
5562
  effect: function () {
5534
5563
  var _effect2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2, listenerApi) {
5535
- var payload, action, workspaceId, title, workspaceFilters, searchQuery;
5564
+ var _listenerApi$getOrigi;
5565
+ var payload, currentWorkspaceId, action, workspaceId, title, workspaceFilters, searchQuery;
5536
5566
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5537
5567
  while (1) switch (_context2.prev = _context2.next) {
5538
5568
  case 0:
5539
5569
  payload = _ref2.payload;
5540
5570
  listenerApi.cancelActiveListeners();
5571
+ currentWorkspaceId = (_listenerApi$getOrigi = listenerApi.getOriginalState().workspace) == null ? void 0 : _listenerApi$getOrigi.id;
5541
5572
  action = payload.action, workspaceId = payload.workspaceId, title = payload.title;
5542
5573
  listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage$1(action, title)));
5543
5574
  // if active workspace has been deleted, empty out url
5544
- if ((action === WorkspacePresetAction.DELETE || action === WorkspacePresetAction.DELETE_SYSTEM_PRESET) && payload.currentActiveWorkspaceId && workspaceId === payload.currentActiveWorkspaceId) {
5575
+ if ((action === WorkspacePresetAction.DELETE || action === WorkspacePresetAction.DELETE_SYSTEM_PRESET) && currentWorkspaceId && workspaceId === currentWorkspaceId) {
5545
5576
  listenerApi.dispatch(routerActions.navigateToUrl({
5546
5577
  url: getWorkspaceRouteUrl()
5547
5578
  }));
@@ -5556,7 +5587,7 @@ workspaceListListener.startListening({
5556
5587
  workspaceFilters = getWorkspaceListFilters(listenerApi.getState());
5557
5588
  searchQuery = getWorkspaceListSearchQuery(listenerApi.getState());
5558
5589
  listenerApi.dispatch(workspaceListActions.fetchWorkspaceList(constructFilterParams(workspaceFilters, searchQuery)));
5559
- case 9:
5590
+ case 10:
5560
5591
  case "end":
5561
5592
  return _context2.stop();
5562
5593
  }
@@ -5572,7 +5603,7 @@ workspaceListListener.startListening({
5572
5603
  actionCreator: workspaceListActions.submitFormWorkspaceActionDialogOptions,
5573
5604
  effect: function () {
5574
5605
  var _effect3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref3, listenerApi) {
5575
- var payload, workspaceApi, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, isNewWorkspace, _ref4, presetToDuplicate, fullPreset, newId, selectedWorkspace, _yield$workspaceApi$g2, originalData, workspaceDataNewTitle, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, viewPresetResults, hasError, workspaceData, newWorkspace, message, category;
5606
+ var payload, workspaceApi, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, _yield$workspaceApi$g2, originalData, workspaceDataNewTitle, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, viewPresetResults, hasError, workspaceData, newWorkspace, message, category;
5576
5607
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
5577
5608
  while (1) switch (_context4.prev = _context4.next) {
5578
5609
  case 0:
@@ -5582,73 +5613,26 @@ workspaceListListener.startListening({
5582
5613
  _context4.prev = 3;
5583
5614
  presetId = payload.presetId, presetAction = payload.presetAction, data = payload.data, emptyMapPresetTitle = payload.emptyMapPresetTitle, emptyWorkspacePresetTitle = payload.emptyWorkspacePresetTitle;
5584
5615
  scope = data.scope || 'user'; // duplicate
5585
- if (!(presetAction === WorkspacePresetAction.DUPLICATE)) {
5586
- _context4.next = 22;
5587
- break;
5588
- }
5589
- isNewWorkspace = presetId === getEmptyMapWorkspace().id;
5590
- if (!isNewWorkspace) {
5591
- _context4.next = 12;
5592
- break;
5593
- }
5594
- _context4.t0 = {
5595
- data: emptyWorkspaceBEData
5596
- };
5597
- _context4.next = 15;
5598
- break;
5599
- case 12:
5600
- _context4.next = 14;
5601
- return workspaceApi.getWorkspacePreset(presetId);
5602
- case 14:
5603
- _context4.t0 = _context4.sent;
5604
- case 15:
5605
- _ref4 = _context4.t0;
5606
- presetToDuplicate = _ref4.data;
5607
- fullPreset = Object.assign({}, presetToDuplicate, data);
5608
- _context4.next = 20;
5609
- return workspaceApi.saveWorkspacePresetAs(fullPreset);
5610
- case 20:
5611
- newId = _context4.sent;
5612
- listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
5613
- workspaceId: newId,
5614
- action: presetAction,
5615
- title: data.title,
5616
- scope: scope
5617
- }));
5618
- case 22:
5619
- if (!(presetAction === WorkspacePresetAction.DELETE || presetAction === WorkspacePresetAction.DELETE_SYSTEM_PRESET)) {
5620
- _context4.next = 27;
5621
- break;
5622
- }
5623
- _context4.next = 25;
5624
- return workspaceApi.deleteWorkspacePreset(presetId);
5625
- case 25:
5626
- selectedWorkspace = getWorkspaceState(listenerApi.getState());
5627
- listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
5628
- workspaceId: presetId,
5629
- action: presetAction,
5630
- title: data.title,
5631
- currentActiveWorkspaceId: selectedWorkspace.id,
5632
- scope: scope,
5633
- emptyWorkspacePresetTitle: emptyWorkspacePresetTitle
5634
- }));
5635
- case 27:
5616
+ if (presetAction === WorkspacePresetAction.DUPLICATE) ;
5617
+ // delete
5618
+ if (presetAction === WorkspacePresetAction.DELETE || presetAction === WorkspacePresetAction.DELETE_SYSTEM_PRESET) ;
5619
+ // edit
5636
5620
  if (!(presetAction === WorkspacePresetAction.EDIT)) {
5637
- _context4.next = 36;
5621
+ _context4.next = 17;
5638
5622
  break;
5639
5623
  }
5640
- _context4.next = 30;
5624
+ _context4.next = 11;
5641
5625
  return workspaceApi.getWorkspacePreset(presetId);
5642
- case 30:
5626
+ case 11:
5643
5627
  _yield$workspaceApi$g2 = _context4.sent;
5644
5628
  originalData = _yield$workspaceApi$g2.data;
5645
5629
  workspaceDataNewTitle = Object.assign({}, originalData, {
5646
5630
  title: data.title,
5647
5631
  "abstract": data["abstract"]
5648
5632
  });
5649
- _context4.next = 35;
5633
+ _context4.next = 16;
5650
5634
  return workspaceApi.saveWorkspacePreset(presetId, workspaceDataNewTitle);
5651
- case 35:
5635
+ case 16:
5652
5636
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
5653
5637
  workspaceId: presetId,
5654
5638
  action: presetAction,
@@ -5656,39 +5640,39 @@ workspaceListListener.startListening({
5656
5640
  "abstract": data["abstract"],
5657
5641
  scope: scope
5658
5642
  }));
5659
- case 36:
5643
+ case 17:
5660
5644
  // save (as) user/system presets
5661
5645
  isSaveWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET || presetAction === WorkspacePresetAction.SAVE;
5662
5646
  isSaveAsWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || presetAction === WorkspacePresetAction.SAVE_AS;
5663
5647
  if (!(isSaveWorkspaceAction || isSaveAsWorkspaceAction)) {
5664
- _context4.next = 62;
5648
+ _context4.next = 43;
5665
5649
  break;
5666
5650
  }
5667
5651
  hasWorkspaceAlreadyBeenSaved = getWorkspaceDialogIsSaved(listenerApi.getState());
5668
5652
  workspaceId = presetId;
5669
5653
  if (!(!hasWorkspaceAlreadyBeenSaved && isSaveAsWorkspaceAction)) {
5670
- _context4.next = 45;
5654
+ _context4.next = 26;
5671
5655
  break;
5672
5656
  }
5673
- _context4.next = 44;
5657
+ _context4.next = 25;
5674
5658
  return workspaceApi.saveWorkspacePresetAs(data);
5675
- case 44:
5659
+ case 25:
5676
5660
  workspaceId = _context4.sent;
5677
- case 45:
5661
+ case 26:
5678
5662
  if (!isSaveWorkspaceAction) {
5679
- _context4.next = 48;
5663
+ _context4.next = 29;
5680
5664
  break;
5681
5665
  }
5682
- _context4.next = 48;
5666
+ _context4.next = 29;
5683
5667
  return workspaceApi.saveWorkspacePreset(workspaceId, data);
5684
- case 48:
5668
+ case 29:
5685
5669
  // lock the workspace
5686
5670
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspaceSaveDialog({
5687
5671
  presetId: workspaceId
5688
5672
  }));
5689
- _context4.next = 51;
5673
+ _context4.next = 32;
5690
5674
  return Promise.all(data.views.map( /*#__PURE__*/function () {
5691
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(view) {
5675
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(view) {
5692
5676
  var viewPresetEntity, shouldUpdateView, canUpdateView, _payload, _payload2;
5693
5677
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5694
5678
  while (1) switch (_context3.prev = _context3.next) {
@@ -5737,16 +5721,16 @@ workspaceListListener.startListening({
5737
5721
  }, _callee3);
5738
5722
  }));
5739
5723
  return function (_x7) {
5740
- return _ref5.apply(this, arguments);
5724
+ return _ref4.apply(this, arguments);
5741
5725
  };
5742
5726
  }()));
5743
- case 51:
5727
+ case 32:
5744
5728
  viewPresetResults = _context4.sent;
5745
5729
  hasError = viewPresetResults.find(function (view) {
5746
5730
  return view.message;
5747
5731
  });
5748
5732
  if (!hasError) {
5749
- _context4.next = 56;
5733
+ _context4.next = 37;
5750
5734
  break;
5751
5735
  }
5752
5736
  // maybe we can use another action, but this resets fetching of the form
@@ -5754,7 +5738,7 @@ workspaceListListener.startListening({
5754
5738
  error: undefined
5755
5739
  }));
5756
5740
  return _context4.abrupt("return");
5757
- case 56:
5741
+ case 37:
5758
5742
  workspaceData = getWorkspaceData(listenerApi.getState());
5759
5743
  newWorkspace = Object.assign({}, workspaceData, {
5760
5744
  id: workspaceId,
@@ -5762,9 +5746,9 @@ workspaceListListener.startListening({
5762
5746
  "abstract": data["abstract"],
5763
5747
  scope: scope
5764
5748
  });
5765
- _context4.next = 60;
5749
+ _context4.next = 41;
5766
5750
  return workspaceApi.saveWorkspacePreset(workspaceId, newWorkspace);
5767
- case 60:
5751
+ case 41:
5768
5752
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
5769
5753
  action: presetAction,
5770
5754
  workspaceId: workspaceId,
@@ -5775,7 +5759,7 @@ workspaceListListener.startListening({
5775
5759
  listenerApi.dispatch(routerActions.navigateToUrl({
5776
5760
  url: getWorkspaceRouteUrl(workspaceId)
5777
5761
  }));
5778
- case 62:
5762
+ case 43:
5779
5763
  // Reset
5780
5764
  if (presetAction === WorkspacePresetAction.RESET) {
5781
5765
  // In case we're resetting the `New workspace` preset
@@ -5798,13 +5782,13 @@ workspaceListListener.startListening({
5798
5782
  scope: scope
5799
5783
  }));
5800
5784
  }
5801
- _context4.next = 70;
5785
+ _context4.next = 51;
5802
5786
  break;
5803
- case 65:
5804
- _context4.prev = 65;
5805
- _context4.t1 = _context4["catch"](3);
5806
- message = isAxiosError$1(_context4.t1) ? getAxiosErrorMessage(_context4.t1) : _context4.t1.message;
5807
- category = isAxiosAuthError(_context4.t1) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
5787
+ case 46:
5788
+ _context4.prev = 46;
5789
+ _context4.t0 = _context4["catch"](3);
5790
+ message = isAxiosError$1(_context4.t0) ? getAxiosErrorMessage(_context4.t0) : _context4.t0.message;
5791
+ category = isAxiosAuthError(_context4.t0) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
5808
5792
  listenerApi.dispatch(workspaceListActions.onErrorWorkspacePresetAction({
5809
5793
  error: {
5810
5794
  type: WorkspaceListErrorType.VERBATIM_ERROR,
@@ -5812,11 +5796,11 @@ workspaceListListener.startListening({
5812
5796
  message: message
5813
5797
  }
5814
5798
  }));
5815
- case 70:
5799
+ case 51:
5816
5800
  case "end":
5817
5801
  return _context4.stop();
5818
5802
  }
5819
- }, _callee4, null, [[3, 65]]);
5803
+ }, _callee4, null, [[3, 46]]);
5820
5804
  }));
5821
5805
  function effect(_x5, _x6) {
5822
5806
  return _effect3.apply(this, arguments);
@@ -6031,32 +6015,27 @@ var defaultAuthConfig = {
6031
6015
  },
6032
6016
  sessionStorageProvider: null
6033
6017
  };
6034
- var WorkspaceWrapperProviderWithStore = function WorkspaceWrapperProviderWithStore(_ref3) {
6018
+ // wrapper without theme and i18n
6019
+ var WorkspaceStoreWrapper = function WorkspaceStoreWrapper(_ref3) {
6035
6020
  var children = _ref3.children,
6036
6021
  _ref3$store = _ref3.store,
6037
6022
  store = _ref3$store === void 0 ? createMockStore() : _ref3$store,
6038
6023
  _ref3$createApi = _ref3.createApi,
6039
6024
  createApi$1 = _ref3$createApi === void 0 ? createApi : _ref3$createApi,
6040
- theme = _ref3.theme,
6041
6025
  _ref3$auth = _ref3.auth,
6042
6026
  auth = _ref3$auth === void 0 ? defaultAuthConfig : _ref3$auth;
6043
- return jsx(WorkspaceI18nProvider, {
6044
- children: jsx(AuthenticationProvider, {
6045
- value: auth,
6046
- children: jsx(QueryClientProvider, {
6047
- client: queryClient,
6048
- children: jsx(ApiProvider, {
6049
- createApi: createApi$1,
6050
- name: API_NAME,
6051
- children: jsx(Provider, {
6052
- store: store,
6053
- children: jsx(WorkspaceThemeProvider, {
6054
- theme: theme,
6055
- children: jsx(SnackbarWrapperConnect, {
6056
- children: jsx(ConfirmationServiceProvider, {
6057
- children: children
6058
- })
6059
- })
6027
+ return jsx(AuthenticationProvider, {
6028
+ value: auth,
6029
+ children: jsx(QueryClientProvider, {
6030
+ client: queryClient,
6031
+ children: jsx(ApiProvider, {
6032
+ createApi: createApi$1,
6033
+ name: API_NAME,
6034
+ children: jsx(Provider, {
6035
+ store: store,
6036
+ children: jsx(SnackbarWrapperConnect, {
6037
+ children: jsx(ConfirmationServiceProvider, {
6038
+ children: children
6060
6039
  })
6061
6040
  })
6062
6041
  })
@@ -6064,8 +6043,29 @@ var WorkspaceWrapperProviderWithStore = function WorkspaceWrapperProviderWithSto
6064
6043
  })
6065
6044
  });
6066
6045
  };
6067
- var WorkspaceI18nProvider = function WorkspaceI18nProvider(_ref4) {
6068
- var children = _ref4.children;
6046
+ var WorkspaceWrapperProviderWithStore = function WorkspaceWrapperProviderWithStore(_ref4) {
6047
+ var children = _ref4.children,
6048
+ _ref4$store = _ref4.store,
6049
+ store = _ref4$store === void 0 ? createMockStore() : _ref4$store,
6050
+ _ref4$createApi = _ref4.createApi,
6051
+ createApi$1 = _ref4$createApi === void 0 ? createApi : _ref4$createApi,
6052
+ theme = _ref4.theme,
6053
+ _ref4$auth = _ref4.auth,
6054
+ auth = _ref4$auth === void 0 ? defaultAuthConfig : _ref4$auth;
6055
+ return jsx(WorkspaceThemeProvider, {
6056
+ theme: theme,
6057
+ children: jsx(WorkspaceI18nProvider, {
6058
+ children: jsx(WorkspaceStoreWrapper, {
6059
+ store: store,
6060
+ createApi: createApi$1,
6061
+ auth: auth,
6062
+ children: children
6063
+ })
6064
+ })
6065
+ });
6066
+ };
6067
+ var WorkspaceI18nProvider = function WorkspaceI18nProvider(_ref5) {
6068
+ var children = _ref5.children;
6069
6069
  initWorkspaceTestI18n();
6070
6070
  return jsx(I18nextProvider, {
6071
6071
  i18n: i18n,
@@ -6485,6 +6485,12 @@ var getPresetIcon = function getPresetIcon(preset) {
6485
6485
  });
6486
6486
  }
6487
6487
  };
6488
+ var ShareIcon = styled(ListItemIcon)(function () {
6489
+ return {
6490
+ minWidth: '32px !important',
6491
+ paddingTop: '3px'
6492
+ };
6493
+ });
6488
6494
  var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6489
6495
  var workspacePreset = _ref.workspacePreset,
6490
6496
  isSelected = _ref.isSelected,
@@ -6500,34 +6506,40 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6500
6506
  searchQuery = _ref$searchQuery === void 0 ? '' : _ref$searchQuery,
6501
6507
  _ref$testIdPrefix = _ref.testIdPrefix,
6502
6508
  testIdPrefix = _ref$testIdPrefix === void 0 ? 'workspace' : _ref$testIdPrefix;
6509
+ var _useAuthenticationCon = useAuthenticationContext(),
6510
+ auth = _useAuthenticationCon.auth;
6503
6511
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
6504
6512
  t = _useWorkspaceTranslat.t;
6505
- var onDuplicate = function onDuplicate() {
6506
- onClickWorkspacePresetOption(workspacePreset.id, WorkspacePresetAction.DUPLICATE, workspacePreset);
6507
- };
6508
- var onEdit = function onEdit() {
6509
- onClickWorkspacePresetOption(workspacePreset.id, WorkspacePresetAction.EDIT, workspacePreset);
6510
- };
6511
- var onShare = function onShare() {
6512
- onClickWorkspacePresetOption(workspacePreset.id, WorkspacePresetAction.SHARE, workspacePreset);
6513
+ var shareIcon = React__default.useMemo(function () {
6514
+ if (workspacePreset.is_shared) {
6515
+ if (workspacePreset.username === (auth == null ? void 0 : auth.username)) {
6516
+ return jsx(SharedPresetsMyUser, {});
6517
+ }
6518
+ return jsx(SharedPresetsOtherUsers, {});
6519
+ }
6520
+ return null;
6521
+ }, [workspacePreset.is_shared, workspacePreset.username, auth == null ? void 0 : auth.username]);
6522
+ var _onClick = function onClick(action) {
6523
+ return onClickWorkspacePresetOption(workspacePreset.id, action, workspacePreset);
6513
6524
  };
6514
6525
  var menuItems = [{
6515
6526
  text: t('workspace-duplicate'),
6516
- action: onDuplicate
6527
+ action: function action() {
6528
+ return _onClick(WorkspacePresetAction.DUPLICATE);
6529
+ }
6517
6530
  }];
6518
6531
  (workspacePreset.scope === PresetScope.user || isAdmin) && menuItems.push({
6519
6532
  text: t('workspace-edit'),
6520
- action: onEdit
6521
- });
6522
- workspacePreset.scope === PresetScope.user && menuItems.push({
6523
- text: t('workspace-share'),
6524
- action: onShare,
6525
- isDisabled: true
6533
+ action: function action() {
6534
+ return _onClick(WorkspacePresetAction.EDIT);
6535
+ }
6526
6536
  });
6527
- workspacePreset.scope === PresetScope.shared && menuItems.push({
6528
- text: t('workspace-stop-share'),
6529
- action: onShare,
6530
- isDisabled: true
6537
+ workspacePreset.scope === PresetScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username && menuItems.push({
6538
+ text: workspacePreset.is_shared ? t('workspace-stop-share') : t('workspace-share'),
6539
+ action: function action() {
6540
+ return _onClick(WorkspacePresetAction.SHARE);
6541
+ },
6542
+ isDisabled: false
6531
6543
  });
6532
6544
  return jsx(ListItem, {
6533
6545
  disablePadding: true,
@@ -6565,6 +6577,8 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6565
6577
  "aria-label": testIdPrefix,
6566
6578
  children: [jsx(ListItemIcon, {
6567
6579
  children: getPresetIcon(workspacePreset)
6580
+ }), shareIcon && jsx(ShareIcon, {
6581
+ children: shareIcon
6568
6582
  }), jsx(CustomTooltip, {
6569
6583
  title: workspacePreset.title,
6570
6584
  children: jsx(ListItemText, {
@@ -6596,7 +6610,7 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6596
6610
  tooltipTitle: t('workspace-delete-tooltip'),
6597
6611
  onClick: function onClick(event) {
6598
6612
  event.stopPropagation();
6599
- onClickWorkspacePresetOption(workspacePreset.id, isAdmin ? WorkspacePresetAction.DELETE_SYSTEM_PRESET : WorkspacePresetAction.DELETE, workspacePreset);
6613
+ _onClick(isAdmin ? WorkspacePresetAction.DELETE_SYSTEM_PRESET : WorkspacePresetAction.DELETE);
6600
6614
  },
6601
6615
  variant: "tool",
6602
6616
  sx: {
@@ -7671,17 +7685,69 @@ var WorkspaceViewConnect = function WorkspaceViewConnect(_ref) {
7671
7685
  });
7672
7686
  };
7673
7687
 
7688
+ /* *
7689
+ * Licensed under the Apache License, Version 2.0 (the "License");
7690
+ * you may not use this file except in compliance with the License.
7691
+ * You may obtain a copy of the License at
7692
+ *
7693
+ * http://www.apache.org/licenses/LICENSE-2.0
7694
+ *
7695
+ * Unless required by applicable law or agreed to in writing, software
7696
+ * distributed under the License is distributed on an "AS IS" BASIS,
7697
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7698
+ * See the License for the specific language governing permissions and
7699
+ * limitations under the License.
7700
+ *
7701
+ * Copyright 2025 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
7702
+ * Copyright 2025 - Finnish Meteorological Institute (FMI)
7703
+ * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
7704
+ * */
7705
+ var config = getConfig();
7706
+ var presetBaseUrl = (config == null ? void 0 : config.GW_PRESET_BACKEND_URL) || '';
7707
+ var getWorkspace = function getWorkspace(workspaceId, auth) {
7708
+ return fetch(presetBaseUrl + "/workspacepreset/" + workspaceId, {
7709
+ headers: getHeaders(auth)
7710
+ }).then(handleResponse);
7711
+ };
7712
+ var deleteWorkspace = function deleteWorkspace(workspaceId, auth) {
7713
+ return fetch(presetBaseUrl + "/workspacepreset/" + workspaceId, {
7714
+ headers: getHeaders(auth),
7715
+ method: 'DELETE'
7716
+ }).then(handleResponse);
7717
+ };
7718
+ var updateWorkspace = function updateWorkspace(workspaceId, data, auth) {
7719
+ return fetch(presetBaseUrl + "/workspacepreset/" + workspaceId, {
7720
+ headers: getHeaders(auth),
7721
+ method: 'PUT',
7722
+ body: JSON.stringify(data)
7723
+ }).then(handleResponse);
7724
+ };
7725
+ var createWorkspace = function createWorkspace(data, auth) {
7726
+ return fetch(presetBaseUrl + "/workspacepreset", {
7727
+ headers: getHeaders(auth),
7728
+ method: 'POST',
7729
+ body: JSON.stringify(data)
7730
+ }).then(handleResponse);
7731
+ };
7732
+
7674
7733
  var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7675
7734
  var _useAuthenticationCon = useAuthenticationContext(),
7676
- currentRole = _useAuthenticationCon.currentRole;
7735
+ currentRole = _useAuthenticationCon.currentRole,
7736
+ isLoggedIn = _useAuthenticationCon.isLoggedIn,
7737
+ auth = _useAuthenticationCon.auth;
7738
+ var username = (auth == null ? void 0 : auth.username) || '';
7739
+ var workspacePresets = useSelector(function (store) {
7740
+ return getWorkspaceList(store);
7741
+ });
7742
+ var selectedFilters = useSelector(getWorkspaceListFilters);
7743
+ var filteredPresets = React.useMemo(function () {
7744
+ return filterWorkspacePresets(workspacePresets, selectedFilters, username);
7745
+ }, [workspacePresets, selectedFilters, username]);
7677
7746
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
7678
7747
  var scope = !isAdmin ? 'user' : 'system';
7679
7748
  var currentView = useSelector(function (store) {
7680
7749
  return getWorkspaceState(store);
7681
7750
  });
7682
- var workspacePresets = useSelector(function (store) {
7683
- return getWorkspaceList(store);
7684
- });
7685
7751
  var workspaceListFilters = useSelector(function (store) {
7686
7752
  return getWorkspaceListFilters(store, scope);
7687
7753
  });
@@ -7694,15 +7760,13 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7694
7760
  var error = useSelector(function (store) {
7695
7761
  return getWorkspaceListError(store);
7696
7762
  });
7697
- var _useAuthenticationCon2 = useAuthenticationContext(),
7698
- isLoggedIn = _useAuthenticationCon2.isLoggedIn;
7699
7763
  var dispatch = useDispatch();
7700
7764
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
7701
7765
  t = _useWorkspaceTranslat.t;
7702
7766
  var fetchWorkspaceList = React.useCallback(function () {
7703
- var filterParams = constructFilterParams(workspaceListFilters, workspaceSearchQuery);
7767
+ var filterParams = constructFilterParams([], workspaceSearchQuery);
7704
7768
  dispatch(workspaceListActions.fetchWorkspaceList(filterParams));
7705
- }, [dispatch, workspaceListFilters, workspaceSearchQuery]);
7769
+ }, [dispatch, workspaceSearchQuery]);
7706
7770
  var fetchWorkspace = React.useCallback(function (workspaceId) {
7707
7771
  dispatch(workspaceActions.fetchWorkspace({
7708
7772
  workspaceId: workspaceId
@@ -7804,6 +7868,13 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7804
7868
  }
7805
7869
  case WorkspacePresetAction.SHARE:
7806
7870
  {
7871
+ void getWorkspace(presetId, auth).then(function (preset) {
7872
+ return void updateWorkspace(presetId, Object.assign({}, preset, {
7873
+ is_shared: !preset.is_shared
7874
+ }), auth).then(function () {
7875
+ fetchWorkspaceList();
7876
+ });
7877
+ });
7807
7878
  // TODO
7808
7879
  break;
7809
7880
  }
@@ -7857,7 +7928,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7857
7928
  searchQuery: workspaceSearchQuery,
7858
7929
  onSearch: searchFilter
7859
7930
  }), jsx(WorkspaceSelectList, {
7860
- workspacePresets: workspacePresets,
7931
+ workspacePresets: filteredPresets,
7861
7932
  currentSelectedId: currentView.id || '',
7862
7933
  onClickWorkspacePreset: onClickWorkspacePreset,
7863
7934
  onClickWorkspacePresetOption: onClickWorkspacePresetOption,
@@ -7960,54 +8031,73 @@ var WorkspaceMenuButton = function WorkspaceMenuButton(_ref) {
7960
8031
  });
7961
8032
  };
7962
8033
 
7963
- var FetchWorkspacePresets = function FetchWorkspacePresets() {
8034
+ /* *
8035
+ * Licensed under the Apache License, Version 2.0 (the "License");
8036
+ * you may not use this file except in compliance with the License.
8037
+ * You may obtain a copy of the License at
8038
+ *
8039
+ * http://www.apache.org/licenses/LICENSE-2.0
8040
+ *
8041
+ * Unless required by applicable law or agreed to in writing, software
8042
+ * distributed under the License is distributed on an "AS IS" BASIS,
8043
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8044
+ * See the License for the specific language governing permissions and
8045
+ * limitations under the License.
8046
+ *
8047
+ * Copyright 2025 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8048
+ * Copyright 2025 - Finnish Meteorological Institute (FMI)
8049
+ * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
8050
+ * */
8051
+ var useFetchWorkspacePresets = function useFetchWorkspacePresets() {
7964
8052
  var dispatch = useDispatch();
7965
8053
  var _useAuthenticationCon = useAuthenticationContext(),
7966
8054
  currentRole = _useAuthenticationCon.currentRole;
7967
8055
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
7968
- var scope = !isAdmin ? 'user' : 'system';
7969
8056
  var lastAdmin = usePrevious(isAdmin);
7970
- var workspaceListFilters = useSelector(function (store) {
7971
- return getWorkspaceListFilters(store, scope);
7972
- });
7973
8057
  var workspaceSearchQuery = useSelector(getWorkspaceListSearchQuery);
7974
- var fetchWorkspacePresets = React__default.useCallback(function (params) {
8058
+ var prevSearch = usePrevious(workspaceSearchQuery);
8059
+ var fetchWorkspacePresets = useCallback(function (params) {
7975
8060
  dispatch(workspaceListActions.fetchWorkspaceList(params));
7976
8061
  }, [dispatch]);
7977
- React__default.useEffect(function () {
7978
- var filterParams = constructFilterParams(workspaceListFilters, workspaceSearchQuery);
7979
- fetchWorkspacePresets(filterParams);
7980
- }, [fetchWorkspacePresets, workspaceListFilters, workspaceSearchQuery]);
7981
- React__default.useEffect(function () {
8062
+ useEffect(function () {
8063
+ if (workspaceSearchQuery !== prevSearch) {
8064
+ workspaceSearchQuery.trim() === '' ? fetchWorkspacePresets({}) : fetchWorkspacePresets({
8065
+ search: workspaceSearchQuery
8066
+ });
8067
+ }
8068
+ }, [fetchWorkspacePresets, prevSearch, workspaceSearchQuery]);
8069
+ useEffect(function () {
7982
8070
  if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
7983
8071
  // reset list filter when user changes role
7984
8072
  var filters = [{
7985
8073
  id: 'system',
7986
8074
  isSelected: true
7987
8075
  }, {
7988
- id: 'user',
8076
+ id: 'personal',
8077
+ isSelected: !isAdmin
8078
+ }, {
8079
+ id: 'shared',
7989
8080
  isSelected: !isAdmin
7990
8081
  }];
7991
8082
  dispatch(workspaceListActions.setFilterChips(filters));
7992
8083
  }
7993
8084
  }, [dispatch, isAdmin, lastAdmin]);
7994
- return null;
7995
8085
  };
8086
+
7996
8087
  var WorkspaceMenuButtonConnect = function WorkspaceMenuButtonConnect() {
7997
8088
  var dispatch = useDispatch();
8089
+ var isWorkspaceListDialogOpen = useSelector(function (store) {
8090
+ return getIsWorkspaceListDialogOpen(store);
8091
+ });
8092
+ useFetchWorkspacePresets();
7998
8093
  var setListDialogOpen = React__default.useCallback(function (isListDialogOpen) {
7999
8094
  dispatch(workspaceListActions.toggleWorkspaceDialog({
8000
8095
  isWorkspaceListDialogOpen: isListDialogOpen
8001
8096
  }));
8002
8097
  }, [dispatch]);
8003
- var isWorkspaceListDialogOpen = useSelector(function (store) {
8004
- return getIsWorkspaceListDialogOpen(store);
8005
- });
8006
- return jsxs(Fragment, {
8007
- children: [jsx(FetchWorkspacePresets, {}), jsx(WorkspaceMenuButton, {
8008
- showMenu: isWorkspaceListDialogOpen,
8009
- onToggleDialog: setListDialogOpen
8010
- })]
8098
+ return jsx(WorkspaceMenuButton, {
8099
+ showMenu: isWorkspaceListDialogOpen,
8100
+ onToggleDialog: setListDialogOpen
8011
8101
  });
8012
8102
  };
8013
8103
 
@@ -8325,7 +8415,8 @@ var WorkspaceViewPresetsFormFields = function WorkspaceViewPresetsFormFields(_re
8325
8415
  };
8326
8416
 
8327
8417
  var _excluded$3 = ["title", "abstract"];
8328
- var ERROR_TITLE_BE = 'Preset title already in use, please choose a different title';
8418
+ var ERROR_DUPLICATE_TITLE_BE = 'Preset title already in use, please choose a different title';
8419
+ var ERROR_LONG_TITLE_BE = 'Preset title cannot exceed 100 characters';
8329
8420
  var validateTitle$1 = function validateTitle(value) {
8330
8421
  if (!value) {
8331
8422
  return true;
@@ -8361,6 +8452,7 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
8361
8452
  value: otherFormValues[name]
8362
8453
  };
8363
8454
  });
8455
+ var shouldShowTitleError = (error == null ? void 0 : error.type) === WorkspaceListErrorType.VERBATIM_ERROR && (error.message === ERROR_DUPLICATE_TITLE_BE || error.message === ERROR_LONG_TITLE_BE);
8364
8456
  React__default.useEffect(function () {
8365
8457
  // autoFocus
8366
8458
  var field = document.querySelector("[name=\"" + titleField + "\"]");
@@ -8368,12 +8460,12 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
8368
8460
  }, []);
8369
8461
  React__default.useEffect(function () {
8370
8462
  // set title error on title field
8371
- if ((error == null ? void 0 : error.type) === WorkspaceListErrorType.VERBATIM_ERROR && error.message === ERROR_TITLE_BE) {
8463
+ if (shouldShowTitleError) {
8372
8464
  setError(titleField, {
8373
8465
  message: error.message
8374
8466
  });
8375
8467
  }
8376
- }, [error, setError]);
8468
+ }, [error, setError, shouldShowTitleError]);
8377
8469
  var onSubmitForm = function onSubmitForm(event) {
8378
8470
  event.preventDefault();
8379
8471
  onSubmit();
@@ -8383,7 +8475,7 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
8383
8475
  var isDisabled = hasSavedWorkspace || isLoading;
8384
8476
  var shouldShowViewPresetForm = action === WorkspacePresetAction.SAVE_SYSTEM_PRESET || action === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || action === WorkspacePresetAction.SAVE_AS || action === WorkspacePresetAction.SAVE;
8385
8477
  return jsxs(Fragment, {
8386
- children: [error && !(error.type === WorkspaceListErrorType.VERBATIM_ERROR && error.message === ERROR_TITLE_BE) && jsx(Box, {
8478
+ children: [error && !shouldShowTitleError && jsx(Box, {
8387
8479
  sx: {
8388
8480
  marginBottom: 2
8389
8481
  },
@@ -8408,7 +8500,7 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
8408
8500
  },
8409
8501
  disabled: isDisabled,
8410
8502
  defaultValue: title,
8411
- error: (error == null ? void 0 : error.type) === WorkspaceListErrorType.VERBATIM_ERROR && error.message === ERROR_TITLE_BE
8503
+ error: shouldShowTitleError
8412
8504
  })
8413
8505
  }), jsx(ReactHookFormTextField, {
8414
8506
  name: "abstract",
@@ -8619,12 +8711,104 @@ var WorkspacePresetsFormDialogWrapper = function WorkspacePresetsFormDialogWrapp
8619
8711
  });
8620
8712
  };
8621
8713
 
8714
+ /* *
8715
+ * Licensed under the Apache License, Version 2.0 (the "License");
8716
+ * you may not use this file except in compliance with the License.
8717
+ * You may obtain a copy of the License at
8718
+ *
8719
+ * http://www.apache.org/licenses/LICENSE-2.0
8720
+ *
8721
+ * Unless required by applicable law or agreed to in writing, software
8722
+ * distributed under the License is distributed on an "AS IS" BASIS,
8723
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8724
+ * See the License for the specific language governing permissions and
8725
+ * limitations under the License.
8726
+ *
8727
+ * Copyright 2025 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8728
+ * Copyright 2025 - Finnish Meteorological Institute (FMI)
8729
+ * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
8730
+ * */
8731
+ var onWorkspaceApiError = function onWorkspaceApiError(dispatch, error, t) {
8732
+ dispatch(workspaceListActions.onErrorWorkspacePresetAction({
8733
+ error: {
8734
+ message: error.message + " " + t('workspace-error-generic'),
8735
+ type: WorkspaceListErrorType.VERBATIM_ERROR,
8736
+ category: error.message === 'Authentication context not found' ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC
8737
+ }
8738
+ }));
8739
+ };
8740
+ var useDeleteWorkspacePreset = function useDeleteWorkspacePreset() {
8741
+ var _useAuthenticationCon = useAuthenticationContext(),
8742
+ auth = _useAuthenticationCon.auth;
8743
+ var _useSelector = useSelector(getWorkspaceActionFormValues),
8744
+ title = _useSelector.title;
8745
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
8746
+ t = _useWorkspaceTranslat.t;
8747
+ var dispatch = useDispatch();
8748
+ return useMutation({
8749
+ mutationFn: function mutationFn(_ref) {
8750
+ var id = _ref.id;
8751
+ if (!auth) {
8752
+ throw new Error('Authentication context not found');
8753
+ }
8754
+ return deleteWorkspace(id, auth);
8755
+ },
8756
+ onSuccess: function onSuccess(data, variables) {
8757
+ dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
8758
+ workspaceId: variables.id,
8759
+ action: WorkspacePresetAction.DELETE,
8760
+ emptyWorkspacePresetTitle: t('workspace-new'),
8761
+ title: title
8762
+ }));
8763
+ },
8764
+ onError: function onError(error) {
8765
+ onWorkspaceApiError(dispatch, error, t);
8766
+ }
8767
+ });
8768
+ };
8769
+ var useCreateWorkspacePreset = function useCreateWorkspacePreset() {
8770
+ var _useAuthenticationCon2 = useAuthenticationContext(),
8771
+ auth = _useAuthenticationCon2.auth;
8772
+ var _useWorkspaceTranslat2 = useWorkspaceTranslation(),
8773
+ t = _useWorkspaceTranslat2.t;
8774
+ var dispatch = useDispatch();
8775
+ return useMutation({
8776
+ mutationFn: function mutationFn(_ref2) {
8777
+ var data = _ref2.data;
8778
+ if (!auth) {
8779
+ throw new Error('Authentication context not found');
8780
+ }
8781
+ return createWorkspace(data, auth);
8782
+ },
8783
+ onSuccess: function onSuccess(data, variables) {
8784
+ var location = data == null ? void 0 : data.get('location');
8785
+ var newId = getIdFromUrl(location);
8786
+ var scope = variables.data.scope || 'user';
8787
+ dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
8788
+ workspaceId: newId,
8789
+ action: variables.action || WorkspacePresetAction.SAVE_AS,
8790
+ title: variables.data.title,
8791
+ scope: scope
8792
+ }));
8793
+ },
8794
+ onError: function onError(error) {
8795
+ onWorkspaceApiError(dispatch, error, t);
8796
+ }
8797
+ });
8798
+ };
8799
+
8622
8800
  var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
8623
8801
  var workspaceId = _ref.workspaceId,
8624
8802
  appTitle = _ref.appTitle;
8625
8803
  var dispatch = useDispatch();
8626
8804
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
8627
8805
  t = _useWorkspaceTranslat.t;
8806
+ var _useAuthenticationCon = useAuthenticationContext(),
8807
+ auth = _useAuthenticationCon.auth;
8808
+ var _useDeleteWorkspacePr = useDeleteWorkspacePreset(),
8809
+ deleteWorkspace = _useDeleteWorkspacePr.mutate;
8810
+ var _useCreateWorkspacePr = useCreateWorkspacePreset(),
8811
+ createWorkspace = _useCreateWorkspacePr.mutate;
8628
8812
  var title = useSelector(function (store) {
8629
8813
  return getSelectedWorkspaceTitle(store);
8630
8814
  });
@@ -8634,15 +8818,58 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
8634
8818
  var closeWorkspaceActionDialog = React.useCallback(function () {
8635
8819
  dispatch(workspaceListActions.closeWorkspaceActionDialogOptions());
8636
8820
  }, [dispatch]);
8637
- var onSubmitForm = function onSubmitForm(presetAction, presetId, data) {
8638
- dispatch(workspaceListActions.submitFormWorkspaceActionDialogOptions({
8639
- presetAction: presetAction,
8640
- presetId: presetId,
8641
- data: data,
8642
- emptyMapPresetTitle: t('workspace-mappreset-new'),
8643
- emptyWorkspacePresetTitle: t('workspace-new')
8821
+ var onSubmitForm = /*#__PURE__*/function () {
8822
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(presetAction, presetId, data) {
8823
+ var oldWorkspace;
8824
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
8825
+ while (1) switch (_context.prev = _context.next) {
8826
+ case 0:
8827
+ _context.t0 = presetAction;
8828
+ _context.next = _context.t0 === WorkspacePresetAction.DELETE ? 3 : _context.t0 === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 3 : _context.t0 === WorkspacePresetAction.DUPLICATE ? 5 : 15;
8829
+ break;
8830
+ case 3:
8831
+ deleteWorkspace({
8832
+ id: presetId
8833
+ });
8834
+ return _context.abrupt("break", 16);
8835
+ case 5:
8836
+ if (!presetId) {
8837
+ _context.next = 11;
8838
+ break;
8839
+ }
8840
+ _context.next = 8;
8841
+ return getWorkspace(presetId, auth);
8842
+ case 8:
8843
+ _context.t1 = _context.sent;
8844
+ _context.next = 12;
8845
+ break;
8846
+ case 11:
8847
+ _context.t1 = emptyWorkspaceBEData;
8848
+ case 12:
8849
+ oldWorkspace = _context.t1;
8850
+ createWorkspace({
8851
+ data: Object.assign({}, oldWorkspace, data),
8852
+ action: presetAction
8853
+ });
8854
+ return _context.abrupt("break", 16);
8855
+ case 15:
8856
+ dispatch(workspaceListActions.submitFormWorkspaceActionDialogOptions({
8857
+ presetAction: presetAction,
8858
+ presetId: presetId,
8859
+ data: data,
8860
+ emptyMapPresetTitle: t('workspace-mappreset-new'),
8861
+ emptyWorkspacePresetTitle: t('workspace-new')
8862
+ }));
8863
+ case 16:
8864
+ case "end":
8865
+ return _context.stop();
8866
+ }
8867
+ }, _callee);
8644
8868
  }));
8645
- };
8869
+ return function onSubmitForm(_x, _x2, _x3) {
8870
+ return _ref2.apply(this, arguments);
8871
+ };
8872
+ }();
8646
8873
  var presetId = typeof dialogDetails === 'object' && dialogDetails.presetId;
8647
8874
  var action = typeof dialogDetails === 'object' && dialogDetails.action;
8648
8875
  var formValues = typeof dialogDetails === 'object' && dialogDetails.formValues;
@@ -8830,7 +9057,9 @@ var ViewPresetsFormDialog = function ViewPresetsFormDialog(_ref) {
8830
9057
  }
8831
9058
  }, [isOpen]);
8832
9059
  React__default.useEffect(function () {
8833
- reset(formValues);
9060
+ if (formValues) {
9061
+ reset(formValues);
9062
+ }
8834
9063
  }, [formValues, reset]);
8835
9064
  var getConfirmLabel = function getConfirmLabel(action) {
8836
9065
  switch (action) {
@@ -8973,9 +9202,10 @@ var ViewPresetsFormDialog = function ViewPresetsFormDialog(_ref) {
8973
9202
  description: "",
8974
9203
  onClose: onClose,
8975
9204
  onSubmit: onSubmit,
8976
- sx: {
9205
+ resizableDefaultSize: {
8977
9206
  width: '330px'
8978
9207
  },
9208
+ isResizable: true,
8979
9209
  actions: jsx(ConfirmationButtons, {
8980
9210
  onClose: onClose,
8981
9211
  cancelLabel: t('workspace-cancel'),
@@ -9035,18 +9265,17 @@ var ViewPresetsFormDialogConnect = function ViewPresetsFormDialogConnect(_ref) {
9035
9265
  }));
9036
9266
  };
9037
9267
  var isOpen = dialogOptions !== undefined;
9038
- if (!isOpen) {
9039
- return null;
9040
- }
9041
- return jsx(ViewPresetsFormDialogWrapper, Object.assign({
9268
+ return jsx(ViewPresetsFormDialogWrapper, {
9042
9269
  isOpen: isOpen,
9043
9270
  onClose: onClose,
9044
9271
  onSuccess: onSuccess,
9045
- viewComponentType: viewComponentType
9046
- }, dialogOptions, {
9272
+ viewComponentType: viewComponentType,
9047
9273
  formValues: dialogOptions == null ? void 0 : dialogOptions.formValues,
9274
+ action: (dialogOptions == null ? void 0 : dialogOptions.action) || PresetAction.SAVE,
9275
+ title: (dialogOptions == null ? void 0 : dialogOptions.title) || '',
9276
+ viewPresetId: (dialogOptions == null ? void 0 : dialogOptions.viewPresetId) || '',
9048
9277
  onReset: onReset
9049
- }));
9278
+ });
9050
9279
  };
9051
9280
 
9052
9281
  var WorkspaceDetail = function WorkspaceDetail(_ref) {
@@ -9166,4 +9395,4 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
9166
9395
  });
9167
9396
  };
9168
9397
 
9169
- export { ComponentsLookUpWrapper, DemoWrapper, PresetAction, ViewPresetErrorComponent, ViewPresetErrorType, WORKSPACE_NAMESPACE, WorkspaceDetail, WorkspaceErrorType, WorkspaceI18nProvider, WorkspaceModuleProvider, WorkspacePresetAction, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProviderWithStore, createBalancedMosaicNode, createCustomEmptyMapWorkspace, defaultAuthConfig, getEmptyMapWorkspace, getWorkspaceRouteUrl, selectors$1 as selectors, viewPresetActions, viewPresetsListReducer, viewPresetsListener, viewPresetsReducer, workspaceActions, workspaceListActions, workspaceListListener, workspaceListReducer, workspaceListener, workspaceMiddlewares, workspaceReducer, workspaceReducersMap, routes as workspaceRoutes, workspaceTranslations };
9398
+ export { ComponentsLookUpWrapper, DemoWrapper, PresetAction, ViewPresetErrorComponent, ViewPresetErrorType, WORKSPACE_NAMESPACE, WorkspaceDetail, WorkspaceErrorType, WorkspaceI18nProvider, WorkspaceModuleProvider, WorkspacePresetAction, WorkspaceStoreWrapper, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProviderWithStore, createBalancedMosaicNode, createCustomEmptyMapWorkspace, defaultAuthConfig, getEmptyMapWorkspace, getWorkspaceRouteUrl, selectors$1 as selectors, viewPresetActions, viewPresetsListReducer, viewPresetsListener, viewPresetsReducer, workspaceActions, workspaceListActions, workspaceListListener, workspaceListReducer, workspaceListener, workspaceMiddlewares, workspaceReducer, workspaceReducersMap, routes as workspaceRoutes, workspaceTranslations };