@opengeoweb/warnings 19.1.1 → 19.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/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useDispatch, useSelector, useStore, shallowEqual } from 'react-redux';
3
3
  import { uiTypes, uiActions, getSingularDrawtoolDrawLayerId, drawingToolSelectors, layerSelectors, uiSelectors, layerActions, drawingToolActions, mapListener, layersListener, drawingToolListener, syncGroupsListener, openlayersListener, syncGroupsReducer, drawingToolReducer, uiReducer, layerReducer, mapReducer, useSetupDialog, layerUtils, genericSelectors, useUpdateFeatureSyncLayers, genericActions, selectorMemoizationOptions, useRegisterFeatureSyncSource, syncGroupsSelector } from '@opengeoweb/store';
4
- import { Polygons, CoastalEvent, TemperatureLow, TemperatureHigh, Rain, Snow, Lightning, Fog, Wind, Thunderstorm, SevereMountainWaves, VulcanicEruption, Haze, FreezingPrecipitation, ModerateAircraftIcing, SevereAircraftIcing, ModerateTurbulence, SevereTurbulence, SandStorm, RadioactiveMaterials, ExitDomain, Share, Edit, Delete, DrawPolygon, Remove, Options, ChevronDown, Visibility, Add, breakpoints, DragHandle, Info, ArrowUpCompact, ArrowDownCompact, Extend24h, Copy, Update, Cancel, Success, Expire, VisibilityOff, ChevronUp, Close, Clock } from '@opengeoweb/theme';
4
+ import { Polygons, CoastalEvent, TemperatureLow, TemperatureHigh, Rain, Snow, Lightning, Fog, Wind, Thunderstorm, SevereMountainWaves, VulcanicEruption, Haze, FreezingPrecipitation, ModerateAircraftIcing, SevereAircraftIcing, ModerateTurbulence, SevereTurbulence, SandStorm, RadioactiveMaterials, ExitDomain, Share, Edit, Delete, DrawPolygon, Remove, Options, ChevronDown, Visibility, Add, breakpoints, DragHandle, Info, ArrowUpCompact, ArrowDownCompact, ArrowDropDownDown, Extend24h, Copy, Update, Cancel, Success, Expire, VisibilityOff, ChevronUp, Close, Clock } from '@opengeoweb/theme';
5
5
  import { WEBMAP_REACT_NAMESPACE, defaultPolygon, emptyGeoJSON, MapControlButton, defaultSmoothLine, defaultLineString, defaultFreehandLine, defaultOval, defaultCircle, defaultRotatableBox, defaultSquare, defaultLocation, defaultPoint, defaultSplit, defaultDelete, getDrawModeIdFromSelectionType, getIcon, rewindGeometry, getGeoJSONPropertyValue, DRAWMODE, currentlySupportedDrawModes, defaultLayers, viewUtils, OpenLayersMapView, MapControls, OpenLayersZoomControl, OpenLayersLayer, OpenLayersFeatureLayer, genericOpenLayersFeatureStyle, DEFAULT_GEOJSON_STYLE_FILL_OPACITY, FEATURE_DRAW_FILL_COLOR, FEATURE_DRAW_SECONDARY_FILL_COLOR, FEATURE_DRAW_STROKE_COLOR } from '@opengeoweb/webmap-react';
6
6
  import { SHARED_NAMESPACE, useConfirmationDialog, sessionStorageProvider, dateUtils, ConfirmationDialog, AlertBanner, ToggleMenu, calculateStartSize, ToolContainerDraggable, CustomIconButton, usePrevious, usePreventBrowserClose, CustomTooltip, Avatar, getInitials, SwitchButton, Filter, CustomToggleButton, FilterChip, TooltipSelect, LastUpdateTime, StatusTag, FilterOption, getAxiosErrorMessage, CustomDialog, ConfirmationButtons, ErrorBoundary } from '@opengeoweb/shared';
7
7
  import { createEntityAdapter, createSlice, createSelector, createListenerMiddleware, combineReducers, configureStore } from '@reduxjs/toolkit';
