@opengeoweb/workspace 4.20.0 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +4 -4
  2. package/index.d.ts +2 -2
  3. package/index.esm.js +767 -381
  4. package/index.umd.js +766 -376
  5. package/lib/components/DefaultComponentsLookUp/DefaultComponentsLookUp.d.ts +6 -6
  6. package/lib/components/MapPresetsDialog/MapPresetsDialog.d.ts +5 -2
  7. package/lib/components/MapPresetsFormDialog/MapPresetsFormDialog.d.ts +1 -1
  8. package/lib/components/MapPresetsFormDialog/MapPresetsFormDialogConnect.d.ts +3 -0
  9. package/lib/components/MapPresetsMenuItem/MapPresetsMenuItem.d.ts +1 -1
  10. package/lib/components/Providers/Providers.d.ts +4 -4
  11. package/lib/components/Providers/WorkspaceDndProvider.d.ts +2 -2
  12. package/lib/components/WorkspaceFilter/FilterChip.d.ts +3 -2
  13. package/lib/components/WorkspaceFilter/FilterList.d.ts +3 -1
  14. package/lib/components/WorkspaceFilter/SearchField.d.ts +2 -0
  15. package/lib/components/WorkspaceFilter/WorkspaceFilter.d.ts +5 -1
  16. package/lib/components/WorkspaceMenu/WorkspaceMenu.d.ts +1 -1
  17. package/lib/components/WorkspaceMenu/WorkspaceMenu.stories.d.ts +8 -0
  18. package/lib/components/WorkspaceOptions/WorkspaceOptionsConnect.d.ts +3 -0
  19. package/lib/components/WorkspaceSelectList/WorkspaceSelectList.d.ts +2 -0
  20. package/lib/components/WorkspaceSelectList/WorkspaceSelectListRow.d.ts +1 -0
  21. package/lib/components/{ScreenManagerView/ScreenManagerControls.d.ts → WorkspaceView/WorkspaceControls.d.ts} +3 -3
  22. package/lib/components/{ScreenManagerView/ScreenManagerTileConnect.d.ts → WorkspaceView/WorkspaceTileConnect.d.ts} +4 -4
  23. package/lib/components/{ScreenManagerView/ScreenManagerView.d.ts → WorkspaceView/WorkspaceView.d.ts} +4 -4
  24. package/lib/components/WorkspaceView/WorkspaceViewConnect.d.ts +7 -0
  25. package/lib/components/WorkspaceView/index.d.ts +2 -0
  26. package/lib/store/config.d.ts +2 -2
  27. package/lib/store/viewPresets/reducer.d.ts +3 -1
  28. package/lib/store/viewPresets/selectors.d.ts +2 -1
  29. package/lib/store/viewPresets/types.d.ts +16 -1
  30. package/lib/store/workspace/types.d.ts +0 -3
  31. package/lib/store/workspaceList/reducer.d.ts +3 -2
  32. package/lib/store/workspaceList/sagas.d.ts +1 -1
  33. package/lib/store/workspaceList/selectors.d.ts +2 -1
  34. package/lib/store/workspaceList/types.d.ts +9 -3
  35. package/lib/store/workspaceList/utils.d.ts +3 -0
  36. package/lib/utils/api.d.ts +3 -5
  37. package/lib/utils/fakeApi.d.ts +2 -1
  38. package/package.json +13 -13
  39. package/lib/components/Providers/ScreenManagerApiWrapper.d.ts +0 -7
  40. package/lib/components/ScreenManagerView/ScreenManagerViewConnect.d.ts +0 -7
  41. package/lib/components/ScreenManagerView/index.d.ts +0 -2
  42. package/lib/components/WorkspaceFilter/types.d.ts +0 -5
  43. /package/lib/components/{Providers/ScreenManagerApiWrapper.spec.d.ts → MapPresetsFormDialog/MapPresetsFormDialogConnect.spec.d.ts} +0 -0
  44. /package/lib/components/{ScreenManagerView/ScreenManagerControls.spec.d.ts → WorkspaceView/WorkspaceControls.spec.d.ts} +0 -0
  45. /package/lib/components/{ScreenManagerView/ScreenManagerTileConnect.spec.d.ts → WorkspaceView/WorkspaceTileConnect.spec.d.ts} +0 -0
  46. /package/lib/components/{ScreenManagerView/ScreenManagerView.spec.d.ts → WorkspaceView/WorkspaceView.spec.d.ts} +0 -0
  47. /package/lib/components/{ScreenManagerView/ScreenManagerViewConnect.spec.d.ts → WorkspaceView/WorkspaceViewConnect.spec.d.ts} +0 -0
  48. /package/lib/components/{ScreenManagerView → WorkspaceView}/helpers.d.ts +0 -0
  49. /package/lib/components/{ScreenManagerView → WorkspaceView}/helpers.spec.d.ts +0 -0
package/index.esm.js CHANGED
@@ -1,18 +1,18 @@
1
1
  import { createEntityAdapter, createSlice, createSelector } from '@reduxjs/toolkit';
2
- import { chunk, cloneDeep, isEqual, isString } from 'lodash';
2
+ import { chunk, cloneDeep, isEmpty, isEqual, isString } from 'lodash';
3
3
  import { SyncGroups, syncGroupActions, layerActions, mapActions, uiActions, mapTypes, genericSelectors, routerActions, snackbarActions, mapSelectors, uiTypes, SnackbarWrapperConnect, coreModuleConfig, uiSelectors, syncGroupsSelectors } from '@opengeoweb/core';
4
- import { createApiInstance, getApi, createFakeApiInstance, ApiProvider, useApiContext } from '@opengeoweb/api';
4
+ import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, useApiContext } from '@opengeoweb/api';
5
5
  import { getLeaves, MosaicContext, getAndAssertNodeAtPathExists, createBalancedTreeFromLeaves, MosaicWindow, MosaicWithoutDragDropContext } from 'react-mosaic-component';
6
6
  import { debounce, takeEvery, takeLatest, all, put, delay, call, select, takeLeading } from 'redux-saga/effects';
7
7
  import * as React from 'react';
8
8
  import React__default, { createContext, memo, useEffect, isValidElement, cloneElement, createRef, Component, useLayoutEffect, useMemo, useContext, useState, useCallback } from 'react';
9
- import { ThemeWrapper, lightTheme, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, WebAssetOff, Delete, Preset, PresetWorkspace, PresetTiles, Menu } from '@opengeoweb/theme';
9
+ import { ThemeWrapper, lightTheme, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, WebAssetOff, Delete, Preset, PresetWorkspace, PresetTiles, Clear, Search, Menu } from '@opengeoweb/theme';
10
10
  import { Provider, useDispatch, useSelector } from 'react-redux';
11
- import { withEggs, useConfirmationDialog, CustomIconButton, AlertBanner, ConfirmationServiceProvider, CustomTooltip, ToggleMenu, ToolContainer, CustomToggleButton, ConfirmationDialog, isAxiosError, getAxiosErrorMessage } from '@opengeoweb/shared';
11
+ import { withEggs, useConfirmationDialog, CustomIconButton, AlertBanner, ConfirmationServiceProvider, CustomTooltip, SearchHighlight, ToggleMenu, ToolContainer, CustomToggleButton, ConfirmationDialog, isAxiosError, getAxiosErrorMessage } from '@opengeoweb/shared';
12
12
  import { timeSeriesModuleConfig } from '@opengeoweb/timeseries';
13
13
  import { jsx } from 'react/jsx-runtime';
14
14
  import require$$1$2 from 'react-dom';
15
- import { LinearProgress, Typography, Box, ListItem, ListItemButton, ListItemIcon, ListItemText, Grid, List, Backdrop, Menu as Menu$1, ListSubheader, MenuItem, Tabs } from '@mui/material';
15
+ import { LinearProgress, Typography, Box, ListItem, ListItemButton, ListItemIcon, ListItemText, Grid, List, useTheme, Chip, Stack, debounce as debounce$1, TextField, InputAdornment, Backdrop, Menu as Menu$1, ListSubheader, MenuItem, Tabs } from '@mui/material';
16
16
  import 'react-mosaic-component/react-mosaic-component.css';
17
17
  import { Box as Box$1 } from '@mui/system';
18
18
  import { ReactHookFormTextField, ReactHookFormHiddenInput, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
@@ -88,6 +88,7 @@ var initialState$5 = Object.assign(Object.assign({
88
88
  error: undefined,
89
89
  isWorkspaceListDialogOpen: false
90
90
  }, workspaceListAdapter.getInitialState()), {
91
+ searchQuery: '',
91
92
  workspaceListFilters: workspaceListFilterOptions
92
93
  });
93
94
  var slice$3 = createSlice({
@@ -127,14 +128,32 @@ var slice$3 = createSlice({
127
128
  var _action$payload = action.payload,
128
129
  id = _action$payload.id,
129
130
  isSelected = _action$payload.isSelected;
131
+ var isAllSelected = draft.workspaceListFilters.every(function (filter) {
132
+ return filter.isSelected;
133
+ });
130
134
  var index = draft.workspaceListFilters.findIndex(function (filter) {
131
135
  return filter.id === id;
132
136
  });
133
137
 
134
138
  if (index !== -1) {
135
- draft.workspaceListFilters[index] = Object.assign(Object.assign({}, draft.workspaceListFilters[index]), {
136
- isSelected: isSelected
137
- });
139
+ if (isAllSelected) {
140
+ draft.workspaceListFilters.forEach(function (filter, index) {
141
+ draft.workspaceListFilters[index].isSelected = filter.id === id ? isSelected : false;
142
+ });
143
+ } else {
144
+ draft.workspaceListFilters[index] = Object.assign(Object.assign({}, draft.workspaceListFilters[index]), {
145
+ isSelected: isSelected
146
+ });
147
+ var isAllUnSelected = draft.workspaceListFilters.every(function (filter) {
148
+ return !filter.isSelected;
149
+ });
150
+
151
+ if (isAllUnSelected) {
152
+ draft.workspaceListFilters.forEach(function (_, index) {
153
+ draft.workspaceListFilters[index].isSelected = true;
154
+ });
155
+ }
156
+ }
138
157
  }
139
158
  },
140
159
  setSelectAllFilterChip: function setSelectAllFilterChip(draft) {
@@ -143,6 +162,10 @@ var slice$3 = createSlice({
143
162
  isSelected: true
144
163
  });
145
164
  });
165
+ },
166
+ searchFilter: function searchFilter(draft, action) {
167
+ var searchQuery = action.payload.searchQuery;
168
+ draft.searchQuery = searchQuery;
146
169
  }
147
170
  }
148
171
  });
@@ -329,23 +352,11 @@ var API_NAME = 'workspacepresets';
329
352
  var getIdFromUrl = function getIdFromUrl(url) {
330
353
  return url && url.match(/[^/]+$/)[0];
331
354
  };
