@opengeoweb/warnings 9.36.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,3 +5,7 @@ This library was generated with [Nx](https://nx.dev).
5
5
  ## Running unit tests
6
6
 
7
7
  Run `nx test warnings` to execute the unit tests via [Jest](https://jestjs.io).
8
+
9
+ ### TypeScript Documentation
10
+
11
+ - [TypeScript Docs](https://opengeoweb.gitlab.io/opengeoweb/typescript-docs/warnings/)
package/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useDispatch, useSelector } from 'react-redux';
3
3
  import { Polygons, Share, ExitDomain, Edit, Delete, DrawPolygon, Visibility, Add, CoastalEvent, TemperatureLow, TemperatureHigh, Rain, Snow, Lightning, Fog, Wind, Thunderstorm, VulcanicEruption, Haze, FreezingPrecipitation, ModerateAircraftIcing, SevereAircraftIcing, ModerateTurbulence, SevereTurbulence, SandStorm, RadioactiveMaterials, breakpoints, Options, Close, ChevronDown, ChevronUp, Copy, Success, Expire, Remove, ArrowUpCompact, ArrowDownCompact } from '@opengeoweb/theme';
4
- import { uiTypes, uiActions, getSingularDrawtoolDrawLayerId, drawtoolSelectors, layerSelectors, uiSelectors, drawtoolActions, mapStoreActions, layerActions, useSetupDialog, useUpdateSharedData } from '@opengeoweb/store';
4
+ import { uiTypes, uiActions, getSingularDrawtoolDrawLayerId, drawtoolSelectors, layerSelectors, uiSelectors, drawtoolActions, mapStoreActions, layerActions, useSetupDialog, selectorMemoizationOptions, useUpdateSharedData } from '@opengeoweb/store';
5
5
  import { defaultPolygon, emptyGeoJSON, MapControlButton, getIcon, rewindGeometry, getGeoJSONPropertyValue, currentlySupportedDrawModes, defaultLayers, MapView, MapViewLayer, getFeatureExtent } from '@opengeoweb/webmap-react';
6
6
  import { SHARED_NAMESPACE, useConfirmationDialog, ToggleMenu, dateUtils, calculateStartSize, ToolContainerDraggable, AlertBanner, ConfirmationDialog, getAxiosErrorMessage, usePrevious, CustomIconButton, CustomTooltip, Avatar, getInitials, SwitchButton, CustomToggleButton, Filter, FilterChip, FilterOption, StatusTag, LastUpdateTime, ErrorBoundary, pollingIntervalTimeout, isAxiosError as isAxiosError$1 } from '@opengeoweb/shared';
7
7
  import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware, isAnyOf } from '@reduxjs/toolkit';
@@ -19,7 +19,7 @@ import { VariableSizeList } from 'react-window';
19
19
  import AutoSizer from 'react-virtualized-auto-sizer';
20
20
  import { getApi, createApiInstance, createNonAuthApiInstance, createFakeApiInstance, ApiProvider, getHeaders, useAuthQuery, useAuthenticationContext, ProductStatus } from '@opengeoweb/api';
21
21
  import { useFormContext } from 'react-hook-form';
22
- import { isEqual, cloneDeep, clamp, groupBy, pick } from 'lodash';
22
+ import { isEqual, cloneDeep, clamp, groupBy, pick, assign } from 'lodash';
23
23
  import { getConfig, useAuthenticationContext as useAuthenticationContext$1 } from '@opengeoweb/authentication';
24
24
  import { useQueryClient } from '@tanstack/react-query';
25
25
  import { isAxiosError } from 'axios';
@@ -2108,7 +2108,8 @@ var publicWarningsAdapter = createEntityAdapter({
2108
2108
  var initialState$1 = {
2109
2109
  warnings: publicWarningsAdapter.getInitialState(),
2110
2110
  isLoading: true,
2111
- lastUpdatedTime: ''
2111
+ lastUpdatedTime: '',
2112
+ filterState: {}
2112
2113
  };
2113
2114
  var slice$1 = createSlice({
2114
2115
  initialState: initialState$1,
@@ -2130,6 +2131,14 @@ var slice$1 = createSlice({
2130
2131
  var error = action.payload.error;
2131
2132
  draft.isLoading = false;
2132
2133
  draft.error = error;
2134
+ },
2135
+ setWarningFilters: function setWarningFilters(draft, action) {
2136
+ var _action$payload2 = action.payload,
2137
+ filterState = _action$payload2.filterState,
2138
+ panelId = _action$payload2.panelId;
2139
+ if (panelId) {
2140
+ draft.filterState[panelId] = filterState;
2141
+ }
2133
2142
  }
2134
2143
  }
2135
2144
  });
@@ -2204,12 +2213,14 @@ var slice = createSlice({
2204
2213
  _action$payload2$form = _action$payload2.formState,
2205
2214
  formState = _action$payload2$form === void 0 ? '' : _action$payload2$form,
2206
2215
  _action$payload2$warn = _action$payload2.warningType,
2207
- warningType = _action$payload2$warn === void 0 ? 'public' : _action$payload2$warn;
2216
+ warningType = _action$payload2$warn === void 0 ? 'public' : _action$payload2$warn,
2217
+ panelId = _action$payload2.panelId;
2208
2218
  draft.object = object;
2209
2219
  draft.publicWarning = publicWarning;
2210
2220
  draft.selectedPublicWarningId = publicWarning == null ? void 0 : publicWarning.id;
2211
2221
  draft.formState = formState;
2212
2222
  draft.warningType = warningType;
2223
+ draft.panelId = panelId;
2213
2224
  },
2214
2225
  toggleEditorWarning: function toggleEditorWarning(draft,
2215
2226
  // eslint-disable-next-line no-unused-vars
@@ -6931,204 +6942,6 @@ var warningListJSON = [
6931
6942
  }
6932
6943
  ];
6933
6944
 
6934
- var sigmetListJSON = [
6935
- {
6936
- id: "57eaf6c8-a247-11ef-ac05-12e0cc025418",
6937
- lastUpdatedTime: "2024-11-14T05:14:37",
6938
- productStatus: "DRAFT",
6939
- warningDetail: {
6940
- areas: [
6941
- {
6942
- geoJSON: {
6943
- features: [
6944
- {
6945
- geometry: {
6946
- type: "Polygon",
6947
- coordinates: [
6948
- [
6949
- [
6950
- 10,
6951
- 20
6952
- ],
6953
- [
6954
- 15,
6955
- 25
6956
- ],
6957
- [
6958
- 20,
6959
- 20
6960
- ],
6961
- [
6962
- 10,
6963
- 20
6964
- ]
6965
- ]
6966
- ]
6967
- },
6968
- properties: {
6969
- selectionType: "fir",
6970
- stroke: "#0075a9",
6971
- "stroke-width": 1.5,
6972
- "stroke-opacity": 1,
6973
- fill: "#0075a9",
6974
- "fill-opacity": 0.4
6975
- },
6976
- type: "Feature"
6977
- }
6978
- ],
6979
- type: "FeatureCollection"
6980
- },
6981
- objectName: "ENOB"
6982
- }
6983
- ],
6984
- descriptionOriginal: "",
6985
- descriptionTranslation: "",
6986
- firName: "BODOE OCEANIC FIR",
6987
- incident: "-1",
6988
- level: "SIG",
6989
- phenomenon: "EMBD_TSGR",
6990
- probability: "0",
6991
- validFrom: "2024-11-14T05:30:14Z",
6992
- validUntil: "2024-11-14T07:30:14Z"
6993
- }
6994
- },
6995
- {
6996
- id: "fc4c0002-8d32-11ef-888b-ee87a1644661",
6997
- lastUpdatedTime: "2024-11-14T05:14:06",
6998
- productStatus: "EXPIRED",
6999
- warningDetail: {
7000
- areas: [
7001
- {
7002
- geoJSON: null,
7003
- objectName: "EFIN"
7004
- }
7005
- ],
7006
- descriptionOriginal: "",
7007
- descriptionTranslation: "",
7008
- firName: "HELSINKI FIR",
7009
- incident: "T01",
7010
- level: "SIG",
7011
- phenomenon: "OBSC_TS",
7012
- probability: "0",
7013
- validFrom: "2024-11-13T05:30:14Z",
7014
- validUntil: "2024-11-13T07:30:14Z"
7015
- }
7016
- },
7017
- {
7018
- id: "fe4a14bc-8a90-11ef-9090-6c08d8abf452",
7019
- lastUpdatedTime: "2024-10-08T08:10:30",
7020
- productStatus: "PUBLISHED",
7021
- warningDetail: {
7022
- areas: [
7023
- {
7024
- geoJSON: null,
7025
- objectName: "EHAA"
7026
- }
7027
- ],
7028
- descriptionOriginal: "",
7029
- descriptionTranslation: "",
7030
- firName: "AMSTERDAM FIR",
7031
- incident: "Z01",
7032
- level: "SIG",
7033
- phenomenon: "SEV_ICE",
7034
- probability: "0",
7035
- validFrom: "2024-10-08T05:30:14Z",
7036
- validUntil: "2024-10-08T09:30:14Z"
7037
- }
7038
- }
7039
- ];
7040
-
7041
- var airmetListJSON = [
7042
- {
7043
- id: "02d3727a-b190-11ef-ba31-067f7750936d",
7044
- lastUpdatedTime: "2024-12-03T16:02:35",
7045
- productStatus: "DRAFT",
7046
- warningDetail: {
7047
- areas: [
7048
- {
7049
- geoJSON: null,
7050
- objectName: "EHAA"
7051
- }
7052
- ],
7053
- descriptionOriginal: "",
7054
- descriptionTranslation: "",
7055
- firName: "AMSTERDAM FIR",
7056
- incident: "-1",
7057
- level: "AIR",
7058
- phenomenon: "SFC_WIND",
7059
- probability: "0",
7060
- validFrom: "2024-12-03T17:00:09Z",
7061
- validUntil: "2024-12-03T21:00:09Z"
7062
- }
7063
- },
7064
- {
7065
- id: "1a868884-9076-11ef-8e82-5a063b90cdf6",
7066
- lastUpdatedTime: "2024-10-22T13:03:56",
7067
- productStatus: "DRAFT",
7068
- warningDetail: {
7069
- areas: [
7070
- {
7071
- geoJSON: null,
7072
- objectName: "EHAA"
7073
- }
7074
- ],
7075
- descriptionOriginal: "",
7076
- descriptionTranslation: "",
7077
- firName: "AMSTERDAM FIR",
7078
- incident: "-1",
7079
- level: "AIR",
7080
- phenomenon: "MOD_TURB",
7081
- probability: "0",
7082
- validFrom: "2024-10-22T15:00:09Z",
7083
- validUntil: "2024-10-22T18:00:09Z"
7084
- }
7085
- },
7086
- {
7087
- id: "4ac7fc94-c670-11ee-8ace-92491e683685",
7088
- lastUpdatedTime: "2024-02-08T12:26:31.803468",
7089
- productStatus: "EXPIRED",
7090
- warningDetail: {
7091
- areas: [
7092
- {
7093
- geoJSON: null,
7094
- objectName: "ENOR"
7095
- }
7096
- ],
7097
- descriptionOriginal: "",
7098
- descriptionTranslation: "",
7099
- firName: "POLARIS FIR",
7100
- incident: "T01",
7101
- level: "AIR",
7102
- phenomenon: "OBSC_TS",
7103
- probability: "0",
7104
- validFrom: "2024-02-08T09:00:09Z",
7105
- validUntil: "2024-02-08T11:00:09Z"
7106
- }
7107
- },
7108
- {
7109
- id: "9dbcd4c6-c4c0-11ee-a0e9-9e39e246af14",
7110
- lastUpdatedTime: "2024-02-06T07:15:18.166785",
7111
- productStatus: "PUBLISHED",
7112
- warningDetail: {
7113
- areas: [
7114
- {
7115
- geoJSON: null,
7116
- objectName: "EHAA"
7117
- }
7118
- ],
7119
- descriptionOriginal: "",
7120
- descriptionTranslation: "",
7121
- firName: "AMSTERDAM FIR",
7122
- incident: "Z01",
7123
- level: "AIR",
7124
- phenomenon: "SEV_ICE",
7125
- probability: "0",
7126
- validFrom: "2024-02-06T08:00:09Z",
7127
- validUntil: "2024-02-06T12:00:09Z"
7128
- }
7129
- }
7130
- ];
7131
-
7132
6945
  /* *
7133
6946
  * Licensed under the Apache License, Version 2.0 (the "License");
7134
6947
  * you may not use this file except in compliance with the License.
@@ -7152,8 +6965,6 @@ var warningList = warningListJSON;
7152
6965
  warningList.filter(function (warning) {
7153
6966
  return warning.status !== 'EXPIRED' && warning.status !== 'WITHDRAWN';
7154
6967
  }).length;
7155
- var sigmetList = sigmetListJSON;
7156
- var airmetList = airmetListJSON;
7157
6968
  var areaKeywordList = ['North Sea districts', 'Coastal Districts', 'KNMI Specific', 'Objects', 'Baltic areas', 'NL', 'FI', 'METNorway Specific', 'Provinces', 'FIR', 'Countries'];
7158
6969
 
7159
6970
  /* *
@@ -7254,7 +7065,7 @@ var getApiRoutes = function getApiRoutes(axiosInstance) {
7254
7065
  getWarnings: function getWarnings() {
7255
7066
  return axiosInstance.get("/warnings/").then(function () {
7256
7067
  return {
7257
- data: warningList.concat(sigmetList, airmetList)
7068
+ data: warningList
7258
7069
  };
7259
7070
  });
7260
7071
  },
@@ -8439,9 +8250,16 @@ var domainLevels = {
8439
8250
  "public": [Level.extreme, Level.moderate, Level.severe]
8440
8251
  };
8441
8252
  var defaultLevelFilter = (_defaultLevelFilter = {}, _defaultLevelFilter[emptyFilterId] = true, _defaultLevelFilter.extreme = true, _defaultLevelFilter.moderate = true, _defaultLevelFilter.severe = true, _defaultLevelFilter.AIR = true, _defaultLevelFilter.SIG = true, _defaultLevelFilter);
8442
- (_defaultEmptyFilter = {}, _defaultEmptyFilter[emptyFilterId] = true, _defaultEmptyFilter);
8443
- var defaultPhenomenonFilter = (_defaultPhenomenonFil = {}, _defaultPhenomenonFil[emptyFilterId] = true, _defaultPhenomenonFil.coastalEvent = true, _defaultPhenomenonFil.fog = true, _defaultPhenomenonFil.highTemp = true, _defaultPhenomenonFil.lowTemp = true, _defaultPhenomenonFil.rain = true, _defaultPhenomenonFil.snowIce = true, _defaultPhenomenonFil.thunderstorm = true, _defaultPhenomenonFil.wind = true, _defaultPhenomenonFil);
8444
- var useSelectedOptions = function useSelectedOptions(options) {
8253
+ var defaultEmptyFilter = (_defaultEmptyFilter = {}, _defaultEmptyFilter[emptyFilterId] = true, _defaultEmptyFilter);
8254
+ (_defaultPhenomenonFil = {}, _defaultPhenomenonFil[emptyFilterId] = true, _defaultPhenomenonFil.coastalEvent = true, _defaultPhenomenonFil.fog = true, _defaultPhenomenonFil.highTemp = true, _defaultPhenomenonFil.lowTemp = true, _defaultPhenomenonFil.rain = true, _defaultPhenomenonFil.snowIce = true, _defaultPhenomenonFil.thunderstorm = true, _defaultPhenomenonFil.wind = true, _defaultPhenomenonFil);
8255
+ var initialFilters = {
8256
+ incident: defaultEmptyFilter,
8257
+ source: defaultEmptyFilter,
8258
+ domain: defaultDomainFilter,
8259
+ phenomenon: defaultEmptyFilter,
8260
+ level: defaultLevelFilter
8261
+ };
8262
+ var getSelectedOptions = function getSelectedOptions(options) {
8445
8263
  var selectedOptions = Object.keys(options).filter(function (k) {
8446
8264
  return options[k];
8447
8265
  });
@@ -8459,10 +8277,16 @@ var updateState = function updateState(state, optionKey, value, only) {
8459
8277
  return Object.assign({}, acc, (_Object$assign = {}, _Object$assign[k] = k === optionKey, _Object$assign));
8460
8278
  }, {});
8461
8279
  }
8462
- return optionKey === 'ALL' ? Object.keys(state).reduce(function (acc, k) {
8463
- var _Object$assign2;
8464
- return Object.assign({}, acc, (_Object$assign2 = {}, _Object$assign2[k] = value, _Object$assign2));
8465
- }, {}) : Object.assign({}, state, (_Object$assign3 = {}, _Object$assign3[optionKey] = value, _Object$assign3));
8280
+ if (optionKey === 'ALL') {
8281
+ if (Object.keys(state).length < 2) {
8282
+ return state;
8283
+ }
8284
+ return Object.keys(state).reduce(function (acc, k) {
8285
+ var _Object$assign2;
8286
+ return Object.assign({}, acc, (_Object$assign2 = {}, _Object$assign2[k] = value, _Object$assign2));
8287
+ }, {});
8288
+ }
8289
+ return Object.assign({}, state, (_Object$assign3 = {}, _Object$assign3[optionKey] = value, _Object$assign3));
8466
8290
  };
8467
8291
  /** Make sure our value is in the filter */
8468
8292
  var getValue = function getValue(values, value) {
@@ -10679,6 +10503,7 @@ var AreaObjectLoaderConnect = function AreaObjectLoaderConnect(_ref) {
10679
10503
  * */
10680
10504
  var transformAirmetToWarningFormat = function transformAirmetToWarningFormat(apiAirmet) {
10681
10505
  var airmet = apiAirmet.airmet;
10506
+ var cancelAirmet = apiAirmet == null ? void 0 : apiAirmet.airmet;
10682
10507
  var areas = [];
10683
10508
  if (airmet.startGeometry) {
10684
10509
  areas.push({
@@ -10708,12 +10533,14 @@ var transformAirmetToWarningFormat = function transformAirmetToWarningFormat(api
10708
10533
  level: 'AIR',
10709
10534
  probability: 0,
10710
10535
  incident: airmet.sequence,
10711
- firName: airmet.firName
10536
+ firName: airmet.firName,
10537
+ cancelId: isInstanceOfCancelAirmet(airmet) ? cancelAirmet.cancelsAirmetSequenceId : undefined
10712
10538
  }
10713
10539
  };
10714
10540
  };
10715
10541
  var transformSigmetToWarningFormat = function transformSigmetToWarningFormat(apiSigmet) {
10716
10542
  var sigmet = apiSigmet.sigmet;
10543
+ var cancelSigmet = apiSigmet == null ? void 0 : apiSigmet.sigmet;
10717
10544
  var areas = [];
10718
10545
  if (sigmet.startGeometry) {
10719
10546
  areas.push({
@@ -10759,7 +10586,8 @@ var transformSigmetToWarningFormat = function transformSigmetToWarningFormat(api
10759
10586
  level: 'SIG',
10760
10587
  probability: 0,
10761
10588
  incident: sigmet.sequence,
10762
- firName: sigmet.firName
10589
+ firName: sigmet.firName,
10590
+ cancelId: isInstanceOfCancelSigmet(sigmet) ? cancelSigmet.cancelsSigmetSequenceId : undefined
10763
10591
  }
10764
10592
  };
10765
10593
  };
@@ -11303,9 +11131,9 @@ var ExpandableFilterChip = function ExpandableFilterChip(_ref) {
11303
11131
  var _useState = useState(null),
11304
11132
  anchorEl = _useState[0],
11305
11133
  setAnchorEl = _useState[1];
11306
- var _useSelectedOptions = useSelectedOptions(options),
11307
- noSelectedOptions = _useSelectedOptions.noSelectedOptions,
11308
- allSelected = _useSelectedOptions.allSelected;
11134
+ var _getSelectedOptions = getSelectedOptions(options),
11135
+ noSelectedOptions = _getSelectedOptions.noSelectedOptions,
11136
+ allSelected = _getSelectedOptions.allSelected;
11309
11137
  var isDisabled = Object.keys(options).length < 2;
11310
11138
  return jsxs(Fragment, {
11311
11139
  children: [jsx(CustomTooltip, {
@@ -11454,6 +11282,7 @@ var ExpandableFilterChip = function ExpandableFilterChip(_ref) {
11454
11282
  });
11455
11283
  };
11456
11284
 
11285
+ var filterOrder = ['incident', 'source', 'domain', 'phenomenon', 'level'];
11457
11286
  var FilterList = function FilterList(_ref) {
11458
11287
  var _ref$onClickAll = _ref.onClickAll,
11459
11288
  onClickAll = _ref$onClickAll === void 0 ? function () {} : _ref$onClickAll,
@@ -11491,7 +11320,7 @@ var FilterList = function FilterList(_ref) {
11491
11320
  size: "medium"
11492
11321
  })
11493
11322
  })
11494
- }), Object.keys(filterState).map(function (filterId) {
11323
+ }), filterOrder.map(function (filterId) {
11495
11324
  return jsx(ExpandableFilterChip, {
11496
11325
  id: filterId,
11497
11326
  options: filterState[filterId],
@@ -11691,7 +11520,7 @@ var renderLevelText = function renderLevelText(levelString) {
11691
11520
  })]
11692
11521
  });
11693
11522
  };
11694
- var renderStatusIcon = function renderStatusIcon(status) {
11523
+ var renderStatusIcon = function renderStatusIcon(warning, status) {
11695
11524
  var getStatusTag = function getStatusTag(content, color, icon) {
11696
11525
  if (icon === void 0) {
11697
11526
  icon = null;
@@ -11707,6 +11536,12 @@ var renderStatusIcon = function renderStatusIcon(status) {
11707
11536
  icon: icon
11708
11537
  });
11709
11538
  };
11539
+ if (warning.productStatus === ProductStatus.PUBLISHED && warning.warningDetail.cancelId) {
11540
+ return getStatusTag("Cnls " + warning.warningDetail.cancelId, 'red');
11541
+ }
11542
+ if (warning.productStatus === ProductStatus.CANCELLED && warning.warningDetail.cancelId === undefined) {
11543
+ return getStatusTag('Cnld', 'red');
11544
+ }
11710
11545
  switch (status) {
11711
11546
  case PublicWarningStatus.TODO:
11712
11547
  return null;
@@ -11721,7 +11556,9 @@ var renderStatusIcon = function renderStatusIcon(status) {
11721
11556
  color: 'geowebColors.iconButtons.flat.default.color',
11722
11557
  marginRight: 2
11723
11558
  },
11724
- children: jsx(Edit, {})
11559
+ children: jsx(Edit, {
11560
+ "data-testid": "EditPencilIcon"
11561
+ })
11725
11562
  });
11726
11563
  case PublicWarningStatus.DRAFT_PUBLISHED:
11727
11564
  return getStatusTag('Pub', 'green', jsx(Edit, {
@@ -11970,7 +11807,7 @@ var WarningListItem = function WarningListItem(_ref) {
11970
11807
  sx: {
11971
11808
  position: 'relative'
11972
11809
  },
11973
- children: [renderStatusIcon(status), warning.editor && jsx(Box, {
11810
+ children: [renderStatusIcon(warning, status), warning.editor && jsx(Box, {
11974
11811
  sx: {
11975
11812
  width: '16px',
11976
11813
  position: 'absolute',
@@ -12189,6 +12026,7 @@ var PublicWarningList = function PublicWarningList(_ref) {
12189
12026
  var _ref$warnings = _ref.warnings,
12190
12027
  warnings = _ref$warnings === void 0 ? [] : _ref$warnings,
12191
12028
  filterHookState = _ref.filterHookState,
12029
+ filterState = _ref.filterState,
12192
12030
  _ref$isLoading = _ref.isLoading,
12193
12031
  isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
12194
12032
  error = _ref.error,
@@ -12214,8 +12052,7 @@ var PublicWarningList = function PublicWarningList(_ref) {
12214
12052
  hoveredFeatureId = _ref.hoveredFeatureId,
12215
12053
  expandedSections = _ref.expandedSections,
12216
12054
  setExpandedSections = _ref.setExpandedSections;
12217
- var filterState = filterHookState.filterState,
12218
- updateFilter = filterHookState.updateFilter,
12055
+ var updateFilter = filterHookState.updateFilter,
12219
12056
  allSelected = filterHookState.allSelected;
12220
12057
  var _useWarningsTranslati = useWarningsTranslation(),
12221
12058
  t = _useWarningsTranslati.t;
@@ -12551,6 +12388,37 @@ var getPublicWarningsError = createSelector(getPublicWarningsStore, function (st
12551
12388
  var getPublicWarningsLastUpdatedTime = createSelector(getPublicWarningsStore, function (store) {
12552
12389
  return store == null ? void 0 : store.lastUpdatedTime;
12553
12390
  });
12391
+ var getWarningsFilterState = createSelector(getPublicWarningsStore, function (store) {
12392
+ return store == null ? void 0 : store.filterState;
12393
+ }, selectorMemoizationOptions);
12394
+ var getWarningsFilterById = createSelector(getWarningsFilterState, function (_store, panelId) {
12395
+ return panelId;
12396
+ }, function (filterState, panelId) {
12397
+ return panelId && filterState && filterState[panelId] ? filterState[panelId] : initialFilters;
12398
+ }, selectorMemoizationOptions);
12399
+ var getWarningsPresetById = createSelector(getWarningsFilterState, function (_store, panelId) {
12400
+ return panelId;
12401
+ }, function (filterState, panelId) {
12402
+ if (!panelId || !filterState || !filterState[panelId]) {
12403
+ return {
12404
+ filterState: null
12405
+ };
12406
+ }
12407
+ return {
12408
+ filterState: filterState[panelId]
12409
+ };
12410
+ }, selectorMemoizationOptions);
12411
+
12412
+ var selectors = /*#__PURE__*/Object.freeze({
12413
+ __proto__: null,
12414
+ getPublicWarningsError: getPublicWarningsError,
12415
+ getPublicWarningsLastUpdatedTime: getPublicWarningsLastUpdatedTime,
12416
+ getPublicWarningsStore: getPublicWarningsStore,
12417
+ getWarningsFilterById: getWarningsFilterById,
12418
+ getWarningsPresetById: getWarningsPresetById,
12419
+ isPublicWarningsLoading: isPublicWarningsLoading,
12420
+ selectAllPublicWarnings: selectAllPublicWarnings
12421
+ });
12554
12422
 
12555
12423
  var ConfirmDeleteWarningDialog = function ConfirmDeleteWarningDialog(_ref) {
12556
12424
  var _ref$onClose = _ref.onClose,
@@ -12647,35 +12515,51 @@ var ConfirmDeleteWarningDialog = function ConfirmDeleteWarningDialog(_ref) {
12647
12515
  * Copyright 2024 - Finnish Meteorological Institute (FMI)
12648
12516
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
12649
12517
  * */
12650
- var useFilter = function useFilter(defaultFilter, pickedOptions) {
12651
- var _useState = useState(defaultFilter),
12652
- filter = _useState[0],
12653
- setFilter = _useState[1];
12654
- var pickedFilterOptions = pick(filter, [emptyFilterId].concat(pickedOptions));
12655
- var _useSelectedOptions = useSelectedOptions(pickedFilterOptions),
12656
- allSelected = _useSelectedOptions.allSelected;
12657
- return [pickedFilterOptions, setFilter, allSelected];
12658
- };
12659
- var useWarningFilters = function useWarningFilters(warnings) {
12660
- var _useState2 = useState(defaultDomainFilter),
12661
- domainFilter = _useState2[0],
12662
- setDomainFilter = _useState2[1];
12663
- var relevantLevels = Object.keys(domainFilter).flatMap(function (domain) {
12518
+ var getLevelsForDomainFilter = function getLevelsForDomainFilter(domainFilter) {
12519
+ return Object.keys(domainFilter).flatMap(function (domain) {
12664
12520
  return domainFilter[domain] ? domainLevels[domain] : [];
12665
12521
  });
12666
- var _useFilter = useFilter(defaultLevelFilter, relevantLevels),
12667
- pickedLevelFilter = _useFilter[0],
12668
- setLevelFilter = _useFilter[1],
12669
- allLevelsSelected = _useFilter[2];
12670
- var existingPhenomenon = Object.values(Phenomenon$1).filter(function (p) {
12671
- return warnings.find(function (w) {
12672
- return w.warningDetail.phenomenon === p;
12673
- });
12522
+ };
12523
+ var getFilterOptions = function getFilterOptions(defaultFilter, allOptions, savedFilter) {
12524
+ var pickedFilterOptions = pick(defaultFilter, [emptyFilterId].concat(allOptions));
12525
+ // keep options state from savedFilter if it still exists
12526
+ var updatedOptions = assign(pickedFilterOptions, pick(savedFilter || {}, Object.keys(pickedFilterOptions)));
12527
+ var _getSelectedOptions = getSelectedOptions(updatedOptions),
12528
+ allSelected = _getSelectedOptions.allSelected;
12529
+ return [updatedOptions, allSelected];
12530
+ };
12531
+ var useWarningFilters = function useWarningFilters(warnings, onUpdateFilters, savedFilterState, presetFilterState, isLoading) {
12532
+ var pickedDomainFilter = savedFilterState.domain,
12533
+ pickedPhenomenonFilter = savedFilterState.phenomenon,
12534
+ pickedLevelFilter = savedFilterState.level,
12535
+ pickedSourceFilter = savedFilterState.source,
12536
+ pickedIncidentFilter = savedFilterState.incident;
12537
+ /// level
12538
+ var relevantLevels = useMemo(function () {
12539
+ return getLevelsForDomainFilter(pickedDomainFilter);
12540
+ }, [pickedDomainFilter]);
12541
+ var _getFilterOptions = getFilterOptions(defaultLevelFilter, relevantLevels, pickedLevelFilter),
12542
+ updatedPickedLevels = _getFilterOptions[0],
12543
+ allLevelsSelected = _getFilterOptions[1];
12544
+ // phenomenon
12545
+ var warningsPhenomena = useMemo(function () {
12546
+ return getFiltersFromWarnings(warnings, 'phenomenon');
12547
+ }, [warnings]);
12548
+ // filter out aviation phenomena
12549
+ var phenomenaKeysToFilter = new Set(Object.values(Phenomenon$1));
12550
+ var relevantPhenomena = warningsPhenomena.filter(function (item) {
12551
+ return phenomenaKeysToFilter.has(item);
12674
12552
  });
12675
- var _useFilter2 = useFilter(defaultPhenomenonFilter, existingPhenomenon),
12676
- pickedPhenomenonFilter = _useFilter2[0],
12677
- setPhenomenonFilter = _useFilter2[1],
12678
- allPhenomenonSelected = _useFilter2[2];
12553
+ relevantPhenomena.push(emptyFilterId);
12554
+ var defaultPhenomenonFilter = useMemo(function () {
12555
+ return Object.fromEntries(relevantPhenomena.map(function (key) {
12556
+ return [key, true];
12557
+ }));
12558
+ }, [relevantPhenomena]);
12559
+ var _getFilterOptions2 = getFilterOptions(defaultPhenomenonFilter, relevantPhenomena, pickedPhenomenonFilter),
12560
+ updatedPickedPhenomena = _getFilterOptions2[0],
12561
+ allPhenomenaSelected = _getFilterOptions2[1];
12562
+ // source
12679
12563
  var relevantSources = useMemo(function () {
12680
12564
  return getFiltersFromWarnings(warnings, 'warningProposalSource');
12681
12565
  }, [warnings]);
@@ -12684,20 +12568,10 @@ var useWarningFilters = function useWarningFilters(warnings) {
12684
12568
  return [key, true];
12685
12569
  }));
12686
12570
  }, [relevantSources]);
12687
- var _useFilter3 = useFilter(defaultSourceFilter, relevantSources),
12688
- pickedSourceFilter = _useFilter3[0],
12689
- setSourceFilter = _useFilter3[1],
12690
- allSourcesSelected = _useFilter3[2];
12691
- useEffect(function () {
12692
- setSourceFilter(function (prevFilter) {
12693
- var newSourceFilter = Object.assign({}, defaultSourceFilter, prevFilter);
12694
- // Only update state if the new filter differs from the current one
12695
- if (JSON.stringify(newSourceFilter) !== JSON.stringify(prevFilter)) {
12696
- return newSourceFilter;
12697
- }
12698
- return prevFilter;
12699
- });
12700
- }, [defaultSourceFilter, setSourceFilter]);
12571
+ var _getFilterOptions3 = getFilterOptions(defaultSourceFilter, relevantSources, pickedSourceFilter),
12572
+ updatedPickedSources = _getFilterOptions3[0],
12573
+ allSourcesSelected = _getFilterOptions3[1];
12574
+ // incident
12701
12575
  var relevantIncidents = useMemo(function () {
12702
12576
  return getFiltersFromWarnings(warnings, 'incident');
12703
12577
  }, [warnings]);
@@ -12706,23 +12580,35 @@ var useWarningFilters = function useWarningFilters(warnings) {
12706
12580
  return [key, true];
12707
12581
  }));
12708
12582
  }, [relevantIncidents]);
12709
- var _useFilter4 = useFilter(defaultIncidentFilter, relevantIncidents),
12710
- pickedIncidentFilter = _useFilter4[0],
12711
- setIncidentFilter = _useFilter4[1],
12712
- allIncidentsSelected = _useFilter4[2];
12583
+ var _getFilterOptions4 = getFilterOptions(defaultIncidentFilter, relevantIncidents, pickedIncidentFilter),
12584
+ updatedPickedIncidents = _getFilterOptions4[0],
12585
+ allIncidentsSelected = _getFilterOptions4[1];
12713
12586
  useEffect(function () {
12714
- setIncidentFilter(function (prevFilter) {
12715
- var newIncidentFilter = Object.assign({}, defaultIncidentFilter, prevFilter);
12716
- // Only update state if the new filter differs from the current one
12717
- if (JSON.stringify(newIncidentFilter) !== JSON.stringify(prevFilter)) {
12718
- return newIncidentFilter;
12719
- }
12720
- return prevFilter;
12721
- });
12722
- }, [defaultIncidentFilter, setIncidentFilter]);
12723
- var _useSelectedOptions2 = useSelectedOptions(domainFilter),
12724
- allDomainSelected = _useSelectedOptions2.allSelected;
12725
- var allSelected = allDomainSelected && allLevelsSelected && allPhenomenonSelected && allIncidentsSelected && allSourcesSelected;
12587
+ if (isLoading) {
12588
+ return;
12589
+ }
12590
+ // when the warnings change, update the filters
12591
+ onUpdateFilters({
12592
+ incident: updatedPickedIncidents,
12593
+ source: updatedPickedSources,
12594
+ domain: pickedDomainFilter,
12595
+ phenomenon: updatedPickedPhenomena,
12596
+ level: updatedPickedLevels
12597
+ }, 'system');
12598
+ // eslint-disable-next-line react-hooks/exhaustive-deps
12599
+ }, [warnings]);
12600
+ useEffect(function () {
12601
+ // when the preset changes, update the filters
12602
+ if (presetFilterState) {
12603
+ onUpdateFilters(presetFilterState, 'system');
12604
+ } else {
12605
+ // for a preset without filters saved use the initial filters
12606
+ onUpdateFilters(initialFilters, 'system');
12607
+ }
12608
+ }, [presetFilterState, onUpdateFilters]);
12609
+ var _getSelectedOptions2 = getSelectedOptions(pickedDomainFilter),
12610
+ allDomainSelected = _getSelectedOptions2.allSelected;
12611
+ var allSelected = allDomainSelected && allLevelsSelected && allPhenomenaSelected && allIncidentsSelected && allSourcesSelected;
12726
12612
  /**
12727
12613
  * @param filterKey - Name of the filter | "ALL" filters
12728
12614
  * @param optionKey - Name of the option | "ALL" options
@@ -12730,49 +12616,47 @@ var useWarningFilters = function useWarningFilters(warnings) {
12730
12616
  * @param only - Flag that decides if all other options should be disabled
12731
12617
  */
12732
12618
  var updateFilter = function updateFilter(filterKey, optionKey, value, only) {
12619
+ var levelFilter = value ? defaultLevelFilter : defaultEmptyFilter;
12733
12620
  if (filterKey === 'ALL') {
12734
- setDomainFilter(function (state) {
12735
- return updateState(state, 'ALL', value);
12736
- });
12737
- setLevelFilter(function (state) {
12738
- return updateState(state, 'ALL', value);
12739
- });
12740
- setPhenomenonFilter(function (state) {
12741
- return updateState(state, 'ALL', value);
12742
- });
12743
- setSourceFilter(function (state) {
12744
- return updateState(state, 'ALL', value);
12745
- });
12746
- setIncidentFilter(function (state) {
12747
- return updateState(state, 'ALL', value);
12748
- });
12621
+ onUpdateFilters({
12622
+ domain: updateState(pickedDomainFilter, 'ALL', value),
12623
+ level: updateState(levelFilter, 'ALL', value),
12624
+ phenomenon: updateState(pickedPhenomenonFilter, 'ALL', value),
12625
+ incident: updateState(pickedIncidentFilter, 'ALL', value),
12626
+ source: updateState(pickedSourceFilter, 'ALL', value)
12627
+ }, 'user');
12749
12628
  } else if (filterKey === 'domain') {
12750
- setDomainFilter(function (state) {
12751
- return updateState(state, optionKey, value, only);
12752
- });
12629
+ var newDomain = updateState(pickedDomainFilter, optionKey, value, only);
12630
+ var _relevantLevels = getLevelsForDomainFilter(newDomain);
12631
+ var _getFilterOptions5 = getFilterOptions(defaultLevelFilter, _relevantLevels, pickedLevelFilter),
12632
+ newLevel = _getFilterOptions5[0];
12633
+ onUpdateFilters(Object.assign({}, savedFilterState, {
12634
+ domain: newDomain,
12635
+ level: newLevel // levels depend on selected domains
12636
+ }), 'user');
12753
12637
  } else if (filterKey === 'level') {
12754
- setLevelFilter(function (state) {
12755
- return updateState(state, optionKey, value, only);
12756
- });
12638
+ onUpdateFilters(Object.assign({}, savedFilterState, {
12639
+ level: updateState(pickedLevelFilter, optionKey, value, only)
12640
+ }), 'user');
12757
12641
  } else if (filterKey === 'phenomenon') {
12758
- setPhenomenonFilter(function (state) {
12759
- return updateState(state, optionKey, value, only);
12760
- });
12642
+ onUpdateFilters(Object.assign({}, savedFilterState, {
12643
+ phenomenon: updateState(pickedPhenomenonFilter, optionKey, value, only)
12644
+ }), 'user');
12761
12645
  } else if (filterKey === 'source') {
12762
- setSourceFilter(function (state) {
12763
- return updateState(state, optionKey, value, only);
12764
- });
12646
+ onUpdateFilters(Object.assign({}, savedFilterState, {
12647
+ source: updateState(pickedSourceFilter, optionKey, value, only)
12648
+ }), 'user');
12765
12649
  } else if (filterKey === 'incident') {
12766
- setIncidentFilter(function (state) {
12767
- return updateState(state, optionKey, value, only);
12768
- });
12650
+ onUpdateFilters(Object.assign({}, savedFilterState, {
12651
+ incident: updateState(pickedIncidentFilter, optionKey, value, only)
12652
+ }), 'user');
12769
12653
  }
12770
12654
  };
12771
12655
  var byFilterState = useCallback(function (warning) {
12772
12656
  var levelDomain = ['SIG', 'AIR'].find(function (d) {
12773
12657
  return d === warning.warningDetail.level;
12774
12658
  }) ? Domain.aviation : Domain["public"];
12775
- if (!domainFilter[levelDomain]) {
12659
+ if (!pickedDomainFilter[levelDomain]) {
12776
12660
  return false;
12777
12661
  }
12778
12662
  var level = getValue(Level, warning.warningDetail.level);
@@ -12796,15 +12680,8 @@ var useWarningFilters = function useWarningFilters(warnings) {
12796
12680
  return false;
12797
12681
  }
12798
12682
  return true;
12799
- }, [domainFilter, pickedLevelFilter, pickedPhenomenonFilter, relevantSources, pickedSourceFilter, relevantIncidents, pickedIncidentFilter]);
12683
+ }, [pickedDomainFilter, pickedLevelFilter, pickedPhenomenonFilter, relevantSources, pickedSourceFilter, relevantIncidents, pickedIncidentFilter]);
12800
12684
  return {
12801
- filterState: {
12802
- incident: pickedIncidentFilter,
12803
- source: pickedSourceFilter,
12804
- domain: domainFilter,
12805
- phenomenon: pickedPhenomenonFilter,
12806
- level: pickedLevelFilter
12807
- },
12808
12685
  allSelected: allSelected,
12809
12686
  updateFilter: updateFilter,
12810
12687
  byFilterState: byFilterState
@@ -12812,7 +12689,8 @@ var useWarningFilters = function useWarningFilters(warnings) {
12812
12689
  };
12813
12690
 
12814
12691
  var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
12815
- var panelId = _ref.panelId;
12692
+ var panelId = _ref.panelId,
12693
+ presetFilterState = _ref.presetFilterState;
12816
12694
  var _useWarningsTranslati = useWarningsTranslation(),
12817
12695
  t = _useWarningsTranslati.t;
12818
12696
  var dispatch = useDispatch();
@@ -12832,10 +12710,13 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
12832
12710
  setConfirmDialogOptions = _React$useState[1];
12833
12711
  var publicWarnings = useSelector(selectAllPublicWarnings);
12834
12712
  var selectedPublicWarningId = useSelector(getSelectedPublicWarningId);
12835
- var isLoading = useSelector(isPublicWarningsLoading || isFetchingAirmet || isFetchingSigmet);
12713
+ var isLoading = useSelector(isPublicWarningsLoading) || isFetchingAirmet || isFetchingSigmet;
12836
12714
  var error = useSelector(getPublicWarningsError);
12837
12715
  var isFormDirty = useSelector(getSelectedPublicIsFormDirty);
12838
12716
  var lastUpdatedTime = useSelector(getPublicWarningsLastUpdatedTime);
12717
+ var savedFilterState = useSelector(function (store) {
12718
+ return getWarningsFilterById(store, panelId);
12719
+ });
12839
12720
  var warningsApi = getWarningsApi();
12840
12721
  var openPublicWarningDialog = /*#__PURE__*/function () {
12841
12722
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(formAction, publicWarning, warningType) {
@@ -12865,7 +12746,8 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
12865
12746
  publicWarning: publicWarning
12866
12747
  }, {
12867
12748
  formState: formAction,
12868
- warningType: warningType
12749
+ warningType: warningType,
12750
+ panelId: panelId
12869
12751
  })));
12870
12752
  case 7:
12871
12753
  case "end":
@@ -13040,7 +12922,14 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
13040
12922
  var transformedAirmets = (airmetList == null ? void 0 : airmetList.map(transformAirmetToWarningFormat)) || [];
13041
12923
  return publicWarnings.concat(transformedSigmets).concat(transformedAirmets);
13042
12924
  }, [publicWarnings, sigmetList, airmetList]);
13043
- var filterHookState = useWarningFilters(combinedWarnings);
12925
+ var onUpdateFilters = React__default.useCallback(function (filterState, origin) {
12926
+ dispatch(publicWarningActions.setWarningFilters({
12927
+ filterState: filterState,
12928
+ panelId: panelId,
12929
+ origin: origin
12930
+ }));
12931
+ }, [dispatch, panelId]);
12932
+ var filterHookState = useWarningFilters(combinedWarnings, onUpdateFilters, savedFilterState, presetFilterState, isLoading);
13044
12933
  var filteredWarnings = React__default.useMemo(function () {
13045
12934
  return combinedWarnings.filter(filterHookState.byFilterState);
13046
12935
  }, [combinedWarnings, filterHookState.byFilterState]);
@@ -13097,6 +12986,7 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
13097
12986
  lastUpdatedTime: lastUpdatedTime,
13098
12987
  onRefetchWarnings: fetchWarnings,
13099
12988
  filterHookState: filterHookState,
12989
+ filterState: savedFilterState,
13100
12990
  hoveredFeatureId: hoveredFeatureId
13101
12991
  }), confirmDialogOptions && jsx(ConfirmDeleteWarningDialog, {
13102
12992
  onClose: function onClose() {
@@ -13122,7 +13012,8 @@ var PublicWarningApiWrapper = function PublicWarningApiWrapper(_ref) {
13122
13012
  var config = _ref.config,
13123
13013
  auth = _ref.auth,
13124
13014
  onSetAuth = _ref.onSetAuth,
13125
- panelId = _ref.panelId;
13015
+ panelId = _ref.panelId,
13016
+ presetFilterState = _ref.presetFilterState;
13126
13017
  return config ? jsx(ApiProvider, {
13127
13018
  config: {
13128
13019
  baseURL: config.baseURL,
@@ -13135,25 +13026,29 @@ var PublicWarningApiWrapper = function PublicWarningApiWrapper(_ref) {
13135
13026
  createApi: createApi$1,
13136
13027
  children: jsx(ErrorBoundary, {
13137
13028
  children: jsx(PublicWarningListConnect, {
13138
- panelId: panelId
13029
+ panelId: panelId,
13030
+ presetFilterState: presetFilterState
13139
13031
  })
13140
13032
  })
13141
13033
  }) : null;
13142
13034
  };
13143
13035
  var componentsLookUp = function componentsLookUp(payload, apiProps) {
13144
13036
  var id = payload.id,
13145
- componentType = payload.componentType;
13037
+ componentType = payload.componentType,
13038
+ initialProps = payload.initialProps;
13146
13039
  switch (componentType) {
13147
13040
  case warningListViewPreset.componentType:
13148
13041
  if (apiProps && apiProps.config) {
13149
13042
  return jsx(PublicWarningApiWrapper, Object.assign({}, apiProps, {
13150
13043
  panelId: id,
13151
- "data-testid": "publicWarningModule"
13044
+ "data-testid": "publicWarningModule",
13045
+ presetFilterState: initialProps.filterState
13152
13046
  }));
13153
13047
  }
13154
13048
  return jsx(PublicWarningListConnect, {
13155
13049
  panelId: id,
13156
- "data-testid": "publicWarningList"
13050
+ "data-testid": "publicWarningList",
13051
+ presetFilterState: initialProps.filterState
13157
13052
  });
13158
13053
  default:
13159
13054
  return null;
@@ -13353,16 +13248,20 @@ publicWarningFormListener.startListening({
13353
13248
  publicWarningFormListener.startListening({
13354
13249
  actionCreator: publicWarningFormActions.openPublicWarningFormDialog,
13355
13250
  effect: function () {
13356
- var _effect6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(_, listenerApi) {
13251
+ var _effect6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(_ref5, listenerApi) {
13252
+ var payload, panelId;
13357
13253
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
13358
13254
  while (1) switch (_context6.prev = _context6.next) {
13359
13255
  case 0:
13256
+ payload = _ref5.payload;
13360
13257
  listenerApi.cancelActiveListeners();
13258
+ panelId = payload.panelId;
13361
13259
  listenerApi.dispatch(uiActions.setToggleOpenDialog({
13362
13260
  setOpen: true,
13363
- type: publicWarningDialogType
13261
+ type: publicWarningDialogType,
13262
+ sourcePanelId: panelId
13364
13263
  }));
13365
- case 2:
13264
+ case 4:
13366
13265
  case "end":
13367
13266
  return _context6.stop();
13368
13267
  }
@@ -13375,7 +13274,7 @@ publicWarningFormListener.startListening({
13375
13274
  }()
13376
13275
  });
13377
13276
  var saveOrUpdateWarning = /*#__PURE__*/function () {
13378
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(publicWarning) {
13277
+ var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(publicWarning) {
13379
13278
  var warningsApi, warningDetail, status, warning, newWarningId;
13380
13279
  return _regeneratorRuntime().wrap(function _callee7$(_context7) {
13381
13280
  while (1) switch (_context7.prev = _context7.next) {
@@ -13421,7 +13320,7 @@ var saveOrUpdateWarning = /*#__PURE__*/function () {
13421
13320
  }, _callee7);
13422
13321
  }));
13423
13322
  return function saveOrUpdateWarning(_x13) {
13424
- return _ref5.apply(this, arguments);
13323
+ return _ref6.apply(this, arguments);
13425
13324
  };
13426
13325
  }();
13427
13326
  var toggleDialogLoadingEffect = function toggleDialogLoadingEffect(dispatch, isDialogOpen, isLoading) {
@@ -13441,12 +13340,12 @@ var errorEffect = function errorEffect(dispatch, message, isDialogOpen) {
13441
13340
  publicWarningFormListener.startListening({
13442
13341
  actionCreator: uiActions.setToggleOpenDialog,
13443
13342
  effect: function () {
13444
- var _effect7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(_ref6, listenerApi) {
13343
+ var _effect7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(_ref7, listenerApi) {
13445
13344
  var payload;
13446
13345
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
13447
13346
  while (1) switch (_context8.prev = _context8.next) {
13448
13347
  case 0:
13449
- payload = _ref6.payload;
13348
+ payload = _ref7.payload;
13450
13349
  if (!payload.setOpen && payload.type === publicWarningDialogType) {
13451
13350
  listenerApi.dispatch(uiActions.setToggleOpenDialog({
13452
13351
  setOpen: false,
@@ -13647,6 +13546,7 @@ drawingsListener.startListening({
13647
13546
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
13648
13547
  * */
13649
13548
  var drawingModuleConfig = {
13549
+ // TODO: remove id in https://gitlab.com/opengeoweb/opengeoweb/-/issues/5561
13650
13550
  id: 'drawing-module',
13651
13551
  reducersMap: {
13652
13552
  drawings: reducer$2,
@@ -13656,4 +13556,4 @@ var drawingModuleConfig = {
13656
13556
  middlewares: [drawingsListener.middleware, publicWarningsListener.middleware, publicWarningFormListener.middleware]
13657
13557
  };
13658
13558
 
13659
- export { DrawingToolConnect, Wrapper as DrawingToolForm, DrawingToolFormConnect, DrawingToolMapButtonConnect, ObjectManagerConnect, ObjectManagerMapButtonConnect, PublicWarningApiWrapper, PublicWarningsFormDialog, PublicWarningsFormDialogConnect, WARN_NAMESPACE, WarningsModuleProvider, componentsLookUp, drawingModuleConfig, isAlreadyEdited, useObjectDrawDialogAction, warningFormConfirmationOptions, warningsTranslations };
13559
+ export { DrawingToolConnect, Wrapper as DrawingToolForm, DrawingToolFormConnect, DrawingToolMapButtonConnect, ObjectManagerConnect, ObjectManagerMapButtonConnect, PublicWarningApiWrapper, PublicWarningsFormDialog, PublicWarningsFormDialogConnect, WARN_NAMESPACE, WarningsModuleProvider, componentsLookUp, drawingModuleConfig, initialState$1 as initialState, isAlreadyEdited, publicWarningActions, publicWarningFormListener, reducer as publicWarningFormReducer, publicWarningsAdapter, publicWarningsListener, reducer$1 as publicWarningsReducer, selectors as publicWarningsSelectors, reducer$1 as reducer, useObjectDrawDialogAction, warningFormConfirmationOptions, drawingsListener as warningsDrawingsListener, reducer$2 as warningsDrawingsReducer, warningsTranslations };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/warnings",
3
- "version": "9.36.0",
3
+ "version": "10.0.0",
4
4
  "description": "GeoWeb warinings library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -29,7 +29,8 @@
29
29
  "@opengeoweb/sigmet-airmet": "*",
30
30
  "react-i18next": "^15.1.1",
31
31
  "i18next": "^23.11.5",
32
- "@mui/material": "^6.1.1"
32
+ "@mui/material": "^6.1.1",
33
+ "msw": "^1.3.3"
33
34
  },
34
35
  "peerDependencies": {
35
36
  "react": "18",
package/src/index.d.ts CHANGED
@@ -6,5 +6,9 @@ export * from './lib/components/DrawingToolForm';
6
6
  export * from './lib/components/PublicWarningsFormDialog';
7
7
  export * from './lib/components/ComponentsLookUp';
8
8
  export * from './lib/store/config';
9
+ export * from './lib/store';
9
10
  export { WARN_NAMESPACE } from './lib/utils/i18n';
10
11
  export { warningsTranslations };
12
+ export * as publicWarningsSelectors from './lib/store/publicWarnings/selectors';
13
+ export * from './lib/store/types';
14
+ export * from './lib/store/publicWarnings/reducer';
@@ -3,7 +3,6 @@ import { AirmetConfig, AirmetFromBackend, SigmetConfig, SigmetFromBackend } from
3
3
  import { AviationProduct } from '@opengeoweb/sigmet-airmet';
4
4
  export declare const getAirmetList: (auth: Credentials) => Promise<AirmetFromBackend[]>;
5
5
  export declare const getSigmetList: (auth: Credentials) => Promise<SigmetFromBackend[]>;
6
- export declare const getlocalProductConfig: <T extends SigmetConfig | AirmetConfig>(configUrl: string) => Promise<T>;
7
6
  export declare const getAirmetConfig: (auth: Credentials) => Promise<AirmetConfig>;
8
7
  export declare const getSigmetConfig: (auth: Credentials) => Promise<SigmetConfig>;
9
8
  export declare const getAirmetTAC: (auth: Credentials, product: AviationProduct) => Promise<{
@@ -0,0 +1,3 @@
1
+ export declare const fakeSigmetTAC = "EHAA SIGMET 1 VALID 121249/121449 EHDB- EHAA AMSTERDAM FIR FRQ TS OBS ENTIRE FIR FL010 STNR WKN";
2
+ export declare const fakeAirmetTAC = "EHAA AIRMET -1 VALID 310700/311100 EHDB- EHAA AMSTERDAM FIR ISOL CB OBS ENTIRE FIR FL020 STNR NC";
3
+ export declare const aviationEndpoints: import("msw").RestHandler<import("msw").MockedRequest<import("msw").DefaultBodyType>>[];
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ApiModule, ApiUrls } from '@opengeoweb/api';
3
- type WarningListComponentType = 'WarningList';
3
+ import { PublicWarningListConnectProps } from '../PublicWarningList';
4
+ export type WarningListComponentType = 'WarningList';
4
5
  export interface ComponentsLookUpPayload {
5
6
  componentType: WarningListComponentType;
6
7
  id: string;
@@ -10,8 +11,7 @@ export interface ComponentsLookUpPayload {
10
11
  export interface ApiModuleProps extends ApiModule {
11
12
  config: ApiUrls;
12
13
  }
13
- interface Props extends ApiModuleProps {
14
- panelId: string;
14
+ interface Props extends ApiModuleProps, PublicWarningListConnectProps {
15
15
  }
16
16
  export declare const PublicWarningApiWrapper: React.FC<Props>;
17
17
  export declare const componentsLookUp: (payload: ComponentsLookUpPayload, apiProps?: ApiModuleProps) => React.ReactElement;
@@ -1,5 +1,6 @@
1
1
  import { PublicWarning } from '../../store/publicWarningForm/types';
2
2
  import { defaultDomainFilter, defaultEmptyFilter, defaultLevelFilter, defaultPhenomenonFilter } from './filter-utils';
3
+ export type UpdateFiltersOrigin = 'user' | 'system';
3
4
  export interface PickedFilterState {
4
5
  incident: Partial<typeof defaultEmptyFilter>;
5
6
  source: Partial<typeof defaultEmptyFilter>;
@@ -18,10 +19,9 @@ export type FilterKeyType = keyof FilterState;
18
19
  export type OptionKey<T extends FilterKeyType> = keyof FilterState[T];
19
20
  export type UpdateFilter = <T extends FilterKeyType>(filterKey: T | 'ALL', optionKey: OptionKey<T> | 'ALL', value: boolean, only?: boolean) => void;
20
21
  export interface FilterHookState {
21
- filterState: PickedFilterState;
22
22
  allSelected: boolean;
23
23
  updateFilter: UpdateFilter;
24
24
  byFilterState: (warning: PublicWarning) => boolean;
25
25
  }
26
- export declare const useWarningFilters: (warnings: PublicWarning[]) => FilterHookState;
26
+ export declare const useWarningFilters: (warnings: PublicWarning[], onUpdateFilters: (filterState: PickedFilterState, origin: UpdateFiltersOrigin) => void, savedFilterState: PickedFilterState, presetFilterState?: PickedFilterState, isLoading?: boolean) => FilterHookState;
27
27
  export {};
@@ -27,6 +27,13 @@ export declare const domainLevels: Record<Domain, Level[]>;
27
27
  export declare const defaultLevelFilter: Record<Level | 'unspecified', boolean>;
28
28
  export declare const defaultEmptyFilter: Record<string, boolean>;
29
29
  export declare const defaultPhenomenonFilter: Record<Phenomenon | 'unspecified', boolean>;
30
+ export declare const initialFilters: {
31
+ incident: Record<string, boolean>;
32
+ source: Record<string, boolean>;
33
+ domain: Record<Domain, boolean>;
34
+ phenomenon: Record<string, boolean>;
35
+ level: Record<"unspecified" | Level, boolean>;
36
+ };
30
37
  type OptionsType = Partial<Record<Domain | Level | Phenomenon, boolean>>;
31
38
  interface OptionsMetadata {
32
39
  /** The number of selected options */
@@ -34,8 +41,8 @@ interface OptionsMetadata {
34
41
  /** Whether or not all options are selected */
35
42
  allSelected: boolean;
36
43
  }
37
- export declare const useSelectedOptions: (options: OptionsType) => OptionsMetadata;
38
- export declare const updateState: <T extends string>(state: Record<T, boolean>, optionKey: T | 'ALL', value: boolean, only?: boolean) => Record<T, boolean>;
44
+ export declare const getSelectedOptions: (options: OptionsType) => OptionsMetadata;
45
+ export declare const updateState: <T extends string>(state: Partial<Record<T, boolean>>, optionKey: T | 'ALL', value: boolean, only?: boolean) => Record<T, boolean>;
39
46
  /** Make sure our value is in the filter */
40
47
  export declare const getValue: <T>(values: Record<string, T>, value: string) => T | 'unspecified';
41
48
  export declare const getFiltersFromWarnings: (warnings: PublicWarning[], filterKey: string) => string[];
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { PublicWarning } from '../../store/publicWarningForm/types';
3
- import { FilterHookState } from '../FilterList/filter-hooks';
3
+ import { FilterHookState, PickedFilterState } from '../FilterList/filter-hooks';
4
4
  import { WarningListItemActions } from './WarningListItemMenu';
5
5
  export interface PublicWarningListProps extends WarningListItemActions {
6
6
  warnings: PublicWarning[];
@@ -12,6 +12,7 @@ export interface PublicWarningListProps extends WarningListItemActions {
12
12
  onCreateWarning?: () => void;
13
13
  onRefetchWarnings?: () => void;
14
14
  filterHookState: FilterHookState;
15
+ filterState: PickedFilterState;
15
16
  hoveredFeatureId?: string;
16
17
  expandedSections: Record<string, boolean>;
17
18
  setExpandedSections: (expandedSections: Record<string, boolean>) => void;
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
- interface Props {
3
- panelId?: string;
2
+ import { PickedFilterState } from '../FilterList/filter-hooks';
3
+ export interface PublicWarningListConnectProps {
4
+ panelId: string;
5
+ presetFilterState?: PickedFilterState;
4
6
  }
5
- export declare const PublicWarningListConnect: React.FC<Props>;
7
+ export declare const PublicWarningListConnect: React.FC<PublicWarningListConnectProps>;
6
8
  export default PublicWarningListConnect;
@@ -0,0 +1,2 @@
1
+ export { reducer as warningsDrawingsReducer } from './reducer';
2
+ export { drawingsListener as warningsDrawingsListener } from './listener';
@@ -0,0 +1,3 @@
1
+ export * from './publicWarningForm';
2
+ export * from './drawings';
3
+ export * from './publicWarnings';
@@ -0,0 +1,2 @@
1
+ export { reducer as publicWarningFormReducer } from './reducer';
2
+ export { publicWarningFormListener } from './listener';
@@ -16,6 +16,7 @@ export interface PublicWarningFormState {
16
16
  selectedPublicWarningId?: string;
17
17
  isFormDirty?: boolean;
18
18
  warningType?: WarningType;
19
+ panelId?: string;
19
20
  }
20
21
  export declare const TAKEOVER_MESSAGE = "You are no longer the editor of this warning";
21
22
  export declare const initialState: PublicWarningFormState;
@@ -37,6 +38,7 @@ export declare const publicWarningFormActions: import("@reduxjs/toolkit").CaseRe
37
38
  formState?: FormAction;
38
39
  publicWarning?: PublicWarning;
39
40
  warningType?: WarningType;
41
+ panelId?: string;
40
42
  }>) => void;
41
43
  toggleEditorWarning: (draft: Draft<PublicWarningFormState>, action: PayloadAction<{
42
44
  warningId: string;
@@ -23,6 +23,7 @@ export interface PublicWarningDetail {
23
23
  linked_to_id?: string;
24
24
  incident?: string;
25
25
  firName?: string;
26
+ cancelId?: string;
26
27
  }
27
28
  export declare enum PublicWarningStatus {
28
29
  DRAFT = "DRAFT",
@@ -0,0 +1,2 @@
1
+ export { reducer as publicWarningsReducer } from './reducer';
2
+ export { publicWarningsListener } from './listener';
@@ -1,6 +1,7 @@
1
1
  import { PayloadAction, Draft } from '@reduxjs/toolkit';
2
2
  import { PublicWarningsState } from './types';
3
3
  import { PublicWarning } from '../publicWarningForm/types';
4
+ import { PickedFilterState, UpdateFiltersOrigin } from '../../components/FilterList/filter-hooks';
4
5
  export declare const publicWarningsAdapter: import("@reduxjs/toolkit").EntityAdapter<PublicWarning>;
5
6
  export declare const initialState: PublicWarningsState;
6
7
  export declare const reducer: import("redux").Reducer<PublicWarningsState>;
@@ -16,4 +17,9 @@ export declare const publicWarningActions: import("@reduxjs/toolkit").CaseReduce
16
17
  message: string;
17
18
  };
18
19
  }>) => void;
20
+ setWarningFilters: (draft: Draft<PublicWarningsState>, action: PayloadAction<{
21
+ filterState: PickedFilterState;
22
+ panelId?: string;
23
+ origin: UpdateFiltersOrigin;
24
+ }>) => void;
19
25
  }, "publicWarnings">;
@@ -17,3 +17,33 @@ export declare const getPublicWarningsLastUpdatedTime: ((state: WarningModuleSto
17
17
  }> & {
18
18
  clearCache: () => void;
19
19
  };
20
+ export declare const getWarningsFilterById: ((state: WarningModuleStore, panelId?: string | undefined) => import("../../components/FilterList/filter-hooks").PickedFilterState | {
21
+ incident: Record<string, boolean>;
22
+ source: Record<string, boolean>;
23
+ domain: Record<import("../../components/FilterList/filter-utils").Domain, boolean>;
24
+ phenomenon: Record<string, boolean>;
25
+ level: Record<import("../../components/FilterList/filter-utils").Level | "unspecified", boolean>;
26
+ }) & import("reselect").OutputSelectorFields<(args_0: Record<string, import("../../components/FilterList/filter-hooks").PickedFilterState>, args_1: string | undefined) => import("../../components/FilterList/filter-hooks").PickedFilterState | {
27
+ incident: Record<string, boolean>;
28
+ source: Record<string, boolean>;
29
+ domain: Record<import("../../components/FilterList/filter-utils").Domain, boolean>;
30
+ phenomenon: Record<string, boolean>;
31
+ level: Record<import("../../components/FilterList/filter-utils").Level | "unspecified", boolean>;
32
+ }, {
33
+ clearCache: () => void;
34
+ }> & {
35
+ clearCache: () => void;
36
+ };
37
+ export declare const getWarningsPresetById: ((state: WarningModuleStore, panelId?: string | undefined) => {
38
+ filterState: null;
39
+ } | {
40
+ filterState: import("../../components/FilterList/filter-hooks").PickedFilterState;
41
+ }) & import("reselect").OutputSelectorFields<(args_0: Record<string, import("../../components/FilterList/filter-hooks").PickedFilterState>, args_1: string | undefined) => {
42
+ filterState: null;
43
+ } | {
44
+ filterState: import("../../components/FilterList/filter-hooks").PickedFilterState;
45
+ }, {
46
+ clearCache: () => void;
47
+ }> & {
48
+ clearCache: () => void;
49
+ };
@@ -1,5 +1,6 @@
1
1
  import { EntityState } from '@reduxjs/toolkit';
2
2
  import { PublicWarning } from '../publicWarningForm/types';
3
+ import { PickedFilterState } from '../../components/FilterList/filter-hooks';
3
4
  export interface FilterTranslation {
4
5
  translationKey: string;
5
6
  key: string;
@@ -14,4 +15,5 @@ export interface PublicWarningsState {
14
15
  isLoading: boolean;
15
16
  lastUpdatedTime: string;
16
17
  error?: PublicWarningError;
18
+ filterState: Record<string, PickedFilterState>;
17
19
  }