@opengeoweb/workspace 12.1.2 → 12.3.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 (32) hide show
  1. package/index.esm.js +854 -613
  2. package/package.json +19 -19
  3. package/src/lib/api/viewpresets-api/api.d.ts +4 -0
  4. package/src/lib/api/workspace-api/api.d.ts +3 -3
  5. package/src/lib/api/workspace-api/hooks.d.ts +2 -2
  6. package/src/lib/components/ViewPresetsFormDialog/ViewPresetsFormDialogConnect.d.ts +2 -2
  7. package/src/lib/components/WorkspacePresetsFormDialog/WorkspacePresetsForm.d.ts +2 -2
  8. package/src/lib/components/WorkspacePresetsFormDialog/WorkspacePresetsFormDialog.d.ts +2 -2
  9. package/src/lib/components/WorkspaceSelectList/WorkspaceSelectList.d.ts +2 -2
  10. package/src/lib/components/WorkspaceView/WorkspaceTileConnect.d.ts +1 -1
  11. package/src/lib/components/WorkspaceView/helpers.d.ts +2 -2
  12. package/src/lib/hooks/useFetchViewPresets.d.ts +1 -0
  13. package/src/lib/store/store.d.ts +11 -11
  14. package/src/lib/store/viewPresets/listener.d.ts +4 -4
  15. package/src/lib/store/viewPresets/reducer.d.ts +1 -1
  16. package/src/lib/store/viewPresets/selectors.d.ts +511 -35
  17. package/src/lib/store/viewPresets/types.d.ts +12 -9
  18. package/src/lib/store/viewPresets/utils.d.ts +1 -1
  19. package/src/lib/store/viewPresetsList/reducer.d.ts +1 -1
  20. package/src/lib/store/viewPresetsList/selectors.d.ts +177 -4
  21. package/src/lib/store/viewPresetsList/types.d.ts +4 -3
  22. package/src/lib/store/workspace/listener.d.ts +3 -3
  23. package/src/lib/store/workspace/selectors.d.ts +1788 -68
  24. package/src/lib/store/workspace/types.d.ts +19 -9
  25. package/src/lib/store/workspace/utils.d.ts +2 -2
  26. package/src/lib/store/workspaceList/listener.d.ts +3 -3
  27. package/src/lib/store/workspaceList/reducer.d.ts +21 -3
  28. package/src/lib/store/workspaceList/selectors.d.ts +310 -76
  29. package/src/lib/store/workspaceList/types.d.ts +12 -11
  30. package/src/lib/store/workspaceList/utils.d.ts +4 -4
  31. package/src/lib/utils/api.d.ts +3 -3
  32. package/src/lib/utils/utils.d.ts +3 -2
package/index.esm.js CHANGED
@@ -1,26 +1,26 @@
1
1
  import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware, combineReducers, configureStore } from '@reduxjs/toolkit';
2
- import { syncGroupsTypes, syncGroupsActions, layerActions, mapActions, uiActions, genericActions, layerTypes, mapEnums, selectorMemoizationOptions, genericSelectors, mapSelectors, syncGroupsSelectors, routerActions, createViewObjectForNewMap, mapListener, serviceListener, layersListener, syncGroupsListener, openlayersListener, mapReducer, serviceReducer, layerReducer, syncGroupsReducer, loadingIndicatorReducer, uiReducer, linkComponentTypesConstants, uiTypes, loadingIndicatorSelectors, uiSelectors } from '@opengeoweb/store';
3
- import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, getConfig, getHeaders, handleResponse, useApiContext, useAuthenticationContext as useAuthenticationContext$1, GEOWEB_ROLE_PRESETS_ADMIN as GEOWEB_ROLE_PRESETS_ADMIN$1 } from '@opengeoweb/api';
4
- import { chunk, cloneDeep, pick, isEmpty, isEqual, isString } from 'lodash';
5
- import { getLeaves, MosaicContext, getAndAssertNodeAtPathExists, createBalancedTreeFromLeaves, MosaicWindow, Mosaic } from 'react-mosaic-component';
2
+ import { syncGroupsTypes, syncGroupsActions, layerActions, mapActions, uiActions, genericActions, layerTypes, mapEnums, selectorMemoizationOptions, genericSelectors, mapSelectors, syncGroupsSelectors, routerActions, createViewObjectForNewMap, mapListener, serviceListener, layersListener, syncGroupsListener, openlayersListener, uiReducer, loadingIndicatorReducer, syncGroupsReducer, layerReducer, serviceReducer, mapReducer, loadingIndicatorSelectors, uiTypes, linkComponentTypesConstants, uiSelectors } from '@opengeoweb/store';
3
+ import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, getHeaders, handleResponse, useApiContext, useAuthenticationContext as useAuthenticationContext$1, GEOWEB_ROLE_PRESETS_ADMIN as GEOWEB_ROLE_PRESETS_ADMIN$1 } from '@opengeoweb/api';
4
+ import { chunk, cloneDeep, union, pick, isEmpty, isEqual, isString } from 'lodash';
5
+ import { getLeaves, createBalancedTreeFromLeaves, MosaicContext, getAndAssertNodeAtPathExists, MosaicWindow, Mosaic } from 'react-mosaic-component';
6
6
  import { timeSeriesActions, TimeSeriesTypes, timeSeriesSelectors, timeSeriesReducer } from '@opengeoweb/timeseries';
7
- import { publicWarningActions, WARN_NAMESPACE, warningsTranslations, publicWarningsSelectors } from '@opengeoweb/warnings';
8
- import { PresetScope, PROJECTION, getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, SHARED_NAMESPACE, sharedTranslations, ConfirmationServiceProvider, CustomIconButton, useConfirmationDialog, AlertBanner, CustomTooltip, SearchHighlight, ToggleMenu, DEFAULT_FILTER_HEIGHT, Filter, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, usePrevious, ConfirmationButtons } from '@opengeoweb/shared';
7
+ import { publicWarningActions, warningsTranslations, WARN_NAMESPACE, publicWarningsSelectors } from '@opengeoweb/warnings';
8
+ import { PROJECTION, getAxiosErrorMessage, isAxiosAuthError, isAxiosError as isAxiosError$1, safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, ConfirmationServiceProvider, usePrevious, AlertBanner, sessionStorageProvider, SystemScope, CustomTooltip, SearchHighlight, ToggleMenu, CustomIconButton, Filter, LastUpdateTime, renderCounter, CustomDialog, ToolContainer, CustomToggleButton, useConfirmationDialog, ConfirmationButtons } from '@opengeoweb/shared';
9
9
  import { snackbarTypes, snackbarActions, snackbarListener, snackbarReducer, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
10
10
  import { isAxiosError } from 'axios';
11
11
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
12
- import { ThemeWrapper, lightTheme, Link, LinkOff, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, SharedPresetsMyUser, SharedPresetsOtherUsers, Delete, Preset, PresetWorkspace, PresetTiles, CloudLoading, CloudIdle, WebAssetOff, Exclamation } from '@opengeoweb/theme';
12
+ import { ThemeWrapper, lightTheme, SharedPresetsMyUser, SharedPresetsOtherUsers, Delete, Preset, PresetWorkspace, PresetTiles, CloudLoading, CloudIdle, Link, LinkOff, SplitVertical, SplitHorizontal, Expand, UnExpand, Close, WebAssetOff, Exclamation } from '@opengeoweb/theme';
13
13
  import { Provider, useDispatch, useSelector, useStore, shallowEqual } from 'react-redux';
14
- import { initReactI18next, useTranslation, I18nextProvider } from 'react-i18next';
14
+ import { useTranslation, I18nextProvider } from 'react-i18next';
15
15
  import { AuthenticationProvider, useAuthenticationContext, GEOWEB_ROLE_PRESETS_ADMIN } from '@opengeoweb/authentication';
16
16
  import { QueryClient, QueryClientProvider, useMutation } from '@tanstack/react-query';
17
17
  import i18n from 'i18next';
18
- import { WEBMAP_REACT_NAMESPACE, webmapReactTranslations } from '@opengeoweb/webmap-react';
19
- import { CORE_NAMESPACE, coreTranslations } from '@opengeoweb/core';
20
- import { FORM_FIELDS_NAMESPACE, formFieldsTranslations, ReactHookFormTextField, ReactHookFormHiddenInput, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
18
+ import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE } from '@opengeoweb/webmap-react';
19
+ import { coreTranslations, CORE_NAMESPACE } from '@opengeoweb/core';
20
+ import { formFieldsTranslations, FORM_FIELDS_NAMESPACE, ReactHookFormTextField, ReactHookFormHiddenInput, ReactHookFormProvider, defaultFormOptions } from '@opengeoweb/form-fields';
21
21
  import * as React from 'react';
22
22
  import React__default, { useCallback, useEffect } from 'react';
23
- import { Menu, Typography, List, ListItem, ListItemButton, ListItemIcon, Checkbox, ListItemText, LinearProgress, styled, Grid2, Box, ListSubheader, MenuItem, useTheme, FormGroup, FormControlLabel, Tabs } from '@mui/material';
23
+ import { LinearProgress, Typography, styled, ListItemIcon, ListItem, ListItemButton, ListItemText, Grid, Box, Menu, ListSubheader, MenuItem, useTheme, List, Checkbox, FormGroup, FormControlLabel, Tabs } from '@mui/material';
24
24
  import 'react-mosaic-component/react-mosaic-component.css';
25
25
  import AutoSizer from 'react-virtualized-auto-sizer';
26
26
  import { FixedSizeList } from 'react-window';
@@ -78,8 +78,11 @@ var en = {
78
78
  "workspace-list-success-edit": "Workspace \"{{TITLE}}\" successfully edited",
79
79
  "workspace-list-success-save": "Workspace \"{{TITLE}}\" successfully saved",
80
80
  "workspace-list-success-reset": "Workspace \"{{TITLE}}\" has been reset succesfully",
81
+ "workspace-list-success-share": "Workspace \"{{TITLE}}\" succesfully shared",
82
+ "workspace-list-success-unshare": "Workspace \"{{TITLE}}\" succesfully unshared",
81
83
  "workspace-save-error": "Failed to save workspace \"{{TITLE}}\"",
82
84
  "workspace-error-generic": "Something went wrong, try again",
85
+ "workspace-error-auth": "Error related to authentication",
83
86
  "workspace-viewpreset-success-delete": "Map preset \"{{TITLE}}\" successfully deleted",
84
87
  "workspace-viewpreset-success-save-as": "New map preset \"{{TITLE}}\" successfully saved",
85
88
  "workspace-viewpreset-success-edit": "Map preset \"{{TITLE}}\" successfully edited",
@@ -105,7 +108,9 @@ var en = {
105
108
  "workspace-link-location-header": "Location",
106
109
  "workspace-link": "Link",
107
110
  "workspace-dialog-confirm-reset-view-message": "The view will be reset and all changes will be lost. Are you sure you want to continue?",
108
- "workspace-viewpreset-success-reset": "View preset \"{{TITLE}}\" has been reset succesfully"
111
+ "workspace-viewpreset-success-reset": "View preset \"{{TITLE}}\" has been reset succesfully",
112
+ "workspace-viewpreset-success-share": "View preset \"{{TITLE}}\" has been successfully shared",
113
+ "workspace-viewpreset-success-unshare": "View preset \"{{TITLE}}\" has been successfully unshared"
109
114
  };
110
115
  var fi = {
111
116
  "workspace-menu": "Workspace menu",
@@ -157,9 +162,11 @@ var fi = {
157
162
  "workspace-list-success-duplicate": "Workspace \"{{TITLE}}\" tallennettu onnistuneesti",
158
163
  "workspace-list-success-edit": "Workspacea \"{{TITLE}}\" muokattu onnistuneesti",
159
164
  "workspace-list-success-reset": "ei käännetty",
165
+ "workspace-list-success-share": "ei kannetty",
160
166
  "workspace-list-success-save": "Workspace \"{{TITLE}}\" tallennettu onnistuneesti",
161
167
  "workspace-save-error": "Workspacen \"{{TITLE}}\" tallentaminen epäonnistui",
162
168
  "workspace-error-generic": "Jotain meni mönkään. Yritä uudelleen.",
169
+ "workspace-error-auth": "ei kaannetty",
163
170
  "workspace-viewpreset-success-delete": "Map preset \"{{TITLE}}\" poistettu onnistuneesti",
164
171
  "workspace-viewpreset-success-save-as": "Uusi map preset \"{{TITLE}}\" tallennettu onnistuneesti",
165
172
  "workspace-viewpreset-success-edit": "Map presettiä \"{{TITLE}}\" muokattu onnistuneesti",
@@ -183,7 +190,9 @@ var fi = {
183
190
  "workspace-link-location-header": "Sijainti",
184
191
  "workspace-link": "Link",
185
192
  "workspace-dialog-confirm-reset-view-message": "ei käännetty",
186
- "workspace-viewpreset-success-reset": "ei käännetty"
193
+ "workspace-viewpreset-success-reset": "ei käännetty",
194
+ "workspace-viewpreset-success-share": "ei käännetty",
195
+ "workspace-viewpreset-success-unshare": "ei käännetty"
187
196
  };
188
197
  var no = {
189
198
  "workspace-menu": "Arbeidsflater",
@@ -197,7 +206,7 @@ var no = {
197
206
  "workspace-save-as": "Lagre som",
198
207
  "workspace-edit": "Endre (navn og sammendrag)",
199
208
  "workspace-share": "Del",
200
- "workspace-stop-share": "Stop deling",
209
+ "workspace-stop-share": "Stopp deling",
201
210
  "geoweb-welcome": "Velkommen til GeoWeb. Åpne et forhåndsvalg for å åpne nye vinduer",
202
211
  "workspace-modified-new": "modifisert",
203
212
  "workspace-modified-existing": "ikke lagret",
@@ -234,10 +243,13 @@ var no = {
234
243
  "workspace-list-success-delete": "Arbeidsflaten \"{{TITLE}}\" er slettet",
235
244
  "workspace-list-success-duplicate": "Arbeidsflaten \"{{TITLE}}\" er lagret",
236
245
  "workspace-list-success-edit": "Arbeidsflaten \"{{TITLE}}\" er endret",
237
- "workspace-list-success-reset": "ikke oversatt",
246
+ "workspace-list-success-reset": "Arbeidsflaten \"{{TITLE}}\" er tilbakestilt",
247
+ "workspace-list-success-share": "Arbeidsflaten \"{{TITLE}}\" er delt",
248
+ "workspace-list-success-unshare": "Arbeidsflaten \"{{TITLE}}\" deles ikke lenger",
238
249
  "workspace-list-success-save": "Arbeidsflaten \"{{TITLE}}\" er lagret",
239
250
  "workspace-save-error": "Feilet i å lagre arbeidsflaten \"{{TITLE}}\"",
240
251
  "workspace-error-generic": "Noe feilet, prøv igjen",
252
+ "workspace-error-auth": "Autentiseringsfeil",
241
253
  "workspace-viewpreset-success-delete": "Snarvei \"{{TITLE}}\" er slettet",
242
254
  "workspace-viewpreset-success-save-as": "Ny snarvei \"{{TITLE}}\" er lagret",
243
255
  "workspace-viewpreset-success-edit": "Snarvei \"{{TITLE}}\" er endret",
@@ -260,8 +272,10 @@ var no = {
260
272
  "workspace-dialog-confirm-delete-user": "Arbeidsflaten blir slettet, men alle vinduer som er brukt vil forbli intakte.",
261
273
  "workspace-link-location-header": "Lokasjon",
262
274
  "workspace-link": "Link",
263
- "workspace-dialog-confirm-reset-view-message": "Ikke oversatt",
264
- "workspace-viewpreset-success-reset": "Ikke oversatt"
275
+ "workspace-dialog-confirm-reset-view-message": "Endringer i dette vinduet blir tapt. Er du sikker på at du vil fortsette?",
276
+ "workspace-viewpreset-success-reset": "Vinduet er tilbakestilt",
277
+ "workspace-viewpreset-success-share": "Vinduet \"{{TITLE}}\" har blitt delt",
278
+ "workspace-viewpreset-success-unshare": "Vinduet \"{{TITLE}}\" deles ikke lenger"
265
279
  };
266
280
  var nl = {
267
281
  "workspace-menu": "Workspace menu",
@@ -313,9 +327,11 @@ var nl = {
313
327
  "workspace-list-success-duplicate": "Workspace \"{{TITLE}}\" succesvol opgeslagen",
314
328
  "workspace-list-success-edit": "Workspace \"{{TITLE}}\" succesvol aangepast",
315
329
  "workspace-list-success-reset": "Workspace\"{{TITLE}}\" succesvol hersteld naar origineel",
330
+ "workspace-list-success-share": "niet vertaald",
316
331
  "workspace-list-success-save": "Workspace \"{{TITLE}}\" succesvol opgeslagen",
317
332
  "workspace-save-error": "Workspace opslaan \"{{TITLE}}\" mislukt",
318
333
  "workspace-error-generic": "Er is iets mis gegaan, probeer het opnieuw",
334
+ "workspace-error-auth": "niet vertaald",
319
335
  "workspace-viewpreset-success-delete": "Map preset \"{{TITLE}}\" succesvol verwijderd",
320
336
  "workspace-viewpreset-success-save-as": "Nieuwe map preset \"{{TITLE}}\" succesvol opgeslagen",
321
337
  "workspace-viewpreset-success-edit": "Map preset \"{{TITLE}}\" succesvol aangepast",
@@ -342,7 +358,9 @@ var nl = {
342
358
  "workspace-link-location-header": "Locatie",
343
359
  "workspace-link": "Link",
344
360
  "workspace-dialog-confirm-reset-view-message": "De viewpreset zal worden hersteld en alle aanpassing zullen worden verwijderd. Weet je zeker dat je door wilt gaan?",
345
- "workspace-viewpreset-success-reset": "Viewpreset \"{{TITLE}}\" succesvol hersteld naar origineel"
361
+ "workspace-viewpreset-success-reset": "Viewpreset \"{{TITLE}}\" succesvol hersteld naar origineel",
362
+ "workspace-viewpreset-success-share": "niet vertaald",
363
+ "workspace-viewpreset-success-unshare": "niet vertaald"
346
364
  };
347
365
  var workspaceTranslations = {
348
366
  en: en,
@@ -383,7 +401,7 @@ function _objectWithoutPropertiesLoose(r, e) {
383
401
  if (null == r) return {};
384
402
  var t = {};
385
403
  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
386
- if (e.indexOf(n) >= 0) continue;
404
+ if (-1 !== e.indexOf(n)) continue;
387
405
  t[n] = r[n];
388
406
  }
389
407
  return t;
@@ -406,9 +424,9 @@ function _regeneratorRuntime() {
406
424
  function define(t, e, r) {
407
425
  return Object.defineProperty(t, e, {
408
426
  value: r,
409
- enumerable: !0,
410
- configurable: !0,
411
- writable: !0
427
+ enumerable: true,
428
+ configurable: true,
429
+ writable: true
412
430
  }), t[e];
413
431
  }
414
432
  try {
@@ -501,7 +519,7 @@ function _regeneratorRuntime() {
501
519
  if ("throw" === i) throw a;
502
520
  return {
503
521
  value: t,
504
- done: !0
522
+ done: true
505
523
  };
506
524
  }
507
525
  for (n.method = i, n.arg = a;;) {
@@ -552,7 +570,7 @@ function _regeneratorRuntime() {
552
570
  function Context(t) {
553
571
  this.tryEntries = [{
554
572
  tryLoc: "root"
555
- }], t.forEach(pushTryEntry, this), this.reset(!0);
573
+ }], t.forEach(pushTryEntry, this), this.reset(true);
556
574
  }
557
575
  function values(e) {
558
576
  if (e || "" === e) {
@@ -562,8 +580,8 @@ function _regeneratorRuntime() {
562
580
  if (!isNaN(e.length)) {
563
581
  var o = -1,
564
582
  i = function next() {
565
- for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
566
- return next.value = t, next.done = !0, next;
583
+ for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = false, next;
584
+ return next.value = t, next.done = true, next;
567
585
  };
568
586
  return i.next = i;
569
587
  }
@@ -572,10 +590,10 @@ function _regeneratorRuntime() {
572
590
  }
573
591
  return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
574
592
  value: GeneratorFunctionPrototype,
575
- configurable: !0
593
+ configurable: true
576
594
  }), o(GeneratorFunctionPrototype, "constructor", {
577
595
  value: GeneratorFunction,
578
- configurable: !0
596
+ configurable: true
579
597
  }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
580
598
  var e = "function" == typeof t && t.constructor;
581
599
  return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
@@ -604,17 +622,17 @@ function _regeneratorRuntime() {
604
622
  return r.reverse(), function next() {
605
623
  for (; r.length;) {
606
624
  var t = r.pop();
607
- if (t in e) return next.value = t, next.done = !1, next;
625
+ if (t in e) return next.value = t, next.done = false, next;
608
626
  }
609
- return next.done = !0, next;
627
+ return next.done = true, next;
610
628
  };
611
629
  }, e.values = values, Context.prototype = {
612
630
  constructor: Context,
613
631
  reset: function (e) {
614
- if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
632
+ if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = false, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
615
633
  },
616
634
  stop: function () {
617
- this.done = !0;
635
+ this.done = true;
618
636
  var t = this.tryEntries[0].completion;
619
637
  if ("throw" === t.type) throw t.arg;
620
638
  return this.rval;
@@ -633,10 +651,10 @@ function _regeneratorRuntime() {
633
651
  var c = n.call(i, "catchLoc"),
634
652
  u = n.call(i, "finallyLoc");
635
653
  if (c && u) {
636
- if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
654
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, true);
637
655
  if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
638
656
  } else if (c) {
639
- if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
657
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, true);
640
658
  } else {
641
659
  if (!u) throw Error("try statement without catch or finally");
642
660
  if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
@@ -956,22 +974,25 @@ var PresetFilterType;
956
974
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
957
975
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
958
976
  * */
959
- var workspaceListFilterOptions = [{
977
+ var personalFilterState = {
960
978
  label: 'shared-filter-my-presets',
961
979
  id: PresetFilterType.personal,
962
980
  isSelected: true,
963
981
  isDisabled: false
964
- }, {
982
+ };
983
+ var systemFilterState = {
965
984
  label: 'shared-filter-system-presets',
966
985
  id: PresetFilterType.system,
967
986
  isSelected: true,
968
987
  isDisabled: false
969
- }, {
988
+ };
989
+ var sharedFilterState = {
970
990
  label: 'shared-filter-shared-presets',
971
991
  id: PresetFilterType.shared,
972
992
  isSelected: true,
973
993
  isDisabled: false
974
- }];
994
+ };
995
+ var defaultPresetFilterState = [personalFilterState, systemFilterState, sharedFilterState];
975
996
  var workspaceListAdapter = createEntityAdapter();
976
997
  var initialState$3 = Object.assign({
977
998
  isFetching: false,
@@ -979,7 +1000,7 @@ var initialState$3 = Object.assign({
979
1000
  isWorkspaceListDialogOpen: false
980
1001
  }, workspaceListAdapter.getInitialState(), {
981
1002
  searchQuery: '',
982
- workspaceListFilters: workspaceListFilterOptions
1003
+ workspaceListFilters: defaultPresetFilterState
983
1004
  });
984
1005
  var slice$3 = createSlice({
985
1006
  initialState: initialState$3,
@@ -1039,8 +1060,13 @@ var slice$3 = createSlice({
1039
1060
  },
1040
1061
  onErrorWorkspacePresetAction: function onErrorWorkspacePresetAction(draft, action) {
1041
1062
  var error = action.payload.error;
1042
- draft.workspaceActionDialog.isFetching = false;
1043
- draft.workspaceActionDialog.error = error;
1063
+ if (draft.workspaceActionDialog) {
1064
+ draft.workspaceActionDialog.isFetching = false;
1065
+ draft.workspaceActionDialog.error = error;
1066
+ } else {
1067
+ // fallback if dialog isn't open (e.g. SHARE action)
1068
+ draft.error = error;
1069
+ }
1044
1070
  },
1045
1071
  toggleWorkspaceDialog: function toggleWorkspaceDialog(draft, action) {
1046
1072
  var isListDialogOpen = action.payload.isWorkspaceListDialogOpen;
@@ -1144,21 +1170,19 @@ var PresetAction;
1144
1170
  * */
1145
1171
  var viewPresetsListFilterOptions = [{
1146
1172
  label: 'shared-filter-my-presets',
1147
- id: PresetScope.user,
1148
- type: 'scope',
1173
+ id: PresetFilterType.personal,
1149
1174
  isSelected: true,
1150
1175
  isDisabled: false
1151
1176
  }, {
1152
1177
  label: 'shared-filter-system-presets',
1153
- id: PresetScope.system,
1154
- type: 'scope',
1178
+ id: PresetFilterType.system,
1155
1179
  isSelected: true,
1156
1180
  isDisabled: false
1157
1181
  }, {
1158
1182
  label: 'shared-filter-shared-presets',
1159
- id: PresetScope.shared,
1183
+ id: PresetFilterType.shared,
1160
1184
  isSelected: true,
1161
- isDisabled: true
1185
+ isDisabled: false
1162
1186
  }];
1163
1187
  var viewPresetsAdapter = createEntityAdapter({
1164
1188
  // we use panelId as id (panelId can be mapId or viewId)
@@ -1547,28 +1571,34 @@ var setDocumentTitle = function setDocumentTitle(workspaceTitle, appTitle) {
1547
1571
  var fallbackAppTitle = appTitle || 'GeoWeb';
1548
1572
  document.title = workspaceTitle ? workspaceTitle + " - " + fallbackAppTitle : fallbackAppTitle;
1549
1573
  };
1550
- var filterWorkspacePresets = function filterWorkspacePresets(workspacePresets, selectedFilters, username) {
1574
+ var filterAndSortPresets = function filterAndSortPresets(presets, selectedFilters, username) {
1551
1575
  var isAllSelected = selectedFilters.every(function (filter) {
1552
1576
  return filter.isSelected;
1553
1577
  });
1554
- if (isAllSelected) {
1555
- return workspacePresets;
1556
- }
1557
1578
  var selectedIds = selectedFilters.filter(function (filter) {
1558
1579
  return filter.isSelected;
1559
1580
  }).map(function (filter) {
1560
1581
  return filter.id;
1561
1582
  });
1562
- return workspacePresets.filter(function (preset) {
1563
- return (
1564
- // System
1565
- selectedIds.includes('system') && preset.scope === 'system' ||
1566
- // Personal
1567
- selectedIds.includes('personal') && preset.username === username ||
1568
- // Shared
1569
- selectedIds.includes('shared') && preset.username !== username && preset.is_shared
1570
- );
1583
+ var filtered = isAllSelected ? presets : presets.filter(function (preset) {
1584
+ return selectedIds.includes(PresetFilterType.system) && preset.scope === 'system' || selectedIds.includes(PresetFilterType.personal) && preset.scope === 'user' && preset.username === username || selectedIds.includes(PresetFilterType.shared) && preset.username !== username && preset.is_shared;
1585
+ });
1586
+ var systemPresets = filtered.filter(function (preset) {
1587
+ return preset.scope === 'system';
1588
+ }).sort(function (a, b) {
1589
+ return a.title.localeCompare(b.title);
1590
+ });
1591
+ var personalPresets = filtered.filter(function (preset) {
1592
+ return preset.scope === 'user' && preset.username === username;
1593
+ }).sort(function (a, b) {
1594
+ return a.title.localeCompare(b.title);
1595
+ });
1596
+ var sharedPresets = filtered.filter(function (preset) {
1597
+ return preset.scope === 'user' && preset.username !== username;
1598
+ }).sort(function (a, b) {
1599
+ return a.title.localeCompare(b.title);
1571
1600
  });
1601
+ return [].concat(systemPresets, personalPresets, sharedPresets);
1572
1602
  };
1573
1603
 
1574
1604
  /* *
@@ -1588,7 +1618,7 @@ var filterWorkspacePresets = function filterWorkspacePresets(workspacePresets, s
1588
1618
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
1589
1619
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
1590
1620
  * */
1591
- var getSnackbarMessage$1 = function getSnackbarMessage(action, title) {
1621
+ var getSnackbarMessage$1 = function getSnackbarMessage(action, title, is_shared) {
1592
1622
  // Trim and add quotes
1593
1623
  var trimmedTitle = "" + title.trim();
1594
1624
  switch (action) {
@@ -1632,6 +1662,14 @@ var getSnackbarMessage$1 = function getSnackbarMessage(action, title) {
1632
1662
  TITLE: trimmedTitle
1633
1663
  }
1634
1664
  };
1665
+ case WorkspacePresetAction.SHARE:
1666
+ return {
1667
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
1668
+ key: is_shared ? 'workspace-list-success-unshare' : 'workspace-list-success-share',
1669
+ params: {
1670
+ TITLE: trimmedTitle
1671
+ }
1672
+ };
1635
1673
  default:
1636
1674
  return {
1637
1675
  type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
@@ -1728,17 +1766,13 @@ var createCustomEmptyMapWorkspace = function createCustomEmptyMapWorkspace(empty
1728
1766
  };
1729
1767
  var constructFilterParams = function constructFilterParams(filters, searchQuery) {
1730
1768
  // get filters
1731
- var _filters$reduce = filters.reduce(function (filterList, filter) {
1732
- if (filter.isSelected && 'type' in filter && filter.type === 'scope') {
1733
- return Object.assign({}, filter, {
1734
- scope: filterList.scope.concat(filter.id)
1735
- });
1736
- }
1737
- return filterList;
1738
- }, {
1739
- scope: []
1740
- }),
1741
- scope = _filters$reduce.scope;
1769
+ var scope = filters.reduce(function (scopeList, filter) {
1770
+ if (filter.isSelected) {
1771
+ var _scope = filter.id === PresetFilterType.system ? 'system' : 'user';
1772
+ return union(scopeList, [_scope]);
1773
+ }
1774
+ return scopeList;
1775
+ }, []);
1742
1776
  // get search
1743
1777
  var search = getCleanSearchQuery(searchQuery);
1744
1778
  return Object.assign({}, scope.length && {
@@ -2113,9 +2147,7 @@ var getViewPresetListSearchQueryForView = createSelector(getViewPresetById, func
2113
2147
  // To ensure you retrieve the view preset list specific for your view (incl and excl filters), use getFilteredViewPresetListForView
2114
2148
  var getViewPresetListFilterResultsForView = createSelector(getViewPresetById, function (viewPresetById) {
2115
2149
  var filteredResults = (viewPresetById == null ? void 0 : viewPresetById.filterResults) || {
2116
- entities: {},
2117
- ids: []
2118
- };
2150
+ entities: {}};
2119
2151
  return Object.values(filteredResults.entities);
2120
2152
  }, selectorMemoizationOptions);
2121
2153
 
@@ -2136,7 +2168,7 @@ var getViewPresetListFilterResultsForView = createSelector(getViewPresetById, fu
2136
2168
  * Copyright 2023 - Finnish Meteorological Institute (FMI)
2137
2169
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
2138
2170
  * */
2139
- var getSnackbarMessage = function getSnackbarMessage(action, title) {
2171
+ var getSnackbarMessage = function getSnackbarMessage(action, title, is_shared) {
2140
2172
  // Trim and add quotes
2141
2173
  var trimmedTitle = title.trim();
2142
2174
  switch (action) {
@@ -2172,6 +2204,14 @@ var getSnackbarMessage = function getSnackbarMessage(action, title) {
2172
2204
  TITLE: trimmedTitle
2173
2205
  }
2174
2206
  };
2207
+ case PresetAction.SHARE:
2208
+ return {
2209
+ type: snackbarTypes.SnackbarMessageType.TRANSLATABLE_MESSAGE,
2210
+ key: is_shared ? 'workspace-viewpreset-success-unshare' : 'workspace-viewpreset-success-share',
2211
+ params: {
2212
+ TITLE: trimmedTitle
2213
+ }
2214
+ };
2175
2215
  default:
2176
2216
  return {
2177
2217
  key: 'workspace-viewpreset-success-save',
@@ -4472,7 +4512,8 @@ var workspacePresetsList = [
4472
4512
  date: "2022-06-01T12:34:27.787184",
4473
4513
  scope: "user",
4474
4514
  abstract: "Some abstract",
4475
- viewType: "singleWindow"
4515
+ viewType: "singleWindow",
4516
+ username: "user.name"
4476
4517
  },
4477
4518
  {
4478
4519
  id: "screenConfigD",
@@ -5101,6 +5142,7 @@ workspaceListener.startListening({
5101
5142
  actionCreator: workspaceActions.updateWorkspaceViews,
5102
5143
  effect: function () {
5103
5144
  var _effect9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12(_, listenerApi) {
5145
+ var viewIds;
5104
5146
  return _regeneratorRuntime().wrap(function _callee12$(_context12) {
5105
5147
  while (1) switch (_context12.prev = _context12.next) {
5106
5148
  case 0:
@@ -5113,7 +5155,24 @@ workspaceListener.startListening({
5113
5155
  /* This will trigger all maps and other components
5114
5156
  to get the correct size after views are updated */
5115
5157
  window.dispatchEvent(new Event('resize'));
5116
- case 4:
5158
+ // Adjust the bbox of the original view after the new map is added. This is a temporal solution until the OpenLayers ticket
5159
+ // https://github.com/openlayers/openlayers/issues/16572 is solved.
5160
+ _context12.next = 6;
5161
+ return listenerApi.delay(10);
5162
+ case 6:
5163
+ viewIds = getViewIds(listenerApi.getState());
5164
+ viewIds.forEach(function (viewId) {
5165
+ var bbox = mapSelectors.getBbox(listenerApi.getState(), viewId);
5166
+ var srs = mapSelectors.getSrs(listenerApi.getState(), viewId);
5167
+ if (bbox && bbox.left !== undefined && srs) {
5168
+ listenerApi.dispatch(mapActions.setBbox({
5169
+ mapId: viewId,
5170
+ bbox: bbox,
5171
+ srs: srs
5172
+ }));
5173
+ }
5174
+ });
5175
+ case 8:
5117
5176
  case "end":
5118
5177
  return _context12.stop();
5119
5178
  }
@@ -5441,15 +5500,16 @@ viewPresetsListener.startListening({
5441
5500
  actionCreator: viewPresetActions.onSuccessViewPresetAction,
5442
5501
  effect: function () {
5443
5502
  var _effect3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(_ref7, listenerApi) {
5444
- var payload, action, viewPresetId, title, panelId, activeMapPresetId, hasChanges, viewPresetFilters, viewPresetSearchQuery;
5503
+ var payload, action, viewPresetId, title, panelId, is_shared, activeMapPresetId, hasChanges, viewPresetFilters, viewPresetSearchQuery;
5445
5504
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
5446
5505
  while (1) switch (_context5.prev = _context5.next) {
5447
5506
  case 0:
5448
5507
  payload = _ref7.payload;
5449
5508
  listenerApi.cancelActiveListeners();
5450
- action = payload.action, viewPresetId = payload.viewPresetId, title = payload.title, panelId = payload.panelId;
5509
+ action = payload.action, viewPresetId = payload.viewPresetId, title = payload.title, panelId = payload.panelId; // eslint-disable-next-line @typescript-eslint/naming-convention
5510
+ is_shared = 'is_shared' in payload ? payload.is_shared : undefined;
5451
5511
  try {
5452
- listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage(action, title)));
5512
+ listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage(action, title, is_shared)));
5453
5513
  activeMapPresetId = getViewPresetActiveId(listenerApi.getState(), panelId);
5454
5514
  hasChanges = false; // if active preset has been deleted, select the empty new preset
5455
5515
  if (action === PresetAction.DELETE && viewPresetId === activeMapPresetId) {
@@ -5481,7 +5541,7 @@ viewPresetsListener.startListening({
5481
5541
  } catch (error) {
5482
5542
  // TODO: use error handling of mapPreset https://gitlab.com/opengeoweb/opengeoweb/-/issues/3043
5483
5543
  }
5484
- case 4:
5544
+ case 5:
5485
5545
  case "end":
5486
5546
  return _context5.stop();
5487
5547
  }
@@ -5562,15 +5622,16 @@ workspaceListListener.startListening({
5562
5622
  effect: function () {
5563
5623
  var _effect2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2, listenerApi) {
5564
5624
  var _listenerApi$getOrigi;
5565
- var payload, currentWorkspaceId, action, workspaceId, title, workspaceFilters, searchQuery;
5625
+ var payload, currentWorkspaceId, action, workspaceId, title, is_shared, workspaceFilters, searchQuery;
5566
5626
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5567
5627
  while (1) switch (_context2.prev = _context2.next) {
5568
5628
  case 0:
5569
5629
  payload = _ref2.payload;
5570
5630
  listenerApi.cancelActiveListeners();
5571
5631
  currentWorkspaceId = (_listenerApi$getOrigi = listenerApi.getOriginalState().workspace) == null ? void 0 : _listenerApi$getOrigi.id;
5572
- action = payload.action, workspaceId = payload.workspaceId, title = payload.title;
5573
- listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage$1(action, title)));
5632
+ action = payload.action, workspaceId = payload.workspaceId, title = payload.title; // eslint-disable-next-line @typescript-eslint/naming-convention
5633
+ is_shared = 'is_shared' in payload ? payload.is_shared : undefined;
5634
+ listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage$1(action, title, is_shared)));
5574
5635
  // if active workspace has been deleted, empty out url
5575
5636
  if ((action === WorkspacePresetAction.DELETE || action === WorkspacePresetAction.DELETE_SYSTEM_PRESET) && currentWorkspaceId && workspaceId === currentWorkspaceId) {
5576
5637
  listenerApi.dispatch(routerActions.navigateToUrl({
@@ -5587,7 +5648,7 @@ workspaceListListener.startListening({
5587
5648
  workspaceFilters = getWorkspaceListFilters(listenerApi.getState());
5588
5649
  searchQuery = getWorkspaceListSearchQuery(listenerApi.getState());
5589
5650
  listenerApi.dispatch(workspaceListActions.fetchWorkspaceList(constructFilterParams(workspaceFilters, searchQuery)));
5590
- case 10:
5651
+ case 11:
5591
5652
  case "end":
5592
5653
  return _context2.stop();
5593
5654
  }
@@ -5603,7 +5664,7 @@ workspaceListListener.startListening({
5603
5664
  actionCreator: workspaceListActions.submitFormWorkspaceActionDialogOptions,
5604
5665
  effect: function () {
5605
5666
  var _effect3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref3, listenerApi) {
5606
- var payload, workspaceApi, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, _yield$workspaceApi$g2, originalData, workspaceDataNewTitle, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, viewPresetResults, hasError, workspaceData, newWorkspace, message, category;
5667
+ var payload, workspaceApi, presetId, presetAction, data, emptyMapPresetTitle, emptyWorkspacePresetTitle, scope, _yield$workspaceApi$g2, originalData, workspaceDataNewTitle, isSaveWorkspaceAction, isSaveAsWorkspaceAction, hasWorkspaceAlreadyBeenSaved, workspaceId, viewPresetResults, hasError, _hasError$message, errorMessage, workspaceData, newWorkspace, message, category;
5607
5668
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
5608
5669
  while (1) switch (_context4.prev = _context4.next) {
5609
5670
  case 0:
@@ -5645,7 +5706,7 @@ workspaceListListener.startListening({
5645
5706
  isSaveWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET || presetAction === WorkspacePresetAction.SAVE;
5646
5707
  isSaveAsWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || presetAction === WorkspacePresetAction.SAVE_AS;
5647
5708
  if (!(isSaveWorkspaceAction || isSaveAsWorkspaceAction)) {
5648
- _context4.next = 43;
5709
+ _context4.next = 44;
5649
5710
  break;
5650
5711
  }
5651
5712
  hasWorkspaceAlreadyBeenSaved = getWorkspaceDialogIsSaved(listenerApi.getState());
@@ -5730,15 +5791,20 @@ workspaceListListener.startListening({
5730
5791
  return view.message;
5731
5792
  });
5732
5793
  if (!hasError) {
5733
- _context4.next = 37;
5794
+ _context4.next = 38;
5734
5795
  break;
5735
5796
  }
5736
5797
  // maybe we can use another action, but this resets fetching of the form
5798
+ errorMessage = (_hasError$message = hasError == null ? void 0 : hasError.message) != null ? _hasError$message : 'An error occurred';
5737
5799
  listenerApi.dispatch(workspaceListActions.onErrorWorkspacePresetAction({
5738
- error: undefined
5800
+ error: {
5801
+ type: WorkspaceListErrorType.VERBATIM_ERROR,
5802
+ message: errorMessage,
5803
+ category: WorkspaceListErrorCategory.GENERIC
5804
+ }
5739
5805
  }));
5740
5806
  return _context4.abrupt("return");
5741
- case 37:
5807
+ case 38:
5742
5808
  workspaceData = getWorkspaceData(listenerApi.getState());
5743
5809
  newWorkspace = Object.assign({}, workspaceData, {
5744
5810
  id: workspaceId,
@@ -5746,9 +5812,9 @@ workspaceListListener.startListening({
5746
5812
  "abstract": data["abstract"],
5747
5813
  scope: scope
5748
5814
  });
5749
- _context4.next = 41;
5815
+ _context4.next = 42;
5750
5816
  return workspaceApi.saveWorkspacePreset(workspaceId, newWorkspace);
5751
- case 41:
5817
+ case 42:
5752
5818
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
5753
5819
  action: presetAction,
5754
5820
  workspaceId: workspaceId,
@@ -5759,7 +5825,7 @@ workspaceListListener.startListening({
5759
5825
  listenerApi.dispatch(routerActions.navigateToUrl({
5760
5826
  url: getWorkspaceRouteUrl(workspaceId)
5761
5827
  }));
5762
- case 43:
5828
+ case 44:
5763
5829
  // Reset
5764
5830
  if (presetAction === WorkspacePresetAction.RESET) {
5765
5831
  // In case we're resetting the `New workspace` preset
@@ -5782,10 +5848,10 @@ workspaceListListener.startListening({
5782
5848
  scope: scope
5783
5849
  }));
5784
5850
  }
5785
- _context4.next = 51;
5851
+ _context4.next = 52;
5786
5852
  break;
5787
- case 46:
5788
- _context4.prev = 46;
5853
+ case 47:
5854
+ _context4.prev = 47;
5789
5855
  _context4.t0 = _context4["catch"](3);
5790
5856
  message = isAxiosError$1(_context4.t0) ? getAxiosErrorMessage(_context4.t0) : _context4.t0.message;
5791
5857
  category = isAxiosAuthError(_context4.t0) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
@@ -5796,11 +5862,11 @@ workspaceListListener.startListening({
5796
5862
  message: message
5797
5863
  }
5798
5864
  }));
5799
- case 51:
5865
+ case 52:
5800
5866
  case "end":
5801
5867
  return _context4.stop();
5802
5868
  }
5803
- }, _callee4, null, [[3, 46]]);
5869
+ }, _callee4, null, [[3, 47]]);
5804
5870
  }));
5805
5871
  function effect(_x5, _x6) {
5806
5872
  return _effect3.apply(this, arguments);
@@ -5914,20 +5980,25 @@ var getFilteredViewPresetListForView = createSelector(getViewPresetsList, getVie
5914
5980
  * */
5915
5981
  var WORKSPACE_NAMESPACE = 'workspace';
5916
5982
  var initWorkspaceTestI18n = function initWorkspaceTestI18n() {
5917
- var _en, _fi, _no, _nl;
5918
- void i18n.use(initReactI18next).init({
5919
- lng: 'en',
5983
+ safelyInitI18nForTestsAndStories(i18n, WORKSPACE_NAMESPACE, [{
5920
5984
  ns: WORKSPACE_NAMESPACE,
5921
- interpolation: {
5922
- escapeValue: false
5923
- },
5924
- resources: {
5925
- en: (_en = {}, _en[WORKSPACE_NAMESPACE] = workspaceTranslations.en, _en[SHARED_NAMESPACE] = sharedTranslations.en, _en[CORE_NAMESPACE] = coreTranslations.en, _en[WEBMAP_REACT_NAMESPACE] = webmapReactTranslations.en, _en[FORM_FIELDS_NAMESPACE] = formFieldsTranslations.en, _en[WARN_NAMESPACE] = warningsTranslations.en, _en),
5926
- fi: (_fi = {}, _fi[WORKSPACE_NAMESPACE] = workspaceTranslations.fi, _fi[SHARED_NAMESPACE] = sharedTranslations.fi, _fi[CORE_NAMESPACE] = coreTranslations.fi, _fi[WEBMAP_REACT_NAMESPACE] = webmapReactTranslations.fi, _fi[FORM_FIELDS_NAMESPACE] = formFieldsTranslations.fi, _fi[WARN_NAMESPACE] = warningsTranslations.fi, _fi),
5927
- no: (_no = {}, _no[WORKSPACE_NAMESPACE] = workspaceTranslations.no, _no[SHARED_NAMESPACE] = sharedTranslations.no, _no[CORE_NAMESPACE] = coreTranslations.no, _no[WEBMAP_REACT_NAMESPACE] = webmapReactTranslations.no, _no[FORM_FIELDS_NAMESPACE] = formFieldsTranslations.no, _no[WARN_NAMESPACE] = warningsTranslations.no, _no),
5928
- nl: (_nl = {}, _nl[WORKSPACE_NAMESPACE] = workspaceTranslations.nl, _nl[SHARED_NAMESPACE] = sharedTranslations.nl, _nl[CORE_NAMESPACE] = coreTranslations.nl, _nl[WEBMAP_REACT_NAMESPACE] = webmapReactTranslations.nl, _nl[FORM_FIELDS_NAMESPACE] = formFieldsTranslations.nl, _nl[WARN_NAMESPACE] = warningsTranslations.nl, _nl)
5929
- }
5930
- });
5985
+ translations: workspaceTranslations
5986
+ }, {
5987
+ ns: SHARED_NAMESPACE,
5988
+ translations: sharedTranslations
5989
+ }, {
5990
+ ns: CORE_NAMESPACE,
5991
+ translations: coreTranslations
5992
+ }, {
5993
+ ns: WEBMAP_REACT_NAMESPACE,
5994
+ translations: webmapReactTranslations
5995
+ }, {
5996
+ ns: FORM_FIELDS_NAMESPACE,
5997
+ translations: formFieldsTranslations
5998
+ }, {
5999
+ ns: WARN_NAMESPACE,
6000
+ translations: warningsTranslations
6001
+ }]);
5931
6002
  };
5932
6003
  var ns = [WORKSPACE_NAMESPACE, SHARED_NAMESPACE];
5933
6004
  var useWorkspaceTranslation = function useWorkspaceTranslation() {
@@ -6108,291 +6179,112 @@ var ComponentsLookUpWrapper = function ComponentsLookUpWrapper(_ref) {
6108
6179
  }, props));
6109
6180
  };
6110
6181
 
6111
- var LinkMenuConnect = function LinkMenuConnect(_ref) {
6112
- var panelId = _ref.panelId;
6182
+ /* *
6183
+ * Licensed under the Apache License, Version 2.0 (the "License");
6184
+ * you may not use this file except in compliance with the License.
6185
+ * You may obtain a copy of the License at
6186
+ *
6187
+ * http://www.apache.org/licenses/LICENSE-2.0
6188
+ *
6189
+ * Unless required by applicable law or agreed to in writing, software
6190
+ * distributed under the License is distributed on an "AS IS" BASIS,
6191
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6192
+ * See the License for the specific language governing permissions and
6193
+ * limitations under the License.
6194
+ *
6195
+ * Copyright 2025 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6196
+ * Copyright 2025 - Finnish Meteorological Institute (FMI)
6197
+ * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
6198
+ * */
6199
+ var useFetchViewPresets = function useFetchViewPresets(panelId) {
6113
6200
  var dispatch = useDispatch();
6114
- var _useWorkspaceTranslat = useWorkspaceTranslation(),
6115
- t = _useWorkspaceTranslat.t;
6116
- var _React$useState = React__default.useState(null),
6117
- anchorEl = _React$useState[0],
6118
- setAnchorEl = _React$useState[1];
6119
- var maps = useSelector(function (store) {
6120
- return mapSelectors.getAllMapIds(store);
6121
- });
6122
- var viewsById = useSelector(getViewsById);
6123
- var selectedMapIds = useSelector(function (store) {
6124
- return genericSelectors.getLinkedMaps(store, panelId);
6201
+ var _useAuthenticationCon = useAuthenticationContext(),
6202
+ currentRole = _useAuthenticationCon.currentRole;
6203
+ var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
6204
+ var lastAdmin = usePrevious(isAdmin);
6205
+ var viewPresetListFilters = useSelector(function (store) {
6206
+ return getViewPresetListFiltersForView(store, panelId);
6125
6207
  });
6126
- var viewComponentType = useSelector(function (store) {
6127
- return getViewComponentType(store, panelId);
6208
+ var viewPresetListSearchQuery = useSelector(function (store) {
6209
+ return getViewPresetListSearchQueryForView(store, panelId);
6128
6210
  });
6129
- var handleLinkViews = function handleLinkViews(event) {
6130
- setAnchorEl(event.currentTarget);
6131
- };
6132
- var handleMenuClose = function handleMenuClose() {
6133
- setAnchorEl(null);
6134
- };
6135
- var handleMapSelect = function handleMapSelect(mapId) {
6136
- var updatedMapIds = selectedMapIds.includes(mapId) ? selectedMapIds.filter(function (id) {
6137
- return id !== mapId;
6138
- }) : [].concat(selectedMapIds, [mapId]);
6139
- dispatch(genericActions.updateLinkedMap({
6140
- panelId: panelId,
6141
- mapIds: updatedMapIds
6142
- }));
6143
- };
6211
+ var prevSearch = usePrevious(viewPresetListSearchQuery);
6212
+ var fetchViewPresets = useCallback(function (params) {
6213
+ dispatch(viewPresetActions.fetchViewPresets(params));
6214
+ }, [dispatch]);
6215
+ useEffect(function () {
6216
+ if (viewPresetListSearchQuery !== prevSearch || isAdmin !== lastAdmin || !!viewPresetListFilters) {
6217
+ var filterParams = constructFilterParams(viewPresetListFilters, viewPresetListSearchQuery);
6218
+ fetchViewPresets({
6219
+ filterParams: filterParams,
6220
+ panelId: panelId
6221
+ });
6222
+ }
6223
+ }, [fetchViewPresets, panelId, prevSearch, viewPresetListSearchQuery, viewPresetListFilters, isAdmin, lastAdmin]);
6224
+ useEffect(function () {
6225
+ if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
6226
+ // reset list filter when user changes role
6227
+ var filters = [{
6228
+ id: PresetFilterType.system,
6229
+ isSelected: true
6230
+ }, {
6231
+ id: PresetFilterType.personal,
6232
+ isSelected: !isAdmin
6233
+ }, {
6234
+ id: PresetFilterType.shared,
6235
+ isSelected: !isAdmin
6236
+ }];
6237
+ dispatch(viewPresetActions.setFilterChips({
6238
+ panelId: panelId,
6239
+ filters: filters
6240
+ }));
6241
+ }
6242
+ }, [dispatch, isAdmin, lastAdmin, panelId]);
6243
+ };
6244
+
6245
+ var ViewLoading = function ViewLoading(_ref) {
6246
+ var viewPresetId = _ref.viewPresetId;
6247
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
6248
+ t = _useWorkspaceTranslat.t;
6144
6249
  return jsxs(Fragment, {
6145
- children: [linkComponentTypesConstants.supportedComponentTypesForLinking.includes(viewComponentType) && jsx(CustomIconButton, {
6146
- onClick: handleLinkViews,
6147
- "data-testid": "icon-button",
6148
- tooltipTitle: "Link " + viewComponentType,
6250
+ children: [jsx(LinearProgress, {
6251
+ "data-testid": "loading-bar",
6252
+ color: "secondary",
6149
6253
  sx: {
6150
- marginLeft: 0.5,
6151
- marginRight: 0.5
6254
+ position: 'absolute',
6255
+ width: '100%',
6256
+ top: 0
6257
+ }
6258
+ }), jsxs(Typography, {
6259
+ sx: {
6260
+ margin: 1
6152
6261
  },
6153
- children: selectedMapIds.length > 0 ? jsx(Link, {
6154
- "data-testid": "link-icon",
6155
- style: {
6156
- fill: anchorEl ? 'white' : undefined,
6157
- backgroundColor: anchorEl ? '#186DFF' : undefined
6158
- }
6159
- }) : jsx(LinkOff, {
6160
- "data-testid": "link-off-icon",
6161
- style: {
6162
- fill: anchorEl ? 'white' : undefined,
6163
- backgroundColor: anchorEl ? '#186DFF' : undefined
6164
- }
6165
- })
6166
- }), jsxs(Menu, {
6167
- id: "map-select-menu",
6168
- "data-testid": "map-select-menu",
6169
- anchorEl: anchorEl,
6170
- open: Boolean(anchorEl),
6171
- onClose: handleMenuClose,
6172
- keepMounted: true,
6173
- children: [jsxs(Typography, {
6174
- variant: "h6",
6175
- style: {
6176
- padding: '10px 15px 0',
6177
- fontWeight: 'bold'
6178
- },
6179
- children: [t('workspace-link'), " - ", t('workspace-link-location-header')]
6180
- }), jsx(List, {
6181
- dense: true,
6182
- children: maps.map(function (mapId) {
6183
- var _viewsById$mapId;
6184
- var labelId = "checkbox-link-label-" + mapId;
6185
- return jsx(ListItem, {
6186
- onClick: function onClick() {
6187
- return handleMapSelect(mapId);
6188
- },
6189
- disablePadding: true,
6190
- dense: true,
6191
- divider: true,
6192
- children: jsxs(ListItemButton, {
6193
- role: "checkbox",
6194
- dense: true,
6195
- sx: {
6196
- margin: 0,
6197
- padding: '0 16px'
6198
- },
6199
- children: [jsx(ListItemIcon, {
6200
- children: jsx(Checkbox, {
6201
- edge: "start",
6202
- tabIndex: -1,
6203
- checked: selectedMapIds.includes(mapId),
6204
- disableRipple: true,
6205
- inputProps: {
6206
- 'aria-labelledby': labelId
6207
- }
6208
- })
6209
- }), jsx(ListItemText, {
6210
- id: labelId,
6211
- primary: (_viewsById$mapId = viewsById[mapId]) == null ? void 0 : _viewsById$mapId.title,
6212
- secondary: mapId
6213
- })]
6214
- })
6215
- }, mapId);
6216
- })
6217
- })]
6262
+ children: [t('workspace-loading'), " ", viewPresetId]
6218
6263
  })]
6219
6264
  });
6220
6265
  };
6221
-
6222
- var buttonStyle = {
6223
- marginLeft: 0.5,
6224
- marginRight: 0.5
6225
- };
6226
- var WorkspaceControls = function WorkspaceControls(_ref) {
6227
- var panelId = _ref.panelId,
6228
- createNode = _ref.createNode,
6229
- path = _ref.path,
6230
- _ref$shouldPreventClo = _ref.shouldPreventCloseView,
6231
- shouldPreventCloseView = _ref$shouldPreventClo === void 0 ? false : _ref$shouldPreventClo;
6232
- var confirmDialog = useConfirmationDialog();
6233
- var _React$useContext = React.useContext(MosaicContext),
6234
- actions = _React$useContext.mosaicActions;
6235
- var _useWorkspaceTranslat = useWorkspaceTranslation(),
6236
- t = _useWorkspaceTranslat.t;
6237
- var mosaicNode = useSelector(function (store) {
6238
- return getMosaicNode(store);
6239
- });
6240
- var _React$useState = React.useState(),
6241
- stateAfterExpand = _React$useState[0],
6242
- setStateAfterExpand = _React$useState[1];
6243
- var _React$useState2 = React.useState(mosaicNode),
6244
- stateBeforeExpand = _React$useState2[0],
6245
- setStateBeforeExpand = _React$useState2[1];
6246
- var _React$useState3 = React.useState(false),
6247
- enableUnexpand = _React$useState3[0],
6248
- setEnableUnexpand = _React$useState3[1];
6249
- React.useEffect(function () {
6250
- if (enableUnexpand) {
6251
- if (stateAfterExpand === undefined) {
6252
- setStateAfterExpand(mosaicNode);
6253
- return;
6254
- }
6255
- if (!isEqual(mosaicNode, stateAfterExpand)) {
6256
- setEnableUnexpand(false);
6257
- setStateAfterExpand(undefined);
6258
- }
6259
- }
6260
- }, [enableUnexpand, mosaicNode, stateAfterExpand]);
6261
- var onClose = /*#__PURE__*/function () {
6262
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
6263
- return _regeneratorRuntime().wrap(function _callee$(_context) {
6264
- while (1) switch (_context.prev = _context.next) {
6265
- case 0:
6266
- if (!shouldPreventCloseView) {
6267
- _context.next = 6;
6268
- break;
6269
- }
6270
- _context.next = 3;
6271
- return confirmDialog({
6272
- title: t('workspace-control-close-message-title'),
6273
- description: t('workspace-control-close-message-description'),
6274
- confirmLabel: t('workspace-control-close')
6275
- });
6276
- case 3:
6277
- actions.remove(path);
6278
- _context.next = 7;
6279
- break;
6280
- case 6:
6281
- actions.remove(path);
6282
- case 7:
6283
- case "end":
6284
- return _context.stop();
6285
- }
6286
- }, _callee);
6287
- }));
6288
- return function onClose() {
6289
- return _ref2.apply(this, arguments);
6290
- };
6291
- }();
6292
- return jsxs(Fragment, {
6293
- children: [jsx(LinkMenuConnect, {
6294
- panelId: panelId
6295
- }), jsx(CustomIconButton, {
6296
- "data-testid": "split-horizontal-btn",
6297
- sx: buttonStyle,
6298
- onClick: function onClick() {
6299
- var newNode = createNode();
6300
- var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
6301
- actions.replaceWith(path, {
6302
- direction: 'column',
6303
- first: previousNode,
6304
- second: newNode
6305
- });
6306
- },
6307
- tooltipTitle: t('workspace-control-split-horizontal'),
6308
- children: jsx(SplitVertical, {})
6309
- }), jsx(CustomIconButton, {
6310
- "data-testid": "split-vertical-btn",
6311
- sx: buttonStyle,
6312
- onClick: function onClick() {
6313
- var newNode = createNode();
6314
- var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
6315
- actions.replaceWith(path, {
6316
- direction: 'row',
6317
- first: previousNode,
6318
- second: newNode
6319
- });
6320
- },
6321
- tooltipTitle: t('workspace-control-split-vertical'),
6322
- children: jsx(SplitHorizontal, {})
6323
- }), !enableUnexpand || isString(mosaicNode) ? jsx(CustomIconButton, {
6324
- "data-testid": "expand-btn",
6325
- sx: buttonStyle,
6326
- onClick: function onClick() {
6327
- setStateBeforeExpand(mosaicNode);
6328
- setEnableUnexpand(true);
6329
- actions.expand(path, 70);
6330
- },
6331
- tooltipTitle: t('workspace-control-expand'),
6332
- children: jsx(Expand, {})
6333
- }) : jsx(CustomIconButton, {
6334
- "data-testid": "unexpand-btn",
6335
- sx: buttonStyle,
6336
- onClick: function onClick() {
6337
- var stateBeforeExpandCopy = isString(stateBeforeExpand) ? stateBeforeExpand : Object.assign({}, stateBeforeExpand);
6338
- actions.replaceWith([], stateBeforeExpandCopy);
6339
- },
6340
- tooltipTitle: t('workspace-control-unexpand'),
6341
- children: jsx(UnExpand, {})
6342
- }), jsx(CustomIconButton, {
6343
- "data-testid": "close-btn",
6344
- sx: buttonStyle,
6345
- onClick: onClose,
6346
- tooltipTitle: t('workspace-control-close'),
6347
- id: "close-window-button",
6348
- children: jsx(Close, {})
6349
- })]
6350
- });
6351
- };
6352
-
6353
- var ViewLoading = function ViewLoading(_ref) {
6354
- var viewPresetId = _ref.viewPresetId;
6355
- var _useWorkspaceTranslat = useWorkspaceTranslation(),
6356
- t = _useWorkspaceTranslat.t;
6357
- return jsxs(Fragment, {
6358
- children: [jsx(LinearProgress, {
6359
- "data-testid": "loading-bar",
6360
- color: "secondary",
6361
- sx: {
6362
- position: 'absolute',
6363
- width: '100%',
6364
- top: 0
6365
- }
6366
- }), jsxs(Typography, {
6367
- sx: {
6368
- margin: 1
6369
- },
6370
- children: [t('workspace-loading'), " ", viewPresetId]
6371
- })]
6372
- });
6373
- };
6374
- var ViewError = function ViewError(_ref2) {
6375
- var viewPresetId = _ref2.viewPresetId,
6376
- mosaicNodeId = _ref2.mosaicNodeId;
6377
- var dispatch = useDispatch();
6378
- var _useWorkspaceTranslat2 = useWorkspaceTranslation(),
6379
- t = _useWorkspaceTranslat2.t;
6380
- var fetchWorkspaceViewPreset = React.useCallback(function () {
6381
- dispatch(workspaceActions.fetchWorkspaceViewPreset({
6382
- viewPresetId: viewPresetId,
6383
- mosaicNodeId: mosaicNodeId
6384
- }));
6385
- }, [dispatch, viewPresetId, mosaicNodeId]);
6386
- return jsx(AlertBanner, {
6387
- title: t('workspace-viewpresets-fail-fetch', {
6388
- VIEWPRESET_ID: viewPresetId
6389
- }),
6390
- shouldClose: true,
6391
- actionButtonProps: {
6392
- title: t('workspace-retry'),
6393
- onClick: fetchWorkspaceViewPreset
6394
- }
6395
- });
6266
+ var ViewError = function ViewError(_ref2) {
6267
+ var viewPresetId = _ref2.viewPresetId,
6268
+ mosaicNodeId = _ref2.mosaicNodeId;
6269
+ var dispatch = useDispatch();
6270
+ var _useWorkspaceTranslat2 = useWorkspaceTranslation(),
6271
+ t = _useWorkspaceTranslat2.t;
6272
+ var fetchWorkspaceViewPreset = React.useCallback(function () {
6273
+ dispatch(workspaceActions.fetchWorkspaceViewPreset({
6274
+ viewPresetId: viewPresetId,
6275
+ mosaicNodeId: mosaicNodeId
6276
+ }));
6277
+ }, [dispatch, viewPresetId, mosaicNodeId]);
6278
+ return jsx(AlertBanner, {
6279
+ title: t('workspace-viewpresets-fail-fetch', {
6280
+ VIEWPRESET_ID: viewPresetId
6281
+ }),
6282
+ shouldClose: true,
6283
+ actionButtonProps: {
6284
+ title: t('workspace-retry'),
6285
+ onClick: fetchWorkspaceViewPreset
6286
+ }
6287
+ });
6396
6288
  };
6397
6289
  var defaultComponentsLookUp = function defaultComponentsLookUp(_ref3) {
6398
6290
  var componentType = _ref3.componentType,
@@ -6426,45 +6318,23 @@ var defaultComponentsLookUp = function defaultComponentsLookUp(_ref3) {
6426
6318
  * See the License for the specific language governing permissions and
6427
6319
  * limitations under the License.
6428
6320
  *
6429
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6430
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
6431
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
6321
+ * Copyright 2025 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6322
+ * Copyright 2025 - Finnish Meteorological Institute (FMI)
6323
+ * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
6432
6324
  * */
6433
- var getUniqueId = function getUniqueId(existingIds, count) {
6434
- if (count === void 0) {
6435
- count = 1;
6436
- }
6437
- var newId = count + "_screen";
6438
- if (existingIds.indexOf(newId) !== -1) {
6439
- return getUniqueId(existingIds, count + 1);
6440
- }
6441
- return newId;
6442
- };
6443
- var createBalancedMosaicNode = function createBalancedMosaicNode(currentNode) {
6444
- var leaves = getLeaves(currentNode);
6445
- return createBalancedTreeFromLeaves(leaves);
6325
+ var config$1 = sessionStorageProvider.getConfig();
6326
+ var presetBaseUrl$1 = (config$1 == null ? void 0 : config$1.GW_PRESET_BACKEND_URL) || '';
6327
+ var getViewPreset = function getViewPreset(viewpresetId, auth) {
6328
+ return fetch(presetBaseUrl$1 + "/viewpreset/" + viewpresetId, {
6329
+ headers: getHeaders(auth)
6330
+ }).then(handleResponse);
6446
6331
  };
6447
- var closeTimeSeriesDialogsWhenChangingPreset = function closeTimeSeriesDialogsWhenChangingPreset(componentTypes, dispatch) {
6448
- if (componentTypes) {
6449
- if (componentTypes.length > 0 && !componentTypes.some(function (componentType) {
6450
- return componentType.toLowerCase().includes('viewloading');
6451
- }) && !componentTypes.some(function (componentType) {
6452
- return componentType.toLowerCase().includes('timeseries');
6453
- })) {
6454
- dispatch(uiActions.setToggleOpenDialog({
6455
- setOpen: false,
6456
- type: uiTypes.DialogTypes.TimeSeriesManager
6457
- }));
6458
- dispatch(uiActions.setToggleOpenDialog({
6459
- setOpen: false,
6460
- type: uiTypes.DialogTypes.TimeSeriesSelect
6461
- }));
6462
- dispatch(uiActions.setToggleOpenDialog({
6463
- setOpen: false,
6464
- type: uiTypes.DialogTypes.TimeseriesInfo
6465
- }));
6466
- }
6467
- }
6332
+ var updateViewPreset = function updateViewPreset(viewpresetId, data, auth) {
6333
+ return fetch(presetBaseUrl$1 + "/viewpreset/" + viewpresetId, {
6334
+ headers: getHeaders(auth),
6335
+ method: 'PUT',
6336
+ body: JSON.stringify(data)
6337
+ }).then(handleResponse);
6468
6338
  };
6469
6339
 
6470
6340
  var WORKSPACE_SELECT_LIST_ROW_HEIGHT = 46;
@@ -6528,19 +6398,25 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6528
6398
  return _onClick(WorkspacePresetAction.DUPLICATE);
6529
6399
  }
6530
6400
  }];
6531
- (workspacePreset.scope === PresetScope.user || isAdmin) && menuItems.push({
6532
- text: t('workspace-edit'),
6533
- action: function action() {
6534
- return _onClick(WorkspacePresetAction.EDIT);
6535
- }
6536
- });
6537
- workspacePreset.scope === PresetScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username && menuItems.push({
6538
- text: workspacePreset.is_shared ? t('workspace-stop-share') : t('workspace-share'),
6539
- action: function action() {
6540
- return _onClick(WorkspacePresetAction.SHARE);
6541
- },
6542
- isDisabled: false
6543
- });
6401
+ // Show "Edit" if it's your own user-scoped preset OR you're an admin
6402
+ if (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin) {
6403
+ menuItems.push({
6404
+ text: t('workspace-edit'),
6405
+ action: function action() {
6406
+ return _onClick(WorkspacePresetAction.EDIT);
6407
+ }
6408
+ });
6409
+ }
6410
+ // Show "Share/Unshare" only if it's your own user-scoped preset
6411
+ if (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username) {
6412
+ menuItems.push({
6413
+ text: workspacePreset.is_shared ? t('workspace-stop-share') : t('workspace-share'),
6414
+ action: function action() {
6415
+ return _onClick(WorkspacePresetAction.SHARE);
6416
+ },
6417
+ isDisabled: false
6418
+ });
6419
+ }
6544
6420
  return jsx(ListItem, {
6545
6421
  disablePadding: true,
6546
6422
  sx: {
@@ -6594,19 +6470,19 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6594
6470
  margin: 0
6595
6471
  }
6596
6472
  })
6597
- }), isEditable && jsx(Grid2, {
6473
+ }), isEditable && jsx(Grid, {
6598
6474
  sx: {
6599
6475
  minWidth: 56,
6600
6476
  marginLeft: 2
6601
6477
  },
6602
- children: jsxs(Grid2, {
6478
+ children: jsxs(Grid, {
6603
6479
  children: [jsx(ToggleMenu, {
6604
6480
  buttonTestId: testIdPrefix + "-listOptionsButton",
6605
6481
  menuPosition: "right",
6606
6482
  menuItems: menuItems,
6607
6483
  menuTitle: t('workspace-options'),
6608
6484
  isDefaultOpen: isOptionsMenuOpen
6609
- }), (workspacePreset.scope === 'user' || isAdmin) && workspacePreset.id && jsx(CustomIconButton, {
6485
+ }), (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin) && workspacePreset.id && jsx(CustomIconButton, {
6610
6486
  tooltipTitle: t('workspace-delete-tooltip'),
6611
6487
  onClick: function onClick(event) {
6612
6488
  event.stopPropagation();
@@ -6651,7 +6527,7 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref) {
6651
6527
  return jsxs(Box, {
6652
6528
  "data-testid": testIdPrefix + "-selectList",
6653
6529
  sx: {
6654
- height: "calc(100% - " + DEFAULT_FILTER_HEIGHT + "px)",
6530
+ height: '100%',
6655
6531
  minHeight: MIN_HEIGHT_SCROLLABLE_LIST,
6656
6532
  overflow: 'hidden'
6657
6533
  },
@@ -6708,12 +6584,23 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6708
6584
  var dispatch = useDispatch();
6709
6585
  var _useAuthenticationCon = useAuthenticationContext(),
6710
6586
  currentRole = _useAuthenticationCon.currentRole,
6711
- isLoggedIn = _useAuthenticationCon.isLoggedIn;
6587
+ isLoggedIn = _useAuthenticationCon.isLoggedIn,
6588
+ auth = _useAuthenticationCon.auth;
6589
+ var username = (auth == null ? void 0 : auth.username) || '';
6712
6590
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
6713
6591
  var scope = !isAdmin ? 'user' : 'system';
6714
6592
  var viewPresets = useSelector(function (store) {
6715
6593
  return getFilteredViewPresetListForView(store, panelId);
6716
6594
  });
6595
+ var viewPresetListFilters = useSelector(function (store) {
6596
+ return getViewPresetListFiltersForView(store, panelId, scope);
6597
+ });
6598
+ var viewPresetListSearchQuery = useSelector(function (store) {
6599
+ return getViewPresetListSearchQueryForView(store, panelId);
6600
+ });
6601
+ var filteredPresets = React.useMemo(function () {
6602
+ return filterAndSortPresets(viewPresets, viewPresetListFilters, username);
6603
+ }, [viewPresets, viewPresetListFilters, username]);
6717
6604
  var activeViewPresetId = useSelector(function (store) {
6718
6605
  return getViewPresetActiveId(store, panelId);
6719
6606
  });
@@ -6729,12 +6616,6 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6729
6616
  var currentWarningsPreset = useSelector(function (store) {
6730
6617
  return publicWarningsSelectors.getWarningsPresetById(store, panelId);
6731
6618
  });
6732
- var viewPresetListFilters = useSelector(function (store) {
6733
- return getViewPresetListFiltersForView(store, panelId, scope);
6734
- });
6735
- var viewPresetListSearchQuery = useSelector(function (store) {
6736
- return getViewPresetListSearchQueryForView(store, panelId);
6737
- });
6738
6619
  var relatedSyncGroupIds = useSelector(function (store) {
6739
6620
  return syncGroupsSelectors.getAllTargetGroupsForSource(store, {
6740
6621
  sourceId: panelId
@@ -6811,6 +6692,26 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6811
6692
  });
6812
6693
  break;
6813
6694
  }
6695
+ case WorkspacePresetAction.SHARE:
6696
+ {
6697
+ void getViewPreset(presetId, auth).then(function (preset) {
6698
+ return void updateViewPreset(presetId, Object.assign({}, preset, {
6699
+ is_shared: !preset.is_shared
6700
+ }), auth).then(function () {
6701
+ dispatch(viewPresetActions.onSuccessViewPresetAction({
6702
+ panelId: panelId,
6703
+ viewPresetId: presetId,
6704
+ action: PresetAction.SHARE,
6705
+ title: preset.title,
6706
+ scope: scope,
6707
+ "abstract": preset["abstract"],
6708
+ is_shared: preset.is_shared
6709
+ }));
6710
+ fetchViewPresets();
6711
+ });
6712
+ });
6713
+ break;
6714
+ }
6814
6715
  case WorkspacePresetAction.DELETE_SYSTEM_PRESET:
6815
6716
  case WorkspacePresetAction.DELETE:
6816
6717
  {
@@ -6845,13 +6746,13 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6845
6746
  panelId: panelId
6846
6747
  }));
6847
6748
  }, [dispatch, panelId]);
6848
- var onClickFilterChip = function onClickFilterChip(id, shouldSelect) {
6749
+ var onClickFilterChip = function onClickFilterChip(id, selected) {
6849
6750
  if (id === 'all') {
6850
- if (shouldSelect) {
6751
+ if (selected) {
6851
6752
  setSelectAllFilterChip();
6852
6753
  }
6853
6754
  } else {
6854
- toggleSelectFilterChip(id, shouldSelect);
6755
+ toggleSelectFilterChip(id, selected);
6855
6756
  }
6856
6757
  };
6857
6758
  var isAllSelectedForFilters = viewPresetListFilters.every(function (filter) {
@@ -6882,28 +6783,66 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6882
6783
  }
6883
6784
  })), jsxs(Box, {
6884
6785
  sx: {
6786
+ display: 'flex',
6787
+ flexDirection: 'column',
6788
+ flexGrow: 1,
6789
+ minHeight: 0,
6885
6790
  padding: 1,
6886
6791
  height: '100%'
6887
6792
  },
6888
- children: [!error && jsx(Filter, {
6889
- filters: viewPresetListFilters,
6890
- onClickFilterChip: onClickFilterChip,
6891
- isAllSelected: isAllSelectedForFilters,
6892
- searchQuery: viewPresetListSearchQuery,
6893
- onSearch: onSearchFilter
6894
- }), jsx(WorkspaceSelectList, {
6895
- workspacePresets: viewPresets,
6896
- currentSelectedId: activeViewPresetId || undefined,
6897
- onClickWorkspacePreset: selectViewPreset,
6898
- onClickWorkspacePresetOption: onClickViewPresetOption,
6899
- newPreset: Object.assign({}, getEmptyWorkspaceListItem(t), {
6900
- title: t('workspace-mappreset-new')
6901
- }),
6902
- hideNewWorkspace: shouldHideNewWorkspace,
6903
- searchQuery: viewPresetListSearchQuery,
6904
- testIdPrefix: "viewpreset",
6905
- isAdmin: isAdmin,
6906
- isEditable: isLoggedIn
6793
+ children: [!error && jsxs(Box, {
6794
+ sx: {
6795
+ flexShrink: 0,
6796
+ display: 'flex',
6797
+ flexDirection: 'column',
6798
+ gap: 1,
6799
+ marginBottom: 1
6800
+ },
6801
+ children: [jsx(Box, {
6802
+ sx: {
6803
+ display: 'flex',
6804
+ flexWrap: 'wrap',
6805
+ gap: 1,
6806
+ width: '100%'
6807
+ },
6808
+ children: jsx(Filter, {
6809
+ filters: viewPresetListFilters,
6810
+ onClickFilterChip: onClickFilterChip,
6811
+ isAllSelected: isAllSelectedForFilters,
6812
+ searchQuery: viewPresetListSearchQuery,
6813
+ onSearch: onSearchFilter
6814
+ })
6815
+ }), jsx(Box, {
6816
+ sx: {
6817
+ display: 'flex',
6818
+ justifyContent: 'flex-start'
6819
+ },
6820
+ children: jsx(LastUpdateTime, {
6821
+ onPressRefresh: function onPressRefresh() {
6822
+ return fetchViewPresets();
6823
+ },
6824
+ hideLabel: true
6825
+ })
6826
+ })]
6827
+ }), jsx(Box, {
6828
+ sx: {
6829
+ flexGrow: 1,
6830
+ minHeight: 0
6831
+ },
6832
+ children: jsx(WorkspaceSelectList, {
6833
+ workspacePresets: filteredPresets,
6834
+ currentSelectedId: activeViewPresetId || undefined,
6835
+ onClickWorkspacePreset: selectViewPreset,
6836
+ onClickWorkspacePresetOption: onClickViewPresetOption,
6837
+ newPreset: Object.assign({}, getEmptyWorkspaceListItem(t), {
6838
+ title: t('workspace-mappreset-new')
6839
+ }),
6840
+ hideNewWorkspace: shouldHideNewWorkspace,
6841
+ searchQuery: viewPresetListSearchQuery,
6842
+ testIdPrefix: "viewpreset",
6843
+ isAdmin: isAdmin,
6844
+ isEditable: isLoggedIn
6845
+ })
6907
6846
  })]
6908
6847
  })]
6909
6848
  });
@@ -7246,118 +7185,372 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
7246
7185
  initialProps: constructInitialProps(),
7247
7186
  "abstract": presetAbstract
7248
7187
  }
7249
- });
7250
- }, [activeViewPresetId, constructInitialProps, openViewPresetsDialog, panelId, t, title, presetAbstract]);
7251
- var onReset = React.useCallback(function () {
7252
- openViewPresetsDialog({
7253
- title: t('workspace-reset-title'),
7254
- action: PresetAction.RESET,
7255
- viewPresetId: activeViewPresetId,
7256
- panelId: panelId,
7257
- formValues: {
7258
- title: title
7188
+ });
7189
+ }, [activeViewPresetId, constructInitialProps, openViewPresetsDialog, panelId, t, title, presetAbstract]);
7190
+ var onReset = React.useCallback(function () {
7191
+ openViewPresetsDialog({
7192
+ title: t('workspace-reset-title'),
7193
+ action: PresetAction.RESET,
7194
+ viewPresetId: activeViewPresetId,
7195
+ panelId: panelId,
7196
+ formValues: {
7197
+ title: title
7198
+ }
7199
+ });
7200
+ }, [activeViewPresetId, openViewPresetsDialog, panelId, t, title]);
7201
+ var toggleViewPresetDialog = React.useCallback(function (_ref3) {
7202
+ var panelId = _ref3.panelId,
7203
+ isViewPresetDialogOpen = _ref3.isViewPresetDialogOpen;
7204
+ dispatch(viewPresetActions.toggleViewPresetListDialog({
7205
+ panelId: panelId,
7206
+ isViewPresetListDialogOpen: isViewPresetDialogOpen
7207
+ }));
7208
+ }, [dispatch]);
7209
+ var onClickOpenViewPreset = React.useCallback(function () {
7210
+ toggleViewPresetDialog({
7211
+ panelId: panelId,
7212
+ isViewPresetDialogOpen: !isViewPresetDialogOpen
7213
+ });
7214
+ }, [isViewPresetDialogOpen, panelId, toggleViewPresetDialog]);
7215
+ var style = React.useMemo(function () {
7216
+ return customIconStyles(theme, isViewPresetDialogOpen);
7217
+ }, [isViewPresetDialogOpen, theme]);
7218
+ var presetIcon = React.useMemo(function () {
7219
+ return jsx(Preset, {});
7220
+ }, []);
7221
+ renderCounter.count(WorkspaceViewTitleConnectNoMemo.name);
7222
+ var currentViewScope = viewScope || 'system';
7223
+ var isEnabled = (currentViewScope === 'user' || isAdmin && currentViewScope === 'system') && activeViewPresetId !== '' && isLoggedIn;
7224
+ return jsxs(Fragment, {
7225
+ children: [jsx(CustomIconButton, {
7226
+ "data-testid": "open-viewpresets",
7227
+ sx: style,
7228
+ variant: "tool",
7229
+ onClick: onClickOpenViewPreset,
7230
+ tooltipTitle: t('workspace-viewpreset-menu'),
7231
+ isSelected: isViewPresetDialogOpen,
7232
+ children: presetIcon
7233
+ }), jsx(WorkspaceOptions, {
7234
+ panelId: panelId,
7235
+ title: fullTitle,
7236
+ hasChanges: hasViewPresetChanges || isNewActive,
7237
+ handleSave: isEnabled ? onSave : undefined,
7238
+ handleDelete: isEnabled ? onDelete : undefined,
7239
+ handleSaveAs: isLoggedIn ? onSaveAs : undefined,
7240
+ handleEdit: isEnabled ? onEdit : undefined,
7241
+ handleReset: onReset,
7242
+ id: viewPresetOptionId,
7243
+ isAdmin: isAdmin
7244
+ }), jsx(LoadingIndicatorConnect, {
7245
+ panelId: panelId
7246
+ })]
7247
+ });
7248
+ };
7249
+ var WorkspaceViewTitleConnect = /*#__PURE__*/React.memo(WorkspaceViewTitleConnectNoMemo);
7250
+
7251
+ /* *
7252
+ * Licensed under the Apache License, Version 2.0 (the "License");
7253
+ * you may not use this file except in compliance with the License.
7254
+ * You may obtain a copy of the License at
7255
+ *
7256
+ * http://www.apache.org/licenses/LICENSE-2.0
7257
+ *
7258
+ * Unless required by applicable law or agreed to in writing, software
7259
+ * distributed under the License is distributed on an "AS IS" BASIS,
7260
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7261
+ * See the License for the specific language governing permissions and
7262
+ * limitations under the License.
7263
+ *
7264
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
7265
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
7266
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
7267
+ * */
7268
+ var getUniqueId = function getUniqueId(existingIds, count) {
7269
+ if (count === void 0) {
7270
+ count = 1;
7271
+ }
7272
+ var newId = count + "_screen";
7273
+ if (existingIds.indexOf(newId) !== -1) {
7274
+ return getUniqueId(existingIds, count + 1);
7275
+ }
7276
+ return newId;
7277
+ };
7278
+ var createBalancedMosaicNode = function createBalancedMosaicNode(currentNode) {
7279
+ var leaves = getLeaves(currentNode);
7280
+ return createBalancedTreeFromLeaves(leaves);
7281
+ };
7282
+ var closeTimeSeriesDialogsWhenChangingPreset = function closeTimeSeriesDialogsWhenChangingPreset(componentTypes, dispatch) {
7283
+ if (componentTypes) {
7284
+ if (componentTypes.length > 0 && !componentTypes.some(function (componentType) {
7285
+ return componentType.toLowerCase().includes('viewloading');
7286
+ }) && !componentTypes.some(function (componentType) {
7287
+ return componentType.toLowerCase().includes('timeseries');
7288
+ })) {
7289
+ dispatch(uiActions.setToggleOpenDialog({
7290
+ setOpen: false,
7291
+ type: uiTypes.DialogTypes.TimeSeriesManager
7292
+ }));
7293
+ dispatch(uiActions.setToggleOpenDialog({
7294
+ setOpen: false,
7295
+ type: uiTypes.DialogTypes.TimeSeriesSelect
7296
+ }));
7297
+ dispatch(uiActions.setToggleOpenDialog({
7298
+ setOpen: false,
7299
+ type: uiTypes.DialogTypes.TimeseriesInfo
7300
+ }));
7301
+ }
7302
+ }
7303
+ };
7304
+
7305
+ var LinkMenuConnect = function LinkMenuConnect(_ref) {
7306
+ var panelId = _ref.panelId;
7307
+ var dispatch = useDispatch();
7308
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
7309
+ t = _useWorkspaceTranslat.t;
7310
+ var _React$useState = React__default.useState(null),
7311
+ anchorEl = _React$useState[0],
7312
+ setAnchorEl = _React$useState[1];
7313
+ var maps = useSelector(function (store) {
7314
+ return mapSelectors.getAllMapIds(store);
7315
+ });
7316
+ var viewsById = useSelector(getViewsById);
7317
+ var selectedMapIds = useSelector(function (store) {
7318
+ return genericSelectors.getLinkedMaps(store, panelId);
7319
+ });
7320
+ var viewComponentType = useSelector(function (store) {
7321
+ return getViewComponentType(store, panelId);
7322
+ });
7323
+ var handleLinkViews = function handleLinkViews(event) {
7324
+ setAnchorEl(event.currentTarget);
7325
+ };
7326
+ var handleMenuClose = function handleMenuClose() {
7327
+ setAnchorEl(null);
7328
+ };
7329
+ var handleMapSelect = function handleMapSelect(mapId) {
7330
+ var updatedMapIds = selectedMapIds.includes(mapId) ? selectedMapIds.filter(function (id) {
7331
+ return id !== mapId;
7332
+ }) : [].concat(selectedMapIds, [mapId]);
7333
+ dispatch(genericActions.updateLinkedMap({
7334
+ panelId: panelId,
7335
+ mapIds: updatedMapIds
7336
+ }));
7337
+ };
7338
+ return jsxs(Fragment, {
7339
+ children: [linkComponentTypesConstants.supportedComponentTypesForLinking.includes(viewComponentType) && jsx(CustomIconButton, {
7340
+ onClick: handleLinkViews,
7341
+ "data-testid": "icon-button",
7342
+ tooltipTitle: "Link " + viewComponentType,
7343
+ sx: {
7344
+ marginLeft: 0.5,
7345
+ marginRight: 0.5
7346
+ },
7347
+ children: selectedMapIds.length > 0 ? jsx(Link, {
7348
+ "data-testid": "link-icon",
7349
+ style: {
7350
+ fill: anchorEl ? 'white' : undefined,
7351
+ backgroundColor: anchorEl ? '#186DFF' : undefined
7352
+ }
7353
+ }) : jsx(LinkOff, {
7354
+ "data-testid": "link-off-icon",
7355
+ style: {
7356
+ fill: anchorEl ? 'white' : undefined,
7357
+ backgroundColor: anchorEl ? '#186DFF' : undefined
7358
+ }
7359
+ })
7360
+ }), jsxs(Menu, {
7361
+ id: "map-select-menu",
7362
+ "data-testid": "map-select-menu",
7363
+ anchorEl: anchorEl,
7364
+ open: Boolean(anchorEl),
7365
+ onClose: handleMenuClose,
7366
+ keepMounted: true,
7367
+ children: [jsxs(Typography, {
7368
+ variant: "h6",
7369
+ style: {
7370
+ padding: '10px 15px 0',
7371
+ fontWeight: 'bold'
7372
+ },
7373
+ children: [t('workspace-link'), " - ", t('workspace-link-location-header')]
7374
+ }), jsx(List, {
7375
+ dense: true,
7376
+ children: maps.map(function (mapId) {
7377
+ var _viewsById$mapId;
7378
+ var labelId = "checkbox-link-label-" + mapId;
7379
+ return jsx(ListItem, {
7380
+ onClick: function onClick() {
7381
+ return handleMapSelect(mapId);
7382
+ },
7383
+ disablePadding: true,
7384
+ dense: true,
7385
+ divider: true,
7386
+ children: jsxs(ListItemButton, {
7387
+ role: "checkbox",
7388
+ dense: true,
7389
+ sx: {
7390
+ margin: 0,
7391
+ padding: '0 16px'
7392
+ },
7393
+ children: [jsx(ListItemIcon, {
7394
+ children: jsx(Checkbox, {
7395
+ edge: "start",
7396
+ tabIndex: -1,
7397
+ checked: selectedMapIds.includes(mapId),
7398
+ disableRipple: true,
7399
+ inputProps: {
7400
+ 'aria-labelledby': labelId
7401
+ }
7402
+ })
7403
+ }), jsx(ListItemText, {
7404
+ id: labelId,
7405
+ primary: (_viewsById$mapId = viewsById[mapId]) == null ? void 0 : _viewsById$mapId.title,
7406
+ secondary: mapId
7407
+ })]
7408
+ })
7409
+ }, mapId);
7410
+ })
7411
+ })]
7412
+ })]
7413
+ });
7414
+ };
7415
+
7416
+ var buttonStyle = {
7417
+ marginLeft: 0.5,
7418
+ marginRight: 0.5
7419
+ };
7420
+ var WorkspaceControls = function WorkspaceControls(_ref) {
7421
+ var panelId = _ref.panelId,
7422
+ createNode = _ref.createNode,
7423
+ path = _ref.path,
7424
+ _ref$shouldPreventClo = _ref.shouldPreventCloseView,
7425
+ shouldPreventCloseView = _ref$shouldPreventClo === void 0 ? false : _ref$shouldPreventClo;
7426
+ var confirmDialog = useConfirmationDialog();
7427
+ var _React$useContext = React.useContext(MosaicContext),
7428
+ actions = _React$useContext.mosaicActions;
7429
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
7430
+ t = _useWorkspaceTranslat.t;
7431
+ var mosaicNode = useSelector(function (store) {
7432
+ return getMosaicNode(store);
7433
+ });
7434
+ var _React$useState = React.useState(),
7435
+ stateAfterExpand = _React$useState[0],
7436
+ setStateAfterExpand = _React$useState[1];
7437
+ var _React$useState2 = React.useState(mosaicNode),
7438
+ stateBeforeExpand = _React$useState2[0],
7439
+ setStateBeforeExpand = _React$useState2[1];
7440
+ var _React$useState3 = React.useState(false),
7441
+ enableUnexpand = _React$useState3[0],
7442
+ setEnableUnexpand = _React$useState3[1];
7443
+ React.useEffect(function () {
7444
+ if (enableUnexpand) {
7445
+ if (stateAfterExpand === undefined) {
7446
+ setStateAfterExpand(mosaicNode);
7447
+ return;
7448
+ }
7449
+ if (!isEqual(mosaicNode, stateAfterExpand)) {
7450
+ setEnableUnexpand(false);
7451
+ setStateAfterExpand(undefined);
7259
7452
  }
7260
- });
7261
- }, [activeViewPresetId, openViewPresetsDialog, panelId, t, title]);
7262
- var toggleViewPresetDialog = React.useCallback(function (_ref3) {
7263
- var panelId = _ref3.panelId,
7264
- isViewPresetDialogOpen = _ref3.isViewPresetDialogOpen;
7265
- dispatch(viewPresetActions.toggleViewPresetListDialog({
7266
- panelId: panelId,
7267
- isViewPresetListDialogOpen: isViewPresetDialogOpen
7453
+ }
7454
+ }, [enableUnexpand, mosaicNode, stateAfterExpand]);
7455
+ var onClose = /*#__PURE__*/function () {
7456
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
7457
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
7458
+ while (1) switch (_context.prev = _context.next) {
7459
+ case 0:
7460
+ if (!shouldPreventCloseView) {
7461
+ _context.next = 6;
7462
+ break;
7463
+ }
7464
+ _context.next = 3;
7465
+ return confirmDialog({
7466
+ title: t('workspace-control-close-message-title'),
7467
+ description: t('workspace-control-close-message-description'),
7468
+ confirmLabel: t('workspace-control-close')
7469
+ });
7470
+ case 3:
7471
+ actions.remove(path);
7472
+ _context.next = 7;
7473
+ break;
7474
+ case 6:
7475
+ actions.remove(path);
7476
+ case 7:
7477
+ case "end":
7478
+ return _context.stop();
7479
+ }
7480
+ }, _callee);
7268
7481
  }));
7269
- }, [dispatch]);
7270
- var onClickOpenViewPreset = React.useCallback(function () {
7271
- toggleViewPresetDialog({
7272
- panelId: panelId,
7273
- isViewPresetDialogOpen: !isViewPresetDialogOpen
7274
- });
7275
- }, [isViewPresetDialogOpen, panelId, toggleViewPresetDialog]);
7276
- var style = React.useMemo(function () {
7277
- return customIconStyles(theme, isViewPresetDialogOpen);
7278
- }, [isViewPresetDialogOpen, theme]);
7279
- var presetIcon = React.useMemo(function () {
7280
- return jsx(Preset, {});
7281
- }, []);
7282
- renderCounter.count(WorkspaceViewTitleConnectNoMemo.name);
7283
- var currentViewScope = viewScope || 'system';
7284
- var isEnabled = (currentViewScope === 'user' || isAdmin && currentViewScope === 'system') && activeViewPresetId !== '' && isLoggedIn;
7482
+ return function onClose() {
7483
+ return _ref2.apply(this, arguments);
7484
+ };
7485
+ }();
7285
7486
  return jsxs(Fragment, {
7286
- children: [jsx(CustomIconButton, {
7287
- "data-testid": "open-viewpresets",
7288
- sx: style,
7289
- variant: "tool",
7290
- onClick: onClickOpenViewPreset,
7291
- tooltipTitle: t('workspace-viewpreset-menu'),
7292
- isSelected: isViewPresetDialogOpen,
7293
- children: presetIcon
7294
- }), jsx(WorkspaceOptions, {
7295
- panelId: panelId,
7296
- title: fullTitle,
7297
- hasChanges: hasViewPresetChanges || isNewActive,
7298
- handleSave: isEnabled ? onSave : undefined,
7299
- handleDelete: isEnabled ? onDelete : undefined,
7300
- handleSaveAs: isLoggedIn ? onSaveAs : undefined,
7301
- handleEdit: isEnabled ? onEdit : undefined,
7302
- handleReset: onReset,
7303
- id: viewPresetOptionId,
7304
- isAdmin: isAdmin
7305
- }), jsx(LoadingIndicatorConnect, {
7487
+ children: [jsx(LinkMenuConnect, {
7306
7488
  panelId: panelId
7489
+ }), jsx(CustomIconButton, {
7490
+ "data-testid": "split-horizontal-btn",
7491
+ sx: buttonStyle,
7492
+ onClick: function onClick() {
7493
+ var newNode = createNode();
7494
+ var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
7495
+ actions.replaceWith(path, {
7496
+ direction: 'column',
7497
+ first: previousNode,
7498
+ second: newNode
7499
+ });
7500
+ },
7501
+ tooltipTitle: t('workspace-control-split-horizontal'),
7502
+ children: jsx(SplitVertical, {})
7503
+ }), jsx(CustomIconButton, {
7504
+ "data-testid": "split-vertical-btn",
7505
+ sx: buttonStyle,
7506
+ onClick: function onClick() {
7507
+ var newNode = createNode();
7508
+ var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
7509
+ actions.replaceWith(path, {
7510
+ direction: 'row',
7511
+ first: previousNode,
7512
+ second: newNode
7513
+ });
7514
+ },
7515
+ tooltipTitle: t('workspace-control-split-vertical'),
7516
+ children: jsx(SplitHorizontal, {})
7517
+ }), !enableUnexpand || isString(mosaicNode) ? jsx(CustomIconButton, {
7518
+ "data-testid": "expand-btn",
7519
+ sx: buttonStyle,
7520
+ onClick: function onClick() {
7521
+ setStateBeforeExpand(mosaicNode);
7522
+ setEnableUnexpand(true);
7523
+ actions.expand(path, 70);
7524
+ },
7525
+ tooltipTitle: t('workspace-control-expand'),
7526
+ children: jsx(Expand, {})
7527
+ }) : jsx(CustomIconButton, {
7528
+ "data-testid": "unexpand-btn",
7529
+ sx: buttonStyle,
7530
+ onClick: function onClick() {
7531
+ var stateBeforeExpandCopy = isString(stateBeforeExpand) ? stateBeforeExpand : Object.assign({}, stateBeforeExpand);
7532
+ actions.replaceWith([], stateBeforeExpandCopy);
7533
+ },
7534
+ tooltipTitle: t('workspace-control-unexpand'),
7535
+ children: jsx(UnExpand, {})
7536
+ }), jsx(CustomIconButton, {
7537
+ "data-testid": "close-btn",
7538
+ sx: buttonStyle,
7539
+ onClick: onClose,
7540
+ tooltipTitle: t('workspace-control-close'),
7541
+ id: "close-window-button",
7542
+ children: jsx(Close, {})
7307
7543
  })]
7308
7544
  });
7309
7545
  };
7310
- var WorkspaceViewTitleConnect = /*#__PURE__*/React.memo(WorkspaceViewTitleConnectNoMemo);
7311
7546
 
7312
- var FetchViewPresets = function FetchViewPresets(_ref) {
7313
- var panelId = _ref.panelId;
7314
- var dispatch = useDispatch();
7315
- var _useAuthenticationCon = useAuthenticationContext(),
7316
- currentRole = _useAuthenticationCon.currentRole;
7317
- var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
7318
- var scope = !isAdmin ? 'user' : 'system';
7319
- var lastAdmin = usePrevious(isAdmin);
7320
- var viewPresetListFilters = useSelector(function (store) {
7321
- return getViewPresetListFiltersForView(store, panelId, scope);
7322
- });
7323
- var viewPresetListSearchQuery = useSelector(function (store) {
7324
- return getViewPresetListSearchQueryForView(store, panelId);
7325
- });
7326
- var fetchViewPresets = React.useCallback(function (filterParams) {
7327
- dispatch(viewPresetActions.fetchViewPresets({
7328
- panelId: panelId,
7329
- filterParams: filterParams
7330
- }));
7331
- }, [dispatch, panelId]);
7332
- React.useEffect(function () {
7333
- var filterParams = constructFilterParams(viewPresetListFilters, viewPresetListSearchQuery);
7334
- fetchViewPresets(filterParams);
7335
- }, [fetchViewPresets, viewPresetListFilters, viewPresetListSearchQuery]);
7336
- React.useEffect(function () {
7337
- if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
7338
- // reset list filter when user changes role
7339
- var filters = [{
7340
- id: 'system',
7341
- isSelected: true
7342
- }, {
7343
- id: 'user',
7344
- isSelected: !isAdmin
7345
- }];
7346
- dispatch(viewPresetActions.setFilterChips({
7347
- panelId: panelId,
7348
- filters: filters
7349
- }));
7350
- }
7351
- // eslint-disable-next-line react-hooks/exhaustive-deps
7352
- }, [isAdmin]);
7353
- return null;
7354
- };
7355
- var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref2) {
7356
- var _ref2$mosaicNodeId = _ref2.mosaicNodeId,
7357
- mosaicNodeId = _ref2$mosaicNodeId === void 0 ? '' : _ref2$mosaicNodeId,
7358
- path = _ref2.path,
7359
- componentsLookUp = _ref2.componentsLookUp;
7547
+ var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref) {
7548
+ var _ref$mosaicNodeId = _ref.mosaicNodeId,
7549
+ mosaicNodeId = _ref$mosaicNodeId === void 0 ? '' : _ref$mosaicNodeId,
7550
+ path = _ref.path,
7551
+ componentsLookUp = _ref.componentsLookUp;
7360
7552
  var dispatch = useDispatch();
7553
+ useFetchViewPresets(mosaicNodeId);
7361
7554
  var view = useSelector(function (store) {
7362
7555
  return getViewById(store, mosaicNodeId);
7363
7556
  });
@@ -7379,23 +7572,23 @@ var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref2) {
7379
7572
  var addView = React.useCallback(function (view) {
7380
7573
  dispatch(workspaceActions.setNewWorkspaceView(view));
7381
7574
  }, [dispatch]);
7382
- var registerView = React.useCallback(function (_ref3) {
7383
- var panelId = _ref3.panelId,
7384
- mapPresetId = _ref3.mapPresetId;
7575
+ var registerView = React.useCallback(function (_ref2) {
7576
+ var panelId = _ref2.panelId,
7577
+ mapPresetId = _ref2.mapPresetId;
7385
7578
  dispatch(viewPresetActions.registerViewPreset({
7386
7579
  panelId: panelId,
7387
7580
  viewPresetId: mapPresetId
7388
7581
  }));
7389
7582
  }, [dispatch]);
7390
- var unregisterView = React.useCallback(function (_ref4) {
7391
- var panelId = _ref4.panelId;
7583
+ var unregisterView = React.useCallback(function (_ref3) {
7584
+ var panelId = _ref3.panelId;
7392
7585
  dispatch(viewPresetActions.unregisterViewPreset({
7393
7586
  panelId: panelId
7394
7587
  }));
7395
7588
  }, [dispatch]);
7396
- var toggleViewPresetDialog = React.useCallback(function (_ref5) {
7397
- var panelId = _ref5.panelId,
7398
- isViewPresetDialogOpen = _ref5.isViewPresetDialogOpen;
7589
+ var toggleViewPresetDialog = React.useCallback(function (_ref4) {
7590
+ var panelId = _ref4.panelId,
7591
+ isViewPresetDialogOpen = _ref4.isViewPresetDialogOpen;
7399
7592
  dispatch(viewPresetActions.toggleViewPresetListDialog({
7400
7593
  panelId: panelId,
7401
7594
  isViewPresetListDialogOpen: isViewPresetDialogOpen
@@ -7486,9 +7679,7 @@ var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref2) {
7486
7679
  title: errorViewPreset,
7487
7680
  shouldClose: true
7488
7681
  })
7489
- }), defaultComponentsLookupResult, genericComponentsLookupResult, jsx(FetchViewPresets, {
7490
- panelId: mosaicNodeId
7491
- }), jsx(ViewPresetMenu, {
7682
+ }), defaultComponentsLookupResult, genericComponentsLookupResult, jsx(ViewPresetMenu, {
7492
7683
  panelId: mosaicNodeId,
7493
7684
  closeMenu: function closeMenu() {
7494
7685
  toggleViewPresetDialog({
@@ -7702,7 +7893,7 @@ var WorkspaceViewConnect = function WorkspaceViewConnect(_ref) {
7702
7893
  * Copyright 2025 - Finnish Meteorological Institute (FMI)
7703
7894
  * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
7704
7895
  * */
7705
- var config = getConfig();
7896
+ var config = sessionStorageProvider.getConfig();
7706
7897
  var presetBaseUrl = (config == null ? void 0 : config.GW_PRESET_BACKEND_URL) || '';
7707
7898
  var getWorkspace = function getWorkspace(workspaceId, auth) {
7708
7899
  return fetch(presetBaseUrl + "/workspacepreset/" + workspaceId, {
@@ -7731,6 +7922,7 @@ var createWorkspace = function createWorkspace(data, auth) {
7731
7922
  };
7732
7923
 
7733
7924
  var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7925
+ var _GENERIC$AUTH$error$c;
7734
7926
  var _useAuthenticationCon = useAuthenticationContext(),
7735
7927
  currentRole = _useAuthenticationCon.currentRole,
7736
7928
  isLoggedIn = _useAuthenticationCon.isLoggedIn,
@@ -7741,7 +7933,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7741
7933
  });
7742
7934
  var selectedFilters = useSelector(getWorkspaceListFilters);
7743
7935
  var filteredPresets = React.useMemo(function () {
7744
- return filterWorkspacePresets(workspacePresets, selectedFilters, username);
7936
+ return filterAndSortPresets(workspacePresets, selectedFilters, username);
7745
7937
  }, [workspacePresets, selectedFilters, username]);
7746
7938
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
7747
7939
  var scope = !isAdmin ? 'user' : 'system';
@@ -7869,13 +8061,27 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7869
8061
  case WorkspacePresetAction.SHARE:
7870
8062
  {
7871
8063
  void getWorkspace(presetId, auth).then(function (preset) {
7872
- return void updateWorkspace(presetId, Object.assign({}, preset, {
8064
+ return updateWorkspace(presetId, Object.assign({}, preset, {
7873
8065
  is_shared: !preset.is_shared
7874
8066
  }), auth).then(function () {
8067
+ dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
8068
+ workspaceId: presetId,
8069
+ action: WorkspacePresetAction.SHARE,
8070
+ title: presetTitle,
8071
+ scope: scope,
8072
+ is_shared: preset.is_shared
8073
+ }));
7875
8074
  fetchWorkspaceList();
8075
+ })["catch"](function (error) {
8076
+ dispatch(workspaceListActions.onErrorWorkspacePresetAction({
8077
+ error: {
8078
+ message: "" + error,
8079
+ type: WorkspaceListErrorType.VERBATIM_ERROR,
8080
+ category: WorkspaceListErrorCategory.GENERIC
8081
+ }
8082
+ }));
7876
8083
  });
7877
8084
  });
7878
- // TODO
7879
8085
  break;
7880
8086
  }
7881
8087
  }
@@ -7887,8 +8093,9 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7887
8093
  return jsxs(Box, {
7888
8094
  "data-testid": "workspace-selectlist-connect",
7889
8095
  style: {
7890
- height: '100%',
7891
- width: '100%'
8096
+ display: 'flex',
8097
+ flexDirection: 'column',
8098
+ height: '100%'
7892
8099
  },
7893
8100
  tabIndex: 0,
7894
8101
  children: [isFetching && jsx(LinearProgress, {
@@ -7905,7 +8112,10 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7905
8112
  whiteSpace: 'normal'
7906
8113
  },
7907
8114
  children: jsx(AlertBanner, Object.assign({
7908
- title: t('workspace-error-fetch'),
8115
+ title: (_GENERIC$AUTH$error$c = {
8116
+ GENERIC: '',
8117
+ AUTH: t('workspace-error-auth')
8118
+ }[error.category]) != null ? _GENERIC$AUTH$error$c : t('workspace-error-fetch'),
7909
8119
  info: error.type === WorkspaceListErrorType.TRANSLATABLE_ERROR ? t(error.key, error.params) : error.message,
7910
8120
  shouldClose: true
7911
8121
  }, error.category === WorkspaceListErrorCategory.GENERIC && {
@@ -7918,24 +8128,55 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7918
8128
  }))
7919
8129
  }), jsxs(Box, {
7920
8130
  sx: {
8131
+ display: 'flex',
8132
+ flexDirection: 'column',
8133
+ height: '100%',
7921
8134
  padding: 1,
7922
- height: '100%'
8135
+ overflow: 'hidden'
7923
8136
  },
7924
- children: [!error && jsx(Filter, {
7925
- filters: workspaceListFilters,
7926
- onClickFilterChip: onClickFilterChip,
7927
- isAllSelected: isAllSelected,
7928
- searchQuery: workspaceSearchQuery,
7929
- onSearch: searchFilter
7930
- }), jsx(WorkspaceSelectList, {
7931
- workspacePresets: filteredPresets,
7932
- currentSelectedId: currentView.id || '',
7933
- onClickWorkspacePreset: onClickWorkspacePreset,
7934
- onClickWorkspacePresetOption: onClickWorkspacePresetOption,
7935
- hideNewWorkspace: shouldHideNewWorkspace,
7936
- isEditable: isLoggedIn,
7937
- isAdmin: isAdmin,
7938
- searchQuery: workspaceSearchQuery
8137
+ children: [!error && jsxs(Box, {
8138
+ sx: {
8139
+ marginBottom: 1
8140
+ },
8141
+ children: [jsx(Box, {
8142
+ sx: {
8143
+ display: 'flex',
8144
+ width: '100%'
8145
+ },
8146
+ children: jsx(Filter, {
8147
+ filters: workspaceListFilters,
8148
+ onClickFilterChip: onClickFilterChip,
8149
+ isAllSelected: isAllSelected,
8150
+ searchQuery: workspaceSearchQuery,
8151
+ onSearch: searchFilter
8152
+ })
8153
+ }), jsx(Box, {
8154
+ sx: {
8155
+ display: 'flex',
8156
+ justifyContent: 'flex-start'
8157
+ },
8158
+ children: jsx(LastUpdateTime, {
8159
+ onPressRefresh: function onPressRefresh() {
8160
+ return fetchWorkspaceList();
8161
+ },
8162
+ hideLabel: true
8163
+ })
8164
+ })]
8165
+ }), jsx(Box, {
8166
+ sx: {
8167
+ flexGrow: 1,
8168
+ minHeight: 0
8169
+ },
8170
+ children: jsx(WorkspaceSelectList, {
8171
+ workspacePresets: filteredPresets,
8172
+ currentSelectedId: currentView.id || '',
8173
+ onClickWorkspacePreset: onClickWorkspacePreset,
8174
+ onClickWorkspacePresetOption: onClickWorkspacePresetOption,
8175
+ hideNewWorkspace: shouldHideNewWorkspace,
8176
+ isEditable: isLoggedIn,
8177
+ isAdmin: isAdmin,
8178
+ searchQuery: workspaceSearchQuery
8179
+ })
7939
8180
  })]
7940
8181
  })]
7941
8182
  });
@@ -8070,13 +8311,13 @@ var useFetchWorkspacePresets = function useFetchWorkspacePresets() {
8070
8311
  if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
8071
8312
  // reset list filter when user changes role
8072
8313
  var filters = [{
8073
- id: 'system',
8314
+ id: PresetFilterType.system,
8074
8315
  isSelected: true
8075
8316
  }, {
8076
- id: 'personal',
8317
+ id: PresetFilterType.personal,
8077
8318
  isSelected: !isAdmin
8078
8319
  }, {
8079
- id: 'shared',
8320
+ id: PresetFilterType.shared,
8080
8321
  isSelected: !isAdmin
8081
8322
  }];
8082
8323
  dispatch(workspaceListActions.setFilterChips(filters));
@@ -8424,7 +8665,7 @@ var validateTitle$1 = function validateTitle(value) {
8424
8665
  return !value.trim().length ? 'This field is required' : true;
8425
8666
  };
8426
8667
  var emptyWorkspacePreset = {
8427
- scope: 'user',
8668
+ scope: SystemScope.user,
8428
8669
  title: '',
8429
8670
  "abstract": ''
8430
8671
  };