@opengeoweb/workspace 14.0.0 → 14.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.esm.js CHANGED
@@ -1,12 +1,12 @@
1
- import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware, combineReducers, configureStore } from '@reduxjs/toolkit';
1
+ import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware, isAnyOf, combineReducers, configureStore } from '@reduxjs/toolkit';
2
2
  import { syncGroupsTypes, syncGroupsActions, layerActions, mapActions, uiActions, genericActions, layerTypes, mapEnums, selectorMemoizationOptions, genericSelectors, mapSelectors, syncGroupsSelectors, routerActions, createViewObjectForNewMap, mapListener, serviceListener, layersListener, syncGroupsListener, openlayersListener, uiReducer, loadingIndicatorReducer, syncGroupsReducer, layerReducer, serviceReducer, mapReducer, loadingIndicatorSelectors, uiTypes, linkComponentTypesConstants, uiSelectors } from '@opengeoweb/store';
3
3
  import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, getHeaders, handleResponse, useApiContext, useAuthenticationContext as useAuthenticationContext$1, GEOWEB_ROLE_PRESETS_ADMIN as GEOWEB_ROLE_PRESETS_ADMIN$1 } from '@opengeoweb/api';
4
4
  import { chunk, cloneDeep, union, pick, isEmpty, isEqual, isString } from 'lodash';
5
5
  import { getLeaves, createBalancedTreeFromLeaves, MosaicContext, getAndAssertNodeAtPathExists, MosaicWindow, Mosaic } from 'react-mosaic-component';
6
6
  import { timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer } from '@opengeoweb/time-series';
7
7
  import { publicWarningActions, warningsTranslations, WARN_NAMESPACE, publicWarningsSelectors } from '@opengeoweb/warnings';
