@opengeoweb/workspace 12.1.2 → 12.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.esm.js CHANGED
@@ -1,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';
2
+ import { syncGroupsTypes, syncGroupsActions, layerActions, mapActions, uiActions, genericActions, layerTypes, mapEnums, selectorMemoizationOptions, genericSelectors, mapSelectors, syncGroupsSelectors, routerActions, createViewObjectForNewMap, mapListener, serviceListener, layersListener, syncGroupsListener, openlayersListener, uiReducer, loadingIndicatorReducer, syncGroupsReducer, layerReducer, serviceReducer, mapReducer, loadingIndicatorSelectors, uiTypes, linkComponentTypesConstants, uiSelectors } from '@opengeoweb/store';
3
3
  import { createApiInstance, createNonAuthApiInstance, getApi, createFakeApiInstance, ApiProvider, 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';
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, 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, Grid2, 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",
@@ -5441,15 +5482,16 @@ viewPresetsListener.startListening({
5441
5482
  actionCreator: viewPresetActions.onSuccessViewPresetAction,
5442
5483
  effect: function () {
5443
5484
  var _effect3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(_ref7, listenerApi) {
5444
- var payload, action, viewPresetId, title, panelId, activeMapPresetId, hasChanges, viewPresetFilters, viewPresetSearchQuery;
5485
+ var payload, action, viewPresetId, title, panelId, is_shared, activeMapPresetId, hasChanges, viewPresetFilters, viewPresetSearchQuery;
5445
5486
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
5446
5487
  while (1) switch (_context5.prev = _context5.next) {
5447
5488
  case 0:
5448
5489
  payload = _ref7.payload;
5449
5490
  listenerApi.cancelActiveListeners();
5450
- action = payload.action, viewPresetId = payload.viewPresetId, title = payload.title, panelId = payload.panelId;
5491
+ action = payload.action, viewPresetId = payload.viewPresetId, title = payload.title, panelId = payload.panelId; // eslint-disable-next-line @typescript-eslint/naming-convention
5492
+ is_shared = 'is_shared' in payload ? payload.is_shared : undefined;
5451
5493
  try {
5452
- listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage(action, title)));
5494
+ listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage(action, title, is_shared)));
5453
5495
  activeMapPresetId = getViewPresetActiveId(listenerApi.getState(), panelId);
5454
5496
  hasChanges = false; // if active preset has been deleted, select the empty new preset
5455
5497
  if (action === PresetAction.DELETE && viewPresetId === activeMapPresetId) {
@@ -5481,7 +5523,7 @@ viewPresetsListener.startListening({
5481
5523
  } catch (error) {
5482
5524
  // TODO: use error handling of mapPreset https://gitlab.com/opengeoweb/opengeoweb/-/issues/3043
5483
5525
  }
5484
- case 4:
5526
+ case 5:
5485
5527
  case "end":
5486
5528
  return _context5.stop();
5487
5529
  }
@@ -5562,15 +5604,16 @@ workspaceListListener.startListening({
5562
5604
  effect: function () {
5563
5605
  var _effect2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2, listenerApi) {
5564
5606
  var _listenerApi$getOrigi;
5565
- var payload, currentWorkspaceId, action, workspaceId, title, workspaceFilters, searchQuery;
5607
+ var payload, currentWorkspaceId, action, workspaceId, title, is_shared, workspaceFilters, searchQuery;
5566
5608
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5567
5609
  while (1) switch (_context2.prev = _context2.next) {
5568
5610
  case 0:
5569
5611
  payload = _ref2.payload;
5570
5612
  listenerApi.cancelActiveListeners();
5571
5613
  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)));
5614
+ action = payload.action, workspaceId = payload.workspaceId, title = payload.title; // eslint-disable-next-line @typescript-eslint/naming-convention
5615
+ is_shared = 'is_shared' in payload ? payload.is_shared : undefined;
5616
+ listenerApi.dispatch(snackbarActions.openSnackbar(getSnackbarMessage$1(action, title, is_shared)));
5574
5617
  // if active workspace has been deleted, empty out url
5575
5618
  if ((action === WorkspacePresetAction.DELETE || action === WorkspacePresetAction.DELETE_SYSTEM_PRESET) && currentWorkspaceId && workspaceId === currentWorkspaceId) {
5576
5619
  listenerApi.dispatch(routerActions.navigateToUrl({
@@ -5587,7 +5630,7 @@ workspaceListListener.startListening({
5587
5630
  workspaceFilters = getWorkspaceListFilters(listenerApi.getState());
5588
5631
  searchQuery = getWorkspaceListSearchQuery(listenerApi.getState());
5589
5632
  listenerApi.dispatch(workspaceListActions.fetchWorkspaceList(constructFilterParams(workspaceFilters, searchQuery)));
5590
- case 10:
5633
+ case 11:
5591
5634
  case "end":
5592
5635
  return _context2.stop();
5593
5636
  }
@@ -5603,7 +5646,7 @@ workspaceListListener.startListening({
5603
5646
  actionCreator: workspaceListActions.submitFormWorkspaceActionDialogOptions,
5604
5647
  effect: function () {
5605
5648
  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;
5649
+ 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
5650
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
5608
5651
  while (1) switch (_context4.prev = _context4.next) {
5609
5652
  case 0:
@@ -5645,7 +5688,7 @@ workspaceListListener.startListening({
5645
5688
  isSaveWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET || presetAction === WorkspacePresetAction.SAVE;
5646
5689
  isSaveAsWorkspaceAction = presetAction === WorkspacePresetAction.SAVE_SYSTEM_PRESET_AS || presetAction === WorkspacePresetAction.SAVE_AS;
5647
5690
  if (!(isSaveWorkspaceAction || isSaveAsWorkspaceAction)) {
5648
- _context4.next = 43;
5691
+ _context4.next = 44;
5649
5692
  break;
5650
5693
  }
5651
5694
  hasWorkspaceAlreadyBeenSaved = getWorkspaceDialogIsSaved(listenerApi.getState());
@@ -5730,15 +5773,20 @@ workspaceListListener.startListening({
5730
5773
  return view.message;
5731
5774
  });
5732
5775
  if (!hasError) {
5733
- _context4.next = 37;
5776
+ _context4.next = 38;
5734
5777
  break;
5735
5778
  }
5736
5779
  // maybe we can use another action, but this resets fetching of the form
5780
+ errorMessage = (_hasError$message = hasError == null ? void 0 : hasError.message) != null ? _hasError$message : 'An error occurred';
5737
5781
  listenerApi.dispatch(workspaceListActions.onErrorWorkspacePresetAction({
5738
- error: undefined
5782
+ error: {
5783
+ type: WorkspaceListErrorType.VERBATIM_ERROR,
5784
+ message: errorMessage,
5785
+ category: WorkspaceListErrorCategory.GENERIC
5786
+ }
5739
5787
  }));
5740
5788
  return _context4.abrupt("return");
5741
- case 37:
5789
+ case 38:
5742
5790
  workspaceData = getWorkspaceData(listenerApi.getState());
5743
5791
  newWorkspace = Object.assign({}, workspaceData, {
5744
5792
  id: workspaceId,
@@ -5746,9 +5794,9 @@ workspaceListListener.startListening({
5746
5794
  "abstract": data["abstract"],
5747
5795
  scope: scope
5748
5796
  });
5749
- _context4.next = 41;
5797
+ _context4.next = 42;
5750
5798
  return workspaceApi.saveWorkspacePreset(workspaceId, newWorkspace);
5751
- case 41:
5799
+ case 42:
5752
5800
  listenerApi.dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
5753
5801
  action: presetAction,
5754
5802
  workspaceId: workspaceId,
@@ -5759,7 +5807,7 @@ workspaceListListener.startListening({
5759
5807
  listenerApi.dispatch(routerActions.navigateToUrl({
5760
5808
  url: getWorkspaceRouteUrl(workspaceId)
5761
5809
  }));
5762
- case 43:
5810
+ case 44:
5763
5811
  // Reset
5764
5812
  if (presetAction === WorkspacePresetAction.RESET) {
5765
5813
  // In case we're resetting the `New workspace` preset
@@ -5782,10 +5830,10 @@ workspaceListListener.startListening({
5782
5830
  scope: scope
5783
5831
  }));
5784
5832
  }
5785
- _context4.next = 51;
5833
+ _context4.next = 52;
5786
5834
  break;
5787
- case 46:
5788
- _context4.prev = 46;
5835
+ case 47:
5836
+ _context4.prev = 47;
5789
5837
  _context4.t0 = _context4["catch"](3);
5790
5838
  message = isAxiosError$1(_context4.t0) ? getAxiosErrorMessage(_context4.t0) : _context4.t0.message;
5791
5839
  category = isAxiosAuthError(_context4.t0) ? WorkspaceListErrorCategory.AUTH : WorkspaceListErrorCategory.GENERIC;
@@ -5796,11 +5844,11 @@ workspaceListListener.startListening({
5796
5844
  message: message
5797
5845
  }
5798
5846
  }));
5799
- case 51:
5847
+ case 52:
5800
5848
  case "end":
5801
5849
  return _context4.stop();
5802
5850
  }
5803
- }, _callee4, null, [[3, 46]]);
5851
+ }, _callee4, null, [[3, 47]]);
5804
5852
  }));
5805
5853
  function effect(_x5, _x6) {
5806
5854
  return _effect3.apply(this, arguments);
@@ -5914,20 +5962,25 @@ var getFilteredViewPresetListForView = createSelector(getViewPresetsList, getVie
5914
5962
  * */
5915
5963
  var WORKSPACE_NAMESPACE = 'workspace';
5916
5964
  var initWorkspaceTestI18n = function initWorkspaceTestI18n() {
5917
- var _en, _fi, _no, _nl;
5918
- void i18n.use(initReactI18next).init({
5919
- lng: 'en',
5965
+ safelyInitI18nForTestsAndStories(i18n, WORKSPACE_NAMESPACE, [{
5920
5966
  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
- });
5967
+ translations: workspaceTranslations
5968
+ }, {
5969
+ ns: SHARED_NAMESPACE,
5970
+ translations: sharedTranslations
5971
+ }, {
5972
+ ns: CORE_NAMESPACE,
5973
+ translations: coreTranslations
5974
+ }, {
5975
+ ns: WEBMAP_REACT_NAMESPACE,
5976
+ translations: webmapReactTranslations
5977
+ }, {
5978
+ ns: FORM_FIELDS_NAMESPACE,
5979
+ translations: formFieldsTranslations
5980
+ }, {
5981
+ ns: WARN_NAMESPACE,
5982
+ translations: warningsTranslations
5983
+ }]);
5931
5984
  };
5932
5985
  var ns = [WORKSPACE_NAMESPACE, SHARED_NAMESPACE];
5933
5986
  var useWorkspaceTranslation = function useWorkspaceTranslation() {
@@ -6108,290 +6161,111 @@ var ComponentsLookUpWrapper = function ComponentsLookUpWrapper(_ref) {
6108
6161
  }, props));
6109
6162
  };
6110
6163
 
6111
- var LinkMenuConnect = function LinkMenuConnect(_ref) {
6112
- var panelId = _ref.panelId;
6164
+ /* *
6165
+ * Licensed under the Apache License, Version 2.0 (the "License");
6166
+ * you may not use this file except in compliance with the License.
6167
+ * You may obtain a copy of the License at
6168
+ *
6169
+ * http://www.apache.org/licenses/LICENSE-2.0
6170
+ *
6171
+ * Unless required by applicable law or agreed to in writing, software
6172
+ * distributed under the License is distributed on an "AS IS" BASIS,
6173
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6174
+ * See the License for the specific language governing permissions and
6175
+ * limitations under the License.
6176
+ *
6177
+ * Copyright 2025 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6178
+ * Copyright 2025 - Finnish Meteorological Institute (FMI)
6179
+ * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
6180
+ * */
6181
+ var useFetchViewPresets = function useFetchViewPresets(panelId) {
6113
6182
  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);
6183
+ var _useAuthenticationCon = useAuthenticationContext(),
6184
+ currentRole = _useAuthenticationCon.currentRole;
6185
+ var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
6186
+ var lastAdmin = usePrevious(isAdmin);
6187
+ var viewPresetListFilters = useSelector(function (store) {
6188
+ return getViewPresetListFiltersForView(store, panelId);
6125
6189
  });
6126
- var viewComponentType = useSelector(function (store) {
6127
- return getViewComponentType(store, panelId);
6190
+ var viewPresetListSearchQuery = useSelector(function (store) {
6191
+ return getViewPresetListSearchQueryForView(store, panelId);
6128
6192
  });
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
- };
6193
+ var prevSearch = usePrevious(viewPresetListSearchQuery);
6194
+ var fetchViewPresets = useCallback(function (params) {
6195
+ dispatch(viewPresetActions.fetchViewPresets(params));
6196
+ }, [dispatch]);
6197
+ useEffect(function () {
6198
+ if (viewPresetListSearchQuery !== prevSearch || isAdmin !== lastAdmin || !!viewPresetListFilters) {
6199
+ var filterParams = constructFilterParams(viewPresetListFilters, viewPresetListSearchQuery);
6200
+ fetchViewPresets({
6201
+ filterParams: filterParams,
6202
+ panelId: panelId
6203
+ });
6204
+ }
6205
+ }, [fetchViewPresets, panelId, prevSearch, viewPresetListSearchQuery, viewPresetListFilters, isAdmin, lastAdmin]);
6206
+ useEffect(function () {
6207
+ if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
6208
+ // reset list filter when user changes role
6209
+ var filters = [{
6210
+ id: PresetFilterType.system,
6211
+ isSelected: true
6212
+ }, {
6213
+ id: PresetFilterType.personal,
6214
+ isSelected: !isAdmin
6215
+ }, {
6216
+ id: PresetFilterType.shared,
6217
+ isSelected: !isAdmin
6218
+ }];
6219
+ dispatch(viewPresetActions.setFilterChips({
6220
+ panelId: panelId,
6221
+ filters: filters
6222
+ }));
6223
+ }
6224
+ }, [dispatch, isAdmin, lastAdmin, panelId]);
6225
+ };
6226
+
6227
+ var ViewLoading = function ViewLoading(_ref) {
6228
+ var viewPresetId = _ref.viewPresetId;
6229
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
6230
+ t = _useWorkspaceTranslat.t;
6144
6231
  return jsxs(Fragment, {
6145
- children: [linkComponentTypesConstants.supportedComponentTypesForLinking.includes(viewComponentType) && jsx(CustomIconButton, {
6146
- onClick: handleLinkViews,
6147
- "data-testid": "icon-button",
6148
- tooltipTitle: "Link " + viewComponentType,
6232
+ children: [jsx(LinearProgress, {
6233
+ "data-testid": "loading-bar",
6234
+ color: "secondary",
6149
6235
  sx: {
6150
- marginLeft: 0.5,
6151
- marginRight: 0.5
6236
+ position: 'absolute',
6237
+ width: '100%',
6238
+ top: 0
6239
+ }
6240
+ }), jsxs(Typography, {
6241
+ sx: {
6242
+ margin: 1
6152
6243
  },
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
- })]
6244
+ children: [t('workspace-loading'), " ", viewPresetId]
6218
6245
  })]
6219
6246
  });
6220
6247
  };
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
- }
6248
+ var ViewError = function ViewError(_ref2) {
6249
+ var viewPresetId = _ref2.viewPresetId,
6250
+ mosaicNodeId = _ref2.mosaicNodeId;
6251
+ var dispatch = useDispatch();
6252
+ var _useWorkspaceTranslat2 = useWorkspaceTranslation(),
6253
+ t = _useWorkspaceTranslat2.t;
6254
+ var fetchWorkspaceViewPreset = React.useCallback(function () {
6255
+ dispatch(workspaceActions.fetchWorkspaceViewPreset({
6256
+ viewPresetId: viewPresetId,
6257
+ mosaicNodeId: mosaicNodeId
6258
+ }));
6259
+ }, [dispatch, viewPresetId, mosaicNodeId]);
6260
+ return jsx(AlertBanner, {
6261
+ title: t('workspace-viewpresets-fail-fetch', {
6262
+ VIEWPRESET_ID: viewPresetId
6263
+ }),
6264
+ shouldClose: true,
6265
+ actionButtonProps: {
6266
+ title: t('workspace-retry'),
6267
+ onClick: fetchWorkspaceViewPreset
6268
+ }
6395
6269
  });
6396
6270
  };
6397
6271
  var defaultComponentsLookUp = function defaultComponentsLookUp(_ref3) {
@@ -6426,45 +6300,23 @@ var defaultComponentsLookUp = function defaultComponentsLookUp(_ref3) {
6426
6300
  * See the License for the specific language governing permissions and
6427
6301
  * limitations under the License.
6428
6302
  *
6429
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6430
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
6431
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
6303
+ * Copyright 2025 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6304
+ * Copyright 2025 - Finnish Meteorological Institute (FMI)
6305
+ * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
6432
6306
  * */
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);
6307
+ var config$1 = getConfig();
6308
+ var presetBaseUrl$1 = (config$1 == null ? void 0 : config$1.GW_PRESET_BACKEND_URL) || '';
6309
+ var getViewPreset = function getViewPreset(viewpresetId, auth) {
6310
+ return fetch(presetBaseUrl$1 + "/viewpreset/" + viewpresetId, {
6311
+ headers: getHeaders(auth)
6312
+ }).then(handleResponse);
6446
6313
  };
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
- }
6314
+ var updateViewPreset = function updateViewPreset(viewpresetId, data, auth) {
6315
+ return fetch(presetBaseUrl$1 + "/viewpreset/" + viewpresetId, {
6316
+ headers: getHeaders(auth),
6317
+ method: 'PUT',
6318
+ body: JSON.stringify(data)
6319
+ }).then(handleResponse);
6468
6320
  };
6469
6321
 
6470
6322
  var WORKSPACE_SELECT_LIST_ROW_HEIGHT = 46;
@@ -6528,19 +6380,25 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6528
6380
  return _onClick(WorkspacePresetAction.DUPLICATE);
6529
6381
  }
6530
6382
  }];
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
- });
6383
+ // Show "Edit" if it's your own user-scoped preset OR you're an admin
6384
+ if (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin) {
6385
+ menuItems.push({
6386
+ text: t('workspace-edit'),
6387
+ action: function action() {
6388
+ return _onClick(WorkspacePresetAction.EDIT);
6389
+ }
6390
+ });
6391
+ }
6392
+ // Show "Share/Unshare" only if it's your own user-scoped preset
6393
+ if (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username) {
6394
+ menuItems.push({
6395
+ text: workspacePreset.is_shared ? t('workspace-stop-share') : t('workspace-share'),
6396
+ action: function action() {
6397
+ return _onClick(WorkspacePresetAction.SHARE);
6398
+ },
6399
+ isDisabled: false
6400
+ });
6401
+ }
6544
6402
  return jsx(ListItem, {
6545
6403
  disablePadding: true,
6546
6404
  sx: {
@@ -6606,7 +6464,7 @@ var WorkspaceSelectListRow = function WorkspaceSelectListRow(_ref) {
6606
6464
  menuItems: menuItems,
6607
6465
  menuTitle: t('workspace-options'),
6608
6466
  isDefaultOpen: isOptionsMenuOpen
6609
- }), (workspacePreset.scope === 'user' || isAdmin) && workspacePreset.id && jsx(CustomIconButton, {
6467
+ }), (workspacePreset.scope === SystemScope.user && (auth == null ? void 0 : auth.username) === workspacePreset.username || isAdmin) && workspacePreset.id && jsx(CustomIconButton, {
6610
6468
  tooltipTitle: t('workspace-delete-tooltip'),
6611
6469
  onClick: function onClick(event) {
6612
6470
  event.stopPropagation();
@@ -6651,7 +6509,7 @@ var WorkspaceSelectList = function WorkspaceSelectList(_ref) {
6651
6509
  return jsxs(Box, {
6652
6510
  "data-testid": testIdPrefix + "-selectList",
6653
6511
  sx: {
6654
- height: "calc(100% - " + DEFAULT_FILTER_HEIGHT + "px)",
6512
+ height: '100%',
6655
6513
  minHeight: MIN_HEIGHT_SCROLLABLE_LIST,
6656
6514
  overflow: 'hidden'
6657
6515
  },
@@ -6708,12 +6566,23 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6708
6566
  var dispatch = useDispatch();
6709
6567
  var _useAuthenticationCon = useAuthenticationContext(),
6710
6568
  currentRole = _useAuthenticationCon.currentRole,
6711
- isLoggedIn = _useAuthenticationCon.isLoggedIn;
6569
+ isLoggedIn = _useAuthenticationCon.isLoggedIn,
6570
+ auth = _useAuthenticationCon.auth;
6571
+ var username = (auth == null ? void 0 : auth.username) || '';
6712
6572
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
6713
6573
  var scope = !isAdmin ? 'user' : 'system';
6714
6574
  var viewPresets = useSelector(function (store) {
6715
6575
  return getFilteredViewPresetListForView(store, panelId);
6716
6576
  });
6577
+ var viewPresetListFilters = useSelector(function (store) {
6578
+ return getViewPresetListFiltersForView(store, panelId, scope);
6579
+ });
6580
+ var viewPresetListSearchQuery = useSelector(function (store) {
6581
+ return getViewPresetListSearchQueryForView(store, panelId);
6582
+ });
6583
+ var filteredPresets = React.useMemo(function () {
6584
+ return filterAndSortPresets(viewPresets, viewPresetListFilters, username);
6585
+ }, [viewPresets, viewPresetListFilters, username]);
6717
6586
  var activeViewPresetId = useSelector(function (store) {
6718
6587
  return getViewPresetActiveId(store, panelId);
6719
6588
  });
@@ -6729,12 +6598,6 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6729
6598
  var currentWarningsPreset = useSelector(function (store) {
6730
6599
  return publicWarningsSelectors.getWarningsPresetById(store, panelId);
6731
6600
  });
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
6601
  var relatedSyncGroupIds = useSelector(function (store) {
6739
6602
  return syncGroupsSelectors.getAllTargetGroupsForSource(store, {
6740
6603
  sourceId: panelId
@@ -6811,6 +6674,26 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6811
6674
  });
6812
6675
  break;
6813
6676
  }
6677
+ case WorkspacePresetAction.SHARE:
6678
+ {
6679
+ void getViewPreset(presetId, auth).then(function (preset) {
6680
+ return void updateViewPreset(presetId, Object.assign({}, preset, {
6681
+ is_shared: !preset.is_shared
6682
+ }), auth).then(function () {
6683
+ dispatch(viewPresetActions.onSuccessViewPresetAction({
6684
+ panelId: panelId,
6685
+ viewPresetId: presetId,
6686
+ action: PresetAction.SHARE,
6687
+ title: preset.title,
6688
+ scope: scope,
6689
+ "abstract": preset["abstract"],
6690
+ is_shared: preset.is_shared
6691
+ }));
6692
+ fetchViewPresets();
6693
+ });
6694
+ });
6695
+ break;
6696
+ }
6814
6697
  case WorkspacePresetAction.DELETE_SYSTEM_PRESET:
6815
6698
  case WorkspacePresetAction.DELETE:
6816
6699
  {
@@ -6845,13 +6728,13 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6845
6728
  panelId: panelId
6846
6729
  }));
6847
6730
  }, [dispatch, panelId]);
6848
- var onClickFilterChip = function onClickFilterChip(id, shouldSelect) {
6731
+ var onClickFilterChip = function onClickFilterChip(id, selected) {
6849
6732
  if (id === 'all') {
6850
- if (shouldSelect) {
6733
+ if (selected) {
6851
6734
  setSelectAllFilterChip();
6852
6735
  }
6853
6736
  } else {
6854
- toggleSelectFilterChip(id, shouldSelect);
6737
+ toggleSelectFilterChip(id, selected);
6855
6738
  }
6856
6739
  };
6857
6740
  var isAllSelectedForFilters = viewPresetListFilters.every(function (filter) {
@@ -6882,28 +6765,66 @@ var ViewPresetMenuListConnect = function ViewPresetMenuListConnect(_ref) {
6882
6765
  }
6883
6766
  })), jsxs(Box, {
6884
6767
  sx: {
6768
+ display: 'flex',
6769
+ flexDirection: 'column',
6770
+ flexGrow: 1,
6771
+ minHeight: 0,
6885
6772
  padding: 1,
6886
6773
  height: '100%'
6887
6774
  },
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
6775
+ children: [!error && jsxs(Box, {
6776
+ sx: {
6777
+ flexShrink: 0,
6778
+ display: 'flex',
6779
+ flexDirection: 'column',
6780
+ gap: 1,
6781
+ marginBottom: 1
6782
+ },
6783
+ children: [jsx(Box, {
6784
+ sx: {
6785
+ display: 'flex',
6786
+ flexWrap: 'wrap',
6787
+ gap: 1,
6788
+ width: '100%'
6789
+ },
6790
+ children: jsx(Filter, {
6791
+ filters: viewPresetListFilters,
6792
+ onClickFilterChip: onClickFilterChip,
6793
+ isAllSelected: isAllSelectedForFilters,
6794
+ searchQuery: viewPresetListSearchQuery,
6795
+ onSearch: onSearchFilter
6796
+ })
6797
+ }), jsx(Box, {
6798
+ sx: {
6799
+ display: 'flex',
6800
+ justifyContent: 'flex-start'
6801
+ },
6802
+ children: jsx(LastUpdateTime, {
6803
+ onPressRefresh: function onPressRefresh() {
6804
+ return fetchViewPresets();
6805
+ },
6806
+ hideLabel: true
6807
+ })
6808
+ })]
6809
+ }), jsx(Box, {
6810
+ sx: {
6811
+ flexGrow: 1,
6812
+ minHeight: 0
6813
+ },
6814
+ children: jsx(WorkspaceSelectList, {
6815
+ workspacePresets: filteredPresets,
6816
+ currentSelectedId: activeViewPresetId || undefined,
6817
+ onClickWorkspacePreset: selectViewPreset,
6818
+ onClickWorkspacePresetOption: onClickViewPresetOption,
6819
+ newPreset: Object.assign({}, getEmptyWorkspaceListItem(t), {
6820
+ title: t('workspace-mappreset-new')
6821
+ }),
6822
+ hideNewWorkspace: shouldHideNewWorkspace,
6823
+ searchQuery: viewPresetListSearchQuery,
6824
+ testIdPrefix: "viewpreset",
6825
+ isAdmin: isAdmin,
6826
+ isEditable: isLoggedIn
6827
+ })
6907
6828
  })]
6908
6829
  })]
6909
6830
  });
@@ -7246,118 +7167,372 @@ var WorkspaceViewTitleConnectNoMemo = function WorkspaceViewTitleConnectNoMemo(_
7246
7167
  initialProps: constructInitialProps(),
7247
7168
  "abstract": presetAbstract
7248
7169
  }
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
7170
+ });
7171
+ }, [activeViewPresetId, constructInitialProps, openViewPresetsDialog, panelId, t, title, presetAbstract]);
7172
+ var onReset = React.useCallback(function () {
7173
+ openViewPresetsDialog({
7174
+ title: t('workspace-reset-title'),
7175
+ action: PresetAction.RESET,
7176
+ viewPresetId: activeViewPresetId,
7177
+ panelId: panelId,
7178
+ formValues: {
7179
+ title: title
7180
+ }
7181
+ });
7182
+ }, [activeViewPresetId, openViewPresetsDialog, panelId, t, title]);
7183
+ var toggleViewPresetDialog = React.useCallback(function (_ref3) {
7184
+ var panelId = _ref3.panelId,
7185
+ isViewPresetDialogOpen = _ref3.isViewPresetDialogOpen;
7186
+ dispatch(viewPresetActions.toggleViewPresetListDialog({
7187
+ panelId: panelId,
7188
+ isViewPresetListDialogOpen: isViewPresetDialogOpen
7189
+ }));
7190
+ }, [dispatch]);
7191
+ var onClickOpenViewPreset = React.useCallback(function () {
7192
+ toggleViewPresetDialog({
7193
+ panelId: panelId,
7194
+ isViewPresetDialogOpen: !isViewPresetDialogOpen
7195
+ });
7196
+ }, [isViewPresetDialogOpen, panelId, toggleViewPresetDialog]);
7197
+ var style = React.useMemo(function () {
7198
+ return customIconStyles(theme, isViewPresetDialogOpen);
7199
+ }, [isViewPresetDialogOpen, theme]);
7200
+ var presetIcon = React.useMemo(function () {
7201
+ return jsx(Preset, {});
7202
+ }, []);
7203
+ renderCounter.count(WorkspaceViewTitleConnectNoMemo.name);
7204
+ var currentViewScope = viewScope || 'system';
7205
+ var isEnabled = (currentViewScope === 'user' || isAdmin && currentViewScope === 'system') && activeViewPresetId !== '' && isLoggedIn;
7206
+ return jsxs(Fragment, {
7207
+ children: [jsx(CustomIconButton, {
7208
+ "data-testid": "open-viewpresets",
7209
+ sx: style,
7210
+ variant: "tool",
7211
+ onClick: onClickOpenViewPreset,
7212
+ tooltipTitle: t('workspace-viewpreset-menu'),
7213
+ isSelected: isViewPresetDialogOpen,
7214
+ children: presetIcon
7215
+ }), jsx(WorkspaceOptions, {
7216
+ panelId: panelId,
7217
+ title: fullTitle,
7218
+ hasChanges: hasViewPresetChanges || isNewActive,
7219
+ handleSave: isEnabled ? onSave : undefined,
7220
+ handleDelete: isEnabled ? onDelete : undefined,
7221
+ handleSaveAs: isLoggedIn ? onSaveAs : undefined,
7222
+ handleEdit: isEnabled ? onEdit : undefined,
7223
+ handleReset: onReset,
7224
+ id: viewPresetOptionId,
7225
+ isAdmin: isAdmin
7226
+ }), jsx(LoadingIndicatorConnect, {
7227
+ panelId: panelId
7228
+ })]
7229
+ });
7230
+ };
7231
+ var WorkspaceViewTitleConnect = /*#__PURE__*/React.memo(WorkspaceViewTitleConnectNoMemo);
7232
+
7233
+ /* *
7234
+ * Licensed under the Apache License, Version 2.0 (the "License");
7235
+ * you may not use this file except in compliance with the License.
7236
+ * You may obtain a copy of the License at
7237
+ *
7238
+ * http://www.apache.org/licenses/LICENSE-2.0
7239
+ *
7240
+ * Unless required by applicable law or agreed to in writing, software
7241
+ * distributed under the License is distributed on an "AS IS" BASIS,
7242
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7243
+ * See the License for the specific language governing permissions and
7244
+ * limitations under the License.
7245
+ *
7246
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
7247
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
7248
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
7249
+ * */
7250
+ var getUniqueId = function getUniqueId(existingIds, count) {
7251
+ if (count === void 0) {
7252
+ count = 1;
7253
+ }
7254
+ var newId = count + "_screen";
7255
+ if (existingIds.indexOf(newId) !== -1) {
7256
+ return getUniqueId(existingIds, count + 1);
7257
+ }
7258
+ return newId;
7259
+ };
7260
+ var createBalancedMosaicNode = function createBalancedMosaicNode(currentNode) {
7261
+ var leaves = getLeaves(currentNode);
7262
+ return createBalancedTreeFromLeaves(leaves);
7263
+ };
7264
+ var closeTimeSeriesDialogsWhenChangingPreset = function closeTimeSeriesDialogsWhenChangingPreset(componentTypes, dispatch) {
7265
+ if (componentTypes) {
7266
+ if (componentTypes.length > 0 && !componentTypes.some(function (componentType) {
7267
+ return componentType.toLowerCase().includes('viewloading');
7268
+ }) && !componentTypes.some(function (componentType) {
7269
+ return componentType.toLowerCase().includes('timeseries');
7270
+ })) {
7271
+ dispatch(uiActions.setToggleOpenDialog({
7272
+ setOpen: false,
7273
+ type: uiTypes.DialogTypes.TimeSeriesManager
7274
+ }));
7275
+ dispatch(uiActions.setToggleOpenDialog({
7276
+ setOpen: false,
7277
+ type: uiTypes.DialogTypes.TimeSeriesSelect
7278
+ }));
7279
+ dispatch(uiActions.setToggleOpenDialog({
7280
+ setOpen: false,
7281
+ type: uiTypes.DialogTypes.TimeseriesInfo
7282
+ }));
7283
+ }
7284
+ }
7285
+ };
7286
+
7287
+ var LinkMenuConnect = function LinkMenuConnect(_ref) {
7288
+ var panelId = _ref.panelId;
7289
+ var dispatch = useDispatch();
7290
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
7291
+ t = _useWorkspaceTranslat.t;
7292
+ var _React$useState = React__default.useState(null),
7293
+ anchorEl = _React$useState[0],
7294
+ setAnchorEl = _React$useState[1];
7295
+ var maps = useSelector(function (store) {
7296
+ return mapSelectors.getAllMapIds(store);
7297
+ });
7298
+ var viewsById = useSelector(getViewsById);
7299
+ var selectedMapIds = useSelector(function (store) {
7300
+ return genericSelectors.getLinkedMaps(store, panelId);
7301
+ });
7302
+ var viewComponentType = useSelector(function (store) {
7303
+ return getViewComponentType(store, panelId);
7304
+ });
7305
+ var handleLinkViews = function handleLinkViews(event) {
7306
+ setAnchorEl(event.currentTarget);
7307
+ };
7308
+ var handleMenuClose = function handleMenuClose() {
7309
+ setAnchorEl(null);
7310
+ };
7311
+ var handleMapSelect = function handleMapSelect(mapId) {
7312
+ var updatedMapIds = selectedMapIds.includes(mapId) ? selectedMapIds.filter(function (id) {
7313
+ return id !== mapId;
7314
+ }) : [].concat(selectedMapIds, [mapId]);
7315
+ dispatch(genericActions.updateLinkedMap({
7316
+ panelId: panelId,
7317
+ mapIds: updatedMapIds
7318
+ }));
7319
+ };
7320
+ return jsxs(Fragment, {
7321
+ children: [linkComponentTypesConstants.supportedComponentTypesForLinking.includes(viewComponentType) && jsx(CustomIconButton, {
7322
+ onClick: handleLinkViews,
7323
+ "data-testid": "icon-button",
7324
+ tooltipTitle: "Link " + viewComponentType,
7325
+ sx: {
7326
+ marginLeft: 0.5,
7327
+ marginRight: 0.5
7328
+ },
7329
+ children: selectedMapIds.length > 0 ? jsx(Link, {
7330
+ "data-testid": "link-icon",
7331
+ style: {
7332
+ fill: anchorEl ? 'white' : undefined,
7333
+ backgroundColor: anchorEl ? '#186DFF' : undefined
7334
+ }
7335
+ }) : jsx(LinkOff, {
7336
+ "data-testid": "link-off-icon",
7337
+ style: {
7338
+ fill: anchorEl ? 'white' : undefined,
7339
+ backgroundColor: anchorEl ? '#186DFF' : undefined
7340
+ }
7341
+ })
7342
+ }), jsxs(Menu, {
7343
+ id: "map-select-menu",
7344
+ "data-testid": "map-select-menu",
7345
+ anchorEl: anchorEl,
7346
+ open: Boolean(anchorEl),
7347
+ onClose: handleMenuClose,
7348
+ keepMounted: true,
7349
+ children: [jsxs(Typography, {
7350
+ variant: "h6",
7351
+ style: {
7352
+ padding: '10px 15px 0',
7353
+ fontWeight: 'bold'
7354
+ },
7355
+ children: [t('workspace-link'), " - ", t('workspace-link-location-header')]
7356
+ }), jsx(List, {
7357
+ dense: true,
7358
+ children: maps.map(function (mapId) {
7359
+ var _viewsById$mapId;
7360
+ var labelId = "checkbox-link-label-" + mapId;
7361
+ return jsx(ListItem, {
7362
+ onClick: function onClick() {
7363
+ return handleMapSelect(mapId);
7364
+ },
7365
+ disablePadding: true,
7366
+ dense: true,
7367
+ divider: true,
7368
+ children: jsxs(ListItemButton, {
7369
+ role: "checkbox",
7370
+ dense: true,
7371
+ sx: {
7372
+ margin: 0,
7373
+ padding: '0 16px'
7374
+ },
7375
+ children: [jsx(ListItemIcon, {
7376
+ children: jsx(Checkbox, {
7377
+ edge: "start",
7378
+ tabIndex: -1,
7379
+ checked: selectedMapIds.includes(mapId),
7380
+ disableRipple: true,
7381
+ inputProps: {
7382
+ 'aria-labelledby': labelId
7383
+ }
7384
+ })
7385
+ }), jsx(ListItemText, {
7386
+ id: labelId,
7387
+ primary: (_viewsById$mapId = viewsById[mapId]) == null ? void 0 : _viewsById$mapId.title,
7388
+ secondary: mapId
7389
+ })]
7390
+ })
7391
+ }, mapId);
7392
+ })
7393
+ })]
7394
+ })]
7395
+ });
7396
+ };
7397
+
7398
+ var buttonStyle = {
7399
+ marginLeft: 0.5,
7400
+ marginRight: 0.5
7401
+ };
7402
+ var WorkspaceControls = function WorkspaceControls(_ref) {
7403
+ var panelId = _ref.panelId,
7404
+ createNode = _ref.createNode,
7405
+ path = _ref.path,
7406
+ _ref$shouldPreventClo = _ref.shouldPreventCloseView,
7407
+ shouldPreventCloseView = _ref$shouldPreventClo === void 0 ? false : _ref$shouldPreventClo;
7408
+ var confirmDialog = useConfirmationDialog();
7409
+ var _React$useContext = React.useContext(MosaicContext),
7410
+ actions = _React$useContext.mosaicActions;
7411
+ var _useWorkspaceTranslat = useWorkspaceTranslation(),
7412
+ t = _useWorkspaceTranslat.t;
7413
+ var mosaicNode = useSelector(function (store) {
7414
+ return getMosaicNode(store);
7415
+ });
7416
+ var _React$useState = React.useState(),
7417
+ stateAfterExpand = _React$useState[0],
7418
+ setStateAfterExpand = _React$useState[1];
7419
+ var _React$useState2 = React.useState(mosaicNode),
7420
+ stateBeforeExpand = _React$useState2[0],
7421
+ setStateBeforeExpand = _React$useState2[1];
7422
+ var _React$useState3 = React.useState(false),
7423
+ enableUnexpand = _React$useState3[0],
7424
+ setEnableUnexpand = _React$useState3[1];
7425
+ React.useEffect(function () {
7426
+ if (enableUnexpand) {
7427
+ if (stateAfterExpand === undefined) {
7428
+ setStateAfterExpand(mosaicNode);
7429
+ return;
7430
+ }
7431
+ if (!isEqual(mosaicNode, stateAfterExpand)) {
7432
+ setEnableUnexpand(false);
7433
+ setStateAfterExpand(undefined);
7259
7434
  }
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
7435
+ }
7436
+ }, [enableUnexpand, mosaicNode, stateAfterExpand]);
7437
+ var onClose = /*#__PURE__*/function () {
7438
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
7439
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
7440
+ while (1) switch (_context.prev = _context.next) {
7441
+ case 0:
7442
+ if (!shouldPreventCloseView) {
7443
+ _context.next = 6;
7444
+ break;
7445
+ }
7446
+ _context.next = 3;
7447
+ return confirmDialog({
7448
+ title: t('workspace-control-close-message-title'),
7449
+ description: t('workspace-control-close-message-description'),
7450
+ confirmLabel: t('workspace-control-close')
7451
+ });
7452
+ case 3:
7453
+ actions.remove(path);
7454
+ _context.next = 7;
7455
+ break;
7456
+ case 6:
7457
+ actions.remove(path);
7458
+ case 7:
7459
+ case "end":
7460
+ return _context.stop();
7461
+ }
7462
+ }, _callee);
7268
7463
  }));
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;
7464
+ return function onClose() {
7465
+ return _ref2.apply(this, arguments);
7466
+ };
7467
+ }();
7285
7468
  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, {
7469
+ children: [jsx(LinkMenuConnect, {
7306
7470
  panelId: panelId
7471
+ }), jsx(CustomIconButton, {
7472
+ "data-testid": "split-horizontal-btn",
7473
+ sx: buttonStyle,
7474
+ onClick: function onClick() {
7475
+ var newNode = createNode();
7476
+ var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
7477
+ actions.replaceWith(path, {
7478
+ direction: 'column',
7479
+ first: previousNode,
7480
+ second: newNode
7481
+ });
7482
+ },
7483
+ tooltipTitle: t('workspace-control-split-horizontal'),
7484
+ children: jsx(SplitVertical, {})
7485
+ }), jsx(CustomIconButton, {
7486
+ "data-testid": "split-vertical-btn",
7487
+ sx: buttonStyle,
7488
+ onClick: function onClick() {
7489
+ var newNode = createNode();
7490
+ var previousNode = getAndAssertNodeAtPathExists(actions.getRoot(), path);
7491
+ actions.replaceWith(path, {
7492
+ direction: 'row',
7493
+ first: previousNode,
7494
+ second: newNode
7495
+ });
7496
+ },
7497
+ tooltipTitle: t('workspace-control-split-vertical'),
7498
+ children: jsx(SplitHorizontal, {})
7499
+ }), !enableUnexpand || isString(mosaicNode) ? jsx(CustomIconButton, {
7500
+ "data-testid": "expand-btn",
7501
+ sx: buttonStyle,
7502
+ onClick: function onClick() {
7503
+ setStateBeforeExpand(mosaicNode);
7504
+ setEnableUnexpand(true);
7505
+ actions.expand(path, 70);
7506
+ },
7507
+ tooltipTitle: t('workspace-control-expand'),
7508
+ children: jsx(Expand, {})
7509
+ }) : jsx(CustomIconButton, {
7510
+ "data-testid": "unexpand-btn",
7511
+ sx: buttonStyle,
7512
+ onClick: function onClick() {
7513
+ var stateBeforeExpandCopy = isString(stateBeforeExpand) ? stateBeforeExpand : Object.assign({}, stateBeforeExpand);
7514
+ actions.replaceWith([], stateBeforeExpandCopy);
7515
+ },
7516
+ tooltipTitle: t('workspace-control-unexpand'),
7517
+ children: jsx(UnExpand, {})
7518
+ }), jsx(CustomIconButton, {
7519
+ "data-testid": "close-btn",
7520
+ sx: buttonStyle,
7521
+ onClick: onClose,
7522
+ tooltipTitle: t('workspace-control-close'),
7523
+ id: "close-window-button",
7524
+ children: jsx(Close, {})
7307
7525
  })]
7308
7526
  });
