@opengeoweb/workspace 15.2.0 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/index.esm.js +1521 -890
  2. package/package.json +17 -17
  3. package/src/index.d.ts +0 -1
  4. package/src/lib/api/viewpreset-api/api.d.ts +2 -3
  5. package/src/lib/api/viewpreset-api/fakeApi/mockData.d.ts +36 -0
  6. package/src/lib/api/viewpreset-api/hooks.d.ts +2 -3
  7. package/src/lib/api/viewpreset-api/queryOptions.d.ts +4 -5
  8. package/src/lib/api/workspace-api/hooks.d.ts +1 -1
  9. package/src/lib/components/PastePresetDialog/PastePresetDialog.d.ts +8 -0
  10. package/src/lib/components/PastePresetDialog/index.d.ts +2 -0
  11. package/src/lib/components/WorkspaceDetail/WorkspaceDetail.stories.d.ts +1 -8
  12. package/src/lib/components/WorkspaceDetail/WorkspaceDetailError.stories.d.ts +8 -1
  13. package/src/lib/components/WorkspaceOptions/WorkspaceOptions.d.ts +4 -0
  14. package/src/lib/components/WorkspaceSelectList/WorkspacePresetInfo.d.ts +1 -2
  15. package/src/lib/components/WorkspaceView/SplitButtonsConnect.d.ts +2 -0
  16. package/src/lib/components/WorkspaceView/WorkSpaceView.stories.d.ts +9 -0
  17. package/src/lib/hooks/useResetFiltersOnRoleChange.d.ts +5 -0
  18. package/src/lib/store/store.d.ts +0 -1
  19. package/src/lib/store/types.d.ts +0 -2
  20. package/src/lib/store/viewPresets/reducer.d.ts +1 -2
  21. package/src/lib/store/viewPresets/selectors.d.ts +31 -31
  22. package/src/lib/store/viewPresets/types.d.ts +4 -5
  23. package/src/lib/store/workspace/selectors.d.ts +5 -0
  24. package/src/lib/store/workspace/types.d.ts +6 -2
  25. package/src/lib/store/workspaceList/types.d.ts +1 -0
  26. package/src/lib/store/workspaceList/utils.d.ts +1 -2
  27. package/src/lib/utils/clipboardUtils.d.ts +23 -0
  28. package/src/lib/utils/utils.d.ts +1 -1
  29. package/src/lib/hooks/useFetchWorkspacePresets.d.ts +0 -1
  30. package/src/lib/store/viewPresetsList/index.d.ts +0 -2
  31. package/src/lib/store/viewPresetsList/reducer.d.ts +0 -10
  32. package/src/lib/store/viewPresetsList/selectors.d.ts +0 -142
  33. package/src/lib/store/viewPresetsList/selectors.spec.d.ts +0 -1
  34. package/src/lib/store/viewPresetsList/types.d.ts +0 -24
  35. /package/src/lib/{store/viewPresetsList/reducer.spec.d.ts → utils/clipboardUtils.spec.d.ts} +0 -0
package/index.esm.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware, isAnyOf, combineReducers, configureStore } from '@reduxjs/toolkit';
2
2
  import { handleResponse, getHeaders, getQueryClient, QueryClientProviderWrapper, useAuthenticationContext as useAuthenticationContext$1, GEOWEB_ROLE_PRESETS_ADMIN as GEOWEB_ROLE_PRESETS_ADMIN$1 } from '@opengeoweb/api';
3
- 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, uiTypes, linkComponentTypesConstants, loadingIndicatorSelectors, uiSelectors } from '@opengeoweb/store';
3
+ 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, uiTypes, linkComponentTypesConstants, constructSyncSourceDisplayName, loadingIndicatorSelectors, uiSelectors } from '@opengeoweb/store';
4
4
  import { timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer } from '@opengeoweb/time-series';
5
- import { chunk, union, cloneDeep, pick, isEqual, isString } from 'lodash';
5
+ import { chunk, cloneDeep, union, pick, isEqual, isString } from 'lodash';
6
6
  import { getLeaves, createBalancedTreeFromLeaves, MosaicContext, getAndAssertNodeAtPathExists, MosaicWindow, Mosaic } from 'react-mosaic-component';
