@opengeoweb/workspace 4.22.1 → 5.0.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.
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { SyncGroups, syncGroupActions, layerActions, mapActions, uiActions, mapTypes, genericSelectors, routerActions, snackbarActions, mapSelectors, SnackbarWrapperConnect, coreModuleConfig, syncGroupsSelectors, uiSelectors } from '@opengeoweb/core';
1
+ import { SyncGroups, syncGroupActions, layerActions, mapActions, uiActions, mapTypes, mapEnums, genericSelectors, mapSelectors, syncGroupsSelectors, routerActions, snackbarActions, SnackbarWrapperConnect, coreModuleConfig, uiSelectors } from '@opengeoweb/core';
2
2
  import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, useApiContext } from '@opengeoweb/api';
3
3
  import { getLeaves, MosaicContext, getAndAssertNodeAtPathExists, createBalancedTreeFromLeaves, MosaicWindow, MosaicWithoutDragDropContext } from 'react-mosaic-component';
4
4
  import { isAxiosError, getAxiosErrorMessage, withEggs, useConfirmationDialog, CustomIconButton, AlertBanner, CustomTooltip, SearchHighlight, ToggleMenu, ToolContainer, CustomToggleButton, ConfirmationServiceProvider, ConfirmationDialog } from '@opengeoweb/shared';
@@ -7,6 +7,7 @@ import React__default, { createContext, useContext, useDebugValue, useLayoutEffe
7
7
  import { ThemeWrapper, lightTheme, Menu, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, Delete, Preset, PresetWorkspace, PresetTiles, WebAssetOff, Clear, Search } from '@opengeoweb/theme';
8
8
  import { unstable_batchedUpdates } from 'react-dom';
9
9
  import { timeSeriesModuleConfig } from '@opengeoweb/timeseries';
10
+ import { AuthenticationProvider, useAuthenticationContext } from '@opengeoweb/authentication';
10
11
  import { jsx } from 'react/jsx-runtime';
11
12
  import { useTheme as useTheme$2, LinearProgress, Typography, ListItem, ListItemButton, ListItemIcon, ListItemText, Grid, Box as Box$2, List, Backdrop, Menu as Menu$1, ListSubheader, MenuItem, Chip, Stack, debounce as debounce$1, TextField, InputAdornment, Tabs } from '@mui/material';
12
13
  import 'react-mosaic-component/react-mosaic-component.css';
@@ -18484,6 +18485,7 @@ var WorkspacePresetAction;
18484
18485
  WorkspacePresetAction["EDIT"] = "EDIT";
18485
18486
  WorkspacePresetAction["SAVE"] = "SAVE";
18486
18487
  WorkspacePresetAction["SAVE_AS"] = "SAVE_AS";
18488
+ WorkspacePresetAction["SAVE_ALL"] = "SAVE_ALL";
18487
18489
  WorkspacePresetAction["DUPLICATE"] = "DUPLICATE";
18488
18490
  })(WorkspacePresetAction || (WorkspacePresetAction = {}));
18489
18491
  var WorkspaceErrorType;
@@ -19257,7 +19259,7 @@ var viewPresetsAdapter = createEntityAdapter({
19257
19259
  var initialState$4 = viewPresetsAdapter.getInitialState();
19258
19260
  var syncGroupChangeActions = [syncGroupActions.syncGroupRemoveTarget, syncGroupActions.syncGroupAddTarget];
19259
19261
  var mapPresetChangeActions = [layerActions.setBaseLayers, layerActions.layerDelete, layerActions.addLayer, layerActions.layerChangeEnabled, layerActions.layerChangeName, layerActions.layerChangeStyle, layerActions.layerChangeOpacity, layerActions.layerChangeDimension, mapActions.layerMoveLayer, mapActions.setAutoLayerId, mapActions.toggleAutoUpdate, mapActions.mapStartAnimation, mapActions.mapStopAnimation, mapActions.toggleTimeSliderIsVisible, mapActions.setTimeStep, mapActions.setAnimationDelay, mapActions.toggleTimestepAuto, uiActions.setActiveMapIdForDialog, uiActions.setToggleOpenDialog, syncGroupActions.setBbox];
19260
- var supportedChangeOrigins = [mapTypes.LayerActionOrigin.layerManager, mapTypes.LayerActionOrigin.wmsLoader, mapTypes.MapActionOrigin.map];
19262
+ var supportedChangeOrigins = [mapTypes.LayerActionOrigin.layerManager, mapTypes.LayerActionOrigin.wmsLoader, mapEnums.MapActionOrigin.map];
19261
19263
  var slice$3 = createSlice({
19262
19264
  initialState: initialState$4,
19263
19265
  name: 'viewPresets',
@@ -19581,6 +19583,7 @@ var slice$2 = createSlice({
19581
19583
  draft.mosaicNode = '';
19582
19584
  draft.id = '';
19583
19585
  draft.title = workspacePreset.title;
19586
+ draft["abstract"] = workspacePreset["abstract"];
19584
19587
  draft.syncGroups = [];
19585
19588
  },
19586
19589
  setPreset: function setPreset(draft, action) {
@@ -19627,10 +19630,14 @@ var slice$2 = createSlice({
19627
19630
  draft.isLoading = true;
19628
19631
  draft.error = undefined;
19629
19632
  },
19630
- loadedWorkspace: function loadedWorkspace(draft,
19631
- // eslint-disable-next-line no-unused-vars
19632
- action) {
19633
+ loadedWorkspace: function loadedWorkspace(draft, action) {
19634
+ var _a;
19633
19635
  draft.isLoading = false;
19636
+ if ((_a = action.payload) === null || _a === void 0 ? void 0 : _a.workspace) {
19637
+ var workspace = action.payload.workspace;
19638
+ draft["abstract"] = workspace === null || workspace === void 0 ? void 0 : workspace["abstract"];
19639
+ draft.title = workspace === null || workspace === void 0 ? void 0 : workspace.title;
19640
+ }
19634
19641
  },
19635
19642
  errorWorkspace: function errorWorkspace(draft,
19636
19643
  // eslint-disable-next-line no-unused-vars
@@ -19653,9 +19660,10 @@ var slice$2 = createSlice({
19653
19660
  },
19654
19661
  extraReducers: function extraReducers(builder) {
19655
19662
  builder.addCase(workspaceListActions.onSuccessWorkspacePresetAction, function (draft, action) {
19656
- if (action.payload.action === WorkspacePresetAction.SAVE_AS) {
19663
+ if (action.payload.action === WorkspacePresetAction.SAVE_AS || action.payload.action === WorkspacePresetAction.SAVE_ALL) {
19657
19664
  draft.id = action.payload.workspaceId;
19658
19665
  draft.title = action.payload.title;
19666
+ draft["abstract"] = action.payload["abstract"];
19659
19667
  draft.hasChanges = false;
19660
19668
  draft.scope = 'user';
19661
19669
  }
@@ -19692,6 +19700,7 @@ var slice$2 = createSlice({
19692
19700
  });
19693
19701
  }
19694
19702
  });
19703
+ // eslint-disable-next-line prefer-destructuring
19695
19704
  var reducer$1 = slice$2.reducer;
19696
19705
  var workspaceActions = Object.assign({}, slice$2.actions);
19697
19706
 
@@ -19724,8 +19733,8 @@ var selectors$1 = viewPresetsAdapter.getSelectors(function (state) {
19724
19733
  ids: []
19725
19734
  };
19726
19735
  });
19727
- selectors$1.selectAll;
19728
- var getViewPresetById = selectors$1.selectById;
19736
+ var getViewPresets = selectors$1.selectAll,
19737
+ getViewPresetById = selectors$1.selectById;
19729
19738
  var getViewPresetsIsFetching = function getViewPresetsIsFetching(store, panelId) {
19730
19739
  var _a;
19731
19740
  return ((_a = getViewPresetById(store, panelId)) === null || _a === void 0 ? void 0 : _a.isFetching) || false;
@@ -19764,6 +19773,50 @@ var getIsViewPresetListDialogOpen = function getIsViewPresetListDialogOpen(store
19764
19773
  return ((_a = getViewPresetById(store, panelId)) === null || _a === void 0 ? void 0 : _a.isViewPresetListDialogOpen) || false;
19765
19774
  };
19766
19775
 
19776
+ /* *
19777
+ * Licensed under the Apache License, Version 2.0 (the "License");
19778
+ * you may not use this file except in compliance with the License.
19779
+ * You may obtain a copy of the License at
19780
+ *
19781
+ * http://www.apache.org/licenses/LICENSE-2.0
19782
+ *
19783
+ * Unless required by applicable law or agreed to in writing, software
19784
+ * distributed under the License is distributed on an "AS IS" BASIS,
19785
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19786
+ * See the License for the specific language governing permissions and
19787
+ * limitations under the License.
19788
+ *
19789
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
19790
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
19791
+ * */
19792
+ var MAPPRESET_ACTIVE_TITLE = 'New map preset';
19793
+ var MAPPRESET_DIALOG_TITLE_SAVE_AS = 'Save map preset as';
19794
+ var MAPPRESET_DIALOG_TITLE_DELETE = 'Delete map preset';
19795
+ var getSnackbarMessage$1 = function getSnackbarMessage(action, title) {
19796
+ // Trim and add quotes
19797
+ var trimmedTitle = "\"".concat(title.trim(), "\"");
19798
+ switch (action) {
19799
+ case PresetAction.DELETE:
19800
+ return "Map preset ".concat(trimmedTitle, " successfully deleted");
19801
+ case PresetAction.SAVE_AS:
19802
+ return "New map preset ".concat(trimmedTitle, " successfully saved");
19803
+ default:
19804
+ return "Map preset ".concat(trimmedTitle, " successfully saved");
19805
+ }
19806
+ };
19807
+ var getPresetsApi = function getPresetsApi() {
19808
+ return getApi(API_NAME);
19809
+ };
19810
+ var emptyMapViewPreset = {
19811
+ componentType: 'Map',
19812
+ keywords: 'mapPreset,viewPreset,layerManager',
19813
+ scope: 'user',
19814
+ title: '',
19815
+ initialProps: {
19816
+ mapPreset: {}
19817
+ }
19818
+ };
19819
+
19767
19820
  /* *
19768
19821
  * Licensed under the Apache License, Version 2.0 (the "License");
19769
19822
  * you may not use this file except in compliance with the License.
@@ -19809,8 +19862,8 @@ var getMosaicNode = createSelector(getWorkspaceState, function (state) {
19809
19862
  * @returns {object} returnType: WorkspaceViewType
19810
19863
  */
19811
19864
  var getViewById = function getViewById(store, viewId) {
19812
- var _a;
19813
- if ((_a = store === null || store === void 0 ? void 0 : store.workspace) === null || _a === void 0 ? void 0 : _a.views.byId[viewId]) {
19865
+ var _a, _b;
19866
+ if ((_b = (_a = store === null || store === void 0 ? void 0 : store.workspace) === null || _a === void 0 ? void 0 : _a.views.byId) === null || _b === void 0 ? void 0 : _b[viewId]) {
19814
19867
  return store.workspace.views.byId[viewId];
19815
19868
  }
19816
19869
  return null;
@@ -19903,6 +19956,19 @@ var getWorkspaceData = createSelector(getWorkspaceState, getViewPresetsStore, ge
19903
19956
  mosaicNode: store.mosaicNode
19904
19957
  };
19905
19958
  });
19959
+ var getViewPresetToSendToBackend = createSelector(getViewById, mapSelectors.getMapPreset, syncGroupsSelectors.getAllTargetGroupsForSource, function (workspaceView, mapPreset, syncGroupsIds) {
19960
+ var title = (workspaceView === null || workspaceView === void 0 ? void 0 : workspaceView.title) || MAPPRESET_ACTIVE_TITLE;
19961
+ var scope = (workspaceView === null || workspaceView === void 0 ? void 0 : workspaceView.scope) || 'system';
19962
+ return Object.assign(Object.assign({}, emptyMapViewPreset), {
19963
+ id: workspaceView === null || workspaceView === void 0 ? void 0 : workspaceView.id,
19964
+ scope: scope,
19965
+ title: title,
19966
+ initialProps: {
19967
+ mapPreset: mapPreset,
19968
+ syncGroupsIds: syncGroupsIds
19969
+ }
19970
+ });
19971
+ });
19906
19972
 
19907
19973
  var selectors = /*#__PURE__*/Object.freeze({
19908
19974
  __proto__: null,
@@ -19917,7 +19983,8 @@ var selectors = /*#__PURE__*/Object.freeze({
19917
19983
  hasWorkspaceChanges: hasWorkspaceChanges,
19918
19984
  getViewType: getViewType,
19919
19985
  getSelectedWorkspaceScope: getSelectedWorkspaceScope,
19920
- getWorkspaceData: getWorkspaceData
19986
+ getWorkspaceData: getWorkspaceData,
19987
+ getViewPresetToSendToBackend: getViewPresetToSendToBackend
19921
19988
  });
19922
19989
 
19923
19990
  /* *
@@ -22565,50 +22632,6 @@ var viewPresetsList = [
22565
22632
  }
22566
22633
  ];
22567
22634
 
22568
- /* *
22569
- * Licensed under the Apache License, Version 2.0 (the "License");
22570
- * you may not use this file except in compliance with the License.
22571
- * You may obtain a copy of the License at
22572
- *
22573
- * http://www.apache.org/licenses/LICENSE-2.0
22574
- *
22575
- * Unless required by applicable law or agreed to in writing, software
22576
- * distributed under the License is distributed on an "AS IS" BASIS,
22577
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22578
- * See the License for the specific language governing permissions and
22579
- * limitations under the License.
22580
- *
22581
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
22582
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
22583
- * */
22584
- var MAPPRESET_ACTIVE_TITLE = 'New map preset';
22585
- var MAPPRESET_DIALOG_TITLE_SAVE_AS = 'Save map preset as';
22586
- var MAPPRESET_DIALOG_TITLE_DELETE = 'Delete map preset';
22587
- var getSnackbarMessage$1 = function getSnackbarMessage(action, title) {
22588
- // Trim and add quotes
22589
- var trimmedTitle = "\"".concat(title.trim(), "\"");
22590
- switch (action) {
22591
- case PresetAction.DELETE:
22592
- return "Map preset ".concat(trimmedTitle, " successfully deleted");
22593
- case PresetAction.SAVE_AS:
22594
- return "New map preset ".concat(trimmedTitle, " successfully saved");
22595
- default:
22596
- return "Map preset ".concat(trimmedTitle, " successfully saved");
22597
- }
22598
- };
22599
- var getPresetsApi = function getPresetsApi() {
22600
- return getApi(API_NAME);
22601
- };
22602
- var emptyMapViewPreset = {
22603
- componentType: 'Map',
22604
- keywords: 'mapPreset,viewPreset,layerManager',
22605
- scope: 'user',
22606
- title: '',
22607
- initialProps: {
22608
- mapPreset: {}
22609
- }
22610
- };
22611
-
22612
22635
  /* *
22613
22636
  * Licensed under the Apache License, Version 2.0 (the "License");
22614
22637
  * you may not use this file except in compliance with the License.
@@ -22629,6 +22652,8 @@ var getSnackbarMessage = function getSnackbarMessage(action, title) {
22629
22652
  // Trim and add quotes
22630
22653
  var trimmedTitle = "\"".concat(title.trim(), "\"");
22631
22654
  switch (action) {
22655
+ case WorkspacePresetAction.SAVE_ALL:
22656
+ return "Workspace ".concat(trimmedTitle, " and underlying viewpresets successfully saved");
22632
22657
  case WorkspacePresetAction.DELETE:
22633
22658
  return "Workspace ".concat(trimmedTitle, " successfully deleted");
22634
22659
  case WorkspacePresetAction.DUPLICATE:
@@ -22639,7 +22664,6 @@ var getSnackbarMessage = function getSnackbarMessage(action, title) {
22639
22664
  };
22640
22665
  var emptyMapWorkspace = {
22641
22666
  title: 'New workspace',
22642
- id: 'FEnewWorkspace',
22643
22667
  "abstract": '',
22644
22668
  views: {
22645
22669
  allIds: ['1_screen'],
@@ -22694,6 +22718,18 @@ var constructFilterParams = function constructFilterParams(filters, searchQuery)
22694
22718
  search: search
22695
22719
  });
22696
22720
  };
22721
+ // TODO: better to use a lib for this. Currently this is only used in workspace 'save all', and will probably be replaced by a backend solution
22722
+ // https://stackoverflow.com/questions/6248666/how-to-generate-short-uid-like-ax4j9z-in-js
22723
+ var generateUID = function generateUID() {
22724
+ var firstPart = Math.random() * 46656 || 0;
22725
+ var secondPart = Math.random() * 46656 || 0;
22726
+ var firstPartCombined = "000".concat(firstPart.toString(36)).slice(-3);
22727
+ var secondPartCombined = "000".concat(secondPart.toString(36)).slice(-3);
22728
+ return firstPartCombined + secondPartCombined;
22729
+ };
22730
+ var getGeneratedViewPresetTitle = function getGeneratedViewPresetTitle(workspaceTitle, uid) {
22731
+ return "".concat(workspaceTitle, " - viewpreset ").concat(uid);
22732
+ };
22697
22733
 
22698
22734
  var ERROR_NOT_FOUND = 'Request failed with status code 400';
22699
22735
  var extractWorkspacePresetFromJSON = function extractWorkspacePresetFromJSON(workspacePresetId) {
@@ -22710,8 +22746,9 @@ var filterWorkspacePresetList = function filterWorkspacePresetList(params) {
22710
22746
  if (lodash.exports.isEmpty(params)) {
22711
22747
  return workspacePresetsList;
22712
22748
  }
22713
- return workspacePresetsList.reduce(function (list, workspacePreset) {
22749
+ return workspacePresetsList.reduce(function (list, workspacePresetRaw) {
22714
22750
  var _a;
22751
+ var workspacePreset = workspacePresetRaw;
22715
22752
  if ((_a = params === null || params === void 0 ? void 0 : params.scope) === null || _a === void 0 ? void 0 : _a.includes(workspacePreset.scope)) {
22716
22753
  if (params.search) {
22717
22754
  var searchQuery = getCleanSearchQuery(params.search);
@@ -22812,22 +22849,6 @@ var createApi = function createApi() {
22812
22849
  var instance = createFakeApiInstance();
22813
22850
  return getApiRoutes(instance);
22814
22851
  };
22815
- // used in app, same as storybook but no save/delete functionality
22816
- var createApiWithoutSave = function createApiWithoutSave() {
22817
- var instance = createFakeApiInstance();
22818
- return Object.assign(Object.assign({}, getApiRoutes(instance)), {
22819
- saveWorkspacePresetAs: function saveWorkspacePresetAs() {
22820
- return new Promise(function (_resolve, reject) {
22821
- return reject(new Error('You are using a fake API. Saving is not possible'));
22822
- });
22823
- },
22824
- deleteWorkspacePreset: function deleteWorkspacePreset() {
22825
- return new Promise(function (_resolve, reject) {
22826
- return reject(new Error('You are using a fake API. Deleting is not possible'));
22827
- });
22828
- }
22829
- });
22830
- };
22831
22852
 
22832
22853
  /* *
22833
22854
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22855,7 +22876,7 @@ var getWorkspaceRouteUrl = function getWorkspaceRouteUrl(workspaceId) {
22855
22876
  };
22856
22877
 
22857
22878
  var _marked$2 = /*#__PURE__*/_regeneratorRuntime().mark(updateViewsSaga),
22858
- _marked2$1 = /*#__PURE__*/_regeneratorRuntime().mark(fetchWorkspaceSaga),
22879
+ _marked2$2 = /*#__PURE__*/_regeneratorRuntime().mark(fetchWorkspaceSaga),
22859
22880
  _marked3 = /*#__PURE__*/_regeneratorRuntime().mark(saveWorkspacePresetSaga),
22860
22881
  _marked4 = /*#__PURE__*/_regeneratorRuntime().mark(workspaceSaga);
22861
22882
  var setPreset = workspaceActions.setPreset,
@@ -23005,7 +23026,8 @@ function fetchWorkspaceSaga(action) {
23005
23026
  case 16:
23006
23027
  _context4.next = 18;
23007
23028
  return put(workspaceActions.loadedWorkspace({
23008
- workspaceId: workspaceId
23029
+ workspaceId: workspaceId,
23030
+ workspace: workspaceData
23009
23031
  }));
23010
23032
  case 18:
23011
23033
  // show all views inside a workspace as loading
@@ -23066,7 +23088,7 @@ function fetchWorkspaceSaga(action) {
23066
23088
  case "end":
23067
23089
  return _context4.stop();
23068
23090
  }
23069
- }, _marked2$1, null, [[2, 41], [23, 33, 36, 39]]);
23091
+ }, _marked2$2, null, [[2, 41], [23, 33, 36, 39]]);
23070
23092
  }
23071
23093
  function saveWorkspacePresetSaga(action) {
23072
23094
  var workspace, workspaceApi;
@@ -23083,7 +23105,7 @@ function saveWorkspacePresetSaga(action) {
23083
23105
  return call(workspaceApi.saveWorkspacePreset, workspace.id, workspace);
23084
23106
  case 7:
23085
23107
  _context5.next = 9;
23086
- return put(workspaceActions.loadedWorkspace());
23108
+ return put(workspaceActions.loadedWorkspace(undefined));
23087
23109
  case 9:
23088
23110
  _context5.next = 11;
23089
23111
  return put(workspaceListActions.onSuccessWorkspacePresetAction({
@@ -23279,7 +23301,8 @@ var getWorkspaceListSearchQuery = function getWorkspaceListSearchQuery(store) {
23279
23301
  return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.searchQuery) || '';
23280
23302
  };
23281
23303
 
23282
- var _marked$1 = /*#__PURE__*/_regeneratorRuntime().mark(rootSaga$1);
23304
+ var _marked$1 = /*#__PURE__*/_regeneratorRuntime().mark(saveAllViewPresetSaga),
23305
+ _marked2$1 = /*#__PURE__*/_regeneratorRuntime().mark(rootSaga$1);
23283
23306
  var emptyWorkspaceBEData = Object.assign(Object.assign({}, emptyMapWorkspace), {
23284
23307
  views: [{
23285
23308
  mosaicNodeId: '1_screen',
@@ -23384,28 +23407,108 @@ function onSuccessWorkspacePresetsActionSaga(_ref2) {
23384
23407
  }, _callee2);
23385
23408
  })();
23386
23409
  }
23410
+ function saveAllViewPresetSaga(viewPresetEntity, workspaceTitle) {
23411
+ var _a, _b, workspaceApi, panelId, activeViewPresetId, hasChanges, viewPreset, scope, uuid, newTitle, newViewPreset, newId;
23412
+ return _regeneratorRuntime().wrap(function saveAllViewPresetSaga$(_context3) {
23413
+ while (1) switch (_context3.prev = _context3.next) {
23414
+ case 0:
23415
+ _context3.next = 2;
23416
+ return call(getWorkspaceApi);
23417
+ case 2:
23418
+ workspaceApi = _context3.sent;
23419
+ panelId = viewPresetEntity.panelId, activeViewPresetId = viewPresetEntity.activeViewPresetId, hasChanges = viewPresetEntity.hasChanges;
23420
+ _context3.prev = 4;
23421
+ _context3.next = 7;
23422
+ return select(getViewPresetToSendToBackend, panelId);
23423
+ case 7:
23424
+ viewPreset = _context3.sent;
23425
+ scope = viewPreset.scope || 'system'; // saves user viewpresets with changes
23426
+ if (!(scope === 'user' && hasChanges)) {
23427
+ _context3.next = 14;
23428
+ break;
23429
+ }
23430
+ _context3.next = 12;
23431
+ return call(workspaceApi.saveViewPreset, activeViewPresetId, viewPreset);
23432
+ case 12:
23433
+ _context3.next = 14;
23434
+ return put(viewPresetActions.savedViewPreset({
23435
+ panelId: panelId,
23436
+ viewPresetId: activeViewPresetId
23437
+ }));
23438
+ case 14:
23439
+ if (!(scope === 'system' && (!activeViewPresetId || activeViewPresetId && hasChanges))) {
23440
+ _context3.next = 28;
23441
+ break;
23442
+ }
23443
+ _context3.next = 17;
23444
+ return call(generateUID);
23445
+ case 17:
23446
+ uuid = _context3.sent;
23447
+ newTitle = getGeneratedViewPresetTitle(workspaceTitle, uuid);
23448
+ newViewPreset = Object.assign(Object.assign({}, viewPreset), {
23449
+ title: newTitle,
23450
+ scope: 'user'
23451
+ });
23452
+ _context3.next = 22;
23453
+ return call(workspaceApi.saveViewPresetAs, newViewPreset);
23454
+ case 22:
23455
+ newId = _context3.sent;
23456
+ _context3.next = 25;
23457
+ return put(viewPresetActions.savedViewPreset({
23458
+ panelId: panelId,
23459
+ viewPresetId: newId
23460
+ }));
23461
+ case 25:
23462
+ _context3.next = 27;
23463
+ return put(viewPresetActions.fetchedViewPreset({
23464
+ panelId: panelId,
23465
+ viewPresetId: newId,
23466
+ viewPreset: newViewPreset
23467
+ }));
23468
+ case 27:
23469
+ return _context3.abrupt("return", {
23470
+ mosaicNodeId: panelId,
23471
+ viewPresetId: newId,
23472
+ title: newTitle
23473
+ });
23474
+ case 28:
23475
+ return _context3.abrupt("return", {
23476
+ mosaicNodeId: panelId,
23477
+ viewPresetId: activeViewPresetId,
23478
+ title: viewPreset.title
23479
+ });
23480
+ case 31:
23481
+ _context3.prev = 31;
23482
+ _context3.t0 = _context3["catch"](4);
23483
+ return _context3.abrupt("return", (_b = (_a = _context3.t0.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message);
23484
+ case 34:
23485
+ case "end":
23486
+ return _context3.stop();
23487
+ }
23488
+ }, _marked$1, null, [[4, 31]]);
23489
+ }
23387
23490
  function submitFormWorkspaceDialogSaga(_ref3) {
23388
23491
  var payload = _ref3.payload;
23389
23492
  return /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
23390
- var workspaceApi, presetId, presetAction, data, newId, isNewWorkspace, _ref4, presetToDuplicate, fullPreset, _newId, message;
23391
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
23392
- while (1) switch (_context3.prev = _context3.next) {
23493
+ var workspaceApi, presetId, presetAction, data, newId, isNewWorkspace, _ref4, presetToDuplicate, fullPreset, _newId, workspace, isNew, workspaceId, views, savedViewPresetResult, errorMessage, workspaceData, newWorkspace, message;
23494
+ return _regeneratorRuntime().wrap(function _callee3$(_context4) {
23495
+ while (1) switch (_context4.prev = _context4.next) {
23393
23496
  case 0:
23394
- _context3.next = 2;
23497
+ _context4.next = 2;
23395
23498
  return call(getWorkspaceApi);
23396
23499
  case 2:
23397
- workspaceApi = _context3.sent;
23398
- _context3.prev = 3;
23500
+ workspaceApi = _context4.sent;
23501
+ _context4.prev = 3;
23399
23502
  presetId = payload.presetId, presetAction = payload.presetAction, data = payload.data; // save as
23400
23503
  if (!(presetAction === WorkspacePresetAction.SAVE_AS)) {
23401
- _context3.next = 11;
23504
+ _context4.next = 11;
23402
23505
  break;
23403
23506
  }
23404
- _context3.next = 8;
23507
+ _context4.next = 8;
23405
23508
  return call(workspaceApi.saveWorkspacePresetAs, data);
23406
23509
  case 8:
23407
- newId = _context3.sent;
23408
- _context3.next = 11;
23510
+ newId = _context4.sent;
23511
+ _context4.next = 11;
23409
23512
  return put(workspaceListActions.onSuccessWorkspacePresetAction({
23410
23513
  workspaceId: newId,
23411
23514
  action: presetAction,
@@ -23413,33 +23516,33 @@ function submitFormWorkspaceDialogSaga(_ref3) {
23413
23516
  }));
23414
23517
  case 11:
23415
23518
  if (!(presetAction === WorkspacePresetAction.DUPLICATE)) {
23416
- _context3.next = 28;
23519
+ _context4.next = 28;
23417
23520
  break;
23418
23521
  }
23419
23522
  isNewWorkspace = presetId === emptyMapWorkspace.id;
23420
23523
  if (!isNewWorkspace) {
23421
- _context3.next = 17;
23524
+ _context4.next = 17;
23422
23525
  break;
23423
23526
  }
23424
- _context3.t0 = {
23527
+ _context4.t0 = {
23425
23528
  data: emptyWorkspaceBEData
23426
23529
  };
23427
- _context3.next = 20;
23530
+ _context4.next = 20;
23428
23531
  break;
23429
23532
  case 17:
23430
- _context3.next = 19;
23533
+ _context4.next = 19;
23431
23534
  return call(workspaceApi.getWorkspacePreset, presetId);
23432
23535
  case 19:
23433
- _context3.t0 = _context3.sent;
23536
+ _context4.t0 = _context4.sent;
23434
23537
  case 20:
23435
- _ref4 = _context3.t0;
23538
+ _ref4 = _context4.t0;
23436
23539
  presetToDuplicate = _ref4.data;
23437
23540
  fullPreset = Object.assign(Object.assign({}, presetToDuplicate), data);
23438
- _context3.next = 25;
23541
+ _context4.next = 25;
23439
23542
  return call(workspaceApi.saveWorkspacePresetAs, fullPreset);
23440
23543
  case 25:
23441
- _newId = _context3.sent;
23442
- _context3.next = 28;
23544
+ _newId = _context4.sent;
23545
+ _context4.next = 28;
23443
23546
  return put(workspaceListActions.onSuccessWorkspacePresetAction({
23444
23547
  workspaceId: _newId,
23445
23548
  action: presetAction,
@@ -23447,56 +23550,129 @@ function submitFormWorkspaceDialogSaga(_ref3) {
23447
23550
  }));
23448
23551
  case 28:
23449
23552
  if (!(presetAction === WorkspacePresetAction.DELETE)) {
23450
- _context3.next = 33;
23553
+ _context4.next = 33;
23451
23554
  break;
23452
23555
  }
23453
- _context3.next = 31;
23556
+ _context4.next = 31;
23454
23557
  return call(workspaceApi.deleteWorkspacePreset, presetId);
23455
23558
  case 31:
23456
- _context3.next = 33;
23559
+ _context4.next = 33;
23457
23560
  return put(workspaceListActions.onSuccessWorkspacePresetAction({
23458
23561
  workspaceId: presetId,
23459
23562
  action: presetAction,
23460
23563
  title: data.title
23461
23564
  }));
23462
23565
  case 33:
23463
- _context3.next = 40;
23566
+ if (!(presetAction === WorkspacePresetAction.SAVE_ALL)) {
23567
+ _context4.next = 66;
23568
+ break;
23569
+ }
23570
+ _context4.next = 36;
23571
+ return select(getWorkspaceState);
23572
+ case 36:
23573
+ workspace = _context4.sent;
23574
+ // first save a new workspace to make sure we have an unique title
23575
+ isNew = !workspace.scope || workspace.scope === 'system';
23576
+ if (!isNew) {
23577
+ _context4.next = 44;
23578
+ break;
23579
+ }
23580
+ _context4.next = 41;
23581
+ return call(workspaceApi.saveWorkspacePresetAs, data);
23582
+ case 41:
23583
+ _context4.t1 = _context4.sent;
23584
+ _context4.next = 45;
23464
23585
  break;
23465
- case 35:
23466
- _context3.prev = 35;
23467
- _context3.t1 = _context3["catch"](3);
23468
- message = isAxiosError(_context3.t1) ? getAxiosErrorMessage(_context3.t1) : _context3.t1.message;
23469
- _context3.next = 40;
23586
+ case 44:
23587
+ _context4.t1 = data.id;
23588
+ case 45:
23589
+ workspaceId = _context4.t1;
23590
+ _context4.next = 48;
23591
+ return select(getViewPresets);
23592
+ case 48:
23593
+ views = _context4.sent;
23594
+ _context4.next = 51;
23595
+ return all(views.map(function (view) {
23596
+ return call(saveAllViewPresetSaga, view, data.title);
23597
+ }));
23598
+ case 51:
23599
+ savedViewPresetResult = _context4.sent;
23600
+ errorMessage = savedViewPresetResult.find(function (viewPresetResult) {
23601
+ return typeof viewPresetResult === 'string';
23602
+ });
23603
+ if (!errorMessage) {
23604
+ _context4.next = 55;
23605
+ break;
23606
+ }
23607
+ throw new Error(errorMessage);
23608
+ case 55:
23609
+ _context4.next = 57;
23610
+ return select(getWorkspaceData);
23611
+ case 57:
23612
+ workspaceData = _context4.sent;
23613
+ newWorkspace = Object.assign(Object.assign({}, workspaceData), {
23614
+ id: workspaceId,
23615
+ scope: 'user',
23616
+ title: data.title,
23617
+ "abstract": data["abstract"]
23618
+ });
23619
+ _context4.next = 61;
23620
+ return call(workspaceApi.saveWorkspacePreset, workspaceId, newWorkspace);
23621
+ case 61:
23622
+ _context4.next = 63;
23623
+ return put(workspaceListActions.onSuccessWorkspacePresetAction({
23624
+ action: WorkspacePresetAction.SAVE_ALL,
23625
+ workspaceId: workspaceId,
23626
+ title: newWorkspace.title,
23627
+ "abstract": newWorkspace["abstract"]
23628
+ }));
23629
+ case 63:
23630
+ if (!isNew) {
23631
+ _context4.next = 66;
23632
+ break;
23633
+ }
23634
+ _context4.next = 66;
23635
+ return put(routerActions.navigateToUrl({
23636
+ url: getWorkspaceRouteUrl(workspaceId)
23637
+ }));
23638
+ case 66:
23639
+ _context4.next = 73;
23640
+ break;
23641
+ case 68:
23642
+ _context4.prev = 68;
23643
+ _context4.t2 = _context4["catch"](3);
23644
+ message = isAxiosError(_context4.t2) ? getAxiosErrorMessage(_context4.t2) : _context4.t2.message;
23645
+ _context4.next = 73;
23470
23646
  return put(workspaceListActions.onErrorWorkspacePresetAction({
23471
23647
  error: {
23472
23648
  type: WorkspaceListErrorType.GENERIC,
23473
23649
  message: message
23474
23650
  }
23475
23651
  }));
23476
- case 40:
23652
+ case 73:
23477
23653
  case "end":
23478
- return _context3.stop();
23654
+ return _context4.stop();
23479
23655
  }
23480
- }, _callee3, null, [[3, 35]]);
23656
+ }, _callee3, null, [[3, 68]]);
23481
23657
  })();
23482
23658
  }
23483
23659
  function rootSaga$1() {
23484
- return _regeneratorRuntime().wrap(function rootSaga$(_context4) {
23485
- while (1) switch (_context4.prev = _context4.next) {
23660
+ return _regeneratorRuntime().wrap(function rootSaga$(_context5) {
23661
+ while (1) switch (_context5.prev = _context5.next) {
23486
23662
  case 0:
23487
- _context4.next = 2;
23663
+ _context5.next = 2;
23488
23664
  return takeLeading$1(workspaceListActions.fetchWorkspaceList.type, fetchWorkspaceListSaga);
23489
23665
  case 2:
23490
- _context4.next = 4;
23666
+ _context5.next = 4;
23491
23667
  return takeLatest$1(workspaceListActions.onSuccessWorkspacePresetAction, onSuccessWorkspacePresetsActionSaga);
23492
23668
  case 4:
23493
- _context4.next = 6;
23669
+ _context5.next = 6;
23494
23670
  return takeLatest$1(workspaceListActions.submitFormWorkspaceActionDialogOptions, submitFormWorkspaceDialogSaga);
23495
23671
  case 6:
23496
23672
  case "end":
23497
- return _context4.stop();
23673
+ return _context5.stop();
23498
23674
  }
23499
- }, _marked$1);
23675
+ }, _marked2$1);
23500
23676
  }
23501
23677
 
23502
23678
  var _marked = /*#__PURE__*/_regeneratorRuntime().mark(fetchInitialViewPresetsSaga),
@@ -30844,20 +31020,39 @@ var WorkspaceWrapperProvider = withEggs([].concat(_toConsumableArray$1(coreModul
30844
31020
  theme: theme
30845
31021
  }, children);
30846
31022
  });
31023
+ var defaultAuthConfig = {
31024
+ isLoggedIn: true,
31025
+ auth: {
31026
+ username: 'user.name',
31027
+ token: '1223344',
31028
+ refresh_token: '33455214'
31029
+ },
31030
+ onLogin: function onLogin() {
31031
+ return null;
31032
+ },
31033
+ onSetAuth: function onSetAuth() {
31034
+ return null;
31035
+ },
31036
+ sessionStorageProvider: null
31037
+ };
30847
31038
  var WorkspaceWrapperProviderWithStore = function WorkspaceWrapperProviderWithStore(_ref3) {
30848
31039
  var children = _ref3.children,
30849
31040
  store = _ref3.store,
30850
31041
  _ref3$createApi = _ref3.createApi,
30851
31042
  createApi$1 = _ref3$createApi === void 0 ? createApi : _ref3$createApi,
30852
- theme = _ref3.theme;
30853
- return /*#__PURE__*/React__default.createElement(ApiProvider, {
31043
+ theme = _ref3.theme,
31044
+ _ref3$auth = _ref3.auth,
31045
+ auth = _ref3$auth === void 0 ? defaultAuthConfig : _ref3$auth;
31046
+ return /*#__PURE__*/React__default.createElement(AuthenticationProvider, {
31047
+ value: auth
31048
+ }, /*#__PURE__*/React__default.createElement(ApiProvider, {
30854
31049
  createApi: createApi$1,
30855
31050
  name: API_NAME
30856
31051
  }, /*#__PURE__*/React__default.createElement(Provider, {
30857
31052
  store: store
30858
31053
  }, /*#__PURE__*/React__default.createElement(WorkspaceWrapperProvider, {
30859
31054
  theme: theme
30860
- }, /*#__PURE__*/React__default.createElement(SnackbarWrapperConnect, null, children))));
31055
+ }, /*#__PURE__*/React__default.createElement(SnackbarWrapperConnect, null, children)))));
30861
31056
  };
30862
31057
 
30863
31058
  /* *
@@ -30884,7 +31079,7 @@ var WorkspaceModuleProvider = function WorkspaceModuleProvider(_ref) {
30884
31079
  return /*#__PURE__*/React.createElement(ApiProvider, {
30885
31080
  auth: auth,
30886
31081
  onSetAuth: onSetAuth,
30887
- createApi: config.baseURL ? createApi$1 : createApiWithoutSave,
31082
+ createApi: config.baseURL ? createApi$1 : createApi,
30888
31083
  config: config,
30889
31084
  name: API_NAME
30890
31085
  }, /*#__PURE__*/React.createElement(WorkspaceDndProvider, null, children));
@@ -31022,12 +31217,12 @@ var WorkspaceControls = function WorkspaceControls(_ref) {
31022
31217
  "data-testid": "open-viewpresets",
31023
31218
  sx: Object.assign(Object.assign({}, buttonStyle), {
31024
31219
  '&&': {
31025
- backgroundColor: !isViewPresetDialogOpen && 'transparent',
31220
+ backgroundColor: !isViewPresetDialogOpen ? 'transparent' : undefined,
31026
31221
  '&:hover': {
31027
31222
  backgroundColor: 'geowebColors.workspace.tabButtonHover'
31028
31223
  },
31029
31224
  '.MuiSvgIcon-root > path': {
31030
- fill: isViewPresetDialogOpen && theme.palette.geowebColors.iconButtons.tool.active.color
31225
+ fill: isViewPresetDialogOpen ? theme.palette.geowebColors.iconButtons.tool.active.color : undefined
31031
31226
  }
31032
31227
  }
31033
31228
  }),
@@ -31249,11 +31444,13 @@ var getPresetIcon = function getPresetIcon(preset) {
31249
31444
  };
31250
31445
  var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
31251
31446
  var workspacePreset = _ref.workspacePreset,
31252
- currentSelectedId = _ref.currentSelectedId,
31447
+ isSelected = _ref.isSelected,
31253
31448
  onClickPreset = _ref.onClickPreset,
31254
31449
  onClickWorkspacePresetOption = _ref.onClickWorkspacePresetOption,
31255
31450
  _ref$isOptionsMenuOpe = _ref.isOptionsMenuOpen,
31256
31451
  isOptionsMenuOpen = _ref$isOptionsMenuOpe === void 0 ? false : _ref$isOptionsMenuOpe,
31452
+ _ref$isEditable = _ref.isEditable,
31453
+ isEditable = _ref$isEditable === void 0 ? false : _ref$isEditable,
31257
31454
  _ref$searchQuery = _ref.searchQuery,
31258
31455
  searchQuery = _ref$searchQuery === void 0 ? '' : _ref$searchQuery;
31259
31456
  var onDuplicate = function onDuplicate() {
@@ -31288,7 +31485,7 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
31288
31485
  }
31289
31486
  }, /*#__PURE__*/React__default.createElement(ListItemButton, {
31290
31487
  "data-testid": "workspacePresetsListItem",
31291
- selected: currentSelectedId === workspacePreset.id,
31488
+ selected: isSelected,
31292
31489
  onClick: function onClick() {
31293
31490
  onClickPreset(workspacePreset.id);
31294
31491
  },
@@ -31309,7 +31506,7 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
31309
31506
  sx: {
31310
31507
  margin: 0
31311
31508
  }
31312
- })), /*#__PURE__*/React__default.createElement(Grid, {
31509
+ })), isEditable && /*#__PURE__*/React__default.createElement(Grid, {
31313
31510
  sx: {
31314
31511
  minWidth: 56,
31315
31512
  marginLeft: 2
@@ -31373,6 +31570,7 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref) {
31373
31570
  onClickPreset = _ref.onClickPreset,
31374
31571
  onClickWorkspacePresetOption = _ref.onClickWorkspacePresetOption,
31375
31572
  hideNewWorkspace = _ref.hideNewWorkspace,
31573
+ isLoggedIn = _ref.isLoggedIn,
31376
31574
  searchQuery = _ref.searchQuery,
31377
31575
  _ref$newPreset = _ref.newPreset,
31378
31576
  newPreset = _ref$newPreset === void 0 ? emptyWorkspaceListItem : _ref$newPreset;
@@ -31386,17 +31584,19 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref) {
31386
31584
  }, workspacePresets.length, " results"), /*#__PURE__*/React.createElement(List, null, !hideNewWorkspace && /*#__PURE__*/React.createElement(WorkspaceSelectListRow, {
31387
31585
  key: newPreset.id,
31388
31586
  workspacePreset: newPreset,
31389
- currentSelectedId: currentSelectedId,
31390
31587
  onClickPreset: onClickPreset,
31391
- onClickWorkspacePresetOption: onClickWorkspacePresetOption
31588
+ onClickWorkspacePresetOption: onClickWorkspacePresetOption,
31589
+ isSelected: currentSelectedId === '' || currentSelectedId === undefined,
31590
+ isEditable: isLoggedIn
31392
31591
  }), workspacePresets.map(function (preset) {
31393
31592
  return /*#__PURE__*/React.createElement(WorkspaceSelectListRow, {
31394
31593
  key: preset.id,
31395
31594
  workspacePreset: preset,
31396
- currentSelectedId: currentSelectedId,
31397
31595
  onClickPreset: onClickPreset,
31398
31596
  onClickWorkspacePresetOption: onClickWorkspacePresetOption,
31399
- searchQuery: searchQuery
31597
+ isEditable: isLoggedIn,
31598
+ searchQuery: searchQuery,
31599
+ isSelected: currentSelectedId === preset.id
31400
31600
  });
31401
31601
  })));
31402
31602
  };
@@ -31439,6 +31639,8 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
31439
31639
  var isViewPresetsListFetching = useSelector(function (store) {
31440
31640
  return getViewPresetsIsFetching(store, panelId);
31441
31641
  });
31642
+ var _useAuthenticationCon = useAuthenticationContext(),
31643
+ isLoggedIn = _useAuthenticationCon.isLoggedIn;
31442
31644
  var dispatch = useDispatch();
31443
31645
  var openViewPresetsDialog = React.useCallback(function (viewPresetDialogOptions) {
31444
31646
  dispatch(viewPresetActions.openViewPresetDialog({
@@ -31518,7 +31720,8 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
31518
31720
  newPreset: Object.assign(Object.assign({}, emptyWorkspaceListItem), {
31519
31721
  id: undefined,
31520
31722
  title: MAPPRESET_ACTIVE_TITLE
31521
- })
31723
+ }),
31724
+ isLoggedIn: isLoggedIn
31522
31725
  }));
31523
31726
  };
31524
31727
 
@@ -31587,6 +31790,7 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
31587
31790
  isDefaultOpen = _ref$isDefaultOpen === void 0 ? false : _ref$isDefaultOpen,
31588
31791
  handleSave = _ref.handleSave,
31589
31792
  handleSaveAs = _ref.handleSaveAs,
31793
+ handleSaveAll = _ref.handleSaveAll,
31590
31794
  handleEdit = _ref.handleEdit,
31591
31795
  handleDelete = _ref.handleDelete,
31592
31796
  _ref$hasChanges = _ref.hasChanges,
@@ -31609,6 +31813,22 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
31609
31813
  setAnchorEl(document.getElementById(id));
31610
31814
  }
31611
31815
  }, [isDefaultOpen, id]);
31816
+ var options = [{
31817
+ title: 'Save',
31818
+ callback: handleSave
31819
+ }, {
31820
+ title: 'Save as',
31821
+ callback: handleSaveAs
31822
+ }].concat(_toConsumableArray$1(handleSaveAll ? [{
31823
+ title: 'Save all',
31824
+ callback: handleSaveAll
31825
+ }] : []), [{
31826
+ title: 'Edit',
31827
+ callback: handleEdit
31828
+ }, {
31829
+ title: 'Delete',
31830
+ callback: handleDelete
31831
+ }]);
31612
31832
  var renderButton = function renderButton() {
31613
31833
  return /*#__PURE__*/React.createElement(CustomToggleButton, {
31614
31834
  variant: "tool",
@@ -31621,8 +31841,8 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
31621
31841
  sx: {
31622
31842
  fontSize: '12px',
31623
31843
  '&&': {
31624
- color: activeTab && !isOpen && 'geowebColors.buttons.icon.active.color',
31625
- backgroundColor: !isOpen && 'transparent',
31844
+ color: activeTab && !isOpen ? 'geowebColors.buttons.icon.active.color' : undefined,
31845
+ backgroundColor: !isOpen ? 'transparent' : undefined,
31626
31846
  '&:hover': {
31627
31847
  color: activeTab ? 'geowebColors.buttons.icon.active.color' : 'inherit',
31628
31848
  backgroundColor: 'geowebColors.workspace.tabButtonHover'
@@ -31631,7 +31851,7 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
31631
31851
  display: 'block',
31632
31852
  width: '100%',
31633
31853
  height: 24,
31634
- fontStyle: hasChanges && 'italic',
31854
+ fontStyle: hasChanges ? 'italic' : undefined,
31635
31855
  fontWeight: 500,
31636
31856
  textOverflow: 'ellipsis',
31637
31857
  overflow: 'hidden',
@@ -31683,19 +31903,15 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
31683
31903
  letterSpacing: '0.4px',
31684
31904
  fontSize: 12
31685
31905
  }
31686
- }, "Options")), /*#__PURE__*/React.createElement(MenuItem, {
31687
- onClick: handleSave,
31688
- disabled: !handleSave
31689
- }, "Save"), /*#__PURE__*/React.createElement(MenuItem, {
31690
- onClick: handleSaveAs,
31691
- disabled: !handleSaveAs
31692
- }, "Save as"), /*#__PURE__*/React.createElement(MenuItem, {
31693
- onClick: handleEdit,
31694
- disabled: !handleEdit
31695
- }, "Edit"), /*#__PURE__*/React.createElement(MenuItem, {
31696
- onClick: handleDelete,
31697
- disabled: !handleDelete
31698
- }, "Delete")));
31906
+ }, "Options")), options.map(function (_ref2) {
31907
+ var title = _ref2.title,
31908
+ callback = _ref2.callback;
31909
+ return /*#__PURE__*/React.createElement(MenuItem, {
31910
+ key: title,
31911
+ onClick: callback,
31912
+ disabled: !callback
31913
+ }, title);
31914
+ })));
31699
31915
  };