332
- var constructFilterParams = function constructFilterParams(filters) {
333
- var _a;
334
-
335
- var scopeFilter = ((_a = filters === null || filters === void 0 ? void 0 : filters.scope) === null || _a === void 0 ? void 0 : _a.length) ? {
336
- scope: filters.scope.toString()
337
- } : {};
338
- return Object.assign({}, scopeFilter);
339
- };
340
355
 
341
356
  var getApiRoutes$1 = function getApiRoutes(axiosInstance) {
342
357
  return {
343
358
  // workspace presets
344
- getWorkspacePresets: function getWorkspacePresets() {
345
- var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
346
- scope: []
347
- };
348
- var params = constructFilterParams(filters);
359
+ getWorkspacePresets: function getWorkspacePresets(params) {
349
360
  return axiosInstance.get('/workspacepreset', {
350
361
  params: params
351
362
  });
@@ -388,8 +399,9 @@ var getApiRoutes$1 = function getApiRoutes(axiosInstance) {
388
399
  };
389
400
 
390
401
  var createApi$1 = function createApi(props) {
391
- var instance = createApiInstance(props);
392
- return getApiRoutes$1(instance);
402
+ var authInstance = createApiInstance(props);
403
+ var nonAuthInstance = createNonAuthApiInstance(props);
404
+ return getApiRoutes$1(props.auth ? authInstance : nonAuthInstance);
393
405
  };
394
406
 
395
407
  var getWorkspaceApi = function getWorkspaceApi() {
@@ -676,6 +688,14 @@ var slice$2 = createSlice({
676
688
  unregisterViewPreset: function unregisterViewPreset(draft, action) {
677
689
  var panelId = action.payload.panelId;
678
690
  viewPresetsAdapter.removeOne(draft, panelId);
691
+ },
692
+ // dialog actions
693
+ openViewPresetDialog: function openViewPresetDialog(draft, action) {
694
+ var viewPresetDialog = action.payload.viewPresetDialog;
695
+ draft.viewPresetDialog = viewPresetDialog;
696
+ },
697
+ closeViewPresetDialog: function closeViewPresetDialog(draft) {
698
+ delete draft.viewPresetDialog;
679
699
  }
680
700
  },
681
701
  extraReducers: function extraReducers(builder) {
@@ -745,7 +765,7 @@ var initialState$3 = {
745
765
  error: undefined,
746
766
  hasChanges: false
747
767
  };
748
- var workspacePresetChangeActions = [viewPresetActions.selectViewPreset, syncGroupActions.syncGroupRemoveGroup, syncGroupActions.syncGroupAddGroup];
768
+ var workspacePresetChangeActions = [viewPresetActions.selectViewPreset, viewPresetActions.setActiveViewPresetId, syncGroupActions.syncGroupRemoveGroup, syncGroupActions.syncGroupAddGroup];
749
769
  var slice$1 = createSlice({
750
770
  initialState: initialState$3,
751
771
  name: 'workspace',
@@ -974,6 +994,9 @@ var getViewPresetActiveId = function getViewPresetActiveId(store, panelId) {
974
994
 
975
995
  return (_a = getViewPresetById(store, panelId)) === null || _a === void 0 ? void 0 : _a.activeViewPresetId;
976
996
  };
997
+ var getDialogOptions = function getDialogOptions(store) {
998
+ return getViewPresetsStore(store).viewPresetDialog || undefined;
999
+ };
977
1000
 
978
1001
  /* *
979
1002
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -3116,6 +3139,97 @@ var viewPresetsList = [
3116
3139
  }
3117
3140
  ];
3118
3141
 
3142
+ /* *
3143
+ * Licensed under the Apache License, Version 2.0 (the "License");
3144
+ * you may not use this file except in compliance with the License.
3145
+ * You may obtain a copy of the License at
3146
+ *
3147
+ * http://www.apache.org/licenses/LICENSE-2.0
3148
+ *
3149
+ * Unless required by applicable law or agreed to in writing, software
3150
+ * distributed under the License is distributed on an "AS IS" BASIS,
3151
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3152
+ * See the License for the specific language governing permissions and
3153
+ * limitations under the License.
3154
+ *
3155
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3156
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
3157
+ * */
3158
+ var getSnackbarMessage$1 = function getSnackbarMessage(action, title) {
3159
+ // Trim and add quotes
3160
+ var trimmedTitle = "\"".concat(title.trim(), "\"");
3161
+
3162
+ switch (action) {
3163
+ case WorkspacePresetAction.DELETE:
3164
+ return "Workspace ".concat(trimmedTitle, " successfully deleted");
3165
+
3166
+ case WorkspacePresetAction.DUPLICATE:
3167
+ return "Workspace ".concat(trimmedTitle, " successfully saved");
3168
+
3169
+ default:
3170
+ return "Workspace ".concat(trimmedTitle, " successfully saved");
3171
+ }
3172
+ };
3173
+ var emptyMapWorkspace = {
3174
+ title: 'New workspace',
3175
+ id: 'FEnewWorkspace',
3176
+ "abstract": '',
3177
+ views: {
3178
+ allIds: ['emptyMapView'],
3179
+ byId: {
3180
+ emptyMapView: {
3181
+ title: 'Empty Map',
3182
+ componentType: 'Map',
3183
+ initialProps: {
3184
+ mapPreset: {
3185
+ layers: [],
3186
+ proj: {
3187
+ bbox: {
3188
+ left: 58703.6377,
3189
+ bottom: 6408480.4514,
3190
+ right: 3967387.5161,
3191
+ top: 11520588.9031
3192
+ },
3193
+ srs: 'EPSG:3857'
3194
+ },
3195
+ shouldShowLayerManager: true,
3196
+ dockedLayerManagerSize: 'sizeSmall'
3197
+ },
3198
+ syncGroupsIds: []
3199
+ }
3200
+ }
3201
+ }
3202
+ },
3203
+ mosaicNode: 'emptyMapView',
3204
+ viewType: 'singleWindow'
3205
+ };
3206
+ var getCleanSearchQuery = function getCleanSearchQuery(searchQuery) {
3207
+ return searchQuery.trim().split(/\s+/).join();
3208
+ };
3209
+ var constructFilterParams = function constructFilterParams(filters, searchQuery) {
3210
+ // get filters
3211
+ var _filters$reduce = filters.reduce(function (filterList, filter) {
3212
+ if (filter.isSelected && filter.type === 'scope') {
3213
+ return Object.assign(Object.assign({}, filter), {
3214
+ scope: filterList.scope.concat(filter.id)
3215
+ });
3216
+ }
3217
+
3218
+ return filterList;
3219
+ }, {
3220
+ scope: []
3221
+ }),
3222
+ scope = _filters$reduce.scope; // get search
3223
+
3224
+
3225
+ var search = getCleanSearchQuery(searchQuery);
3226
+ return Object.assign(Object.assign({}, scope.length && {
3227
+ scope: scope.toString()
3228
+ }), search.length && {
3229
+ search: search
3230
+ });
3231
+ };
3232
+
3119
3233
  /* *
3120
3234
  * Licensed under the Apache License, Version 2.0 (the "License");
3121
3235
  * you may not use this file except in compliance with the License.
@@ -3143,24 +3257,37 @@ var extractViewPresetFromJSON = function extractViewPresetFromJSON(viewPresetId)
3143
3257
  return element.id === viewPresetId;
3144
3258
  });
3145
3259
  };
3146
- var filterWorkspacePresetList = function filterWorkspacePresetList() {
3147
- var scope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['system', 'user'];
3148
- return workspacePresetsList.filter(function (item) {
3149
- return scope.includes(item.scope);
3150
- });
3260
+ var filterWorkspacePresetList = function filterWorkspacePresetList(params) {
3261
+ if (isEmpty(params)) {
3262
+ return workspacePresetsList;
3263
+ }
3264
+
3265
+ return workspacePresetsList.reduce(function (list, workspacePreset) {
3266
+ var _a;
3267
+
3268
+ if ((_a = params === null || params === void 0 ? void 0 : params.scope) === null || _a === void 0 ? void 0 : _a.includes(workspacePreset.scope)) {
3269
+ if (params.search) {
3270
+ var searchQuery = getCleanSearchQuery(params.search);
3271
+ var hasResult = searchQuery.split(',').every(function (query) {
3272
+ return workspacePreset.title.toLowerCase().includes(query.toLowerCase()) || workspacePreset["abstract"].toLowerCase().includes(query.toLowerCase());
3273
+ });
3274
+ return hasResult ? list.concat(workspacePreset) : list;
3275
+ }
3276
+
3277
+ return list.concat(workspacePreset);
3278
+ }
3279
+
3280
+ return list;
3281
+ }, []);
3151
3282
  };
3152
3283
 
3153
3284
  var getApiRoutes = function getApiRoutes(axiosInstance) {
3154
3285
  return {
3155
- getWorkspacePresets: function getWorkspacePresets() {
3156
- var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
3157
- scope: []
3158
- };
3159
- var params = constructFilterParams(filters);
3286
+ getWorkspacePresets: function getWorkspacePresets(params) {
3160
3287
  return axiosInstance.get('/workspacepreset', {
3161
3288
  params: params
3162
3289
  }).then(function () {
3163
- var data = filters.scope.length ? filterWorkspacePresetList(filters.scope) : workspacePresetsList;
3290
+ var data = filterWorkspacePresetList(params);
3164
3291
  return {
3165
3292
  data: data
3166
3293
  };
@@ -3729,90 +3856,90 @@ var WorkspaceListErrorType;
3729
3856
  * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3730
3857
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
3731
3858
  * */
3732
- var getSnackbarMessage$1 = function getSnackbarMessage(action, title) {
3733
- // Trim and add quotes
3734
- var trimmedTitle = "\"".concat(title.trim(), "\"");
3859
+ var getWorkspaceListStore = function getWorkspaceListStore(store) {
3860
+ if (store && store.workspaceList) {
3861
+ return store.workspaceList;
3862
+ }
3735
3863
 
3736
- switch (action) {
3737
- case WorkspacePresetAction.DELETE:
3738
- return "Workspace ".concat(trimmedTitle, " successfully deleted");
3864
+ return null;
3865
+ };
3866
+ var getIsWorkspaceListFetching = function getIsWorkspaceListFetching(store) {
3867
+ var _a;
3739
3868
 
3740
- case WorkspacePresetAction.DUPLICATE:
3741
- return "Workspace ".concat(trimmedTitle, " successfully saved");
3869
+ return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.isFetching) || false;
3870
+ };
3871
+ var getWorkspaceListError = function getWorkspaceListError(store) {
3872
+ var _a;
3742
3873
 
3743
- default:
3744
- return "Workspace ".concat(trimmedTitle, " successfully saved");
3745
- }
3874
+ return (_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.error;
3746
3875
  };
3747
- var emptyMapWorkspace = {
3748
- title: 'New workspace',
3749
- id: 'FEnewWorkspace',
3750
- "abstract": '',
3751
- views: {
3752
- allIds: ['emptyMapView'],
3753
- byId: {
3754
- emptyMapView: {
3755
- title: 'Empty Map',
3756
- componentType: 'Map',
3757
- initialProps: {
3758
- mapPreset: {
3759
- layers: [],
3760
- proj: {
3761
- bbox: {
3762
- left: 58703.6377,
3763
- bottom: 6408480.4514,
3764
- right: 3967387.5161,
3765
- top: 11520588.9031
3766
- },
3767
- srs: 'EPSG:3857'
3768
- },
3769
- shouldShowLayerManager: true,
3770
- dockedLayerManagerSize: 'sizeSmall'
3771
- },
3772
- syncGroupsIds: []
3773
- }
3774
- }
3775
- }
3776
- },
3777
- mosaicNode: 'emptyMapView',
3778
- viewType: 'singleWindow'
3876
+
3877
+ var _workspaceListAdapter = workspaceListAdapter.getSelectors(function (state) {
3878
+ var _a;
3879
+
3880
+ return (_a = state === null || state === void 0 ? void 0 : state.workspaceList) !== null && _a !== void 0 ? _a : {
3881
+ entities: {},
3882
+ ids: []
3883
+ };
3884
+ }),
3885
+ getWorkspaceList = _workspaceListAdapter.selectAll;
3886
+ var getWorkspaceActionDialogDetails = function getWorkspaceActionDialogDetails(store) {
3887
+ var _a;
3888
+
3889
+ return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.workspaceActionDialog) || false;
3890
+ };
3891
+ var getIsWorkspaceListDialogOpen = function getIsWorkspaceListDialogOpen(store) {
3892
+ var _a;
3893
+
3894
+ return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.isWorkspaceListDialogOpen) || false;
3895
+ };
3896
+ var getWorkspaceListFilters = function getWorkspaceListFilters(store) {
3897
+ var _a;
3898
+
3899
+ return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.workspaceListFilters) || [];
3900
+ };
3901
+ var getWorkspaceListSearchQuery = function getWorkspaceListSearchQuery(store) {
3902
+ var _a;
3903
+
3904
+ return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.searchQuery) || '';
3779
3905
  };
3780
3906
 
3781
3907
  var _marked$1 = /*#__PURE__*/regeneratorRuntime.mark(fetchWorkspaceListSaga),
3782
3908
  _marked2$1 = /*#__PURE__*/regeneratorRuntime.mark(onSuccessWorkspacePresetsActionSaga),
3783
3909
  _marked3$1 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$1);
3784
- function fetchWorkspaceListSaga() {
3785
- var workspaceApi, _yield$call, data;
3910
+ function fetchWorkspaceListSaga(_ref) {
3911
+ var workspaceFilterParams, workspaceApi, _yield$call, data;
3786
3912
 
3787
3913
  return regeneratorRuntime.wrap(function fetchWorkspaceListSaga$(_context) {
3788
3914
  while (1) {
3789
3915
  switch (_context.prev = _context.next) {
3790
3916
  case 0:
3791
- _context.prev = 0;
3792
- _context.next = 3;
3917
+ workspaceFilterParams = _ref.payload;
3918
+ _context.prev = 1;
3919
+ _context.next = 4;
3793
3920
  return call(getWorkspaceApi);
3794
3921
 
3795
- case 3:
3922
+ case 4:
3796
3923
  workspaceApi = _context.sent;
3797
- _context.next = 6;
3798
- return call(workspaceApi.getWorkspacePresets);
3924
+ _context.next = 7;
3925
+ return call(workspaceApi.getWorkspacePresets, workspaceFilterParams);
3799
3926
 
3800
- case 6:
3927
+ case 7:
3801
3928
  _yield$call = _context.sent;
3802
3929
  data = _yield$call.data;
3803
- _context.next = 10;
3930
+ _context.next = 11;
3804
3931
  return put(workspaceListActions.fetchedWorkspaceList({
3805
3932
  workspaceList: data
3806
3933
  }));
3807
3934
 
3808
- case 10:
3809
- _context.next = 16;
3935
+ case 11:
3936
+ _context.next = 17;
3810
3937
  break;
3811
3938
 
3812
- case 12:
3813
- _context.prev = 12;
3814
- _context.t0 = _context["catch"](0);
3815
- _context.next = 16;
3939
+ case 13:
3940
+ _context.prev = 13;
3941
+ _context.t0 = _context["catch"](1);
3942
+ _context.next = 17;
3816
3943
  return put(workspaceListActions.errorWorkspaceList({
3817
3944
  error: {
3818
3945
  message: 'Error fetching workspace preset list',
@@ -3820,20 +3947,20 @@ function fetchWorkspaceListSaga() {
3820
3947
  }
3821
3948
  }));
3822
3949
 
3823
- case 16:
3950
+ case 17:
3824
3951
  case "end":
3825
3952
  return _context.stop();
3826
3953
  }
3827
3954
  }
3828
- }, _marked$1, null, [[0, 12]]);
3955
+ }, _marked$1, null, [[1, 13]]);
3829
3956
  }
3830
- function onSuccessWorkspacePresetsActionSaga(_ref) {
3831
- var payload, action, workspaceId, title, selectedWorkspace;
3957
+ function onSuccessWorkspacePresetsActionSaga(_ref2) {
3958
+ var payload, action, workspaceId, title, selectedWorkspace, workspaceFilters, searchQuery;
3832
3959
  return regeneratorRuntime.wrap(function onSuccessWorkspacePresetsActionSaga$(_context2) {
3833
3960
  while (1) {
3834
3961
  switch (_context2.prev = _context2.next) {
3835
3962
  case 0:
3836
- payload = _ref.payload;
3963
+ payload = _ref2.payload;
3837
3964
  action = payload.action, workspaceId = payload.workspaceId, title = payload.title;
3838
3965
  _context2.next = 4;
3839
3966
  return put(snackbarActions.openSnackbar({
@@ -3876,9 +4003,19 @@ function onSuccessWorkspacePresetsActionSaga(_ref) {
3876
4003
 
3877
4004
  case 15:
3878
4005
  _context2.next = 17;
3879
- return call(fetchWorkspaceListSaga);
4006
+ return select(getWorkspaceListFilters);
3880
4007
 
3881
4008
  case 17:
4009
+ workspaceFilters = _context2.sent;
4010
+ _context2.next = 20;
4011
+ return select(getWorkspaceListSearchQuery);
4012
+
4013
+ case 20:
4014
+ searchQuery = _context2.sent;
4015
+ _context2.next = 23;
4016
+ return call(fetchWorkspaceListSaga, workspaceListActions.fetchWorkspaceList(constructFilterParams(workspaceFilters, searchQuery)));
4017
+
4018
+ case 23:
3882
4019
  case "end":
3883
4020
  return _context2.stop();
3884
4021
  }
@@ -4459,7 +4596,7 @@ function rootSaga() {
4459
4596
  * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4460
4597
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
4461
4598
  * */
4462
- var screenManagerModuleModuleConfig = {
4599
+ var workspaceModuleConfig = {
4463
4600
  id: 'workspace-module',
4464
4601
  reducersMap: {
4465
4602
  workspace: reducer$1,
@@ -13595,7 +13732,7 @@ var WorkspaceDndProvider = function WorkspaceDndProvider(_ref) {
13595
13732
  }, children);
13596
13733
  };
13597
13734
 
13598
- var ScreenManagerThemeProvider = function ScreenManagerThemeProvider(_ref) {
13735
+ var WorkspaceThemeProvider = function WorkspaceThemeProvider(_ref) {
13599
13736
  var children = _ref.children,
13600
13737
  _ref$theme = _ref.theme,
13601
13738
  theme = _ref$theme === void 0 ? lightTheme : _ref$theme;
@@ -13603,14 +13740,14 @@ var ScreenManagerThemeProvider = function ScreenManagerThemeProvider(_ref) {
13603
13740
  theme: theme
13604
13741
  }, /*#__PURE__*/React__default.createElement(WorkspaceDndProvider, null, children));
13605
13742
  };
13606
- var ScreenManagerWrapperProvider = withEggs([].concat(_toConsumableArray$3(coreModuleConfig), [timeSeriesModuleConfig, screenManagerModuleModuleConfig]))(function (_ref2) {
13743
+ var WorkspaceWrapperProvider = withEggs([].concat(_toConsumableArray$3(coreModuleConfig), [timeSeriesModuleConfig, workspaceModuleConfig]))(function (_ref2) {
13607
13744
  var theme = _ref2.theme,
13608
13745
  children = _ref2.children;
13609
- return /*#__PURE__*/React__default.createElement(ScreenManagerThemeProvider, {
13746
+ return /*#__PURE__*/React__default.createElement(WorkspaceThemeProvider, {
13610
13747
  theme: theme
13611
13748
  }, children);
13612
13749
  });
13613
- var ScreenManagerWrapperProviderWithStore = function ScreenManagerWrapperProviderWithStore(_ref3) {
13750
+ var WorkspaceWrapperProviderWithStore = function WorkspaceWrapperProviderWithStore(_ref3) {
13614
13751
  var children = _ref3.children,
13615
13752
  store = _ref3.store,
13616
13753
  _ref3$createApi = _ref3.createApi,
@@ -13621,7 +13758,7 @@ var ScreenManagerWrapperProviderWithStore = function ScreenManagerWrapperProvide
13621
13758
  name: API_NAME
13622
13759
  }, /*#__PURE__*/React__default.createElement(Provider, {
13623
13760
  store: store
13624
- }, /*#__PURE__*/React__default.createElement(ScreenManagerWrapperProvider, {
13761
+ }, /*#__PURE__*/React__default.createElement(WorkspaceWrapperProvider, {
13625
13762
  theme: theme
13626
13763
  }, /*#__PURE__*/React__default.createElement(SnackbarWrapperConnect, null, children))));
13627
13764
  };
@@ -13653,7 +13790,7 @@ var WorkspaceModuleProvider = function WorkspaceModuleProvider(_ref) {
13653
13790
  createApi: config.baseURL ? createApi$1 : createApiWithoutSave,
13654
13791
  config: config,
13655
13792
  name: API_NAME
13656
- }, /*#__PURE__*/React.createElement(ScreenManagerWrapperProvider, null, children));
13793
+ }, /*#__PURE__*/React.createElement(WorkspaceDndProvider, null, children));
13657
13794
  };
13658
13795
 
13659
13796
  /*! *****************************************************************************
@@ -13717,7 +13854,7 @@ var buttonStyle = {
13717
13854
  marginRight: 0.5
13718
13855
  };
13719
13856
 
13720
- var ScreenManagerControls = function ScreenManagerControls(_ref) {
13857
+ var WorkspaceControls = function WorkspaceControls(_ref) {
13721
13858
  var createNode = _ref.createNode,
13722
13859
  path = _ref.path,
13723
13860
  _ref$shouldPreventClo = _ref.shouldPreventCloseView,
@@ -13968,7 +14105,7 @@ var createBalancedMosaicNode = function createBalancedMosaicNode(currentNode) {
13968
14105
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
13969
14106
  * */
13970
14107
 
13971
- var ScreenManagerTileConnect = function ScreenManagerTileConnect(_ref) {
14108
+ var WorkspaceTileConnect = function WorkspaceTileConnect(_ref) {
13972
14109
  var _ref$mosaicNodeId = _ref.mosaicNodeId,
13973
14110
  mosaicNodeId = _ref$mosaicNodeId === void 0 ? '' : _ref$mosaicNodeId,
13974
14111
  path = _ref.path,
@@ -14044,7 +14181,7 @@ var ScreenManagerTileConnect = function ScreenManagerTileConnect(_ref) {
14044
14181
  path: path,
14045
14182
  createNode: createNode,
14046
14183
  title: title,
14047
- toolbarControls: /*#__PURE__*/React.createElement(ScreenManagerControls, {
14184
+ toolbarControls: /*#__PURE__*/React.createElement(WorkspaceControls, {
14048
14185
  createNode: createNode,
14049
14186
  path: path,
14050
14187
  shouldPreventCloseView: shouldPreventCloseView
@@ -14078,7 +14215,7 @@ var ScreenManagerTileConnect = function ScreenManagerTileConnect(_ref) {
14078
14215
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
14079
14216
  * */
14080
14217
 
14081
- var ScreenManagerView = function ScreenManagerView(_ref) {
14218
+ var WorkspaceView = function WorkspaceView(_ref) {
14082
14219
  var screenConfig = _ref.screenConfig,
14083
14220
  componentsLookUp = _ref.componentsLookUp,
14084
14221
  updateViews = _ref.updateViews,
@@ -14161,7 +14298,7 @@ var ScreenManagerView = function ScreenManagerView(_ref) {
14161
14298
  width: '100%'
14162
14299
  },
14163
14300
  '.mosaic-window .mosaic-window-toolbar': {
14164
- backgroundColor: windowIsActive ? theme.palette.geowebColors.screenManager.activeWindow : theme.palette.geowebColors.screenManager.inactiveWindow
14301
+ backgroundColor: windowIsActive ? theme.palette.geowebColors.workspace.activeWindow : theme.palette.geowebColors.workspace.inactiveWindow
14165
14302
  },
14166
14303
  '.mosaic-window-toolbar .MuiSvgIcon-root': {
14167
14304
  fill: windowIsActive ? theme.palette.geowebColors.buttons.flat["default"].color : theme.palette.geowebColors.buttons.flat.disabled.color
@@ -14174,7 +14311,7 @@ var ScreenManagerView = function ScreenManagerView(_ref) {
14174
14311
  }
14175
14312
  };
14176
14313
  }
14177
- }, /*#__PURE__*/React.createElement(ScreenManagerTileConnect, {
14314
+ }, /*#__PURE__*/React.createElement(WorkspaceTileConnect, {
14178
14315
  mosaicNodeId: viewId,
14179
14316
  path: path,
14180
14317
  componentsLookUp: componentsLookUp
@@ -14229,7 +14366,7 @@ var useControlActiveWindowId = function useControlActiveWindowId(screenConfig, a
14229
14366
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
14230
14367
  * */
14231
14368
 
14232
- var ScreenManagerViewConnect = function ScreenManagerViewConnect(_ref) {
14369
+ var WorkspaceViewConnect = function WorkspaceViewConnect(_ref) {
14233
14370
  var componentsLookUp = _ref.componentsLookUp;
14234
14371
  var dispatch = useDispatch();
14235
14372
  var isWorkspaceLoading$1 = useSelector(function (store) {
@@ -14266,7 +14403,7 @@ var ScreenManagerViewConnect = function ScreenManagerViewConnect(_ref) {
14266
14403
  return window.removeEventListener('orientationchange', handleOrientationChange);
14267
14404
  };
14268
14405
  }, [handleOrientationChange]);
14269
- return /*#__PURE__*/React__default.createElement(ConfirmationServiceProvider, null, /*#__PURE__*/React__default.createElement(ScreenManagerView, {
14406
+ return /*#__PURE__*/React__default.createElement(ConfirmationServiceProvider, null, /*#__PURE__*/React__default.createElement(WorkspaceView, {
14270
14407
  screenConfig: screenConfig,
14271
14408
  componentsLookUp: componentsLookUp,
14272
14409
  updateViews: updateViews,
@@ -14292,96 +14429,44 @@ var ScreenManagerViewConnect = function ScreenManagerViewConnect(_ref) {
14292
14429
  * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14293
14430
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
14294
14431
  * */
14295
- var getWorkspaceListStore = function getWorkspaceListStore(store) {
14296
- if (store && store.workspaceList) {
14297
- return store.workspaceList;
14298
- }
14432
+ var getPresetIcon = function getPresetIcon(preset) {
14433
+ switch (preset.viewType) {
14434
+ case 'tiledWindow':
14435
+ return /*#__PURE__*/React__default.createElement(PresetTiles, {
14436
+ "data-testid": "tiledWindowIcon"
14437
+ });
14299
14438
 
14300
- return null;
14301
- };
14302
- var getIsWorkspaceListFetching = function getIsWorkspaceListFetching(store) {
14303
- var _a;
14439
+ case 'multiWindow':
14440
+ return /*#__PURE__*/React__default.createElement(PresetWorkspace, {
14441
+ "data-testid": "multiWindowIcon"
14442
+ });
14304
14443
 
14305
- return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.isFetching) || false;
14444
+ case 'singleWindow':
14445
+ default:
14446
+ return /*#__PURE__*/React__default.createElement(Preset, {
14447
+ "data-testid": "singleWindowIcon"
14448
+ });
14449
+ }
14306
14450
  };
14307
- var getWorkspaceListError = function getWorkspaceListError(store) {
14308
- var _a;
14309
14451
 
14310
- return (_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.error;
14311
- };
14452
+ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
14453
+ var workspacePreset = _ref.workspacePreset,
14454
+ currentSelectedId = _ref.currentSelectedId,
14455
+ onClickPreset = _ref.onClickPreset,
14456
+ onClickWorkspacePresetOption = _ref.onClickWorkspacePresetOption,
14457
+ _ref$isOptionsMenuOpe = _ref.isOptionsMenuOpen,
14458
+ isOptionsMenuOpen = _ref$isOptionsMenuOpe === void 0 ? false : _ref$isOptionsMenuOpe,
14459
+ _ref$searchQuery = _ref.searchQuery,
14460
+ searchQuery = _ref$searchQuery === void 0 ? '' : _ref$searchQuery;
14312
14461
 
14313
- var _workspaceListAdapter = workspaceListAdapter.getSelectors(function (state) {
14314
- var _a;
14315
-
14316
- return (_a = state === null || state === void 0 ? void 0 : state.workspaceList) !== null && _a !== void 0 ? _a : {
14317
- entities: {},
14318
- ids: []
14319
- };
14320
- }),
14321
- getWorkspaceList = _workspaceListAdapter.selectAll;
14322
- var getWorkspaceActionDialogDetails = function getWorkspaceActionDialogDetails(store) {
14323
- var _a;
14324
-
14325
- return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.workspaceActionDialog) || false;
14326
- };
14327
- var getIsWorkspaceListDialogOpen = function getIsWorkspaceListDialogOpen(store) {
14328
- var _a;
14329
-
14330
- return ((_a = getWorkspaceListStore(store)) === null || _a === void 0 ? void 0 : _a.isWorkspaceListDialogOpen) || false;
14331
- };
14332
-
14333
- /* *
14334
- * Licensed under the Apache License, Version 2.0 (the "License");
14335
- * you may not use this file except in compliance with the License.
14336
- * You may obtain a copy of the License at
14337
- *
14338
- * http://www.apache.org/licenses/LICENSE-2.0
14339
- *
14340
- * Unless required by applicable law or agreed to in writing, software
14341
- * distributed under the License is distributed on an "AS IS" BASIS,
14342
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14343
- * See the License for the specific language governing permissions and
14344
- * limitations under the License.
14345
- *
14346
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14347
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
14348
- * */
14349
- var getPresetIcon = function getPresetIcon(preset) {
14350
- switch (preset.viewType) {
14351
- case 'tiledWindow':
14352
- return /*#__PURE__*/React__default.createElement(PresetTiles, {
14353
- "data-testid": "tiledWindowIcon"
14354
- });
14355
-
14356
- case 'multiWindow':
14357
- return /*#__PURE__*/React__default.createElement(PresetWorkspace, {
14358
- "data-testid": "multiWindowIcon"
14359
- });
14360
-
14361
- case 'singleWindow':
14362
- default:
14363
- return /*#__PURE__*/React__default.createElement(Preset, {
14364
- "data-testid": "singleWindowIcon"
14365
- });
14366
- }
14367
- };
14368
-
14369
- var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
14370
- var workspacePreset = _ref.workspacePreset,
14371
- currentSelectedId = _ref.currentSelectedId,
14372
- onClickPreset = _ref.onClickPreset,
14373
- onClickWorkspacePresetOption = _ref.onClickWorkspacePresetOption,
14374
- _ref$isOptionsMenuOpe = _ref.isOptionsMenuOpen,
14375
- isOptionsMenuOpen = _ref$isOptionsMenuOpe === void 0 ? false : _ref$isOptionsMenuOpe;
14376
-
14377
- var onDuplicate = function onDuplicate() {
14378
- onClickWorkspacePresetOption(workspacePreset.id, WorkspacePresetAction.DUPLICATE);
14379
- }; // const onEdit = (): void => {
14380
- // onClickWorkspacePresetOption(
14381
- // workspacePreset.id,
14382
- // WorkspacePresetAction.EDIT,
14383
- // );
14384
- // };
14462
+ var onDuplicate = function onDuplicate() {
14463
+ onClickWorkspacePresetOption(workspacePreset.id, WorkspacePresetAction.DUPLICATE);
14464
+ }; // const onEdit = (): void => {
14465
+ // onClickWorkspacePresetOption(
14466
+ // workspacePreset.id,
14467
+ // WorkspacePresetAction.EDIT,
14468
+ // );
14469
+ // };
14385
14470
 
14386
14471
 
14387
14472
  return /*#__PURE__*/React__default.createElement(ListItem, {
@@ -14417,8 +14502,14 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
14417
14502
  }, /*#__PURE__*/React__default.createElement(ListItemIcon, null, getPresetIcon(workspacePreset)), /*#__PURE__*/React__default.createElement(CustomTooltip, {
14418
14503
  title: workspacePreset.title
14419
14504
  }, /*#__PURE__*/React__default.createElement(ListItemText, {
14420
- primary: workspacePreset.title,
14421
- secondary: workspacePreset["abstract"],
14505
+ primary: /*#__PURE__*/React__default.createElement(SearchHighlight, {
14506
+ text: workspacePreset === null || workspacePreset === void 0 ? void 0 : workspacePreset.title,
14507
+ search: searchQuery
14508
+ }),
14509
+ secondary: /*#__PURE__*/React__default.createElement(SearchHighlight, {
14510
+ text: workspacePreset === null || workspacePreset === void 0 ? void 0 : workspacePreset["abstract"],
14511
+ search: searchQuery
14512
+ }),
14422
14513
  sx: {
14423
14514
  margin: 0
14424
14515
  }
@@ -14484,7 +14575,9 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref) {
14484
14575
  var workspacePresets = _ref.workspacePresets,
14485
14576
  currentSelectedId = _ref.currentSelectedId,
14486
14577
  onClickPreset = _ref.onClickPreset,
14487
- onClickWorkspacePresetOption = _ref.onClickWorkspacePresetOption;
14578
+ onClickWorkspacePresetOption = _ref.onClickWorkspacePresetOption,
14579
+ hideNewWorkspace = _ref.hideNewWorkspace,
14580
+ searchQuery = _ref.searchQuery;
14488
14581
  return /*#__PURE__*/React.createElement(Box, {
14489
14582
  "data-testid": "workspaceSelectList"
14490
14583
  }, /*#__PURE__*/React.createElement(Box, {
@@ -14492,23 +14585,221 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref) {
14492
14585
  marginBottom: '4px',
14493
14586
  fontSize: '12px'
14494
14587
  }
14495
- }, workspacePresets.length, " results"), /*#__PURE__*/React.createElement(List, null, /*#__PURE__*/React.createElement(WorkspaceSelectListRow, {
14588
+ }, workspacePresets.length, " results"), /*#__PURE__*/React.createElement(List, null, !hideNewWorkspace && /*#__PURE__*/React.createElement(WorkspaceSelectListRow, {
14589
+ key: emptyMapWorkspace.id,
14496
14590
  workspacePreset: emptyWorkspaceListItem,
14497
14591
  currentSelectedId: currentSelectedId,
14498
14592
  onClickPreset: onClickPreset,
14499
- onClickWorkspacePresetOption: onClickWorkspacePresetOption,
14500
- key: emptyMapWorkspace.id
14593
+ onClickWorkspacePresetOption: onClickWorkspacePresetOption
14501
14594
  }), workspacePresets.map(function (preset) {
14502
14595
  return /*#__PURE__*/React.createElement(WorkspaceSelectListRow, {
14596
+ key: preset.id,
14503
14597
  workspacePreset: preset,
14504
14598
  currentSelectedId: currentSelectedId,
14505
14599
  onClickPreset: onClickPreset,
14506
14600
  onClickWorkspacePresetOption: onClickWorkspacePresetOption,
14507
- key: preset.id
14601
+ searchQuery: searchQuery
14508
14602
  });
14509
14603
  })));
14510
14604
  };
14511
14605
 
14606
+ /* *
14607
+ * Licensed under the Apache License, Version 2.0 (the "License");
14608
+ * you may not use this file except in compliance with the License.
14609
+ * You may obtain a copy of the License at
14610
+ *
14611
+ * http://www.apache.org/licenses/LICENSE-2.0
14612
+ *
14613
+ * Unless required by applicable law or agreed to in writing, software
14614
+ * distributed under the License is distributed on an "AS IS" BASIS,
14615
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14616
+ * See the License for the specific language governing permissions and
14617
+ * limitations under the License.
14618
+ *
14619
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14620
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
14621
+ * */
14622
+
14623
+ var FilterChip = function FilterChip(_ref) {
14624
+ var label = _ref.label,
14625
+ id = _ref.id,
14626
+ _ref$isSelected = _ref.isSelected,
14627
+ isSelected = _ref$isSelected === void 0 ? false : _ref$isSelected,
14628
+ _ref$isDisabled = _ref.isDisabled,
14629
+ isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled,
14630
+ _ref$handleClick = _ref.handleClick,
14631
+ handleClick = _ref$handleClick === void 0 ? function () {} : _ref$handleClick;
14632
+ var theme = useTheme();
14633
+ return /*#__PURE__*/React.createElement(Chip, {
14634
+ size: "small",
14635
+ id: id,
14636
+ label: label,
14637
+ disabled: isDisabled,
14638
+ variant: isSelected ? 'filled' : 'outlined',
14639
+ color: isSelected ? 'secondary' : 'default',
14640
+ sx: {
14641
+ borderColor: "".concat(theme.palette.geowebColors.buttons.tertiary["default"].borderColor),
14642
+ padding: '0px 4px'
14643
+ },
14644
+ onClick: function onClick() {
14645
+ return handleClick(id);
14646
+ }
14647
+ });
14648
+ };
14649
+
14650
+ /* *
14651
+ * Licensed under the Apache License, Version 2.0 (the "License");
14652
+ * you may not use this file except in compliance with the License.
14653
+ * You may obtain a copy of the License at
14654
+ *
14655
+ * http://www.apache.org/licenses/LICENSE-2.0
14656
+ *
14657
+ * Unless required by applicable law or agreed to in writing, software
14658
+ * distributed under the License is distributed on an "AS IS" BASIS,
14659
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14660
+ * See the License for the specific language governing permissions and
14661
+ * limitations under the License.
14662
+ *
14663
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14664
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
14665
+ * */
14666
+ var allLabel = 'All';
14667
+
14668
+ var FilterList = function FilterList(_ref) {
14669
+ var _ref$filters = _ref.filters,
14670
+ filters = _ref$filters === void 0 ? workspaceListFilterOptions : _ref$filters,
14671
+ _ref$onChipClick = _ref.onChipClick,
14672
+ onChipClick = _ref$onChipClick === void 0 ? function () {} : _ref$onChipClick,
14673
+ _ref$isAllSelected = _ref.isAllSelected,
14674
+ isAllSelected = _ref$isAllSelected === void 0 ? false : _ref$isAllSelected;
14675
+ return /*#__PURE__*/React.createElement(Stack, {
14676
+ direction: "row",
14677
+ spacing: 1,
14678
+ "data-testid": "filterList"
14679
+ }, /*#__PURE__*/React.createElement(FilterChip, {
14680
+ id: "all",
14681
+ label: allLabel,
14682
+ isSelected: isAllSelected,
14683
+ handleClick: function handleClick(key) {
14684
+ return onChipClick(key, !isAllSelected);
14685
+ }
14686
+ }), filters.map(function (filter) {
14687
+ return /*#__PURE__*/React.createElement(FilterChip, {
14688
+ key: filter.id,
14689
+ id: filter.id,
14690
+ label: filter.label,
14691
+ isSelected: isAllSelected ? false : filter.isSelected,
14692
+ isDisabled: filter.isDisabled,
14693
+ handleClick: function handleClick(key) {
14694
+ // If they are all isSelected ensure that if one is clicked that one will be the only one set to selected
14695
+ var selected = isAllSelected ? true : !filter.isSelected;
14696
+ onChipClick(key, selected);
14697
+ }
14698
+ });
14699
+ }));
14700
+ };
14701
+
14702
+ var DEBOUNCE_TIMEOUT = 300;
14703
+
14704
+ var SearchField = function SearchField(_ref) {
14705
+ var _ref$label = _ref.label,
14706
+ label = _ref$label === void 0 ? 'Search' : _ref$label,
14707
+ valueChanged = _ref.valueChanged,
14708
+ _ref$value = _ref.value,
14709
+ value = _ref$value === void 0 ? '' : _ref$value;
14710
+
14711
+ var _React$useState = React.useState(value),
14712
+ _React$useState2 = _slicedToArray$9(_React$useState, 2),
14713
+ localValue = _React$useState2[0],
14714
+ setLocalValue = _React$useState2[1]; // eslint-disable-next-line react-hooks/exhaustive-deps
14715
+
14716
+
14717
+ var handleValueChangeDebounced = React.useCallback(debounce$1(valueChanged, DEBOUNCE_TIMEOUT), []);
14718
+
14719
+ var ClearButton = function ClearButton() {
14720
+ return /*#__PURE__*/React.createElement(CustomIconButton, {
14721
+ tooltipTitle: "Clear",
14722
+ edge: "end",
14723
+ onClick: function onClick() {
14724
+ setLocalValue('');
14725
+ valueChanged('');
14726
+ },
14727
+ size: "large"
14728
+ }, /*#__PURE__*/React.createElement(Clear, null));
14729
+ };
14730
+
14731
+ var SearchButton = function SearchButton() {
14732
+ return /*#__PURE__*/React.createElement(CustomIconButton, {
14733
+ tooltipTitle: label,
14734
+ edge: "end",
14735
+ size: "large"
14736
+ }, /*#__PURE__*/React.createElement(Search, null));
14737
+ };
14738
+
14739
+ return /*#__PURE__*/React.createElement(TextField, {
14740
+ variant: "filled",
14741
+ size: "small",
14742
+ sx: {
14743
+ '& input': {
14744
+ paddingTop: '18px'
14745
+ }
14746
+ },
14747
+ label: label,
14748
+ value: localValue,
14749
+ autoFocus: true,
14750
+ fullWidth: true,
14751
+ onChange: function onChange(e) {
14752
+ handleValueChangeDebounced(e.target.value);
14753
+ setLocalValue(e.target.value);
14754
+ },
14755
+ InputProps: {
14756
+ endAdornment: /*#__PURE__*/React.createElement(InputAdornment, {
14757
+ position: "end"
14758
+ }, localValue ? /*#__PURE__*/React.createElement(ClearButton, null) : /*#__PURE__*/React.createElement(SearchButton, null))
14759
+ }
14760
+ });
14761
+ };
14762
+
14763
+ /* *
14764
+ * Licensed under the Apache License, Version 2.0 (the "License");
14765
+ * you may not use this file except in compliance with the License.
14766
+ * You may obtain a copy of the License at
14767
+ *
14768
+ * http://www.apache.org/licenses/LICENSE-2.0
14769
+ *
14770
+ * Unless required by applicable law or agreed to in writing, software
14771
+ * distributed under the License is distributed on an "AS IS" BASIS,
14772
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14773
+ * See the License for the specific language governing permissions and
14774
+ * limitations under the License.
14775
+ *
14776
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14777
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
14778
+ * */
14779
+
14780
+ var WorkspaceFilter = function WorkspaceFilter(_ref) {
14781
+ var filters = _ref.filters,
14782
+ _ref$onClickFilterChi = _ref.onClickFilterChip,
14783
+ onClickFilterChip = _ref$onClickFilterChi === void 0 ? function () {} : _ref$onClickFilterChi,
14784
+ _ref$onSearch = _ref.onSearch,
14785
+ onSearch = _ref$onSearch === void 0 ? function () {} : _ref$onSearch,
14786
+ isAllSelected = _ref.isAllSelected,
14787
+ searchQuery = _ref.searchQuery;
14788
+ return /*#__PURE__*/React.createElement(Stack, {
14789
+ spacing: 1,
14790
+ sx: {
14791
+ marginBottom: '8px'
14792
+ }
14793
+ }, /*#__PURE__*/React.createElement(SearchField, {
14794
+ value: searchQuery,
14795
+ valueChanged: onSearch
14796
+ }), /*#__PURE__*/React.createElement(FilterList, {
14797
+ filters: filters,
14798
+ onChipClick: onClickFilterChip,
14799
+ isAllSelected: isAllSelected
14800
+ }));
14801
+ };
14802
+
14512
14803
  /* *
14513
14804
  * Licensed under the Apache License, Version 2.0 (the "License");
14514
14805
  * you may not use this file except in compliance with the License.
@@ -14532,6 +14823,12 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
14532
14823
  var workspacePresets = useSelector(function (store) {
14533
14824
  return getWorkspaceList(store);
14534
14825
  });
14826
+ var workspaceListFilters = useSelector(function (store) {
14827
+ return getWorkspaceListFilters(store);
14828
+ });
14829
+ var workspaceSearchQuery = useSelector(function (store) {
14830
+ return getWorkspaceListSearchQuery(store);
14831
+ });
14535
14832
  var isFetching = useSelector(function (store) {
14536
14833
  return getIsWorkspaceListFetching(store);
14537
14834
  });
@@ -14540,8 +14837,9 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
14540
14837
  });
14541
14838
  var dispatch = useDispatch();
14542
14839
  var fetchWorkspaceList = React.useCallback(function () {
14543
- dispatch(workspaceListActions.fetchWorkspaceList());
14544
- }, [dispatch]);
14840
+ var filterParams = constructFilterParams(workspaceListFilters, workspaceSearchQuery);
14841
+ dispatch(workspaceListActions.fetchWorkspaceList(filterParams));
14842
+ }, [dispatch, workspaceListFilters, workspaceSearchQuery]);
14545
14843
  var fetchWorkspace = React.useCallback(function (workspaceId) {
14546
14844
  dispatch(workspaceActions.fetchWorkspace({
14547
14845
  workspaceId: workspaceId
@@ -14550,9 +14848,23 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
14550
14848
  var setWorkspaceActionDialogOptions = React.useCallback(function (dialogOptions) {
14551
14849
  dispatch(workspaceListActions.openWorkspaceActionDialogOptions(dialogOptions));
14552
14850
  }, [dispatch]);
14851
+ var toggleSelectFilterChip = React.useCallback(function (id, isSelected) {
14852
+ dispatch(workspaceListActions.toggleSelectFilterChip({
14853
+ id: id,
14854
+ isSelected: isSelected
14855
+ }));
14856
+ }, [dispatch]);
14857
+ var setSelectAllFilterChip = React.useCallback(function () {
14858
+ dispatch(workspaceListActions.setSelectAllFilterChip());
14859
+ }, [dispatch]);
14860
+ var searchFilter = React.useCallback(function (searchQuery) {
14861
+ dispatch(workspaceListActions.searchFilter({
14862
+ searchQuery: searchQuery
14863
+ }));
14864
+ }, [dispatch]);
14553
14865
  React.useEffect(function () {
14554
14866
  fetchWorkspaceList(); // eslint-disable-next-line react-hooks/exhaustive-deps
14555
- }, []); // If we're loading the `New workspace` preset as defined in the FE, use this instead of retrieving from BE
14867
+ }, [workspaceListFilters, workspaceSearchQuery]); // If we're loading the `New workspace` preset as defined in the FE, use this instead of retrieving from BE
14556
14868
 
14557
14869
  var onClickNewPreset = React.useCallback(function () {
14558
14870
  dispatch(routerActions.navigateToUrl({
@@ -14574,6 +14886,16 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
14574
14886
  }
14575
14887
  };
14576
14888
 
14889
+ var onClickFilterChip = function onClickFilterChip(id, shouldSelect) {
14890
+ if (id === 'all') {
14891
+ if (shouldSelect) {
14892
+ setSelectAllFilterChip();
14893
+ }
14894
+ } else {
14895
+ toggleSelectFilterChip(id, shouldSelect);
14896
+ }
14897
+ };
14898
+
14577
14899
  var onClickWorkspacePresetOption = function onClickWorkspacePresetOption(presetId, workspaceAction) {
14578
14900
  // If affectedPreset is the FE defined `New workspace` - use the definition from FE instead of BE
14579
14901
  var affectedPreset = presetId === emptyMapWorkspace.id ? emptyMapWorkspace : workspacePresets.find(function (preset) {
@@ -14616,6 +14938,10 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
14616
14938
  }
14617
14939
  };
14618
14940
 
14941
+ var isAllSelected = workspaceListFilters.every(function (filter) {
14942
+ return filter.isSelected;
14943
+ });
14944
+ var shouldHideNewWorkspace = !isAllSelected || workspaceSearchQuery.length > 0;
14619
14945
  return /*#__PURE__*/React.createElement("div", null, isFetching && /*#__PURE__*/React.createElement(LinearProgress, {
14620
14946
  "data-testid": "loading-bar",
14621
14947
  color: "secondary",
@@ -14640,11 +14966,19 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
14640
14966
  return fetchWorkspaceList();
14641
14967
  }
14642
14968
  }
14643
- }))), /*#__PURE__*/React.createElement(WorkspaceSelectList, {
14969
+ }))), !error && /*#__PURE__*/React.createElement(WorkspaceFilter, {
14970
+ filters: workspaceListFilters,
14971
+ onClickFilterChip: onClickFilterChip,
14972
+ isAllSelected: isAllSelected,
14973
+ searchQuery: workspaceSearchQuery,
14974
+ onSearch: searchFilter
14975
+ }), /*#__PURE__*/React.createElement(WorkspaceSelectList, {
14644
14976
  workspacePresets: workspacePresets,
14645
14977
  currentSelectedId: currentView.id || '',
14646
14978
  onClickPreset: onClickWorkspace,
14647
- onClickWorkspacePresetOption: onClickWorkspacePresetOption
14979
+ onClickWorkspacePresetOption: onClickWorkspacePresetOption,
14980
+ hideNewWorkspace: shouldHideNewWorkspace,
14981
+ searchQuery: workspaceSearchQuery
14648
14982
  }));
14649
14983
  };
14650
14984
 
@@ -14745,7 +15079,7 @@ var WorkspaceMenuButton = function WorkspaceMenuButton(_ref) {
14745
15079
  '&&': {
14746
15080
  backgroundColor: !showMenu && 'transparent',
14747
15081
  '&:hover': {
14748
- backgroundColor: 'geowebColors.screenManager.workspace.tabButtonHover'
15082
+ backgroundColor: 'geowebColors.workspace.tabButtonHover'
14749
15083
  }
14750
15084
  }
14751
15085
  }
@@ -14843,7 +15177,7 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
14843
15177
  backgroundColor: !isOpen && 'transparent',
14844
15178
  '&:hover': {
14845
15179
  color: activeTab ? 'geowebColors.buttons.icon.active.color' : 'inherit',
14846
- backgroundColor: 'geowebColors.screenManager.workspace.tabButtonHover'
15180
+ backgroundColor: 'geowebColors.workspace.tabButtonHover'
14847
15181
  },
14848
15182
  paddingRight: '4px !important',
14849
15183
  display: 'block',
@@ -14933,6 +15267,16 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
14933
15267
  * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14934
15268
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
14935
15269
  * */
15270
+ var TITLE_SUFFIX_NEW_WORKSPACE = 'modified';
15271
+ var TITLE_SUFFIX_EXISTING_WORKSPACE = 'not saved';
15272
+ var getTitle = function getTitle(title, hasChanges, workspaceId) {
15273
+ if (!hasChanges) {
15274
+ return title;
15275
+ }
15276
+
15277
+ var suffix = workspaceId ? TITLE_SUFFIX_NEW_WORKSPACE : TITLE_SUFFIX_EXISTING_WORKSPACE;
15278
+ return "".concat(title, " (").concat(suffix, ")");
15279
+ };
14936
15280
  var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
14937
15281
  var title = _ref.title,
14938
15282
  activeTab = _ref.activeTab,
@@ -14979,9 +15323,10 @@ var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
14979
15323
  workspace: workspaceData
14980
15324
  }));
14981
15325
  }, [dispatch, workspaceData]);
15326
+ var fullTitle = getTitle(title, hasChanges, workspaceId);
14982
15327
  return /*#__PURE__*/React.createElement(WorkspaceOptions, {
14983
15328
  hasChanges: hasChanges,
14984
- title: title,
15329
+ title: fullTitle,
14985
15330
  activeTab: activeTab,
14986
15331
  handleDelete: workspaceScope === 'user' ? onDelete : undefined,
14987
15332
  handleSaveAs: onSaveAs,
@@ -15421,127 +15766,6 @@ var WorkspaceTopBar = function WorkspaceTopBar(_ref) {
15421
15766
  }));
15422
15767
  };
15423
15768
 
15424
- /* *
15425
- * Licensed under the Apache License, Version 2.0 (the "License");
15426
- * you may not use this file except in compliance with the License.
15427
- * You may obtain a copy of the License at
15428
- *
15429
- * http://www.apache.org/licenses/LICENSE-2.0
15430
- *
15431
- * Unless required by applicable law or agreed to in writing, software
15432
- * distributed under the License is distributed on an "AS IS" BASIS,
15433
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15434
- * See the License for the specific language governing permissions and
15435
- * limitations under the License.
15436
- *
15437
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15438
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
15439
- * */
15440
- var WorkspaceDetail = function WorkspaceDetail(_ref) {
15441
- var workspaceId = _ref.workspaceId,
15442
- children = _ref.children,
15443
- componentsLookUp = _ref.componentsLookUp,
15444
- _ref$isSnapshot = _ref.isSnapshot,
15445
- isSnapshot = _ref$isSnapshot === void 0 ? false : _ref$isSnapshot;
15446
- var dispatch = useDispatch();
15447
- var error = useSelector(function (store) {
15448
- return getWorkspaceError(store);
15449
- });
15450
- var isLoading = useSelector(function (store) {
15451
- return isWorkspaceLoading(store);
15452
- });
15453
- var workspaceData = useSelector(function (store) {
15454
- return getWorkspaceData(store);
15455
- });
15456
- var fetchWorkspace = React.useCallback(function (newWorkspaceId) {
15457
- dispatch(workspaceActions.fetchWorkspace({
15458
- workspaceId: newWorkspaceId
15459
- }));
15460
- }, [dispatch]);
15461
- var onSave = React.useCallback(function () {
15462
- dispatch(workspaceActions.saveWorkspacePreset({
15463
- workspace: workspaceData
15464
- }));
15465
- }, [dispatch, workspaceData]);
15466
- var setScreenPreset = React.useCallback(function (newScreenPreset) {
15467
- dispatch(workspaceActions.changePreset({
15468
- workspacePreset: newScreenPreset
15469
- }));
15470
- }, [dispatch]);
15471
- var navigateToUrl = React.useCallback(function (url) {
15472
- dispatch(routerActions.navigateToUrl({
15473
- url: url
15474
- }));
15475
- }, [dispatch]);
15476
-
15477
- var setEmptyWorkSpace = function setEmptyWorkSpace() {
15478
- setScreenPreset(emptyMapWorkspace);
15479
- navigateToUrl(routes.root);
15480
- };
15481
-
15482
- React.useEffect(function () {
15483
- if (!workspaceId) {
15484
- setEmptyWorkSpace();
15485
- } else {
15486
- fetchWorkspace(workspaceId);
15487
- } // eslint-disable-next-line react-hooks/exhaustive-deps
15488
-
15489
- }, []);
15490
- return /*#__PURE__*/React.createElement(Box, {
15491
- "data-testid": "workspace",
15492
- sx: {
15493
- width: '100%',
15494
- height: '100%'
15495
- }
15496
- }, isLoading && /*#__PURE__*/React.createElement(LinearProgress, {
15497
- "data-testid": "loading-bar",
15498
- color: "secondary",
15499
- sx: {
15500
- position: 'absolute',
15501
- width: '100%',
15502
- top: 0,
15503
- zIndex: 100
15504
- }
15505
- }), error && error.type !== WorkspaceErrorType.SAVE && /*#__PURE__*/React.createElement(AlertBanner, Object.assign({
15506
- title: "Failed to fetch workspace ".concat(workspaceId),
15507
- info: error.message,
15508
- shouldClose: true
15509
- }, error.type === WorkspaceErrorType.GENERIC && {
15510
- actionButtonProps: {
15511
- title: 'Try again',
15512
- onClick: function onClick() {
15513
- return fetchWorkspace(workspaceId);
15514
- }
15515
- }
15516
- })), children, !isSnapshot && /*#__PURE__*/React.createElement(React.Fragment, null, error && error.type === WorkspaceErrorType.SAVE && /*#__PURE__*/React.createElement(AlertBanner, {
15517
- title: "Failed to save workspace \"".concat(workspaceData.title, "\""),
15518
- info: error.message,
15519
- shouldClose: true,
15520
- actionButtonProps: {
15521
- title: 'Try again',
15522
- onClick: function onClick() {
15523
- return onSave();
15524
- }
15525
- }
15526
- }), (!error || error.type === WorkspaceErrorType.SAVE) && /*#__PURE__*/React.createElement(Box, {
15527
- component: "div",
15528
- sx: {
15529
- gridArea: 'content',
15530
- position: 'absolute',
15531
- margin: 0,
15532
- padding: 0,
15533
- display: 'block',
15534
- height: '100%',
15535
- width: '100%',
15536
- overflowY: 'auto',
15537
- zIndex: 3
15538
- },
15539
- "data-testid": "ScreenManagerPage"
15540
- }, /*#__PURE__*/React.createElement(ScreenManagerViewConnect, {
15541
- componentsLookUp: componentsLookUp
15542
- }))));
15543
- };
15544
-
15545
15769
  /* *
15546
15770
  * Licensed under the Apache License, Version 2.0 (the "License");
15547
15771
  * you may not use this file except in compliance with the License.
@@ -15649,7 +15873,7 @@ var getConfirmLabel = function getConfirmLabel(action) {
15649
15873
  var MapPresetsFormDialog = function MapPresetsFormDialog(_ref) {
15650
15874
  var isOpen = _ref.isOpen,
15651
15875
  action = _ref.action,
15652
- presetId = _ref.presetId,
15876
+ viewPresetId = _ref.viewPresetId,
15653
15877
  formValues = _ref.formValues,
15654
15878
  onSuccess = _ref.onSuccess,
15655
15879
  onClose = _ref.onClose,
@@ -15709,12 +15933,12 @@ var MapPresetsFormDialog = function MapPresetsFormDialog(_ref) {
15709
15933
 
15710
15934
  case 13:
15711
15935
  _context.next = 15;
15712
- return api.deleteViewPreset(presetId);
15936
+ return api.deleteViewPreset(viewPresetId);
15713
15937
 
15714
15938
  case 15:
15715
15939
  setIsLoading(false);
15716
15940
  onClose();
15717
- onSuccess(action, presetId, newFormValues.title);
15941
+ onSuccess(action, viewPresetId, newFormValues.title);
15718
15942
  return _context.abrupt("break", 20);
15719
15943
 
15720
15944
  case 19:
@@ -15780,6 +16004,181 @@ var MapPresetsFormDialogWrapper = function MapPresetsFormDialogWrapper(_a) {
15780
16004
  }, /*#__PURE__*/React__default.createElement(MapPresetsFormDialog, Object.assign({}, props)));
15781
16005
  };
15782
16006
 
16007
+ /* *
16008
+ * Licensed under the Apache License, Version 2.0 (the "License");
16009
+ * you may not use this file except in compliance with the License.
16010
+ * You may obtain a copy of the License at
16011
+ *
16012
+ * http://www.apache.org/licenses/LICENSE-2.0
16013
+ *
16014
+ * Unless required by applicable law or agreed to in writing, software
16015
+ * distributed under the License is distributed on an "AS IS" BASIS,
16016
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16017
+ * See the License for the specific language governing permissions and
16018
+ * limitations under the License.
16019
+ *
16020
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16021
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
16022
+ * */
16023
+
16024
+ var MapPresetsFormDialogConnect = function MapPresetsFormDialogConnect() {
16025
+ var dispatch = useDispatch();
16026
+ var dialogOptions = useSelector(function (store) {
16027
+ return getDialogOptions(store);
16028
+ });
16029
+ var closeDialog = React__default.useCallback(function () {
16030
+ dispatch(viewPresetActions.closeViewPresetDialog());
16031
+ }, [dispatch]);
16032
+
16033
+ var onClose = function onClose() {
16034
+ closeDialog();
16035
+ };
16036
+
16037
+ var onSuccess = function onSuccess(action, newViewPresetId, title) {
16038
+ dispatch(viewPresetActions.onSuccessViewPresetAction({
16039
+ panelId: dialogOptions === null || dialogOptions === void 0 ? void 0 : dialogOptions.panelId,
16040
+ viewPresetId: newViewPresetId,
16041
+ action: action,
16042
+ title: title
16043
+ }));
16044
+ };
16045
+
16046
+ var isOpen = dialogOptions !== undefined;
16047
+
16048
+ if (!isOpen) {
16049
+ return null;
16050
+ }
16051
+
16052
+ return /*#__PURE__*/React__default.createElement(MapPresetsFormDialogWrapper, Object.assign({
16053
+ isOpen: isOpen,
16054
+ onClose: onClose,
16055
+ onSuccess: onSuccess
16056
+ }, dialogOptions, {
16057
+ formValues: dialogOptions === null || dialogOptions === void 0 ? void 0 : dialogOptions.formValues
16058
+ }));
16059
+ };
16060
+
16061
+ /* *
16062
+ * Licensed under the Apache License, Version 2.0 (the "License");
16063
+ * you may not use this file except in compliance with the License.
16064
+ * You may obtain a copy of the License at
16065
+ *
16066
+ * http://www.apache.org/licenses/LICENSE-2.0
16067
+ *
16068
+ * Unless required by applicable law or agreed to in writing, software
16069
+ * distributed under the License is distributed on an "AS IS" BASIS,
16070
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16071
+ * See the License for the specific language governing permissions and
16072
+ * limitations under the License.
16073
+ *
16074
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16075
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
16076
+ * */
16077
+ var WorkspaceDetail = function WorkspaceDetail(_ref) {
16078
+ var workspaceId = _ref.workspaceId,
16079
+ children = _ref.children,
16080
+ componentsLookUp = _ref.componentsLookUp,
16081
+ _ref$isSnapshot = _ref.isSnapshot,
16082
+ isSnapshot = _ref$isSnapshot === void 0 ? false : _ref$isSnapshot;
16083
+ var dispatch = useDispatch();
16084
+ var error = useSelector(function (store) {
16085
+ return getWorkspaceError(store);
16086
+ });
16087
+ var isLoading = useSelector(function (store) {
16088
+ return isWorkspaceLoading(store);
16089
+ });
16090
+ var workspaceData = useSelector(function (store) {
16091
+ return getWorkspaceData(store);
16092
+ });
16093
+ var fetchWorkspace = React.useCallback(function (newWorkspaceId) {
16094
+ dispatch(workspaceActions.fetchWorkspace({
16095
+ workspaceId: newWorkspaceId
16096
+ }));
16097
+ }, [dispatch]);
16098
+ var onSave = React.useCallback(function () {
16099
+ dispatch(workspaceActions.saveWorkspacePreset({
16100
+ workspace: workspaceData
16101
+ }));
16102
+ }, [dispatch, workspaceData]);
16103
+ var setScreenPreset = React.useCallback(function (newScreenPreset) {
16104
+ dispatch(workspaceActions.changePreset({
16105
+ workspacePreset: newScreenPreset
16106
+ }));
16107
+ }, [dispatch]);
16108
+ var navigateToUrl = React.useCallback(function (url) {
16109
+ dispatch(routerActions.navigateToUrl({
16110
+ url: url
16111
+ }));
16112
+ }, [dispatch]);
16113
+
16114
+ var setEmptyWorkSpace = function setEmptyWorkSpace() {
16115
+ setScreenPreset(emptyMapWorkspace);
16116
+ navigateToUrl(routes.root);
16117
+ };
16118
+
16119
+ React.useEffect(function () {
16120
+ if (!workspaceId) {
16121
+ setEmptyWorkSpace();
16122
+ } else {
16123
+ fetchWorkspace(workspaceId);
16124
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
16125
+
16126
+ }, []);
16127
+ return /*#__PURE__*/React.createElement(Box, {
16128
+ "data-testid": "workspace",
16129
+ sx: {
16130
+ width: '100%',
16131
+ height: '100%'
16132
+ }
16133
+ }, isLoading && /*#__PURE__*/React.createElement(LinearProgress, {
16134
+ "data-testid": "loading-bar",
16135
+ color: "secondary",
16136
+ sx: {
16137
+ position: 'absolute',
16138
+ width: '100%',
16139
+ top: 0,
16140
+ zIndex: 100
16141
+ }
16142
+ }), error && error.type !== WorkspaceErrorType.SAVE && /*#__PURE__*/React.createElement(AlertBanner, Object.assign({
16143
+ title: "Failed to fetch workspace ".concat(workspaceId),
16144
+ info: error.message,
16145
+ shouldClose: true
16146
+ }, error.type === WorkspaceErrorType.GENERIC && {
16147
+ actionButtonProps: {
16148
+ title: 'Try again',
16149
+ onClick: function onClick() {
16150
+ return fetchWorkspace(workspaceId);
16151
+ }
16152
+ }
16153
+ })), children, !isSnapshot && /*#__PURE__*/React.createElement(React.Fragment, null, error && error.type === WorkspaceErrorType.SAVE && /*#__PURE__*/React.createElement(AlertBanner, {
16154
+ title: "Failed to save workspace \"".concat(workspaceData.title, "\""),
16155
+ info: error.message,
16156
+ shouldClose: true,
16157
+ actionButtonProps: {
16158
+ title: 'Try again',
16159
+ onClick: function onClick() {
16160
+ return onSave();
16161
+ }
16162
+ }
16163
+ }), (!error || error.type === WorkspaceErrorType.SAVE) && /*#__PURE__*/React.createElement(Box, {
16164
+ component: "div",
16165
+ sx: {
16166
+ gridArea: 'content',
16167
+ position: 'absolute',
16168
+ margin: 0,
16169
+ padding: 0,
16170
+ display: 'block',
16171
+ height: '100%',
16172
+ width: '100%',
16173
+ overflowY: 'auto',
16174
+ zIndex: 3
16175
+ },
16176
+ "data-testid": "WorkspacePage"
16177
+ }, /*#__PURE__*/React.createElement(WorkspaceViewConnect, {
16178
+ componentsLookUp: componentsLookUp
16179
+ }))), /*#__PURE__*/React.createElement(MapPresetsFormDialogConnect, null));
16180
+ };
16181
+
15783
16182
  /* *
15784
16183
  * Licensed under the Apache License, Version 2.0 (the "License");
15785
16184
  * you may not use this file except in compliance with the License.
@@ -15825,7 +16224,7 @@ var MapPresetsMenuItem = function MapPresetsMenuItem(_ref) {
15825
16224
  var presetTitle = getPresetTitle(title, hasChanges, isActive, isNew);
15826
16225
 
15827
16226
  var onClickMenuItem = function onClickMenuItem(action) {
15828
- onClickPreset(id, action);
16227
+ onClickPreset(id, action, title);
15829
16228
  };
15830
16229
 
15831
16230
  var items = isUserPreset ? [// TODO: enable again (in same order)
@@ -15882,6 +16281,8 @@ var MapPresetsMenuItem = function MapPresetsMenuItem(_ref) {
15882
16281
  };
15883
16282
 
15884
16283
  var MAPPRESET_ACTIVE_TITLE = 'New map preset';
16284
+ var MAPPRESET_DIALOG_TITLE_SAVE_AS = 'Save map preset as';
16285
+ var MAPPRESET_DIALOG_TITLE_DELETE = 'Delete map preset';
15885
16286
  var sortMapPresets = function sortMapPresets(mapPresets) {
15886
16287
  var presetOrder = ['system', 'user'];
15887
16288
  return _toConsumableArray$3(mapPresets).sort(function (left, right) {
@@ -15904,8 +16305,6 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
15904
16305
  isDefaultOpen = _ref$isDefaultOpen === void 0 ? false : _ref$isDefaultOpen,
15905
16306
  _ref$id = _ref.id,
15906
16307
  id = _ref$id === void 0 ? 'mappresets-menubutton' : _ref$id,
15907
- _ref$onSuccess = _ref.onSuccess,
15908
- onSuccess = _ref$onSuccess === void 0 ? function () {} : _ref$onSuccess,
15909
16308
  _ref$isLoading = _ref.isLoading,
15910
16309
  isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
15911
16310
  _ref$hasError = _ref.hasError,
@@ -15919,19 +16318,17 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
15919
16318
  _ref$onSavePreset = _ref.onSavePreset,
15920
16319
  onSavePreset = _ref$onSavePreset === void 0 ? function () {} : _ref$onSavePreset,
15921
16320
  _ref$fetchNewPresetLi = _ref.fetchNewPresetList,
15922
- fetchNewPresetList = _ref$fetchNewPresetLi === void 0 ? function () {} : _ref$fetchNewPresetLi;
16321
+ fetchNewPresetList = _ref$fetchNewPresetLi === void 0 ? function () {} : _ref$fetchNewPresetLi,
16322
+ panelId = _ref.panelId,
16323
+ _ref$openViewPresetsD = _ref.openViewPresetsDialog,
16324
+ openViewPresetsDialog = _ref$openViewPresetsD === void 0 ? function () {} : _ref$openViewPresetsD;
15923
16325
 
15924
16326
  var _a;
15925
16327
 
15926
16328
  var _React$useState = React__default.useState(null),
15927
16329
  _React$useState2 = _slicedToArray$9(_React$useState, 2),
15928
- dialogOptions = _React$useState2[0],
15929
- setDialogOptions = _React$useState2[1];
15930
-
15931
- var _React$useState3 = React__default.useState(null),
15932
- _React$useState4 = _slicedToArray$9(_React$useState3, 2),
15933
- anchorEl = _React$useState4[0],
15934
- setAnchorEl = _React$useState4[1];
16330
+ anchorEl = _React$useState2[0],
16331
+ setAnchorEl = _React$useState2[1];
15935
16332
 
15936
16333
  var isOpen = Boolean(anchorEl);
15937
16334
 
@@ -15948,12 +16345,7 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
15948
16345
  setAnchorEl(null);
15949
16346
  };
15950
16347
 
15951
- var onClickPresetItem = function onClickPresetItem(presetId, presetAction) {
15952
- var clickedPreset = mapPresets.find(function (preset) {
15953
- return preset.id === presetId;
15954
- });
15955
- var presetTitle = clickedPreset === null || clickedPreset === void 0 ? void 0 : clickedPreset.title;
15956
-
16348
+ var onClickPresetItem = function onClickPresetItem(presetId, presetAction, presetTitle) {
15957
16349
  switch (presetAction) {
15958
16350
  case PresetAction.OPEN:
15959
16351
  {
@@ -15980,10 +16372,11 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
15980
16372
 
15981
16373
  case PresetAction.SAVE_AS:
15982
16374
  {
15983
- setDialogOptions({
15984
- title: 'Save map preset as',
16375
+ openViewPresetsDialog({
16376
+ title: MAPPRESET_DIALOG_TITLE_SAVE_AS,
15985
16377
  action: presetAction,
15986
- presetId: presetId,
16378
+ viewPresetId: presetId,
16379
+ panelId: panelId,
15987
16380
  formValues: {
15988
16381
  title: presetTitle,
15989
16382
  initialProps: {
@@ -15998,10 +16391,11 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
15998
16391
 
15999
16392
  case PresetAction.DELETE:
16000
16393
  {
16001
- setDialogOptions({
16002
- title: 'Delete map preset',
16394
+ openViewPresetsDialog({
16395
+ title: MAPPRESET_DIALOG_TITLE_DELETE,
16003
16396
  action: presetAction,
16004
- presetId: presetId,
16397
+ viewPresetId: presetId,
16398
+ panelId: panelId,
16005
16399
  formValues: {
16006
16400
  title: presetTitle
16007
16401
  }
@@ -16011,10 +16405,6 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
16011
16405
  }
16012
16406
  };
16013
16407
 
16014
- var onClose = function onClose() {
16015
- setDialogOptions(null);
16016
- };
16017
-
16018
16408
  var activePresetTitle = activeMapPresetId ? (_a = mapPresets.find(function (preset) {
16019
16409
  return preset.id === activeMapPresetId;
16020
16410
  })) === null || _a === void 0 ? void 0 : _a.title : MAPPRESET_ACTIVE_TITLE;
@@ -16089,7 +16479,9 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
16089
16479
  }, "Map presets")), /*#__PURE__*/React__default.createElement(MapPresetsMenuItem, {
16090
16480
  id: "",
16091
16481
  title: MAPPRESET_ACTIVE_TITLE,
16092
- onClickPreset: onClickPresetItem,
16482
+ onClickPreset: function onClickPreset(presetId, action) {
16483
+ onClickPresetItem(presetId, action, '');
16484
+ },
16093
16485
  isActive: isNewActive,
16094
16486
  scope: "user",
16095
16487
  isNew: true,
@@ -16134,11 +16526,7 @@ var MapPresetsDialog = function MapPresetsDialog(_ref) {
16134
16526
  severity: "info",
16135
16527
  dataTestId: "info-banner",
16136
16528
  title: "You haven't saved any presets yet"
16137
- }))), /*#__PURE__*/React__default.createElement(MapPresetsFormDialogWrapper, Object.assign({
16138
- isOpen: Boolean(dialogOptions),
16139
- onClose: onClose,
16140
- onSuccess: onSuccess
16141
- }, dialogOptions)));
16529
+ }))));
16142
16530
  };
16143
16531
 
16144
16532
  /* *
@@ -16233,14 +16621,11 @@ var MapPresetsDialogConnect = function MapPresetsDialogConnect(_ref) {
16233
16621
  viewPreset: viewPreset
16234
16622
  }));
16235
16623
  }, [dispatch, mapId]);
16236
- var onSuccesMapPresetAction = React__default.useCallback(function (action, viewPresetId, title) {
16237
- dispatch(viewPresetActions.onSuccessViewPresetAction({
16238
- panelId: mapId,
16239
- viewPresetId: viewPresetId,
16240
- action: action,
16241
- title: title
16624
+ var openViewPresetsDialog = React__default.useCallback(function (viewPresetDialogOptions) {
16625
+ dispatch(viewPresetActions.openViewPresetDialog({
16626
+ viewPresetDialog: viewPresetDialogOptions
16242
16627
  }));
16243
- }, [dispatch, mapId]);
16628
+ }, [dispatch]);
16244
16629
  React__default.useEffect(function () {
16245
16630
  if (!mapPresets.length) {
16246
16631
  fetchInitialPresets();
@@ -16251,7 +16636,6 @@ var MapPresetsDialogConnect = function MapPresetsDialogConnect(_ref) {
16251
16636
  activeMapPresetId: activeMapPresetId,
16252
16637
  mapPresets: mapPresets,
16253
16638
  onClickPreset: selectMapPreset,
16254
- onSuccess: onSuccesMapPresetAction,
16255
16639
  isLoading: isMapPresetsListFetching,
16256
16640
  hasError: !!errorMapPresetsList,
16257
16641
  hasMapPresetChanges: hasMapPresetChanges,
@@ -16259,8 +16643,10 @@ var MapPresetsDialogConnect = function MapPresetsDialogConnect(_ref) {
16259
16643
  relatedSyncGroupIds: relatedSyncGroupIds,
16260
16644
  onSavePreset: saveMapPreset,
16261
16645
  fetchNewPresetList: fetchMapPresetsList,
16262
- id: id
16646
+ id: id,
16647
+ panelId: mapId,
16648
+ openViewPresetsDialog: openViewPresetsDialog
16263
16649
  });
16264
16650
  };
16265
16651
 
16266
- export { ComponentsLookUpWrapper, MapPresetsDialog, MapPresetsDialogConnect, ScreenManagerThemeProvider, ScreenManagerViewConnect, ScreenManagerWrapperProvider, ScreenManagerWrapperProviderWithStore, WorkspaceDetail, WorkspaceDndProvider, WorkspaceErrorType, WorkspaceModuleProvider, WorkspacePresetAction, WorkspaceTopBar, workspaceActions as actions, createBalancedMosaicNode, emptyMapWorkspace, getWorkspaceRouteUrl, screenManagerModuleModuleConfig, selectors, viewPresetActions, workspaceListActions, routes as workspaceRoutes };
16652
+ export { ComponentsLookUpWrapper, MapPresetsDialog, MapPresetsDialogConnect, WorkspaceDetail, WorkspaceDndProvider, WorkspaceErrorType, WorkspaceModuleProvider, WorkspacePresetAction, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProvider, WorkspaceWrapperProviderWithStore, workspaceActions as actions, createBalancedMosaicNode, emptyMapWorkspace, getWorkspaceRouteUrl, selectors, viewPresetActions, workspaceListActions, workspaceModuleConfig, routes as workspaceRoutes };