7
7
  import { queryOptions, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
8
- import { sessionStorageProvider, getAxiosErrorMessage, isAxiosError, isAxiosAuthError, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, usePrevious, AlertBanner, CustomAccordion, CustomTooltip, dateUtils, SystemScope, SearchHighlight, ToggleMenu, SearchField, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, ConfirmationButtons } from '@opengeoweb/shared';
8
+ import { sessionStorageProvider, getAxiosErrorMessage, isAxiosError, isAuthError, isAxiosAuthError, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, usePrevious, AlertBanner, CustomAccordion, CustomTooltip, dateUtils, SystemScope, SearchHighlight, ToggleMenu, SearchField, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, ConfirmationButtons } from '@opengeoweb/shared';
9
9
  import { soundingsActions, SoundingsTypes, soundingsSelectors, soundingsReducer } from '@opengeoweb/soundings';
10
10
  import { warningsFiltersActions, publicWarningsSelectors, warningsTranslations, WARN_NAMESPACE } from '@opengeoweb/warnings';
11
11
  import { snackbarTypes, snackbarActions, snackbarListener, snackbarReducer, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
@@ -14,13 +14,13 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
14
14
  import { useTranslation, I18nextProvider } from 'react-i18next';
15
15
  import { Provider, useDispatch, useSelector, useStore, shallowEqual } from 'react-redux';
16
16
  import { AuthenticationProvider, useAuthenticationContext, GEOWEB_ROLE_PRESETS_ADMIN } from '@opengeoweb/authentication';
17
- import { ThemeWrapper, lightTheme, Link, LinkOff, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, ChevronUp, ChevronDown, LockLocked, Info, WorkspacePresetsSystemIcon, SharedPresetsMyUser, SharedPresetsOtherUsers, WorkspacePresetsMyIcon, BackdropStyle, Options, CloudLoading, CloudIdle, WebAssetOff, Exclamation } from '@opengeoweb/theme';
17
+ import { ThemeWrapper, lightTheme, Link, LinkOff, SplitHorizontal, SplitVertical, SplitHorizontalWithContent, SplitVerticalWithContent, Expand, UnExpand, ChevronDown, Close, ChevronUp, LockLocked, Info, WorkspacePresetsSystemIcon, SharedPresetsMyUser, SharedPresetsOtherUsers, WorkspacePresetsMyIcon, BackdropStyle, Options, CloudLoading, CloudIdle, WebAssetOff, Exclamation } from '@opengeoweb/theme';
18
18
  import i18n from 'i18next';
19
19
  import { coreTranslations, CORE_NAMESPACE, LoadingIndicatorProgressBar } from '@opengeoweb/core';
20
20
  import { formFieldsTranslations, FORM_FIELDS_NAMESPACE, ReactHookFormHiddenInput, ReactHookFormTextField, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
21
21
  import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE } from '@opengeoweb/webmap-react';
22
- import React, { useCallback, useEffect } from 'react';
23
- import { Menu, Typography, List, ListItem, ListItemButton, ListItemIcon, Checkbox, ListItemText, LinearProgress, Box, Button, Stack, FormControlLabel, Chip, Popper, ClickAwayListener, Paper, IconButton, Collapse, Divider, Grid, useTheme, ListSubheader, MenuItem, Tabs } from '@mui/material';
22
+ import React, { useEffect, useCallback } from 'react';
23
+ import { Menu, Typography, List, ListItem, ListItemButton, ListItemIcon, Checkbox, ListItemText, MenuItem, useTheme, Box, LinearProgress, Button, Stack, FormControlLabel, Chip, Popper, ClickAwayListener, Paper, IconButton, Collapse, Divider, Grid, TextField, ListSubheader, Tabs } from '@mui/material';
24
24
  import 'react-mosaic-component/react-mosaic-component.css';
25
25
  import { useFormContext, useWatch, useForm, FormProvider } from 'react-hook-form';
26
26
  import { List as List$1 } from 'react-window';
@@ -60,8 +60,11 @@ var en = {
60
60
  "workspace-control-split-horizontal": "Split window horizontally",
61
61
  "workspace-control-split-vertical": "Split window vertically",
62
62
  "workspace-control-split-shift": "Hold shift to copy viewpreset content",
63
+ "workspace-control-split-horizontal-with-data": "Split window horizontally and copy over viewpreset content",
64
+ "workspace-control-split-vertical-with-data": "Split window vertically and copy over viewpreset content",
63
65
  "workspace-control-expand": "Expand window",
64
66
  "workspace-control-unexpand": "Unexpand window",
67
+ "workspace-control-show-options": "Show options",
65
68
  "workspace-control-close": "Close window",
66
69
  "workspace-control-close-message-title": "Whoops",
67
70
  "workspace-control-close-message-description": "Are you sure you want to close this window? All changes will be lost.",
@@ -147,7 +150,29 @@ var en = {
147
150
  "workspace-label-active": "ACTIVE",
148
151
  "fetch-config-error-retry": "Retry",
149
152
  "fetch-config-error-title": "An error has occured whilst fetching the label configuration",
150
- "fetch-config-no-labels-available": "There are no labels available, please contact your administrator"
153
+ "fetch-config-no-labels-available": "There are no labels available, please contact your administrator",
154
+ "workspace-copy-to-clipboard": "Copy workspace",
155
+ "workspace-paste-from-clipboard": "Paste workspace",
156
+ "workspace-copy-viewpreset-to-clipboard": "Copy view preset",
157
+ "workspace-paste-viewpreset-from-clipboard": "Paste view preset",
158
+ "workspace-paste-dialog-title": "Paste workspace from clipboard",
159
+ "workspace-paste-viewpreset-dialog-title": "Paste view preset from clipboard",
160
+ "workspace-paste-load-button": "Load workspace",
161
+ "workspace-paste-load-viewpreset-button": "Load view preset",
162
+ "workspace-paste-placeholder": "Paste workspace from clipboard",
163
+ "workspace-paste-viewpreset-placeholder": "Paste view preset from clipboard",
164
+ "workspace-paste-field-label": "Workspace JSON",
165
+ "workspace-paste-viewpreset-field-label": "View preset JSON",
166
+ "workspace-copy-success": "Workspace copied",
167
+ "workspace-paste-success": "Workspace loaded",
168
+ "workspace-copy-viewpreset-success": "View preset copied",
169
+ "workspace-paste-viewpreset-success": "View preset loaded",
170
+ "workspace-paste-validation-invalid-json": "Invalid JSON: {{ERROR}}",
171
+ "workspace-paste-validation-not-object": "Input must be a JSON object",
172
+ "workspace-paste-validation-missing-field": "Missing required field: \"{{ERROR}}\"",
173
+ "workspace-paste-validation-unexpanded-views": "Workspace contains view preset references. Use the Copy button to get a portable version.",
174
+ "workspace-paste-validation-wrong-preset-type": "The clipboard contains a view preset, not a workspace preset.",
175
+ "viewpreset-paste-validation-wrong-preset-type": "The clipboard contains a workspace preset, not a view preset."
151
176
  };
152
177
  var fi = {
153
178
  "workspace-menu": "Workspace menu",
@@ -182,8 +207,11 @@ var fi = {
182
207
  "workspace-control-split-horizontal": "Jaa ikkuna vaakasuoraan",
183
208
  "workspace-control-split-vertical": "Jaa ikkuna pystysuoraan",
184
209
  "workspace-control-split-shift": "Pidä Shift painettuna kopioidaksesi näkymän sisällön",
210
+ "workspace-control-split-horizontal-with-data": "Jaa ikkuna vaakasuunnassa kopioitaessa sisällön päälle",
211
+ "workspace-control-split-vertical-with-data": "Jaa ikkuna pystysuunnassa kopioitaessa sisällön päälle",
185
212
  "workspace-control-expand": "Laajenna ikkuna",
186
213
  "workspace-control-unexpand": "Supista ikkuna",
214
+ "workspace-control-show-options": "Näytä asetukset",
187
215
  "workspace-control-close": "Sulje ikkuna",
188
216
  "workspace-control-close-message-title": "Hups",
189
217
  "workspace-control-close-message-description": "Oletko varma, että haluat sulkea tämän ikkunan? Kaikki muutokset menetetään",
@@ -262,7 +290,29 @@ var fi = {
262
290
  "workspace-labels-dataSource": "ei käännetty",
263
291
  "workspace-labels-viewType": "ei käännetty",
264
292
  "workspace-presets-form-active-labels": "ei käännetty ({{count}})",
265
- "workspace-label-active": "ACTIVE"
293
+ "workspace-label-active": "ACTIVE",
294
+ "workspace-copy-to-clipboard": "Copy workspace",
295
+ "workspace-paste-from-clipboard": "Paste workspace",
296
+ "workspace-copy-viewpreset-to-clipboard": "Copy view preset",
297
+ "workspace-paste-viewpreset-from-clipboard": "Paste view preset",
298
+ "workspace-paste-dialog-title": "Paste workspace",
299
+ "workspace-paste-viewpreset-dialog-title": "Paste view preset",
300
+ "workspace-paste-load-button": "Load workspace",
301
+ "workspace-paste-load-viewpreset-button": "Load view preset",
302
+ "workspace-paste-placeholder": "Paste workspace JSON here",
303
+ "workspace-paste-viewpreset-placeholder": "Paste view preset JSON here",
304
+ "workspace-paste-field-label": "Workspace JSON",
305
+ "workspace-paste-viewpreset-field-label": "View preset JSON",
306
+ "workspace-copy-success": "Workspace JSON copied to clipboard",
307
+ "workspace-paste-success": "Workspace loaded",
308
+ "workspace-copy-viewpreset-success": "View preset JSON copied to clipboard",
309
+ "workspace-paste-viewpreset-success": "View preset loaded",
310
+ "workspace-paste-validation-invalid-json": "Invalid JSON: {{ERROR}}",
311
+ "workspace-paste-validation-not-object": "Input must be a JSON object",
312
+ "workspace-paste-validation-missing-field": "Missing required field: \"{{ERROR}}\"",
313
+ "workspace-paste-validation-unexpanded-views": "Workspace contains view preset references. Use the Copy button to get a portable version.",
314
+ "workspace-paste-validation-wrong-preset-type": "The clipboard contains a view preset, not a workspace preset.",
315
+ "viewpreset-paste-validation-wrong-preset-type": "The clipboard contains a workspace preset, not a view preset."
266
316
  };
267
317
  var no = {
268
318
  "workspace-menu": "Arbeidsflater",
@@ -298,8 +348,11 @@ var no = {
298
348
  "workspace-control-split-horizontal": "Splitt vindu horisontalt",
299
349
  "workspace-control-split-vertical": "Splitt vindu vertikalt",
300
350
  "workspace-control-split-shift": "Hold shift for å kopiere viewpreset-innhold",
351
+ "workspace-control-split-horizontal-with-data": "Splitt vindu horisontalt og kopierer viewpreset-innhold",
352
+ "workspace-control-split-vertical-with-data": "Splitt vindu vertikalt og kopierer viewpreset-innhold",
301
353
  "workspace-control-expand": "Utvid vindu",
302
354
  "workspace-control-unexpand": "Krymp vindu",
355
+ "workspace-control-show-options": "Vis alternativer",
303
356
  "workspace-control-close": "Lukk vindu",
304
357
  "workspace-control-close-message-title": "Whoops",
305
358
  "workspace-control-close-message-description": "Er du sikker på at du vil lukke vinduet? Alle endringer vil slettes.",
@@ -378,7 +431,29 @@ var no = {
378
431
  "workspace-labels-dataSource": "Datakilde",
379
432
  "workspace-labels-viewType": "Komponent",
380
433
  "workspace-presets-form-active-labels": "Aktive valg ({{count}})",
381
- "workspace-label-active": "AKTIV"
434
+ "workspace-label-active": "AKTIV",
435
+ "workspace-copy-to-clipboard": "Kopier arbeidsflate som JSON",
436
+ "workspace-paste-from-clipboard": "Last arbeidsflate fra JSON",
437
+ "workspace-copy-viewpreset-to-clipboard": "Kopier snarvei som JSON",
438
+ "workspace-paste-viewpreset-from-clipboard": "Last snarvei fra JSON",
439
+ "workspace-paste-dialog-title": "Last inn arbeidsflate fra JSON",
440
+ "workspace-paste-viewpreset-dialog-title": "Last snarvei fra JSON",
441
+ "workspace-paste-load-button": "Last inn arbeidsflate",
442
+ "workspace-paste-load-viewpreset-button": "Last inn snarvei",
443
+ "workspace-paste-placeholder": "Lim inn arbeidsflate-JSON her",
444
+ "workspace-paste-viewpreset-placeholder": "Lim inn snarvei-JSON her",
445
+ "workspace-paste-field-label": "Arbeidsflate-JSON",
446
+ "workspace-paste-viewpreset-field-label": "Snarvei-JSON",
447
+ "workspace-copy-success": "Arbeidsflate-JSON kopiert til utklippstavlen",
448
+ "workspace-paste-success": "Arbeidsflate lastet inn",
449
+ "workspace-copy-viewpreset-success": "Snarvei-JSON kopiert til utklippstavlen",
450
+ "workspace-paste-viewpreset-success": "Snarvei lastet inn",
451
+ "workspace-paste-validation-invalid-json": "Ugyldig JSON: {{ERROR}}",
452
+ "workspace-paste-validation-not-object": "Inndata må være et JSON-objekt",
453
+ "workspace-paste-validation-missing-field": "Mangler påkrevd felt: \"{{ERROR}}\"",
454
+ "workspace-paste-validation-unexpanded-views": "Arbeidsflaten inneholder referanser til snarveier. Bruk Kopier-knappen for å få en kompatibel versjon.",
455
+ "workspace-paste-validation-wrong-preset-type": "Utklippstavlen inneholder en Snarvei, ikke en Arbeidsflate.",
456
+ "viewpreset-paste-validation-wrong-preset-type": "Utklippstavlen inneholder en Arbeidsflate, ikke en Snarvei."
382
457
  };
383
458
  var nl = {
384
459
  "workspace-menu": "Workspace menu",
@@ -414,8 +489,11 @@ var nl = {
414
489
  "workspace-control-split-horizontal": "Splits paneel horizontaal",
415
490
  "workspace-control-split-vertical": "Splits paneel verticaal",
416
491
  "workspace-control-split-shift": "Houdt Shift ingedrukt om viewpreset te kopieren",
492
+ "workspace-control-split-horizontal-with-data": "Splits paneel horizontaal en kopieer de viewpreset",
493
+ "workspace-control-split-vertical-with-data": "Splits paneel verticaal en kopieer de viewpreset",
417
494
  "workspace-control-expand": "Vergroot paneel",
418
495
  "workspace-control-unexpand": "Verklein paneel",
496
+ "workspace-control-show-options": "Opties weergeven",
419
497
  "workspace-control-close": "Sluit paneel",
420
498
  "workspace-control-close-message-title": "Oeps",
421
499
  "workspace-control-close-message-description": "Weet je zeker dat je dit paneel wilt sluiten? Alle wijzigingen zullen verloren gaan",
@@ -499,7 +577,29 @@ var nl = {
499
577
  "workspace-label-active": "ACTIVE",
500
578
  "fetch-config-error-retry": "Opnieuw proberen",
501
579
  "fetch-config-error-title": "Het ophalen van de label configuratie is mislukt",
502
- "fetch-config-no-labels-available": "Er zijn geen labels beschikbaar, neem contact op met de administrator"
580
+ "fetch-config-no-labels-available": "Er zijn geen labels beschikbaar, neem contact op met de administrator",
581
+ "workspace-copy-to-clipboard": "Kopieer als JSON",
582
+ "workspace-paste-from-clipboard": "Laad vanuit JSON",
583
+ "workspace-copy-viewpreset-to-clipboard": "Kopieer view preset als JSON",
584
+ "workspace-paste-viewpreset-from-clipboard": "Laad view preset vanuit JSON",
585
+ "workspace-paste-dialog-title": "Laad workspace vanuit JSON",
586
+ "workspace-paste-viewpreset-dialog-title": "Laad view preset vanuit JSON",
587
+ "workspace-paste-load-button": "Laad workspace",
588
+ "workspace-paste-load-viewpreset-button": "Laad view preset",
589
+ "workspace-paste-placeholder": "Plak workspace JSON hier",
590
+ "workspace-paste-viewpreset-placeholder": "Plak view preset JSON hier",
591
+ "workspace-paste-field-label": "Workspace JSON",
592
+ "workspace-paste-viewpreset-field-label": "View preset JSON",
593
+ "workspace-copy-success": "Workspace JSON is gekopieerd naar het clipboard",
594
+ "workspace-paste-success": "Workspace geladen",
595
+ "workspace-copy-viewpreset-success": "View preset JSON is gekopieerd naar het clipboard",
596
+ "workspace-paste-viewpreset-success": "View preset is geladen",
597
+ "workspace-paste-validation-invalid-json": "Ongeldige JSON: {{ERROR}}",
598
+ "workspace-paste-validation-not-object": "De invoer moet een geldig JSON-object zijn.",
599
+ "workspace-paste-validation-missing-field": "Ontbrekend verplicht veld: \"{{ERROR}}\"",
600
+ "workspace-paste-validation-unexpanded-views": "Workspace contains view preset references. Use the Copy button to get a portable version.",
601
+ "workspace-paste-validation-wrong-preset-type": "Het klembord bevat een weergave-opmaakprofiel, geen werkruimte-opmaakprofiel.",
602
+ "viewpreset-paste-validation-wrong-preset-type": "Het klembord bevat een werkruimte-opmaakprofiel, geen weergave-opmaakprofiel."
503
603
  };
504
604
  var workspaceTranslations = {
505
605
  en: en,
@@ -962,10 +1062,16 @@ var getViewPreset = /*#__PURE__*/function () {
962
1062
  return _regeneratorRuntime().wrap(function _callee$(_context) {
963
1063
  while (1) switch (_context.prev = _context.next) {
964
1064
  case 0:
1065
+ if (viewpresetId) {
1066
+ _context.next = 2;
1067
+ break;
1068
+ }
1069
+ return _context.abrupt("return", undefined);
1070
+ case 2:
965
1071
  return _context.abrupt("return", fetch(getPresetBaseUrl() + "/viewpreset/" + viewpresetId, {
966
1072
  headers: getHeaders(auth)
967
1073
  }).then(handleResponse));
968
- case 1:
1074
+ case 3:
969
1075
  case "end":
970
1076
  return _context.stop();
971
1077
  }
@@ -976,39 +1082,27 @@ var getViewPreset = /*#__PURE__*/function () {
976
1082
  };
977
1083
  }();
978
1084
  var getViewPresets$1 = /*#__PURE__*/function () {
979
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(auth, params) {
980
- var baseUrl, searchParams, queryString, url;
1085
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(auth) {
1086
+ var url;
981
1087
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
982
1088
  while (1) switch (_context2.prev = _context2.next) {
983
1089
  case 0:
984
- baseUrl = getPresetBaseUrl() + "/viewpreset";
985
- searchParams = new URLSearchParams();
986
- if (params) {
987
- Object.entries(params).forEach(function (_ref3) {
988
- var key = _ref3[0],
989
- value = _ref3[1];
990
- if (value !== undefined && value !== null) {
991
- searchParams.append(key, String(value));
992
- }
993
- });
994
- }
995
- queryString = searchParams.toString();
996
- url = queryString ? baseUrl + "?" + queryString : baseUrl;
1090
+ url = getPresetBaseUrl() + "/viewpreset";
997
1091
  return _context2.abrupt("return", fetch(url, {
998
1092
  headers: getHeaders(auth)
999
1093
  }).then(handleResponse));
1000
- case 6:
1094
+ case 2:
1001
1095
  case "end":
1002
1096
  return _context2.stop();
1003
1097
  }
1004
1098
  }, _callee2);
1005
1099
  }));
1006
- return function getViewPresets(_x3, _x4) {
1100
+ return function getViewPresets(_x3) {
1007
1101
  return _ref2.apply(this, arguments);
1008
1102
  };
1009
1103
  }();
1010
1104
  var updateViewPreset = /*#__PURE__*/function () {
1011
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(viewpresetId, data, auth) {
1105
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(viewpresetId, data, auth) {
1012
1106
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
1013
1107
  while (1) switch (_context3.prev = _context3.next) {
1014
1108
  case 0:
@@ -1023,12 +1117,12 @@ var updateViewPreset = /*#__PURE__*/function () {
1023
1117
  }
1024
1118
  }, _callee3);
1025
1119
  }));
1026
- return function updateViewPreset(_x5, _x6, _x7) {
1027
- return _ref4.apply(this, arguments);
1120
+ return function updateViewPreset(_x4, _x5, _x6) {
1121
+ return _ref3.apply(this, arguments);
1028
1122
  };
1029
1123
  }();
1030
1124
  var saveViewPreset = /*#__PURE__*/function () {
1031
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(viewPresetId, data, auth) {
1125
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(viewPresetId, data, auth) {
1032
1126
  var payload;
1033
1127
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
1034
1128
  while (1) switch (_context4.prev = _context4.next) {
@@ -1047,12 +1141,12 @@ var saveViewPreset = /*#__PURE__*/function () {
1047
1141
  }
1048
1142
  }, _callee4);
1049
1143
  }));
1050
- return function saveViewPreset(_x8, _x9, _x0) {
1051
- return _ref5.apply(this, arguments);
1144
+ return function saveViewPreset(_x7, _x8, _x9) {
1145
+ return _ref4.apply(this, arguments);
1052
1146
  };
1053
1147
  }();
1054
1148
  var saveViewPresetAs = /*#__PURE__*/function () {
1055
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(data, auth) {
1149
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(data, auth) {
1056
1150
  var _response$headers$get;
1057
1151
  var payload, response, headerLocation;
1058
1152
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
@@ -1080,12 +1174,12 @@ var saveViewPresetAs = /*#__PURE__*/function () {
1080
1174
  }
1081
1175
  }, _callee5);
1082
1176
  }));
1083
- return function saveViewPresetAs(_x1, _x10) {
1084
- return _ref6.apply(this, arguments);
1177
+ return function saveViewPresetAs(_x0, _x1) {
1178
+ return _ref5.apply(this, arguments);
1085
1179
  };
1086
1180
  }();
1087
1181
  var deleteViewPreset = /*#__PURE__*/function () {
1088
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(viewPresetId, auth) {
1182
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(viewPresetId, auth) {
1089
1183
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
1090
1184
  while (1) switch (_context6.prev = _context6.next) {
1091
1185
  case 0:
@@ -1099,8 +1193,8 @@ var deleteViewPreset = /*#__PURE__*/function () {
1099
1193
  }
1100
1194
  }, _callee6);
1101
1195
  }));
1102
- return function deleteViewPreset(_x11, _x12) {
1103
- return _ref7.apply(this, arguments);
1196
+ return function deleteViewPreset(_x10, _x11) {
1197
+ return _ref6.apply(this, arguments);
1104
1198
  };
1105
1199
  }();
1106
1200
 
@@ -1145,15 +1239,15 @@ var viewpresetQueryOptions = {
1145
1239
  }()
1146
1240
  });
1147
1241
  },
1148
- getViewPresets: function getViewPresets(params, credentials) {
1242
+ getViewPresets: function getViewPresets(credentials) {
1149
1243
  return queryOptions({
1150
- queryKey: [].concat(viewpresetQueryOptions.keys.lists(), [JSON.stringify(params != null ? params : {})]),
1244
+ queryKey: viewpresetQueryOptions.keys.lists(),
1151
1245
  queryFn: function () {
1152
1246
  var _queryFn2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
1153
1247
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
1154
1248
  while (1) switch (_context2.prev = _context2.next) {
1155
1249
  case 0:
1156
- return _context2.abrupt("return", getViewPresets$1(credentials, params));
1250
+ return _context2.abrupt("return", getViewPresets$1(credentials));
1157
1251
  case 1:
1158
1252
  case "end":
1159
1253
  return _context2.stop();
@@ -1272,6 +1366,7 @@ var WorkspacePresetAction;
1272
1366
  WorkspacePresetAction["SHARE"] = "SHARE";
1273
1367
  WorkspacePresetAction["OPEN_TAB"] = "OPEN_TAB";
1274
1368
  WorkspacePresetAction["EDIT_TITLE"] = "EDIT_TITLE";
1369
+ WorkspacePresetAction["COPY_TO_CLIPBOARD"] = "COPY_TO_CLIPBOARD";
1275
1370
  })(WorkspacePresetAction || (WorkspacePresetAction = {}));
1276
1371
  var WorkspaceErrorType;
1277
1372
  (function (WorkspaceErrorType) {
@@ -1383,7 +1478,7 @@ var sharedFilterState = {
1383
1478
  };
1384
1479
  var defaultPresetFilterState = [personalFilterState, systemFilterState, sharedFilterState];
1385
1480
  var workspaceListAdapter = createEntityAdapter();
1386
- var initialState$3 = Object.assign({
1481
+ var initialState$2 = Object.assign({
1387
1482
  isFetching: false,
1388
1483
  error: undefined,
1389
1484
  isWorkspaceListDialogOpen: false
@@ -1392,8 +1487,8 @@ var initialState$3 = Object.assign({
1392
1487
  workspaceListFilters: defaultPresetFilterState,
1393
1488
  workspaceLabelFilters: undefined
1394
1489
  });
1395
- var slice$3 = createSlice({
1396
- initialState: initialState$3,
1490
+ var slice$2 = createSlice({
1491
+ initialState: initialState$2,
1397
1492
  name: 'workspaceList',
1398
1493
  reducers: {
1399
1494
  fetchWorkspaceList: function fetchWorkspaceList(draft, _action) {
@@ -1525,8 +1620,8 @@ var slice$3 = createSlice({
1525
1620
  }
1526
1621
  }
1527
1622
  });
1528
- var workspaceListReducer = slice$3.reducer,
1529
- workspaceListActions = slice$3.actions;
1623
+ var workspaceListReducer = slice$2.reducer,
1624
+ workspaceListActions = slice$2.actions;
1530
1625
 
1531
1626
  /* *
1532
1627
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1567,17 +1662,17 @@ var viewPresetsAdapter = createEntityAdapter({
1567
1662
  return mapPreset.panelId;
1568
1663
  }
1569
1664
  });
1570
- var initialState$2 = viewPresetsAdapter.getInitialState();
1665
+ var initialState$1 = viewPresetsAdapter.getInitialState();
1571
1666
  var warningsPresetChangeActions = [warningsFiltersActions.setWarningFilters];
1572
1667
  var syncGroupChangeActions = [syncGroupsActions.syncGroupRemoveTarget, syncGroupsActions.syncGroupAddTarget];
1573
- var mapPresetChangeActions = [layerActions.setBaseLayers, layerActions.layerDelete, layerActions.addLayer, layerActions.duplicateMapLayer, layerActions.layerChangeEnabled, layerActions.layerChangeName, layerActions.layerChangeStyle, layerActions.layerChangeOpacity, layerActions.layerChangeDimension, layerActions.layerChangeAcceptanceTime, mapActions.layerMoveLayer, mapActions.setAutoLayerId, mapActions.setAutoTimestepLayerId, mapActions.setAutoUpdateLayerId, mapActions.toggleAutoUpdate, mapActions.mapStartAnimation, mapActions.mapStopAnimation, mapActions.toggleTimeSliderIsVisible, mapActions.setTimeStep, mapActions.setTimeSliderSpan, mapActions.toggleTimeSpanAuto, mapActions.setAnimationDelay, mapActions.toggleTimestepAuto, mapActions.setAnimationStartTime, mapActions.setAnimationEndTime, mapActions.changeOverlayer, uiActions.setActiveMapIdForDialog, uiActions.setToggleOpenDialog, genericActions.setBbox, mapActions.setBbox, mapActions.toggleClock, mapActions.setClockPositionSize];
1668
+ var mapPresetChangeActions = [layerActions.setBaseLayers, layerActions.layerDelete, layerActions.addLayer, layerActions.duplicateMapLayer, layerActions.layerChangeEnabled, layerActions.layerChangeName, layerActions.layerChangeStyle, layerActions.layerChangeOpacity, layerActions.layerChangeDimension, layerActions.layerChangeAcceptanceTime, mapActions.layerMoveLayer, mapActions.setAutoLayerId, mapActions.setAutoTimestepLayerId, mapActions.setAutoUpdateLayerId, mapActions.toggleAutoUpdate, mapActions.mapStartAnimation, mapActions.mapStopAnimation, mapActions.toggleTimeSliderIsVisible, mapActions.setTimeStep, mapActions.setTimeSliderSpan, mapActions.toggleTimeSpanAuto, mapActions.setAnimationDelay, mapActions.toggleTimestepAuto, mapActions.setAnimationStartTime, mapActions.setAnimationEndTime, mapActions.changeOverlayer, uiActions.setActiveMapIdForDialog, uiActions.setToggleOpenDialog, genericActions.setBbox, mapActions.setBbox, mapActions.toggleClock, mapActions.toggleClockOptions, mapActions.setClockPositionSize, mapActions.setDockedLayerManagerSize, mapActions.setDockedLayerManagerPosition, mapActions.setDockedLayerManagerDimensions];
1574
1669
  var timeSeriesPresetChangeActions = [timeSeriesActions.addParameter, timeSeriesActions.addPlot, timeSeriesActions.deleteParameter, timeSeriesActions.deletePlot, timeSeriesActions.moveParameter, timeSeriesActions.movePlot, timeSeriesActions.toggleParameter, timeSeriesActions.togglePlot, timeSeriesActions.patchParameter, timeSeriesActions.updateTitle];
1575
- var soundingsChangeActions = [soundingsActions.updateSelectedSource, soundingsActions.updateSelectedLocation, soundingsActions.updateSelectedTime, soundingsActions.updateDiagramType, soundingsActions.toggleLocationMarkers];
1670
+ var soundingsChangeActions = [soundingsActions.updateSelectedSource, soundingsActions.updateSelectedLocation, soundingsActions.updateSelectedTime, soundingsActions.updateDiagramType, soundingsActions.toggleLocationMarkers, soundingsActions.changeSoundingPanelOrder, soundingsActions.toggleSoundingPanelVisibility];
1576
1671
  var supportedMapActionOrigins = [layerTypes.LayerActionOrigin.layerManager, layerTypes.LayerActionOrigin.wmsLoader, mapEnums.MapActionOrigin.map];
1577
1672
  var supportedTimeSeriesActionOrigins = [TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesManager, TimeSeriesTypes.TimeSeriesActionOrigin.timeSeriesSelect];
1578
- var supportedSoundingsActionOrigins = [SoundingsTypes.SoundingsActionOrigin.soundingsComponent];
1579
- var slice$2 = createSlice({
1580
- initialState: initialState$2,
1673
+ var supportedSoundingsActionOrigins = [SoundingsTypes.SoundingsActionOrigin.soundingsComponent, SoundingsTypes.SoundingsActionOrigin.soundingsManager];
1674
+ var slice$1 = createSlice({
1675
+ initialState: initialState$1,
1581
1676
  name: 'viewPresets',
1582
1677
  reducers: {
1583
1678
  // fetch list actions
@@ -1590,44 +1685,10 @@ var slice$2 = createSlice({
1590
1685
  viewPresetsAdapter.setOne(draft, entity);
1591
1686
  }
1592
1687
  },
1593
- fetchedViewPresets: function fetchedViewPresets(draft, action) {
1688
+ fetchedViewPreset: function fetchedViewPreset(draft, action) {
1594
1689
  var _action$payload = action.payload,
1595
1690
  panelId = _action$payload.panelId,
1596
- viewPresets = _action$payload.viewPresets,
1597
- filterParams = _action$payload.filterParams;
1598
- var entity = draft.entities[panelId];
1599
- if (entity) {
1600
- entity.isFetching = false;
1601
- // If there are filter params, set filter results
1602
- if (Object.keys(filterParams).length !== 0 && viewPresets.length !== 0) {
1603
- var _viewPresets$reduce = viewPresets.reduce(function (result, viewPreset) {
1604
- var _Object$assign;
1605
- return {
1606
- ids: [].concat(result.ids, [viewPreset.id]),
1607
- entities: Object.assign({}, result.entities, (_Object$assign = {}, _Object$assign[viewPreset.id] = viewPreset, _Object$assign))
1608
- };
1609
- }, {
1610
- ids: [],
1611
- entities: {}
1612
- }),
1613
- ids = _viewPresets$reduce.ids,
1614
- entities = _viewPresets$reduce.entities;
1615
- entity.filterResults.entities = entities;
1616
- entity.filterResults.ids = ids;
1617
- } else {
1618
- // If no filtering applied or no results returned from BE, clear out filter results
1619
- entity.filterResults = {
1620
- entities: {},
1621
- ids: []
1622
- };
1623
- }
1624
- viewPresetsAdapter.setOne(draft, entity);
1625
- }
1626
- },
1627
- fetchedViewPreset: function fetchedViewPreset(draft, action) {
1628
- var _action$payload2 = action.payload,
1629
- panelId = _action$payload2.panelId,
1630
- mapPresetId = _action$payload2.viewPresetId;
1691
+ mapPresetId = _action$payload.viewPresetId;
1631
1692
  var entity = draft.entities[panelId];
1632
1693
  if (entity) {
1633
1694
  entity.isFetching = false;
@@ -1647,9 +1708,9 @@ var slice$2 = createSlice({
1647
1708
  }
1648
1709
  },
1649
1710
  savedViewPreset: function savedViewPreset(draft, action) {
1650
- var _action$payload3 = action.payload,
1651
- panelId = _action$payload3.panelId,
1652
- viewPresetId = _action$payload3.viewPresetId;
1711
+ var _action$payload2 = action.payload,
1712
+ panelId = _action$payload2.panelId,
1713
+ viewPresetId = _action$payload2.viewPresetId;
1653
1714
  var entity = draft.entities[panelId];
1654
1715
  if (entity) {
1655
1716
  entity.isFetching = false;
@@ -1659,9 +1720,9 @@ var slice$2 = createSlice({
1659
1720
  }
1660
1721
  },
1661
1722
  errorViewPreset: function errorViewPreset(draft, action) {
1662
- var _action$payload4 = action.payload,
1663
- panelId = _action$payload4.panelId,
1664
- error = _action$payload4.error;
1723
+ var _action$payload3 = action.payload,
1724
+ panelId = _action$payload3.panelId,
1725
+ error = _action$payload3.error;
1665
1726
  var entity = draft.entities[panelId];
1666
1727
  if (entity) {
1667
1728
  entity.error = error;
@@ -1671,9 +1732,9 @@ var slice$2 = createSlice({
1671
1732
  },
1672
1733
  // map actions
1673
1734
  setViewPresetHasChanges: function setViewPresetHasChanges(draft, action) {
1674
- var _action$payload5 = action.payload,
1675
- panelId = _action$payload5.panelId,
1676
- hasChanges = _action$payload5.hasChanges;
1735
+ var _action$payload4 = action.payload,
1736
+ panelId = _action$payload4.panelId,
1737
+ hasChanges = _action$payload4.hasChanges;
1677
1738
  var entity = draft.entities[panelId];
1678
1739
  if (entity) {
1679
1740
  entity.hasChanges = hasChanges;
@@ -1681,9 +1742,9 @@ var slice$2 = createSlice({
1681
1742
  }
1682
1743
  },
1683
1744
  setViewPresetInline: function setViewPresetInline(draft, action) {
1684
- var _action$payload6 = action.payload,
1685
- panelId = _action$payload6.panelId,
1686
- isInline = _action$payload6.isInline;
1745
+ var _action$payload5 = action.payload,
1746
+ panelId = _action$payload5.panelId,
1747
+ isInline = _action$payload5.isInline;
1687
1748
  var entity = draft.entities[panelId];
1688
1749
  if (entity) {
1689
1750
  if (isInline) {
@@ -1693,9 +1754,9 @@ var slice$2 = createSlice({
1693
1754
  }
1694
1755
  },
1695
1756
  setActiveViewPresetId: function setActiveViewPresetId(draft, action) {
1696
- var _action$payload7 = action.payload,
1697
- panelId = _action$payload7.panelId,
1698
- mapPresetId = _action$payload7.viewPresetId;
1757
+ var _action$payload6 = action.payload,
1758
+ panelId = _action$payload6.panelId,
1759
+ mapPresetId = _action$payload6.viewPresetId;
1699
1760
  var entity = draft.entities[panelId];
1700
1761
  if (entity) {
1701
1762
  entity.activeViewPresetId = mapPresetId;
@@ -1704,9 +1765,9 @@ var slice$2 = createSlice({
1704
1765
  }
1705
1766
  },
1706
1767
  selectViewPreset: function selectViewPreset(draft, action) {
1707
- var _action$payload8 = action.payload,
1708
- panelId = _action$payload8.panelId,
1709
- mapPresetId = _action$payload8.viewPresetId;
1768
+ var _action$payload7 = action.payload,
1769
+ panelId = _action$payload7.panelId,
1770
+ mapPresetId = _action$payload7.viewPresetId;
1710
1771
  var entity = draft.entities[panelId];
1711
1772
  if (entity) {
1712
1773
  // only update activeMapPresetId after selecting a NEW preset
@@ -1722,9 +1783,9 @@ var slice$2 = createSlice({
1722
1783
  // action is intercepted in mapPresets/listener
1723
1784
  onSuccessViewPresetAction: function onSuccessViewPresetAction(_draft, _action) {},
1724
1785
  registerViewPreset: function registerViewPreset(draft, action) {
1725
- var _action$payload9 = action.payload,
1726
- mapId = _action$payload9.panelId,
1727
- mapPresetId = _action$payload9.viewPresetId;
1786
+ var _action$payload8 = action.payload,
1787
+ mapId = _action$payload8.panelId,
1788
+ mapPresetId = _action$payload8.viewPresetId;
1728
1789
  viewPresetsAdapter.setOne(draft, {
1729
1790
  panelId: mapId,
1730
1791
  activeViewPresetId: mapPresetId,
@@ -1753,9 +1814,9 @@ var slice$2 = createSlice({
1753
1814
  delete draft.viewPresetDialog;
1754
1815
  },
1755
1816
  toggleViewPresetListDialog: function toggleViewPresetListDialog(draft, action) {
1756
- var _action$payload0 = action.payload,
1757
- isViewPresetDialogOpen = _action$payload0.isViewPresetListDialogOpen,
1758
- panelId = _action$payload0.panelId;
1817
+ var _action$payload9 = action.payload,
1818
+ isViewPresetDialogOpen = _action$payload9.isViewPresetListDialogOpen,
1819
+ panelId = _action$payload9.panelId;
1759
1820
  var entity = draft.entities[panelId];
1760
1821
  if (entity) {
1761
1822
  entity.isViewPresetListDialogOpen = isViewPresetDialogOpen;
@@ -1763,11 +1824,11 @@ var slice$2 = createSlice({
1763
1824
  }
1764
1825
  },
1765
1826
  toggleSelectFilterChip: function toggleSelectFilterChip(draft, action) {
1766
- var _action$payload1 = action.payload,
1767
- id = _action$payload1.id,
1768
- isSelected = _action$payload1.isSelected,
1769
- panelId = _action$payload1.panelId,
1770
- isAdmin = _action$payload1.isAdmin;
1827
+ var _action$payload0 = action.payload,
1828
+ id = _action$payload0.id,
1829
+ isSelected = _action$payload0.isSelected,
1830
+ panelId = _action$payload0.panelId,
1831
+ isAdmin = _action$payload0.isAdmin;
1771
1832
  var entity = draft.entities[panelId];
1772
1833
  if (entity) {
1773
1834
  var relevantFilters = isAdmin ? entity.filters.filter(function (filter) {
@@ -1818,9 +1879,9 @@ var slice$2 = createSlice({
1818
1879
  }
1819
1880
  },
1820
1881
  setFilterChips: function setFilterChips(draft, action) {
1821
- var _action$payload10 = action.payload,
1822
- panelId = _action$payload10.panelId,
1823
- filters = _action$payload10.filters;
1882
+ var _action$payload1 = action.payload,
1883
+ panelId = _action$payload1.panelId,
1884
+ filters = _action$payload1.filters;
1824
1885
  var entity = draft.entities[panelId];
1825
1886
  if (!entity) {
1826
1887
  return;
@@ -1836,18 +1897,18 @@ var slice$2 = createSlice({
1836
1897
  });
1837
1898
  },
1838
1899
  searchFilter: function searchFilter(draft, action) {
1839
- var _action$payload11 = action.payload,
1840
- searchQuery = _action$payload11.searchQuery,
1841
- panelId = _action$payload11.panelId;
1900
+ var _action$payload10 = action.payload,
1901
+ searchQuery = _action$payload10.searchQuery,
1902
+ panelId = _action$payload10.panelId;
1842
1903
  var entity = draft.entities[panelId];
1843
1904
  if (entity) {
1844
1905
  entity.searchQuery = searchQuery;
1845
1906
  }
1846
1907
  },
1847
1908
  setViewPresetLabelFilters: function setViewPresetLabelFilters(draft, action) {
1848
- var _action$payload12 = action.payload,
1849
- panelId = _action$payload12.panelId,
1850
- labels = _action$payload12.labels;
1909
+ var _action$payload11 = action.payload,
1910
+ panelId = _action$payload11.panelId,
1911
+ labels = _action$payload11.labels;
1851
1912
  var entity = draft.entities[panelId];
1852
1913
  if (!entity) {
1853
1914
  return;
@@ -1867,9 +1928,9 @@ var slice$2 = createSlice({
1867
1928
  },
1868
1929
  extraReducers: function extraReducers(builder) {
1869
1930
  builder.addCase(mapActions.setMapPresetError, function (draft, action) {
1870
- var _action$payload13 = action.payload,
1871
- mapId = _action$payload13.mapId,
1872
- error = _action$payload13.error;
1931
+ var _action$payload12 = action.payload,
1932
+ mapId = _action$payload12.mapId,
1933
+ error = _action$payload12.error;
1873
1934
  var entity = draft.entities[mapId];
1874
1935
  if (entity) {
1875
1936
  entity.error = error ? {
@@ -1892,9 +1953,9 @@ var slice$2 = createSlice({
1892
1953
  }
1893
1954
  });
1894
1955
  builder.addCase(workspaceListActions.onSuccessWorkspacePresetAction, function (draft, action) {
1895
- var _action$payload14 = action.payload,
1896
- wsAction = _action$payload14.action,
1897
- views = _action$payload14.views;
1956
+ var _action$payload13 = action.payload,
1957
+ wsAction = _action$payload13.action,
1958
+ views = _action$payload13.views;
1898
1959
  var shouldClear = wsAction === WorkspacePresetAction.SAVE || wsAction === WorkspacePresetAction.SAVE_AS || wsAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET || wsAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || wsAction === WorkspacePresetAction.EDIT;
1899
1960
  if (!shouldClear) {
1900
1961
  return;
@@ -1922,9 +1983,9 @@ var slice$2 = createSlice({
1922
1983
  });
1923
1984
  warningsPresetChangeActions.map(function (warningsAction) {
1924
1985
  return builder.addCase(warningsAction, function (draft, action) {
1925
- var _action$payload15 = action.payload,
1926
- systemUpdate = _action$payload15.systemUpdate,
1927
- panelId = _action$payload15.panelId;
1986
+ var _action$payload14 = action.payload,
1987
+ systemUpdate = _action$payload14.systemUpdate,
1988
+ panelId = _action$payload14.panelId;
1928
1989
  if (!systemUpdate && panelId) {
1929
1990
  var entity = draft.entities[panelId];
1930
1991
  if (entity && !(entity != null && entity.hasChanges)) {
@@ -1936,9 +1997,9 @@ var slice$2 = createSlice({
1936
1997
  });
1937
1998
  syncGroupChangeActions.map(function (syncGroupAction) {
1938
1999
  return builder.addCase(syncGroupAction, function (draft, action) {
1939
- var _action$payload16 = action.payload,
1940
- origin = _action$payload16.origin,
1941
- targetId = _action$payload16.targetId;
2000
+ var _action$payload15 = action.payload,
2001
+ origin = _action$payload15.origin,
2002
+ targetId = _action$payload15.targetId;
1942
2003
  if (origin === 'user') {
1943
2004
  var entity = draft.entities[targetId];
1944
2005
  if (entity && !(entity != null && entity.hasChanges)) {
@@ -1950,9 +2011,9 @@ var slice$2 = createSlice({
1950
2011
  });
1951
2012
  mapPresetChangeActions.map(function (mapPresetAction) {
1952
2013
  return builder.addCase(mapPresetAction, function (draft, action) {
1953
- var _action$payload17 = action.payload,
1954
- mapId = _action$payload17.mapId,
1955
- origin = _action$payload17.origin;
2014
+ var _action$payload16 = action.payload,
2015
+ mapId = _action$payload16.mapId,
2016
+ origin = _action$payload16.origin;
1956
2017
  var isChangeOriginSupported = supportedMapActionOrigins.includes(origin);
1957
2018
  if (isChangeOriginSupported && mapId) {
1958
2019
  var entity = draft.entities[mapId];
@@ -1965,9 +2026,9 @@ var slice$2 = createSlice({
1965
2026
  });
1966
2027
  timeSeriesPresetChangeActions.map(function (timeSeriesPresetAction) {
1967
2028
  return builder.addCase(timeSeriesPresetAction, function (draft, action) {
1968
- var _action$payload18 = action.payload,
1969
- panelId = _action$payload18.panelId,
1970
- origin = _action$payload18.origin;
2029
+ var _action$payload17 = action.payload,
2030
+ panelId = _action$payload17.panelId,
2031
+ origin = _action$payload17.origin;
1971
2032
  var isChangeOriginSupported = supportedTimeSeriesActionOrigins.includes(origin);
1972
2033
  var changesRelevantProperties = timeSeriesPresetAction.type === timeSeriesActions.patchParameter.type ? Object.keys(action.payload.parameter).filter(function (key) {
1973
2034
  return key !== 'id' && key !== 'instanceId';
@@ -1983,9 +2044,9 @@ var slice$2 = createSlice({
1983
2044
  });
1984
2045
  soundingsChangeActions.map(function (soundingsAction) {
1985
2046
  return builder.addCase(soundingsAction, function (draft, action) {
1986
- var _action$payload19 = action.payload,
1987
- panelId = _action$payload19.panelId,
1988
- origin = _action$payload19.origin;
2047
+ var _action$payload18 = action.payload,
2048
+ panelId = _action$payload18.panelId,
2049
+ origin = _action$payload18.origin;
1989
2050
  var isChangeOriginSupported = supportedSoundingsActionOrigins.includes(origin);
1990
2051
  if (isChangeOriginSupported && panelId && panelId !== '') {
1991
2052
  var entity = draft.entities[panelId];
@@ -1998,8 +2059,8 @@ var slice$2 = createSlice({
1998
2059
  });
1999
2060
  }
2000
2061
  });
2001
- var viewPresetsReducer = slice$2.reducer,
2002
- viewPresetActions = slice$2.actions;
2062
+ var viewPresetsReducer = slice$1.reducer,
2063
+ viewPresetActions = slice$1.actions;
2003
2064
 
2004
2065
  /* *
2005
2066
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -2037,7 +2098,7 @@ var humanizeLabelStrings = function humanizeLabelStrings(value) {
2037
2098
  return match.toUpperCase();
2038
2099
  });
2039
2100
  };
2040
- var filterAndSortPresets = function filterAndSortPresets(presets, selectedFilters, username, isAdmin, labelFilters) {
2101
+ var filterAndSortPresets = function filterAndSortPresets(presets, selectedFilters, username, isAdmin, labelFilters, searchQuery) {
2041
2102
  var selectedIds = selectedFilters.filter(function (filter) {
2042
2103
  return filter.isSelected;
2043
2104
  }).map(function (filter) {
@@ -2106,7 +2167,21 @@ var filterAndSortPresets = function filterAndSortPresets(presets, selectedFilter
2106
2167
  }).sort(function (presetA, presetB) {
2107
2168
  return presetA.title.localeCompare(presetB.title);
2108
2169
  });
2109
- return [].concat(systemPresets, personalPresets, sharedPresets);
2170
+ var filteredByQuery = [].concat(systemPresets, personalPresets, sharedPresets).filter(function (preset) {
2171
+ if (!searchQuery) {
2172
+ return true;
2173
+ }
2174
+ var terms = searchQuery.toLowerCase().trim().split(/\s+/).filter(Boolean);
2175
+ var fields = [preset.title, preset["abstract"], preset.description].filter(Boolean).map(function (fil) {
2176
+ return fil.toLowerCase();
2177
+ });
2178
+ return terms.every(function (term) {
2179
+ return fields.some(function (field) {
2180
+ return field.includes(term);
2181
+ });
2182
+ });
2183
+ });
2184
+ return filteredByQuery;
2110
2185
  };
2111
2186
 
2112
2187
  /* eslint-disable no-redeclare */
@@ -2240,7 +2315,8 @@ var getEmptyWorkspacePreset = function getEmptyWorkspacePreset() {
2240
2315
  }
2241
2316
  },
2242
2317
  mosaicNode: '1_screen',
2243
- viewType: 'singleWindow'
2318
+ viewType: 'singleWindow',
2319
+ username: 'global'
2244
2320
  };
2245
2321
  };
2246
2322
  var createCustomEmptyMapWorkspace = function createCustomEmptyMapWorkspace(emptyWorkspaceTitle, emptyMapWorkspaceTitle, customMapPreset) {
@@ -2272,7 +2348,7 @@ var constructFilterParams = function constructFilterParams(filters, searchQuery)
2272
2348
  });
2273
2349
  };
2274
2350
 
2275
- var initialState$1 = {
2351
+ var initialState = {
2276
2352
  id: '',
2277
2353
  title: '',
2278
2354
  views: {
@@ -2285,8 +2361,8 @@ var initialState$1 = {
2285
2361
  hasChanges: false
2286
2362
  };
2287
2363
  var workspacePresetChangeActions = [viewPresetActions.selectViewPreset, viewPresetActions.setActiveViewPresetId, syncGroupsActions.syncGroupRemoveGroup, syncGroupsActions.syncGroupAddGroup, syncGroupsActions.syncGroupToggleIsTimeScrollingEnabled, syncGroupsActions.updateLinkedMap];
2288
- var slice$1 = createSlice({
2289
- initialState: initialState$1,
2364
+ var slice = createSlice({
2365
+ initialState: initialState,
2290
2366
  name: 'workspace',
2291
2367
  reducers: {
2292
2368
  addWorkspaceView: function addWorkspaceView(draft, action) {
@@ -2361,7 +2437,9 @@ var slice$1 = createSlice({
2361
2437
  draft.description = workspacePreset.description;
2362
2438
  draft.labels = workspacePreset.labels;
2363
2439
  draft.scope = workspacePreset.scope;
2440
+ draft.username = workspacePreset.username;
2364
2441
  draft.syncGroups = [];
2442
+ draft.username = workspacePreset.username;
2365
2443
  },
2366
2444
  changeToEmptyMapWorkspace: function changeToEmptyMapWorkspace(draft, action) {
2367
2445
  return draft;
@@ -2378,7 +2456,7 @@ var slice$1 = createSlice({
2378
2456
  });
2379
2457
  if (duplicateIdWithinPreset.length) {
2380
2458
  console.warn('Invalid preset: duplicate viewId found.');
2381
- return initialState$1;
2459
+ return initialState;
2382
2460
  }
2383
2461
  draft.views = newViews;
2384
2462
  if (action.payload.workspacePreset.syncGroups) {
@@ -2396,6 +2474,7 @@ var slice$1 = createSlice({
2396
2474
  draft.isTimeScrollingEnabled = action.payload.workspacePreset.isTimeScrollingEnabled;
2397
2475
  draft.labels = action.payload.workspacePreset.labels;
2398
2476
  draft.description = action.payload.workspacePreset.description;
2477
+ draft.username = action.payload.workspacePreset.username;
2399
2478
  return draft;
2400
2479
  },
2401
2480
  setPreventCloseView: function setPreventCloseView(draft, action) {
@@ -2422,6 +2501,7 @@ var slice$1 = createSlice({
2422
2501
  draft["abstract"] = ws["abstract"];
2423
2502
  draft.labels = ws.labels;
2424
2503
  draft.description = ws.description;
2504
+ draft.username = typeof ws.username === 'string' ? ws.username : undefined;
2425
2505
  var wsViews = ws.views;
2426
2506
  var viewsArray = [];
2427
2507
  if (Array.isArray(wsViews)) {
@@ -2490,6 +2570,7 @@ var slice$1 = createSlice({
2490
2570
  draft.labels = action.payload.labels;
2491
2571
  draft.hasChanges = false;
2492
2572
  draft.scope = action.payload.scope || 'user';
2573
+ draft.username = 'username' in action.payload && typeof action.payload.username === 'string' ? action.payload.username : undefined;
2493
2574
  }
2494
2575
  if ((action.payload.action === WorkspacePresetAction.EDIT || action.payload.action === WorkspacePresetAction.EDIT_TITLE) && action.payload.workspaceId === draft.id) {
2495
2576
  var _draft$views;
@@ -2516,7 +2597,9 @@ var slice$1 = createSlice({
2516
2597
  draft.title = action.payload.emptyWorkspacePresetTitle;
2517
2598
  draft["abstract"] = getEmptyMapWorkspace()["abstract"];
2518
2599
  draft.scope = getEmptyMapWorkspace().scope;
2600
+ draft.username = undefined;
2519
2601
  draft.hasChanges = true;
2602
+ draft.username = '';
2520
2603
  }
2521
2604
  }).addCase(viewPresetActions.fetchedViewPreset, function (draft, action) {
2522
2605
  var _action$payload4 = action.payload,
@@ -2578,8 +2661,8 @@ var slice$1 = createSlice({
2578
2661
  });
2579
2662
  }
2580
2663
  });
2581
- var workspaceReducer = slice$1.reducer;
2582
- var workspaceActions = Object.assign({}, slice$1.actions);
2664
+ var workspaceReducer = slice.reducer;
2665
+ var workspaceActions = Object.assign({}, slice.actions);
2583
2666
 
2584
2667
  /* *
2585
2668
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -2708,7 +2791,7 @@ var emptyViewPreset = function emptyViewPreset(componentType) {
2708
2791
  * */
2709
2792
  var getWorkspaceState = function getWorkspaceState(store) {
2710
2793
  var _store$workspace;
2711
- return (_store$workspace = store == null ? void 0 : store.workspace) != null ? _store$workspace : initialState$1;
2794
+ return (_store$workspace = store == null ? void 0 : store.workspace) != null ? _store$workspace : initialState;
2712
2795
  };
2713
2796
  /**
2714
2797
  * Gets component types from the views used in the workspace
@@ -2735,6 +2818,10 @@ var getComponentTypesFromActiveViews = createSelector([function (state) {
2735
2818
  var getMosaicNode = createSelector(getWorkspaceState, function (state) {
2736
2819
  return state == null ? void 0 : state.mosaicNode;
2737
2820
  }, selectorMemoizationOptions);
2821
+ var getWorkspaceId = function getWorkspaceId(store) {
2822
+ var _getWorkspaceState;
2823
+ return (_getWorkspaceState = getWorkspaceState(store)) == null ? void 0 : _getWorkspaceState.id;
2824
+ };
2738
2825
  /**
2739
2826
  * Gets view from workspace state
2740
2827
  *
@@ -2849,7 +2936,8 @@ var getWorkspaceData = createSelector(getWorkspaceState, genericSelectors.getSyn
2849
2936
  linking: linkedState,
2850
2937
  labels: workspaceStore.labels,
2851
2938
  description: workspaceStore.description,
2852
- updated: workspaceStore.updated
2939
+ updated: workspaceStore.updated,
2940
+ username: workspaceStore.username
2853
2941
  };
2854
2942
  }, selectorMemoizationOptions);
2855
2943
  var getViewComponentType = createSelector(getViewById, function (store) {
@@ -2910,6 +2998,7 @@ var selectors$2 = /*#__PURE__*/Object.freeze({
2910
2998
  getViewsById: getViewsById,
2911
2999
  getWorkspaceData: getWorkspaceData,
2912
3000
  getWorkspaceError: getWorkspaceError,
3001
+ getWorkspaceId: getWorkspaceId,
2913
3002
  getWorkspaceState: getWorkspaceState,
2914
3003
  hasWorkspaceChanges: hasWorkspaceChanges,
2915
3004
  isWorkspaceLoading: isWorkspaceLoading
@@ -2936,7 +3025,7 @@ var getViewPresetsStore = function getViewPresetsStore(store) {
2936
3025
  if (store != null && store.viewPresets) {
2937
3026
  return store.viewPresets;
2938
3027
  }
2939
- return initialState$2;
3028
+ return initialState$1;
2940
3029
  };
2941
3030
  var EMPTY_VIEW_PRESETS = {
2942
3031
  entities: {},
@@ -3024,7 +3113,7 @@ var getViewPresetListSearchQueryForView = createSelector(getViewPresetById, func
3024
3113
  }, selectorMemoizationOptions);
3025
3114
  // Used to retrieve the filtered view preset list for your view - if no filters/search applied it will be empty
3026
3115
  // To ensure you retrieve the view preset list specific for your view (incl and excl filters), use getFilteredViewPresetListForView
3027
- var getViewPresetListFilterResultsForView = createSelector(getViewPresetById, function (viewPresetById) {
3116
+ createSelector(getViewPresetById, function (viewPresetById) {
3028
3117
  var filteredResults = (viewPresetById == null ? void 0 : viewPresetById.filterResults) || {
3029
3118
  entities: {}};
3030
3119
  return Object.values(filteredResults.entities);
@@ -3310,7 +3399,9 @@ var workspaceQueryOptions = {
3310
3399
  return _queryFn2.apply(this, arguments);
3311
3400
  }
3312
3401
  return queryFn;
3313
- }()
3402
+ }(),
3403
+ staleTime: 2 * 60 * 1000,
3404
+ refetchOnMount: true
3314
3405
  });
3315
3406
  },
3316
3407
  saveWorkspacePreset: function saveWorkspacePreset$1(id, data, credentials) {
@@ -3391,11 +3482,8 @@ var selectors = workspaceListAdapter.getSelectors(function (state) {
3391
3482
  ids: []
3392
3483
  };
3393
3484
  });
3394
- var getWorkspaceList = selectors.selectAll;
3395
- var getWorkspacePresetFromList = function getWorkspacePresetFromList(store, id) {
3396
- return selectors.selectById(store, id);
3397
- };
3398
- var getIsWorkspaceListFetching = createSelector(getWorkspaceListStore, function (store) {
3485
+ selectors.selectAll;
3486
+ createSelector(getWorkspaceListStore, function (store) {
3399
3487
  return store;
3400
3488
  }, function (state) {
3401
3489
  return (state == null ? void 0 : state.isFetching) || false;
@@ -3496,79 +3584,24 @@ var emptyWorkspaceBEData = Object.assign({}, getEmptyMapWorkspace(), {
3496
3584
  });
3497
3585
  var workspaceListListener = createListenerMiddleware();
3498
3586
  workspaceListListener.startListening({
3499
- actionCreator: workspaceListActions.fetchWorkspaceList,
3587
+ actionCreator: workspaceListActions.onSuccessWorkspacePresetAction,
3500
3588
  effect: function () {
3501
3589
  var _effect = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, listenerApi) {
3502
- var workspaceFilterParams, _listenerApi$getState, common, data, isAuthError, workspaceListError;
3590
+ var _listenerApi$getOrigi, _listenerApi$getState;
3591
+ var payload, currentWorkspaceId, credentials, action, workspaceId, title, is_shared;
3503
3592
  return _regeneratorRuntime().wrap(function _callee$(_context) {
3504
3593
  while (1) switch (_context.prev = _context.next) {
3505
3594
  case 0:
3506
- workspaceFilterParams = _ref.payload;
3507
- listenerApi.cancelActiveListeners();
3508
- _listenerApi$getState = listenerApi.getState(), common = _listenerApi$getState.common;
3509
- _context.prev = 3;
3510
- _context.next = 6;
3511
- return getQueryClient().fetchQuery(workspaceQueryOptions.getWorkspacePresets(workspaceFilterParams, common == null ? void 0 : common.auth.credentials));
3512
- case 6:
3513
- data = _context.sent;
3514
- if (!listenerApi.signal.aborted) {
3515
- _context.next = 9;
3516
- break;
3517
- }
3518
- return _context.abrupt("return");
3519
- case 9:
3520
- listenerApi.dispatch(workspaceListActions.fetchedWorkspaceList({
3521
- workspaceList: data
3522
- }));
3523
- _context.next = 17;
3524
- break;
3525
- case 12:
3526
- _context.prev = 12;
3527
- _context.t0 = _context["catch"](3);
3528
- isAuthError = isAxiosAuthError(_context.t0);
3529
- workspaceListError = isAuthError ? {
3530
- type: WorkspaceListErrorType.VERBATIM_ERROR,
3531
- message: getAxiosErrorMessage(_context.t0),
3532
- category: WorkspaceListErrorCategory.AUTH
3533
- } : {
3534
- type: WorkspaceListErrorType.TRANSLATABLE_ERROR,
3535
- key: 'workspace-list-error',
3536
- category: WorkspaceListErrorCategory.GENERIC
3537
- };
3538
- listenerApi.dispatch(workspaceListActions.errorWorkspaceList({
3539
- error: workspaceListError
3540
- }));
3541
- case 17:
3542
- case "end":
3543
- return _context.stop();
3544
- }
3545
- }, _callee, null, [[3, 12]]);
3546
- }));
3547
- function effect(_x, _x2) {
3548
- return _effect.apply(this, arguments);
3549
- }
3550
- return effect;
3551
- }()
3552
- });
3553
- workspaceListListener.startListening({
3554
- actionCreator: workspaceListActions.onSuccessWorkspacePresetAction,
3555
- effect: function () {
3556
- var _effect2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2, listenerApi) {
3557
- var _listenerApi$getOrigi, _listenerApi$getState2;
3558
- var payload, currentWorkspaceId, credentials, action, workspaceId, title, is_shared, searchQuery;
3559
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
3560
- while (1) switch (_context2.prev = _context2.next) {
3561
- case 0:
3562
- payload = _ref2.payload;
3595
+ payload = _ref.payload;
3563
3596
  listenerApi.cancelActiveListeners();
3564
3597
  currentWorkspaceId = (_listenerApi$getOrigi = listenerApi.getOriginalState().workspace) == null ? void 0 : _listenerApi$getOrigi.id;
3565
- credentials = (_listenerApi$getState2 = listenerApi.getState().common) == null || (_listenerApi$getState2 = _listenerApi$getState2.auth) == null ? void 0 : _listenerApi$getState2.credentials;
3598
+ credentials = (_listenerApi$getState = listenerApi.getState().common) == null || (_listenerApi$getState = _listenerApi$getState.auth) == null ? void 0 : _listenerApi$getState.credentials;
3566
3599
  action = payload.action, workspaceId = payload.workspaceId, title = payload.title; // eslint-disable-next-line @typescript-eslint/naming-convention
3567
3600
  is_shared = 'is_shared' in payload ? payload.is_shared : undefined;
3568
- _context2.next = 8;
3601
+ _context.next = 8;
3569
3602
  return getQueryClient().invalidateQueries(workspaceQueryOptions.getWorkspacePreset(workspaceId, credentials));
3570
3603
  case 8:
3571
- _context2.next = 10;
3604
+ _context.next = 10;
3572
3605
  return getQueryClient().invalidateQueries({
3573
3606
  queryKey: workspaceQueryOptions.keys.lists()
3574
3607
  });
@@ -3586,17 +3619,14 @@ workspaceListListener.startListening({
3586
3619
  url: getWorkspaceRouteUrl(workspaceId)
3587
3620
  }));
3588
3621
  }
3589
- // Retrieve new list with current search query
3590
- searchQuery = getWorkspaceListSearchQuery(listenerApi.getState());
3591
- listenerApi.dispatch(workspaceListActions.fetchWorkspaceList(constructFilterParams([], searchQuery)));
3592
- case 15:
3622
+ case 13:
3593
3623
  case "end":
3594
- return _context2.stop();
3624
+ return _context.stop();
3595
3625
  }
3596
- }, _callee2);
3626
+ }, _callee);
3597
3627
  }));
3598
- function effect(_x3, _x4) {
3599
- return _effect2.apply(this, arguments);
3628
+ function effect(_x, _x2) {
3629
+ return _effect.apply(this, arguments);
3600
3630
  }
3601
3631
  return effect;
3602
3632
  }()
@@ -3604,43 +3634,45 @@ workspaceListListener.startListening({
3604
3634
  workspaceListListener.startListening({
3605
3635
  actionCreator: workspaceListActions.submitFormWorkspaceActionDialogOptions,
3606
3636
  effect: function () {
3607
- var _effect3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref3, listenerApi) {
3608
- var _listenerApi$getState3;
3609
- var payload, workspaceState, credentials, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, originalData, workspaceDataNewTitle, _originalData$views, _data$views2, _originalData, mergedViews, payloadToSave, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, workspaceData, viewsWithInitialProps, newWorkspace, _listenerApi$getState4, _credentials, hasChanges, message, category;
3610
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
3611
- while (1) switch (_context3.prev = _context3.next) {
3637
+ var _effect2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2, listenerApi) {
3638
+ var _listenerApi$getState2;
3639
+ var payload, workspaceState, credentials, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, originalData, workspaceDataNewTitle, _originalData$views, _data$views2, _originalData, mergedViews, payloadToSave, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, workspaceData, viewsWithInitialProps, newWorkspace, _listenerApi$getState3, _credentials, hasChanges, message, _listenerApi$getState4, category;
3640
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
3641
+ while (1) switch (_context2.prev = _context2.next) {
3612
3642
  case 0:
3613
- payload = _ref3.payload;
3643
+ payload = _ref2.payload;
3614
3644
  listenerApi.cancelActiveListeners();
3615
3645
  workspaceState = listenerApi.getState();
3616
- credentials = (_listenerApi$getState3 = listenerApi.getState().common) == null || (_listenerApi$getState3 = _listenerApi$getState3.auth) == null ? void 0 : _listenerApi$getState3.credentials;
3617
- _context3.prev = 4;
3646
+ credentials = (_listenerApi$getState2 = listenerApi.getState().common) == null || (_listenerApi$getState2 = _listenerApi$getState2.auth) == null ? void 0 : _listenerApi$getState2.credentials;
3618
3647
  presetId = payload.presetId, presetAction = payload.presetAction, data = payload.data, emptyMapPresetTitle = payload.emptyMapPresetTitle, emptyWorkspacePresetTitle = payload.emptyWorkspacePresetTitle;
3619
- scope = data.scope || 'user'; // duplicate
3648
+ scope = data.scope || 'user';
3649
+ _context2.prev = 6;
3650
+ // duplicate
3620
3651
  if (presetAction === WorkspacePresetAction.DUPLICATE) ;
3621
3652
  // delete
3622
3653
  if (presetAction === WorkspacePresetAction.DELETE || presetAction === WorkspacePresetAction.DELETE_SYSTEM_PRESET) ;
3623
3654
  // edit
3624
3655
  if (!(presetAction === WorkspacePresetAction.EDIT)) {
3625
- _context3.next = 19;
3656
+ _context2.next = 19;
3626
3657
  break;
3627
3658
  }
3628
- _context3.next = 12;
3659
+ _context2.next = 12;
3629
3660
  return getQueryClient().fetchQuery(workspaceQueryOptions.getWorkspacePreset(presetId, credentials));
3630
3661
  case 12:
3631
- originalData = _context3.sent;
3662
+ originalData = _context2.sent;
3632
3663
  workspaceDataNewTitle = Object.assign({}, originalData, {
3633
3664
  title: data.title,
3634
3665
  "abstract": data["abstract"],
3635
3666
  description: data.description,
3636
3667
  labels: data.labels,
3637
3668
  updated: data.updated,
3638
- updatedBy: data.updatedBy
3669
+ updatedBy: data.updatedBy,
3670
+ username: data.username
3639
3671
  });
3640
- _context3.next = 16;
3672
+ _context2.next = 16;
3641
3673
  return getQueryClient().fetchQuery(workspaceQueryOptions.saveWorkspacePreset(presetId, workspaceDataNewTitle, credentials));
3642
3674
  case 16:
3643
- _context3.next = 18;
3675
+ _context2.next = 18;
3644
3676
  return getQueryClient().invalidateQueries(workspaceQueryOptions.getWorkspacePreset(presetId, credentials));
3645
3677
  case 18:
3646
3678
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
@@ -3652,17 +3684,18 @@ workspaceListListener.startListening({
3652
3684
  labels: data.labels,
3653
3685
  updated: data.updated,
3654
3686
  updatedBy: data.updatedBy,
3687
+ username: data.username,
3655
3688
  scope: scope
3656
3689
  }));
3657
3690
  case 19:
3658
3691
  if (!(presetAction === WorkspacePresetAction.EDIT_TITLE)) {
3659
- _context3.next = 30;
3692
+ _context2.next = 30;
3660
3693
  break;
3661
3694
  }
3662
- _context3.next = 22;
3695
+ _context2.next = 22;
3663
3696
  return getQueryClient().fetchQuery(workspaceQueryOptions.getWorkspacePreset(presetId, credentials));
3664
3697
  case 22:
3665
- _originalData = _context3.sent;
3698
+ _originalData = _context2.sent;
3666
3699
  // 2) Merge the single (or few) edited view titles from `data.views`
3667
3700
  mergedViews = ((_originalData$views = _originalData.views) != null ? _originalData$views : []).map(function (view) {
3668
3701
  var _data$views, _updated$title;
@@ -3676,10 +3709,10 @@ workspaceListListener.startListening({
3676
3709
  payloadToSave = Object.assign({}, _originalData, {
3677
3710
  views: mergedViews
3678
3711
  });
3679
- _context3.next = 27;
3712
+ _context2.next = 27;
3680
3713
  return getQueryClient().fetchQuery(workspaceQueryOptions.saveWorkspacePreset(presetId, payloadToSave, credentials));
3681
3714
  case 27:
3682
- _context3.next = 29;
3715
+ _context2.next = 29;
3683
3716
  return getQueryClient().invalidateQueries(workspaceQueryOptions.getWorkspacePreset(presetId, credentials));
3684
3717
  case 29:
3685
3718
  // 4) Notify success so reducer updates local state
@@ -3689,6 +3722,7 @@ workspaceListListener.startListening({
3689
3722
  // keep original workspace title/abstract untouched
3690
3723
  title: _originalData.title,
3691
3724
  "abstract": _originalData["abstract"],
3725
+ username: _originalData.username,
3692
3726
  scope: scope,
3693
3727
  // you can send only the edited ones, or the merged full list.
3694
3728
  // Reducer uses mosaicNodeId+title from `views` to patch state.
@@ -3699,7 +3733,7 @@ workspaceListListener.startListening({
3699
3733
  isSaveWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET || presetAction === WorkspacePresetAction.SAVE;
3700
3734
  isSaveAsWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || presetAction === WorkspacePresetAction.SAVE_AS;
3701
3735
  if (!(isSaveWorkspaceAction || isSaveAsWorkspaceAction)) {
3702
- _context3.next = 54;
3736
+ _context2.next = 54;
3703
3737
  break;
3704
3738
  }
3705
3739
  hasWorkspaceAlreadyBeenSaved = getWorkspaceDialogIsSaved(workspaceState);
@@ -3720,17 +3754,18 @@ workspaceListListener.startListening({
3720
3754
  description: data.description,
3721
3755
  labels: data.labels,
3722
3756
  scope: scope,
3723
- views: viewsWithInitialProps
3757
+ views: viewsWithInitialProps,
3758
+ username: (credentials == null ? void 0 : credentials.username) || ''
3724
3759
  });
3725
3760
  if (!(!hasWorkspaceAlreadyBeenSaved && isSaveAsWorkspaceAction)) {
3726
- _context3.next = 44;
3761
+ _context2.next = 44;
3727
3762
  break;
3728
3763
  }
3729
- _credentials = (_listenerApi$getState4 = listenerApi.getState().common) == null || (_listenerApi$getState4 = _listenerApi$getState4.auth) == null ? void 0 : _listenerApi$getState4.credentials;
3730
- _context3.next = 42;
3764
+ _credentials = (_listenerApi$getState3 = listenerApi.getState().common) == null || (_listenerApi$getState3 = _listenerApi$getState3.auth) == null ? void 0 : _listenerApi$getState3.credentials;
3765
+ _context2.next = 42;
3731
3766
  return getQueryClient().fetchQuery(workspaceQueryOptions.saveWorkspacePresetAs(newWorkspace, _credentials));
3732
3767
  case 42:
3733
- workspaceId = _context3.sent;
3768
+ workspaceId = _context2.sent;
3734
3769
  newWorkspace = Object.assign({}, newWorkspace, {
3735
3770
  id: workspaceId
3736
3771
  });
@@ -3739,18 +3774,18 @@ workspaceListListener.startListening({
3739
3774
  presetId: workspaceId
3740
3775
  }));
3741
3776
  if (isSaveAsWorkspaceAction) {
3742
- _context3.next = 52;
3777
+ _context2.next = 52;
3743
3778
  break;
3744
3779
  }
3745
3780
  hasChanges = hasWorkspaceChanges(listenerApi.getState());
3746
3781
  if (!hasChanges) {
3747
- _context3.next = 52;
3782
+ _context2.next = 52;
3748
3783
  break;
3749
3784
  }
3750
- _context3.next = 50;
3785
+ _context2.next = 50;
3751
3786
  return getQueryClient().fetchQuery(workspaceQueryOptions.saveWorkspacePreset(workspaceId, newWorkspace, credentials));
3752
3787
  case 50:
3753
- _context3.next = 52;
3788
+ _context2.next = 52;
3754
3789
  return getQueryClient().invalidateQueries(workspaceQueryOptions.getWorkspacePreset(presetId, credentials));
3755
3790
  case 52:
3756
3791
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
@@ -3760,6 +3795,7 @@ workspaceListListener.startListening({
3760
3795
  "abstract": newWorkspace["abstract"],
3761
3796
  description: newWorkspace.description,
3762
3797
  labels: newWorkspace.labels,
3798
+ username: newWorkspace.username,
3763
3799
  scope: scope
3764
3800
  }));
3765
3801
  listenerApi.dispatch(routerActions.navigateToUrl({
@@ -3790,13 +3826,22 @@ workspaceListListener.startListening({
3790
3826
  scope: scope
3791
3827
  }));
3792
3828
  }
3793
- _context3.next = 62;
3829
+ _context2.next = 63;
3794
3830
  break;
3795
3831
  case 57:
3796
- _context3.prev = 57;
3797
- _context3.t0 = _context3["catch"](4);
3798
- message = isAxiosError(_context3.t0) ? getAxiosErrorMessage(_context3.t0) : _context3.t0.message;
3799
- category = isAxiosAuthError(_context3.t0) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
3832
+ _context2.prev = 57;
3833
+ _context2.t0 = _context2["catch"](6);
3834
+ message = isAxiosError(_context2.t0) ? getAxiosErrorMessage(_context2.t0) : _context2.t0.message;
3835
+ if (presetAction === WorkspacePresetAction.SAVE || presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET) {
3836
+ listenerApi.dispatch(workspaceActions.errorWorkspace({
3837
+ workspaceId: presetId || ((_listenerApi$getState4 = listenerApi.getState().workspace) == null ? void 0 : _listenerApi$getState4.id) || '',
3838
+ error: {
3839
+ message: message,
3840
+ type: WorkspaceErrorType.SAVE
3841
+ }
3842
+ }));
3843
+ }
3844
+ category = isAuthError(_context2.t0) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
3800
3845
  listenerApi.dispatch(workspaceListActions.onErrorWorkspacePresetAction({
3801
3846
  error: {
3802
3847
  type: WorkspaceListErrorType.VERBATIM_ERROR,
@@ -3804,14 +3849,14 @@ workspaceListListener.startListening({
3804
3849
  message: message
3805
3850
  }
3806
3851
  }));
3807
- case 62:
3852
+ case 63:
3808
3853
  case "end":
3809
- return _context3.stop();
3854
+ return _context2.stop();
3810
3855
  }
3811
- }, _callee3, null, [[4, 57]]);
3856
+ }, _callee2, null, [[6, 57]]);
3812
3857
  }));
3813
- function effect(_x5, _x6) {
3814
- return _effect3.apply(this, arguments);
3858
+ function effect(_x3, _x4) {
3859
+ return _effect2.apply(this, arguments);
3815
3860
  }
3816
3861
  return effect;
3817
3862
  }()
@@ -3959,7 +4004,13 @@ workspaceListener.startListening({
3959
4004
  isInline: hasInlineConfig
3960
4005
  }));
3961
4006
  });
3962
- case 18:
4007
+ if (payload.markAsChanged) {
4008
+ listenerApi.dispatch(workspaceActions.markWorkspaceChanged());
4009
+ listenerApi.dispatch(routerActions.navigateToUrl({
4010
+ url: getWorkspaceRouteUrl()
4011
+ }));
4012
+ }
4013
+ case 19:
3963
4014
  case "end":
3964
4015
  return _context4.stop();
3965
4016
  }
@@ -4184,7 +4235,7 @@ workspaceListener.startListening({
4184
4235
  actionCreator: workspaceActions.saveWorkspacePreset,
4185
4236
  effect: function () {
4186
4237
  var _effect6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0(_ref9, listenerApi) {
4187
- var payload, workspace, _listenerApi$getState3, _workspace$scope, credentials;
4238
+ var payload, workspace, _listenerApi$getState3, _workspace$scope, _workspace$username, credentials;
4188
4239
  return _regeneratorRuntime().wrap(function _callee0$(_context0) {
4189
4240
  while (1) switch (_context0.prev = _context0.next) {
4190
4241
  case 0:
@@ -4206,7 +4257,8 @@ workspaceListener.startListening({
4206
4257
  workspaceId: workspace.id,
4207
4258
  title: workspace.title,
4208
4259
  scope: (_workspace$scope = workspace.scope) != null ? _workspace$scope : 'user',
4209
- views: workspace.views || [emptyWorkspaceBEData]
4260
+ views: workspace.views || [emptyWorkspaceBEData],
4261
+ username: (_workspace$username = workspace.username) != null ? _workspace$username : ''
4210
4262
  }));
4211
4263
  _context0.next = 16;
4212
4264
  break;
@@ -4412,100 +4464,6 @@ workspaceListener.startListening({
4412
4464
  }()
4413
4465
  });
4414
4466
 
4415
- /* *
4416
- * Licensed under the Apache License, Version 2.0 (the "License");
4417
- * you may not use this file except in compliance with the License.
4418
- * You may obtain a copy of the License at
4419
- *
4420
- * http://www.apache.org/licenses/LICENSE-2.0
4421
- *
4422
- * Unless required by applicable law or agreed to in writing, software
4423
- * distributed under the License is distributed on an "AS IS" BASIS,
4424
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4425
- * See the License for the specific language governing permissions and
4426
- * limitations under the License.
4427
- *
4428
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4429
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
4430
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
4431
- * */
4432
- var viewPresetsListAdapter = createEntityAdapter();
4433
- var initialState = viewPresetsListAdapter.getInitialState();
4434
- var slice = createSlice({
4435
- initialState: initialState,
4436
- name: 'viewPresetsList',
4437
- reducers: {
4438
- fetchViewPresetsList: function fetchViewPresetsList(_draft, _action) {
4439
- // action is intercepted in viewPresets/listener
4440
- },
4441
- fetchedViewPresetsList: function fetchedViewPresetsList(draft, action) {
4442
- var viewPresets = action.payload.viewPresets;
4443
- if (!(viewPresets != null && viewPresets.length)) {
4444
- viewPresetsListAdapter.removeAll(draft);
4445
- return;
4446
- }
4447
- viewPresetsListAdapter.setAll(draft, viewPresets);
4448
- }
4449
- },
4450
- extraReducers: function extraReducers(builder) {
4451
- builder.addCase(viewPresetActions.fetchedViewPresets, function (draft, action) {
4452
- var _action$payload = action.payload,
4453
- viewPresets = _action$payload.viewPresets,
4454
- filterParams = _action$payload.filterParams;
4455
- // If there are filter params applied, don't do anything, these results are put in the specific panel filterResults
4456
- var hasFilterParams = Object.keys(filterParams).length !== 0;
4457
- var isDefaultScopeOnly = Object.keys(filterParams).length === 1 && filterParams.scope === 'user,system';
4458
- if (hasFilterParams && !isDefaultScopeOnly) {
4459
- return;
4460
- }
4461
- if (!(viewPresets != null && viewPresets.length)) {
4462
- viewPresetsListAdapter.removeAll(draft);
4463
- return;
4464
- }
4465
- viewPresetsListAdapter.setAll(draft, action.payload.viewPresets);
4466
- });
4467
- }
4468
- });
4469
- var viewPresetsListReducer = slice.reducer,
4470
- viewPresetsListActions = slice.actions;
4471
-
4472
- /* *
4473
- * Licensed under the Apache License, Version 2.0 (the "License");
4474
- * you may not use this file except in compliance with the License.
4475
- * You may obtain a copy of the License at
4476
- *
4477
- * http://www.apache.org/licenses/LICENSE-2.0
4478
- *
4479
- * Unless required by applicable law or agreed to in writing, software
4480
- * distributed under the License is distributed on an "AS IS" BASIS,
4481
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4482
- * See the License for the specific language governing permissions and
4483
- * limitations under the License.
4484
- *
4485
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4486
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
4487
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
4488
- * */
4489
- // Used to retrieve the unfiltered, general view preset list.
4490
- // To ensure you retrieve the view preset list specific for your view, use getFilteredViewPresetListForView
4491
- var _viewPresetsListAdapt = viewPresetsListAdapter.getSelectors(function (state) {
4492
- var _state$viewPresetsLis;
4493
- return (_state$viewPresetsLis = state == null ? void 0 : state.viewPresetsList) != null ? _state$viewPresetsLis : {
4494
- entities: {},
4495
- ids: []
4496
- };
4497
- }),
4498
- getViewPresetsList = _viewPresetsListAdapt.selectAll,
4499
- getViewPresetFromList = _viewPresetsListAdapt.selectById;
4500
- var getFilteredViewPresetListForView = createSelector(getViewPresetsList, getViewPresetListFilterResultsForView, getViewPresetListSearchQueryForView, function (fullViewPresetsList, filteredResults, searchQuery) {
4501
- if (searchQuery !== '') {
4502
- // Search active: return what backend gave us
4503
- return filteredResults;
4504
- }
4505
- // No search: return full unfiltered list
4506
- return fullViewPresetsList != null ? fullViewPresetsList : [];
4507
- }, selectorMemoizationOptions);
4508
-
4509
4467
  var processError = function processError(error, component, errorMessageKey) {
4510
4468
  var message = isAxiosError$1(error) ? getAxiosErrorMessage(error) : errorMessageKey;
4511
4469
  var errorType = isAxiosAuthError(error) ? ViewPresetErrorType.AUTH : ViewPresetErrorType.GENERIC;
@@ -4516,92 +4474,18 @@ var processError = function processError(error, component, errorMessageKey) {
4516
4474
  };
4517
4475
  };
4518
4476
  var viewPresetsListener = createListenerMiddleware();
4519
- // fetch view presets
4520
- viewPresetsListener.startListening({
4521
- actionCreator: viewPresetActions.fetchViewPresets,
4522
- effect: function () {
4523
- var _effect = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, listenerApi) {
4524
- var payload, _listenerApi$getState, common, panelId, filterParams, viewPresets;
4525
- return _regeneratorRuntime().wrap(function _callee$(_context) {
4526
- while (1) switch (_context.prev = _context.next) {
4527
- case 0:
4528
- payload = _ref.payload;
4529
- listenerApi.cancelActiveListeners();
4530
- _listenerApi$getState = listenerApi.getState(), common = _listenerApi$getState.common;
4531
- panelId = payload.panelId, filterParams = payload.filterParams;
4532
- _context.prev = 4;
4533
- _context.next = 7;
4534
- return getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPresets(filterParams, common == null ? void 0 : common.auth.credentials));
4535
- case 7:
4536
- viewPresets = _context.sent;
4537
- listenerApi.dispatch(viewPresetActions.fetchedViewPresets({
4538
- viewPresets: viewPresets,
4539
- panelId: panelId,
4540
- filterParams: filterParams
4541
- }));
4542
- _context.next = 14;
4543
- break;
4544
- case 11:
4545
- _context.prev = 11;
4546
- _context.t0 = _context["catch"](4);
4547
- listenerApi.dispatch(viewPresetActions.errorViewPreset({
4548
- error: processError(_context.t0, ViewPresetErrorComponent.PRESET_LIST, 'workspace-mappreset-error-fetch'),
4549
- panelId: panelId
4550
- }));
4551
- case 14:
4552
- case "end":
4553
- return _context.stop();
4554
- }
4555
- }, _callee, null, [[4, 11]]);
4556
- }));
4557
- function effect(_x, _x2) {
4558
- return _effect.apply(this, arguments);
4559
- }
4560
- return effect;
4561
- }()
4562
- });
4563
- // fetch full view presets list
4564
- viewPresetsListener.startListening({
4565
- actionCreator: viewPresetsListActions.fetchViewPresetsList,
4566
- effect: function () {
4567
- var _effect2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_, listenerApi) {
4568
- var _listenerApi$getState2, common, viewPresets;
4569
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
4570
- while (1) switch (_context2.prev = _context2.next) {
4571
- case 0:
4572
- _listenerApi$getState2 = listenerApi.getState(), common = _listenerApi$getState2.common;
4573
- listenerApi.cancelActiveListeners();
4574
- _context2.next = 4;
4575
- return getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPresets(undefined, common == null ? void 0 : common.auth.credentials));
4576
- case 4:
4577
- viewPresets = _context2.sent;
4578
- listenerApi.dispatch(viewPresetsListActions.fetchedViewPresetsList({
4579
- viewPresets: viewPresets
4580
- }));
4581
- case 6:
4582
- case "end":
4583
- return _context2.stop();
4584
- }
4585
- }, _callee2);
4586
- }));
4587
- function effect(_x3, _x4) {
4588
- return _effect2.apply(this, arguments);
4589
- }
4590
- return effect;
4591
- }()
4592
- });
4593
4477
  var saveViewPresetEffect = /*#__PURE__*/function () {
4594
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref2, listenerApi) {
4595
- var payload, panelId, viewPreset, viewPresetId, hasChanges, _listenerApi$getState3, credentials;
4596
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
4597
- while (1) switch (_context3.prev = _context3.next) {
4478
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, listenerApi) {
4479
+ var payload, panelId, viewPreset, viewPresetId, hasChanges, _listenerApi$getState, credentials;
4480
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
4481
+ while (1) switch (_context.prev = _context.next) {
4598
4482
  case 0:
4599
- payload = _ref2.payload;
4483
+ payload = _ref.payload;
4600
4484
  listenerApi.cancelActiveListeners();
4601
4485
  panelId = payload.panelId, viewPreset = payload.viewPreset, viewPresetId = payload.viewPresetId;
4602
4486
  hasChanges = getViewPresetHasChanges(listenerApi.getState(), panelId);
4603
4487
  if (hasChanges) {
4604
- _context3.next = 8;
4488
+ _context.next = 8;
4605
4489
  break;
4606
4490
  }
4607
4491
  listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage(PresetAction.SAVE, viewPreset.title)));
@@ -4609,17 +4493,17 @@ var saveViewPresetEffect = /*#__PURE__*/function () {
4609
4493
  panelId: panelId,
4610
4494
  viewPresetId: viewPresetId
4611
4495
  }));
4612
- return _context3.abrupt("return");
4496
+ return _context.abrupt("return");
4613
4497
  case 8:
4614
- _context3.prev = 8;
4615
- credentials = (_listenerApi$getState3 = listenerApi.getState().common) == null || (_listenerApi$getState3 = _listenerApi$getState3.auth) == null ? void 0 : _listenerApi$getState3.credentials;
4616
- _context3.next = 12;
4498
+ _context.prev = 8;
4499
+ credentials = (_listenerApi$getState = listenerApi.getState().common) == null || (_listenerApi$getState = _listenerApi$getState.auth) == null ? void 0 : _listenerApi$getState.credentials;
4500
+ _context.next = 12;
4617
4501
  return getQueryClient().fetchQuery(viewpresetQueryOptions.saveViewPreset(viewPresetId, viewPreset, credentials));
4618
4502
  case 12:
4619
- _context3.next = 14;
4503
+ _context.next = 14;
4620
4504
  return getQueryClient().invalidateQueries(viewpresetQueryOptions.getViewPreset(viewPresetId));
4621
4505
  case 14:
4622
- _context3.next = 16;
4506
+ _context.next = 16;
4623
4507
  return getQueryClient().invalidateQueries({
4624
4508
  queryKey: viewpresetQueryOptions.keys.lists()
4625
4509
  });
@@ -4634,24 +4518,24 @@ var saveViewPresetEffect = /*#__PURE__*/function () {
4634
4518
  viewPresetId: viewPresetId,
4635
4519
  viewPreset: viewPreset
4636
4520
  }));
4637
- _context3.next = 24;
4521
+ _context.next = 24;
4638
4522
  break;
4639
4523
  case 21:
4640
- _context3.prev = 21;
4641
- _context3.t0 = _context3["catch"](8);
4524
+ _context.prev = 21;
4525
+ _context.t0 = _context["catch"](8);
4642
4526
  listenerApi.dispatch(viewPresetActions.errorViewPreset({
4643
- error: processError(_context3.t0, ViewPresetErrorComponent.PRESET_DETAIL, 'workspace-mappreset-error-save'),
4527
+ error: processError(_context.t0, ViewPresetErrorComponent.PRESET_DETAIL, 'workspace-mappreset-error-save'),
4644
4528
  panelId: panelId,
4645
4529
  viewPresetId: viewPresetId
4646
4530
  }));
4647
4531
  case 24:
4648
4532
  case "end":
4649
- return _context3.stop();
4533
+ return _context.stop();
4650
4534
  }
4651
- }, _callee3, null, [[8, 21]]);
4535
+ }, _callee, null, [[8, 21]]);
4652
4536
  }));
4653
- return function saveViewPresetEffect(_x5, _x6) {
4654
- return _ref3.apply(this, arguments);
4537
+ return function saveViewPresetEffect(_x, _x2) {
4538
+ return _ref2.apply(this, arguments);
4655
4539
  };
4656
4540
  }();
4657
4541
  // save view preset
@@ -4663,12 +4547,12 @@ viewPresetsListener.startListening({
4663
4547
  viewPresetsListener.startListening({
4664
4548
  actionCreator: viewPresetActions.selectViewPreset,
4665
4549
  effect: function () {
4666
- var _effect3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref4, listenerApi) {
4550
+ var _effect = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref3, listenerApi) {
4667
4551
  var payload, panelId, _payload$viewPresetId, viewPresetId, isMapAnimating;
4668
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
4669
- while (1) switch (_context4.prev = _context4.next) {
4552
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
4553
+ while (1) switch (_context2.prev = _context2.next) {
4670
4554
  case 0:
4671
- payload = _ref4.payload;
4555
+ payload = _ref3.payload;
4672
4556
  listenerApi.cancelActiveListeners();
4673
4557
  panelId = payload.panelId, _payload$viewPresetId = payload.viewPresetId, viewPresetId = _payload$viewPresetId === void 0 ? '' : _payload$viewPresetId;
4674
4558
  isMapAnimating = mapSelectors.isAnimating(listenerApi.getState(), panelId);
@@ -4702,12 +4586,12 @@ viewPresetsListener.startListening({
4702
4586
  }
4703
4587
  case 6:
4704
4588
  case "end":
4705
- return _context4.stop();
4589
+ return _context2.stop();
4706
4590
  }
4707
- }, _callee4);
4591
+ }, _callee2);
4708
4592
  }));
4709
- function effect(_x7, _x8) {
4710
- return _effect3.apply(this, arguments);
4593
+ function effect(_x3, _x4) {
4594
+ return _effect.apply(this, arguments);
4711
4595
  }
4712
4596
  return effect;
4713
4597
  }()
@@ -4716,19 +4600,19 @@ viewPresetsListener.startListening({
4716
4600
  viewPresetsListener.startListening({
4717
4601
  actionCreator: viewPresetActions.onSuccessViewPresetAction,
4718
4602
  effect: function () {
4719
- var _effect4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(_ref5, listenerApi) {
4603
+ var _effect2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref4, listenerApi) {
4720
4604
  var payload, action, viewPresetId, title, panelId, is_shared, activeMapPresetId, hasChanges, viewPresetSearchQuery;
4721
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
4722
- while (1) switch (_context5.prev = _context5.next) {
4605
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
4606
+ while (1) switch (_context3.prev = _context3.next) {
4723
4607
  case 0:
4724
- payload = _ref5.payload;
4608
+ payload = _ref4.payload;
4725
4609
  listenerApi.cancelActiveListeners();
4726
4610
  action = payload.action, viewPresetId = payload.viewPresetId, title = payload.title, panelId = payload.panelId; // eslint-disable-next-line @typescript-eslint/naming-convention
4727
4611
  is_shared = 'is_shared' in payload ? payload.is_shared : undefined;
4728
- _context5.next = 6;
4612
+ _context3.next = 6;
4729
4613
  return getQueryClient().invalidateQueries(viewpresetQueryOptions.getViewPreset(viewPresetId));
4730
4614
  case 6:
4731
- _context5.next = 8;
4615
+ _context3.next = 8;
4732
4616
  return getQueryClient().invalidateQueries({
4733
4617
  queryKey: viewpresetQueryOptions.keys.lists()
4734
4618
  });
@@ -4750,9 +4634,6 @@ viewPresetsListener.startListening({
4750
4634
  panelId: panelId,
4751
4635
  filterParams: constructFilterParams([], viewPresetSearchQuery)
4752
4636
  }));
4753
- } else {
4754
- // Fetch the full list to update the list store with the latest presets
4755
- listenerApi.dispatch(viewPresetsListActions.fetchViewPresetsList());
4756
4637
  }
4757
4638
  if (action !== PresetAction.EDIT) {
4758
4639
  listenerApi.dispatch(viewPresetActions.setViewPresetHasChanges({
@@ -4771,12 +4652,12 @@ viewPresetsListener.startListening({
4771
4652
  }
4772
4653
  case 9:
4773
4654
  case "end":
4774
- return _context5.stop();
4655
+ return _context3.stop();
4775
4656
  }
4776
- }, _callee5);
4657
+ }, _callee3);
4777
4658
  }));
4778
- function effect(_x9, _x0) {
4779
- return _effect4.apply(this, arguments);
4659
+ function effect(_x5, _x6) {
4660
+ return _effect2.apply(this, arguments);
4780
4661
  }
4781
4662
  return effect;
4782
4663
  }()
@@ -4808,7 +4689,6 @@ var workspaceReducersMap = {
4808
4689
  ui: uiReducer,
4809
4690
  workspace: workspaceReducer,
4810
4691
  workspaceList: workspaceListReducer,
4811
- viewPresetsList: viewPresetsListReducer,
4812
4692
  viewPresets: viewPresetsReducer,
4813
4693
  timeSeries: timeSeriesReducer,
4814
4694
  soundings: soundingsReducer,
@@ -4949,12 +4829,12 @@ var WorkspaceI18nProvider = function WorkspaceI18nProvider(_ref5) {
4949
4829
  });
4950
4830
  };
4951
4831
 
4952
- var _excluded$5 = ["component", "payload"];
4832
+ var _excluded$6 = ["component", "payload"];
4953
4833
  // takes a component and connects module methods with workspace store
4954
4834
  var ComponentsLookUpWrapper = function ComponentsLookUpWrapper(_ref) {
4955
4835
  var component = _ref.component,
4956
4836
  payload = _ref.payload,
4957
- props = _objectWithoutPropertiesLoose(_ref, _excluded$5);
4837
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$6);
4958
4838
  var RenderComponent = component;
4959
4839
  var dispatch = useDispatch();
4960
4840
  var viewId = payload.id;
@@ -5152,6 +5032,7 @@ var LinkMenuConnect = function LinkMenuConnect(_ref) {
5152
5032
  children: maps.map(function (mapId) {
5153
5033
  var _viewsById$mapId;
5154
5034
  var labelId = "checkbox-link-label-" + mapId;
5035
+ var mapTitle = constructSyncSourceDisplayName(mapId, viewsById[mapId], ((_viewsById$mapId = viewsById[mapId]) == null ? void 0 : _viewsById$mapId.title) || mapId);
5155
5036
  return jsx(ListItem, {
5156
5037
  dense: true,
5157
5038
  disablePadding: true,
@@ -5180,8 +5061,7 @@ var LinkMenuConnect = function LinkMenuConnect(_ref) {
5180
5061
  })
5181
5062
  }), jsx(ListItemText, {
5182
5063
  id: labelId,
5183
- primary: (_viewsById$mapId = viewsById[mapId]) == null ? void 0 : _viewsById$mapId.title,
5184
- secondary: mapId
5064
+ primary: mapTitle
5185
5065
  })]
5186
5066
  })
5187
5067
  }, mapId);
@@ -5191,13 +5071,29 @@ var LinkMenuConnect = function LinkMenuConnect(_ref) {
5191
5071
  });
5192
5072
  };
5193
5073
 
5074
+ var wrapInMenuItem = function wrapInMenuItem(inMenuItem, component, isDisabled) {
5075
+ if (isDisabled === void 0) {
5076
+ isDisabled = false;
5077
+ }
5078
+ if (inMenuItem) {
5079
+ return jsx(MenuItem, {
5080
+ disabled: isDisabled,
5081
+ children: component
5082
+ });
5083
+ }
5084
+ return component;
5085
+ };
5194
5086
  var buttonStyle$1 = {
5195
5087
  marginLeft: 0.5,
5196
5088
  marginRight: 0.5
5197
5089
  };
5198
5090
  var SplitButtonsConnect = function SplitButtonsConnect(_ref) {
5199
5091
  var panelId = _ref.panelId,
5200
- path = _ref.path;
5092
+ path = _ref.path,
5093
+ _ref$inMenuItem = _ref.inMenuItem,
5094
+ inMenuItem = _ref$inMenuItem === void 0 ? false : _ref$inMenuItem,
5095
+ _ref$isVerticalSplitD = _ref.isVerticalSplitDisabled,
5096
+ isVerticalSplitDisabled = _ref$isVerticalSplitD === void 0 ? false : _ref$isVerticalSplitD;
5201
5097
  var _useWorkspaceTranslat = useWorkspaceTranslation(),
5202
5098
  t = _useWorkspaceTranslat.t;
5203
5099
  var _React$useContext = React.useContext(MosaicContext),
@@ -5212,19 +5108,19 @@ var SplitButtonsConnect = function SplitButtonsConnect(_ref) {
5212
5108
  var addView = React.useCallback(function (view) {
5213
5109
  dispatch(workspaceActions.setNewWorkspaceView(view));
5214
5110
  }, [dispatch]);
5215
- var createNode = React.useCallback(function (shiftPressed) {
5111
+ var createNode = React.useCallback(function (copyContent) {
5216
5112
  var newId = getUniqueId(viewIds);
5217
5113
  addView({
5218
- // If shift not pressed - open new map
5219
- componentType: shiftPressed ? viewComponentType : 'Map',
5114
+ // If content not copied - open new map
5115
+ componentType: copyContent ? viewComponentType : 'Map',
5220
5116
  mosaicNodeId: panelId,
5221
5117
  newId: newId,
5222
- copyOriginalcontent: shiftPressed
5118
+ copyOriginalcontent: copyContent
5223
5119
  });
5224
5120
  return newId;
5225
5121
  }, [addView, panelId, viewComponentType, viewIds]);
5226
5122
  return jsxs(Fragment, {
5227
- children: [jsx(CustomIconButton, {
5123
+ children: [wrapInMenuItem(inMenuItem, jsx(CustomIconButton, {
5228
5124
  "data-testid": "split-horizontal-btn",
5229
5125
  onClick: function onClick(event) {
5230
5126
  var newNode = createNode(event.shiftKey);
@@ -5237,9 +5133,10 @@ var SplitButtonsConnect = function SplitButtonsConnect(_ref) {
5237
5133
  },
5238
5134
  sx: buttonStyle$1,
5239
5135
  tooltipTitle: t('workspace-control-split-horizontal') + " - " + t('workspace-control-split-shift'),
5240
- children: jsx(SplitVertical, {})
5241
- }), jsx(CustomIconButton, {
5136
+ children: jsx(SplitHorizontal, {})
5137
+ })), wrapInMenuItem(inMenuItem, jsx(CustomIconButton, {
5242
5138
  "data-testid": "split-vertical-btn",
5139
+ disabled: isVerticalSplitDisabled,
5243
5140
  onClick: function onClick(event) {
5244
5141
  var newNode = createNode(event.shiftKey);
5245
5142
  var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
@@ -5251,8 +5148,39 @@ var SplitButtonsConnect = function SplitButtonsConnect(_ref) {
5251
5148
  },
5252
5149
  sx: buttonStyle$1,
5253
5150
  tooltipTitle: t('workspace-control-split-vertical') + " - " + t('workspace-control-split-shift'),
5254
- children: jsx(SplitHorizontal, {})
5255
- })]
5151
+ children: jsx(SplitVertical, {})
5152
+ }), isVerticalSplitDisabled), wrapInMenuItem(inMenuItem, jsx(CustomIconButton, {
5153
+ "data-testid": "split-horizontal-btn-copy-content",
5154
+ onClick: function onClick(event) {
5155
+ // Always copy over content
5156
+ var newNode = createNode(true);
5157
+ var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
5158
+ actions.replaceWith(path, {
5159
+ direction: 'column',
5160
+ first: previousNode,
5161
+ second: newNode
5162
+ });
5163
+ },
5164
+ sx: buttonStyle$1,
5165
+ tooltipTitle: t('workspace-control-split-horizontal-with-data'),
5166
+ children: jsx(SplitHorizontalWithContent, {})
5167
+ })), wrapInMenuItem(inMenuItem, jsx(CustomIconButton, {
5168
+ "data-testid": "split-vertical-btn-copy-content",
5169
+ disabled: isVerticalSplitDisabled,
5170
+ onClick: function onClick(event) {
5171
+ // Always copy over content
5172
+ var newNode = createNode(true);
5173
+ var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
5174
+ actions.replaceWith(path, {
5175
+ direction: 'row',
5176
+ first: previousNode,
5177
+ second: newNode
5178
+ });
5179
+ },
5180
+ sx: buttonStyle$1,
5181
+ tooltipTitle: t('workspace-control-split-vertical-with-data'),
5182
+ children: jsx(SplitVerticalWithContent, {})
5183
+ }), isVerticalSplitDisabled)]
5256
5184
  });
5257
5185
  };
5258
5186
 
@@ -5261,12 +5189,21 @@ var buttonStyle = {
5261
5189
  marginRight: 0.5
5262
5190
  };
5263
5191
  var WorkspaceControls = function WorkspaceControls(_ref) {
5192
+ var _sx, _sx2;
5264
5193
  var panelId = _ref.panelId;
5265
5194
  _ref.createNode;
5266
5195
  var path = _ref.path,
5267
5196
  _ref$shouldPreventClo = _ref.shouldPreventCloseView,
5268
5197
  shouldPreventCloseView = _ref$shouldPreventClo === void 0 ? false : _ref$shouldPreventClo,
5269
5198
  removeLinkedMap = _ref.removeLinkedMap;
5199
+ var theme = useTheme();
5200
+ var _React$useState = React.useState(null),
5201
+ anchorEl = _React$useState[0],
5202
+ setAnchorEl = _React$useState[1];
5203
+ var isOpen = Boolean(anchorEl);
5204
+ var handleClick = function handleClick(event) {
5205
+ setAnchorEl(anchorEl ? null : event.currentTarget);
5206
+ };
5270
5207
  var confirmDialog = useConfirmationDialog();
5271
5208
  var _React$useContext = React.useContext(MosaicContext),
5272
5209
  actions = _React$useContext.mosaicActions;
@@ -5275,15 +5212,15 @@ var WorkspaceControls = function WorkspaceControls(_ref) {
5275
5212
  var mosaicNode = useSelector(function (store) {
5276
5213
  return getMosaicNode(store);
5277
5214
  });
5278
- var _React$useState = React.useState(),
5279
- stateAfterExpand = _React$useState[0],
5280
- setStateAfterExpand = _React$useState[1];
5281
- var _React$useState2 = React.useState(mosaicNode),
5282
- stateBeforeExpand = _React$useState2[0],
5283
- setStateBeforeExpand = _React$useState2[1];
5284
- var _React$useState3 = React.useState(false),
5285
- enableUnexpand = _React$useState3[0],
5286
- setEnableUnexpand = _React$useState3[1];
5215
+ var _React$useState2 = React.useState(),
5216
+ stateAfterExpand = _React$useState2[0],
5217
+ setStateAfterExpand = _React$useState2[1];
5218
+ var _React$useState3 = React.useState(mosaicNode),
5219
+ stateBeforeExpand = _React$useState3[0],
5220
+ setStateBeforeExpand = _React$useState3[1];
5221
+ var _React$useState4 = React.useState(false),
5222
+ enableUnexpand = _React$useState4[0],
5223
+ setEnableUnexpand = _React$useState4[1];
5287
5224
  React.useEffect(function () {
5288
5225
  if (enableUnexpand) {
5289
5226
  if (stateAfterExpand === undefined) {
@@ -5329,31 +5266,100 @@ var WorkspaceControls = function WorkspaceControls(_ref) {
5329
5266
  return _ref2.apply(this, arguments);
5330
5267
  };
5331
5268
  }();
5269
+ var expandButton = !enableUnexpand || isString(mosaicNode) ? jsx(CustomIconButton, {
5270
+ "data-testid": "expand-btn",
5271
+ onClick: function onClick() {
5272
+ setStateBeforeExpand(mosaicNode);
5273
+ setEnableUnexpand(true);
5274
+ actions.expand(path, 70);
5275
+ },
5276
+ sx: buttonStyle,
5277
+ tooltipTitle: t('workspace-control-expand'),
5278
+ children: jsx(Expand, {})
5279
+ }) : jsx(CustomIconButton, {
5280
+ "data-testid": "unexpand-btn",
5281
+ onClick: function onClick() {
5282
+ var stateBeforeExpandCopy = isString(stateBeforeExpand) ? stateBeforeExpand : Object.assign({}, stateBeforeExpand);
5283
+ actions.replaceWith([], stateBeforeExpandCopy);
5284
+ },
5285
+ sx: buttonStyle,
5286
+ tooltipTitle: t('workspace-control-unexpand'),
5287
+ children: jsx(UnExpand, {})
5288
+ });
5332
5289
  return jsxs(Fragment, {
5333
- children: [jsx(LinkMenuConnect, {
5334
- panelId: panelId
5335
- }), jsx(SplitButtonsConnect, {
5336
- panelId: panelId,
5337
- path: path
5338
- }), !enableUnexpand || isString(mosaicNode) ? jsx(CustomIconButton, {
5339
- "data-testid": "expand-btn",
5340
- onClick: function onClick() {
5341
- setStateBeforeExpand(mosaicNode);
5342
- setEnableUnexpand(true);
5343
- actions.expand(path, 70);
5344
- },
5345
- sx: buttonStyle,
5346
- tooltipTitle: t('workspace-control-expand'),
5347
- children: jsx(Expand, {})
5348
- }) : jsx(CustomIconButton, {
5349
- "data-testid": "unexpand-btn",
5350
- onClick: function onClick() {
5351
- var stateBeforeExpandCopy = isString(stateBeforeExpand) ? stateBeforeExpand : Object.assign({}, stateBeforeExpand);
5352
- actions.replaceWith([], stateBeforeExpandCopy);
5353
- },
5354
- sx: buttonStyle,
5355
- tooltipTitle: t('workspace-control-unexpand'),
5356
- children: jsx(UnExpand, {})
5290
+ children: [jsxs(Box, {
5291
+ "data-testid": "workspace-view-controls-options-dropdown",
5292
+ sx: (_sx = {}, _sx["@container workspace-view-container (min-width: 495px)"] = {
5293
+ display: 'none'
5294
+ }, _sx.paddingLeft = '8px', _sx),
5295
+ children: [jsx(LinkMenuConnect, {
5296
+ panelId: panelId
5297
+ }), jsxs(CustomIconButton, {
5298
+ "aria-label": "workspace view controls",
5299
+ "data-testid": "workspace-view-controls",
5300
+ isSelected: isOpen,
5301
+ onClick: handleClick,
5302
+ sx: {
5303
+ '&&': {
5304
+ backgroundColor: !isOpen ? 'transparent' : 'geowebColors.workspace.tabButtonHover',
5305
+ '&:hover': {
5306
+ backgroundColor: 'geowebColors.workspace.tabButtonHover'
5307
+ },
5308
+ '.MuiSvgIcon-root > path': {
5309
+ fill: isOpen ? theme.palette.geowebColors.iconButtons.tool.active.color : undefined
5310
+ }
5311
+ }
5312
+ },
5313
+ tooltipTitle: t('workspace-control-show-options'),
5314
+ variant: "tool",
5315
+ children: [jsx(ChevronDown, {}), jsxs(Menu, {
5316
+ anchorEl: anchorEl,
5317
+ anchorOrigin: {
5318
+ vertical: 21,
5319
+ horizontal: 6
5320
+ },
5321
+ onClose: function onClose() {
5322
+ return setAnchorEl(null);
5323
+ },
5324
+ open: !!isOpen,
5325
+ slotProps: {
5326
+ backdrop: {
5327
+ style: {
5328
+ opacity: 0,
5329
+ transition: 'none'
5330
+ }
5331
+ }
5332
+ },
5333
+ sx: {
5334
+ '& .MuiMenu-list': {
5335
+ padding: 0
5336
+ },
5337
+ '& .MuiMenuItem-root': {
5338
+ padding: '2px',
5339
+ minHeight: '32px !important'
5340
+ }
5341
+ },
5342
+ children: [jsx(SplitButtonsConnect, {
5343
+ inMenuItem: true,
5344
+ isVerticalSplitDisabled: true,
5345
+ panelId: panelId,
5346
+ path: path
5347
+ }), jsx(MenuItem, {
5348
+ children: expandButton
5349
+ })]
5350
+ })]
5351
+ })]
5352
+ }), jsxs(Box, {
5353
+ "data-testid": "workspace-view-controls-options-buttons",
5354
+ sx: (_sx2 = {}, _sx2["@container workspace-view-container (max-width: 494px)"] = {
5355
+ display: 'none'
5356
+ }, _sx2.paddingLeft = '4px', _sx2),
5357
+ children: [jsx(LinkMenuConnect, {
5358
+ panelId: panelId
5359
+ }), jsx(SplitButtonsConnect, {
5360
+ panelId: panelId,
5361
+ path: path
5362
+ }), expandButton]
5357
5363
  }), jsx(CustomIconButton, {
5358
5364
  "data-testid": "close-btn",
5359
5365
  id: "close-window-button",
@@ -5388,22 +5394,6 @@ var useFetchViewPresets = function useFetchViewPresets(panelId) {
5388
5394
  currentRole = _useAuthenticationCon.currentRole;
5389
5395
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
5390
5396
  var lastAdmin = usePrevious(isAdmin);
5391
- var viewPresetListSearchQuery = useSelector(function (store) {
5392
- return getViewPresetListSearchQueryForView(store, panelId);
5393
- });
5394
- var prevSearch = usePrevious(viewPresetListSearchQuery);
5395
- var fetchViewPresets = useCallback(function (params) {
5396
- dispatch(viewPresetActions.fetchViewPresets(params));
5397
- }, [dispatch]);
5398
- useEffect(function () {
5399
- if (viewPresetListSearchQuery !== prevSearch) {
5400
- var filterParams = constructFilterParams([], viewPresetListSearchQuery);
5401
- fetchViewPresets({
5402
- filterParams: filterParams,
5403
- panelId: panelId
5404
- });
5405
- }
5406
- }, [fetchViewPresets, panelId, prevSearch, viewPresetListSearchQuery]);
5407
5397
  useEffect(function () {
5408
5398
  if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
5409
5399
  // reset list filter when user changes role
@@ -5488,6 +5478,300 @@ var defaultComponentsLookUp = function defaultComponentsLookUp(_ref3) {
5488
5478
  }
5489
5479
  };
5490
5480
 
5481
+ var useDeleteViewPreset = function useDeleteViewPreset() {
5482
+ var _useAuthenticationCon = useAuthenticationContext(),
5483
+ auth = _useAuthenticationCon.auth;
5484
+ return useMutation({
5485
+ mutationFn: function () {
5486
+ var _mutationFn = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
5487
+ var id;
5488
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
5489
+ while (1) switch (_context.prev = _context.next) {
5490
+ case 0:
5491
+ id = _ref.id;
5492
+ if (auth) {
5493
+ _context.next = 3;
5494
+ break;
5495
+ }
5496
+ throw new Error('Authentication context not found');
5497
+ case 3:
5498
+ return _context.abrupt("return", deleteViewPreset(id, auth));
5499
+ case 4:
5500
+ case "end":
5501
+ return _context.stop();
5502
+ }
5503
+ }, _callee);
5504
+ }));
5505
+ function mutationFn(_x) {
5506
+ return _mutationFn.apply(this, arguments);
5507
+ }
5508
+ return mutationFn;
5509
+ }()
5510
+ });
5511
+ };
5512
+ var useSaveViewPreset = function useSaveViewPreset() {
5513
+ var _useAuthenticationCon2 = useAuthenticationContext(),
5514
+ auth = _useAuthenticationCon2.auth;
5515
+ return useMutation({
5516
+ mutationFn: function () {
5517
+ var _mutationFn2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2) {
5518
+ var id, data;
5519
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5520
+ while (1) switch (_context2.prev = _context2.next) {
5521
+ case 0:
5522
+ id = _ref2.id, data = _ref2.data;
5523
+ if (auth) {
5524
+ _context2.next = 3;
5525
+ break;
5526
+ }
5527
+ throw new Error('Authentication context not found');
5528
+ case 3:
5529
+ return _context2.abrupt("return", saveViewPreset(id, data, auth));
5530
+ case 4:
5531
+ case "end":
5532
+ return _context2.stop();
5533
+ }
5534
+ }, _callee2);
5535
+ }));
5536
+ function mutationFn(_x2) {
5537
+ return _mutationFn2.apply(this, arguments);
5538
+ }
5539
+ return mutationFn;
5540
+ }()
5541
+ });
5542
+ };
5543
+ var useSaveViewPresetAs = function useSaveViewPresetAs() {
5544
+ var _useAuthenticationCon3 = useAuthenticationContext(),
5545
+ auth = _useAuthenticationCon3.auth;
5546
+ return useMutation({
5547
+ mutationFn: function () {
5548
+ var _mutationFn3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref3) {
5549
+ var data;
5550
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5551
+ while (1) switch (_context3.prev = _context3.next) {
5552
+ case 0:
5553
+ data = _ref3.data;
5554
+ if (auth) {
5555
+ _context3.next = 3;
5556
+ break;
5557
+ }
5558
+ throw new Error('Authentication context not found');
5559
+ case 3:
5560
+ return _context3.abrupt("return", saveViewPresetAs(data, auth));
5561
+ case 4:
5562
+ case "end":
5563
+ return _context3.stop();
5564
+ }
5565
+ }, _callee3);
5566
+ }));
5567
+ function mutationFn(_x3) {
5568
+ return _mutationFn3.apply(this, arguments);
5569
+ }
5570
+ return mutationFn;
5571
+ }()
5572
+ });
5573
+ };
5574
+ var useViewPresets = function useViewPresets() {
5575
+ var _useAuthenticationCon5 = useAuthenticationContext(),
5576
+ auth = _useAuthenticationCon5.auth;
5577
+ return useQuery(viewpresetQueryOptions.getViewPresets(auth));
5578
+ };
5579
+
5580
+ var _excluded$5 = ["originalViewPresetId"];
5581
+ var writeToClipboard = /*#__PURE__*/function () {
5582
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(text) {
5583
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
5584
+ while (1) switch (_context.prev = _context.next) {
5585
+ case 0:
5586
+ window.focus();
5587
+ _context.next = 3;
5588
+ return navigator.clipboard.writeText(text);
5589
+ case 3:
5590
+ case "end":
5591
+ return _context.stop();
5592
+ }
5593
+ }, _callee);
5594
+ }));
5595
+ return function writeToClipboard(_x) {
5596
+ return _ref.apply(this, arguments);
5597
+ };
5598
+ }();
5599
+ /**
5600
+ * For each view that only has a viewPresetId reference (old-style), fetch
5601
+ * the full view preset from BE and replaces the reference with inline
5602
+ * componentType + initialProps.
5603
+ */
5604
+ var expandWorkspaceViewPresets = /*#__PURE__*/function () {
5605
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(preset, auth) {
5606
+ var expandedViews;
5607
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5608
+ while (1) switch (_context3.prev = _context3.next) {
5609
+ case 0:
5610
+ _context3.next = 2;
5611
+ return Promise.all(preset.views.map(/*#__PURE__*/function () {
5612
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(view) {
5613
+ var _view$title;
5614
+ var fullPreset;
5615
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5616
+ while (1) switch (_context2.prev = _context2.next) {
5617
+ case 0:
5618
+ if (!(!view.viewPresetId || view.componentType)) {
5619
+ _context2.next = 2;
5620
+ break;
5621
+ }
5622
+ return _context2.abrupt("return", view);
5623
+ case 2:
5624
+ _context2.next = 4;
5625
+ return getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(view.viewPresetId, auth));
5626
+ case 4:
5627
+ fullPreset = _context2.sent;
5628
+ return _context2.abrupt("return", {
5629
+ mosaicNodeId: view.mosaicNodeId,
5630
+ title: (_view$title = view.title) != null ? _view$title : fullPreset.title,
5631
+ componentType: fullPreset.componentType,
5632
+ initialProps: fullPreset.initialProps
5633
+ });
5634
+ case 6:
5635
+ case "end":
5636
+ return _context2.stop();
5637
+ }
5638
+ }, _callee2);
5639
+ }));
5640
+ return function (_x4) {
5641
+ return _ref3.apply(this, arguments);
5642
+ };
5643
+ }()));
5644
+ case 2:
5645
+ expandedViews = _context3.sent;
5646
+ return _context3.abrupt("return", Object.assign({}, preset, {
5647
+ views: expandedViews
5648
+ }));
5649
+ case 4:
5650
+ case "end":
5651
+ return _context3.stop();
5652
+ }
5653
+ }, _callee3);
5654
+ }));
5655
+ return function expandWorkspaceViewPresets(_x2, _x3) {
5656
+ return _ref2.apply(this, arguments);
5657
+ };
5658
+ }();
5659
+ var sanitizeWorkspaceForClipboard = function sanitizeWorkspaceForClipboard(preset) {
5660
+ var views = Array.isArray(preset.views) ? preset.views.map(function (_ref4) {
5661
+ _ref4.originalViewPresetId;
5662
+ var view = _objectWithoutPropertiesLoose(_ref4, _excluded$5);
5663
+ return view;
5664
+ }) : preset.views;
5665
+ return Object.assign({}, preset, {
5666
+ id: undefined,
5667
+ views: views,
5668
+ is_shared: false,
5669
+ scope: 'user'
5670
+ });
5671
+ };
5672
+ var sanitizeViewPresetForClipboard = function sanitizeViewPresetForClipboard(preset) {
5673
+ var _preset$keywords;
5674
+ return Object.assign({}, preset, {
5675
+ keywords: (_preset$keywords = preset.keywords) != null ? _preset$keywords : '',
5676
+ id: undefined,
5677
+ is_shared: false,
5678
+ scope: 'user'
5679
+ });
5680
+ };
5681
+ var validateWorkspacePresetJson = function validateWorkspacePresetJson(jsonString) {
5682
+ var parsed;
5683
+ try {
5684
+ parsed = JSON.parse(jsonString);
5685
+ } catch (e) {
5686
+ return {
5687
+ error: 'workspace-paste-validation-invalid-json',
5688
+ errorParam: e instanceof Error ? e.message : String(e)
5689
+ };
5690
+ }
5691
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
5692
+ return {
5693
+ error: 'workspace-paste-validation-not-object'
5694
+ };
5695
+ }
5696
+ var obj = parsed;
5697
+ if (typeof obj['componentType'] === 'string') {
5698
+ return {
5699
+ error: 'workspace-paste-validation-wrong-preset-type'
5700
+ };
5701
+ }
5702
+ if (typeof obj['title'] !== 'string' || !obj['title'].trim()) {
5703
+ return {
5704
+ error: 'workspace-paste-validation-missing-field',
5705
+ errorParam: 'title'
5706
+ };
5707
+ }
5708
+ if (!Array.isArray(obj['views'])) {
5709
+ return {
5710
+ error: 'workspace-paste-validation-missing-field',
5711
+ errorParam: 'views'
5712
+ };
5713
+ }
5714
+ if (obj['mosaicNode'] === undefined || obj['mosaicNode'] === null) {
5715
+ return {
5716
+ error: 'workspace-paste-validation-missing-field',
5717
+ errorParam: 'mosaicNode'
5718
+ };
5719
+ }
5720
+ var hasUnexpandedViews = obj['views'].some(function (view) {
5721
+ return 'viewPresetId' in view && !('componentType' in view);
5722
+ });
5723
+ if (hasUnexpandedViews) {
5724
+ return {
5725
+ error: 'workspace-paste-validation-unexpanded-views'
5726
+ };
5727
+ }
5728
+ return null;
5729
+ };
5730
+ /**
5731
+ * Validates that the parsed value is a valid ViewPreset structure.
5732
+ */
5733
+ var validateViewPresetJson = function validateViewPresetJson(jsonString) {
5734
+ var parsed;
5735
+ try {
5736
+ parsed = JSON.parse(jsonString);
5737
+ } catch (e) {
5738
+ return {
5739
+ error: 'workspace-paste-validation-invalid-json',
5740
+ errorParam: e instanceof Error ? e.message : String(e)
5741
+ };
5742
+ }
5743
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
5744
+ return {
5745
+ error: 'workspace-paste-validation-not-object'
5746
+ };
5747
+ }
5748
+ var obj = parsed;
5749
+ if (Array.isArray(obj['views'])) {
5750
+ return {
5751
+ error: 'viewpreset-paste-validation-wrong-preset-type'
5752
+ };
5753
+ }
5754
+ if (typeof obj['title'] !== 'string' || !obj['title'].trim()) {
5755
+ return {
5756
+ error: 'workspace-paste-validation-missing-field',
5757
+ errorParam: 'title'
5758
+ };
5759
+ }
5760
+ if (typeof obj['componentType'] !== 'string' || !obj['componentType']) {
5761
+ return {
5762
+ error: 'workspace-paste-validation-missing-field',
5763
+ errorParam: 'componentType'
5764
+ };
5765
+ }
5766
+ if (typeof obj['keywords'] !== 'string') {
5767
+ return {
5768
+ error: 'workspace-paste-validation-missing-field',
5769
+ errorParam: 'keywords'
5770
+ };
5771
+ }
5772
+ return null;
5773
+ };
5774
+
5491
5775
  var VIEW_TYPE_KEY = 'viewType';