@@ -13,7 +13,7 @@ import { SA_NAMESPACE, isInstanceOfCancelSigmet, getDefaultValidFromValue, isIns
13
13
  import { LayerType, generateMapId, webmapUtils } from '@opengeoweb/webmap';
14
14
  import React, { useRef, useState, useEffect, useCallback, useMemo } from 'react';
15
15
  import { useAuthenticationContext as useAuthenticationContext$1 } from '@opengeoweb/authentication';
16
- import { MenuItem, Grid, Box, Typography, styled, ListItem, Paper, ListItemButton, Stack, useTheme, Accordion, AccordionSummary, AccordionDetails, LinearProgress, Tabs, Tab, Button, FormHelperText, Card, CardContent, FormControl, CircularProgress, Menu, ListItemText, IconButton, DialogTitle, DialogContent, Switch, RadioGroup, FormControlLabel, Radio, InputAdornment, Collapse, Tooltip } from '@mui/material';
16
+ import { MenuItem, Grid, Box, Typography, styled, ListItem, Paper, ListItemButton, Stack, useTheme, Accordion, AccordionSummary, AccordionDetails, LinearProgress, Tabs, Tab, Button, FormHelperText, Card, CardContent, FormControl, CircularProgress, Menu, ListItemText, Tooltip, IconButton, Checkbox, DialogTitle, DialogContent, Switch, RadioGroup, FormControlLabel, Radio, InputAdornment, Collapse } from '@mui/material';
17
17
  import { useQueryClient, useMutation, queryOptions, QueryClient, useQuery } from '@tanstack/react-query';
18
18
  import { getHeaders, handleResponse, AirmetPhenomena, SigmetPhenomena, useAuthenticationContext, useAuthQuery, optimisticUpdate, ProductStatus } from '@opengeoweb/api';
19
19
  import { snackbarListener, snackbarReducer, snackbarActions, snackbarTypes } from '@opengeoweb/snackbar';
@@ -129,7 +129,13 @@ var en = {
129
129
  "warning-dialog-delete-title": "Delete warning",
130
130
  "warning-dialog-delete-confirm": "Delete",
131
131
  "warning-dialog-delete-description": "Are you sure you want to delete this warning?",
132
- "warning-dialog-delete-islocked": "This warning is in edit mode by another user.",
132
+ "warning-dialog-delete-islocked": "Warning is in edit mode by another user.",
133
+ "warning-dialog-delete-all-succes": "All warnings have been deleted",
134
+ "warning-dialog-delete-all-title": "Delete warnings",
135
+ "warning-dialog-delete-all-confirm": "Delete",
136
+ "warning-dialog-delete-all-description": "Are you sure you want to delete {{NUMBER}} warnings?",
137
+ "warning-dialog-delete-all-button": "Batch delete all selected warnings",
138
+ "warning-dialog-delete-all-failed": "Batch delete failed for {{NUMBER}} warnings. Please check the list and retry.",
133
139
  "warning-save-succes": "Public warning has succesfully been saved!",
134
140
  "warning-publish-succes": "Public warning has succesfully been published!",
135
141
  "warning-editor-user-viewer": "Viewer",
@@ -163,6 +169,7 @@ var en = {
163
169
  "warning-list-header-levels": "Levels",
164
170
  "warning-list-header-status": "Status",
165
171
  "warning-list-header-draft": "DRAFT",
172
+ "warning-list-batch-delete-checkbox": "Select for batch delete",
166
173
  "area-object-loader-title": "Areas & Objects",
167
174
  "add-button": "Add",
168
175
  "replace-button": "Replace",
@@ -171,9 +178,12 @@ var en = {
171
178
  "area-object-loader-no-areas-objects": "No areas or objects found",
172
179
  objects: "Objects",
173
180
  areas: "Areas",
181
+ "filter-select": "Select",
174
182
  "filter-select-all": "Select all",
183
+ "filter-deselect-all": "Deselect all",
175
184
  "filter-no-results": "No results",
176
185
  "filter-all": "All",
186
+ "filter-none": "None",
177
187
  "filter-options": "Filter options",
178
188
  "filter-show-all": "Show all",
179
189
  "filter-hide-all": "Hide all",
@@ -415,7 +425,13 @@ var nl = {
415
425
  "warning-dialog-delete-title": "Waarschuwing verwijderen",
416
426
  "warning-dialog-delete-confirm": "Verwijderen",
417
427
  "warning-dialog-delete-description": "Weet je zeker dat je deze waarschuwing wilt verwijderen?",
418
- "warning-dialog-delete-islocked": "Deze waarschwing wordt bewerkt door een andere gebruiker.",
428
+ "warning-dialog-delete-islocked": "Waarschuwing wordt bewerkt door een andere gebruiker.",
429
+ "warning-dialog-delete-all-succes": "Waarschuwingen zijn verwijderd",
430
+ "warning-dialog-delete-all-title": "Waarschuwingen verwijderen",
431
+ "warning-dialog-delete-all-confirm": "Verwijderen",
432
+ "warning-dialog-delete-all-description": "Weet je zeker dat je {{NUMBER}} waarschuwingen wilt verwijderen?",
433
+ "warning-dialog-delete-all-button": "Verwijder geselecteerde waarschuwingen",
434
+ "warning-dialog-delete-all-failed": "Bulk verwijderen mislukt voor {{NUMBER}} waarschuwingen. Check de lijst en probeer opnieuw.",
419
435
  "warning-save-succes": "Publieke waarschuwing is succesvol opgeslagen!",
420
436
  "warning-publish-succes": "Publieke waarschuwing is succesvol gepubliceerd!",
421
437
  "warning-editor-add-editor": "Je bent nu de editor van deze waarschuwing",
@@ -454,6 +470,7 @@ var nl = {
454
470
  "warning-list-too-many-info": "niet vertaald",
455
471
  "warning-list-show-anyway": "niet vertaald",
456
472
  "warning-list-adjust-filter": "niet vertaald",
473
+ "warning-list-batch-delete-checkbox": "Selecteer voor bulk verwijderen",
457
474
  "area-object-loader-title": "Gebieden & Objecten",
458
475
  "add-button": "Toevoegen",
459
476
  "replace-button": "Vervangen",
@@ -462,9 +479,12 @@ var nl = {
462
479
  "area-object-loader-no-areas-objects": "Geen gebieden of objecten gevonden",
463
480
  objects: "Objecten",
464
481
  areas: "Gebieden",
482
+ "filter-select": "Selecteer",
465
483
  "filter-select-all": "Selecteer alles",
484
+ "filter-deselect-all": "Deselecteer alles",
466
485
  "filter-no-results": "Geen resultaten",
467
486
  "filter-all": "Alle",
487
+ "filter-none": "Geen",
468
488
  "filter-options": "Filter opties",
469
489
  "filter-show-all": "Alles tonen",
470
490
  "filter-hide-all": "Alles verbergen",
@@ -661,6 +681,12 @@ var fi = {
661
681
  "warning-dialog-delete-confirm": "Poista",
662
682
  "warning-dialog-delete-description": "Oletko varma, että haluat poistaa varoituksen?",
663
683
  "warning-dialog-delete-islocked": "Tämä varoitus on editointitilassa toisen käyttäjän toimesta",
684
+ "warning-dialog-delete-all-succes": "ei käännetty",
685
+ "warning-dialog-delete-all-title": "ei käännetty",
686
+ "warning-dialog-delete-all-confirm": "ei käännetty",
687
+ "warning-dialog-delete-all-description": "ei käännetty",
688
+ "warning-dialog-delete-all-button": "ei käännetty",
689
+ "warning-dialog-delete-all-failed": "ei käännetty",
664
690
  "warning-save-succes": "Julkinen varoitus tallannettu onnistuneesti",
665
691
  "warning-publish-succes": "Julkinen varoitus tallennettu onnistuneesti",
666
692
  "warning-editor-user-viewer": "Katselu",
@@ -699,6 +725,7 @@ var fi = {
699
725
  "warning-list-too-many-info": "ei käännetty",
700
726
  "warning-list-show-anyway": "ei käännetty",
701
727
  "warning-list-adjust-filter": "ei käännetty",
728
+ "warning-list-batch-delete-checkbox": "ei käännetty",
702
729
  "area-object-loader-title": "ei käännetty",
703
730
  "add-button": "ei käännetty",
704
731
  "replace-button": "ei käännetty",
@@ -707,9 +734,12 @@ var fi = {
707
734
  "area-object-loader-no-areas-objects": "ei käännetty",
708
735
  objects: "ei käännetty",
709
736
  areas: "ei käännetty",
737
+ "filter-select": "Valitse",
710
738
  "filter-select-all": "ei käännetty",
739
+ "filter-deselect-all": "Poista kaikki valinnat",
711
740
  "filter-no-results": "ei käännetty",
712
741
  "filter-all": "Kaikki",
742
+ "filter-none": "Ei mitään",
713
743
  "filter-options": "ei käännetty",
714
744
  "filter-show-all": "ei käännetty",
715
745
  "filter-hide-all": "ei käännetty",
@@ -857,7 +887,13 @@ var no = {
857
887
  "warning-dialog-delete-title": "Slett varsel",
858
888
  "warning-dialog-delete-confirm": "Slett",
859
889
  "warning-dialog-delete-description": "Er du sikker på at du vil slette varselet?",
860
- "warning-dialog-delete-islocked": "Varselet er i endringsmodus av en annen bruker.",
890
+ "warning-dialog-delete-islocked": "Varsel er i endringsmodus av en annen bruker.",
891
+ "warning-dialog-delete-all-succes": "ikke oversatt",
892
+ "warning-dialog-delete-all-title": "ikke oversatt",
893
+ "warning-dialog-delete-all-confirm": "ikke oversatt",
894
+ "warning-dialog-delete-all-description": "ikke oversatt",
895
+ "warning-dialog-delete-all-button": "ikke oversatt",
896
+ "warning-dialog-delete-all-failed": "ikke oversatt",
861
897
  "warning-save-succes": "Farevarselet er lagret!",
862
898
  "warning-publish-succes": "Farevarselet er publisert!",
863
899
  "warning-editor-user-viewer": "Visningsmodus",
@@ -896,6 +932,7 @@ var no = {
896
932
  "warning-list-header-levels": "Grad",
897
933
  "warning-list-header-status": "Status",
898
934
  "warning-list-header-draft": "UTKAST",
935
+ "warning-list-batch-delete-checkbox": "ikke oversatt",
899
936
  "area-object-loader-title": "Områder og objekter",
900
937
  "add-button": "Legg til",
901
938
  "replace-button": "Bytt ut",
@@ -904,9 +941,12 @@ var no = {
904
941
  "area-object-loader-no-areas-objects": "Ingen områder eller objekter funnet",
905
942
  objects: "Objekter",
906
943
  areas: "Områder",
944
+ "filter-select": "Velg",
907
945
  "filter-select-all": "Velg alle",
946
+ "filter-deselect-all": "Avmarker alle",
908
947
  "filter-no-results": "Ingen resultat",
909
948
  "filter-all": "Alle",
949
+ "filter-none": "Ingen",
910
950
  "filter-options": "Filtervalg",
911
951
  "filter-show-all": "Vis alle",
912
952
  "filter-hide-all": "Skjel alle",
@@ -7592,12 +7632,12 @@ var DescriptionField = function DescriptionField(_ref) {
7592
7632
  children: [jsxs(Tabs, {
7593
7633
  "aria-label": "description tabs",
7594
7634
  onChange: handleChange,
7595
- value: activeTab,
7596
7635
  sx: isDisabled ? {
7597
7636
  '& .MuiTabs-indicator': {
7598
7637
  display: 'none'
7599
7638
  }
7600
7639
  } : undefined,
7640
+ value: activeTab,
7601
7641
  children: [jsx(Tab, Object.assign({
7602
7642
  disabled: isDisabled,
7603
7643
  label: t('warning-description-original'),
@@ -9083,7 +9123,9 @@ var WarningListHeaderContent = function WarningListHeaderContent(_ref) {
9083
9123
  },
9084
9124
  sx: Object.assign({}, Array.isArray(props.sx) ? Object.assign.apply(Object, [{}].concat(props.sx)) : props.sx, {
9085
9125
  width: width,
9086
- cursor: _onClick ? 'pointer' : 'default'
9126
+ cursor: _onClick ? 'pointer' : 'default',
9127
+ display: 'flex',
9128
+ justifyContent: 'flex-end'
9087
9129
  }),
9088
9130
  children: jsxs(Box, {
9089
9131
  sx: {
@@ -12099,6 +12141,228 @@ var NewWarningButton = function NewWarningButton(_ref) {
12099
12141
  });
12100
12142
  };
12101
12143
 
12144
+ var SelectAllButton = function SelectAllButton(_ref) {
12145
+ var selectionState = _ref.selectionState,
12146
+ onSelectAll = _ref.onSelectAll,
12147
+ onSelectNone = _ref.onSelectNone,
12148
+ _ref$disabled = _ref.disabled,
12149
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled;
12150
+ var _useWarningsTranslati = useWarningsTranslation(),
12151
+ t = _useWarningsTranslati.t;
12152
+ var allLabel = t('filter-all');
12153
+ var menuTooltipTitle = t('filter-select');
12154
+ var noneLabel = t('filter-none');
12155
+ var selectAllLabel = t('filter-select-all');
12156
+ var deselectAllLabel = t('filter-deselect-all');
12157
+ var tooltipTitle = selectionState === 'all' || selectionState === 'some' ? deselectAllLabel : selectAllLabel;
12158
+ var id = React.useId();
12159
+ var menuButtonId = id + "-menu-button";
12160
+ var menuId = id + "-menu";
12161
+ var _React$useState = React.useState(null),
12162
+ menuAnchorEl = _React$useState[0],
12163
+ setMenuAnchorEl = _React$useState[1];
12164
+ var menuOpen = Boolean(menuAnchorEl);
12165
+ var isActive = !disabled && (menuOpen || selectionState !== 'none');
12166
+ var handleOpenMenu = function handleOpenMenu(event) {
12167
+ if (disabled) {
12168
+ return;
12169
+ }
12170
+ setMenuAnchorEl(event.currentTarget);
12171
+ };
12172
+ var handleCloseMenu = function handleCloseMenu() {
12173
+ setMenuAnchorEl(null);
12174
+ };
12175
+ var toggleSelection = function toggleSelection() {
12176
+ if (disabled) {
12177
+ return;
12178
+ }
12179
+ if (selectionState === 'none') {
12180
+ onSelectAll();
12181
+ return;
12182
+ }
12183
+ onSelectNone();
12184
+ };
12185
+ var handleCheckboxClick = function handleCheckboxClick(event) {
12186
+ event.stopPropagation();
12187
+ toggleSelection();
12188
+ };
12189
+ var handleCheckboxKeyDown = function handleCheckboxKeyDown(event) {
12190
+ if (disabled || event.key !== 'Enter' && event.key !== ' ') {
12191
+ return;
12192
+ }
12193
+ event.preventDefault();
12194
+ toggleSelection();
12195
+ };
12196
+ var getSegmentHoverBackground = function getSegmentHoverBackground(theme) {
12197
+ if (disabled) {
12198
+ return 'transparent';
12199
+ }
12200
+ return isActive ? theme.palette.primary.dark : theme.palette.action.hover;
12201
+ };
12202
+ var segmentHoverSx = {
12203
+ borderRadius: 0.5,
12204
+ '&:hover': {
12205
+ backgroundColor: getSegmentHoverBackground
12206
+ }
12207
+ };
12208
+ var iconColor = isActive ? 'common.white' : 'text.primary';
12209
+ var ariaChecked = selectionState === 'some' ? 'mixed' : selectionState === 'all';
12210
+ return jsxs(Box, {
12211
+ sx: {
12212
+ display: 'inline-flex',
12213
+ alignItems: 'center',
12214
+ borderRadius: 0.5,
12215
+ backgroundColor: isActive ? 'primary.main' : 'transparent',
12216
+ opacity: disabled ? 0.5 : 1
12217
+ },
12218
+ children: [jsx(Tooltip, {
12219
+ placement: "bottom",
12220
+ title: menuTooltipTitle,
12221
+ children: jsx("span", {
12222
+ children: jsx(IconButton, {
12223
+ "aria-controls": menuOpen ? menuId : undefined,
12224
+ "aria-expanded": menuOpen,
12225
+ "aria-haspopup": "true",
12226
+ "aria-label": menuTooltipTitle,
12227
+ disabled: disabled,
12228
+ id: menuButtonId,
12229
+ onClick: handleOpenMenu,
12230
+ size: "small",
12231
+ sx: Object.assign({}, segmentHoverSx, {
12232
+ width: 24,
12233
+ height: 24,
12234
+ borderTopRightRadius: 0,
12235
+ borderBottomRightRadius: 0
12236
+ }),
12237
+ children: jsx(ArrowDropDownDown, {
12238
+ fontSize: "small",
12239
+ sx: {
12240
+ color: iconColor,
12241
+ fontSize: 18
12242
+ }
12243
+ })
12244
+ })
12245
+ })
12246
+ }), jsx(Tooltip, {
12247
+ placement: "bottom",
12248
+ title: tooltipTitle,
12249
+ children: jsx(Box, {
12250
+ "aria-checked": ariaChecked,
12251
+ "aria-label": tooltipTitle,
12252
+ component: "span",
12253
+ "data-testid": "select-all-batch-delete-checkbox",
12254
+ onClick: handleCheckboxClick,
12255
+ onKeyDown: handleCheckboxKeyDown,
12256
+ role: "checkbox",
12257
+ sx: Object.assign({}, segmentHoverSx, {
12258
+ display: 'inline-flex',
12259
+ alignItems: 'center',
12260
+ borderTopLeftRadius: 0,
12261
+ borderBottomLeftRadius: 0,
12262
+ cursor: disabled ? 'default' : 'pointer'
12263
+ }),
12264
+ tabIndex: disabled ? -1 : 0,
12265
+ children: jsx(Checkbox, {
12266
+ checked: selectionState === 'all',
12267
+ disableRipple: true,
12268
+ disabled: disabled,
12269
+ indeterminate: selectionState === 'some',
12270
+ size: "small",
12271
+ sx: {
12272
+ pointerEvents: 'none',
12273
+ color: isActive ? 'common.white' : 'primary.main',
12274
+ padding: '2px',
12275
+ '&.Mui-checked, &.MuiCheckbox-indeterminate': {
12276
+ color: 'common.white'
12277
+ }
12278
+ },
12279
+ tabIndex: -1
12280
+ })
12281
+ })
12282
+ }), jsxs(Menu, {
12283
+ anchorEl: menuAnchorEl,
12284
+ anchorOrigin: {
12285
+ horizontal: 'left',
12286
+ vertical: 'bottom'
12287
+ },
12288
+ id: menuId,
12289
+ onClose: handleCloseMenu,
12290
+ open: menuOpen,
12291
+ slotProps: {
12292
+ list: {
12293
+ 'aria-labelledby': menuButtonId
12294
+ }
12295
+ },
12296
+ transformOrigin: {
12297
+ horizontal: 'left',
12298
+ vertical: 'top'
12299
+ },
12300
+ children: [jsx(MenuItem, {
12301
+ onClick: function onClick() {
12302
+ onSelectAll();
12303
+ handleCloseMenu();
12304
+ },
12305
+ children: allLabel
12306
+ }), jsx(MenuItem, {
12307
+ onClick: function onClick() {
12308
+ onSelectNone();
12309
+ handleCloseMenu();
12310
+ },
12311
+ children: noneLabel
12312
+ })]
12313
+ })]
12314
+ });
12315
+ };
12316
+
12317
+ /* *
12318
+ * Licensed under the Apache License, Version 2.0 (the "License");
12319
+ * you may not use this file except in compliance with the License.
12320
+ * You may obtain a copy of the License at
12321
+ *
12322
+ * http://www.apache.org/licenses/LICENSE-2.0
12323
+ *
12324
+ * Unless required by applicable law or agreed to in writing, software
12325
+ * distributed under the License is distributed on an "AS IS" BASIS,
12326
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12327
+ * See the License for the specific language governing permissions and
12328
+ * limitations under the License.
12329
+ *
12330
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12331
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
12332
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
12333
+ * */
12334
+ var getWarningStatus = function getWarningStatus(warning) {
12335
+ var _warning$status;
12336
+ return (_warning$status = warning.status) != null ? _warning$status : mapProductStatusToWarningStatus(warning.productStatus);
12337
+ };
12338
+ var isWarningSelectableForBatchDelete = function isWarningSelectableForBatchDelete(warning) {
12339
+ var status = getWarningStatus(warning);
12340
+ return status === PublicWarningStatus.DRAFT || status === PublicWarningStatus.DRAFT_PUBLISHED || status === PublicWarningStatus.TODO;
12341
+ };
12342
+ var getBatchDeletableWarningIds = function getBatchDeletableWarningIds(warnings) {
12343
+ return warnings.filter(isWarningSelectableForBatchDelete).map(function (warning) {
12344
+ return warning.id;
12345
+ }).filter(function (id) {
12346
+ return !!id;
12347
+ });
12348
+ };
12349
+ var getBatchSelectionState = function getBatchSelectionState(selectedIds, deletableIds) {
12350
+ if (deletableIds.length === 0) {
12351
+ return 'none';
12352
+ }
12353
+ var selectedIdSet = new Set(selectedIds);
12354
+ var selectedDeletableCount = deletableIds.filter(function (id) {
12355
+ return selectedIdSet.has(id);
12356
+ }).length;
12357
+ if (selectedDeletableCount === 0) {
12358
+ return 'none';
12359
+ }
12360
+ if (selectedDeletableCount === deletableIds.length) {
12361
+ return 'all';
12362
+ }
12363
+ return 'some';
12364
+ };
12365
+
12102
12366
  var _excluded$3 = ["title", "status", "children", "width"];
12103
12367
  var WarningListColumnContent = function WarningListColumnContent(_ref) {
12104
12368
  var _sx;
@@ -12304,7 +12568,7 @@ var WarningListItemMenu = function WarningListItemMenu(_ref) {
12304
12568
  }
12305
12569
  };
12306
12570
 
12307
- var _excluded$2 = ["warning", "activeWarningId", "highlightedItem", "onHoverWarning", "onSelectWarning", "onEditWarning", "onDeleteWarning", "onDeleteReviewWarning", "onExpireWarning", "onWithdrawWarning", "onActionAviationWarning", "onActionMaritimeWarning", "shouldDisableAviationAmendOption", "isHidden", "onToggleVisibility"];
12571
+ var _excluded$2 = ["warning", "activeWarningId", "highlightedItem", "onHoverWarning", "onSelectWarning", "onEditWarning", "onDeleteWarning", "onDeleteReviewWarning", "onExpireWarning", "onWithdrawWarning", "onActionAviationWarning", "onActionMaritimeWarning", "shouldDisableAviationAmendOption", "isHidden", "onToggleVisibility", "selectedForBatchDelete", "toggleWarningForBatchDelete"];
12308
12572
  var renderLevelText = function renderLevelText(levelString) {
12309
12573
  if (!levelString) {
12310
12574
  return null;
@@ -12410,6 +12674,10 @@ var WarningListItem = function WarningListItem(_ref) {
12410
12674
  _ref$isHidden = _ref.isHidden,
12411
12675
  isHidden = _ref$isHidden === void 0 ? false : _ref$isHidden,
12412
12676
  onToggleVisibility = _ref.onToggleVisibility,
12677
+ _ref$selectedForBatch = _ref.selectedForBatchDelete,
12678
+ selectedForBatchDelete = _ref$selectedForBatch === void 0 ? [] : _ref$selectedForBatch,
12679
+ _ref$toggleWarningFor = _ref.toggleWarningForBatchDelete,
12680
+ toggleWarningForBatchDelete = _ref$toggleWarningFor === void 0 ? function () {} : _ref$toggleWarningFor,
12413
12681
  props = _objectWithoutPropertiesLoose(_ref, _excluded$2);
12414
12682
  var _useWarningsTranslati = useWarningsTranslation(),
12415
12683
  t = _useWarningsTranslati.t;
@@ -12450,6 +12718,7 @@ var WarningListItem = function WarningListItem(_ref) {
12450
12718
  }
12451
12719
  return t('warning-domain-aviation');
12452
12720
  }, [t, warning.warningDetail.domain]);
12721
+ var isChecked = selectedForBatchDelete.includes(warning.id || '');
12453
12722
  return jsxs(ListItem, Object.assign({
12454
12723
  "data-testid": "warning-" + getSortedStatus(status),
12455
12724
  onMouseEnter: function onMouseEnter() {
@@ -12458,24 +12727,40 @@ var WarningListItem = function WarningListItem(_ref) {
12458
12727
  onMouseLeave: function onMouseLeave() {
12459
12728
  return onHoverWarning(undefined);
12460
12729
  },
12461
- secondaryAction: jsx(ToggleMenu, {
12462
- "aria-label": t('warning-list-button-options'),
12463
- buttonIcon: jsx(Options, {}),
12464
- menuItems: WarningListItemMenu({
12465
- warning: warning,
12466
- t: t,
12467
- onEditWarning: onEditWarning,
12468
- onDeleteReviewWarning: onDeleteReviewWarning,
12469
- onDeleteWarning: onDeleteWarning,
12470
- onExpireWarning: onExpireWarning,
12471
- onWithdrawWarning: onWithdrawWarning,
12472
- onActionAviationWarning: onActionAviationWarning,
12473
- onActionMaritimeWarning: onActionMaritimeWarning,
12474
- shouldDisableAviationAmendOption: shouldDisableAviationAmendOption
12475
- }),
12476
- menuPosition: "bottom",
12477
- menuTitle: t('warning-list-button-options'),
12478
- tooltipTitle: t('warning-list-button-options')
12730
+ secondaryAction: jsxs(Fragment, {
12731
+ children: [jsx(ToggleMenu, {
12732
+ "aria-label": t('warning-list-button-options'),
12733
+ buttonIcon: jsx(Options, {}),
12734
+ menuItems: WarningListItemMenu({
12735
+ warning: warning,
12736
+ t: t,
12737
+ onEditWarning: onEditWarning,
12738
+ onDeleteReviewWarning: onDeleteReviewWarning,
12739
+ onDeleteWarning: onDeleteWarning,
12740
+ onExpireWarning: onExpireWarning,
12741
+ onWithdrawWarning: onWithdrawWarning,
12742
+ onActionAviationWarning: onActionAviationWarning,
12743
+ onActionMaritimeWarning: onActionMaritimeWarning,
12744
+ shouldDisableAviationAmendOption: shouldDisableAviationAmendOption
12745
+ }),
12746
+ menuPosition: "bottom",
12747
+ menuTitle: t('warning-list-button-options'),
12748
+ tooltipTitle: t('warning-list-button-options')
12749
+ }), status === PublicWarningStatus.DRAFT || status === PublicWarningStatus.DRAFT_PUBLISHED || status === PublicWarningStatus.TODO ? jsx(Tooltip, {
12750
+ placement: "left",
12751
+ title: t('warning-list-batch-delete-checkbox'),
12752
+ children: jsx(Checkbox, {
12753
+ checked: isChecked,
12754
+ onChange: function onChange(e) {
12755
+ e.stopPropagation();
12756
+ if (warning.id) {
12757
+ toggleWarningForBatchDelete(warning.id);
12758
+ }
12759
+ },
12760
+ role: "checkbox",
12761
+ size: "small"
12762
+ })
12763
+ }) : null]
12479
12764
  }),
12480
12765
  sx: {
12481
12766
  marginBottom: 0.25,
@@ -12485,7 +12770,17 @@ var WarningListItem = function WarningListItem(_ref) {
12485
12770
  borderColor: status === PublicWarningStatus.EXPIRED || status === PublicWarningStatus.WITHDRAWN ? 'geowebColors.cards.cardContainerDisabledBorder' : 'geowebColors.cards.cardContainerBorder',
12486
12771
  borderRadius: 1,
12487
12772
  borderWidth: activeWarningId === warning.id ? '1px' : '1px',
12488
- borderStyle: 'solid'
12773
+ borderStyle: 'solid',
12774
+ '& .MuiListItemButton-root': {
12775
+ paddingRight: '60px'
12776
+ },
12777
+ '& .MuiListItemSecondaryAction-root': {
12778
+ width: '50px',
12779
+ right: '8px'
12780
+ },
12781
+ '& .MuiCheckbox-root': {
12782
+ padding: '2px'
12783
+ }
12489
12784
  }
12490
12785
  }, props, {
12491
12786
  children: [jsx(CustomTooltip, {
@@ -13295,6 +13590,8 @@ var RowComponent = function RowComponent(_ref) {
13295
13590
  expandedSections = _ref.expandedSections,
13296
13591
  hoveredFeatureId = _ref.hoveredFeatureId,
13297
13592
  selectedWarningId = _ref.selectedWarningId,
13593
+ selectedForBatchDelete = _ref.selectedForBatchDelete,
13594
+ toggleWarningForBatchDelete = _ref.toggleWarningForBatchDelete,
13298
13595
  onHoverWarning = _ref.onHoverWarning,
13299
13596
  onSelectWarning = _ref.onSelectWarning,
13300
13597
  onEditWarning = _ref.onEditWarning,
@@ -13341,8 +13638,10 @@ var RowComponent = function RowComponent(_ref) {
13341
13638
  onSelectWarning: onSelectWarning,
13342
13639
  onToggleVisibility: onToggleWarningVisibility,
13343
13640
  onWithdrawWarning: onWithdrawWarning,
13641
+ selectedForBatchDelete: selectedForBatchDelete,
13344
13642
  shouldDisableAviationAmendOption: shouldDisableAviationAmendOption,
13345
13643
  style: style,
13644
+ toggleWarningForBatchDelete: toggleWarningForBatchDelete,
13346
13645
  warning: publicWarning
13347
13646
  }, key);
13348
13647
  };
@@ -13414,6 +13713,8 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13414
13713
  onActionAviationWarning = _ref2$onActionAviatio === void 0 ? function () {} : _ref2$onActionAviatio,
13415
13714
  _ref2$onActionMaritim = _ref2.onActionMaritimeWarning,
13416
13715
  onActionMaritimeWarning = _ref2$onActionMaritim === void 0 ? function () {} : _ref2$onActionMaritim,
13716
+ _ref2$onClickBatchDel = _ref2.onClickBatchDelete,
13717
+ onClickBatchDelete = _ref2$onClickBatchDel === void 0 ? function () {} : _ref2$onClickBatchDel,
13417
13718
  hoveredFeatureId = _ref2.hoveredFeatureId,
13418
13719
  expandedSections = _ref2.expandedSections,
13419
13720
  setExpandedSections = _ref2.setExpandedSections,
@@ -13423,7 +13724,15 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13423
13724
  _ref2$shouldDisableAv = _ref2.shouldDisableAviationAmendOption,
13424
13725
  shouldDisableAviationAmendOption = _ref2$shouldDisableAv === void 0 ? false : _ref2$shouldDisableAv,
13425
13726
  hiddenWarningIds = _ref2.hiddenWarningIds,
13426
- onToggleWarningVisibility = _ref2.onToggleWarningVisibility;
13727
+ onToggleWarningVisibility = _ref2.onToggleWarningVisibility,
13728
+ _ref2$selectedForBatc = _ref2.selectedForBatchDelete,
13729
+ selectedForBatchDelete = _ref2$selectedForBatc === void 0 ? [] : _ref2$selectedForBatc,
13730
+ _ref2$toggleWarningFo = _ref2.toggleWarningForBatchDelete,
13731
+ toggleWarningForBatchDelete = _ref2$toggleWarningFo === void 0 ? function () {} : _ref2$toggleWarningFo,
13732
+ _ref2$onSelectAllForB = _ref2.onSelectAllForBatchDelete,
13733
+ onSelectAllForBatchDelete = _ref2$onSelectAllForB === void 0 ? function () {} : _ref2$onSelectAllForB,
13734
+ _ref2$onClearBatchDel = _ref2.onClearBatchDeleteSelection,
13735
+ onClearBatchDeleteSelection = _ref2$onClearBatchDel === void 0 ? function () {} : _ref2$onClearBatchDel;
13427
13736
  var updateFilter = filterHookState.updateFilter,
13428
13737
  allSelected = filterHookState.allSelected,
13429
13738
  filterState = filterHookState.filterState,
@@ -13507,6 +13816,24 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13507
13816
  }
13508
13817
  }, [listRef, resetListIndex, warnings]);
13509
13818
  var filterHeight = useGetFilterHeight(filterRef);
13819
+ var warningIdSet = React.useMemo(function () {
13820
+ return new Set(warnings.map(function (warning) {
13821
+ return warning.id;
13822
+ }).filter(function (id) {
13823
+ return !!id;
13824
+ }));
13825
+ }, [warnings]);
13826
+ var selectedForBatchDeleteFiltered = React.useMemo(function () {
13827
+ return selectedForBatchDelete.filter(function (id) {
13828
+ return warningIdSet.has(id);
13829
+ });
13830
+ }, [selectedForBatchDelete, warningIdSet]);
13831
+ var batchDeletableWarningIds = React.useMemo(function () {
13832
+ return getBatchDeletableWarningIds(warnings);
13833
+ }, [warnings]);
13834
+ var batchSelectionState = React.useMemo(function () {
13835
+ return getBatchSelectionState(selectedForBatchDeleteFiltered, batchDeletableWarningIds);
13836
+ }, [batchDeletableWarningIds, selectedForBatchDeleteFiltered]);
13510
13837
  return jsxs(Fragment, {
13511
13838
  children: [isLoading ? jsx(LinearProgress, {
13512
13839
  color: "secondary",
@@ -13574,66 +13901,107 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13574
13901
  container: true,
13575
13902
  rowSpacing: 0,
13576
13903
  size: "grow",
13577
- sx: (_sx = {
13904
+ sx: {
13578
13905
  alignItems: 'center',
13579
- justifyContent: 'space-between',
13580
13906
  maxWidth: '100%',
13581
- display: 'none',
13582
- marginTop: '4px'
13583
- }, _sx["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
13584
- display: 'flex'
13585
- }, _sx),
13586
- children: [jsx(WarningListHeaderContent, {
13907
+ display: 'flex',
13908
+ marginTop: '4px',
13909
+ height: '24px'
13910
+ },
13911
+ children: [jsx(Box, {
13587
13912
  sx: {
13588
- paddingLeft: 2
13589
- },
13590
- title: t('warning-list-header-incidents')
13591
- }), jsx(WarningListHeaderContent, {
13592
- isSorted: sortState.key === 'lastUpdatedTime',
13593
- onClick: function onClick() {
13594
- return toggleSortDirection('lastUpdatedTime');
13595
- },
13596
- sortDirection: sortState.direction,
13597
- sortable: true,
13598
- title: t('warning-list-header-last-update') + " UTC",
13599
- width: 142
13600
- }), jsx(WarningListHeaderContent, {
13601
- isSorted: sortState.key === 'validFrom',
13602
- onClick: function onClick() {
13603
- return toggleSortDirection('validFrom');
13604
- },
13605
- sortDirection: sortState.direction,
13606
- sortable: true,
13607
- title: t('warning-list-header-start-time') + " UTC",
13608
- width: 142
13609
- }), jsx(WarningListHeaderContent, {
13610
- isSorted: sortState.key === 'validUntil',
13611
- onClick: function onClick() {
13612
- return toggleSortDirection('validUntil');
13913
+ display: 'flex',
13914
+ flex: 1,
13915
+ minWidth: 0
13613
13916
  },
13614
- sortDirection: sortState.direction,
13615
- sortable: true,
13616
- title: t('warning-list-header-end-time') + " UTC",
13617
- width: 142
13618
- }), jsx(WarningListHeaderContent, {
13619
- title: t('warning-list-header-domains')
13620
- }), jsx(WarningListHeaderContent, {
13621
- title: t('warning-list-header-phenomena'),
13622
- width: 140
13623
- }), jsx(WarningListHeaderContent, {
13624
- sx: (_sx2 = {}, _sx2["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
13625
- width: 56
13626
- }, _sx2),
13627
- title: t('warning-list-header-levels')
13628
- }), jsx(WarningListHeaderContent, {
13629
- title: t('areas'),
13630
- width: 100
13631
- }), jsx(WarningListHeaderContent, {
13917
+ children: jsxs(Grid, {
13918
+ container: true,
13919
+ size: "grow",
13920
+ sx: (_sx = {
13921
+ display: 'none',
13922
+ alignItems: 'center',
13923
+ justifyContent: 'space-between',
13924
+ maxWidth: '100%'
13925
+ }, _sx["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
13926
+ display: 'flex'
13927
+ }, _sx),
13928
+ children: [jsx(WarningListHeaderContent, {
13929
+ sx: {
13930
+ paddingLeft: 2
13931
+ },
13932
+ title: t('warning-list-header-incidents')
13933
+ }), jsx(WarningListHeaderContent, {
13934
+ isSorted: sortState.key === 'lastUpdatedTime',
13935
+ onClick: function onClick() {
13936
+ return toggleSortDirection('lastUpdatedTime');
13937
+ },
13938
+ sortDirection: sortState.direction,
13939
+ sortable: true,
13940
+ title: t('warning-list-header-last-update') + " UTC",
13941
+ width: 142
13942
+ }), jsx(WarningListHeaderContent, {
13943
+ isSorted: sortState.key === 'validFrom',
13944
+ onClick: function onClick() {
13945
+ return toggleSortDirection('validFrom');
13946
+ },
13947
+ sortDirection: sortState.direction,
13948
+ sortable: true,
13949
+ title: t('warning-list-header-start-time') + " UTC",
13950
+ width: 142
13951
+ }), jsx(WarningListHeaderContent, {
13952
+ isSorted: sortState.key === 'validUntil',
13953
+ onClick: function onClick() {
13954
+ return toggleSortDirection('validUntil');
13955
+ },
13956
+ sortDirection: sortState.direction,
13957
+ sortable: true,
13958
+ title: t('warning-list-header-end-time') + " UTC",
13959
+ width: 142
13960
+ }), jsx(WarningListHeaderContent, {
13961
+ title: t('warning-list-header-domains')
13962
+ }), jsx(WarningListHeaderContent, {
13963
+ title: t('warning-list-header-phenomena'),
13964
+ width: 140
13965
+ }), jsx(WarningListHeaderContent, {
13966
+ sx: (_sx2 = {}, _sx2["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
13967
+ width: 56
13968
+ }, _sx2),
13969
+ title: t('warning-list-header-levels')
13970
+ }), jsx(WarningListHeaderContent, {
13971
+ title: t('areas'),
13972
+ width: 100
13973
+ }), jsx(WarningListHeaderContent, {
13974
+ sx: {
13975
+ marginRight: '48px'
13976
+ },
13977
+ title: t('warning-list-header-status'),
13978
+ width: 76
13979
+ })]
13980
+ })
13981
+ }), jsxs(Box, {
13632
13982
  sx: {
13633
- marginRight: '48px'
13983
+ width: '60px',
13984
+ flexShrink: 0,
13985
+ display: 'flex',
13986
+ alignItems: 'flex-end',
13987
+ justifyContent: 'flex-end'
13634
13988
  },
13635
- title: t('warning-list-header-status'),
13636
- width: 76
13989
+ children: [selectedForBatchDeleteFiltered.length > 0 && jsx(CustomIconButton, {
13990
+ "data-testid": "batch-delete-button",
13991
+ onClick: function onClick() {
13992
+ onClickBatchDelete(selectedForBatchDelete);
13993
+ },
13994
+ tooltipTitle: t('warning-dialog-delete-all-button'),
13995
+ variant: "tool",
13996
+ children: jsx(Delete, {})
13997
+ }), jsx(SelectAllButton, {
13998
+ disabled: batchDeletableWarningIds.length === 0,
13999
+ onSelectAll: function onSelectAll() {
14000
+ onSelectAllForBatchDelete(batchDeletableWarningIds);
14001
+ },
14002
+ onSelectNone: onClearBatchDeleteSelection,
14003
+ selectionState: batchSelectionState
14004
+ })]
13637
14005
  })]
13638
14006
  }), sortedWarnings && !error ? jsx(Box, {
13639
14007
  "data-testid": "warnings-list",
@@ -13667,7 +14035,9 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13667
14035
  onActionMaritimeWarning: onActionMaritimeWarning,
13668
14036
  shouldDisableAviationAmendOption: shouldDisableAviationAmendOption,
13669
14037
  hiddenWarningIds: hiddenWarningIds,
13670
- onToggleWarningVisibility: onToggleWarningVisibility
14038
+ onToggleWarningVisibility: onToggleWarningVisibility,
14039
+ selectedForBatchDelete: selectedForBatchDelete,
14040
+ toggleWarningForBatchDelete: toggleWarningForBatchDelete
13671
14041
  }
13672
14042
  })
13673
14043
  }) : null]
@@ -13695,7 +14065,7 @@ var ConfirmDeleteWarningDialog = function ConfirmDeleteWarningDialog(_ref) {
13695
14065
  setError = _React$useState2[1];
13696
14066
  var onSubmit = /*#__PURE__*/function () {
13697
14067
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
13698
- var _t;
14068
+ var result, _t;
13699
14069
  return _regenerator().w(function (_context) {
13700
14070
  while (1) switch (_context.p = _context.n) {
13701
14071
  case 0:
@@ -13704,7 +14074,8 @@ var ConfirmDeleteWarningDialog = function ConfirmDeleteWarningDialog(_ref) {
13704
14074
  _context.n = 2;
13705
14075
  return request();
13706
14076
  case 2:
13707
- callback == null || callback();
14077
+ result = _context.v;
14078
+ callback == null || callback(result);
13708
14079
  setIsLoading(false);
13709
14080
  _context.n = 4;
13710
14081
  break;
@@ -14119,10 +14490,10 @@ var CancelAviationDialogContent = function CancelAviationDialogContent(_ref) {
14119
14490
  maxWidth: 600
14120
14491
  },
14121
14492
  children: [jsx(Typography, {
14122
- variant: "inherit",
14123
14493
  sx: {
14124
14494
  fontWeight: 'medium'
14125
14495
  },
14496
+ variant: "inherit",
14126
14497
  children: t('cancel-message')
14127
14498
  }), jsx("div", {
14128
14499
  style: {
@@ -14137,10 +14508,10 @@ var CancelAviationDialogContent = function CancelAviationDialogContent(_ref) {
14137
14508
  children: cancelContent
14138
14509
  })
14139
14510
  }), jsx(Typography, {
14140
- variant: "inherit",
14141
14511
  sx: {
14142
14512
  fontWeight: 'medium'
14143
14513
  },
14514
+ variant: "inherit",
14144
14515
  children: t('will-cancel-message')
14145
14516
  }), jsx("div", {
14146
14517
  style: {
@@ -14277,6 +14648,25 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14277
14648
  var panelId = _ref.panelId,
14278
14649
  presetExpandedSections = _ref.presetExpandedSections,
14279
14650
  presetFilterState = _ref.presetFilterState;
14651
+ var _React$useState = React.useState([]),
14652
+ selectedForBatchDelete = _React$useState[0],
14653
+ setSelectedForBatchDelete = _React$useState[1];
14654
+ var toggleWarningForBatchDelete = React.useCallback(function (warningId) {
14655
+ setSelectedForBatchDelete(function (prev) {
14656
+ if (prev.includes(warningId)) {
14657
+ return prev.filter(function (id) {
14658
+ return id !== warningId;
14659
+ });
14660
+ }
14661
+ return [].concat(prev, [warningId]);
14662
+ });
14663
+ }, []);
14664
+ var selectAllForBatchDelete = React.useCallback(function (warningIds) {
14665
+ setSelectedForBatchDelete(Array.from(new Set(warningIds)));
14666
+ }, []);
14667
+ var clearBatchDeleteSelection = React.useCallback(function () {
14668
+ setSelectedForBatchDelete([]);
14669
+ }, []);
14280
14670
  var updatePublicWarningEditor = useMutatePublicWarningEditor();
14281
14671
  var _useMutateMaritimeWar = useMutateMaritimeWarningsEditor(),
14282
14672
  updateMaritimeWarningEditor = _useMutateMaritimeWar.mutateAsync;
@@ -14304,9 +14694,9 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14304
14694
  dataUpdatedAt = _useWarnings.dataUpdatedAt;
14305
14695
  useAutoRefetchOnExpiry(combinedWarnings, refetchWarnings);
14306
14696
  var lastUpdateTime = dateUtils.dateToString(new Date(dataUpdatedAt), dateUtils.DATE_FORMAT_HOURS);
14307
- var _React$useState = React.useState(undefined),
14308
- confirmDialogOptions = _React$useState[0],
14309
- setConfirmDialogOptions = _React$useState[1];
14697
+ var _React$useState2 = React.useState(undefined),
14698
+ confirmDialogOptions = _React$useState2[0],
14699
+ setConfirmDialogOptions = _React$useState2[1];
14310
14700
  var selectedWarningId = useSelector(getSelectedWarningId);
14311
14701
  var selectedFormWarning = useSelector(getPublicWarning);
14312
14702
  var isFormDirty = useSelector(getSelectedPublicIsFormDirty);
@@ -14516,9 +14906,9 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14516
14906
  return _ref5.apply(this, arguments);
14517
14907
  };
14518
14908
  }();
14519
- var _React$useState2 = React.useState(new Set()),
14520
- hiddenWarningIds = _React$useState2[0],
14521
- setHiddenWarningIds = _React$useState2[1];
14909
+ var _React$useState3 = React.useState(new Set()),
14910
+ hiddenWarningIds = _React$useState3[0],
14911
+ setHiddenWarningIds = _React$useState3[1];
14522
14912
  var handleToggleWarningVisibility = React.useCallback(function (warningId) {
14523
14913
  setHiddenWarningIds(function (prev) {
14524
14914
  var next = new Set(prev);
@@ -14530,12 +14920,12 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14530
14920
  return next;
14531
14921
  });
14532
14922
  }, []);
14533
- var _React$useState3 = React.useState(false),
14534
- cancelOpen = _React$useState3[0],
14535
- setCancelOpen = _React$useState3[1];
14536
- var _React$useState4 = React.useState(null),
14537
- cancelCtx = _React$useState4[0],
14538
- setCancelCtx = _React$useState4[1];
14923
+ var _React$useState4 = React.useState(false),
14924
+ cancelOpen = _React$useState4[0],
14925
+ setCancelOpen = _React$useState4[1];
14926
+ var _React$useState5 = React.useState(null),
14927
+ cancelCtx = _React$useState5[0],
14928
+ setCancelCtx = _React$useState5[1];
14539
14929
  var openCancelDialog = function openCancelDialog(warning) {
14540
14930
  var type = warning.warningDetail.level === 'SIG' ? 'sigmet' : 'airmet';
14541
14931
  var product = warning.sigmetAirmetDetails;
@@ -14842,6 +15232,19 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14842
15232
  var displayedWarnings = React.useMemo(function () {
14843
15233
  return shouldShowAlertBanner ? [] : filteredWarnings;
14844
15234
  }, [shouldShowAlertBanner, filteredWarnings]);
15235
+ React.useEffect(function () {
15236
+ setSelectedForBatchDelete(function (prev) {
15237
+ var visibleIds = new Set(displayedWarnings.map(function (warning) {
15238
+ return warning.id;
15239
+ }).filter(function (id) {
15240
+ return !!id;
15241
+ }));
15242
+ var next = prev.filter(function (id) {
15243
+ return visibleIds.has(id);
15244
+ });
15245
+ return next.length === prev.length ? prev : next;
15246
+ });
15247
+ }, [displayedWarnings]);
14845
15248
  var expandedSections = useSelector(function (store) {
14846
15249
  return getExpandedSectionsByPanelId(store, panelId);
14847
15250
  });
@@ -14952,12 +15355,12 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14952
15355
  var _workspaceViewsById$t;
14953
15356
  return (workspaceViewsById == null || (_workspaceViewsById$t = workspaceViewsById[targetId]) == null ? void 0 : _workspaceViewsById$t.componentType) === 'WarningsTimeline';
14954
15357
  });
14955
- var _React$useState5 = React.useState(undefined),
14956
- localHoveredWarningId = _React$useState5[0],
14957
- setLocalHoveredWarningId = _React$useState5[1];
14958
- var _React$useState6 = React.useState(false),
14959
- isUsingLocalHoverOverride = _React$useState6[0],
14960
- setIsUsingLocalHoverOverride = _React$useState6[1];
15358
+ var _React$useState6 = React.useState(undefined),
15359
+ localHoveredWarningId = _React$useState6[0],
15360
+ setLocalHoveredWarningId = _React$useState6[1];
15361
+ var _React$useState7 = React.useState(false),
15362
+ isUsingLocalHoverOverride = _React$useState7[0],
15363
+ setIsUsingLocalHoverOverride = _React$useState7[1];
14961
15364
  var hoverDispatchTimeoutRef = React.useRef(undefined);
14962
15365
  var hoveredFeatureId = isUsingLocalHoverOverride ? localHoveredWarningId : (_hoveredLinkedFeature = hoveredLinkedFeatureIds[0]) != null ? _hoveredLinkedFeature : hoveredLocalWarningIds[0];
14963
15366
  var handleHoverWarning = React.useCallback(function (warningId) {
@@ -15008,6 +15411,143 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
15008
15411
  });
15009
15412
  };
15010
15413
  }, [dispatch, panelId, store]);
15414
+ var doBatchDelete = /*#__PURE__*/function () {
15415
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee11(warningIds) {
15416
+ var warningsById, promises, results;
15417
+ return _regenerator().w(function (_context11) {
15418
+ while (1) switch (_context11.n) {
15419
+ case 0:
15420
+ warningsById = new Map(displayedWarnings.map(function (warning) {
15421
+ return [warning.id, warning];
15422
+ }));
15423
+ promises = warningIds.flatMap(function (warningId) {
15424
+ var warning = warningsById.get(warningId);
15425
+ if (!warning) {
15426
+ return [];
15427
+ }
15428
+ if (warning.type === 'public') {
15429
+ var promise = warning.status === PublicWarningStatus.TODO ? saveWarning({
15430
+ id: warning.id,
15431
+ data: Object.assign({}, warning, {
15432
+ status: PublicWarningStatus.IGNORED,
15433
+ type: 'public'
15434
+ })
15435
+ }) : deletePublicWarning({
15436
+ id: warningId
15437
+ });
15438
+ return [{
15439
+ id: warningId,
15440
+ promise: promise
15441
+ }];
15442
+ }
15443
+ if (warning.type === 'airmet' || warning.type === 'sigmet') {
15444
+ return [{
15445
+ id: warningId,
15446
+ promise: postAviationProduct(warning.sigmetAirmetDetails, 'DISCARDED', warning.type)
15447
+ }];
15448
+ }
15449
+ // Maritime warnings are ignored as they cannot have status DRAFT/TODO
15450
+ return [];
15451
+ }); // Correct version
15452
+ _context11.n = 1;
15453
+ return Promise.allSettled(promises.map(/*#__PURE__*/function () {
15454
+ var _ref0 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee10(_ref9) {
15455
+ var promise;
15456
+ return _regenerator().w(function (_context10) {
15457
+ while (1) switch (_context10.n) {
15458
+ case 0:
15459
+ promise = _ref9.promise;
15460
+ return _context10.a(2, promise);
15461
+ }
15462
+ }, _callee10);
15463
+ }));
15464
+ return function (_x12) {
15465
+ return _ref0.apply(this, arguments);
15466
+ };
15467
+ }()));
15468
+ case 1:
15469
+ results = _context11.v;
15470
+ return _context11.a(2, promises.filter(function (_, index) {
15471
+ return results[index].status === 'fulfilled';
15472
+ }).map(function (_ref1) {
15473
+ var id = _ref1.id;
15474
+ return id;
15475
+ }));
15476
+ }
15477
+ }, _callee11);
15478
+ }));
15479
+ return function doBatchDelete(_x11) {
15480
+ return _ref8.apply(this, arguments);
15481
+ };
15482
+ }();
15483
+ var onClickBatchDelete = function onClickBatchDelete(warningIds) {
15484
+ // Filter out any warnings that are excluded because of the filter
15485
+ var warningIdSet = new Set(displayedWarnings.map(function (warning) {
15486
+ return warning.id;
15487
+ }));
15488
+ var filteredWarningIds = warningIds.filter(function (id) {
15489
+ return warningIdSet.has(id);
15490
+ });
15491
+ var isLocked = filteredWarningIds.some(function (warningId) {
15492
+ var _fullWarning$editor, _auth$username4;
15493
+ var fullWarning = displayedWarnings.find(function (warning) {
15494
+ return warning.id === warningId;
15495
+ });
15496
+ var editor = (_fullWarning$editor = fullWarning == null ? void 0 : fullWarning.editor) != null ? _fullWarning$editor : '';
15497
+ var currentUser = (_auth$username4 = auth == null ? void 0 : auth.username) != null ? _auth$username4 : '';
15498
+ return editor !== '' && editor !== currentUser;
15499
+ });
15500
+ setConfirmDialogOptions({
15501
+ confirmLabel: t('warning-dialog-delete-all-confirm'),
15502
+ title: t('warning-dialog-delete-all-title'),
15503
+ description: t('warning-dialog-delete-all-description', {
15504
+ ns: WARN_NAMESPACE,
15505
+ NUMBER: filteredWarningIds.length
15506
+ }),
15507
+ request: function () {
15508
+ var _request7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee12() {
15509
+ return _regenerator().w(function (_context12) {
15510
+ while (1) switch (_context12.n) {
15511
+ case 0:
15512
+ return _context12.a(2, doBatchDelete(filteredWarningIds));
15513
+ }
15514
+ }, _callee12);
15515
+ }));
15516
+ function request() {
15517
+ return _request7.apply(this, arguments);
15518
+ }
15519
+ return request;
15520
+ }(),
15521
+ callback: function callback(data) {
15522
+ var successfulIds = data || [];
15523
+ if (filteredWarningIds.includes(selectedWarningId)) {
15524
+ dispatch(uiActions.setToggleOpenDialog({
15525
+ setOpen: false,
15526
+ type: publicWarningDialogType
15527
+ }));
15528
+ }
15529
+ // Only show snackbar and remove from selection if there were successes
15530
+ if (successfulIds.length > 0) {
15531
+ openSnackbar(t('warning-dialog-delete-all-succes'));
15532
+ setSelectedForBatchDelete(function (prev) {
15533
+ return prev.filter(function (id) {
15534
+ return !successfulIds.includes(id);
15535
+ });
15536
+ });
15537
+ }
15538
+ var failedCount = filteredWarningIds.length - successfulIds.length;
15539
+ if (failedCount > 0) {
15540
+ throw new Error(t('warning-dialog-delete-all-failed', {
15541
+ NUMBER: failedCount
15542
+ }));
15543
+ } else {
15544
+ setConfirmDialogOptions(undefined);
15545
+ }
15546
+ refetchWarnings();
15547
+ },
15548
+ isLocked: isLocked
15549
+ });
15550
+ };
15011
15551
  return isLoggedIn ? jsxs(Fragment, {
15012
15552
  children: [jsx(PublicWarningList, {
15013
15553
  error: error != null ? error : undefined,
@@ -15020,6 +15560,8 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
15020
15560
  limitAlertCount: filteredWarnings.length,
15021
15561
  onActionAviationWarning: handleAviationProductClick,
15022
15562
  onActionMaritimeWarning: handleMaritimeProductClick,
15563
+ onClearBatchDeleteSelection: clearBatchDeleteSelection,
15564
+ onClickBatchDelete: onClickBatchDelete,
15023
15565
  onCreateWarning: createWarning,
15024
15566
  onDeleteReviewWarning: deleteReviewWarning,
15025
15567
  onDeleteWarning: deleteWarning,
@@ -15027,13 +15569,16 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
15027
15569
  onExpireWarning: expireWarning,
15028
15570
  onHoverWarning: handleHoverWarning,
15029
15571
  onRefetchWarnings: refetchWarnings,
15572
+ onSelectAllForBatchDelete: selectAllForBatchDelete,
15030
15573
  onSelectWarning: selectWarning,
15031
15574
  onToggleWarningVisibility: handleToggleWarningVisibility,
15032
15575
  onWithdrawWarning: withdrawWarning,
15576
+ selectedForBatchDelete: selectedForBatchDelete,
15033
15577
  selectedWarningId: selectedWarningId,
15034
15578
  setExpandedSections: setExpandedSections,
15035
15579
  shouldDisableAviationAmendOption: (aviationConfig == null ? void 0 : aviationConfig.disable_amend_action) === true,
15036
15580
  showLimitAlert: shouldShowAlertBanner,
15581
+ toggleWarningForBatchDelete: toggleWarningForBatchDelete,
15037
15582
  warnings: displayedWarnings
15038
15583
  }), confirmDialogOptions ? jsx(ConfirmDeleteWarningDialog, {
15039
15584
  callback: confirmDialogOptions.callback,
@@ -15048,15 +15593,15 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
15048
15593
  }) : null, !!cancelCtx && jsx(CancelAviationConfirmDialog, {
15049
15594
  aviationConfig: aviationConfig,
15050
15595
  cancelAviationProduct: function () {
15051
- var _cancelAviationProduct2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee10(product, t, opts) {
15052
- return _regenerator().w(function (_context10) {
15053
- while (1) switch (_context10.n) {
15596
+ var _cancelAviationProduct2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee13(product, t, opts) {
15597
+ return _regenerator().w(function (_context13) {
15598
+ while (1) switch (_context13.n) {
15054
15599
  case 0:
15055
- return _context10.a(2, _cancelAviationProduct(product, t, opts));
15600
+ return _context13.a(2, _cancelAviationProduct(product, t, opts));
15056
15601
  }
15057
- }, _callee10);
15602
+ }, _callee13);
15058
15603
  }));
15059
- function cancelAviationProduct(_x11, _x12, _x13) {
15604
+ function cancelAviationProduct(_x13, _x14, _x15) {
15060
15605
  return _cancelAviationProduct2.apply(this, arguments);
15061
15606
  }
15062
15607
  return cancelAviationProduct;
@@ -15760,8 +16305,8 @@ var WarningsTimeline = function WarningsTimeline(_ref) {
15760
16305
  var _loop = function _loop() {
15761
16306
  var entry = _step.value;
15762
16307
  var nextSize = {
15763
- width: entry.contentRect.width,
15764
- height: entry.contentRect.height
16308
+ width: Math.round(entry.contentRect.width),
16309
+ height: Math.round(entry.contentRect.height)
15765
16310
  };
15766
16311
  setContainerSize(function (currentSize) {
15767
16312
  return currentSize.width === nextSize.width && currentSize.height === nextSize.height ? currentSize : nextSize;
@@ -15926,6 +16471,7 @@ var WarningsTimeline = function WarningsTimeline(_ref) {
15926
16471
  sx: {
15927
16472
  flex: 1,
15928
16473
  overflow: 'auto',
16474
+ scrollbarGutter: 'stable',
15929
16475
  minHeight: 0
15930
16476
  },
15931
16477
  children: jsx(Box$1, {
@@ -3,7 +3,7 @@ import type { AirmetFromBackend, SigmetFromBackend } from '@opengeoweb/api';
3
3
  export interface ConfirmDialogProps {
4
4
  title: string;
5
5
  description: string;
6
- request: () => Promise<void> | Promise<Headers | null> | Promise<SigmetFromBackend | AirmetFromBackend>;
6
+ request: () => Promise<void> | Promise<Headers | null> | Promise<SigmetFromBackend | AirmetFromBackend> | Promise<string[]>;
7
7
  confirmLabel: string;
8
8
  callback?: (data?: unknown) => void;
9
9
  isLocked?: boolean;
@@ -17,11 +17,16 @@ export interface PublicWarningListProps extends WarningListItemActions {
17
17
  setExpandedSections: (expandedSections: Record<string, boolean>) => void;
18
18
  onHoverWarning?: (warningId?: string) => void;
19
19
  onActionAviationWarning?: () => void;
20
+ onClickBatchDelete?: (warningIds: string[]) => void;
20
21
  limitAlertCount?: number;
21
22
  showLimitAlert?: boolean;
22
23
  shouldDisableAviationAmendOption: boolean;
23
24
  hiddenWarningIds?: Set<string>;
24
25
  onToggleWarningVisibility?: (warningId: string) => void;
26
+ selectedForBatchDelete?: string[];
27
+ toggleWarningForBatchDelete?: (warningId: string) => void;
28
+ onSelectAllForBatchDelete?: (warningIds: string[]) => void;
29
+ onClearBatchDeleteSelection?: () => void;
25
30
  }
26
31
  export declare const PublicWarningList: React.FC<PublicWarningListProps>;
27
32
  export default PublicWarningList;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { BatchSelectionState } from './selectAllButtonUtils';
3
+ export interface SelectAllButtonProps {
4
+ selectionState: BatchSelectionState;
5
+ onSelectAll: () => void;
6
+ onSelectNone: () => void;
7
+ disabled?: boolean;
8
+ }
9
+ export declare const SelectAllButton: React.FC<SelectAllButtonProps>;
@@ -0,0 +1,2 @@
1
+ export * from './SelectAllButton';
2
+ export * from './selectAllButtonUtils';
@@ -0,0 +1,7 @@
1
+ import type { Warning } from '../../../store/warningsForm/types';
2
+ import { PublicWarningStatus } from '../../../store/warningsForm/types';
3
+ export type BatchSelectionState = 'none' | 'some' | 'all';
4
+ export declare const getWarningStatus: (warning: Warning) => PublicWarningStatus;
5
+ export declare const isWarningSelectableForBatchDelete: (warning: Warning) => boolean;
6
+ export declare const getBatchDeletableWarningIds: (warnings: Warning[]) => string[];
7
+ export declare const getBatchSelectionState: (selectedIds: string[], deletableIds: string[]) => BatchSelectionState;
@@ -11,6 +11,8 @@ export interface WarningListItemProps extends ListItemProps, WarningListItemActi
11
11
  shouldDisableAviationAmendOption?: boolean;
12
12
  isHidden?: boolean;
13
13
  onToggleVisibility?: (warningId: string) => void;
14
+ selectedForBatchDelete?: string[];
15
+ toggleWarningForBatchDelete?: (warningId: string) => void;
14
16
  }
15
17
  declare const WarningListItem: React.FC<WarningListItemProps>;
16
18
  export default WarningListItem;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/warnings",
3
- "version": "19.1.1",
3
+ "version": "19.2.0",
4
4
  "description": "GeoWeb warinings library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {