@opengeoweb/workspace 4.22.1 → 5.0.1

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