5492
5776
  var normalizeLabels = function normalizeLabels(labels, available) {
5493
5777
  var result = {};
@@ -5902,6 +6186,11 @@ var useWorkspaceLabelsConfig = function useWorkspaceLabelsConfig() {
5902
6186
  }()
5903
6187
  });
5904
6188
  };
6189
+ var useWorkspacePresets = function useWorkspacePresets(params) {
6190
+ var _useAuthenticationCon2 = useAuthenticationContext(),
6191
+ auth = _useAuthenticationCon2.auth;
6192
+ return useQuery(workspaceQueryOptions.getWorkspacePresets(params, auth));
6193
+ };
5905
6194
  var onWorkspaceApiError = function onWorkspaceApiError(dispatch, error, t) {
5906
6195
  dispatch(workspaceListActions.onErrorWorkspacePresetAction({
5907
6196
  error: {
@@ -5998,7 +6287,8 @@ var useCreateWorkspacePreset = function useCreateWorkspacePreset() {
5998
6287
  workspaceId: newId,
5999
6288
  action: variables.action || WorkspacePresetAction.SAVE_AS,
6000
6289
  title: variables.data.title,
6001
- scope: scope
6290
+ scope: scope,
6291
+ username: variables.data.username || ''
6002
6292
  }));
6003
6293
  },
6004
6294
  onError: function onError(error) {
@@ -6512,6 +6802,11 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6512
6802
  action: function action() {
6513
6803
  return onClick(WorkspacePresetAction.OPEN_TAB);
6514
6804
  }
6805
+ }, {
6806
+ text: testIdPrefix === 'viewpreset' ? t('workspace-copy-viewpreset-to-clipboard') : t('workspace-copy-to-clipboard'),
6807
+ action: function action() {
6808
+ return onClick(WorkspacePresetAction.COPY_TO_CLIPBOARD);
6809
+ }
6515
6810
  }];
6516
6811
  // Show "Edit" if it's your own user-scoped preset OR you're an admin
6517
6812
  if (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin) {
@@ -6798,9 +7093,9 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6798
7093
  var username = (auth == null ? void 0 : auth.username) || '';
6799
7094
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
6800
7095
  var scope = !isAdmin ? 'user' : 'system';
6801
- var viewPresets = useSelector(function (store) {
6802
- return getFilteredViewPresetListForView(store, panelId);
6803
- });
7096
+ var _useViewPresets = useViewPresets(),
7097
+ viewPresets = _useViewPresets.data,
7098
+ isViewPresetsListFetching = _useViewPresets.isFetching;
6804
7099
  var viewPresetListFilters = useSelector(function (store) {
6805
7100
  return getViewPresetListFiltersForView(store, panelId, scope, isAdmin);
6806
7101
  });
@@ -6825,8 +7120,11 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6825
7120
  return Object.values(viewPresetLabelFilters).flat().length;
6826
7121
  }, [viewPresetLabelFilters]);
6827
7122
  var filteredPresets = React.useMemo(function () {
6828
- return filterAndSortPresets(viewPresets, viewPresetListFilters, username, isAdmin, viewPresetLabelFilters != null ? viewPresetLabelFilters : undefined);
6829
- }, [viewPresets, viewPresetListFilters, username, isAdmin, viewPresetLabelFilters]);
7123
+ if (viewPresets) {
7124
+ return filterAndSortPresets(viewPresets, viewPresetListFilters, username, isAdmin, viewPresetLabelFilters != null ? viewPresetLabelFilters : undefined, viewPresetListSearchQuery);
7125
+ }
7126
+ return [];
7127
+ }, [viewPresets, viewPresetListFilters, username, isAdmin, viewPresetLabelFilters, viewPresetListSearchQuery]);
6830
7128
  var labelsFormMethods = useForm({
6831
7129
  defaultValues: {
6832
7130
  labels: viewPresetLabelFilters
@@ -6869,9 +7167,6 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6869
7167
  var error = useSelector(function (store) {
6870
7168
  return getViewPresetsError(store, panelId);
6871
7169
  });
6872
- var isViewPresetsListFetching = useSelector(function (store) {
6873
- return getViewPresetsIsFetching(store, panelId);
6874
- });
6875
7170
  var openViewPresetsDialog = React.useCallback(function (viewPresetDialogOptions) {
6876
7171
  dispatch(viewPresetActions.openViewPresetDialog({
6877
7172
  viewPresetDialog: viewPresetDialogOptions
@@ -6899,13 +7194,11 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6899
7194
  queryKey: viewpresetQueryOptions.keys.lists()
6900
7195
  });
6901
7196
  case 2:
6902
- fetchViewPresets();
6903
- case 3:
6904
7197
  case "end":
6905
7198
  return _context.stop();
6906
7199
  }
6907
7200
  }, _callee);
6908
- })), [queryClient, fetchViewPresets]);
7201
+ })), [queryClient]);
6909
7202
  var constructInitialProps = function constructInitialProps() {
6910
7203
  switch (viewComponentType) {
6911
7204
  case 'WarningList':
@@ -6921,123 +7214,156 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6921
7214
  return undefined;
6922
7215
  }
6923
7216
  };