31700
31916
  return isDisabled ? renderButton() : /*#__PURE__*/React.createElement(CustomTooltip, {
31701
31917
  title: !isOpen && title,
@@ -32049,7 +32265,7 @@ var WorkspaceView = function WorkspaceView(_ref) {
32049
32265
  }
32050
32266
  }, /*#__PURE__*/React.createElement(MosaicWithoutDragDropContext, {
32051
32267
  className: "geoweb-mosaic",
32052
- zeroStateView: EmptyView,
32268
+ zeroStateView: EmptyView || undefined,
32053
32269
  initialValue: screenConfig.mosaicNode,
32054
32270
  renderTile: function renderTile(viewId, path) {
32055
32271
  var windowIsActive = viewId === activeWindowId;
@@ -35931,6 +36147,8 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
35931
36147
  var error = useSelector(function (store) {
35932
36148
  return getWorkspaceListError(store);
35933
36149
  });
36150
+ var _useAuthenticationCon = useAuthenticationContext(),
36151
+ isLoggedIn = _useAuthenticationCon.isLoggedIn;
35934
36152
  var dispatch = useDispatch();
35935
36153
  var fetchWorkspaceList = React.useCallback(function () {
35936
36154
  var filterParams = constructFilterParams(workspaceListFilters, workspaceSearchQuery);
@@ -36069,6 +36287,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
36069
36287
  onClickPreset: onClickWorkspace,
36070
36288
  onClickWorkspacePresetOption: onClickWorkspacePresetOption,
36071
36289
  hideNewWorkspace: shouldHideNewWorkspace,
36290
+ isLoggedIn: isLoggedIn,
36072
36291
  searchQuery: workspaceSearchQuery
36073
36292
  }));
36074
36293
  };
@@ -36166,7 +36385,7 @@ var WorkspaceMenuButton = function WorkspaceMenuButton(_ref) {
36166
36385
  variant: "tool",
36167
36386
  sx: {
36168
36387
  '&&': {
36169
- backgroundColor: !showMenu && 'transparent',
36388
+ backgroundColor: !showMenu ? 'transparent' : undefined,
36170
36389
  '&:hover': {
36171
36390
  backgroundColor: 'geowebColors.workspace.tabButtonHover'
36172
36391
  }
@@ -36248,6 +36467,8 @@ var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
36248
36467
  activeTab = _ref.activeTab,
36249
36468
  workspaceId = _ref.workspaceId;
36250
36469
  var dispatch = useDispatch();
36470
+ var _useAuthenticationCon = useAuthenticationContext(),
36471
+ isLoggedIn = _useAuthenticationCon.isLoggedIn;
36251
36472
  var hasChanges = useSelector(function (store) {
36252
36473
  return hasWorkspaceChanges(store);
36253
36474
  });
@@ -36281,6 +36502,15 @@ var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
36281
36502
  })
36282
36503
  });
36283
36504
  };
36505
+ var onSaveAll = function onSaveAll() {
36506
+ setWorkspaceActionDialogOptions({
36507
+ action: WorkspacePresetAction.SAVE_ALL,
36508
+ presetId: workspaceId,
36509
+ formValues: Object.assign(Object.assign({}, workspaceData), {
36510
+ scope: 'user'
36511
+ })
36512
+ });
36513
+ };
36284
36514
  var onSave = React.useCallback(function () {
36285
36515
  dispatch(workspaceActions.saveWorkspacePreset({
36286
36516
  workspace: workspaceData
@@ -36293,8 +36523,9 @@ var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
36293
36523
  activeTab: activeTab,
36294
36524
  handleDelete: workspaceScope === 'user' ? onDelete : undefined,
36295
36525
  handleSaveAs: onSaveAs,
36526
+ handleSaveAll: onSaveAll,
36296
36527
  handleSave: workspaceScope === 'user' ? onSave : undefined,
36297
- isDisabled: !viewIds.length
36528
+ isDisabled: !viewIds.length || !isLoggedIn
36298
36529
  });
36299
36530
  };
36300
36531
 
@@ -36420,7 +36651,9 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
36420
36651
  event.preventDefault();
36421
36652
  onSubmit();
36422
36653
  };
36423
- var hasFormInput = action === WorkspacePresetAction.DUPLICATE || action === WorkspacePresetAction.SAVE_AS;
36654
+ var hasFormInput = action === WorkspacePresetAction.DUPLICATE || action === WorkspacePresetAction.SAVE_AS || action === WorkspacePresetAction.SAVE_ALL;
36655
+ // disable form inputs for 'save all' existing workspace preset
36656
+ var isDisabled = !!(action === WorkspacePresetAction.SAVE_ALL && formValues.id);
36424
36657
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, Boolean(error) && /*#__PURE__*/React__default.createElement(Box$2, {
36425
36658
  sx: {
36426
36659
  marginBottom: 2
@@ -36443,6 +36676,7 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
36443
36676
  validateTitle: validateTitle$1
36444
36677
  }
36445
36678
  },
36679
+ disabled: isDisabled,
36446
36680
  defaultValue: title
36447
36681
  })), /*#__PURE__*/React__default.createElement(ReactHookFormTextField, {
36448
36682
  name: "abstract",
@@ -36452,6 +36686,7 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
36452
36686
  },
36453
36687
  multiline: true,
36454
36688
  rows: 3,
36689
+ disabled: isDisabled,
36455
36690
  defaultValue: _abstract
36456
36691
  }), hiddenFields.map(function (_ref2) {
36457
36692
  var name = _ref2.name,
@@ -36486,6 +36721,7 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
36486
36721
  * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
36487
36722
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
36488
36723
  * */
36724
+ var DIALOG_TITLE_SAVE_ALL = 'Save all';
36489
36725
  var getDialogTitle = function getDialogTitle(action) {
36490
36726
  switch (action) {
36491
36727
  case WorkspacePresetAction.DELETE:
@@ -36496,6 +36732,10 @@ var getDialogTitle = function getDialogTitle(action) {
36496
36732
  {
36497
36733
  return 'Duplicate';
36498
36734
  }
36735
+ case WorkspacePresetAction.SAVE_ALL:
36736
+ {
36737
+ return DIALOG_TITLE_SAVE_ALL;
36738
+ }
36499
36739
  default:
36500
36740
  {
36501
36741
  return 'Save as';
@@ -36508,8 +36748,11 @@ var getConfirmLabel$1 = function getConfirmLabel(action) {
36508
36748
  {
36509
36749
  return 'Delete';
36510
36750
  }
36751
+ case WorkspacePresetAction.SAVE_ALL:
36752
+ {
36753
+ return DIALOG_TITLE_SAVE_ALL;
36754
+ }
36511
36755
  default:
36512
- case WorkspacePresetAction.DUPLICATE:
36513
36756
  {
36514
36757
  return 'Save';
36515
36758
  }
@@ -36606,12 +36849,12 @@ var WorkspaceTabConnect = function WorkspaceTabConnect(_ref) {
36606
36849
  }), Boolean(dialogDetails) && /*#__PURE__*/React.createElement(WorkspacePresetsFormDialogWrapper, {
36607
36850
  isOpen: Boolean(dialogDetails),
36608
36851
  onClose: closeWorkspaceActionDialog,
36609
- presetId: presetId,
36610
- action: action,
36611
- formValues: formValues,
36852
+ presetId: presetId || undefined,
36853
+ action: action || undefined,
36854
+ formValues: formValues || undefined,
36612
36855
  onFormSubmit: onSubmitForm,
36613
36856
  isLoading: isFetching,
36614
- error: error
36857
+ error: error || undefined
36615
36858
  }));
36616
36859
  };
36617
36860
 
@@ -36736,11 +36979,12 @@ var getConfirmLabel = function getConfirmLabel(action) {
36736
36979
  {
36737
36980
  return 'Delete';
36738
36981
  }
36739
- default:
36740
36982
  case PresetAction.SAVE_AS:
36741
36983
  {
36742
36984
  return 'Save';
36743
36985
  }
36986
+ default:
36987
+ return 'Save';
36744
36988
  }
36745
36989
  };
36746
36990
  var MapPresetsFormDialog = function MapPresetsFormDialog(_ref) {
@@ -37039,4 +37283,4 @@ var WorkspaceDetail = function WorkspaceDetail(_ref) {
37039
37283
  }))), /*#__PURE__*/React.createElement(MapPresetsFormDialogConnect, null));
37040
37284
  };
37041
37285
 
37042
- export { ComponentsLookUpWrapper, WorkspaceDetail, WorkspaceDndProvider, WorkspaceErrorType, WorkspaceModuleProvider, WorkspacePresetAction, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProvider, WorkspaceWrapperProviderWithStore, workspaceActions as actions, createBalancedMosaicNode, emptyMapWorkspace, getWorkspaceRouteUrl, selectors, viewPresetActions, workspaceListActions, workspaceModuleConfig, routes as workspaceRoutes };
37286
+ export { ComponentsLookUpWrapper, WorkspaceDetail, WorkspaceDndProvider, WorkspaceErrorType, WorkspaceModuleProvider, WorkspacePresetAction, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProvider, WorkspaceWrapperProviderWithStore, workspaceActions as actions, createBalancedMosaicNode, defaultAuthConfig, emptyMapWorkspace, getWorkspaceRouteUrl, selectors, viewPresetActions, workspaceListActions, workspaceModuleConfig, routes as workspaceRoutes };