7309
7527
  };
7310
- var WorkspaceViewTitleConnect = /*#__PURE__*/React.memo(WorkspaceViewTitleConnectNoMemo);
7311
7528
 
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;
7529
+ var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref) {
7530
+ var _ref$mosaicNodeId = _ref.mosaicNodeId,
7531
+ mosaicNodeId = _ref$mosaicNodeId === void 0 ? '' : _ref$mosaicNodeId,
7532
+ path = _ref.path,
7533
+ componentsLookUp = _ref.componentsLookUp;
7360
7534
  var dispatch = useDispatch();
7535
+ useFetchViewPresets(mosaicNodeId);
7361
7536
  var view = useSelector(function (store) {
7362
7537
  return getViewById(store, mosaicNodeId);
7363
7538
  });
@@ -7379,23 +7554,23 @@ var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref2) {
7379
7554
  var addView = React.useCallback(function (view) {
7380
7555
  dispatch(workspaceActions.setNewWorkspaceView(view));
7381
7556
  }, [dispatch]);
7382
- var registerView = React.useCallback(function (_ref3) {
7383
- var panelId = _ref3.panelId,
7384
- mapPresetId = _ref3.mapPresetId;
7557
+ var registerView = React.useCallback(function (_ref2) {
7558
+ var panelId = _ref2.panelId,
7559
+ mapPresetId = _ref2.mapPresetId;
7385
7560
  dispatch(viewPresetActions.registerViewPreset({
7386
7561
  panelId: panelId,
7387
7562
  viewPresetId: mapPresetId
7388
7563
  }));
7389
7564
  }, [dispatch]);
7390
- var unregisterView = React.useCallback(function (_ref4) {
7391
- var panelId = _ref4.panelId;
7565
+ var unregisterView = React.useCallback(function (_ref3) {
7566
+ var panelId = _ref3.panelId;
7392
7567
  dispatch(viewPresetActions.unregisterViewPreset({
7393
7568
  panelId: panelId
7394
7569
  }));
7395
7570
  }, [dispatch]);
7396
- var toggleViewPresetDialog = React.useCallback(function (_ref5) {
7397
- var panelId = _ref5.panelId,
7398
- isViewPresetDialogOpen = _ref5.isViewPresetDialogOpen;
7571
+ var toggleViewPresetDialog = React.useCallback(function (_ref4) {
7572
+ var panelId = _ref4.panelId,
7573
+ isViewPresetDialogOpen = _ref4.isViewPresetDialogOpen;
7399
7574
  dispatch(viewPresetActions.toggleViewPresetListDialog({
7400
7575
  panelId: panelId,
7401
7576
  isViewPresetListDialogOpen: isViewPresetDialogOpen
@@ -7486,9 +7661,7 @@ var WorkspaceTileConnect = /*#__PURE__*/React.memo(function (_ref2) {
7486
7661
  title: errorViewPreset,
7487
7662
  shouldClose: true
7488
7663
  })
7489
- }), defaultComponentsLookupResult, genericComponentsLookupResult, jsx(FetchViewPresets, {
7490
- panelId: mosaicNodeId
7491
- }), jsx(ViewPresetMenu, {
7664
+ }), defaultComponentsLookupResult, genericComponentsLookupResult, jsx(ViewPresetMenu, {
7492
7665
  panelId: mosaicNodeId,
7493
7666
  closeMenu: function closeMenu() {
7494
7667
  toggleViewPresetDialog({
@@ -7731,6 +7904,7 @@ var createWorkspace = function createWorkspace(data, auth) {
7731
7904
  };
7732
7905
 
7733
7906
  var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7907
+ var _GENERIC$AUTH$error$c;
7734
7908
  var _useAuthenticationCon = useAuthenticationContext(),
7735
7909
  currentRole = _useAuthenticationCon.currentRole,
7736
7910
  isLoggedIn = _useAuthenticationCon.isLoggedIn,
@@ -7741,7 +7915,7 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7741
7915
  });
7742
7916
  var selectedFilters = useSelector(getWorkspaceListFilters);
7743
7917
  var filteredPresets = React.useMemo(function () {
7744
- return filterWorkspacePresets(workspacePresets, selectedFilters, username);
7918
+ return filterAndSortPresets(workspacePresets, selectedFilters, username);
7745
7919
  }, [workspacePresets, selectedFilters, username]);
7746
7920
  var isAdmin = (currentRole == null ? void 0 : currentRole.name) === GEOWEB_ROLE_PRESETS_ADMIN.name;
7747
7921
  var scope = !isAdmin ? 'user' : 'system';
@@ -7869,13 +8043,27 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7869
8043
  case WorkspacePresetAction.SHARE:
7870
8044
  {
7871
8045
  void getWorkspace(presetId, auth).then(function (preset) {
7872
- return void updateWorkspace(presetId, Object.assign({}, preset, {
8046
+ return updateWorkspace(presetId, Object.assign({}, preset, {
7873
8047
  is_shared: !preset.is_shared
7874
8048
  }), auth).then(function () {
8049
+ dispatch(workspaceListActions.onSuccessWorkspacePresetAction({
8050
+ workspaceId: presetId,
8051
+ action: WorkspacePresetAction.SHARE,
8052
+ title: presetTitle,
8053
+ scope: scope,
8054
+ is_shared: preset.is_shared
8055
+ }));
7875
8056
  fetchWorkspaceList();
8057
+ })["catch"](function (error) {
8058
+ dispatch(workspaceListActions.onErrorWorkspacePresetAction({
8059
+ error: {
8060
+ message: "" + error,
8061
+ type: WorkspaceListErrorType.VERBATIM_ERROR,
8062
+ category: WorkspaceListErrorCategory.GENERIC
8063
+ }
8064
+ }));
7876
8065
  });
7877
8066
  });
7878
- // TODO
7879
8067
  break;
7880
8068
  }
7881
8069
  }
@@ -7887,8 +8075,9 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7887
8075
  return jsxs(Box, {
7888
8076
  "data-testid": "workspace-selectlist-connect",
7889
8077
  style: {
7890
- height: '100%',
7891
- width: '100%'
8078
+ display: 'flex',
8079
+ flexDirection: 'column',
8080
+ height: '100%'
7892
8081
  },
7893
8082
  tabIndex: 0,
7894
8083
  children: [isFetching && jsx(LinearProgress, {
@@ -7905,7 +8094,10 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7905
8094
  whiteSpace: 'normal'
7906
8095
  },
7907
8096
  children: jsx(AlertBanner, Object.assign({
7908
- title: t('workspace-error-fetch'),
8097
+ title: (_GENERIC$AUTH$error$c = {
8098
+ GENERIC: '',
8099
+ AUTH: t('workspace-error-auth')
8100
+ }[error.category]) != null ? _GENERIC$AUTH$error$c : t('workspace-error-fetch'),
7909
8101
  info: error.type === WorkspaceListErrorType.TRANSLATABLE_ERROR ? t(error.key, error.params) : error.message,
7910
8102
  shouldClose: true
7911
8103
  }, error.category === WorkspaceListErrorCategory.GENERIC && {
@@ -7918,24 +8110,55 @@ var WorkspaceSelectListConnect = function WorkspaceSelectListConnect() {
7918
8110
  }))
7919
8111
  }), jsxs(Box, {
7920
8112
  sx: {
8113
+ display: 'flex',
8114
+ flexDirection: 'column',
8115
+ height: '100%',
7921
8116
  padding: 1,
7922
- height: '100%'
8117
+ overflow: 'hidden'
7923
8118
  },
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
8119
+ children: [!error && jsxs(Box, {
8120
+ sx: {
8121
+ marginBottom: 1
8122
+ },
8123
+ children: [jsx(Box, {
8124
+ sx: {
8125
+ display: 'flex',
8126
+ width: '100%'
8127
+ },
8128
+ children: jsx(Filter, {
8129
+ filters: workspaceListFilters,
8130
+ onClickFilterChip: onClickFilterChip,
8131
+ isAllSelected: isAllSelected,
8132
+ searchQuery: workspaceSearchQuery,
8133
+ onSearch: searchFilter
8134
+ })
8135
+ }), jsx(Box, {
8136
+ sx: {
8137
+ display: 'flex',
8138
+ justifyContent: 'flex-start'
8139
+ },
8140
+ children: jsx(LastUpdateTime, {
8141
+ onPressRefresh: function onPressRefresh() {
8142
+ return fetchWorkspaceList();
8143
+ },
8144
+ hideLabel: true
8145
+ })
8146
+ })]
8147
+ }), jsx(Box, {
8148
+ sx: {
8149
+ flexGrow: 1,
8150
+ minHeight: 0
8151
+ },
8152
+ children: jsx(WorkspaceSelectList, {
8153
+ workspacePresets: filteredPresets,
8154
+ currentSelectedId: currentView.id || '',
8155
+ onClickWorkspacePreset: onClickWorkspacePreset,
8156
+ onClickWorkspacePresetOption: onClickWorkspacePresetOption,
8157
+ hideNewWorkspace: shouldHideNewWorkspace,
8158
+ isEditable: isLoggedIn,
8159
+ isAdmin: isAdmin,
8160
+ searchQuery: workspaceSearchQuery
8161
+ })
7939
8162
  })]
7940
8163
  })]
7941
8164
  });
@@ -8070,13 +8293,13 @@ var useFetchWorkspacePresets = function useFetchWorkspacePresets() {
8070
8293
  if (isAdmin !== lastAdmin && lastAdmin !== undefined) {
8071
8294
  // reset list filter when user changes role
8072
8295
  var filters = [{
8073
- id: 'system',
8296
+ id: PresetFilterType.system,
8074
8297
  isSelected: true
8075
8298
  }, {
8076
- id: 'personal',
8299
+ id: PresetFilterType.personal,
8077
8300
  isSelected: !isAdmin
8078
8301
  }, {
8079
- id: 'shared',
8302
+ id: PresetFilterType.shared,
8080
8303
  isSelected: !isAdmin
8081
8304
  }];
8082
8305
  dispatch(workspaceListActions.setFilterChips(filters));
@@ -8424,7 +8647,7 @@ var validateTitle$1 = function validateTitle(value) {
8424
8647
  return !value.trim().length ? 'This field is required' : true;
8425
8648
  };
8426
8649
  var emptyWorkspacePreset = {
8427
- scope: 'user',
8650
+ scope: SystemScope.user,
8428
8651
  title: '',
8429
8652
  "abstract": ''
8430
8653
  };