6924
- var onClickViewPresetOption = function onClickViewPresetOption(presetId, workspaceAction, preset) {
6925
- switch (workspaceAction) {
6926
- case WorkspacePresetAction.DUPLICATE:
6927
- {
6928
- getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(presetId, auth)).then(function (presetFromBE) {
6929
- var _getViewById, _ref3, _preset$initialProps;
6930
- var preset = presetFromBE;
6931
- var fallbackInitialProps = (_getViewById = getViewById(store.getState(), panelId)) == null ? void 0 : _getViewById.initialProps;
6932
- var initialPropsForForm = (_ref3 = (_preset$initialProps = preset.initialProps) != null ? _preset$initialProps : fallbackInitialProps) != null ? _ref3 : constructInitialProps();
6933
- openViewPresetsDialog({
6934
- title: t('workspace-mappreset-save-as'),
6935
- action: PresetAction.SAVE_AS,
6936
- viewPresetId: presetId,
6937
- panelId: panelId,
6938
- shouldSetActiveViewPreset: false,
6939
- formValues: {
6940
- title: preset.title,
6941
- description: preset.description,
6942
- initialProps: initialPropsForForm,
6943
- "abstract": preset["abstract"],
6944
- labels: preset.labels,
6945
- componentType: preset.componentType
6946
- }
7217
+ var onClickViewPresetOption = /*#__PURE__*/function () {
7218
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(presetId, workspaceAction, preset) {
7219
+ var presetTitle, fullPreset, sanitized;
7220
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
7221
+ while (1) switch (_context2.prev = _context2.next) {
7222
+ case 0:
7223
+ _context2.t0 = workspaceAction;
7224
+ _context2.next = _context2.t0 === WorkspacePresetAction.DUPLICATE ? 3 : _context2.t0 === WorkspacePresetAction.EDIT ? 5 : _context2.t0 === WorkspacePresetAction.SHARE ? 9 : _context2.t0 === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 11 : _context2.t0 === WorkspacePresetAction.DELETE ? 11 : _context2.t0 === WorkspacePresetAction.COPY_TO_CLIPBOARD ? 13 : 27;
7225
+ break;
7226
+ case 3:
7227
+ getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(presetId, auth)).then(function (presetFromBE) {
7228
+ var _getViewById, _ref4, _preset$initialProps;
7229
+ var preset = presetFromBE;
7230
+ var fallbackInitialProps = (_getViewById = getViewById(store.getState(), panelId)) == null ? void 0 : _getViewById.initialProps;
7231
+ var initialPropsForForm = (_ref4 = (_preset$initialProps = preset.initialProps) != null ? _preset$initialProps : fallbackInitialProps) != null ? _ref4 : constructInitialProps();
7232
+ openViewPresetsDialog({
7233
+ title: t('workspace-mappreset-save-as'),
7234
+ action: PresetAction.SAVE_AS,
7235
+ viewPresetId: presetId,
7236
+ panelId: panelId,
7237
+ shouldSetActiveViewPreset: false,
7238
+ formValues: {
7239
+ title: preset.title,
7240
+ description: preset.description,
7241
+ initialProps: initialPropsForForm,
7242
+ "abstract": preset["abstract"],
7243
+ labels: preset.labels,
7244
+ componentType: preset.componentType
7245
+ }
7246
+ });
7247
+ })["catch"](function () {
7248
+ openViewPresetsDialog({
7249
+ title: t('workspace-mappreset-save-as'),
7250
+ action: PresetAction.SAVE_AS,
7251
+ viewPresetId: presetId,
7252
+ panelId: panelId,
7253
+ shouldSetActiveViewPreset: false,
7254
+ formValues: {
7255
+ title: preset.title,
7256
+ description: preset.description,
7257
+ initialProps: constructInitialProps(),
7258
+ "abstract": preset["abstract"],
7259
+ labels: preset.labels,
7260
+ componentType: viewComponentType
7261
+ }
7262
+ });
6947
7263
  });
6948
- })["catch"](function () {
7264
+ return _context2.abrupt("break", 28);
7265
+ case 5:
7266
+ presetTitle = (preset == null ? void 0 : preset.title) || '';
6949
7267
  openViewPresetsDialog({
6950
- title: t('workspace-mappreset-save-as'),
6951
- action: PresetAction.SAVE_AS,
6952
- viewPresetId: presetId,
7268
+ title: t('workspace-mappreset-dialog-title-edit'),
7269
+ action: PresetAction.EDIT,
6953
7270
  panelId: panelId,
6954
- shouldSetActiveViewPreset: false,
7271
+ viewPresetId: presetId,
6955
7272
  formValues: {
6956
- title: preset.title,
7273
+ title: presetTitle,
6957
7274
  description: preset.description,
6958
- initialProps: constructInitialProps(),
6959
7275
  "abstract": preset["abstract"],
6960
7276
  labels: preset.labels,
6961
- componentType: viewComponentType
7277
+ updated: new Date().toISOString()
6962
7278
  }
6963
7279
  });
6964
- });
6965
- break;
6966
- }
6967
- case WorkspacePresetAction.EDIT:
6968
- {
6969
- var presetTitle = (preset == null ? void 0 : preset.title) || '';
6970
- openViewPresetsDialog({
6971
- title: t('workspace-mappreset-dialog-title-edit'),
6972
- action: PresetAction.EDIT,
6973
- panelId: panelId,
6974
- viewPresetId: presetId,
6975
- formValues: {
6976
- title: presetTitle,
6977
- description: preset.description,
6978
- "abstract": preset["abstract"],
6979
- labels: preset.labels,
6980
- updated: new Date().toISOString()
6981
- }
6982
- });
6983
- void getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(presetId, auth)).then(function (fullPreset) {
7280
+ void getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(presetId, auth)).then(function (fullPreset) {
7281
+ openViewPresetsDialog({
7282
+ title: t('workspace-mappreset-dialog-title-edit'),
7283
+ action: PresetAction.EDIT,
7284
+ panelId: panelId,
7285
+ viewPresetId: presetId,
7286
+ formValues: {
7287
+ title: fullPreset.title,
7288
+ description: fullPreset.description,
7289
+ "abstract": fullPreset["abstract"],
7290
+ labels: fullPreset.labels,
7291
+ componentType: fullPreset.componentType,
7292
+ initialProps: fullPreset.initialProps
7293
+ }
7294
+ });
7295
+ })["catch"](function () {
7296
+ // Leave dialog with initial data if fetch fails; errors handled elsewhere
7297
+ });
7298
+ return _context2.abrupt("break", 28);
7299
+ case 9:
7300
+ void getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(presetId, auth)).then(function (preset) {
7301
+ return void updateViewPreset(presetId, Object.assign({}, preset, {
7302
+ is_shared: !preset.is_shared
7303
+ }), auth).then(function () {
7304
+ dispatch(viewPresetActions.onSuccessViewPresetAction({
7305
+ panelId: panelId,
7306
+ viewPresetId: presetId,
7307
+ activeViewPresetId: activeViewPresetId,
7308
+ action: PresetAction.SHARE,
7309
+ title: preset.title,
7310
+ description: preset.description,
7311
+ scope: scope,
7312
+ "abstract": preset["abstract"],
7313
+ is_shared: preset.is_shared
7314
+ }));
7315
+ fetchViewPresets();
7316
+ });
7317
+ });
7318
+ return _context2.abrupt("break", 28);
7319
+ case 11:
6984
7320
  openViewPresetsDialog({
6985
- title: t('workspace-mappreset-dialog-title-edit'),
6986
- action: PresetAction.EDIT,
6987
- panelId: panelId,
7321
+ title: t('workspace-mappreset-dialog-title-delete'),
7322
+ action: PresetAction.DELETE,
6988
7323
  viewPresetId: presetId,
7324
+ panelId: panelId,
6989
7325
  formValues: {
6990
- title: fullPreset.title,
6991
- description: fullPreset.description,
6992
- "abstract": fullPreset["abstract"],
6993
- labels: fullPreset.labels,
6994
- componentType: fullPreset.componentType,
6995
- initialProps: fullPreset.initialProps
7326
+ title: preset.title
6996
7327
  }
6997
7328
  });
6998
- })["catch"](function () {
6999
- // Leave dialog with initial data if fetch fails; errors handled elsewhere
7000
- });
7001
- break;
7002
- }
7003
- case WorkspacePresetAction.SHARE:
7004
- {
7005
- void getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(presetId, auth)).then(function (preset) {
7006
- return void updateViewPreset(presetId, Object.assign({}, preset, {
7007
- is_shared: !preset.is_shared
7008
- }), auth).then(function () {
7009
- dispatch(viewPresetActions.onSuccessViewPresetAction({
7010
- panelId: panelId,
7011
- viewPresetId: presetId,
7012
- activeViewPresetId: activeViewPresetId,
7013
- action: PresetAction.SHARE,
7014
- title: preset.title,
7015
- description: preset.description,
7016
- scope: scope,
7017
- "abstract": preset["abstract"],
7018
- is_shared: preset.is_shared
7019
- }));
7020
- fetchViewPresets();
7021
- });
7022
- });
7023
- break;
7024
- }
7025
- case WorkspacePresetAction.DELETE_SYSTEM_PRESET:
7026
- case WorkspacePresetAction.DELETE:
7027
- {
7028
- openViewPresetsDialog({
7029
- title: t('workspace-mappreset-dialog-title-delete'),
7030
- action: PresetAction.DELETE,
7031
- viewPresetId: presetId,
7032
- panelId: panelId,
7033
- formValues: {
7034
- title: preset.title
7035
- }
7036
- });
7037
- break;
7329
+ return _context2.abrupt("break", 28);
7330
+ case 13:
7331
+ _context2.prev = 13;
7332
+ _context2.next = 16;
7333
+ return getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(presetId, auth));
7334
+ case 16:
7335
+ fullPreset = _context2.sent;
7336
+ sanitized = sanitizeViewPresetForClipboard(fullPreset);
7337
+ _context2.next = 20;
7338
+ return writeToClipboard(JSON.stringify(sanitized, null, 2));
7339
+ case 20:
7340
+ dispatch(snackbarActions.openSnackbar({
7341
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
7342
+ message: t('workspace-copy-viewpreset-success')
7343
+ }));
7344
+ _context2.next = 26;
7345
+ break;
7346
+ case 23:
7347
+ _context2.prev = 23;
7348
+ _context2.t1 = _context2["catch"](13);
7349
+ dispatch(snackbarActions.openSnackbar({
7350
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
7351
+ message: t('workspace-error-generic')
7352
+ }));
7353
+ case 26:
7354
+ return _context2.abrupt("break", 28);
7355
+ case 27:
7356
+ return _context2.abrupt("break", 28);
7357
+ case 28:
7358
+ case "end":
7359
+ return _context2.stop();
7038
7360
  }
7039
- }
7040
- };
7361
+ }, _callee2, null, [[13, 23]]);
7362
+ }));
7363
+ return function onClickViewPresetOption(_x, _x2, _x3) {
7364
+ return _ref3.apply(this, arguments);
7365
+ };
7366
+ }();
7041
7367
  var onSearchFilter = React.useCallback(function (searchQuery) {
7042
7368
  dispatch(viewPresetActions.searchFilter({
7043
7369
  searchQuery: searchQuery,
@@ -7189,16 +7515,16 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
7189
7515
  children: jsx(LastUpdateTime, {
7190
7516
  hideLabel: true,
7191
7517
  onPressRefresh: function () {
7192
- var _onPressRefresh = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
7193
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
7194
- while (1) switch (_context2.prev = _context2.next) {
7518
+ var _onPressRefresh = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
7519
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
7520
+ while (1) switch (_context3.prev = _context3.next) {
7195
7521
  case 0:
7196
- return _context2.abrupt("return", refreshViewPresets());
7522
+ return _context3.abrupt("return", refreshViewPresets());
7197
7523
  case 1:
7198
7524
  case "end":
7199
- return _context2.stop();
7525
+ return _context3.stop();
7200
7526
  }
7201
- }, _callee2);
7527
+ }, _callee3);
7202
7528
  }));
7203
7529
  function onPressRefresh() {
7204
7530
  return _onPressRefresh.apply(this, arguments);
@@ -7333,8 +7659,116 @@ var ViewPresetMenu = function ViewPresetMenu(_ref) {
7333
7659
  });
7334
7660
  };
7335
7661
 
7662
+ var PastePresetDialog = function PastePresetDialog(_ref) {
7663
+ var isOpen = _ref.isOpen,
7664
+ mode = _ref.mode,
7665
+ onClose = _ref.onClose,
7666
+ onConfirm = _ref.onConfirm;
7667
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
7668
+ t = _useWorkspaceTranslat.t;
7669
+ var _React$useState = React.useState(''),
7670
+ pastedText = _React$useState[0],
7671
+ setPastedText = _React$useState[1];
7672
+ var _React$useState2 = React.useState(),
7673
+ validationError = _React$useState2[0],
7674
+ setValidationError = _React$useState2[1];
7675
+ // Reset state when dialog closes
7676
+ React.useEffect(function () {
7677
+ if (!isOpen) {
7678
+ setPastedText('');
7679
+ setValidationError(undefined);
7680
+ }
7681
+ }, [isOpen]);
7682
+ var validate = function validate(value) {
7683
+ if (!value.trim()) {
7684
+ return undefined;
7685
+ }
7686
+ var result = mode === 'workspace' ? validateWorkspacePresetJson(value) : validateViewPresetJson(value);
7687
+ if (!result) {
7688
+ return undefined;
7689
+ }
7690
+ return result.errorParam ? t(result.error, {
7691
+ ERROR: result.errorParam
7692
+ }) : t(result.error);
7693
+ };
7694
+ var handleChange = function handleChange(value) {
7695
+ setPastedText(value);
7696
+ setValidationError(validate(value));
7697
+ };
7698
+ var handleSubmit = function handleSubmit() {
7699
+ var error = validate(pastedText);
7700
+ if (error) {
7701
+ setValidationError(error);
7702
+ return;
7703
+ }
7704
+ onConfirm(pastedText);
7705
+ onClose();
7706
+ };
7707
+ var isWorkspace = mode === 'workspace';
7708
+ var dialogTitle = isWorkspace ? t('workspace-paste-dialog-title') : t('workspace-paste-viewpreset-dialog-title');
7709
+ var confirmLabel = isWorkspace ? t('workspace-paste-load-button') : t('workspace-paste-load-viewpreset-button');
7710
+ var fieldLabel = isWorkspace ? t('workspace-paste-field-label') : t('workspace-paste-viewpreset-field-label');
7711
+ var isConfirmDisabled = !pastedText.trim() || Boolean(validationError);
7712
+ return jsx(CustomDialog, {
7713
+ actions: jsxs(Box, {
7714
+ sx: {
7715
+ display: 'flex',
7716
+ gap: 1,
7717
+ justifyContent: 'flex-end'
7718
+ },
7719
+ children: [jsx(Button, {
7720
+ "data-testid": "paste-preset-cancel",
7721
+ onClick: onClose,
7722
+ variant: "tertiary",
7723
+ children: t('workspace-cancel')
7724
+ }), jsx(Button, {
7725
+ "data-testid": "paste-preset-confirm",
7726
+ disabled: isConfirmDisabled,
7727
+ onClick: handleSubmit,
7728
+ variant: "primary",
7729
+ children: confirmLabel
7730
+ })]
7731
+ }),
7732
+ "data-testid": "paste-preset-dialog",
7733
+ onClose: onClose,
7734
+ open: isOpen,
7735
+ sx: {
7736
+ width: 800,
7737
+ height: 'auto',
7738
+ mx: 'auto'
7739
+ },
7740
+ title: dialogTitle,
7741
+ children: jsx(TextField, {
7742
+ "data-testid": "paste-preset-textarea",
7743
+ error: Boolean(validationError),
7744
+ fullWidth: true,
7745
+ helperText: validationError,
7746
+ label: fieldLabel,
7747
+ multiline: true,
7748
+ onChange: function onChange(e) {
7749
+ return handleChange(e.target.value);
7750
+ },
7751
+ onKeyDown: function onKeyDown(e) {
7752
+ var allowed = e.ctrlKey || e.metaKey || e.key === 'Tab';
7753
+ if (!allowed) {
7754
+ e.preventDefault();
7755
+ }
7756
+ },
7757
+ rows: 8,
7758
+ sx: {
7759
+ '& .MuiInputBase-input': {
7760
+ fontFamily: 'monospace',
7761
+ fontSize: 12
7762
+ }
7763
+ },
7764
+ value: pastedText,
7765
+ variant: "filled"
7766
+ })
7767
+ });
7768
+ };
7769
+
7336
7770
  var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7337
- var _GENERIC$AUTH$error$c;
7771
+ var _useSelector, _GENERIC$AUTH$error$c;
7338
7772
  var _ref$isLabelFilterOpe = _ref.isLabelFilterOpen,
7339
7773
  isLabelFilterOpen = _ref$isLabelFilterOpe === void 0 ? false : _ref$isLabelFilterOpe,
7340
7774
  onToggleLabelFilter = _ref.onToggleLabelFilter;
@@ -7348,9 +7782,18 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7348
7782
  var username = (auth == null ? void 0 : auth.username) || '';
7349
7783
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
7350
7784
  var scope = !isAdmin ? 'user' : 'system';
7351
- var workspacePresets = useSelector(function (store) {
7352
- return getWorkspaceList(store);
7785
+ var workspaceSearchQuery = useSelector(function (store) {
7786
+ return getWorkspaceListSearchQuery(store);
7353
7787
  });
7788
+ var filterParams = React.useMemo(function () {
7789
+ return constructFilterParams([], workspaceSearchQuery);
7790
+ }, [workspaceSearchQuery]);
7791
+ var _useWorkspacePresets = useWorkspacePresets(filterParams),
7792
+ _useWorkspacePresets$ = _useWorkspacePresets.data,
7793
+ workspacePresets = _useWorkspacePresets$ === void 0 ? [] : _useWorkspacePresets$,
7794
+ isFetching = _useWorkspacePresets.isFetching,
7795
+ queryError = _useWorkspacePresets.error,
7796
+ refreshWorkspacePresets = _useWorkspacePresets.refetch;
7354
7797
  var selectedFilters = useSelector(getWorkspaceListFilters);
7355
7798
  var labelFilters = useSelector(function (store) {
7356
7799
  return getWorkspaceLabelFilters(store);
@@ -7387,41 +7830,19 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7387
7830
  var workspaceListFilters = useSelector(function (store) {
7388
7831
  return getWorkspaceListFilters(store, scope, isAdmin);
7389
7832
  });
7390
- var workspaceSearchQuery = useSelector(function (store) {
7391
- return getWorkspaceListSearchQuery(store);
7392
- });
7393
- var isFetching = useSelector(function (store) {
7394
- return getIsWorkspaceListFetching(store);
7395
- });
7396
- var error = useSelector(function (store) {
7833
+ var error = (_useSelector = useSelector(function (store) {
7397
7834
  return getWorkspaceListError(store);
7398
- });
7835
+ })) != null ? _useSelector : queryError ? {
7836
+ type: WorkspaceListErrorType.VERBATIM_ERROR,
7837
+ category: queryError.cause === 401 || queryError.cause === 403 ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC,
7838
+ message: queryError.message
7839
+ } : undefined;
7399
7840
  var onLabelsFilterChange = React.useCallback(function (labels) {
7400
7841
  dispatch(workspaceListActions.setWorkspaceLabelFilters({
7401
7842
  labels: labels
7402
7843
  }));
7403
7844
  }, [dispatch]);
7404
7845
  var showLabelFilterToggle = Boolean(onToggleLabelFilter);
7405
- var fetchWorkspaceList = React.useCallback(function () {
7406
- var filterParams = constructFilterParams([], workspaceSearchQuery);
7407
- dispatch(workspaceListActions.fetchWorkspaceList(filterParams));
7408
- }, [dispatch, workspaceSearchQuery]);
7409
- var refreshWorkspacePresets = React.useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
7410
- return _regeneratorRuntime().wrap(function _callee$(_context) {
7411
- while (1) switch (_context.prev = _context.next) {
7412
- case 0:
7413
- _context.next = 2;
7414
- return getQueryClient().invalidateQueries({
7415
- queryKey: workspaceQueryOptions.keys.lists()
7416
- });
7417
- case 2:
7418
- fetchWorkspaceList();
7419
- case 3:
7420
- case "end":
7421
- return _context.stop();
7422
- }
7423
- }, _callee);
7424
- })), [fetchWorkspaceList]);
7425
7846
  var fetchWorkspace = React.useCallback(function (workspaceId) {
7426
7847
  dispatch(workspaceActions.fetchWorkspace({
7427
7848
  workspaceId: workspaceId
@@ -7491,18 +7912,18 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7491
7912
  return result;
7492
7913
  }, [currentView]);
7493
7914
  var onClickWorkspacePresetOption = /*#__PURE__*/function () {
7494
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(presetId, workspaceAction) {
7495
- var affectedPreset, presetTitle, _currentView$syncGrou, currentViews, adminMetadata, buildFormValues, url;
7496
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
7497
- while (1) switch (_context3.prev = _context3.next) {
7915
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(presetId, workspaceAction) {
7916
+ var affectedPreset, presetTitle, _currentView$syncGrou, currentViews, adminMetadata, buildFormValues, url, preset, expanded, sanitized;
7917
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
7918
+ while (1) switch (_context2.prev = _context2.next) {
7498
7919
  case 0:
7499
7920
  // If affectedPreset is the FE defined `New workspace` - use the definition from FE instead of BE
7500
7921
  affectedPreset = presetId === getEmptyMapWorkspace(t).id ? getEmptyMapWorkspace(t) : workspacePresets.find(function (preset) {
7501
7922
  return preset.id === presetId;
7502
7923
  });
7503
7924
  presetTitle = affectedPreset == null ? void 0 : affectedPreset.title;
7504
- _context3.t0 = workspaceAction;
7505
- _context3.next = _context3.t0 === WorkspacePresetAction.DUPLICATE ? 5 : _context3.t0 === WorkspacePresetAction.EDIT ? 8 : _context3.t0 === WorkspacePresetAction.DELETE ? 16 : _context3.t0 === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 18 : _context3.t0 === WorkspacePresetAction.SHARE ? 20 : _context3.t0 === WorkspacePresetAction.OPEN_TAB ? 22 : 25;
7925
+ _context2.t0 = workspaceAction;
7926
+ _context2.next = _context2.t0 === WorkspacePresetAction.DUPLICATE ? 5 : _context2.t0 === WorkspacePresetAction.EDIT ? 8 : _context2.t0 === WorkspacePresetAction.DELETE ? 16 : _context2.t0 === WorkspacePresetAction.DELETE_SYSTEM_PRESET ? 18 : _context2.t0 === WorkspacePresetAction.SHARE ? 20 : _context2.t0 === WorkspacePresetAction.OPEN_TAB ? 22 : _context2.t0 === WorkspacePresetAction.COPY_TO_CLIPBOARD ? 25 : 42;
7506
7927
  break;
7507
7928
  case 5:
7508
7929
  currentViews = currentViewsToBE();
@@ -7520,30 +7941,30 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7520
7941
  syncGroups: (_currentView$syncGrou = currentView.syncGroups) != null ? _currentView$syncGrou : []
7521
7942
  }
7522
7943
  });
7523
- return _context3.abrupt("break", 26);
7944
+ return _context2.abrupt("break", 43);
7524
7945
  case 8:
7525
7946
  adminMetadata = isAdmin && auth != null && auth.username ? {
7526
7947
  updated: new Date().toISOString(),
7527
7948
  updatedBy: auth.username
7528
7949
  } : {};
7529
7950
  buildFormValues = function buildFormValues(presetDetails, presetViews) {
7530
- var _ref4, _presetDetails$title, _presetDetails$abstra, _presetDetails$descri, _presetDetails$labels, _ref5, _presetDetails$mosaic, _presetDetails$scope;
7951
+ var _ref3, _presetDetails$title, _presetDetails$abstra, _presetDetails$descri, _presetDetails$labels, _ref4, _presetDetails$mosaic, _presetDetails$scope;
7531
7952
  if (presetViews === void 0) {
7532
7953
  presetViews = [];
7533
7954
  }
7534
7955
  return Object.assign({
7535
- title: (_ref4 = (_presetDetails$title = presetDetails == null ? void 0 : presetDetails.title) != null ? _presetDetails$title : presetTitle) != null ? _ref4 : '',
7956
+ title: (_ref3 = (_presetDetails$title = presetDetails == null ? void 0 : presetDetails.title) != null ? _presetDetails$title : presetTitle) != null ? _ref3 : '',
7536
7957
  "abstract": (_presetDetails$abstra = presetDetails == null ? void 0 : presetDetails["abstract"]) != null ? _presetDetails$abstra : affectedPreset == null ? void 0 : affectedPreset["abstract"],
7537
7958
  description: (_presetDetails$descri = presetDetails == null ? void 0 : presetDetails.description) != null ? _presetDetails$descri : affectedPreset == null ? void 0 : affectedPreset.description,
7538
7959
  labels: (_presetDetails$labels = presetDetails == null ? void 0 : presetDetails.labels) != null ? _presetDetails$labels : affectedPreset == null ? void 0 : affectedPreset.labels,
7539
- mosaicNode: (_ref5 = (_presetDetails$mosaic = presetDetails == null ? void 0 : presetDetails.mosaicNode) != null ? _presetDetails$mosaic : currentView == null ? void 0 : currentView.mosaicNode) != null ? _ref5 : undefined,
7960
+ mosaicNode: (_ref4 = (_presetDetails$mosaic = presetDetails == null ? void 0 : presetDetails.mosaicNode) != null ? _presetDetails$mosaic : currentView == null ? void 0 : currentView.mosaicNode) != null ? _ref4 : undefined,
7540
7961
  scope: (_presetDetails$scope = presetDetails == null ? void 0 : presetDetails.scope) != null ? _presetDetails$scope : scope,
7541
7962
  views: presetViews,
7542
7963
  updated: new Date().toISOString()
7543
7964
  }, adminMetadata);
7544
7965
  }; // If editing the active workspace, keep using the current workspace data
7545
7966
  if (!(presetId === (currentView == null ? void 0 : currentView.id) || !auth)) {
7546
- _context3.next = 13;
7967
+ _context2.next = 13;
7547
7968
  break;
7548
7969
  }
7549
7970
  setWorkspaceActionDialogOptions({
@@ -7551,7 +7972,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7551
7972
  presetId: presetId,
7552
7973
  formValues: buildFormValues(currentView, currentViewsToBE())
7553
7974
  });
7554
- return _context3.abrupt("break", 26);
7975
+ return _context2.abrupt("break", 43);
7555
7976
  case 13:
7556
7977
  // Open dialog immediately with basic data, then hydrate with full preset once fetched
7557
7978
  setWorkspaceActionDialogOptions({
@@ -7575,7 +7996,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7575
7996
  }
7576
7997
  }));
7577
7998
  });
7578
- return _context3.abrupt("break", 26);
7999
+ return _context2.abrupt("break", 43);
7579
8000
  case 16:
7580
8001
  setWorkspaceActionDialogOptions({
7581
8002
  action: workspaceAction,
@@ -7585,7 +8006,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7585
8006
  scope: scope
7586
8007
  }
7587
8008
  });
7588
- return _context3.abrupt("break", 26);
8009
+ return _context2.abrupt("break", 43);
7589
8010
  case 18:
7590
8011
  setWorkspaceActionDialogOptions({
7591
8012
  action: workspaceAction,
@@ -7595,14 +8016,14 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7595
8016
  scope: scope
7596
8017
  }
7597
8018
  });
7598
- return _context3.abrupt("break", 26);
8019
+ return _context2.abrupt("break", 43);
7599
8020
  case 20:
7600
8021
  void getWorkspace(presetId, auth).then(/*#__PURE__*/function () {
7601
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(preset) {
7602
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
7603
- while (1) switch (_context2.prev = _context2.next) {
8022
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(preset) {
8023
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
8024
+ while (1) switch (_context.prev = _context.next) {
7604
8025
  case 0:
7605
- return _context2.abrupt("return", updateWorkspace(presetId, Object.assign({}, preset, {
8026
+ return _context.abrupt("return", updateWorkspace(presetId, Object.assign({}, preset, {
7606
8027
  is_shared: !preset.is_shared
7607
8028
  }), auth).then(function () {
7608
8029
  dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
@@ -7612,7 +8033,6 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7612
8033
  scope: scope,
7613
8034
  is_shared: preset.is_shared
7614
8035
  }));
7615
- fetchWorkspaceList();
7616
8036
  })["catch"](function (error) {
7617
8037
  dispatch(workspaceListActions.onErrorWorkspacePresetAction({
7618
8038
  error: {
@@ -7624,29 +8044,58 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect(_ref) {
7624
8044
  }));
7625
8045
  case 1:
7626
8046
  case "end":
7627
- return _context2.stop();
8047
+ return _context.stop();
7628
8048
  }
7629
- }, _callee2);
8049
+ }, _callee);
7630
8050
  }));
7631
8051
  return function (_x3) {
7632
- return _ref6.apply(this, arguments);
8052
+ return _ref5.apply(this, arguments);
7633
8053
  };
7634
8054
  }());
7635
- return _context3.abrupt("break", 26);
8055
+ return _context2.abrupt("break", 43);
7636
8056
  case 22:
7637
8057
  url = getWorkspaceRouteUrl(presetId);
7638
8058
  window.open(url, '_blank');
7639
- return _context3.abrupt("break", 26);
8059
+ return _context2.abrupt("break", 43);
7640
8060
  case 25:
7641
- return _context3.abrupt("break", 26);
7642
- case 26:
8061
+ _context2.prev = 25;
8062
+ _context2.next = 28;
8063
+ return getWorkspace(presetId, auth);
8064
+ case 28:
8065
+ preset = _context2.sent;
8066
+ _context2.next = 31;
8067
+ return expandWorkspaceViewPresets(preset, auth);
8068
+ case 31:
8069
+ expanded = _context2.sent;
8070
+ sanitized = sanitizeWorkspaceForClipboard(expanded);
8071
+ _context2.next = 35;
8072
+ return writeToClipboard(JSON.stringify(sanitized, null, 2));
8073
+ case 35:
8074
+ dispatch(snackbarActions.openSnackbar({
8075
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
8076
+ message: t('workspace-copy-success')
8077
+ }));
8078
+ _context2.next = 41;
8079
+ break;
8080
+ case 38:
8081
+ _context2.prev = 38;
8082
+ _context2.t1 = _context2["catch"](25);
8083
+ dispatch(snackbarActions.openSnackbar({
8084
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
8085
+ message: t('workspace-error-generic')
8086
+ }));
8087
+ case 41:
8088
+ return _context2.abrupt("break", 43);
8089
+ case 42:
8090
+ return _context2.abrupt("break", 43);
8091
+ case 43:
7643
8092
  case "end":
7644
- return _context3.stop();
8093
+ return _context2.stop();
7645
8094
  }
7646
- }, _callee3);
8095
+ }, _callee2, null, [[25, 38]]);
7647
8096
  }));
7648
8097
  return function onClickWorkspacePresetOption(_x, _x2) {
7649
- return _ref3.apply(this, arguments);
8098
+ return _ref2.apply(this, arguments);
7650
8099
  };
7651
8100
  }();
7652
8101
  var isAllSelected = workspaceListFilters.length > 0 && workspaceListFilters.every(function (filter) {
@@ -7973,6 +8422,10 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
7973
8422
  handleEditTitle = _ref.handleEditTitle,
7974
8423
  handleDelete = _ref.handleDelete,
7975
8424
  handleReset = _ref.handleReset,
8425
+ handleCopyToClipboard = _ref.handleCopyToClipboard,
8426
+ handlePasteFromClipboard = _ref.handlePasteFromClipboard,
8427
+ copyToClipboardLabel = _ref.copyToClipboardLabel,
8428
+ pasteFromClipboardLabel = _ref.pasteFromClipboardLabel,
7976
8429
  _ref$isDisabled = _ref.isDisabled,
7977
8430
  isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled,
7978
8431
  _ref$isDefaultOpen = _ref.isDefaultOpen,
@@ -8004,6 +8457,12 @@ var WorkspaceOptions = function WorkspaceOptions(_ref) {
8004
8457
  }] : [], [{
8005
8458
  title: t('workspace-reset'),
8006
8459
  callback: handleReset
8460
+ }, {
8461
+ title: copyToClipboardLabel != null ? copyToClipboardLabel : t('workspace-copy-to-clipboard'),
8462
+ callback: handleCopyToClipboard
8463
+ }, {
8464
+ title: pasteFromClipboardLabel != null ? pasteFromClipboardLabel : t('workspace-paste-from-clipboard'),
8465
+ callback: handlePasteFromClipboard
8007
8466
  }, {
8008
8467
  title: t('workspace-delete'),
8009
8468
  callback: handleDelete
@@ -8125,7 +8584,7 @@ var LoadingIndicatorConnect = function LoadingIndicatorConnect(_ref) {
8125
8584
 
8126
8585
  var _excluded$4 = ["title", "scope"];
8127
8586
  var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_ref) {
8128
- var _currentWorkspace$sco, _currentViewPreset$ab, _currentViewPreset$de, _currentViewPreset$la, _currentWorkspacePres;
8587
+ var _currentWorkspace$sco, _currentViewPreset$ab, _currentViewPreset$de, _currentViewPreset$la, _ref7, _currentWorkspacePres;
8129
8588
  var panelId = _ref.panelId,
8130
8589
  isViewPresetDialogOpen = _ref.isViewPresetDialogOpen;
8131
8590
  var dispatch = useDispatch();
@@ -8137,6 +8596,15 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8137
8596
  isLoggedIn = _useAuthenticationCon.isLoggedIn,
8138
8597
  auth = _useAuthenticationCon.auth;
8139
8598
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
8599
+ var activeViewPresetId = useSelector(function (store) {
8600
+ return getViewPresetActiveId(store, panelId);
8601
+ });
8602
+ // TODO this should be fetched from the view. But it is currently missing username
8603
+ var _useViewPresets = useViewPresets(),
8604
+ viewPresets = _useViewPresets.data;
8605
+ var currentViewPreset = viewPresets == null ? void 0 : viewPresets.find(function (preset) {
8606
+ return preset.id === activeViewPresetId;
8607
+ });
8140
8608
  var workspaceView = useSelector(function (store) {
8141
8609
  var _getViewById;
8142
8610
  var _ref2 = (_getViewById = getViewById(store, panelId)) != null ? _getViewById : {},
@@ -8148,12 +8616,18 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8148
8616
  scope: scope
8149
8617
  }, restProps);
8150
8618
  }, shallowEqual);
8619
+ var liveViewPreset = useSelector(function (store) {
8620
+ return getViewPresetToSendToBackend(store, panelId);
8621
+ });
8151
8622
  // whole workspace (id/title/abstract/scope + views)
8152
8623
  var currentWorkspace = useSelector(function (store) {
8153
8624
  return getWorkspaceState(store);
8154
8625
  });
8155
- var currentWorkspacePresetDetails = useSelector(function (store) {
8156
- return currentWorkspace.id ? getWorkspacePresetFromList(store, currentWorkspace.id) : undefined;
8626
+ var _useWorkspacePresets = useWorkspacePresets(),
8627
+ _useWorkspacePresets$ = _useWorkspacePresets.data,
8628
+ workspacePresetList = _useWorkspacePresets$ === void 0 ? [] : _useWorkspacePresets$;
8629
+ var currentWorkspacePresetDetails = workspacePresetList.find(function (preset) {
8630
+ return preset.id === currentWorkspace.id;
8157
8631
  });
8158
8632
  var workspaceScope = (_currentWorkspace$sco = currentWorkspace == null ? void 0 : currentWorkspace.scope) != null ? _currentWorkspace$sco : 'user';
8159
8633
  var thisView = useSelector(function (store) {
@@ -8165,15 +8639,9 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8165
8639
  var hasViewPresetChanges = useSelector(function (store) {
8166
8640
  return getViewPresetHasChanges(store, panelId);
8167
8641
  });
8168
- var activeViewPresetId = useSelector(function (store) {
8169
- return getViewPresetActiveId(store, panelId);
8170
- });
8171
8642
  var relatedSyncGroupIds = useSelector(function (store) {
8172
8643
  return syncGroupsSelectors.getAllTargetGroupsForSource(store, panelId);
8173
8644
  });
8174
- var currentViewPreset = useSelector(function (store) {
8175
- return activeViewPresetId ? getViewPresetFromList(store, activeViewPresetId) : undefined;
8176
- });
8177
8645
  var looksLikeUuid = function looksLikeUuid(string) {
8178
8646
  return !!string && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(string);
8179
8647
  };
@@ -8193,6 +8661,8 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8193
8661
  var showChangedInViewTitle = !!hasViewPresetChanges;
8194
8662
  var isNewForDisplay = isNewActive && !hasViewPresetChanges;
8195
8663
  var fullTitle = getPresetTitle(title, showChangedInViewTitle, isNewForDisplay, t);
8664
+ // Whether or not to display the panelId next to the preset title
8665
+ var showPanelId = constructSyncSourceDisplayName(panelId, workspaceView, title + " (" + panelId + ")").includes("(" + panelId + ")");
8196
8666
  var openViewPresetsDialog = React.useCallback(function (viewPresetDialogOptions) {
8197
8667
  dispatch(viewPresetActions.openViewPresetDialog({
8198
8668
  viewPresetDialog: viewPresetDialogOptions
@@ -8328,9 +8798,97 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8328
8798
  });
8329
8799
  }
8330
8800
  }, [isPlainWorkspaceView, currentWorkspace, thisView, panelId, dispatch, openViewPresetsDialog, activeViewPresetId, title, t]);
8331
- var toggleViewPresetDialog = React.useCallback(function (_ref5) {
8332
- var panelId = _ref5.panelId,
8333
- isViewPresetDialogOpen = _ref5.isViewPresetDialogOpen;
8801
+ var _React$useState = React.useState(false),
8802
+ isPasteDialogOpen = _React$useState[0],
8803
+ setIsPasteDialogOpen = _React$useState[1];
8804
+ var onCopyToClipboard = React.useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
8805
+ var fullPreset, sanitized, json;
8806
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
8807
+ while (1) switch (_context.prev = _context.next) {
8808
+ case 0:
8809
+ _context.prev = 0;
8810
+ if (!isActiveWorkspaceView) {
8811
+ _context.next = 5;
8812
+ break;
8813
+ }
8814
+ fullPreset = Object.assign({}, liveViewPreset, {
8815
+ title: title
8816
+ });
8817
+ _context.next = 16;
8818
+ break;
8819
+ case 5:
8820
+ _context.prev = 5;
8821
+ _context.next = 8;
8822
+ return getQueryClient().fetchQuery(viewpresetQueryOptions.getViewPreset(activeViewPresetId, auth));
8823
+ case 8:
8824
+ fullPreset = _context.sent;
8825
+ _context.next = 16;
8826
+ break;
8827
+ case 11:
8828
+ _context.prev = 11;
8829
+ _context.t0 = _context["catch"](5);
8830
+ if (liveViewPreset.initialProps) {
8831
+ _context.next = 15;
8832
+ break;
8833
+ }
8834
+ throw new Error('View preset not available');
8835
+ case 15:
8836
+ fullPreset = liveViewPreset;
8837
+ case 16:
8838
+ sanitized = sanitizeViewPresetForClipboard(fullPreset);
8839
+ json = JSON.stringify(sanitized, null, 2);
8840
+ _context.next = 20;
8841
+ return writeToClipboard(json);
8842
+ case 20:
8843
+ dispatch(snackbarActions.openSnackbar({
8844
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
8845
+ message: t('workspace-copy-viewpreset-success')
8846
+ }));
8847
+ _context.next = 26;
8848
+ break;
8849
+ case 23:
8850
+ _context.prev = 23;
8851
+ _context.t1 = _context["catch"](0);
8852
+ dispatch(snackbarActions.openSnackbar({
8853
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
8854
+ message: t('workspace-error-generic')
8855
+ }));
8856
+ case 26:
8857
+ case "end":
8858
+ return _context.stop();
8859
+ }
8860
+ }, _callee, null, [[0, 23], [5, 11]]);
8861
+ })), [activeViewPresetId, auth, dispatch, isActiveWorkspaceView, liveViewPreset, t, title]);
8862
+ var onPasteFromClipboard = function onPasteFromClipboard() {
8863
+ setIsPasteDialogOpen(true);
8864
+ };
8865
+ var onPasteViewPresetConfirm = React.useCallback(function (jsonString) {
8866
+ var parsed = JSON.parse(jsonString);
8867
+ var sanitized = sanitizeViewPresetForClipboard(parsed);
8868
+ if (sanitized.componentType === 'Map' && sanitized.initialProps) {
8869
+ dispatch(mapActions.setMapPreset({
8870
+ mapId: panelId,
8871
+ initialProps: sanitized.initialProps
8872
+ }));
8873
+ }
8874
+ dispatch(viewPresetActions.fetchedViewPreset({
8875
+ viewPreset: sanitized,
8876
+ viewPresetId: '',
8877
+ panelId: panelId
8878
+ }));
8879
+ dispatch(workspaceActions.updateWorkspaceView({
8880
+ mosaicNodeId: panelId,
8881
+ viewPreset: sanitized
8882
+ }));
8883
+ dispatch(workspaceActions.markWorkspaceChanged());
8884
+ dispatch(snackbarActions.openSnackbar({
8885
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
8886
+ message: t('workspace-paste-viewpreset-success')
8887
+ }));
8888
+ }, [dispatch, panelId, t]);
8889
+ var toggleViewPresetDialog = React.useCallback(function (_ref6) {
8890
+ var panelId = _ref6.panelId,
8891
+ isViewPresetDialogOpen = _ref6.isViewPresetDialogOpen;
8334
8892
  dispatch(viewPresetActions.toggleViewPresetListDialog({
8335
8893
  panelId: panelId,
8336
8894
  isViewPresetListDialogOpen: isViewPresetDialogOpen
@@ -8344,14 +8902,14 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8344
8902
  }, [isViewPresetDialogOpen, panelId, toggleViewPresetDialog]);
8345
8903
  renderCounter.count(WorkspaceViewTitleConnectNoMemo.name);
8346
8904
  var viewpresetCreator = (currentViewPreset == null ? void 0 : currentViewPreset.username) || '';
8347
- var workspaceOwner = (_currentWorkspacePres = currentWorkspacePresetDetails == null ? void 0 : currentWorkspacePresetDetails.username) != null ? _currentWorkspacePres : undefined;
8905
+ var workspaceOwner = (_ref7 = (_currentWorkspacePres = currentWorkspacePresetDetails == null ? void 0 : currentWorkspacePresetDetails.username) != null ? _currentWorkspacePres : currentWorkspace == null ? void 0 : currentWorkspace.username) != null ? _ref7 : undefined;
8348
8906
  var isUserPresetCreator = !isAdmin && !!(auth != null && auth.username) && auth.username === viewpresetCreator;
8349
- var isWorkspaceOwner = !isAdmin && !!workspaceOwner && (auth == null ? void 0 : auth.username) === workspaceOwner;
8907
+ var isWorkspaceOwner = !isAdmin && (!!workspaceOwner && (auth == null ? void 0 : auth.username) === workspaceOwner || !workspaceOwner && workspaceScope === 'user' && isLoggedIn);
8350
8908
  var currentViewScope = (currentViewPreset == null ? void 0 : currentViewPreset.scope) || 'system';
8351
8909
  // Regular viewPresets
8352
8910
  var isEnabled = !isPlainWorkspaceView && isLoggedIn && activeViewPresetId !== '' && (currentViewScope === 'user' && isUserPresetCreator || currentViewScope === 'system' && isAdmin);
8353
8911
  // Workspace views
8354
- var canEditPlainView = isPlainWorkspaceView && isLoggedIn && (workspaceScope === 'user' && isWorkspaceOwner || workspaceScope === 'system' && isAdmin);
8912
+ var canEditWorkspaceViewTitle = isLoggedIn && (workspaceScope === 'user' && isWorkspaceOwner || workspaceScope === 'system' && isAdmin);
8355
8913
  return (
8356
8914
  // Zero-length string assignment prevents showing title as an empty object '[object Object]'.
8357
8915
  // in child components. This is a workaround for a limitation in the Tooltip component.
@@ -8419,7 +8977,7 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8419
8977
  whiteSpace: 'nowrap',
8420
8978
  width: '100%'
8421
8979
  },
8422
- children: [fullTitle, jsx(Box, {
8980
+ children: [fullTitle, showPanelId ? jsx(Box, {
8423
8981
  component: "span",
8424
8982
  sx: {
8425
8983
  fontStyle: 'normal',
@@ -8428,17 +8986,21 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8428
8986
  color: isViewPresetDialogOpen ? 'geowebColors.text.inverse' : 'geowebColors.captions.captionStatus.rgba'
8429
8987
  },
8430
8988
  children: panelId
8431
- })]
8989
+ }) : null]
8432
8990
  })
8433
8991
  })
8434
8992
  }), jsx(WorkspaceOptions, {
8993
+ copyToClipboardLabel: t('workspace-copy-viewpreset-to-clipboard'),
8994
+ handleCopyToClipboard: (isPresetBacked || isActiveWorkspaceView) && isLoggedIn ? onCopyToClipboard : undefined,
8435
8995
  handleDelete: isEnabled ? onDelete : undefined,
8436
8996
  handleEdit: isEnabled ? onEdit : undefined,
8437
- handleEditTitle: canEditPlainView ? handleEditTitle : undefined,
8997
+ handleEditTitle: canEditWorkspaceViewTitle ? handleEditTitle : undefined,
8998
+ handlePasteFromClipboard: isLoggedIn ? onPasteFromClipboard : undefined,
8438
8999
  handleReset: onReset,
8439
9000
  handleSave: isEnabled ? onSave : undefined,
8440
9001
  handleSaveAs: isLoggedIn ? onSaveAs : undefined,
8441
9002
  id: viewPresetOptionId,
9003
+ pasteFromClipboardLabel: t('workspace-paste-viewpreset-from-clipboard'),
8442
9004
  showEditTitleOption: true
8443
9005
  })]