8
- import { PROJECTION, getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, ConfirmationServiceProvider, usePrevious, AlertBanner, sessionStorageProvider, SystemScope, CustomTooltip, SearchHighlight, ToggleMenu, CustomIconButton, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, useConfirmationDialog, ConfirmationButtons } from '@opengeoweb/shared';
9
8
  import { snackbarTypes, snackbarActions, snackbarListener, snackbarReducer, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
9
+ import { getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, ConfirmationServiceProvider, usePrevious, AlertBanner, sessionStorageProvider, SystemScope, CustomTooltip, SearchHighlight, ToggleMenu, CustomIconButton, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, useConfirmationDialog, ConfirmationButtons } from '@opengeoweb/shared';
10
10
  import { isAxiosError } from 'axios';
11
11
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
12
12
  import { ThemeWrapper, lightTheme, SharedPresetsMyUser, SharedPresetsOtherUsers, Delete, Preset, PresetWorkspace, PresetTiles, CloudLoading, CloudIdle, Options, Link, LinkOff, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, WebAssetOff, Exclamation } from '@opengeoweb/theme';
@@ -1705,16 +1705,6 @@ function getEmptyMapWorkspace(t) {
1705
1705
  componentType: 'Map',
1706
1706
  initialProps: {
1707
1707
  mapPreset: {
1708
- layers: [],
1709
- proj: {
1710
- bbox: {
1711
- left: 58703.6377,
1712
- bottom: 6408480.4514,
1713
- right: 3967387.5161,
1714
- top: 11520588.9031
1715
- },
1716
- srs: PROJECTION.EPSG_3857.value
1717
- },
1718
1708
  shouldShowLayerManager: true,
1719
1709
  dockedLayerManagerSize: 'sizeSmall'
1720
1710
  },
@@ -1737,16 +1727,6 @@ var getEmptyWorkspacePreset = function getEmptyWorkspacePreset() {
1737
1727
  componentType: 'Map',
1738
1728
  initialProps: {
1739
1729
  mapPreset: {
1740
- layers: [],
1741
- proj: {
1742
- bbox: {
1743
- left: 58703.6377,
1744
- bottom: 6408480.4514,
1745
- right: 3967387.5161,
1746
- top: 11520588.9031
1747
- },
1748
- srs: PROJECTION.EPSG_3857.value
1749
- },
1750
1730
  shouldShowLayerManager: true,
1751
1731
  dockedLayerManagerSize: 'sizeSmall'
1752
1732
  },
@@ -4908,21 +4888,23 @@ workspaceListener.startListening({
4908
4888
  }()
4909
4889
  });
4910
4890
  workspaceListener.startListening({
4911
- actionCreator: workspaceActions.fetchWorkspace,
4891
+ matcher: isAnyOf(workspaceActions.fetchWorkspace, routerActions.navigateBackOrForward),
4912
4892
  effect: function () {
4913
- var _effect5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7(_ref6, listenerApi) {
4893
+ var _effect5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7(action, listenerApi) {
4914
4894
  var payload, workspaceId, workspaceApi, _yield$workspaceApi$g2, workspaceData, fullLoadingWorkspace, workspaceIdsInBatches, actionsToDispatch, errorType;
4915
4895
  return _regeneratorRuntime().wrap(function _callee7$(_context7) {
4916
4896
  while (1) switch (_context7.prev = _context7.next) {
4917
4897
  case 0:
4918
- payload = _ref6.payload;
4919
4898
  // Cancel any in-progress instances of this listener
4920
4899
  listenerApi.cancelActiveListeners();
4900
+ payload = action.payload;
4921
4901
  workspaceId = payload.workspaceId;
4922
4902
  _context7.prev = 3;
4923
- listenerApi.dispatch(routerActions.navigateToUrl({
4924
- url: getWorkspaceRouteUrl(workspaceId)
4925
- }));
4903
+ if (action.type === workspaceActions.fetchWorkspace.type) {
4904
+ listenerApi.dispatch(routerActions.navigateToUrl({
4905
+ url: getWorkspaceRouteUrl(workspaceId)
4906
+ }));
4907
+ }
4926
4908
  listenerApi.dispatch(workspaceListActions.toggleWorkspaceDialog({
4927
4909
  isWorkspaceListDialogOpen: false
4928
4910
  }));
@@ -4953,7 +4935,7 @@ workspaceListener.startListening({
4953
4935
  actionsToDispatch = [];
4954
4936
  _context7.next = 20;
4955
4937
  return Promise.all(workspaceIdsInBatches.map(/*#__PURE__*/function () {
4956
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(batchCall) {
4938
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(batchCall) {
4957
4939
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
4958
4940
  while (1) switch (_context6.prev = _context6.next) {
4959
4941
  case 0:
@@ -4970,7 +4952,7 @@ workspaceListener.startListening({
4970
4952
  }, _callee6);
4971
4953
  }));
4972
4954
  return function (_x12) {
4973
- return _ref7.apply(this, arguments);
4955
+ return _ref6.apply(this, arguments);
4974
4956
  };
4975
4957
  }()));
4976
4958
  case 20:
@@ -5004,12 +4986,12 @@ workspaceListener.startListening({
5004
4986
  workspaceListener.startListening({
5005
4987
  actionCreator: workspaceActions.saveWorkspacePreset,
5006
4988
  effect: function () {
5007
- var _effect6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8(_ref8, listenerApi) {
4989
+ var _effect6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8(_ref7, listenerApi) {
5008
4990
  var payload, workspace, workspaceApi;
5009
4991
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
5010
4992
  while (1) switch (_context8.prev = _context8.next) {
5011
4993
  case 0:
5012
- payload = _ref8.payload;
4994
+ payload = _ref7.payload;
5013
4995
  // Cancel any in-progress instances of this listener
5014
4996
  listenerApi.cancelActiveListeners();
5015
4997
  workspace = payload.workspace;
@@ -5078,12 +5060,12 @@ workspaceListener.startListening({
5078
5060
  workspaceListener.startListening({
5079
5061
  actionCreator: workspaceActions.setNewWorkspaceView,
5080
5062
  effect: function () {
5081
- var _effect8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0(_ref9, listenerApi) {
5063
+ var _effect8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0(_ref8, listenerApi) {
5082
5064
  var payload, mosaicNodeId, componentType, newId, bbox, srs, mapPreset;
5083
5065
  return _regeneratorRuntime().wrap(function _callee0$(_context0) {
5084
5066
  while (1) switch (_context0.prev = _context0.next) {
5085
5067
  case 0:
5086
- payload = _ref9.payload;
5068
+ payload = _ref8.payload;
5087
5069
  mosaicNodeId = payload.mosaicNodeId, componentType = payload.componentType, newId = payload.newId; // TODO: this would be nice to move into the openlayers store
5088
5070
  createViewObjectForNewMap(mosaicNodeId, newId);
5089
5071
  // Note, at some point these might no longer be necessary
@@ -5278,6 +5260,100 @@ var getWorkspaceListSearchQuery = createSelector(getWorkspaceListStore, function
5278
5260
  return (state == null ? void 0 : state.searchQuery) || '';
5279
5261
  }, selectorMemoizationOptions);
5280
5262
 
5263
+ /* *
5264
+ * Licensed under the Apache License, Version 2.0 (the "License");
5265
+ * you may not use this file except in compliance with the License.
5266
+ * You may obtain a copy of the License at
5267
+ *
5268
+ * http://www.apache.org/licenses/LICENSE-2.0
5269
+ *
5270
+ * Unless required by applicable law or agreed to in writing, software
5271
+ * distributed under the License is distributed on an "AS IS" BASIS,
5272
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5273
+ * See the License for the specific language governing permissions and
5274
+ * limitations under the License.
5275
+ *
5276
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5277
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
5278
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
5279
+ * */
5280
+ var viewPresetsListAdapter = createEntityAdapter();
5281
+ var initialState = viewPresetsListAdapter.getInitialState();
5282
+ var slice = createSlice({
5283
+ initialState: initialState,
5284
+ name: 'viewPresetsList',
5285
+ reducers: {
5286
+ fetchViewPresetsList: function fetchViewPresetsList(_draft, _action) {
5287
+ // action is intercepted in viewPresets/listener
5288
+ },
5289
+ fetchedViewPresetsList: function fetchedViewPresetsList(draft, action) {
5290
+ var viewPresets = action.payload.viewPresets;
5291
+ if (!viewPresets || !viewPresets.length) {
5292
+ viewPresetsListAdapter.removeAll(draft);
5293
+ return;
5294
+ }
5295
+ viewPresetsListAdapter.setAll(draft, viewPresets);
5296
+ }
5297
+ },
5298
+ extraReducers: function extraReducers(builder) {
5299
+ builder.addCase(viewPresetActions.fetchedViewPresets, function (draft, action) {
5300
+ var _action$payload = action.payload,
5301
+ viewPresets = _action$payload.viewPresets,
5302
+ filterParams = _action$payload.filterParams;
5303
+ // If there are filter params applied, don't do anything, these results are put in the specific panel filterResults
5304
+ var hasFilterParams = Object.keys(filterParams).length !== 0;
5305
+ var isDefaultScopeOnly = Object.keys(filterParams).length === 1 && filterParams.scope === 'user,system';
5306
+ if (hasFilterParams && !isDefaultScopeOnly) {
5307
+ return;
5308
+ }
5309
+ if (!viewPresets || !viewPresets.length) {
5310
+ viewPresetsListAdapter.removeAll(draft);
5311
+ return;
5312
+ }
5313
+ viewPresetsListAdapter.setAll(draft, action.payload.viewPresets);
5314
+ });
5315
+ }
5316
+ });
5317
+ var viewPresetsListReducer = slice.reducer,
5318
+ viewPresetsListActions = slice.actions;
5319
+
5320
+ /* *
5321
+ * Licensed under the Apache License, Version 2.0 (the "License");
5322
+ * you may not use this file except in compliance with the License.
5323
+ * You may obtain a copy of the License at
5324
+ *
5325
+ * http://www.apache.org/licenses/LICENSE-2.0
5326
+ *
5327
+ * Unless required by applicable law or agreed to in writing, software
5328
+ * distributed under the License is distributed on an "AS IS" BASIS,
5329
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5330
+ * See the License for the specific language governing permissions and
5331
+ * limitations under the License.
5332
+ *
5333
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5334
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
5335
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
5336
+ * */
5337
+ // Used to retrieve the unfiltered, general view preset list.
5338
+ // To ensure you retrieve the view preset list specific for your view, use getFilteredViewPresetListForView
5339
+ var _viewPresetsListAdapt = viewPresetsListAdapter.getSelectors(function (state) {
5340
+ var _state$viewPresetsLis;
5341
+ return (_state$viewPresetsLis = state == null ? void 0 : state.viewPresetsList) != null ? _state$viewPresetsLis : {
5342
+ entities: {},
5343
+ ids: []
5344
+ };
5345
+ }),
5346
+ getViewPresetsList = _viewPresetsListAdapt.selectAll,
5347
+ getViewPresetFromList = _viewPresetsListAdapt.selectById;
5348
+ var getFilteredViewPresetListForView = createSelector(getViewPresetsList, getViewPresetListFilterResultsForView, getViewPresetListSearchQueryForView, function (fullViewPresetsList, filteredResults, searchQuery) {
5349
+ if (searchQuery !== '') {
5350
+ // Search active: return what backend gave us
5351
+ return filteredResults;
5352
+ }
5353
+ // No search: return full unfiltered list
5354
+ return fullViewPresetsList != null ? fullViewPresetsList : [];
5355
+ }, selectorMemoizationOptions);
5356
+
5281
5357
  var processError = function processError(error, component, errorMessageKey) {
5282
5358
  var message = isAxiosError(error) ? getAxiosErrorMessage(error) : errorMessageKey;
5283
5359
  var errorType = isAxiosAuthError(error) ? ViewPresetErrorType.AUTH : ViewPresetErrorType.GENERIC;
@@ -5333,21 +5409,52 @@ viewPresetsListener.startListening({
5333
5409
  return effect;
5334
5410
  }()
5335
5411
  });
5412
+ // fetch full view presets list
5413
+ viewPresetsListener.startListening({
5414
+ actionCreator: viewPresetsListActions.fetchViewPresetsList,
5415
+ effect: function () {
5416
+ var _effect2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_, listenerApi) {
5417
+ var workspaceApi, _yield$workspaceApi$g2, viewPresets;
5418
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5419
+ while (1) switch (_context2.prev = _context2.next) {
5420
+ case 0:
5421
+ listenerApi.cancelActiveListeners();
5422
+ workspaceApi = getWorkspaceApi();
5423
+ _context2.next = 4;
5424
+ return workspaceApi.getViewPresets();
5425
+ case 4:
5426
+ _yield$workspaceApi$g2 = _context2.sent;
5427
+ viewPresets = _yield$workspaceApi$g2.data;
5428
+ listenerApi.dispatch(viewPresetsListActions.fetchedViewPresetsList({
5429
+ viewPresets: viewPresets
5430
+ }));
5431
+ case 7:
5432
+ case "end":
5433
+ return _context2.stop();
5434
+ }
5435
+ }, _callee2);
5436
+ }));
5437
+ function effect(_x3, _x4) {
5438
+ return _effect2.apply(this, arguments);
5439
+ }
5440
+ return effect;
5441
+ }()
5442
+ });
5336
5443
  var saveViewPresetAsEffect = /*#__PURE__*/function () {
5337
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2, listenerApi) {
5444
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref2, listenerApi) {
5338
5445
  var payload, panelId, viewPreset, workspaceApi, viewPresetId;
5339
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5340
- while (1) switch (_context2.prev = _context2.next) {
5446
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5447
+ while (1) switch (_context3.prev = _context3.next) {
5341
5448
  case 0:
5342
5449
  payload = _ref2.payload;
5343
5450
  listenerApi.cancelActiveListeners();
5344
5451
  panelId = payload.panelId, viewPreset = payload.viewPreset;
5345
- _context2.prev = 3;
5452
+ _context3.prev = 3;
5346
5453
  workspaceApi = getWorkspaceApi();
5347
- _context2.next = 7;
5454
+ _context3.next = 7;
5348
5455
  return workspaceApi.saveViewPresetAs(viewPreset);
5349
5456
  case 7:
5350
- viewPresetId = _context2.sent;
5457
+ viewPresetId = _context3.sent;
5351
5458
  listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage(PresetAction.SAVE, viewPreset.title)));
5352
5459
  listenerApi.dispatch(viewPresetActions.savedViewPreset({
5353
5460
  panelId: panelId,
@@ -5358,39 +5465,39 @@ var saveViewPresetAsEffect = /*#__PURE__*/function () {
5358
5465
  viewPresetId: viewPresetId,
5359
5466
  viewPreset: viewPreset
5360
5467
  }));
5361
- return _context2.abrupt("return", Object.assign({}, viewPreset, {
5468
+ return _context3.abrupt("return", Object.assign({}, viewPreset, {
5362
5469
  id: viewPresetId
5363
5470
  }));
5364
5471
  case 14:
5365
- _context2.prev = 14;
5366
- _context2.t0 = _context2["catch"](3);
5472
+ _context3.prev = 14;
5473
+ _context3.t0 = _context3["catch"](3);
5367
5474
  listenerApi.dispatch(viewPresetActions.errorViewPreset({
5368
- error: processError(_context2.t0, ViewPresetErrorComponent.PRESET_DETAIL, 'workspace-mappreset-error-save'),
5475
+ error: processError(_context3.t0, ViewPresetErrorComponent.PRESET_DETAIL, 'workspace-mappreset-error-save'),
5369
5476
  panelId: panelId
5370
5477
  }));
5371
- return _context2.abrupt("return", _context2.t0);
5478
+ return _context3.abrupt("return", _context3.t0);
5372
5479
  case 18:
5373
5480
  case "end":
5374
- return _context2.stop();
5481
+ return _context3.stop();
5375
5482
  }
5376
- }, _callee2, null, [[3, 14]]);
5483
+ }, _callee3, null, [[3, 14]]);
5377
5484
  }));
5378
- return function saveViewPresetAsEffect(_x3, _x4) {
5485
+ return function saveViewPresetAsEffect(_x5, _x6) {
5379
5486
  return _ref3.apply(this, arguments);
5380
5487
  };
5381
5488
  }();
5382
5489
  var saveViewPresetEffect = /*#__PURE__*/function () {
5383
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref4, listenerApi) {
5490
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref4, listenerApi) {
5384
5491
  var payload, panelId, viewPreset, viewPresetId, workspaceApi;
5385
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5386
- while (1) switch (_context3.prev = _context3.next) {
5492
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
5493
+ while (1) switch (_context4.prev = _context4.next) {
5387
5494
  case 0:
5388
5495
  payload = _ref4.payload;
5389
5496
  listenerApi.cancelActiveListeners();
5390
5497
  panelId = payload.panelId, viewPreset = payload.viewPreset, viewPresetId = payload.viewPresetId;
5391
- _context3.prev = 3;
5498
+ _context4.prev = 3;
5392
5499
  workspaceApi = getWorkspaceApi();
5393
- _context3.next = 7;
5500
+ _context4.next = 7;
5394
5501
  return workspaceApi.saveViewPreset(viewPresetId, viewPreset);
5395
5502
  case 7:
5396
5503
  listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage(PresetAction.SAVE, viewPreset.title)));
@@ -5403,23 +5510,23 @@ var saveViewPresetEffect = /*#__PURE__*/function () {
5403
5510
  viewPresetId: viewPresetId,
5404
5511
  viewPreset: viewPreset
5405
5512
  }));
5406
- return _context3.abrupt("return", viewPreset);
5513
+ return _context4.abrupt("return", viewPreset);
5407
5514
  case 13:
5408
- _context3.prev = 13;
5409
- _context3.t0 = _context3["catch"](3);
5515
+ _context4.prev = 13;
5516
+ _context4.t0 = _context4["catch"](3);
5410
5517
  listenerApi.dispatch(viewPresetActions.errorViewPreset({
5411
- error: processError(_context3.t0, ViewPresetErrorComponent.PRESET_DETAIL, 'workspace-mappreset-error-save'),
5518
+ error: processError(_context4.t0, ViewPresetErrorComponent.PRESET_DETAIL, 'workspace-mappreset-error-save'),
5412
5519
  panelId: panelId,
5413
5520
  viewPresetId: viewPresetId
5414
5521
  }));
5415
- return _context3.abrupt("return", _context3.t0);
5522
+ return _context4.abrupt("return", _context4.t0);
5416
5523
  case 17:
5417
5524
  case "end":
5418
- return _context3.stop();
5525
+ return _context4.stop();
5419
5526
  }
5420
- }, _callee3, null, [[3, 13]]);
5527
+ }, _callee4, null, [[3, 13]]);
5421
5528
  }));
5422
- return function saveViewPresetEffect(_x5, _x6) {
5529
+ return function saveViewPresetEffect(_x7, _x8) {
5423
5530
  return _ref5.apply(this, arguments);
5424
5531
  };
5425
5532
  }();
@@ -5432,10 +5539,10 @@ viewPresetsListener.startListening({
5432
5539
  viewPresetsListener.startListening({
5433
5540
  actionCreator: viewPresetActions.selectViewPreset,
5434
5541
  effect: function () {
5435
- var _effect2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref6, listenerApi) {
5542
+ var _effect3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(_ref6, listenerApi) {
5436
5543
  var payload, panelId, _payload$viewPresetId, viewPresetId, isMapAnimating;
5437
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
5438
- while (1) switch (_context4.prev = _context4.next) {
5544
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
5545
+ while (1) switch (_context5.prev = _context5.next) {
5439
5546
  case 0:
5440
5547
  payload = _ref6.payload;
5441
5548
  listenerApi.cancelActiveListeners();
@@ -5471,12 +5578,12 @@ viewPresetsListener.startListening({
5471
5578
  }
5472
5579
  case 6:
5473
5580
  case "end":
5474
- return _context4.stop();
5581
+ return _context5.stop();
5475
5582
  }
5476
- }, _callee4);
5583
+ }, _callee5);
5477
5584
  }));
5478
- function effect(_x7, _x8) {
5479
- return _effect2.apply(this, arguments);
5585
+ function effect(_x9, _x0) {
5586
+ return _effect3.apply(this, arguments);
5480
5587
  }
5481
5588
  return effect;
5482
5589
  }()
@@ -5485,10 +5592,10 @@ viewPresetsListener.startListening({
5485
5592
  viewPresetsListener.startListening({
5486
5593
  actionCreator: viewPresetActions.onSuccessViewPresetAction,
5487
5594
  effect: function () {
5488
- var _effect3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(_ref7, listenerApi) {
5595
+ var _effect4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(_ref7, listenerApi) {
5489
5596
  var payload, action, viewPresetId, title, panelId, is_shared, activeMapPresetId, hasChanges, viewPresetFilters, viewPresetSearchQuery;
5490
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
5491
- while (1) switch (_context5.prev = _context5.next) {
5597
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
5598
+ while (1) switch (_context6.prev = _context6.next) {
5492
5599
  case 0:
5493
5600
  payload = _ref7.payload;
5494
5601
  listenerApi.cancelActiveListeners();
@@ -5505,8 +5612,10 @@ viewPresetsListener.startListening({
5505
5612
  }));
5506
5613
  hasChanges = true;
5507
5614
  }
5508
- // Retrieve new list with current filter and search query
5509
- viewPresetFilters = getViewPresetListFiltersForView(listenerApi.getState(), panelId); // Retrieve new list with current filter
5615
+ // Fetch the full list to update the list store with the latest presets
5616
+ listenerApi.dispatch(viewPresetsListActions.fetchViewPresetsList());
5617
+ // Also retrieve new list with current filter and search query for current panel
5618
+ viewPresetFilters = getViewPresetListFiltersForView(listenerApi.getState(), panelId);
5510
5619
  viewPresetSearchQuery = getViewPresetListSearchQueryForView(listenerApi.getState(), panelId);
5511
5620
  listenerApi.dispatch(viewPresetActions.fetchViewPresets({
5512
5621
  panelId: panelId,
@@ -5529,12 +5638,12 @@ viewPresetsListener.startListening({
5529
5638
  }
5530
5639
  case 5:
5531
5640
  case "end":
5532
- return _context5.stop();
5641
+ return _context6.stop();
5533
5642
  }
5534
- }, _callee5);
5643
+ }, _callee6);
5535
5644
  }));
5536
- function effect(_x9, _x0) {
5537
- return _effect3.apply(this, arguments);
5645
+ function effect(_x1, _x10) {
5646
+ return _effect4.apply(this, arguments);
5538
5647
  }
5539
5648
  return effect;
5540
5649
  }()
@@ -5812,86 +5921,6 @@ workspaceListListener.startListening({
5812
5921
  }()
5813
5922
  });
5814
5923
 
5815
- /* *
5816
- * Licensed under the Apache License, Version 2.0 (the "License");
5817
- * you may not use this file except in compliance with the License.
5818
- * You may obtain a copy of the License at
5819
- *
5820
- * http://www.apache.org/licenses/LICENSE-2.0
5821
- *
5822
- * Unless required by applicable law or agreed to in writing, software
5823
- * distributed under the License is distributed on an "AS IS" BASIS,
5824
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5825
- * See the License for the specific language governing permissions and
5826
- * limitations under the License.
5827
- *
5828
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5829
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
5830
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
5831
- * */
5832
- var viewPresetsListAdapter = createEntityAdapter();
5833
- var initialState = viewPresetsListAdapter.getInitialState();
5834
- var slice = createSlice({
5835
- initialState: initialState,
5836
- name: 'viewPresetsList',
5837
- reducers: {},
5838
- extraReducers: function extraReducers(builder) {
5839
- builder.addCase(viewPresetActions.fetchedViewPresets, function (draft, action) {
5840
- var _action$payload = action.payload,
5841
- viewPresets = _action$payload.viewPresets,
5842
- filterParams = _action$payload.filterParams;
5843
- // If there are filter params applied, don't do anything, these results are put in the specific panel filterResults
5844
- if (Object.keys(filterParams).length !== 0) {
5845
- return;
5846
- }
5847
- if (!viewPresets || !viewPresets.length) {
5848
- viewPresetsListAdapter.removeAll(draft);
5849
- return;
5850
- }
5851
- viewPresetsListAdapter.setAll(draft, action.payload.viewPresets);
5852
- });
5853
- }
5854
- });
5855
- var viewPresetsListReducer = slice.reducer;
5856
- slice.actions;
5857
-
5858
- /* *
5859
- * Licensed under the Apache License, Version 2.0 (the "License");
5860
- * you may not use this file except in compliance with the License.
5861
- * You may obtain a copy of the License at
5862
- *
5863
- * http://www.apache.org/licenses/LICENSE-2.0
5864
- *
5865
- * Unless required by applicable law or agreed to in writing, software
5866
- * distributed under the License is distributed on an "AS IS" BASIS,
5867
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5868
- * See the License for the specific language governing permissions and
5869
- * limitations under the License.
5870
- *
5871
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5872
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
5873
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
5874
- * */
5875
- // Used to retrieve the unfiltered, general view preset list.
5876
- // To ensure you retrieve the view preset list specific for your view, use getFilteredViewPresetListForView
5877
- var _viewPresetsListAdapt = viewPresetsListAdapter.getSelectors(function (state) {
5878
- var _state$viewPresetsLis;
5879
- return (_state$viewPresetsLis = state == null ? void 0 : state.viewPresetsList) != null ? _state$viewPresetsLis : {
5880
- entities: {},
5881
- ids: []
5882
- };
5883
- }),
5884
- getViewPresetsList = _viewPresetsListAdapt.selectAll,
5885
- getViewPresetFromList = _viewPresetsListAdapt.selectById;
5886
- var getFilteredViewPresetListForView = createSelector(getViewPresetsList, getViewPresetListFilterResultsForView, getViewPresetListSearchQueryForView, function (fullViewPresetsList, filteredResults, searchQuery) {
5887
- if (searchQuery !== '') {
5888
- // Search active: return what backend gave us
5889
- return filteredResults;
5890
- }
5891
- // No search: return full unfiltered list
5892
- return fullViewPresetsList != null ? fullViewPresetsList : [];
5893
- }, selectorMemoizationOptions);
5894
-
5895
5924
  /* *
5896
5925
  * Licensed under the Apache License, Version 2.0 (the "License");
5897
5926
  * you may not use this file except in compliance with the License.
@@ -7481,12 +7510,12 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
7481
7510
  return syncGroupsSelectors.getAllTargetGroupsForSource(store, panelId);
7482
7511
  });
7483
7512
  var currentViewPreset = useSelector(function (store) {
7484
- return workspaceView.id ? getViewPresetFromList(store, workspaceView.id) : undefined;
7513
+ return activeViewPresetId ? getViewPresetFromList(store, activeViewPresetId) : undefined;
7485
7514
  });
7486
7515
  var presetAbstract = workspaceView == null ? void 0 : workspaceView["abstract"];
7487
7516
  var isNewActive = activeViewPresetId === '';
7517
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
7488
7518
  var title = workspaceView.title || t('workspace-mappreset-new');
7489
- var viewScope = workspaceView.scope;
7490
7519
  var fullTitle = getPresetTitle(title, hasViewPresetChanges, isNewActive, t);
7491
7520
  var openViewPresetsDialog = React.useCallback(function (viewPresetDialogOptions) {
7492
7521
  dispatch(viewPresetActions.openViewPresetDialog({
@@ -7589,7 +7618,7 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
7589
7618
  renderCounter.count(WorkspaceViewTitleConnectNoMemo.name);
7590
7619
  var viewpresetCreator = (currentViewPreset == null ? void 0 : currentViewPreset.username) || '';
7591
7620
  var isUserPresetCreator = (auth == null ? void 0 : auth.username) === viewpresetCreator;
7592
- var currentViewScope = viewScope || 'system';
7621
+ var currentViewScope = (currentViewPreset == null ? void 0 : currentViewPreset.scope) || 'system';
7593
7622
  var isEnabled = (currentViewScope === 'user' && isUserPresetCreator || isAdmin && currentViewScope === 'system') && activeViewPresetId !== '' && isLoggedIn;
7594
7623
  return (
7595
7624
  // Zero-length string assignment prevents showing title as an empty object '[object Object]'.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/workspace",
3
- "version": "14.0.0",
3
+ "version": "14.1.0",
4
4
  "description": "GeoWeb Workspace library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -9,32 +9,32 @@
9
9
  },
10
10
  "dependencies": {
11
11
  "react-redux": "^9.2.0",
12
- "@opengeoweb/shared": "14.0.0",
13
- "@opengeoweb/store": "14.0.0",
14
- "@opengeoweb/api": "14.0.0",
12
+ "@opengeoweb/shared": "14.1.0",
13
+ "@opengeoweb/store": "14.1.0",
14
+ "@opengeoweb/api": "14.1.0",
15
15
  "react-hook-form": "^7.50.1",
16
- "@opengeoweb/theme": "14.0.0",
16
+ "@opengeoweb/theme": "14.1.0",
17
17
  "@reduxjs/toolkit": "^2.6.1",
18
- "@opengeoweb/snackbar": "14.0.0",
18
+ "@opengeoweb/snackbar": "14.1.0",
19
19
  "react-window": "^1.8.10",
20
20
  "lodash": "^4.17.21",
21
21
  "axios": "^1.7.7",
22
22
  "react-virtualized-auto-sizer": "^1.0.21",
23
23
  "react-mosaic-component": "^6.1.0",
24
- "@opengeoweb/form-fields": "14.0.0",
25
- "@opengeoweb/time-series": "14.0.0",
26
- "@opengeoweb/authentication": "14.0.0",
27
- "@opengeoweb/core": "14.0.0",
28
- "@opengeoweb/taf": "14.0.0",
29
- "@opengeoweb/sigmet-airmet": "14.0.0",
30
- "@opengeoweb/warnings": "14.0.0",
31
- "@opengeoweb/space-weather": "14.0.0",
24
+ "@opengeoweb/form-fields": "14.1.0",
25
+ "@opengeoweb/time-series": "14.1.0",
26
+ "@opengeoweb/authentication": "14.1.0",
27
+ "@opengeoweb/core": "14.1.0",
28
+ "@opengeoweb/taf": "14.1.0",
29
+ "@opengeoweb/sigmet-airmet": "14.1.0",
30
+ "@opengeoweb/warnings": "14.1.0",
31
+ "@opengeoweb/space-weather": "14.1.0",
32
32
  "i18next": "^25.0.1",
33
33
  "react-i18next": "^15.1.1",
34
34
  "@mui/material": "^7.0.1",
35
- "@opengeoweb/webmap-react": "14.0.0",
35
+ "@opengeoweb/webmap-react": "14.1.0",
36
36
  "@tanstack/react-query": "^5.85.5",
37
- "@opengeoweb/soundings": "14.0.0"
37
+ "@opengeoweb/soundings": "14.1.0"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "react": "18",
@@ -1,4 +1,10 @@
1
+ import { Draft, PayloadAction } from '@reduxjs/toolkit';
1
2
  import { ViewPresetListItem, ViewPresetListState } from './types';
2
3
  export declare const viewPresetsListAdapter: import("@reduxjs/toolkit").EntityAdapter<ViewPresetListItem, string>;
3
4
  export declare const initialState: ViewPresetListState;
4
- export declare const viewPresetsListReducer: import("redux").Reducer<ViewPresetListState>, viewPresetsListActions: import("@reduxjs/toolkit").CaseReducerActions<{}, "viewPresetsList">;
5
+ export declare const viewPresetsListReducer: import("redux").Reducer<ViewPresetListState>, viewPresetsListActions: import("@reduxjs/toolkit").CaseReducerActions<{
6
+ fetchViewPresetsList: (_draft: Draft<ViewPresetListState>, _action: PayloadAction) => void;
7
+ fetchedViewPresetsList: (draft: Draft<ViewPresetListState>, action: PayloadAction<{
8
+ viewPresets: ViewPresetListItem[];
9
+ }>) => void;
10
+ }, "viewPresetsList">;
@@ -1,10 +1,11 @@
1
+ import type { TFunction } from 'i18next';
1
2
  import { snackbarTypes } from '@opengeoweb/snackbar';
2
- import { MapPreset } from '@opengeoweb/store';
3
- import { TFunction } from 'i18next';
4
- import { ViewPresetsListFilter } from '../viewPresets/types';
5
- import { FetchViewPresetsListParams } from '../viewPresetsList/types';
6
- import { WorkspacePreset, WorkspacePresetAction, WorkspacePresetListItem } from '../workspace/types';
7
- import { FetchWorkspaceParams, WorkspaceListFilter } from './types';
3
+ import type { MapPreset } from '@opengeoweb/store';
4
+ import type { FetchWorkspaceParams, WorkspaceListFilter } from './types';
5
+ import type { ViewPresetsListFilter } from '../viewPresets/types';
6
+ import type { FetchViewPresetsListParams } from '../viewPresetsList/types';
7
+ import type { WorkspacePreset, WorkspacePresetListItem } from '../workspace/types';
8
+ import { WorkspacePresetAction } from '../workspace/types';
8
9
  export declare const getSnackbarMessage: (action: WorkspacePresetAction, title: string, is_shared?: boolean) => snackbarTypes.TranslatableMessage;
9
10
  export declare function getEmptyWorkspaceListItem(): Omit<WorkspacePresetListItem, 'title'>;
10
11
  export declare function getEmptyWorkspaceListItem(t: TFunction): WorkspacePresetListItem;