8444
9006
  }), jsx(Box, {
@@ -8450,6 +9012,13 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
8450
9012
  children: jsx(LoadingIndicatorConnect, {
8451
9013
  panelId: panelId
8452
9014
  })
9015
+ }), jsx(PastePresetDialog, {
9016
+ isOpen: isPasteDialogOpen,
9017
+ mode: "viewpreset",
9018
+ onClose: function onClose() {
9019
+ return setIsPasteDialogOpen(false);
9020
+ },
9021
+ onConfirm: onPasteViewPresetConfirm
8453
9022
  })]
8454
9023
  })
8455
9024
  );
@@ -8689,7 +9258,9 @@ var WorkspaceView = function WorkspaceView(_ref) {
8689
9258
  },
8690
9259
  '.mosaic-window-toolbar .mosaic-window-title': {
8691
9260
  color: windowIsActive ? theme.palette.geowebColors.typographyAndIcons.text : theme.palette.geowebColors.typographyAndIcons.inactiveText
8692
- }
9261
+ },
9262
+ containerName: 'workspace-view-container',
9263
+ containerType: 'inline-size'
8693
9264
  };
8694
9265
  },
8695
9266
  children: jsx(WorkspaceTileConnect, {
@@ -8802,26 +9373,18 @@ var WorkspaceViewConnect = function WorkspaceViewConnect(_ref) {
8802
9373
  * Copyright 2025 - Finnish Meteorological Institute (FMI)
8803
9374
  * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
8804
9375
  * */
8805
- var useFetchWorkspacePresets = function useFetchWorkspacePresets() {
9376
+ /**
9377
+ * Resets workspace list filter chips when the user's role changes
9378
+ * between admin and non-admin.
9379
+ */
9380
+ var useResetFiltersOnRoleChange = function useResetFiltersOnRoleChange() {
8806
9381
  var dispatch = useDispatch();
8807
9382
  var _useAuthenticationCon = useAuthenticationContext(),
8808
9383
  currentRole = _useAuthenticationCon.currentRole;
8809
9384
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
8810
9385
  var lastAdmin = usePrevious(isAdmin);
8811
- var workspaceSearchQuery = useSelector(getWorkspaceListSearchQuery);
8812
- var prevSearch = usePrevious(workspaceSearchQuery);
8813
- var fetchWorkspacePresets = useCallback(function (params) {
8814
- dispatch(workspaceListActions.fetchWorkspaceList(params));
8815
- }, [dispatch]);
8816
- useEffect(function () {
8817
- if (workspaceSearchQuery !== prevSearch) {
8818
- var filterParams = constructFilterParams([], workspaceSearchQuery);
8819
- fetchWorkspacePresets(filterParams);
8820
- }
8821
- }, [fetchWorkspacePresets, prevSearch, workspaceSearchQuery]);
8822
9386
  useEffect(function () {
8823
9387
  if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
8824
- // reset list filter when user changes role
8825
9388
  var filters = [{
8826
9389
  id: PresetFilterType.system,
8827
9390
  isSelected: true
@@ -8856,7 +9419,7 @@ var WorkspaceMenuButtonConnect = function WorkspaceMenuButtonConnect(_ref) {
8856
9419
  isWorkspaceListDialogOpen: isListDialogOpen
8857
9420
  }));
8858
9421
  }, [dispatch]);
8859
- useFetchWorkspacePresets();
9422
+ useResetFiltersOnRoleChange();
8860
9423
  var isNew = workspaceId === undefined || workspaceId === '';
8861
9424
  var fullTitle = getPresetTitle(title, hasChanges, isNew, t);
8862
9425
  React.useEffect(function () {
@@ -8872,7 +9435,7 @@ var WorkspaceMenuButtonConnect = function WorkspaceMenuButtonConnect(_ref) {
8872
9435
  };
8873
9436
 
8874
9437
  var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
8875
- var _currentWorkspacePres;
9438
+ var _workspaceData$userna;
8876
9439
  var title = _ref.title,
8877
9440
  workspaceId = _ref.workspaceId;
8878
9441
  var dispatch = useDispatch();
@@ -8891,14 +9454,14 @@ var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
8891
9454
  var workspaceData = useSelector(function (store) {
8892
9455
  return getWorkspaceData(store);
8893
9456
  });
8894
- var currentWorkspacePreset = useSelector(function (store) {
8895
- return workspaceId ? getWorkspacePresetFromList(store, workspaceId) : undefined;
8896
- });
8897
- var workspaceCreator = (_currentWorkspacePres = currentWorkspacePreset == null ? void 0 : currentWorkspacePreset.username) != null ? _currentWorkspacePres : '';
9457
+ var workspaceCreator = (_workspaceData$userna = workspaceData == null ? void 0 : workspaceData.username) != null ? _workspaceData$userna : '';
8898
9458
  var viewIds = useSelector(function (store) {
8899
9459
  return getViewIds(store);
8900
9460
  });
8901
- var isNew = !workspaceId;
9461
+ var storeWorkspaceId = useSelector(function (store) {
9462
+ return getWorkspaceId(store);
9463
+ });
9464
+ var isNew = !storeWorkspaceId;
8902
9465
  var isUserPreset = workspaceScope === 'user';
8903
9466
  var isUserPresetCreator = (auth == null ? void 0 : auth.username) === workspaceCreator;
8904
9467
  var setWorkspaceActionDialogOptions = React.useCallback(function (dialogOptions) {
@@ -9023,13 +9586,81 @@ var WorkspaceOptionsConnect = function WorkspaceOptionsConnect(_ref) {
9023
9586
  }
9024
9587
  return isUserPreset && isUserPresetCreator ? onEdit : undefined;
9025
9588
  };
9026
- return jsx(WorkspaceOptions, {
9027
- handleDelete: getOnDelete(),
9028
- handleEdit: handleEdit(),
9029
- handleReset: onReset,
9030
- handleSave: handleSave(),
9031
- handleSaveAs: handleSaveAs(),
9032
- isDisabled: !viewIds.length || !isLoggedIn
9589
+ var _React$useState = React.useState(false),
9590
+ isPasteDialogOpen = _React$useState[0],
9591
+ setIsPasteDialogOpen = _React$useState[1];
9592
+ var onCopyToClipboard = React.useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
9593
+ var preset, expanded, sanitized, json;
9594
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
9595
+ while (1) switch (_context.prev = _context.next) {
9596
+ case 0:
9597
+ _context.prev = 0;
9598
+ _context.next = 3;
9599
+ return getWorkspace(workspaceId, auth);
9600
+ case 3:
9601
+ preset = _context.sent;
9602
+ _context.next = 6;
9603
+ return expandWorkspaceViewPresets(preset, auth);
9604
+ case 6:
9605
+ expanded = _context.sent;
9606
+ sanitized = sanitizeWorkspaceForClipboard(expanded);
9607
+ json = JSON.stringify(sanitized, null, 2);
9608
+ _context.next = 11;
9609
+ return writeToClipboard(json);
9610
+ case 11:
9611
+ dispatch(snackbarActions.openSnackbar({
9612
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
9613
+ message: t('workspace-copy-success')
9614
+ }));
9615
+ _context.next = 17;
9616
+ break;
9617
+ case 14:
9618
+ _context.prev = 14;
9619
+ _context.t0 = _context["catch"](0);
9620
+ dispatch(snackbarActions.openSnackbar({
9621
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
9622
+ message: t('workspace-error-generic')
9623
+ }));
9624
+ case 17:
9625
+ case "end":
9626
+ return _context.stop();
9627
+ }
9628
+ }, _callee, null, [[0, 14]]);
9629
+ })), [auth, workspaceId, dispatch, t]);
9630
+ var onPasteFromClipboard = React.useCallback(function () {
9631
+ setIsPasteDialogOpen(true);
9632
+ }, []);
9633
+ var onPasteConfirm = React.useCallback(function (jsonString) {
9634
+ var parsed = JSON.parse(jsonString);
9635
+ var sanitized = sanitizeWorkspaceForClipboard(parsed);
9636
+ var workspacePreset = getLoadingWorkspace(sanitized);
9637
+ dispatch(workspaceActions.changePreset({
9638
+ workspacePreset: workspacePreset,
9639
+ markAsChanged: true
9640
+ }));
9641
+ dispatch(snackbarActions.openSnackbar({
9642
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
9643
+ message: t('workspace-paste-success')
9644
+ }));
9645
+ }, [dispatch, t]);
9646
+ return jsxs(Fragment, {
9647
+ children: [jsx(WorkspaceOptions, {
9648
+ handleCopyToClipboard: isNew ? undefined : onCopyToClipboard,
9649
+ handleDelete: getOnDelete(),
9650
+ handleEdit: handleEdit(),
9651
+ handlePasteFromClipboard: onPasteFromClipboard,
9652
+ handleReset: onReset,
9653
+ handleSave: handleSave(),
9654
+ handleSaveAs: handleSaveAs(),
9655
+ isDisabled: !viewIds.length || !isLoggedIn
9656
+ }), jsx(PastePresetDialog, {
9657
+ isOpen: isPasteDialogOpen,
9658
+ mode: "workspace",
9659
+ onClose: function onClose() {
9660
+ return setIsPasteDialogOpen(false);
9661
+ },
9662
+ onConfirm: onPasteConfirm
9663
+ })]
9033
9664
  });
9034
9665
  };
9035
9666
 
@@ -9072,6 +9703,7 @@ var emptyWorkspacePreset = {
9072
9703
  "abstract": ''
9073
9704
  };
9074
9705
  var SHORT_DESC_LIMIT$1 = 100;
9706
+ var VIEW_TITLE_LIMIT = 100;
9075
9707
  var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
9076
9708
  var _watch;
9077
9709
  var error = _ref.error,
@@ -9130,7 +9762,7 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
9130
9762
  };
9131
9763
  var hasFormInput = action === WorkspacePresetAction.DUPLICATE || action === WorkspacePresetAction.SAVE || action === WorkspacePresetAction.SAVE_AS || action === WorkspacePresetAction.EDIT || action === WorkspacePresetAction.EDIT_TITLE || action === WorkspacePresetAction.SAVE_SYSTEM_PRESET || action === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS;
9132
9764
  // disable form inputs
9133
- var isDisabled = hasSavedWorkspace || isLoading;
9765
+ var isDisabled = isLoading || hasSavedWorkspace && action !== WorkspacePresetAction.EDIT_TITLE;
9134
9766
  var shouldShowLabelsForm = action === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || action === WorkspacePresetAction.SAVE_AS || action === WorkspacePresetAction.EDIT;
9135
9767
  return jsxs(Fragment, {
9136
9768
  children: [!!error && !shouldShowTitleError && jsx(Box, {
@@ -9173,7 +9805,16 @@ var WorkspacePresetsForm = function WorkspacePresetsForm(_ref) {
9173
9805
  label: mosaicNodeId || t('workspace-view-title'),
9174
9806
  name: "views.0.title",
9175
9807
  rules: {
9176
- required: false
9808
+ required: false,
9809
+ maxLength: {
9810
+ value: VIEW_TITLE_LIMIT,
9811
+ message: "Maximum " + VIEW_TITLE_LIMIT + " characters"
9812
+ }
9813
+ },
9814
+ slotProps: {
9815
+ htmlInput: {
9816
+ maxLength: VIEW_TITLE_LIMIT
9817
+ }
9177
9818
  }
9178
9819
  })]
9179
9820
  });
@@ -9966,100 +10607,6 @@ var ViewPresetsForm = function ViewPresetsForm(_ref) {
9966
10607
  });
9967
10608
  };
9968
10609
 
9969
- var useDeleteViewPreset = function useDeleteViewPreset() {
9970
- var _useAuthenticationCon = useAuthenticationContext(),
9971
- auth = _useAuthenticationCon.auth;
9972
- return useMutation({
9973
- mutationFn: function () {
9974
- var _mutationFn = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
9975
- var id;
9976
- return _regeneratorRuntime().wrap(function _callee$(_context) {
9977
- while (1) switch (_context.prev = _context.next) {
9978
- case 0:
9979
- id = _ref.id;
9980
- if (auth) {
9981
- _context.next = 3;
9982
- break;
9983
- }
9984
- throw new Error('Authentication context not found');
9985
- case 3:
9986
- return _context.abrupt("return", deleteViewPreset(id, auth));
9987
- case 4:
9988
- case "end":
9989
- return _context.stop();
9990
- }
9991
- }, _callee);
9992
- }));
9993
- function mutationFn(_x) {
9994
- return _mutationFn.apply(this, arguments);
9995
- }
9996
- return mutationFn;
9997
- }()
9998
- });
9999
- };
10000
- var useSaveViewPreset = function useSaveViewPreset() {
10001
- var _useAuthenticationCon2 = useAuthenticationContext(),
10002
- auth = _useAuthenticationCon2.auth;
10003
- return useMutation({
10004
- mutationFn: function () {
10005
- var _mutationFn2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2) {
10006
- var id, data;
10007
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
10008
- while (1) switch (_context2.prev = _context2.next) {
10009
- case 0:
10010
- id = _ref2.id, data = _ref2.data;
10011
- if (auth) {
10012
- _context2.next = 3;
10013
- break;
10014
- }
10015
- throw new Error('Authentication context not found');
10016
- case 3:
10017
- return _context2.abrupt("return", saveViewPreset(id, data, auth));
10018
- case 4:
10019
- case "end":
10020
- return _context2.stop();
10021
- }
10022
- }, _callee2);
10023
- }));
10024
- function mutationFn(_x2) {
10025
- return _mutationFn2.apply(this, arguments);
10026
- }
10027
- return mutationFn;
10028
- }()
10029
- });
10030
- };
10031
- var useSaveViewPresetAs = function useSaveViewPresetAs() {
10032
- var _useAuthenticationCon3 = useAuthenticationContext(),
10033
- auth = _useAuthenticationCon3.auth;
10034
- return useMutation({
10035
- mutationFn: function () {
10036
- var _mutationFn3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref3) {
10037
- var data;
10038
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
10039
- while (1) switch (_context3.prev = _context3.next) {
10040
- case 0:
10041
- data = _ref3.data;
10042
- if (auth) {
10043
- _context3.next = 3;
10044
- break;
10045
- }
10046
- throw new Error('Authentication context not found');
10047
- case 3:
10048
- return _context3.abrupt("return", saveViewPresetAs(data, auth));
10049
- case 4:
10050
- case "end":
10051
- return _context3.stop();
10052
- }
10053
- }, _callee3);
10054
- }));
10055
- function mutationFn(_x3) {
10056
- return _mutationFn3.apply(this, arguments);
10057
- }
10058
- return mutationFn;
10059
- }()
10060
- });
10061
- };
10062
-
10063
10610
  var _excluded = ["title"];
10064
10611
  var ViewPresetsFormDialog = function ViewPresetsFormDialog(_ref) {
10065
10612
  var isOpen = _ref.isOpen,
@@ -10594,8 +11141,8 @@ var workspacePresets = [
10594
11141
  defaultOverlayer: "countryborders"
10595
11142
  },
10596
11143
  syncGroupsIds: [
10597
- "Area_radarTemp",
10598
- "Time_radarTemp"
11144
+ "Area_RadarTemp",
11145
+ "Time_RadarTemp"
10599
11146
  ]
10600
11147
  },
10601
11148
  title: "Radar",
@@ -10688,8 +11235,8 @@ var workspacePresets = [
10688
11235
  defaultOverlayer: "countryborders"
10689
11236
  },
10690
11237
  syncGroupsIds: [
10691
- "Area_radarTemp",
10692
- "Time_radarTemp"
11238
+ "Area_RadarTemp",
11239
+ "Time_RadarTemp"
10693
11240
  ]
10694
11241
  },
10695
11242
  title: "Temperature"
@@ -10707,8 +11254,8 @@ var workspacePresets = [
10707
11254
  ],
10708
11255
  mosaicNode: {
10709
11256
  direction: "row",
10710
- first: "screen_no_1",
10711
- second: "screen_no_2",
11257
+ first: "viewA",
11258
+ second: "viewB",
10712
11259
  splitPercentage: 50
10713
11260
  }
10714
11261
  },
@@ -11185,7 +11732,36 @@ var workspacePresets = [
11185
11732
  views: [
11186
11733
  {
11187
11734
  mosaicNodeId: "view-1",
11188
- viewPresetId: "screenHarmAll"
11735
+ componentType: "HarmonieTempAndPrecipPreset",
11736
+ initialProps: {
11737
+ layers: {
11738
+ topRow: {
11739
+ service: "https://geoservices.knmi.nl/adaguc-server?DATASET=uwcw_ha43_dini_5p5km",
11740
+ name: "air_temperature_hagl",
11741
+ style: "temperature_wow/shaded",
11742
+ id: "layerid_18",
11743
+ layerType: "mapLayer",
11744
+ enabled: true
11745
+ },
11746
+ bottomRow: {
11747
+ service: "https://geoservices.knmi.nl/adaguc-server?DATASET=uwcw_ha43_dini_5p5km",
11748
+ name: "total_precipitation_rate_hagl",
11749
+ id: "layerid_19",
11750
+ layerType: "mapLayer",
11751
+ enabled: true
11752
+ },
11753
+ topRowSyncGroups: [
11754
+ "timeLayerGroupA",
11755
+ "areaLayerGroupA",
11756
+ "layerGroupA"
11757
+ ],
11758
+ bottomRowSyncGroups: [
11759
+ "timeLayerGroupA",
11760
+ "areaLayerGroupA",
11761
+ "layerGroupB"
11762
+ ]
11763
+ }
11764
+ }
11189
11765
  }
11190
11766
  ],
11191
11767
  syncGroups: [
@@ -11211,9 +11787,11 @@ var workspacePresets = [
11211
11787
  {
11212
11788
  id: "screenConfigD",
11213
11789
  title: "Radar & Sat",
11214
- scope: "system",
11790
+ scope: "user",
11791
+ username: "user.name",
11215
11792
  abstract: "",
11216
11793
  viewType: "multiWindow",
11794
+ description: "en stor ost",
11217
11795
  views: [
11218
11796
  {
11219
11797
  mosaicNodeId: "viewAsat",
@@ -11480,7 +12058,8 @@ var workspacePresets = [
11480
12058
  viewPresetId: "radar"
11481
12059
  }
11482
12060
  ],
11483
- mosaicNode: "radarView"
12061
+ mosaicNode: "radarView",
12062
+ username: "user.name"
11484
12063
  },
11485
12064
  {
11486
12065
  id: "workspaceHarmonie",
@@ -11662,6 +12241,57 @@ var workspacePresets = [
11662
12241
  }
11663
12242
  ],
11664
12243
  mosaicNode: "screen_no_1"
12244
+ },
12245
+ {
12246
+ id: "screenConfigLayerLoadFailure",
12247
+ title: "Layer load failure demo",
12248
+ scope: "system",
12249
+ abstract: "Workspace with one intentionally broken layer",
12250
+ viewType: "singleWindow",
12251
+ views: [
12252
+ {
12253
+ mosaicNodeId: "view-1",
12254
+ componentType: "Map",
12255
+ title: "Broken layer map",
12256
+ initialProps: {
12257
+ mapPreset: {
12258
+ proj: {
12259
+ bbox: {
12260
+ left: -450651.2255879827,
12261
+ bottom: 6490531.093143953,
12262
+ right: 1428345.8183648037,
12263
+ top: 7438773.776232235
12264
+ },
12265
+ srs: "EPSG:3857"
12266
+ },
12267
+ layers: [
12268
+ {
12269
+ id: "layerid_base_1",
12270
+ name: "WorldMap_Light_Grey_Canvas",
12271
+ type: "twms",
12272
+ enabled: true,
12273
+ layerType: "baseLayer"
12274
+ },
12275
+ {
12276
+ id: "layerid_broken_1",
12277
+ name: "this_layer_does_not_exist",
12278
+ service: "https://broken-wms.invalid/adagucserver?dataset=does_not_exist",
12279
+ format: "image/png",
12280
+ enabled: true,
12281
+ layerType: "mapLayer"
12282
+ }
12283
+ ],
12284
+ showTimeSlider: false,
12285
+ shouldAutoUpdate: false
12286
+ },
12287
+ syncGroupsIds: [
12288
+ ]
12289
+ }
12290
+ }
12291
+ ],
12292
+ syncGroups: [
12293
+ ],
12294
+ mosaicNode: "view-1"
11665
12295
  }
11666
12296
  ];
11667
12297
 
@@ -11700,7 +12330,8 @@ var workspacePresetList = workspacePresets.map(function (preset) {
11700
12330
  scope: preset.scope,
11701
12331
  viewType: preset.viewType,
11702
12332
  "abstract": (_preset$abstract = preset["abstract"]) != null ? _preset$abstract : '',
11703
- description: preset.description
12333
+ description: preset.description,
12334
+ username: preset.username
11704
12335
  };
11705
12336
  });
11706
12337
  var workspaceEndpoints = [http["delete"](/^.*\/workspacepreset\/(.*)$/, /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
@@ -11807,4 +12438,4 @@ var workspaceEndpoints = [http["delete"](/^.*\/workspacepreset\/(.*)$/, /*#__PUR
11807
12438
  }, _callee6);
11808
12439
  })))];
11809
12440
 
11810
- export { ALL_COMPONENT_TYPES, AVIATION_COMPONENT_TYPES, CAP_COMPONENT_TYPES, ComponentsLookUpWrapper, DemoWrapper, PresetAction, SUPPORTED_COMPONENT_TYPES, SUPPORTED_TIMESERIES_COMPONENT_TYPES, ViewPresetErrorComponent, ViewPresetErrorType, WARNING_LIST_COMPONENT_TYPES, WORKSPACE_NAMESPACE, WorkspaceDetail, WorkspaceErrorType, WorkspaceI18nProvider, WorkspacePresetAction, WorkspaceStoreWrapper, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProviderWithStore, createBalancedMosaicNode, createCustomEmptyMapWorkspace, defaultAuthConfig, getEmptyMapWorkspace, getWorkspaceRouteUrl, selectors$2 as selectors, viewPresetActions, viewPresetsListReducer, viewPresetsListener, viewPresetsReducer, workspaceActions, workspaceEndpoints, workspaceListActions, workspaceListListener, workspaceListReducer, workspaceListener, workspaceMiddlewares, workspaceReducer, workspaceReducersMap, routes as workspaceRoutes, workspaceTranslations };
12441
+ export { ALL_COMPONENT_TYPES, AVIATION_COMPONENT_TYPES, CAP_COMPONENT_TYPES, ComponentsLookUpWrapper, DemoWrapper, PresetAction, SUPPORTED_COMPONENT_TYPES, SUPPORTED_TIMESERIES_COMPONENT_TYPES, ViewPresetErrorComponent, ViewPresetErrorType, WARNING_LIST_COMPONENT_TYPES, WORKSPACE_NAMESPACE, WorkspaceDetail, WorkspaceErrorType, WorkspaceI18nProvider, WorkspacePresetAction, WorkspaceStoreWrapper, WorkspaceThemeProvider, WorkspaceTopBar, WorkspaceViewConnect, WorkspaceWrapperProviderWithStore, createBalancedMosaicNode, createCustomEmptyMapWorkspace, defaultAuthConfig, getEmptyMapWorkspace, getWorkspaceRouteUrl, selectors$2 as selectors, viewPresetActions, viewPresetsListener, viewPresetsReducer, workspaceActions, workspaceEndpoints, workspaceListActions, workspaceListListener, workspaceListReducer, workspaceListener, workspaceMiddlewares, workspaceReducer, workspaceReducersMap, routes as workspaceRoutes, workspaceTranslations };