@opengeoweb/warnings 19.1.1 → 19.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/index.esm.js +3000 -993
  2. package/dist/src/index.d.ts +2 -0
  3. package/dist/src/lib/api/warning-api/api.d.ts +6 -1
  4. package/dist/src/lib/components/PublicWarningList/ConfirmWarningDialog.d.ts +1 -1
  5. package/dist/src/lib/components/PublicWarningList/PublicWarningList.d.ts +5 -0
  6. package/dist/src/lib/components/PublicWarningList/PublicWarningListConnect.d.ts +0 -1
  7. package/dist/src/lib/components/PublicWarningList/SelectAllButton/SelectAllButton.d.ts +9 -0
  8. package/dist/src/lib/components/PublicWarningList/SelectAllButton/index.d.ts +2 -0
  9. package/dist/src/lib/components/PublicWarningList/SelectAllButton/selectAllButtonUtils.d.ts +7 -0
  10. package/dist/src/lib/components/PublicWarningList/WarningListItem.d.ts +2 -0
  11. package/dist/src/lib/components/PublicWarningList/useWarningListFeatureSync.d.ts +15 -0
  12. package/dist/src/lib/components/PublicWarningList/warningListFeatureSyncUtils.d.ts +15 -0
  13. package/dist/src/lib/components/WarningEvents/WarningEventDialog/WarningEventDialog.d.ts +16 -0
  14. package/dist/src/lib/components/WarningEvents/WarningEventDialog/WarningEventDialogConnect.d.ts +11 -0
  15. package/dist/src/lib/components/WarningEvents/WarningEventDialog/index.d.ts +4 -0
  16. package/dist/src/lib/components/WarningEvents/WarningEventForm/WarningEventFormContent.d.ts +11 -0
  17. package/dist/src/lib/components/WarningEvents/WarningEventForm/WarningEventItem.d.ts +9 -0
  18. package/dist/src/lib/components/WarningEvents/WarningEventForm/WarningEventTimeline/WarningEventTimeline.d.ts +16 -0
  19. package/dist/src/lib/components/WarningEvents/WarningEventForm/WarningEventTimeline/WarningEventTimelineBlock.d.ts +12 -0
  20. package/dist/src/lib/components/WarningEvents/WarningEventForm/WarningEventTimeline/WarningEventTimelineContext.d.ts +7 -0
  21. package/dist/src/lib/components/WarningEvents/WarningEventForm/WarningEventTimeline/getTimelineRange.d.ts +5 -0
  22. package/dist/src/lib/components/WarningEvents/WarningEventForm/WarningEventTimeline/index.d.ts +3 -0
  23. package/dist/src/lib/components/WarningEvents/WarningEventForm/index.d.ts +2 -0
  24. package/dist/src/lib/components/WarningEvents/WarningEventForm/types.d.ts +11 -0
  25. package/dist/src/lib/components/WarningEvents/WarningEventForm/warningEventStoryData.d.ts +14 -0
  26. package/dist/src/lib/components/WarningEvents/WarningEventSummaryDialog/WarningEventSummaryDialog.d.ts +15 -0
  27. package/dist/src/lib/components/WarningEvents/WarningEventSummaryDialog/WarningEventSummaryForm.d.ts +12 -0
  28. package/dist/src/lib/components/WarningEvents/WarningEventSummaryDialog/index.d.ts +1 -0
  29. package/dist/src/lib/store/warningsForm/types.d.ts +28 -1
  30. package/dist/src/lib/store/warningsForm/utils.d.ts +1 -0
  31. package/dist/src/lib/utils/fakeApi/index.d.ts +1 -0
  32. package/package.json +2 -2
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
- 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';
3
+ import { uiTypes, uiActions, getSingularDrawtoolDrawLayerId, drawingToolSelectors, layerSelectors, uiSelectors, layerActions, drawingToolActions, mapListener, layersListener, drawingToolListener, syncGroupsListener, openlayersListener, syncGroupsReducer, drawingToolReducer, uiReducer, layerReducer, mapReducer, useSetupDialog, layerUtils, PUBLIC_WARNING_DRAW_TOOL_ID, 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, Notifications, AlertBadge, 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,13 +13,13 @@ 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, ListSubheader, ListItemText, ListItemIcon, Chip, 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';
20
20
  import { List, useListRef } from 'react-window';
21
- import { isEqual, cloneDeep, clamp, concat, groupBy, pick } from 'lodash';
22
- import { useFormContext, useForm, FormProvider } from 'react-hook-form';
21
+ import { isEqual, cloneDeep, clamp as clamp$1, concat, groupBy, pick } from 'lodash';
22
+ import { useFormContext, useForm, FormProvider, useWatch, useFieldArray } from 'react-hook-form';
23
23
  import { isEmpty, createEmpty, extend } from 'ol/extent';
24
24
  import GeoJSON from 'ol/format/GeoJSON';
25
25
  import { ReactSortable } from 'react-sortablejs';
@@ -70,6 +70,20 @@ var en = {
70
70
  "area-manager-share-menu-edit": "Edit",
71
71
  "area-manager-share-menu-clear": "Clear this selection",
72
72
  "public-warning-title": "Public Warning",
73
+ "public-warning-event-title": "Public Warning Event",
74
+ "public-warning-event-incident": "Incident",
75
+ "public-warning-event-warning-type": "Warning type",
76
+ "public-warning-event-type-early-warning": "Early Warning",
77
+ "public-warning-event-type-warning": "Warning",
78
+ "public-warning-event-summary": "Summary",
79
+ "public-warning-event-translation": "Translation",
80
+ "public-warning-event-button-cancel": "Cancel",
81
+ "public-warning-event-button-delete": "Delete",
82
+ "public-warning-event-button-save-draft": "Save as draft",
83
+ "public-warning-event-button-publish": "Publish",
84
+ "public-warning-event-stop": "Stop",
85
+ "public-warning-event-delete": "Delete",
86
+ "public-warning-event-add-warning": "Add a warning",
73
87
  "maritime-warning-coastal-title": "Coastal Waters",
74
88
  "maritime-warning-northsea-title": "North Sea Districts",
75
89
  "close-warning-dialog-title": "Close warning",
@@ -129,7 +143,13 @@ var en = {
129
143
  "warning-dialog-delete-title": "Delete warning",
130
144
  "warning-dialog-delete-confirm": "Delete",
131
145
  "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.",
146
+ "warning-dialog-delete-islocked": "Warning is in edit mode by another user.",
147
+ "warning-dialog-delete-all-succes": "All warnings have been deleted",
148
+ "warning-dialog-delete-all-title": "Delete warnings",
149
+ "warning-dialog-delete-all-confirm": "Delete",
150
+ "warning-dialog-delete-all-description": "Are you sure you want to delete {{NUMBER}} warnings?",
151
+ "warning-dialog-delete-all-button": "Batch delete all selected warnings",
152
+ "warning-dialog-delete-all-failed": "Batch delete failed for {{NUMBER}} warnings. Please check the list and retry.",
133
153
  "warning-save-succes": "Public warning has succesfully been saved!",
134
154
  "warning-publish-succes": "Public warning has succesfully been published!",
135
155
  "warning-editor-user-viewer": "Viewer",
@@ -163,6 +183,7 @@ var en = {
163
183
  "warning-list-header-levels": "Levels",
164
184
  "warning-list-header-status": "Status",
165
185
  "warning-list-header-draft": "DRAFT",
186
+ "warning-list-batch-delete-checkbox": "Select for batch delete",
166
187
  "area-object-loader-title": "Areas & Objects",
167
188
  "add-button": "Add",
168
189
  "replace-button": "Replace",
@@ -171,9 +192,12 @@ var en = {
171
192
  "area-object-loader-no-areas-objects": "No areas or objects found",
172
193
  objects: "Objects",
173
194
  areas: "Areas",
195
+ "filter-select": "Select",
174
196
  "filter-select-all": "Select all",
197
+ "filter-deselect-all": "Deselect all",
175
198
  "filter-no-results": "No results",
176
199
  "filter-all": "All",
200
+ "filter-none": "None",
177
201
  "filter-options": "Filter options",
178
202
  "filter-show-all": "Show all",
179
203
  "filter-hide-all": "Hide all",
@@ -317,7 +341,21 @@ var en = {
317
341
  "maritime-wind-change-warning": "The entered wind change exceeds 180°. Please check if veering / backing is correct.",
318
342
  "maritime-wind-change-error": "A wind change less than 45° is not allowed.",
319
343
  "maritime-button-extend": "Extend +24h",
320
- "maritime-button-extending": "Extending"
344
+ "maritime-button-extending": "Extending",
345
+ "warning-event-summary-dialog-title": "Summary",
346
+ "warning-event-summary-dialog-clear-button": "Clear",
347
+ "warning-event-summary-dialog-clear-button-title": "Clear summary",
348
+ "warning-event-summary-dialog-OK-button": "Add",
349
+ "warning-event-summary-dialog-OK-button-title": "Add summary to the form",
350
+ "warning-event-summary-language-original": "Original: Dutch",
351
+ "warning-event-summary-language-translation": "Translation: English",
352
+ "warning-event-summary-headline-original": "Header",
353
+ "warning-event-summary-headline-translation": "Header",
354
+ "warning-event-summary-concise-summary-original": "Concise summary",
355
+ "warning-event-summary-concise-summary-translation": "Concise summary",
356
+ "warning-event-summary-description-original": "Detailed description",
357
+ "warning-event-summary-description-translation": "Detailed description",
358
+ "warning-event-summary-max-chars": "characters"
321
359
  };
322
360
  var nl = {
323
361
  "drawing-tool-form-tools": "Gereedschap",
@@ -360,6 +398,20 @@ var nl = {
360
398
  "area-manager-share-menu-edit": "Bewerken",
361
399
  "area-manager-share-menu-clear": "Verwijder gemaakte selectie",
362
400
  "public-warning-title": "Publieke Waarschuwing",
401
+ "public-warning-event-title": "Publieke Waarschuwing Gebeurtenis",
402
+ "public-warning-event-incident": "Incident",
403
+ "public-warning-event-warning-type": "Waarschuwingstype",
404
+ "public-warning-event-type-early-warning": "Vroegtijdige waarschuwing",
405
+ "public-warning-event-type-warning": "Waarschuwing",
406
+ "public-warning-event-summary": "Samenvatting",
407
+ "public-warning-event-translation": "Vertaling",
408
+ "public-warning-event-button-cancel": "Annuleren",
409
+ "public-warning-event-button-delete": "Verwijderen",
410
+ "public-warning-event-button-save-draft": "Opslaan als concept",
411
+ "public-warning-event-button-publish": "Publiceren",
412
+ "public-warning-event-stop": "Stoppen",
413
+ "public-warning-event-delete": "Verwijderen",
414
+ "public-warning-event-add-warning": "Waarschuwing toevoegen",
363
415
  "maritime-warning-coastal-title": "Kustgebieden",
364
416
  "maritime-warning-northsea-title": "Noordzee Districten",
365
417
  "close-warning-dialog-title": "Waarschuwing sluiten",
@@ -415,7 +467,13 @@ var nl = {
415
467
  "warning-dialog-delete-title": "Waarschuwing verwijderen",
416
468
  "warning-dialog-delete-confirm": "Verwijderen",
417
469
  "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.",
470
+ "warning-dialog-delete-islocked": "Waarschuwing wordt bewerkt door een andere gebruiker.",
471
+ "warning-dialog-delete-all-succes": "Waarschuwingen zijn verwijderd",
472
+ "warning-dialog-delete-all-title": "Waarschuwingen verwijderen",
473
+ "warning-dialog-delete-all-confirm": "Verwijderen",
474
+ "warning-dialog-delete-all-description": "Weet je zeker dat je {{NUMBER}} waarschuwingen wilt verwijderen?",
475
+ "warning-dialog-delete-all-button": "Verwijder geselecteerde waarschuwingen",
476
+ "warning-dialog-delete-all-failed": "Bulk verwijderen mislukt voor {{NUMBER}} waarschuwingen. Check de lijst en probeer opnieuw.",
419
477
  "warning-save-succes": "Publieke waarschuwing is succesvol opgeslagen!",
420
478
  "warning-publish-succes": "Publieke waarschuwing is succesvol gepubliceerd!",
421
479
  "warning-editor-add-editor": "Je bent nu de editor van deze waarschuwing",
@@ -454,6 +512,7 @@ var nl = {
454
512
  "warning-list-too-many-info": "niet vertaald",
455
513
  "warning-list-show-anyway": "niet vertaald",
456
514
  "warning-list-adjust-filter": "niet vertaald",
515
+ "warning-list-batch-delete-checkbox": "Selecteer voor bulk verwijderen",
457
516
  "area-object-loader-title": "Gebieden & Objecten",
458
517
  "add-button": "Toevoegen",
459
518
  "replace-button": "Vervangen",
@@ -462,9 +521,12 @@ var nl = {
462
521
  "area-object-loader-no-areas-objects": "Geen gebieden of objecten gevonden",
463
522
  objects: "Objecten",
464
523
  areas: "Gebieden",
524
+ "filter-select": "Selecteer",
465
525
  "filter-select-all": "Selecteer alles",
526
+ "filter-deselect-all": "Deselecteer alles",
466
527
  "filter-no-results": "Geen resultaten",
467
528
  "filter-all": "Alle",
529
+ "filter-none": "Geen",
468
530
  "filter-options": "Filter opties",
469
531
  "filter-show-all": "Alles tonen",
470
532
  "filter-hide-all": "Alles verbergen",
@@ -562,7 +624,21 @@ var nl = {
562
624
  "maritime-wind-change-warning": "De ingevulde wind wijziging overschrijdt 180°. Controleer of ruimend / krimpend klopt.",
563
625
  "maritime-wind-change-error": "Een wind wijziging van minder dan 45° is niet toegestaan.",
564
626
  "maritime-button-extend": "Verlengen +24h",
565
- "maritime-button-extending": "Verlengen"
627
+ "maritime-button-extending": "Verlengen",
628
+ "warning-event-summary-dialog-title": "Samenvatting",
629
+ "warning-event-summary-dialog-clear-button": "Verwijder",
630
+ "warning-event-summary-dialog-clear-button-title": "Verwijder samenvatting",
631
+ "warning-event-summary-dialog-OK-button": "Voeg to",
632
+ "warning-event-summary-dialog-OK-button-title": "Voeg samenvatting toe aan het formulier",
633
+ "warning-event-summary-language-original": "Origineel: Nederlands",
634
+ "warning-event-summary-language-translation": "Vertaling: Engels",
635
+ "warning-event-summary-headline-original": "Koptekst",
636
+ "warning-event-summary-headline-translation": "Koptekst",
637
+ "warning-event-summary-concise-summary-original": "Beknopte samenvatting",
638
+ "warning-event-summary-concise-summary-translation": "Beknopte samenvatting",
639
+ "warning-event-summary-description-original": "Gedetailleerde omschrijving",
640
+ "warning-event-summary-description-translation": "Gedetailleerde omschrijving",
641
+ "warning-event-summary-max-chars": "tekens"
566
642
  };
567
643
  var fi = {
568
644
  "drawing-tool-form-tools": "Työkalut",
@@ -605,6 +681,20 @@ var fi = {
605
681
  "area-manager-share-menu-edit": "Muokkaa",
606
682
  "area-manager-share-menu-clear": "Tyhjennä valinnat",
607
683
  "public-warning-title": "Julkiset varoitukset",
684
+ "public-warning-event-title": "Julkinen varoitustapahtuma",
685
+ "public-warning-event-incident": "Tapaus",
686
+ "public-warning-event-warning-type": "Varoitustyyppi",
687
+ "public-warning-event-type-early-warning": "Ennakkovaroitus",
688
+ "public-warning-event-type-warning": "Varoitus",
689
+ "public-warning-event-summary": "Yhteenveto",
690
+ "public-warning-event-translation": "Käännös",
691
+ "public-warning-event-button-cancel": "Peruuta",
692
+ "public-warning-event-button-delete": "Poista",
693
+ "public-warning-event-button-save-draft": "Tallenna luonnoksena",
694
+ "public-warning-event-button-publish": "Julkaise",
695
+ "public-warning-event-stop": "Pysäytä",
696
+ "public-warning-event-delete": "Poista",
697
+ "public-warning-event-add-warning": "Lisää varoitus",
608
698
  "maritime-warning-coastal-title": "ei käännetty",
609
699
  "maritime-warning-northsea-title": "ei käännetty",
610
700
  "close-warning-dialog-title": "Sulje varoitukset",
@@ -661,6 +751,12 @@ var fi = {
661
751
  "warning-dialog-delete-confirm": "Poista",
662
752
  "warning-dialog-delete-description": "Oletko varma, että haluat poistaa varoituksen?",
663
753
  "warning-dialog-delete-islocked": "Tämä varoitus on editointitilassa toisen käyttäjän toimesta",
754
+ "warning-dialog-delete-all-succes": "ei käännetty",
755
+ "warning-dialog-delete-all-title": "ei käännetty",
756
+ "warning-dialog-delete-all-confirm": "ei käännetty",
757
+ "warning-dialog-delete-all-description": "ei käännetty",
758
+ "warning-dialog-delete-all-button": "ei käännetty",
759
+ "warning-dialog-delete-all-failed": "ei käännetty",
664
760
  "warning-save-succes": "Julkinen varoitus tallannettu onnistuneesti",
665
761
  "warning-publish-succes": "Julkinen varoitus tallennettu onnistuneesti",
666
762
  "warning-editor-user-viewer": "Katselu",
@@ -699,6 +795,7 @@ var fi = {
699
795
  "warning-list-too-many-info": "ei käännetty",
700
796
  "warning-list-show-anyway": "ei käännetty",
701
797
  "warning-list-adjust-filter": "ei käännetty",
798
+ "warning-list-batch-delete-checkbox": "ei käännetty",
702
799
  "area-object-loader-title": "ei käännetty",
703
800
  "add-button": "ei käännetty",
704
801
  "replace-button": "ei käännetty",
@@ -707,9 +804,12 @@ var fi = {
707
804
  "area-object-loader-no-areas-objects": "ei käännetty",
708
805
  objects: "ei käännetty",
709
806
  areas: "ei käännetty",
807
+ "filter-select": "Valitse",
710
808
  "filter-select-all": "ei käännetty",
809
+ "filter-deselect-all": "Poista kaikki valinnat",
711
810
  "filter-no-results": "ei käännetty",
712
811
  "filter-all": "Kaikki",
812
+ "filter-none": "Ei mitään",
713
813
  "filter-options": "ei käännetty",
714
814
  "filter-show-all": "ei käännetty",
715
815
  "filter-hide-all": "ei käännetty",
@@ -759,7 +859,21 @@ var fi = {
759
859
  cancelling: "Peruuttaminen",
760
860
  loading: "Ladataan...",
761
861
  "maritime-editor-off": "Et ole enää {{domain}} -merivaroitusten muokkaaja",
762
- "maritime-warning-post-success": "Varoitus julkaistu onnistuneesti"
862
+ "maritime-warning-post-success": "Varoitus julkaistu onnistuneesti",
863
+ "warning-event-summary-dialog-title": "ei käännetty",
864
+ "warning-event-summary-dialog-clear-button": "ei käännetty",
865
+ "warning-event-summary-dialog-clear-button-title": "ei käännetty",
866
+ "warning-event-summary-dialog-OK-button": "ei käännetty",
867
+ "warning-event-summary-dialog-OK-button-title": "ei käännetty",
868
+ "warning-event-summary-language-original": "ei käännetty",
869
+ "warning-event-summary-language-translation": "ei käännetty",
870
+ "warning-event-summary-headline-original": "ei käännetty",
871
+ "warning-event-summary-headline-translation": "ei käännetty",
872
+ "warning-event-summary-concise-summary-original": "ei käännetty",
873
+ "warning-event-summary-concise-summary-translation": "ei käännetty",
874
+ "warning-event-summary-description-original": "ei käännetty",
875
+ "warning-event-summary-description-translation": "ei käännetty",
876
+ "warning-event-summary-max-chars": "ei käännetty"
763
877
  };
764
878
  var no = {
765
879
  "drawing-tool-form-tools": "Verktøy",
@@ -802,6 +916,20 @@ var no = {
802
916
  "area-manager-share-menu-edit": "ikke oversatt",
803
917
  "area-manager-share-menu-clear": "ikke oversatt",
804
918
  "public-warning-title": "Farevarsel",
919
+ "public-warning-event-title": "Offentlig varselhendelse",
920
+ "public-warning-event-incident": "Hendelse",
921
+ "public-warning-event-warning-type": "Varseltype",
922
+ "public-warning-event-type-early-warning": "Tidlig varsel",
923
+ "public-warning-event-type-warning": "Varsel",
924
+ "public-warning-event-summary": "Sammendrag",
925
+ "public-warning-event-translation": "Oversettelse",
926
+ "public-warning-event-button-cancel": "Avbryt",
927
+ "public-warning-event-button-delete": "Slett",
928
+ "public-warning-event-button-save-draft": "Lagre som utkast",
929
+ "public-warning-event-button-publish": "Publiser",
930
+ "public-warning-event-stop": "Stopp",
931
+ "public-warning-event-delete": "Slett",
932
+ "public-warning-event-add-warning": "Legg til et varsel",
805
933
  "maritime-warning-coastal-title": "ikke oversatt",
806
934
  "maritime-warning-northsea-title": "ikke oversatt",
807
935
  "close-warning-dialog-title": "Lukk farevarsel",
@@ -857,7 +985,13 @@ var no = {
857
985
  "warning-dialog-delete-title": "Slett varsel",
858
986
  "warning-dialog-delete-confirm": "Slett",
859
987
  "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.",
988
+ "warning-dialog-delete-islocked": "Varsel er i endringsmodus av en annen bruker.",
989
+ "warning-dialog-delete-all-succes": "ikke oversatt",
990
+ "warning-dialog-delete-all-title": "ikke oversatt",
991
+ "warning-dialog-delete-all-confirm": "ikke oversatt",
992
+ "warning-dialog-delete-all-description": "ikke oversatt",
993
+ "warning-dialog-delete-all-button": "ikke oversatt",
994
+ "warning-dialog-delete-all-failed": "ikke oversatt",
861
995
  "warning-save-succes": "Farevarselet er lagret!",
862
996
  "warning-publish-succes": "Farevarselet er publisert!",
863
997
  "warning-editor-user-viewer": "Visningsmodus",
@@ -896,6 +1030,7 @@ var no = {
896
1030
  "warning-list-header-levels": "Grad",
897
1031
  "warning-list-header-status": "Status",
898
1032
  "warning-list-header-draft": "UTKAST",
1033
+ "warning-list-batch-delete-checkbox": "ikke oversatt",
899
1034
  "area-object-loader-title": "Områder og objekter",
900
1035
  "add-button": "Legg til",
901
1036
  "replace-button": "Bytt ut",
@@ -904,9 +1039,12 @@ var no = {
904
1039
  "area-object-loader-no-areas-objects": "Ingen områder eller objekter funnet",
905
1040
  objects: "Objekter",
906
1041
  areas: "Områder",
1042
+ "filter-select": "Velg",
907
1043
  "filter-select-all": "Velg alle",
1044
+ "filter-deselect-all": "Avmarker alle",
908
1045
  "filter-no-results": "Ingen resultat",
909
1046
  "filter-all": "Alle",
1047
+ "filter-none": "Ingen",
910
1048
  "filter-options": "Filtervalg",
911
1049
  "filter-show-all": "Vis alle",
912
1050
  "filter-hide-all": "Skjel alle",
@@ -954,7 +1092,21 @@ var no = {
954
1092
  "error-auth-login": "Denne delen er passordbeskyttet. Vennligst logg inn.",
955
1093
  "cancel-warningType": "Cancel {{warningType}}",
956
1094
  cancelling: "Cancelling",
957
- loading: "Laster..."
1095
+ loading: "Laster...",
1096
+ "warning-event-summary-dialog-title": "Sammendrag",
1097
+ "warning-event-summary-dialog-clear-button": "Fjern",
1098
+ "warning-event-summary-dialog-clear-button-title": "Fjern sammendrag",
1099
+ "warning-event-summary-language-original": "ikke oversatt",
1100
+ "warning-event-summary-language-translation": "ikke oversatt",
1101
+ "warning-event-summary-dialog-OK-button": "Legge til",
1102
+ "warning-event-summary-dialog-OK-button-title": "Legg til sammendrag i skjemaet",
1103
+ "warning-event-summary-headline-original": "Overskrift",
1104
+ "warning-event-summary-headline-translation": "Overskrift",
1105
+ "warning-event-summary-concise-summary-original": "Kortfattet sammendrag",
1106
+ "warning-event-summary-concise-summary-translation": "Kortfattet sammendrag",
1107
+ "warning-event-summary-description-original": "Detaljert beskrivelse",
1108
+ "warning-event-summary-description-translation": "Detaljert beskrivelse",
1109
+ "warning-event-summary-max-chars": "karakterer"
958
1110
  };
959
1111
  var warningsTranslations = {
960
1112
  en: en,
@@ -2189,6 +2341,7 @@ var initialFilters = {
2189
2341
  * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
2190
2342
  * */
2191
2343
  var publicWarningDialogType = uiTypes.DialogTypes.PublicWarnings;
2344
+ var warningEventDialogType = uiTypes.DialogTypes.WarningsEvent;
2192
2345
 
2193
2346
  /* *
2194
2347
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -2523,6 +2676,11 @@ var MaritimeWarningAction;
2523
2676
  MaritimeWarningAction["UPDATE"] = "UPDATE";
2524
2677
  MaritimeWarningAction["EXTEND"] = "EXTEND";
2525
2678
  })(MaritimeWarningAction || (MaritimeWarningAction = {}));
2679
+ var WarningEventType;
2680
+ (function (WarningEventType) {
2681
+ WarningEventType["WARNING"] = "WARNING";
2682
+ WarningEventType["EARLY_WARNING"] = "EARLY_WARNING";
2683
+ })(WarningEventType || (WarningEventType = {}));
2526
2684
 
2527
2685
  var getWarningPhenomenaIcon = function getWarningPhenomenaIcon(key) {
2528
2686
  switch (key) {
@@ -5102,7 +5260,7 @@ var DrawingToolForm = function DrawingToolForm(_ref) {
5102
5260
  var additionalStrokeOpacity = 0.8;
5103
5261
  onChangeProperties({
5104
5262
  'fill-opacity': newOpacity,
5105
- 'stroke-opacity': clamp(newOpacity + additionalStrokeOpacity, 0.01, 1)
5263
+ 'stroke-opacity': clamp$1(newOpacity + additionalStrokeOpacity, 0.01, 1)
5106
5264
  });
5107
5265
  }, [onChangeProperties]);
5108
5266
  var onBlurName = React.useCallback(function (event) {
@@ -7592,12 +7750,12 @@ var DescriptionField = function DescriptionField(_ref) {
7592
7750
  children: [jsxs(Tabs, {
7593
7751
  "aria-label": "description tabs",
7594
7752
  onChange: handleChange,
7595
- value: activeTab,
7596
7753
  sx: isDisabled ? {
7597
7754
  '& .MuiTabs-indicator': {
7598
7755
  display: 'none'
7599
7756
  }
7600
7757
  } : undefined,
7758
+ value: activeTab,
7601
7759
  children: [jsx(Tab, Object.assign({
7602
7760
  disabled: isDisabled,
7603
7761
  label: t('warning-description-original'),
@@ -9083,7 +9241,9 @@ var WarningListHeaderContent = function WarningListHeaderContent(_ref) {
9083
9241
  },
9084
9242
  sx: Object.assign({}, Array.isArray(props.sx) ? Object.assign.apply(Object, [{}].concat(props.sx)) : props.sx, {
9085
9243
  width: width,
9086
- cursor: _onClick ? 'pointer' : 'default'
9244
+ cursor: _onClick ? 'pointer' : 'default',
9245
+ display: 'flex',
9246
+ justifyContent: 'flex-end'
9087
9247
  }),
9088
9248
  children: jsxs(Box, {
9089
9249
  sx: {
@@ -11002,7 +11162,6 @@ var PublicWarningsForm = function PublicWarningsForm(props) {
11002
11162
  * Copyright 2026 - Finnish Meteorological Institute (FMI)
11003
11163
  * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
11004
11164
  * */
11005
- var PUBLIC_WARNING_DRAW_TOOL_ID = 'publicWarningGeometry';
11006
11165
  var getDrawLayerId = function getDrawLayerId(mapId) {
11007
11166
  return "drawLayer-" + PUBLIC_WARNING_DRAW_TOOL_ID + "-" + mapId;
11008
11167
  };
@@ -11019,14 +11178,33 @@ var usePublicWarningMapDraw = function usePublicWarningMapDraw(_ref) {
11019
11178
  var prevActiveDrawModeRef = React.useRef('');
11020
11179
  var linkedMapIdsRef = React.useRef(linkedMapIds);
11021
11180
  React.useEffect(function () {
11181
+ var prevMapIds = linkedMapIdsRef.current;
11182
+ var removedMapIds = prevMapIds.filter(function (id) {
11183
+ return !linkedMapIds.includes(id);
11184
+ });
11185
+ removedMapIds.forEach(function (mapId) {
11186
+ dispatch(layerActions.layerDelete({
11187
+ mapId: mapId,
11188
+ layerId: getDrawLayerId(mapId)
11189
+ }));
11190
+ });
11022
11191
  linkedMapIdsRef.current = linkedMapIds;
11023
- }, [linkedMapIds]);
11192
+ }, [linkedMapIds, dispatch]);
11024
11193
  var activeMapId = linkedMapIds[0];
11025
11194
  var activeDrawLayerId = activeMapId ? getDrawLayerId(activeMapId) : '';
11026
11195
  var activeDrawModeId = useSelector(function (store) {
11027
11196
  var _store$drawingtools;
11028
11197
  return ((_store$drawingtools = store.drawingtools) == null || (_store$drawingtools = _store$drawingtools.entities[PUBLIC_WARNING_DRAW_TOOL_ID]) == null ? void 0 : _store$drawingtools.activeDrawModeId) || '';
11029
11198
  });
11199
+ React.useEffect(function () {
11200
+ if (linkedMapIds.length > 0 || activeDrawModeId === '') {
11201
+ return;
11202
+ }
11203
+ dispatch(drawingToolActions.changeDrawToolMode({
11204
+ drawToolId: PUBLIC_WARNING_DRAW_TOOL_ID,
11205
+ drawModeId: ''
11206
+ }));
11207
+ }, [activeDrawModeId, dispatch, linkedMapIds]);
11030
11208
  var activeDrawLayerGeoJSON = useSelector(function (store) {
11031
11209
  var _store$layers;
11032
11210
  return activeDrawLayerId ? (_store$layers = store.layers) == null || (_store$layers = _store$layers.byId[activeDrawLayerId]) == null ? void 0 : _store$layers.geojson : undefined;
@@ -11156,6 +11334,16 @@ var usePublicWarningMapDraw = function usePublicWarningMapDraw(_ref) {
11156
11334
  };
11157
11335
  };
11158
11336
 
11337
+ var getStoredDrawLayerGeoJSON = function getStoredDrawLayerGeoJSON(layersById, linkedMapIds, drawToolId) {
11338
+ var _layersById;
11339
+ var linkedMapIdWithLayer = [].concat(linkedMapIds).reverse().find(function (mapId) {
11340
+ return layersById == null ? void 0 : layersById["drawLayer-" + drawToolId + "-" + mapId];
11341
+ });
11342
+ if (!linkedMapIdWithLayer) {
11343
+ return undefined;
11344
+ }
11345
+ return layersById == null || (_layersById = layersById["drawLayer-" + drawToolId + "-" + linkedMapIdWithLayer]) == null ? void 0 : _layersById.geojson;
11346
+ };
11159
11347
  var PublicWarningsFormConnect = function PublicWarningsFormConnect(_ref) {
11160
11348
  var _warning$warningDetai;
11161
11349
  var editor = _ref.editor,
@@ -11341,13 +11529,11 @@ var PublicWarningsFormConnect = function PublicWarningsFormConnect(_ref) {
11341
11529
  });
11342
11530
  var storedStartGeoJSON = useSelector(function (state) {
11343
11531
  var _state$layers;
11344
- var layer = (_state$layers = state.layers) == null ? void 0 : _state$layers.byId["drawLayer-sigmetStartGeometry-" + selectedMapIds];
11345
- return layer ? layer.geojson : undefined;
11532
+ return getStoredDrawLayerGeoJSON((_state$layers = state.layers) == null ? void 0 : _state$layers.byId, selectedMapIds, 'sigmetStartGeometry');
11346
11533
  });
11347
11534
  var storedEndGeoJSON = useSelector(function (state) {
11348
11535
  var _state$layers2;
11349
- var layer = (_state$layers2 = state.layers) == null ? void 0 : _state$layers2.byId["drawLayer-sigmetEndGeometry-" + selectedMapIds];
11350
- return layer ? layer.geojson : undefined;
11536
+ return getStoredDrawLayerGeoJSON((_state$layers2 = state.layers) == null ? void 0 : _state$layers2.byId, selectedMapIds, 'sigmetEndGeometry');
11351
11537
  });
11352
11538
  var onGeometryChange = React.useCallback(function (geoJSON) {
11353
11539
  dispatch(warningsFormActions.addArea({
@@ -11415,6 +11601,9 @@ var getFilterParams = function getFilterParams(areas, searchQuery) {
11415
11601
  });
11416
11602
  };
11417
11603
  var WARNING_DIALOG_DRAFT_LAYER_ID = 'warning-dialog-draft-area';
11604
+ var createWarningDialogAreaLayerId = function createWarningDialogAreaLayerId(areaId, index) {
11605
+ return areaId != null ? areaId : WARNING_DIALOG_DRAFT_LAYER_ID + "-" + index;
11606
+ };
11418
11607
  var useAreaRequest = function useAreaRequest(isDialogOpen) {
11419
11608
  var _useState = useState([]),
11420
11609
  areas = _useState[0],
@@ -11457,7 +11646,7 @@ var useAreaRequest = function useAreaRequest(isDialogOpen) {
11457
11646
  };
11458
11647
  };
11459
11648
  var AreaObjectLoaderConnect = function AreaObjectLoaderConnect(_ref) {
11460
- var _selectedWarning$warn, _selectedWarning$warn2, _styledGeoJSON$featur, _selectedWarning$warn3, _selectedWarning$warn4, _styledGeoJSON$featur2;
11649
+ var _selectedWarning$warn, _selectedWarning$warn2, _selectedWarning$id, _selectedWarning$warn3;
11461
11650
  var bounds = _ref.bounds,
11462
11651
  _ref$source = _ref.source,
11463
11652
  source = _ref$source === void 0 ? 'app' : _ref$source;
@@ -11502,27 +11691,49 @@ var AreaObjectLoaderConnect = function AreaObjectLoaderConnect(_ref) {
11502
11691
  var isWarningDialogOpen = useSelector(function (store) {
11503
11692
  return uiSelectors.getisDialogOpen(store, publicWarningDialogType);
11504
11693
  });
11505
- var isAviationWarning = (selectedWarning == null ? void 0 : selectedWarning.warningDetail.level) === 'SIG' || (selectedWarning == null ? void 0 : selectedWarning.warningDetail.level) === 'AIR';
11506
- var styledGeoJSON = warningLevelFeatureColors(selectedWarning == null || (_selectedWarning$warn = selectedWarning.warningDetail) == null ? void 0 : _selectedWarning$warn.level, selectedWarning == null || (_selectedWarning$warn2 = selectedWarning.warningDetail) == null || (_selectedWarning$warn2 = _selectedWarning$warn2.areas) == null || (_selectedWarning$warn2 = _selectedWarning$warn2[0]) == null ? void 0 : _selectedWarning$warn2.geoJSON, isAviationWarning);
11507
- // Inject warning level into feature properties to be read in OlMapViewConnect
11508
- if (styledGeoJSON != null && (_styledGeoJSON$featur = styledGeoJSON.features) != null && _styledGeoJSON$featur.length) {
11509
- styledGeoJSON.features.forEach(function (feature) {
11510
- // eslint-disable-next-line no-param-reassign
11511
- feature.properties = Object.assign({}, feature.properties, {
11512
- warningLevel: selectedWarning == null ? void 0 : selectedWarning.warningDetail.level,
11513
- hover: true
11514
- });
11694
+ var hasPublicWarningDrawLayer = useSelector(function (store) {
11695
+ var _store$layers$allIds, _store$layers;
11696
+ return ((_store$layers$allIds = (_store$layers = store.layers) == null ? void 0 : _store$layers.allIds) != null ? _store$layers$allIds : []).some(function (layerId) {
11697
+ return layerId.startsWith("drawLayer-" + PUBLIC_WARNING_DRAW_TOOL_ID + "-");
11515
11698
  });
11516
- }
11517
- var warningDialogLayerId = (_selectedWarning$warn3 = selectedWarning == null || (_selectedWarning$warn4 = selectedWarning.warningDetail) == null || (_selectedWarning$warn4 = _selectedWarning$warn4.areas) == null || (_selectedWarning$warn4 = _selectedWarning$warn4[0]) == null ? void 0 : _selectedWarning$warn4.areaId) != null ? _selectedWarning$warn3 : WARNING_DIALOG_DRAFT_LAYER_ID;
11518
- var shouldPublishWarningDialogLayer = Boolean(isWarningDialogOpen && (styledGeoJSON == null || (_styledGeoJSON$featur2 = styledGeoJSON.features) == null ? void 0 : _styledGeoJSON$featur2.length));
11699
+ });
11700
+ var isAviationWarning = (selectedWarning == null || (_selectedWarning$warn = selectedWarning.warningDetail) == null ? void 0 : _selectedWarning$warn.level) === 'SIG' || (selectedWarning == null || (_selectedWarning$warn2 = selectedWarning.warningDetail) == null ? void 0 : _selectedWarning$warn2.level) === 'AIR';
11701
+ var warningDialogOriginalId = (_selectedWarning$id = selectedWarning == null ? void 0 : selectedWarning.id) != null ? _selectedWarning$id : selectedWarning == null || (_selectedWarning$warn3 = selectedWarning.warningDetail) == null ? void 0 : _selectedWarning$warn3.id;
11519
11702
  var warningDialogFeatureLayersById = React.useMemo(function () {
11520
- var _ref2;
11521
- return shouldPublishWarningDialogLayer ? (_ref2 = {}, _ref2[warningDialogLayerId] = {
11522
- id: warningDialogLayerId,
11523
- geojson: styledGeoJSON
11524
- }, _ref2) : {};
11525
- }, [shouldPublishWarningDialogLayer, warningDialogLayerId, styledGeoJSON]);
11703
+ var _selectedWarning$warn4, _selectedWarning$warn5;
11704
+ // Aviation warnings render their active geometry via draw layers/form state.
11705
+ // Publishing warning-dialog feature-sync layers for them creates a stale
11706
+ // mirror from persisted warningDetail.areas while editing.
11707
+ if (!isWarningDialogOpen || isAviationWarning || hasPublicWarningDrawLayer) {
11708
+ return {};
11709
+ }
11710
+ return ((_selectedWarning$warn4 = selectedWarning == null || (_selectedWarning$warn5 = selectedWarning.warningDetail) == null ? void 0 : _selectedWarning$warn5.areas) != null ? _selectedWarning$warn4 : []).reduce(function (layersById, area, index) {
11711
+ var _selectedWarning$warn6, _ref3, _Object$assign;
11712
+ var styledGeoJSON = warningLevelFeatureColors(selectedWarning == null || (_selectedWarning$warn6 = selectedWarning.warningDetail) == null ? void 0 : _selectedWarning$warn6.level, area.geoJSON, isAviationWarning);
11713
+ if (!styledGeoJSON.features.length) {
11714
+ return layersById;
11715
+ }
11716
+ var layerId = createWarningDialogAreaLayerId(area.areaId, index);
11717
+ var geojson = Object.assign({}, styledGeoJSON, {
11718
+ features: styledGeoJSON.features.map(function (feature) {
11719
+ var _ref2;
11720
+ return Object.assign({}, feature, {
11721
+ properties: Object.assign({}, feature.properties, {
11722
+ originalId: (_ref2 = warningDialogOriginalId != null ? warningDialogOriginalId : area.areaId) != null ? _ref2 : area.published_warning_uuid,
11723
+ warningLevel: selectedWarning == null ? void 0 : selectedWarning.warningDetail.level,
11724
+ hover: true
11725
+ })
11726
+ });
11727
+ })
11728
+ });
11729
+ return Object.assign({}, layersById, (_Object$assign = {}, _Object$assign[layerId] = {
11730
+ id: layerId,
11731
+ geojson: geojson,
11732
+ originalId: (_ref3 = warningDialogOriginalId != null ? warningDialogOriginalId : area.areaId) != null ? _ref3 : area.published_warning_uuid
11733
+ }, _Object$assign));
11734
+ }, {});
11735
+ }, [isAviationWarning, hasPublicWarningDrawLayer, isWarningDialogOpen, selectedWarning, warningDialogOriginalId]);
11736
+ var shouldPublishWarningDialogLayer = Object.keys(warningDialogFeatureLayersById).length > 0;
11526
11737
  useUpdateFeatureSyncLayers(warningDialogFeatureLayersById, shouldPublishWarningDialogLayer ? 'warning-dialog' : undefined);
11527
11738
  var filterParams = React.useMemo(function () {
11528
11739
  return getFilterParams(areas, searchQuery);
@@ -11580,9 +11791,9 @@ var AreaObjectLoaderConnect = function AreaObjectLoaderConnect(_ref) {
11580
11791
  var onSearch = function onSearch(queryString) {
11581
11792
  return setSearchQuery(queryString);
11582
11793
  };
11583
- var onAddArea = function onAddArea(_ref3) {
11584
- var geoJSON = _ref3.geoJSON,
11585
- objectName = _ref3.objectName;
11794
+ var onAddArea = function onAddArea(_ref4) {
11795
+ var geoJSON = _ref4.geoJSON,
11796
+ objectName = _ref4.objectName;
11586
11797
  dispatch(warningsFormActions.addArea({
11587
11798
  area: {
11588
11799
  geoJSON: geoJSON,
@@ -11590,9 +11801,9 @@ var AreaObjectLoaderConnect = function AreaObjectLoaderConnect(_ref) {
11590
11801
  }
11591
11802
  }));
11592
11803
  };
11593
- var onRemoveArea = function onRemoveArea(_ref4) {
11594
- var geoJSON = _ref4.geoJSON,
11595
- objectName = _ref4.objectName;
11804
+ var onRemoveArea = function onRemoveArea(_ref5) {
11805
+ var geoJSON = _ref5.geoJSON,
11806
+ objectName = _ref5.objectName;
11596
11807
  dispatch(warningsFormActions.removeArea({
11597
11808
  area: {
11598
11809
  geoJSON: geoJSON,
@@ -11964,209 +12175,1912 @@ var PublicWarningsFormDialogConnect = function PublicWarningsFormDialogConnect(_
11964
12175
  });
11965
12176
  };
11966
12177
 
11967
- var BUTTON_AIRMET = 'AIRMET';
11968
- var BUTTON_SIGMET = 'SIGMET';
11969
- var NewWarningButton = function NewWarningButton(_ref) {
11970
- var onCreateWarning = _ref.onCreateWarning,
11971
- _ref$isDefaultOpen = _ref.isDefaultOpen,
11972
- isDefaultOpen = _ref$isDefaultOpen === void 0 ? false : _ref$isDefaultOpen;
11973
- var _useWarningsTranslati = useWarningsTranslation(),
11974
- t = _useWarningsTranslati.t;
11975
- var config = sessionStorageProvider.getConfig();
11976
- var showMartimeWarningOption = !!config.GW_WARNINGS_MARITIME_WARNINGS && !!config.GW_DRAWINGS_BASE_URL;
11977
- var showAirMetOption = !!config.GW_AIRMET_BASE_URL;
11978
- var showSigmetOption = !!config.GW_SIGMET_BASE_URL;
11979
- var showPublicWarningOption = !!config.GW_DRAWINGS_BASE_URL;
11980
- var _React$useState = React.useState(null),
11981
- anchorEl = _React$useState[0],
11982
- setAnchorEl = _React$useState[1];
11983
- var isOpen = Boolean(anchorEl);
11984
- var _React$useState2 = React.useState(0),
11985
- menuMinWidth = _React$useState2[0],
11986
- setMenuMinWidth = _React$useState2[1];
11987
- var buttonId = 'newWarningButton';
11988
- React.useEffect(function () {
11989
- if (isDefaultOpen) {
11990
- setAnchorEl(document.getElementById(buttonId));
11991
- }
11992
- }, [isDefaultOpen, buttonId]);
11993
- var handleClick = function handleClick(event) {
11994
- event.stopPropagation();
11995
- setAnchorEl(event.currentTarget);
11996
- var buttonWidth = event.currentTarget.getBoundingClientRect().width;
11997
- setMenuMinWidth(buttonWidth);
11998
- };
11999
- var handleClose = function handleClose(event) {
12000
- event.stopPropagation();
12001
- setAnchorEl(null);
12002
- };
12003
- var onCreateNewWarning = function onCreateNewWarning(warningType, event) {
12004
- onCreateWarning(warningType);
12005
- handleClose(event);
12006
- };
12007
- return jsxs(Fragment, {
12008
- children: [jsxs(CustomToggleButton, {
12009
- id: buttonId,
12010
- onClick: handleClick,
12011
- sx: Object.assign({
12012
- textTransform: 'initial!important',
12013
- marginBottom: '8px',
12014
- fontSize: '12px',
12015
- height: '32px!important',
12016
- whiteSpace: 'nowrap',
12017
- minWidth: 'auto',
12018
- paddingRight: '12px!important'
12019
- }, isOpen ? {
12020
- '&.MuiToggleButton-root.primary': {
12021
- backgroundColor: 'geowebColors.buttons.primary.mouseOver.fill'
12022
- }
12023
- } : {}),
12024
- children: [jsx(Add, {}), t('warning-list-button_create')]
12025
- }), jsxs(Menu, {
12026
- anchorEl: anchorEl,
12027
- anchorOrigin: {
12028
- vertical: 'bottom',
12029
- horizontal: 'center'
12030
- },
12031
- onClose: function onClose(event, reason) {
12032
- if (reason === 'tabKeyDown') {
12033
- return;
12034
- }
12035
- handleClose(event);
12036
- },
12037
- open: isOpen,
12038
- slotProps: {
12039
- root: {
12040
- slotProps: {
12041
- backdrop: {
12042
- style: {
12043
- opacity: 0,
12044
- transition: 'none'
12045
- }
12046
- }
12047
- }
12048
- },
12049
- list: {
12050
- style: {
12051
- padding: '0px',
12052
- minWidth: menuMinWidth || undefined
12053
- }
12054
- }
12055
- },
12056
- transformOrigin: {
12057
- vertical: 'top',
12058
- horizontal: 'center'
12059
- },
12060
- children: [showPublicWarningOption ? jsx(MenuItem, {
12061
- onClick: function onClick(event) {
12062
- onCreateNewWarning('public', event);
12063
- },
12064
- children: jsx(ListItemText, {
12065
- children: t('public-warning-title').toUpperCase()
12066
- })
12067
- }, "Public") : null, showAirMetOption ? jsx(MenuItem, {
12068
- onClick: function onClick(event) {
12069
- onCreateNewWarning('airmet', event);
12070
- },
12071
- children: jsx(ListItemText, {
12072
- children: BUTTON_AIRMET
12073
- })
12074
- }, "Airmet") : null, showSigmetOption ? jsx(MenuItem, {
12075
- onClick: function onClick(event) {
12076
- onCreateNewWarning('sigmet', event);
12077
- },
12078
- children: jsx(ListItemText, {
12079
- children: BUTTON_SIGMET
12080
- })
12081
- }, "Sigmet") : null, showMartimeWarningOption ? jsxs(Box, {
12082
- children: [jsx(MenuItem, {
12083
- onClick: function onClick(event) {
12084
- onCreateNewWarning('maritimeWarningCoastal', event);
12085
- },
12086
- children: jsx(ListItemText, {
12087
- children: t('maritime-warning-coastal-title').toUpperCase()
12088
- })
12089
- }, "MaritimeWarningCoastal"), jsx(MenuItem, {
12090
- onClick: function onClick(event) {
12091
- onCreateNewWarning('maritimeWarningNorthSea', event);
12092
- },
12093
- children: jsx(ListItemText, {
12094
- children: t('maritime-warning-northsea-title').toUpperCase()
12095
- })
12096
- }, "MaritimeWarningNorthSea")]
12097
- }) : null]
12098
- })]
12099
- });
12178
+ /* *
12179
+ * Licensed under the Apache License, Version 2.0 (the "License");
12180
+ * you may not use this file except in compliance with the License.
12181
+ * You may obtain a copy of the License at
12182
+ *
12183
+ * http://www.apache.org/licenses/LICENSE-2.0
12184
+ *
12185
+ * Unless required by applicable law or agreed to in writing, software
12186
+ * distributed under the License is distributed on an "AS IS" BASIS,
12187
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12188
+ * See the License for the specific language governing permissions and
12189
+ * limitations under the License.
12190
+ *
12191
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12192
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
12193
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
12194
+ * */
12195
+ var warningEventTypes = [{
12196
+ translationKey: 'public-warning-event-type-early-warning',
12197
+ key: WarningEventType.EARLY_WARNING,
12198
+ defaultDayRange: [2, 7],
12199
+ minSelectableDay: 2
12200
+ }, {
12201
+ translationKey: 'public-warning-event-type-warning',
12202
+ key: WarningEventType.WARNING,
12203
+ defaultDayRange: [0, 1],
12204
+ minSelectableDay: 0
12205
+ }];
12206
+ var getDefaultDayRangeForType = function getDefaultDayRangeForType(type) {
12207
+ var _warningEventTypes$fi, _warningEventTypes$fi2;
12208
+ return (_warningEventTypes$fi = (_warningEventTypes$fi2 = warningEventTypes.find(function (warningType) {
12209
+ return warningType.key === type;
12210
+ })) == null ? void 0 : _warningEventTypes$fi2.defaultDayRange) != null ? _warningEventTypes$fi : [0, 1];
12100
12211
  };
12101
-
12102
- var _excluded$3 = ["title", "status", "children", "width"];
12103
- var WarningListColumnContent = function WarningListColumnContent(_ref) {
12104
- var _sx;
12105
- var title = _ref.title,
12106
- status = _ref.status,
12107
- children = _ref.children,
12108
- _ref$width = _ref.width,
12109
- width = _ref$width === void 0 ? 76 : _ref$width,
12110
- props = _objectWithoutPropertiesLoose(_ref, _excluded$3);
12111
- return jsxs(Grid, {
12112
- sx: Object.assign({}, Array.isArray(props.sx) ? Object.assign.apply(Object, [{}].concat(props.sx)) : props.sx, {
12113
- width: width
12114
- }),
12115
- children: [!!title && jsx(Box, {
12116
- sx: (_sx = {
12117
- overflow: 'hidden',
12118
- fontWeight: 'normal',
12119
- textOverflow: 'ellipsis',
12120
- fontSize: 10,
12121
- lineHeight: 1.6,
12122
- height: 12,
12123
- color: status === PublicWarningStatus.EXPIRED || status === PublicWarningStatus.WITHDRAWN ? 'geowebColors.typographyAndIcons.inactiveText' : 'geowebColors.captions.captionStatus.rgba',
12124
- display: 'block'
12125
- }, _sx["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
12126
- display: 'none'
12127
- }, _sx),
12128
- children: title
12129
- }), jsx(Box, {
12130
- sx: {
12131
- overflow: 'visible',
12132
- fontSize: 12,
12133
- lineHeight: 1.2,
12134
- color: status === PublicWarningStatus.EXPIRED || status === PublicWarningStatus.WITHDRAWN ? 'geowebColors.typographyAndIcons.inactiveText' : 'geowebColors.typographyAndIcons.text'
12135
- },
12136
- children: children || '-'
12137
- })]
12138
- });
12212
+ var getMinSelectableDayForType = function getMinSelectableDayForType(type) {
12213
+ var _warningEventTypes$fi3, _warningEventTypes$fi4;
12214
+ return (_warningEventTypes$fi3 = (_warningEventTypes$fi4 = warningEventTypes.find(function (warningType) {
12215
+ return warningType.key === type;
12216
+ })) == null ? void 0 : _warningEventTypes$fi4.minSelectableDay) != null ? _warningEventTypes$fi3 : 0;
12217
+ };
12218
+ var defaultValues = {
12219
+ incident: '',
12220
+ phenomenon: '',
12221
+ validFrom: '',
12222
+ validUntil: '',
12223
+ warningEventType: WarningEventType.EARLY_WARNING,
12224
+ warnings: [],
12225
+ texts: {
12226
+ headlineOriginal: '',
12227
+ headlineTranslation: '',
12228
+ conciseSummaryOriginal: '',
12229
+ conciseSummaryTranslation: '',
12230
+ descriptionOriginal: '',
12231
+ descriptionTranslation: ''
12232
+ }
12139
12233
  };
12140
12234
 
12141
- var WarningListItemMenu = function WarningListItemMenu(_ref) {
12142
- var warning = _ref.warning,
12143
- _ref$onEditWarning = _ref.onEditWarning,
12144
- onEditWarning = _ref$onEditWarning === void 0 ? function () {} : _ref$onEditWarning,
12145
- _ref$onDeleteWarning = _ref.onDeleteWarning,
12146
- onDeleteWarning = _ref$onDeleteWarning === void 0 ? function () {} : _ref$onDeleteWarning,
12147
- _ref$onDeleteReviewWa = _ref.onDeleteReviewWarning,
12148
- onDeleteReviewWarning = _ref$onDeleteReviewWa === void 0 ? function () {} : _ref$onDeleteReviewWa,
12149
- _ref$onExpireWarning = _ref.onExpireWarning,
12150
- onExpireWarning = _ref$onExpireWarning === void 0 ? function () {} : _ref$onExpireWarning,
12151
- _ref$onWithdrawWarnin = _ref.onWithdrawWarning,
12152
- onWithdrawWarning = _ref$onWithdrawWarnin === void 0 ? function () {} : _ref$onWithdrawWarnin,
12153
- _ref$onActionAviation = _ref.onActionAviationWarning,
12154
- onActionAviationWarning = _ref$onActionAviation === void 0 ? function () {} : _ref$onActionAviation,
12155
- _ref$onActionMaritime = _ref.onActionMaritimeWarning,
12156
- onActionMaritimeWarning = _ref$onActionMaritime === void 0 ? function () {} : _ref$onActionMaritime,
12157
- t = _ref.t,
12158
- _ref$shouldDisableAvi = _ref.shouldDisableAviationAmendOption,
12159
- shouldDisableAviationAmendOption = _ref$shouldDisableAvi === void 0 ? false : _ref$shouldDisableAvi;
12160
- if (warning.type === 'maritimeWarningCoastal' || warning.type === 'maritimeWarningNorthSea') {
12161
- return [{
12162
- text: t('warning-list-button-update'),
12163
- action: function action() {
12164
- return onActionMaritimeWarning(warning, MaritimeWarningAction.UPDATE);
12165
- },
12166
- icon: jsx(Edit, {})
12167
- }, {
12168
- text: t('warning-list-button-extend'),
12169
- action: function action() {
12235
+ /* *
12236
+ * Licensed under the Apache License, Version 2.0 (the "License");
12237
+ * you may not use this file except in compliance with the License.
12238
+ * You may obtain a copy of the License at
12239
+ *
12240
+ * http://www.apache.org/licenses/LICENSE-2.0
12241
+ *
12242
+ * Unless required by applicable law or agreed to in writing, software
12243
+ * distributed under the License is distributed on an "AS IS" BASIS,
12244
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12245
+ * See the License for the specific language governing permissions and
12246
+ * limitations under the License.
12247
+ *
12248
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12249
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
12250
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
12251
+ * */
12252
+ var draftStripes = function draftStripes(stripeColor, bgColor) {
12253
+ return "repeating-linear-gradient(\n -45deg,\n transparent,\n transparent 8px,\n " + stripeColor + " 8px,\n " + stripeColor + " 9px\n ), " + bgColor;
12254
+ };
12255
+ var TimelineColors = {
12256
+ // Public warnings - Extreme (Red)
12257
+ extreme: {
12258
+ published: {
12259
+ background: LevelColors.extreme.color,
12260
+ border: LevelColors.extreme.borderColor,
12261
+ iconColor: LevelColors.extreme.textColor,
12262
+ letterColor: LevelColors.extreme.textColor
12263
+ },
12264
+ draft: {
12265
+ background: '#F1D0D0',
12266
+ stripeColor: 'rgba(255, 255, 255, 0.5)',
12267
+ border: LevelColors.extreme.borderColor,
12268
+ iconColor: LevelColors.extreme.color,
12269
+ letterColor: LevelColors.extreme.color
12270
+ },
12271
+ expired: {
12272
+ background: '#EFEFEF',
12273
+ border: LevelColors.extreme.borderColor,
12274
+ iconColor: LevelColors.extreme.color,
12275
+ letterColor: LevelColors.extreme.color
12276
+ }
12277
+ },
12278
+ // Public warnings - Severe (Orange)
12279
+ severe: {
12280
+ published: {
12281
+ background: LevelColors.severe.color,
12282
+ border: LevelColors.severe.borderColor,
12283
+ iconColor: 'white',
12284
+ letterColor: 'white'
12285
+ },
12286
+ draft: {
12287
+ background: '#FADDC2',
12288
+ stripeColor: 'rgba(255, 255, 255, 0.5)',
12289
+ border: '#E27000',
12290
+ iconColor: '#9C4D00',
12291
+ letterColor: '#9C4D00'
12292
+ },
12293
+ expired: {
12294
+ background: '#EFEFEF',
12295
+ border: '#E27000',
12296
+ iconColor: '#9C4D00',
12297
+ letterColor: '#9C4D00'
12298
+ }
12299
+ },
12300
+ // Public warnings - Moderate (Yellow)
12301
+ moderate: {
12302
+ published: {
12303
+ background: LevelColors.moderate.color,
12304
+ border: LevelColors.moderate.borderColor,
12305
+ iconColor: '#3A3400',
12306
+ letterColor: '#3A3400'
12307
+ },
12308
+ draft: {
12309
+ background: '#FFFACE',
12310
+ stripeColor: 'rgba(250, 226, 28, 0.5)',
12311
+ // Yellow stripes
12312
+ border: LevelColors.moderate.borderColor,
12313
+ iconColor: '#3A3400',
12314
+ letterColor: '#3A3400'
12315
+ },
12316
+ expired: {
12317
+ background: '#EFEFEF',
12318
+ border: LevelColors.moderate.borderColor,
12319
+ iconColor: '#3A3400',
12320
+ letterColor: '#3A3400'
12321
+ }
12322
+ },
12323
+ // Aviation (SIGMET/AIRMET) - Blue
12324
+ aviation: {
12325
+ published: {
12326
+ background: '#186DFF',
12327
+ border: '#0800B9',
12328
+ iconColor: '#FFFFFF',
12329
+ letterColor: '#FFFFFF'
12330
+ },
12331
+ draft: {
12332
+ background: '#E3EDFF',
12333
+ stripeColor: 'rgba(255, 255, 255, 0.5)',
12334
+ border: '#0800B9',
12335
+ iconColor: '#0800B9',
12336
+ letterColor: '#0800B9'
12337
+ },
12338
+ expired: {
12339
+ background: '#EFEFEF',
12340
+ border: '#0800B9',
12341
+ iconColor: '#186DFF',
12342
+ letterColor: '#186DFF'
12343
+ }
12344
+ },
12345
+ // Default/fallback
12346
+ "default": {
12347
+ published: {
12348
+ background: '#FFFFFF',
12349
+ border: '#AAAAAA',
12350
+ iconColor: '#333333',
12351
+ letterColor: '#333333'
12352
+ },
12353
+ draft: {
12354
+ background: '#FFFFFF',
12355
+ stripeColor: 'rgba(255, 255, 255, 0.5)',
12356
+ border: '#AAAAAA',
12357
+ iconColor: '#333333',
12358
+ letterColor: '#333333'
12359
+ },
12360
+ expired: {
12361
+ background: '#EFEFEF',
12362
+ border: '#AAAAAA',
12363
+ iconColor: '#333333',
12364
+ letterColor: '#333333'
12365
+ }
12366
+ }
12367
+ };
12368
+ var getThemeForLevel = function getThemeForLevel(level, isAviation) {
12369
+ if (isAviation) {
12370
+ return TimelineColors.aviation;
12371
+ }
12372
+ switch (level) {
12373
+ case WarningLevel.extreme:
12374
+ return TimelineColors.extreme;
12375
+ case WarningLevel.severe:
12376
+ return TimelineColors.severe;
12377
+ case WarningLevel.moderate:
12378
+ return TimelineColors.moderate;
12379
+ default:
12380
+ return TimelineColors["default"];
12381
+ }
12382
+ };
12383
+ var getBlockStyle = function getBlockStyle(level, status, isAviation) {
12384
+ var theme = getThemeForLevel(level, isAviation);
12385
+ if (status === PublicWarningStatus.DRAFT || status === PublicWarningStatus.DRAFT_PUBLISHED) {
12386
+ var _theme$draft = theme.draft,
12387
+ stripeColor = _theme$draft.stripeColor,
12388
+ background = _theme$draft.background,
12389
+ border = _theme$draft.border,
12390
+ iconColor = _theme$draft.iconColor,
12391
+ letterColor = _theme$draft.letterColor;
12392
+ return {
12393
+ background: draftStripes(stripeColor, background),
12394
+ border: "1px solid " + border,
12395
+ borderColor: border,
12396
+ iconColor: iconColor,
12397
+ letterColor: letterColor
12398
+ };
12399
+ }
12400
+ if (status === PublicWarningStatus.EXPIRED) {
12401
+ return {
12402
+ background: theme.expired.background,
12403
+ border: "1px solid " + theme.expired.border,
12404
+ borderColor: theme.expired.border,
12405
+ iconColor: theme.expired.iconColor,
12406
+ letterColor: theme.expired.letterColor
12407
+ };
12408
+ }
12409
+ // Published (default)
12410
+ return {
12411
+ background: theme.published.background,
12412
+ border: "1px solid " + theme.published.border,
12413
+ borderColor: theme.published.border,
12414
+ iconColor: theme.published.iconColor,
12415
+ letterColor: theme.published.letterColor
12416
+ };
12417
+ };
12418
+
12419
+ var _STATUS_SORT_ORDER;
12420
+ var EDGE_PADDING = 24;
12421
+ var getEffectiveStatus = function getEffectiveStatus(warning) {
12422
+ var _warning$status;
12423
+ return (_warning$status = warning.status) != null ? _warning$status : mapProductStatusToWarningStatus(warning.productStatus);
12424
+ };
12425
+ var STATUS_SORT_ORDER = (_STATUS_SORT_ORDER = {}, _STATUS_SORT_ORDER[PublicWarningStatus.PUBLISHED] = 0, _STATUS_SORT_ORDER[PublicWarningStatus.DRAFT_PUBLISHED] = 0, _STATUS_SORT_ORDER[PublicWarningStatus.EXPIRED] = 1, _STATUS_SORT_ORDER[PublicWarningStatus.WITHDRAWN] = 1, _STATUS_SORT_ORDER[PublicWarningStatus.IGNORED] = 1, _STATUS_SORT_ORDER[PublicWarningStatus.DRAFT] = 2, _STATUS_SORT_ORDER[PublicWarningStatus.TODO] = 3, _STATUS_SORT_ORDER);
12426
+ var compareWarningsByStatus = function compareWarningsByStatus(warningA, warningB) {
12427
+ return STATUS_SORT_ORDER[getEffectiveStatus(warningA)] - STATUS_SORT_ORDER[getEffectiveStatus(warningB)];
12428
+ };
12429
+ var SIZE_THRESHOLDS = {
12430
+ xxs: 24,
12431
+ xs: 50,
12432
+ sm: 100
12433
+ };
12434
+ var getTimelineX = function getTimelineX(targetTime, timelineStart, timelineEnd, drawableWidth) {
12435
+ var totalTimelineDuration = timelineEnd.getTime() - timelineStart.getTime();
12436
+ if (totalTimelineDuration <= 0) {
12437
+ return 0;
12438
+ }
12439
+ var elapsedMs = targetTime.getTime() - timelineStart.getTime();
12440
+ return EDGE_PADDING + elapsedMs / totalTimelineDuration * drawableWidth;
12441
+ };
12442
+ var getTimeFromX = function getTimeFromX(x, timelineStart, timelineEnd, drawableWidth) {
12443
+ var totalTimelineDuration = timelineEnd.getTime() - timelineStart.getTime();
12444
+ if (drawableWidth <= 0) {
12445
+ return new Date(timelineStart);
12446
+ }
12447
+ var adjustedX = x - EDGE_PADDING;
12448
+ var ratio = adjustedX / drawableWidth;
12449
+ var timeMs = timelineStart.getTime() + ratio * totalTimelineDuration;
12450
+ return new Date(timeMs);
12451
+ };
12452
+ var generateTicks = function generateTicks(timelineStart, timelineEnd) {
12453
+ var ticks = [];
12454
+ var hourInterval = 3;
12455
+ var current = new Date(timelineStart);
12456
+ current.setUTCMinutes(0, 0, 0);
12457
+ if (current < timelineStart) {
12458
+ current.setUTCHours(current.getUTCHours() + 1);
12459
+ }
12460
+ while (current <= timelineEnd) {
12461
+ var hour = current.getUTCHours();
12462
+ if (hour === 0) {
12463
+ ticks.push({
12464
+ time: new Date(current),
12465
+ type: 'day'
12466
+ });
12467
+ } else if (hour % hourInterval === 0) {
12468
+ ticks.push({
12469
+ time: new Date(current),
12470
+ type: 'major'
12471
+ });
12472
+ } else {
12473
+ ticks.push({
12474
+ time: new Date(current),
12475
+ type: 'dashed'
12476
+ });
12477
+ }
12478
+ current.setUTCHours(current.getUTCHours() + 1);
12479
+ }
12480
+ return ticks;
12481
+ };
12482
+ var getTickLineStyle = function getTickLineStyle(tickType) {
12483
+ if (tickType === 'day') {
12484
+ return {
12485
+ width: '2px',
12486
+ borderLeft: '2px solid #ABC3FF'
12487
+ };
12488
+ }
12489
+ if (tickType === 'dashed') {
12490
+ return {
12491
+ width: '1px',
12492
+ borderLeft: '1px dashed #E7ECFA'
12493
+ };
12494
+ }
12495
+ return {
12496
+ width: '1px',
12497
+ borderLeft: '1px solid #90caf9'
12498
+ };
12499
+ };
12500
+ var getBlockSize = function getBlockSize(width) {
12501
+ if (width < SIZE_THRESHOLDS.xxs) {
12502
+ return 'xxs';
12503
+ }
12504
+ if (width < SIZE_THRESHOLDS.xs) {
12505
+ return 'xs';
12506
+ }
12507
+ if (width < SIZE_THRESHOLDS.sm) {
12508
+ return 's';
12509
+ }
12510
+ return 'l';
12511
+ };
12512
+
12513
+ var clamp = function clamp(value, min, max) {
12514
+ return Math.min(Math.max(value, min), max);
12515
+ };
12516
+ var formatTime = function formatTime(date) {
12517
+ return date.toLocaleTimeString('en-GB', {
12518
+ hour: '2-digit',
12519
+ minute: '2-digit',
12520
+ hour12: false,
12521
+ timeZone: 'UTC'
12522
+ });
12523
+ };
12524
+ var WarningEventTimelineBlock = /*#__PURE__*/React.memo(function (_ref) {
12525
+ var start = _ref.start,
12526
+ end = _ref.end,
12527
+ now = _ref.now,
12528
+ drawableWidth = _ref.drawableWidth,
12529
+ validFrom = _ref.validFrom,
12530
+ validUntil = _ref.validUntil,
12531
+ level = _ref.level;
12532
+ var from = dateUtils.isoStringToDate(validFrom, false);
12533
+ var until = dateUtils.isoStringToDate(validUntil, false);
12534
+ if (!from || !until) {
12535
+ return null;
12536
+ }
12537
+ var minX = EDGE_PADDING;
12538
+ var maxX = EDGE_PADDING + drawableWidth;
12539
+ var left = clamp(getTimelineX(from, start, end, drawableWidth), minX, maxX);
12540
+ var right = clamp(getTimelineX(until, start, end, drawableWidth), minX, maxX);
12541
+ var width = right - left;
12542
+ if (width <= 0) {
12543
+ return null;
12544
+ }
12545
+ var _getBlockStyle = getBlockStyle(level || null, undefined, false),
12546
+ background = _getBlockStyle.background,
12547
+ border = _getBlockStyle.border;
12548
+ // The part of the block before "now" is rendered grey;
12549
+ var nowX = clamp(getTimelineX(now, start, end, drawableWidth), left, right);
12550
+ var pastPercentage = (nowX - left) / width * 100;
12551
+ return jsxs(Fragment, {
12552
+ children: [jsxs(Box, {
12553
+ "data-testid": "warning-event-block-labels",
12554
+ style: {
12555
+ left: left,
12556
+ width: width
12557
+ },
12558
+ sx: {
12559
+ position: 'absolute',
12560
+ top: 4,
12561
+ display: 'flex',
12562
+ justifyContent: 'space-between',
12563
+ fontSize: 11,
12564
+ color: 'geowebColors.typographyAndIcons.text',
12565
+ pointerEvents: 'none',
12566
+ zIndex: 3
12567
+ },
12568
+ children: [jsx(Box, {
12569
+ component: "span",
12570
+ children: formatTime(from)
12571
+ }), jsx(Box, {
12572
+ component: "span",
12573
+ children: formatTime(until)
12574
+ })]
12575
+ }), jsxs(Box, {
12576
+ "data-testid": "warning-event-block",
12577
+ style: {
12578
+ left: left,
12579
+ width: width
12580
+ },
12581
+ sx: {
12582
+ position: 'absolute',
12583
+ top: 24,
12584
+ height: 40,
12585
+ border: border,
12586
+ overflow: 'hidden'
12587
+ },
12588
+ children: [jsx(Box, {
12589
+ "data-testid": "warning-event-block-past",
12590
+ style: {
12591
+ width: pastPercentage + "%"
12592
+ },
12593
+ sx: {
12594
+ position: 'absolute',
12595
+ left: 0,
12596
+ top: 0,
12597
+ bottom: 0,
12598
+ backgroundColor: 'geowebColors.greys.accessibleLight'
12599
+ }
12600
+ }), jsx(Box, {
12601
+ "data-testid": "warning-event-block-future",
12602
+ style: {
12603
+ width: 100 - pastPercentage + "%"
12604
+ },
12605
+ sx: {
12606
+ position: 'absolute',
12607
+ right: 0,
12608
+ top: 0,
12609
+ bottom: 0,
12610
+ background: background
12611
+ }
12612
+ })]
12613
+ })]
12614
+ });
12615
+ });
12616
+
12617
+ var HEADER_HEIGHT = 32;
12618
+ var AXIS_HEIGHT = 24;
12619
+ var AXIS_TICK_HEIGHT = 7;
12620
+ var MS_PER_DAY$1 = 24 * 60 * 60 * 1000;
12621
+ var NOW_LINE_YELLOW = '#FAE21E';
12622
+ var getAxisIntervals = function getAxisIntervals(rangeDays) {
12623
+ if (rangeDays <= 1) {
12624
+ return {
12625
+ tickHours: 1,
12626
+ labelHours: 3
12627
+ };
12628
+ }
12629
+ if (rangeDays <= 2) {
12630
+ return {
12631
+ tickHours: 3,
12632
+ labelHours: 6
12633
+ };
12634
+ }
12635
+ return {
12636
+ tickHours: 6,
12637
+ labelHours: 12
12638
+ };
12639
+ };
12640
+ var formatDayHeader = function formatDayHeader(date) {
12641
+ return date.toLocaleDateString('en-GB', {
12642
+ weekday: 'short',
12643
+ day: 'numeric',
12644
+ month: 'short',
12645
+ timeZone: 'UTC'
12646
+ });
12647
+ };
12648
+ var WarningEventTimeline = function WarningEventTimeline(_ref) {
12649
+ var start = _ref.start,
12650
+ end = _ref.end,
12651
+ validFrom = _ref.validFrom,
12652
+ validUntil = _ref.validUntil,
12653
+ level = _ref.level,
12654
+ nowProp = _ref.now;
12655
+ var containerRef = React.useRef(null);
12656
+ var _React$useState = React.useState(0),
12657
+ width = _React$useState[0],
12658
+ setWidth = _React$useState[1];
12659
+ // Re-read on every render (not memoized) so the current-time marker and the
12660
+ // past/future split stay current for the lifetime of the form.
12661
+ var now = nowProp != null ? nowProp : new Date();
12662
+ React.useEffect(function () {
12663
+ var node = containerRef.current;
12664
+ if (!node) {
12665
+ return undefined;
12666
+ }
12667
+ var resizeObserver = new ResizeObserver(function (entries) {
12668
+ var _loop = function _loop() {
12669
+ var entry = _step.value;
12670
+ var next = Math.round(entry.contentRect.width);
12671
+ setWidth(function (current) {
12672
+ return current === next ? current : next;
12673
+ });
12674
+ };
12675
+ for (var _iterator = _createForOfIteratorHelperLoose(entries), _step; !(_step = _iterator()).done;) {
12676
+ _loop();
12677
+ }
12678
+ });
12679
+ resizeObserver.observe(node);
12680
+ return function () {
12681
+ return resizeObserver.disconnect();
12682
+ };
12683
+ }, []);
12684
+ var drawableWidth = Math.max(1, width - 2 * EDGE_PADDING);
12685
+ var ticks = React.useMemo(function () {
12686
+ return generateTicks(start, end);
12687
+ }, [start, end]);
12688
+ var dayTicks = ticks.filter(function (tick) {
12689
+ return tick.type === 'day';
12690
+ });
12691
+ var rangeDays = Math.round((end.getTime() - start.getTime()) / MS_PER_DAY$1);
12692
+ var _getAxisIntervals = getAxisIntervals(rangeDays),
12693
+ tickHours = _getAxisIntervals.tickHours,
12694
+ labelHours = _getAxisIntervals.labelHours;
12695
+ var showNow = now.getTime() >= start.getTime() && now.getTime() <= end.getTime();
12696
+ var nowX = getTimelineX(now, start, end, drawableWidth);
12697
+ // Day headers ("Today / +N") are labelled relative to the actual current day,
12698
+ // so a range that starts later than today (e.g. an early warning) still reads
12699
+ // "+2" on its first day rather than "Today".
12700
+ var dayZero = dateUtils.startOfDayUTC(now);
12701
+ return jsxs(Box, {
12702
+ ref: containerRef,
12703
+ sx: {
12704
+ position: 'relative',
12705
+ width: '100%',
12706
+ height: '100%',
12707
+ backgroundColor: 'geowebColors.background.surface',
12708
+ overflow: 'hidden'
12709
+ },
12710
+ children: [dayTicks.map(function (tick) {
12711
+ return jsx(Box, {
12712
+ "data-testid": "timeline-day-line",
12713
+ sx: {
12714
+ position: 'absolute',
12715
+ left: getTimelineX(tick.time, start, end, drawableWidth),
12716
+ top: 0,
12717
+ bottom: 0,
12718
+ borderLeft: '1px solid',
12719
+ borderColor: 'geowebColors.cards.cardContainerBorder'
12720
+ }
12721
+ }, "line-" + tick.time.toISOString());
12722
+ }), showNow ? jsx(Box, {
12723
+ "data-testid": "timeline-now-line",
12724
+ sx: {
12725
+ position: 'absolute',
12726
+ left: nowX,
12727
+ top: 0,
12728
+ bottom: AXIS_HEIGHT - AXIS_TICK_HEIGHT,
12729
+ width: '3px',
12730
+ background: function background(theme) {
12731
+ return "linear-gradient(to right, " + NOW_LINE_YELLOW + " 0 33.333%, " + theme.palette.geowebColors.functional.error + " 33.333% 66.667%, " + NOW_LINE_YELLOW + " 66.667% 100%)";
12732
+ },
12733
+ zIndex: 2
12734
+ }
12735
+ }) : null, dayTicks.filter(function (tick) {
12736
+ return tick.time.getTime() < end.getTime();
12737
+ }).map(function (tick) {
12738
+ var dayOffset = Math.round((tick.time.getTime() - dayZero.getTime()) / MS_PER_DAY$1);
12739
+ var offsetLabel = 'Today';
12740
+ if (dayOffset > 0) {
12741
+ offsetLabel = "+" + dayOffset;
12742
+ } else if (dayOffset < 0) {
12743
+ offsetLabel = "" + dayOffset;
12744
+ }
12745
+ return jsxs(Box, {
12746
+ "data-testid": "timeline-day-header",
12747
+ sx: {
12748
+ position: 'absolute',
12749
+ left: getTimelineX(tick.time, start, end, drawableWidth),
12750
+ top: 2,
12751
+ paddingLeft: 0.5,
12752
+ lineHeight: 1.15,
12753
+ whiteSpace: 'nowrap'
12754
+ },
12755
+ children: [jsx(Box, {
12756
+ sx: {
12757
+ fontSize: 12,
12758
+ fontWeight: 'bold',
12759
+ color: 'geowebColors.typographyAndIcons.text'
12760
+ },
12761
+ children: offsetLabel
12762
+ }), jsx(Box, {
12763
+ sx: {
12764
+ fontSize: 11,
12765
+ color: 'geowebColors.typographyAndIcons.text'
12766
+ },
12767
+ children: formatDayHeader(tick.time)
12768
+ })]
12769
+ }, "header-" + tick.time.toISOString());
12770
+ }), jsx(Box, {
12771
+ sx: {
12772
+ position: 'absolute',
12773
+ left: 0,
12774
+ right: 0,
12775
+ top: HEADER_HEIGHT,
12776
+ bottom: AXIS_HEIGHT
12777
+ },
12778
+ children: jsx(WarningEventTimelineBlock, {
12779
+ drawableWidth: drawableWidth,
12780
+ end: end,
12781
+ level: level,
12782
+ now: now,
12783
+ start: start,
12784
+ validFrom: validFrom,
12785
+ validUntil: validUntil
12786
+ })
12787
+ }), jsx(Box, {
12788
+ sx: {
12789
+ position: 'absolute',
12790
+ left: 0,
12791
+ right: 0,
12792
+ bottom: 0,
12793
+ height: AXIS_HEIGHT
12794
+ },
12795
+ children: ticks.map(function (tick) {
12796
+ var hour = tick.time.getUTCHours();
12797
+ var showTick = tick.type !== 'day' && hour % tickHours === 0;
12798
+ var showLabel = hour % labelHours === 0;
12799
+ if (!showTick && !showLabel) {
12800
+ return null;
12801
+ }
12802
+ var x = getTimelineX(tick.time, start, end, drawableWidth);
12803
+ return jsxs(React.Fragment, {
12804
+ children: [showTick ? jsx(Box, {
12805
+ "data-testid": "timeline-hour-tick",
12806
+ sx: {
12807
+ position: 'absolute',
12808
+ left: x,
12809
+ top: 0,
12810
+ height: showLabel ? AXIS_TICK_HEIGHT : 4,
12811
+ borderLeft: '1px solid',
12812
+ borderColor: 'geowebColors.typographyAndIcons.inactiveText'
12813
+ }
12814
+ }) : null, showLabel ? jsx(Box, {
12815
+ "data-testid": "timeline-axis-label",
12816
+ sx: {
12817
+ position: 'absolute',
12818
+ left: x,
12819
+ top: 9,
12820
+ transform: 'translateX(-50%)',
12821
+ fontSize: 11,
12822
+ color: 'geowebColors.typographyAndIcons.inactiveText'
12823
+ },
12824
+ children: String(tick.time.getUTCHours()).padStart(2, '0') + ":00"
12825
+ }) : null]
12826
+ }, "tick-" + tick.time.toISOString());
12827
+ })
12828
+ })]
12829
+ });
12830
+ };
12831
+
12832
+ var WarningEventTimelineRangeContext = /*#__PURE__*/React.createContext(null);
12833
+ var WarningEventTimelineRangeProvider = function WarningEventTimelineRangeProvider(_ref) {
12834
+ var range = _ref.range,
12835
+ children = _ref.children;
12836
+ return jsx(WarningEventTimelineRangeContext.Provider, {
12837
+ value: range,
12838
+ children: children
12839
+ });
12840
+ };
12841
+ var useTimelineRange = function useTimelineRange() {
12842
+ var range = React.useContext(WarningEventTimelineRangeContext);
12843
+ if (!range) {
12844
+ throw new Error('useTimelineRange must be used within a WarningEventTimelineRangeProvider');
12845
+ }
12846
+ return range;
12847
+ };
12848
+
12849
+ /* *
12850
+ * Licensed under the Apache License, Version 2.0 (the "License");
12851
+ * you may not use this file except in compliance with the License.
12852
+ * You may obtain a copy of the License at
12853
+ *
12854
+ * http://www.apache.org/licenses/LICENSE-2.0
12855
+ *
12856
+ * Unless required by applicable law or agreed to in writing, software
12857
+ * distributed under the License is distributed on an "AS IS" BASIS,
12858
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12859
+ * See the License for the specific language governing permissions and
12860
+ * limitations under the License.
12861
+ *
12862
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12863
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
12864
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
12865
+ * */
12866
+ var getTimelineRange = function getTimelineRange(selectedDays, now) {
12867
+ if (now === void 0) {
12868
+ now = dateUtils.getNowUtc();
12869
+ }
12870
+ var dayZero = dateUtils.startOfDayUTC(now);
12871
+ var minDay = selectedDays.length ? Math.min.apply(Math, selectedDays) : 0;
12872
+ var maxDay = selectedDays.length ? Math.max.apply(Math, selectedDays) : 1;
12873
+ // The window starts at the earliest selected day (so a later-starting type
12874
+ // shifts the whole range) and ends at the end of the latest selected day.
12875
+ var start = dateUtils.add(dayZero, {
12876
+ days: minDay
12877
+ });
12878
+ var end = dateUtils.add(dayZero, {
12879
+ days: maxDay + 1
12880
+ });
12881
+ return {
12882
+ start: start,
12883
+ end: end
12884
+ };
12885
+ };
12886
+
12887
+ var warningEventItemDefaultValues = {
12888
+ incident: '',
12889
+ validFrom: '',
12890
+ validUntil: '',
12891
+ level: '',
12892
+ probability: undefined,
12893
+ domain: '',
12894
+ warningProposalSource: '',
12895
+ authority: '',
12896
+ phenomenon: '',
12897
+ type: 0,
12898
+ warning_handle_uuid: ''
12899
+ };
12900
+ var WarningEventItem = function WarningEventItem(_ref) {
12901
+ var index = _ref.index,
12902
+ isReadOnly = _ref.isReadOnly,
12903
+ onDeleteWarning = _ref.onDeleteWarning;
12904
+ var _React$useState = React.useState(null),
12905
+ menuAnchorEl = _React$useState[0],
12906
+ setMenuAnchorEl = _React$useState[1];
12907
+ var _useWarningsTranslati = useWarningsTranslation(),
12908
+ t = _useWarningsTranslati.t;
12909
+ var incident = useWatch({
12910
+ name: 'incident'
12911
+ });
12912
+ var timelineRange = useTimelineRange();
12913
+ var validFrom = useWatch({
12914
+ name: "warnings." + index + ".validFrom"
12915
+ });
12916
+ var validUntil = useWatch({
12917
+ name: "warnings." + index + ".validUntil"
12918
+ });
12919
+ var level = useWatch({
12920
+ name: "warnings." + index + ".level"
12921
+ });
12922
+ return jsxs(Box, {
12923
+ sx: {
12924
+ backgroundColor: 'geowebColors.background.surface',
12925
+ borderRadius: 1,
12926
+ padding: 1,
12927
+ marginBottom: 0.25
12928
+ },
12929
+ children: [jsxs(Box, {
12930
+ sx: {
12931
+ display: 'grid',
12932
+ gridTemplateColumns: '1fr 150px 1fr',
12933
+ alignItems: 'center',
12934
+ gap: 1,
12935
+ mb: 1
12936
+ },
12937
+ children: [jsxs(Box, {
12938
+ sx: {
12939
+ display: 'flex',
12940
+ alignItems: 'center',
12941
+ gap: 1,
12942
+ minWidth: 0
12943
+ },
12944
+ children: [jsx(CustomIconButton, {
12945
+ className: "handle",
12946
+ disabled: isReadOnly,
12947
+ sx: {
12948
+ cursor: 'grab',
12949
+ flexShrink: 0
12950
+ },
12951
+ variant: "flat",
12952
+ children: jsx(DragHandle, {})
12953
+ }), jsx(Box, {
12954
+ sx: {
12955
+ flex: 1,
12956
+ minWidth: 0,
12957
+ maxWidth: 260
12958
+ },
12959
+ children: jsx(Typography, {
12960
+ sx: {
12961
+ fontSize: 14
12962
+ },
12963
+ children: t('public-warning-event-type-warning') + " " + (index + 1)
12964
+ })
12965
+ })]
12966
+ }), jsx(Box, {
12967
+ sx: {
12968
+ display: 'flex',
12969
+ justifyContent: 'center',
12970
+ '& .MuiFormControl-root': {
12971
+ width: '100%'
12972
+ }
12973
+ },
12974
+ children: jsx(ReactHookFormSelect, {
12975
+ disabled: isReadOnly,
12976
+ label: t('warning-probability'),
12977
+ name: "warnings." + index + ".probability",
12978
+ children: probablityOptions.map(function (probability) {
12979
+ return jsxs(MenuItem, {
12980
+ value: probability,
12981
+ children: [probability, " %"]
12982
+ }, probability);
12983
+ })
12984
+ })
12985
+ }), jsxs(Box, {
12986
+ sx: {
12987
+ display: 'flex',
12988
+ alignItems: 'center',
12989
+ gap: 0.5,
12990
+ justifySelf: 'end'
12991
+ },
12992
+ children: [jsx(CustomIconButton, {
12993
+ disabled: isReadOnly,
12994
+ onClick: function onClick(e) {
12995
+ return setMenuAnchorEl(e.currentTarget);
12996
+ },
12997
+ variant: "tool",
12998
+ children: jsx(Options, {})
12999
+ }), jsx(CustomIconButton, {
13000
+ disabled: isReadOnly,
13001
+ variant: "tool",
13002
+ children: jsx(ChevronDown, {})
13003
+ }), jsxs(Menu, {
13004
+ anchorEl: menuAnchorEl,
13005
+ anchorOrigin: {
13006
+ vertical: 'bottom',
13007
+ horizontal: 'right'
13008
+ },
13009
+ onClose: function onClose() {
13010
+ return setMenuAnchorEl(null);
13011
+ },
13012
+ open: Boolean(menuAnchorEl),
13013
+ transformOrigin: {
13014
+ vertical: 'top',
13015
+ horizontal: 'right'
13016
+ },
13017
+ children: [jsx(ListSubheader, {
13018
+ sx: {
13019
+ fontSize: 12,
13020
+ lineHeight: '1.5'
13021
+ },
13022
+ children: t('area-manager-share-menu-options')
13023
+ }), jsxs(MenuItem, {
13024
+ onClick: function onClick() {
13025
+ setMenuAnchorEl(null);
13026
+ },
13027
+ children: [jsx(ListItemText, {
13028
+ children: t('public-warning-event-stop')
13029
+ }), jsx(ListItemIcon, {
13030
+ sx: {
13031
+ justifyContent: 'flex-end'
13032
+ },
13033
+ children: jsx(Notifications, {})
13034
+ })]
13035
+ }), jsxs(MenuItem, {
13036
+ onClick: function onClick() {
13037
+ setMenuAnchorEl(null);
13038
+ onDeleteWarning(index);
13039
+ },
13040
+ children: [jsx(ListItemText, {
13041
+ children: t('public-warning-event-delete')
13042
+ }), jsx(ListItemIcon, {
13043
+ sx: {
13044
+ justifyContent: 'flex-end'
13045
+ },
13046
+ children: jsx(Delete, {})
13047
+ })]
13048
+ })]
13049
+ })]
13050
+ })]
13051
+ }), jsxs(Grid, {
13052
+ container: true,
13053
+ spacing: 1,
13054
+ children: [jsxs(Grid, {
13055
+ size: 4,
13056
+ children: [jsx(Box, {
13057
+ sx: {
13058
+ height: 155,
13059
+ backgroundColor: 'geowebColors.background.surfaceApp',
13060
+ mb: 1
13061
+ }
13062
+ }), jsx(Box, {
13063
+ sx: {
13064
+ border: '1px solid',
13065
+ borderColor: 'geowebColors.typographyAndIcons.iconLinkDisabled'
13066
+ },
13067
+ children: jsxs(Grid, {
13068
+ container: true,
13069
+ children: [jsxs(Grid, {
13070
+ size: 9,
13071
+ sx: {
13072
+ display: 'flex',
13073
+ alignItems: 'center'
13074
+ },
13075
+ children: [jsx(CustomIconButton, {
13076
+ disabled: true,
13077
+ variant: "flat",
13078
+ children: jsx(DragHandle, {})
13079
+ }), jsx(Typography, {
13080
+ sx: {
13081
+ fontSize: 12,
13082
+ fontWeight: 500
13083
+ },
13084
+ children: incident
13085
+ })]
13086
+ }), jsx(Grid, {
13087
+ size: 3
13088
+ })]
13089
+ })
13090
+ })]
13091
+ }), jsx(Grid, {
13092
+ size: 8,
13093
+ children: jsx(Box, {
13094
+ sx: {
13095
+ height: '100%'
13096
+ },
13097
+ children: jsx(WarningEventTimeline, {
13098
+ end: timelineRange.end,
13099
+ level: level != null ? level : '',
13100
+ start: timelineRange.start,
13101
+ validFrom: validFrom != null ? validFrom : '',
13102
+ validUntil: validUntil != null ? validUntil : ''
13103
+ })
13104
+ })
13105
+ })]
13106
+ })]
13107
+ });
13108
+ };
13109
+
13110
+ // Design default for a freshly added warning: a 6-hour Moderate block starting
13111
+ // at Zulu +3.
13112
+ var DEFAULT_WARNING_START_OFFSET_HOURS = 3;
13113
+ var DEFAULT_WARNING_DURATION_HOURS = 6;
13114
+ // Single source of truth for the fields each warning row inherits from the parent event
13115
+ var getInheritedEventFields = function getInheritedEventFields(values) {
13116
+ return {
13117
+ incident: values.incident,
13118
+ phenomenon: values.phenomenon
13119
+ };
13120
+ };
13121
+ var dayOptions = [{
13122
+ label: 'Today',
13123
+ value: 0
13124
+ }, {
13125
+ label: '+1',
13126
+ value: 1
13127
+ }, {
13128
+ label: '+2',
13129
+ value: 2
13130
+ }, {
13131
+ label: '+3',
13132
+ value: 3
13133
+ }, {
13134
+ label: '+4',
13135
+ value: 4
13136
+ }, {
13137
+ label: '+5',
13138
+ value: 5
13139
+ }, {
13140
+ label: '+6',
13141
+ value: 6
13142
+ }, {
13143
+ label: '+7',
13144
+ value: 7
13145
+ }];
13146
+ var DaySelector = function DaySelector(_ref) {
13147
+ var selectedDays = _ref.selectedDays,
13148
+ onToggleDay = _ref.onToggleDay,
13149
+ _ref$isDisabled = _ref.isDisabled,
13150
+ isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled,
13151
+ _ref$minSelectableDay = _ref.minSelectableDay,
13152
+ minSelectableDay = _ref$minSelectableDay === void 0 ? 0 : _ref$minSelectableDay;
13153
+ var chipSize = 32;
13154
+ return jsx(Box, {
13155
+ sx: {
13156
+ display: 'flex',
13157
+ width: chipSize * dayOptions.length
13158
+ },
13159
+ children: dayOptions.map(function (day) {
13160
+ var isSelected = selectedDays.length === 2 && day.value >= Math.min.apply(Math, selectedDays) && day.value <= Math.max.apply(Math, selectedDays);
13161
+ var isDayDisabled = isDisabled || day.value < minSelectableDay;
13162
+ return jsx(Chip, {
13163
+ clickable: !isDayDisabled,
13164
+ color: isSelected ? 'primary' : 'default',
13165
+ "data-testid": "warning-day-chip-" + day.value,
13166
+ disabled: isDayDisabled,
13167
+ label: day.label,
13168
+ onClick: function onClick() {
13169
+ return onToggleDay(day.value);
13170
+ },
13171
+ size: "small",
13172
+ sx: Object.assign({
13173
+ borderRadius: 1,
13174
+ height: chipSize,
13175
+ width: chipSize,
13176
+ borderColor: 'transparent',
13177
+ mr: 0
13178
+ }, day.value === 0 && {
13179
+ fontSize: 8,
13180
+ '.MuiChip-label': {
13181
+ paddingX: 0
13182
+ }
13183
+ }),
13184
+ variant: isSelected ? 'filled' : 'outlined'
13185
+ }, day.value);
13186
+ })
13187
+ });
13188
+ };
13189
+ var WarningEventFormContent = function WarningEventFormContent(_ref2) {
13190
+ var _ref2$isReadOnly = _ref2.isReadOnly,
13191
+ isReadOnly = _ref2$isReadOnly === void 0 ? false : _ref2$isReadOnly,
13192
+ _ref2$onCancel = _ref2.onCancel,
13193
+ onCancel = _ref2$onCancel === void 0 ? function () {} : _ref2$onCancel,
13194
+ _ref2$onDelete = _ref2.onDelete,
13195
+ onDelete = _ref2$onDelete === void 0 ? function () {} : _ref2$onDelete,
13196
+ _ref2$onOpenWarningSu = _ref2.onOpenWarningSummary,
13197
+ onOpenWarningSummary = _ref2$onOpenWarningSu === void 0 ? function () {} : _ref2$onOpenWarningSu,
13198
+ _ref2$onSaveAsDraft = _ref2.onSaveAsDraft,
13199
+ onSaveAsDraft = _ref2$onSaveAsDraft === void 0 ? function (formValues) {} : _ref2$onSaveAsDraft,
13200
+ _ref2$onPublish = _ref2.onPublish,
13201
+ onPublish = _ref2$onPublish === void 0 ? function (formValues) {} : _ref2$onPublish;
13202
+ var _useWarningsTranslati = useWarningsTranslation(),
13203
+ t = _useWarningsTranslati.t;
13204
+ var _useFormContext = useFormContext(),
13205
+ control = _useFormContext.control,
13206
+ getValues = _useFormContext.getValues,
13207
+ handleSubmit = _useFormContext.handleSubmit;
13208
+ var _useFieldArray = useFieldArray({
13209
+ control: control,
13210
+ name: 'warnings'
13211
+ }),
13212
+ fields = _useFieldArray.fields,
13213
+ append = _useFieldArray.append,
13214
+ remove = _useFieldArray.remove,
13215
+ move = _useFieldArray.move;
13216
+ var warningEventType = useWatch({
13217
+ control: control,
13218
+ name: 'warningEventType'
13219
+ });
13220
+ var _React$useState = React.useState(function () {
13221
+ return getDefaultDayRangeForType(getValues('warningEventType'));
13222
+ }),
13223
+ selectedDays = _React$useState[0],
13224
+ setSelectedDays = _React$useState[1];
13225
+ React.useEffect(function () {
13226
+ setSelectedDays(getDefaultDayRangeForType(warningEventType));
13227
+ }, [warningEventType]);
13228
+ var _React$useState2 = React.useState(null),
13229
+ menuAnchorEl = _React$useState2[0],
13230
+ setMenuAnchorEl = _React$useState2[1];
13231
+ var handleToggleDay = function handleToggleDay(day) {
13232
+ setSelectedDays(function (prev) {
13233
+ if (prev.length === 0) {
13234
+ return [day, day];
13235
+ }
13236
+ if (prev.length === 2 && prev[0] === day && prev[1] === day) {
13237
+ return [];
13238
+ }
13239
+ return [prev[0], day];
13240
+ });
13241
+ };
13242
+ var timelineRange = React.useMemo(function () {
13243
+ return getTimelineRange(selectedDays);
13244
+ }, [selectedDays]);
13245
+ var onAddWarning = function onAddWarning() {
13246
+ var validFrom = dateUtils.add(dateUtils.getNowUtc(), {
13247
+ hours: DEFAULT_WARNING_START_OFFSET_HOURS
13248
+ });
13249
+ var validUntil = dateUtils.add(validFrom, {
13250
+ hours: DEFAULT_WARNING_DURATION_HOURS
13251
+ });
13252
+ append(Object.assign({}, warningEventItemDefaultValues, {
13253
+ level: WarningLevel.moderate,
13254
+ validFrom: validFrom.toISOString(),
13255
+ validUntil: validUntil.toISOString()
13256
+ }, getInheritedEventFields(getValues())));
13257
+ };
13258
+ var onDeleteWarning = function onDeleteWarning(index) {
13259
+ remove(index);
13260
+ };
13261
+ var buildSubmitValues = function buildSubmitValues(values) {
13262
+ var inherited = getInheritedEventFields(values);
13263
+ return Object.assign({}, values, {
13264
+ warnings: values.warnings.map(function (warning) {
13265
+ return Object.assign({}, warning, inherited);
13266
+ })
13267
+ });
13268
+ };
13269
+ var handleSaveAsDraft = handleSubmit(function (values) {
13270
+ onSaveAsDraft(buildSubmitValues(values));
13271
+ });
13272
+ var handlePublish = handleSubmit(function (values) {
13273
+ onPublish(buildSubmitValues(values));
13274
+ });
13275
+ return jsxs(Box, {
13276
+ sx: {
13277
+ display: 'flex',
13278
+ flexDirection: 'column',
13279
+ height: '100%',
13280
+ backgroundColor: 'geowebColors.background.surfaceApp'
13281
+ },
13282
+ children: [jsxs(Box, {
13283
+ sx: {
13284
+ flex: 1,
13285
+ overflowY: 'auto',
13286
+ overflowX: 'hidden',
13287
+ paddingX: 2,
13288
+ paddingY: 1,
13289
+ display: 'flex',
13290
+ flexDirection: 'column',
13291
+ gap: 0.25
13292
+ },
13293
+ children: [jsxs(Box, {
13294
+ sx: {
13295
+ backgroundColor: 'geowebColors.background.surface',
13296
+ borderRadius: 1,
13297
+ padding: 1
13298
+ },
13299
+ children: [jsxs(Box, {
13300
+ sx: {
13301
+ display: 'flex',
13302
+ alignItems: 'center',
13303
+ gap: 1
13304
+ },
13305
+ children: [jsx(Box, {
13306
+ sx: {
13307
+ flex: '1 1 0',
13308
+ minWidth: 0,
13309
+ position: 'relative'
13310
+ },
13311
+ children: jsx(ReactHookFormTextField, {
13312
+ disabled: isReadOnly,
13313
+ label: t('public-warning-event-incident'),
13314
+ name: "incident"
13315
+ })
13316
+ }), jsx(Box, {
13317
+ sx: {
13318
+ flex: '1.3 1 0',
13319
+ minWidth: 0,
13320
+ '& .MuiSelect-select .MuiGrid-container': {
13321
+ flexWrap: 'nowrap',
13322
+ alignItems: 'center',
13323
+ flexDirection: 'row-reverse',
13324
+ justifyContent: 'flex-end !important',
13325
+ gap: 1
13326
+ },
13327
+ '& .MuiSelect-select .MuiGrid-container > .MuiGrid-root:last-child': {
13328
+ minWidth: 'auto'
13329
+ },
13330
+ '& .MuiSelect-select .MuiSvgIcon-root': {
13331
+ fontSize: '1.2rem'
13332
+ }
13333
+ },
13334
+ children: jsx(Phenomenon, {
13335
+ isDisabled: isReadOnly,
13336
+ isReadOnly: isReadOnly
13337
+ })
13338
+ }), jsx(Box, {
13339
+ sx: {
13340
+ flex: '1.3 1 0',
13341
+ minWidth: 0
13342
+ },
13343
+ children: jsx(ReactHookFormSelect, {
13344
+ disabled: isReadOnly,
13345
+ label: t('public-warning-event-warning-type'),
13346
+ name: "warningEventType",
13347
+ children: warningEventTypes.map(function (type) {
13348
+ return jsx(MenuItem, {
13349
+ value: type.key,
13350
+ children: t(type.translationKey)
13351
+ }, type.key);
13352
+ })
13353
+ })
13354
+ }), jsxs(Box, {
13355
+ sx: {
13356
+ display: 'flex',
13357
+ alignItems: 'center',
13358
+ gap: 0.5,
13359
+ flexShrink: 0
13360
+ },
13361
+ children: [jsx(DaySelector, {
13362
+ isDisabled: isReadOnly,
13363
+ minSelectableDay: getMinSelectableDayForType(warningEventType),
13364
+ onToggleDay: handleToggleDay,
13365
+ selectedDays: selectedDays
13366
+ }), jsx(CustomIconButton, {
13367
+ disabled: isReadOnly,
13368
+ variant: "tool",
13369
+ children: jsx(AlertBadge, {})
13370
+ }), jsx(CustomIconButton, {
13371
+ disabled: isReadOnly,
13372
+ onClick: function onClick(e) {
13373
+ return setMenuAnchorEl(e.currentTarget);
13374
+ },
13375
+ variant: "tool",
13376
+ children: jsx(Options, {})
13377
+ }), jsxs(Menu, {
13378
+ anchorEl: menuAnchorEl,
13379
+ onClose: function onClose() {
13380
+ return setMenuAnchorEl(null);
13381
+ },
13382
+ open: Boolean(menuAnchorEl),
13383
+ children: [jsx(ListSubheader, {
13384
+ sx: {
13385
+ fontSize: 12,
13386
+ lineHeight: '1.5'
13387
+ },
13388
+ children: t('area-manager-share-menu-options')
13389
+ }), jsxs(MenuItem, {
13390
+ onClick: function onClick() {
13391
+ setMenuAnchorEl(null);
13392
+ },
13393
+ children: [jsx(ListItemText, {
13394
+ children: t('public-warning-event-stop')
13395
+ }), jsx(ListItemIcon, {
13396
+ sx: {
13397
+ justifyContent: 'flex-end'
13398
+ },
13399
+ children: jsx(Notifications, {})
13400
+ })]
13401
+ }), jsxs(MenuItem, {
13402
+ onClick: function onClick() {
13403
+ setMenuAnchorEl(null);
13404
+ onDelete();
13405
+ },
13406
+ children: [jsx(ListItemText, {
13407
+ children: t('public-warning-event-delete')
13408
+ }), jsx(ListItemIcon, {
13409
+ sx: {
13410
+ justifyContent: 'flex-end'
13411
+ },
13412
+ children: jsx(Delete, {})
13413
+ })]
13414
+ })]
13415
+ }), jsx(CustomIconButton, {
13416
+ disabled: isReadOnly,
13417
+ variant: "tool",
13418
+ children: jsx(ChevronDown, {})
13419
+ })]
13420
+ })]
13421
+ }), jsxs(Grid, {
13422
+ columnSpacing: 2,
13423
+ container: true,
13424
+ rowSpacing: 2,
13425
+ sx: {
13426
+ marginTop: 0.5
13427
+ },
13428
+ children: [jsx(Grid, {
13429
+ size: {
13430
+ xs: 12,
13431
+ sm: 6
13432
+ },
13433
+ children: jsxs(Box, {
13434
+ sx: {
13435
+ position: 'relative'
13436
+ },
13437
+ children: [jsx(ReactHookFormTextField, {
13438
+ disabled: isReadOnly,
13439
+ label: t('public-warning-event-summary'),
13440
+ minRows: 3,
13441
+ multiline: true,
13442
+ name: "texts.headlineOriginal"
13443
+ }), jsx(CustomIconButton, {
13444
+ disabled: isReadOnly,
13445
+ onClick: onOpenWarningSummary,
13446
+ sx: {
13447
+ position: 'absolute',
13448
+ right: 0,
13449
+ bottom: 8,
13450
+ zIndex: 1
13451
+ },
13452
+ variant: "tool",
13453
+ children: jsx(Edit, {})
13454
+ })]
13455
+ })
13456
+ }), jsx(Grid, {
13457
+ size: {
13458
+ xs: 12,
13459
+ sm: 6
13460
+ },
13461
+ children: jsx(ReactHookFormTextField, {
13462
+ disabled: isReadOnly,
13463
+ label: t('public-warning-event-translation'),
13464
+ minRows: 3,
13465
+ multiline: true,
13466
+ name: "texts.headlineTranslation"
13467
+ })
13468
+ })]
13469
+ })]
13470
+ }), jsx(WarningEventTimelineRangeProvider, {
13471
+ range: timelineRange,
13472
+ children: jsx(ReactSortable, {
13473
+ animation: 200,
13474
+ direction: "vertical",
13475
+ handle: ".handle",
13476
+ list: fields,
13477
+ onSort: function onSort(_ref3) {
13478
+ var oldIndex = _ref3.oldIndex,
13479
+ newIndex = _ref3.newIndex;
13480
+ if (oldIndex === undefined || newIndex === undefined) {
13481
+ return;
13482
+ }
13483
+ move(oldIndex, newIndex);
13484
+ },
13485
+ setList: function setList() {},
13486
+ tag: "div",
13487
+ children: fields.map(function (field, index) {
13488
+ return jsx(WarningEventItem, {
13489
+ index: index,
13490
+ isReadOnly: isReadOnly,
13491
+ onDeleteWarning: onDeleteWarning
13492
+ }, field.id);
13493
+ })
13494
+ })
13495
+ }), !isReadOnly && jsx(Box, {
13496
+ sx: {
13497
+ display: 'flex',
13498
+ justifyContent: 'center'
13499
+ },
13500
+ children: jsx(Button, {
13501
+ onClick: onAddWarning,
13502
+ startIcon: jsx(Add, {}),
13503
+ variant: "tertiary",
13504
+ children: t('public-warning-event-add-warning')
13505
+ })
13506
+ })]
13507
+ }), !isReadOnly && jsx(Box, {
13508
+ sx: {
13509
+ display: 'flex',
13510
+ justifyContent: 'center',
13511
+ alignItems: 'center',
13512
+ padding: 2,
13513
+ borderTop: 1,
13514
+ borderColor: 'divider'
13515
+ },
13516
+ children: jsxs(Box, {
13517
+ sx: {
13518
+ display: 'flex',
13519
+ gap: 1,
13520
+ alignItems: 'center',
13521
+ '& button:not(:last-child)': {
13522
+ mr: 3
13523
+ }
13524
+ },
13525
+ children: [jsx(Button, {
13526
+ onClick: onCancel,
13527
+ variant: "tertiary",
13528
+ children: t('public-warning-event-button-cancel')
13529
+ }), jsx(Button, {
13530
+ color: "error",
13531
+ onClick: onDelete,
13532
+ variant: "tertiary",
13533
+ children: t('public-warning-event-button-delete')
13534
+ }), jsx(Button, {
13535
+ onClick: handleSaveAsDraft,
13536
+ variant: "tertiary",
13537
+ children: t('public-warning-event-button-save-draft')
13538
+ }), jsx(Button, {
13539
+ onClick: handlePublish,
13540
+ variant: "primary",
13541
+ children: t('public-warning-event-button-publish')
13542
+ })]
13543
+ })
13544
+ })]
13545
+ });
13546
+ };
13547
+
13548
+ var DEFAULT_SIZE = {
13549
+ width: 1024,
13550
+ height: 600
13551
+ };
13552
+ var DEFAULT_POSITION = {
13553
+ top: 8,
13554
+ left: 60
13555
+ };
13556
+ var DEFAULT_MIN_SIZE = {
13557
+ width: 600,
13558
+ height: 400
13559
+ };
13560
+ var WarningEventDialog = function WarningEventDialog(_ref) {
13561
+ var bounds = _ref.bounds,
13562
+ isOpen = _ref.isOpen,
13563
+ onClose = _ref.onClose,
13564
+ _ref$onMouseDown = _ref.onMouseDown,
13565
+ onMouseDown = _ref$onMouseDown === void 0 ? function () {} : _ref$onMouseDown,
13566
+ _ref$order = _ref.order,
13567
+ order = _ref$order === void 0 ? 0 : _ref$order,
13568
+ _ref$source = _ref.source,
13569
+ source = _ref$source === void 0 ? 'app' : _ref$source,
13570
+ _ref$size = _ref.size,
13571
+ size = _ref$size === void 0 ? DEFAULT_SIZE : _ref$size,
13572
+ _ref$startPosition = _ref.startPosition,
13573
+ startPosition = _ref$startPosition === void 0 ? DEFAULT_POSITION : _ref$startPosition,
13574
+ _ref$headerSize = _ref.headerSize,
13575
+ headerSize = _ref$headerSize === void 0 ? 'xs' : _ref$headerSize,
13576
+ children = _ref.children;
13577
+ var _useWarningsTranslati = useWarningsTranslation(),
13578
+ t = _useWarningsTranslati.t;
13579
+ var startSizeCalc = calculateStartSize(DEFAULT_MIN_SIZE, size, startPosition);
13580
+ var _React$useState = React.useState(startSizeCalc),
13581
+ sizeInState = _React$useState[0],
13582
+ setSizeInState = _React$useState[1];
13583
+ return jsx(ToolContainerDraggable, {
13584
+ bounds: bounds,
13585
+ dragHandleIcon: null,
13586
+ headerSize: headerSize,
13587
+ isOpen: isOpen,
13588
+ minHeight: DEFAULT_MIN_SIZE.height,
13589
+ minWidth: DEFAULT_MIN_SIZE.width,
13590
+ onClose: onClose,
13591
+ onDragEnd: function onDragEnd(_position, dragSize) {
13592
+ if (dragSize !== sizeInState) {
13593
+ setSizeInState(dragSize);
13594
+ }
13595
+ },
13596
+ onMouseDown: onMouseDown,
13597
+ onResizeStop: function onResizeStop(_event, _direction, node) {
13598
+ var width = node.offsetWidth,
13599
+ height = node.offsetHeight;
13600
+ setSizeInState({
13601
+ width: width,
13602
+ height: height
13603
+ });
13604
+ },
13605
+ order: order,
13606
+ source: source,
13607
+ startPosition: startPosition,
13608
+ startSize: sizeInState,
13609
+ title: t('public-warning-event-title'),
13610
+ children: children
13611
+ });
13612
+ };
13613
+
13614
+ var WarningEventDialogConnect = function WarningEventDialogConnect(_ref) {
13615
+ var bounds = _ref.bounds,
13616
+ _ref$source = _ref.source,
13617
+ source = _ref$source === void 0 ? 'app' : _ref$source,
13618
+ startPosition = _ref.startPosition,
13619
+ initialValues = _ref.initialValues;
13620
+ var _useSetupDialog = useSetupDialog(warningEventDialogType, source),
13621
+ dialogOrder = _useSetupDialog.dialogOrder,
13622
+ setDialogOrder = _useSetupDialog.setDialogOrder,
13623
+ isDialogOpen = _useSetupDialog.isDialogOpen,
13624
+ uiSource = _useSetupDialog.uiSource,
13625
+ onCloseDialog = _useSetupDialog.onCloseDialog;
13626
+ return jsx(ReactHookFormProvider, {
13627
+ options: Object.assign({}, defaultFormOptions, {
13628
+ mode: 'onSubmit',
13629
+ defaultValues: Object.assign({}, defaultValues, initialValues)
13630
+ }),
13631
+ children: jsx(WarningEventDialog, {
13632
+ bounds: bounds,
13633
+ isOpen: isDialogOpen,
13634
+ onClose: onCloseDialog,
13635
+ onMouseDown: setDialogOrder,
13636
+ order: dialogOrder,
13637
+ source: uiSource,
13638
+ startPosition: startPosition,
13639
+ children: jsx(WarningEventFormContent, {
13640
+ onCancel: onCloseDialog,
13641
+ // TODO: wire up to warnings API once the event endpoints are available
13642
+ onDelete: function onDelete() {},
13643
+ onOpenWarningSummary: function onOpenWarningSummary() {},
13644
+ onPublish: function onPublish() {},
13645
+ onSaveAsDraft: function onSaveAsDraft() {}
13646
+ })
13647
+ })
13648
+ });
13649
+ };
13650
+
13651
+ var BUTTON_AIRMET = 'AIRMET';
13652
+ var BUTTON_SIGMET = 'SIGMET';
13653
+ var NewWarningButton = function NewWarningButton(_ref) {
13654
+ var onCreateWarning = _ref.onCreateWarning,
13655
+ _ref$isDefaultOpen = _ref.isDefaultOpen,
13656
+ isDefaultOpen = _ref$isDefaultOpen === void 0 ? false : _ref$isDefaultOpen;
13657
+ var _useWarningsTranslati = useWarningsTranslation(),
13658
+ t = _useWarningsTranslati.t;
13659
+ var config = sessionStorageProvider.getConfig();
13660
+ var showMartimeWarningOption = !!config.GW_WARNINGS_MARITIME_WARNINGS && !!config.GW_DRAWINGS_BASE_URL;
13661
+ var showAirMetOption = !!config.GW_AIRMET_BASE_URL;
13662
+ var showSigmetOption = !!config.GW_SIGMET_BASE_URL;
13663
+ var showPublicWarningOption = !!config.GW_DRAWINGS_BASE_URL;
13664
+ var showWarningsEventsOption = !!config.GW_FEATURE_WARNINGS_EVENT;
13665
+ var _React$useState = React.useState(null),
13666
+ anchorEl = _React$useState[0],
13667
+ setAnchorEl = _React$useState[1];
13668
+ var isOpen = Boolean(anchorEl);
13669
+ var _React$useState2 = React.useState(0),
13670
+ menuMinWidth = _React$useState2[0],
13671
+ setMenuMinWidth = _React$useState2[1];
13672
+ var buttonId = 'newWarningButton';
13673
+ React.useEffect(function () {
13674
+ if (isDefaultOpen) {
13675
+ setAnchorEl(document.getElementById(buttonId));
13676
+ }
13677
+ }, [isDefaultOpen, buttonId]);
13678
+ var handleClick = function handleClick(event) {
13679
+ event.stopPropagation();
13680
+ setAnchorEl(event.currentTarget);
13681
+ var buttonWidth = event.currentTarget.getBoundingClientRect().width;
13682
+ setMenuMinWidth(buttonWidth);
13683
+ };
13684
+ var handleClose = function handleClose(event) {
13685
+ event.stopPropagation();
13686
+ setAnchorEl(null);
13687
+ };
13688
+ var onCreateNewWarning = function onCreateNewWarning(warningType, event) {
13689
+ onCreateWarning(warningType);
13690
+ handleClose(event);
13691
+ };
13692
+ return jsxs(Fragment, {
13693
+ children: [jsxs(CustomToggleButton, {
13694
+ id: buttonId,
13695
+ onClick: handleClick,
13696
+ sx: Object.assign({
13697
+ textTransform: 'initial!important',
13698
+ marginBottom: '8px',
13699
+ fontSize: '12px',
13700
+ height: '32px!important',
13701
+ whiteSpace: 'nowrap',
13702
+ minWidth: 'auto',
13703
+ paddingRight: '12px!important'
13704
+ }, isOpen ? {
13705
+ '&.MuiToggleButton-root.primary': {
13706
+ backgroundColor: 'geowebColors.buttons.primary.mouseOver.fill'
13707
+ }
13708
+ } : {}),
13709
+ children: [jsx(Add, {}), t('warning-list-button_create')]
13710
+ }), jsxs(Menu, {
13711
+ anchorEl: anchorEl,
13712
+ anchorOrigin: {
13713
+ vertical: 'bottom',
13714
+ horizontal: 'center'
13715
+ },
13716
+ onClose: function onClose(event, reason) {
13717
+ if (reason === 'tabKeyDown') {
13718
+ return;
13719
+ }
13720
+ handleClose(event);
13721
+ },
13722
+ open: isOpen,
13723
+ slotProps: {
13724
+ root: {
13725
+ slotProps: {
13726
+ backdrop: {
13727
+ style: {
13728
+ opacity: 0,
13729
+ transition: 'none'
13730
+ }
13731
+ }
13732
+ }
13733
+ },
13734
+ list: {
13735
+ style: {
13736
+ padding: '0px',
13737
+ minWidth: menuMinWidth || undefined
13738
+ }
13739
+ }
13740
+ },
13741
+ transformOrigin: {
13742
+ vertical: 'top',
13743
+ horizontal: 'center'
13744
+ },
13745
+ children: [showPublicWarningOption ? jsx(MenuItem, {
13746
+ onClick: function onClick(event) {
13747
+ onCreateNewWarning('public', event);
13748
+ },
13749
+ children: jsx(ListItemText, {
13750
+ children: t('public-warning-title').toUpperCase()
13751
+ })
13752
+ }, "Public") : null, !!showWarningsEventsOption && jsx(MenuItem, {
13753
+ onClick: function onClick(event) {
13754
+ onCreateNewWarning('warningEvent', event);
13755
+ },
13756
+ children: jsx(ListItemText, {
13757
+ children: t('public-warning-event-title').toUpperCase()
13758
+ })
13759
+ }, "PublicWarningsEvent"), showAirMetOption ? jsx(MenuItem, {
13760
+ onClick: function onClick(event) {
13761
+ onCreateNewWarning('airmet', event);
13762
+ },
13763
+ children: jsx(ListItemText, {
13764
+ children: BUTTON_AIRMET
13765
+ })
13766
+ }, "Airmet") : null, showSigmetOption ? jsx(MenuItem, {
13767
+ onClick: function onClick(event) {
13768
+ onCreateNewWarning('sigmet', event);
13769
+ },
13770
+ children: jsx(ListItemText, {
13771
+ children: BUTTON_SIGMET
13772
+ })
13773
+ }, "Sigmet") : null, showMartimeWarningOption ? jsxs(Fragment, {
13774
+ children: [jsx(MenuItem, {
13775
+ onClick: function onClick(event) {
13776
+ onCreateNewWarning('maritimeWarningCoastal', event);
13777
+ },
13778
+ children: jsx(ListItemText, {
13779
+ children: t('maritime-warning-coastal-title').toUpperCase()
13780
+ })
13781
+ }, "MaritimeWarningCoastal"), jsx(MenuItem, {
13782
+ onClick: function onClick(event) {
13783
+ onCreateNewWarning('maritimeWarningNorthSea', event);
13784
+ },
13785
+ children: jsx(ListItemText, {
13786
+ children: t('maritime-warning-northsea-title').toUpperCase()
13787
+ })
13788
+ }, "MaritimeWarningNorthSea")]
13789
+ }) : null]
13790
+ })]
13791
+ });
13792
+ };
13793
+
13794
+ var SelectAllButton = function SelectAllButton(_ref) {
13795
+ var selectionState = _ref.selectionState,
13796
+ onSelectAll = _ref.onSelectAll,
13797
+ onSelectNone = _ref.onSelectNone,
13798
+ _ref$disabled = _ref.disabled,
13799
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled;
13800
+ var _useWarningsTranslati = useWarningsTranslation(),
13801
+ t = _useWarningsTranslati.t;
13802
+ var allLabel = t('filter-all');
13803
+ var menuTooltipTitle = t('filter-select');
13804
+ var noneLabel = t('filter-none');
13805
+ var selectAllLabel = t('filter-select-all');
13806
+ var deselectAllLabel = t('filter-deselect-all');
13807
+ var tooltipTitle = selectionState === 'all' || selectionState === 'some' ? deselectAllLabel : selectAllLabel;
13808
+ var id = React.useId();
13809
+ var menuButtonId = id + "-menu-button";
13810
+ var menuId = id + "-menu";
13811
+ var _React$useState = React.useState(null),
13812
+ menuAnchorEl = _React$useState[0],
13813
+ setMenuAnchorEl = _React$useState[1];
13814
+ var menuOpen = Boolean(menuAnchorEl);
13815
+ var isActive = !disabled && (menuOpen || selectionState !== 'none');
13816
+ var handleOpenMenu = function handleOpenMenu(event) {
13817
+ if (disabled) {
13818
+ return;
13819
+ }
13820
+ setMenuAnchorEl(event.currentTarget);
13821
+ };
13822
+ var handleCloseMenu = function handleCloseMenu() {
13823
+ setMenuAnchorEl(null);
13824
+ };
13825
+ var toggleSelection = function toggleSelection() {
13826
+ if (disabled) {
13827
+ return;
13828
+ }
13829
+ if (selectionState === 'none') {
13830
+ onSelectAll();
13831
+ return;
13832
+ }
13833
+ onSelectNone();
13834
+ };
13835
+ var handleCheckboxClick = function handleCheckboxClick(event) {
13836
+ event.stopPropagation();
13837
+ toggleSelection();
13838
+ };
13839
+ var handleCheckboxKeyDown = function handleCheckboxKeyDown(event) {
13840
+ if (disabled || event.key !== 'Enter' && event.key !== ' ') {
13841
+ return;
13842
+ }
13843
+ event.preventDefault();
13844
+ toggleSelection();
13845
+ };
13846
+ var getSegmentHoverBackground = function getSegmentHoverBackground(theme) {
13847
+ if (disabled) {
13848
+ return 'transparent';
13849
+ }
13850
+ return isActive ? theme.palette.primary.dark : theme.palette.action.hover;
13851
+ };
13852
+ var segmentHoverSx = {
13853
+ borderRadius: 0.5,
13854
+ '&:hover': {
13855
+ backgroundColor: getSegmentHoverBackground
13856
+ }
13857
+ };
13858
+ var iconColor = isActive ? 'common.white' : 'text.primary';
13859
+ var ariaChecked = selectionState === 'some' ? 'mixed' : selectionState === 'all';
13860
+ return jsxs(Box, {
13861
+ sx: {
13862
+ display: 'inline-flex',
13863
+ alignItems: 'center',
13864
+ borderRadius: 0.5,
13865
+ backgroundColor: isActive ? 'primary.main' : 'transparent',
13866
+ opacity: disabled ? 0.5 : 1
13867
+ },
13868
+ children: [jsx(Tooltip, {
13869
+ placement: "bottom",
13870
+ title: menuTooltipTitle,
13871
+ children: jsx("span", {
13872
+ children: jsx(IconButton, {
13873
+ "aria-controls": menuOpen ? menuId : undefined,
13874
+ "aria-expanded": menuOpen,
13875
+ "aria-haspopup": "true",
13876
+ "aria-label": menuTooltipTitle,
13877
+ disabled: disabled,
13878
+ id: menuButtonId,
13879
+ onClick: handleOpenMenu,
13880
+ size: "small",
13881
+ sx: Object.assign({}, segmentHoverSx, {
13882
+ width: 24,
13883
+ height: 24,
13884
+ borderTopRightRadius: 0,
13885
+ borderBottomRightRadius: 0
13886
+ }),
13887
+ children: jsx(ArrowDropDownDown, {
13888
+ fontSize: "small",
13889
+ sx: {
13890
+ color: iconColor,
13891
+ fontSize: 18
13892
+ }
13893
+ })
13894
+ })
13895
+ })
13896
+ }), jsx(Tooltip, {
13897
+ placement: "bottom",
13898
+ title: tooltipTitle,
13899
+ children: jsx(Box, {
13900
+ "aria-checked": ariaChecked,
13901
+ "aria-label": tooltipTitle,
13902
+ component: "span",
13903
+ "data-testid": "select-all-batch-delete-checkbox",
13904
+ onClick: handleCheckboxClick,
13905
+ onKeyDown: handleCheckboxKeyDown,
13906
+ role: "checkbox",
13907
+ sx: Object.assign({}, segmentHoverSx, {
13908
+ display: 'inline-flex',
13909
+ alignItems: 'center',
13910
+ borderTopLeftRadius: 0,
13911
+ borderBottomLeftRadius: 0,
13912
+ cursor: disabled ? 'default' : 'pointer'
13913
+ }),
13914
+ tabIndex: disabled ? -1 : 0,
13915
+ children: jsx(Checkbox, {
13916
+ checked: selectionState === 'all',
13917
+ disableRipple: true,
13918
+ disabled: disabled,
13919
+ indeterminate: selectionState === 'some',
13920
+ size: "small",
13921
+ sx: {
13922
+ pointerEvents: 'none',
13923
+ color: isActive ? 'common.white' : 'primary.main',
13924
+ padding: '2px',
13925
+ '&.Mui-checked, &.MuiCheckbox-indeterminate': {
13926
+ color: 'common.white'
13927
+ }
13928
+ },
13929
+ tabIndex: -1
13930
+ })
13931
+ })
13932
+ }), jsxs(Menu, {
13933
+ anchorEl: menuAnchorEl,
13934
+ anchorOrigin: {
13935
+ horizontal: 'left',
13936
+ vertical: 'bottom'
13937
+ },
13938
+ id: menuId,
13939
+ onClose: handleCloseMenu,
13940
+ open: menuOpen,
13941
+ slotProps: {
13942
+ list: {
13943
+ 'aria-labelledby': menuButtonId
13944
+ }
13945
+ },
13946
+ transformOrigin: {
13947
+ horizontal: 'left',
13948
+ vertical: 'top'
13949
+ },
13950
+ children: [jsx(MenuItem, {
13951
+ onClick: function onClick() {
13952
+ onSelectAll();
13953
+ handleCloseMenu();
13954
+ },
13955
+ children: allLabel
13956
+ }), jsx(MenuItem, {
13957
+ onClick: function onClick() {
13958
+ onSelectNone();
13959
+ handleCloseMenu();
13960
+ },
13961
+ children: noneLabel
13962
+ })]
13963
+ })]
13964
+ });
13965
+ };
13966
+
13967
+ /* *
13968
+ * Licensed under the Apache License, Version 2.0 (the "License");
13969
+ * you may not use this file except in compliance with the License.
13970
+ * You may obtain a copy of the License at
13971
+ *
13972
+ * http://www.apache.org/licenses/LICENSE-2.0
13973
+ *
13974
+ * Unless required by applicable law or agreed to in writing, software
13975
+ * distributed under the License is distributed on an "AS IS" BASIS,
13976
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13977
+ * See the License for the specific language governing permissions and
13978
+ * limitations under the License.
13979
+ *
13980
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13981
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
13982
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
13983
+ * */
13984
+ var getWarningStatus = function getWarningStatus(warning) {
13985
+ var _warning$status;
13986
+ return (_warning$status = warning.status) != null ? _warning$status : mapProductStatusToWarningStatus(warning.productStatus);
13987
+ };
13988
+ var isWarningSelectableForBatchDelete = function isWarningSelectableForBatchDelete(warning) {
13989
+ var status = getWarningStatus(warning);
13990
+ return status === PublicWarningStatus.DRAFT || status === PublicWarningStatus.DRAFT_PUBLISHED || status === PublicWarningStatus.TODO;
13991
+ };
13992
+ var getBatchDeletableWarningIds = function getBatchDeletableWarningIds(warnings) {
13993
+ return warnings.filter(isWarningSelectableForBatchDelete).map(function (warning) {
13994
+ return warning.id;
13995
+ }).filter(function (id) {
13996
+ return !!id;
13997
+ });
13998
+ };
13999
+ var getBatchSelectionState = function getBatchSelectionState(selectedIds, deletableIds) {
14000
+ if (deletableIds.length === 0) {
14001
+ return 'none';
14002
+ }
14003
+ var selectedIdSet = new Set(selectedIds);
14004
+ var selectedDeletableCount = deletableIds.filter(function (id) {
14005
+ return selectedIdSet.has(id);
14006
+ }).length;
14007
+ if (selectedDeletableCount === 0) {
14008
+ return 'none';
14009
+ }
14010
+ if (selectedDeletableCount === deletableIds.length) {
14011
+ return 'all';
14012
+ }
14013
+ return 'some';
14014
+ };
14015
+
14016
+ var _excluded$3 = ["title", "status", "children", "width"];
14017
+ var WarningListColumnContent = function WarningListColumnContent(_ref) {
14018
+ var _sx;
14019
+ var title = _ref.title,
14020
+ status = _ref.status,
14021
+ children = _ref.children,
14022
+ _ref$width = _ref.width,
14023
+ width = _ref$width === void 0 ? 76 : _ref$width,
14024
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$3);
14025
+ return jsxs(Grid, {
14026
+ sx: Object.assign({}, Array.isArray(props.sx) ? Object.assign.apply(Object, [{}].concat(props.sx)) : props.sx, {
14027
+ width: width
14028
+ }),
14029
+ children: [!!title && jsx(Box, {
14030
+ sx: (_sx = {
14031
+ overflow: 'hidden',
14032
+ fontWeight: 'normal',
14033
+ textOverflow: 'ellipsis',
14034
+ fontSize: 10,
14035
+ lineHeight: 1.6,
14036
+ height: 12,
14037
+ color: status === PublicWarningStatus.EXPIRED || status === PublicWarningStatus.WITHDRAWN ? 'geowebColors.typographyAndIcons.inactiveText' : 'geowebColors.captions.captionStatus.rgba',
14038
+ display: 'block'
14039
+ }, _sx["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
14040
+ display: 'none'
14041
+ }, _sx),
14042
+ children: title
14043
+ }), jsx(Box, {
14044
+ sx: {
14045
+ overflow: 'visible',
14046
+ fontSize: 12,
14047
+ lineHeight: 1.2,
14048
+ color: status === PublicWarningStatus.EXPIRED || status === PublicWarningStatus.WITHDRAWN ? 'geowebColors.typographyAndIcons.inactiveText' : 'geowebColors.typographyAndIcons.text'
14049
+ },
14050
+ children: children || '-'
14051
+ })]
14052
+ });
14053
+ };
14054
+
14055
+ var WarningListItemMenu = function WarningListItemMenu(_ref) {
14056
+ var warning = _ref.warning,
14057
+ _ref$onEditWarning = _ref.onEditWarning,
14058
+ onEditWarning = _ref$onEditWarning === void 0 ? function () {} : _ref$onEditWarning,
14059
+ _ref$onDeleteWarning = _ref.onDeleteWarning,
14060
+ onDeleteWarning = _ref$onDeleteWarning === void 0 ? function () {} : _ref$onDeleteWarning,
14061
+ _ref$onDeleteReviewWa = _ref.onDeleteReviewWarning,
14062
+ onDeleteReviewWarning = _ref$onDeleteReviewWa === void 0 ? function () {} : _ref$onDeleteReviewWa,
14063
+ _ref$onExpireWarning = _ref.onExpireWarning,
14064
+ onExpireWarning = _ref$onExpireWarning === void 0 ? function () {} : _ref$onExpireWarning,
14065
+ _ref$onWithdrawWarnin = _ref.onWithdrawWarning,
14066
+ onWithdrawWarning = _ref$onWithdrawWarnin === void 0 ? function () {} : _ref$onWithdrawWarnin,
14067
+ _ref$onActionAviation = _ref.onActionAviationWarning,
14068
+ onActionAviationWarning = _ref$onActionAviation === void 0 ? function () {} : _ref$onActionAviation,
14069
+ _ref$onActionMaritime = _ref.onActionMaritimeWarning,
14070
+ onActionMaritimeWarning = _ref$onActionMaritime === void 0 ? function () {} : _ref$onActionMaritime,
14071
+ t = _ref.t,
14072
+ _ref$shouldDisableAvi = _ref.shouldDisableAviationAmendOption,
14073
+ shouldDisableAviationAmendOption = _ref$shouldDisableAvi === void 0 ? false : _ref$shouldDisableAvi;
14074
+ if (warning.type === 'maritimeWarningCoastal' || warning.type === 'maritimeWarningNorthSea') {
14075
+ return [{
14076
+ text: t('warning-list-button-update'),
14077
+ action: function action() {
14078
+ return onActionMaritimeWarning(warning, MaritimeWarningAction.UPDATE);
14079
+ },
14080
+ icon: jsx(Edit, {})
14081
+ }, {
14082
+ text: t('warning-list-button-extend'),
14083
+ action: function action() {
12170
14084
  return onActionMaritimeWarning(warning, MaritimeWarningAction.EXTEND);
12171
14085
  },
12172
14086
  icon: jsx(Extend24h, {})
@@ -12304,7 +14218,7 @@ var WarningListItemMenu = function WarningListItemMenu(_ref) {
12304
14218
  }
12305
14219
  };
12306
14220
 
12307
- var _excluded$2 = ["warning", "activeWarningId", "highlightedItem", "onHoverWarning", "onSelectWarning", "onEditWarning", "onDeleteWarning", "onDeleteReviewWarning", "onExpireWarning", "onWithdrawWarning", "onActionAviationWarning", "onActionMaritimeWarning", "shouldDisableAviationAmendOption", "isHidden", "onToggleVisibility"];
14221
+ var _excluded$2 = ["warning", "activeWarningId", "highlightedItem", "onHoverWarning", "onSelectWarning", "onEditWarning", "onDeleteWarning", "onDeleteReviewWarning", "onExpireWarning", "onWithdrawWarning", "onActionAviationWarning", "onActionMaritimeWarning", "shouldDisableAviationAmendOption", "isHidden", "onToggleVisibility", "selectedForBatchDelete", "toggleWarningForBatchDelete"];
12308
14222
  var renderLevelText = function renderLevelText(levelString) {
12309
14223
  if (!levelString) {
12310
14224
  return null;
@@ -12410,6 +14324,10 @@ var WarningListItem = function WarningListItem(_ref) {
12410
14324
  _ref$isHidden = _ref.isHidden,
12411
14325
  isHidden = _ref$isHidden === void 0 ? false : _ref$isHidden,
12412
14326
  onToggleVisibility = _ref.onToggleVisibility,
14327
+ _ref$selectedForBatch = _ref.selectedForBatchDelete,
14328
+ selectedForBatchDelete = _ref$selectedForBatch === void 0 ? [] : _ref$selectedForBatch,
14329
+ _ref$toggleWarningFor = _ref.toggleWarningForBatchDelete,
14330
+ toggleWarningForBatchDelete = _ref$toggleWarningFor === void 0 ? function () {} : _ref$toggleWarningFor,
12413
14331
  props = _objectWithoutPropertiesLoose(_ref, _excluded$2);
12414
14332
  var _useWarningsTranslati = useWarningsTranslation(),
12415
14333
  t = _useWarningsTranslati.t;
@@ -12450,6 +14368,7 @@ var WarningListItem = function WarningListItem(_ref) {
12450
14368
  }
12451
14369
  return t('warning-domain-aviation');
12452
14370
  }, [t, warning.warningDetail.domain]);
14371
+ var isChecked = selectedForBatchDelete.includes(warning.id || '');
12453
14372
  return jsxs(ListItem, Object.assign({
12454
14373
  "data-testid": "warning-" + getSortedStatus(status),
12455
14374
  onMouseEnter: function onMouseEnter() {
@@ -12458,24 +14377,40 @@ var WarningListItem = function WarningListItem(_ref) {
12458
14377
  onMouseLeave: function onMouseLeave() {
12459
14378
  return onHoverWarning(undefined);
12460
14379
  },
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')
14380
+ secondaryAction: jsxs(Fragment, {
14381
+ children: [jsx(ToggleMenu, {
14382
+ "aria-label": t('warning-list-button-options'),
14383
+ buttonIcon: jsx(Options, {}),
14384
+ menuItems: WarningListItemMenu({
14385
+ warning: warning,
14386
+ t: t,
14387
+ onEditWarning: onEditWarning,
14388
+ onDeleteReviewWarning: onDeleteReviewWarning,
14389
+ onDeleteWarning: onDeleteWarning,
14390
+ onExpireWarning: onExpireWarning,
14391
+ onWithdrawWarning: onWithdrawWarning,
14392
+ onActionAviationWarning: onActionAviationWarning,
14393
+ onActionMaritimeWarning: onActionMaritimeWarning,
14394
+ shouldDisableAviationAmendOption: shouldDisableAviationAmendOption
14395
+ }),
14396
+ menuPosition: "bottom",
14397
+ menuTitle: t('warning-list-button-options'),
14398
+ tooltipTitle: t('warning-list-button-options')
14399
+ }), status === PublicWarningStatus.DRAFT || status === PublicWarningStatus.DRAFT_PUBLISHED || status === PublicWarningStatus.TODO ? jsx(Tooltip, {
14400
+ placement: "left",
14401
+ title: t('warning-list-batch-delete-checkbox'),
14402
+ children: jsx(Checkbox, {
14403
+ checked: isChecked,
14404
+ onChange: function onChange(e) {
14405
+ e.stopPropagation();
14406
+ if (warning.id) {
14407
+ toggleWarningForBatchDelete(warning.id);
14408
+ }
14409
+ },
14410
+ role: "checkbox",
14411
+ size: "small"
14412
+ })
14413
+ }) : null]
12479
14414
  }),
12480
14415
  sx: {
12481
14416
  marginBottom: 0.25,
@@ -12485,7 +14420,17 @@ var WarningListItem = function WarningListItem(_ref) {
12485
14420
  borderColor: status === PublicWarningStatus.EXPIRED || status === PublicWarningStatus.WITHDRAWN ? 'geowebColors.cards.cardContainerDisabledBorder' : 'geowebColors.cards.cardContainerBorder',
12486
14421
  borderRadius: 1,
12487
14422
  borderWidth: activeWarningId === warning.id ? '1px' : '1px',
12488
- borderStyle: 'solid'
14423
+ borderStyle: 'solid',
14424
+ '& .MuiListItemButton-root': {
14425
+ paddingRight: '60px'
14426
+ },
14427
+ '& .MuiListItemSecondaryAction-root': {
14428
+ width: '50px',
14429
+ right: '8px'
14430
+ },
14431
+ '& .MuiCheckbox-root': {
14432
+ padding: '2px'
14433
+ }
12489
14434
  }
12490
14435
  }, props, {
12491
14436
  children: [jsx(CustomTooltip, {
@@ -13295,6 +15240,8 @@ var RowComponent = function RowComponent(_ref) {
13295
15240
  expandedSections = _ref.expandedSections,
13296
15241
  hoveredFeatureId = _ref.hoveredFeatureId,
13297
15242
  selectedWarningId = _ref.selectedWarningId,
15243
+ selectedForBatchDelete = _ref.selectedForBatchDelete,
15244
+ toggleWarningForBatchDelete = _ref.toggleWarningForBatchDelete,
13298
15245
  onHoverWarning = _ref.onHoverWarning,
13299
15246
  onSelectWarning = _ref.onSelectWarning,
13300
15247
  onEditWarning = _ref.onEditWarning,
@@ -13341,8 +15288,10 @@ var RowComponent = function RowComponent(_ref) {
13341
15288
  onSelectWarning: onSelectWarning,
13342
15289
  onToggleVisibility: onToggleWarningVisibility,
13343
15290
  onWithdrawWarning: onWithdrawWarning,
15291
+ selectedForBatchDelete: selectedForBatchDelete,
13344
15292
  shouldDisableAviationAmendOption: shouldDisableAviationAmendOption,
13345
15293
  style: style,
15294
+ toggleWarningForBatchDelete: toggleWarningForBatchDelete,
13346
15295
  warning: publicWarning
13347
15296
  }, key);
13348
15297
  };
@@ -13414,6 +15363,8 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13414
15363
  onActionAviationWarning = _ref2$onActionAviatio === void 0 ? function () {} : _ref2$onActionAviatio,
13415
15364
  _ref2$onActionMaritim = _ref2.onActionMaritimeWarning,
13416
15365
  onActionMaritimeWarning = _ref2$onActionMaritim === void 0 ? function () {} : _ref2$onActionMaritim,
15366
+ _ref2$onClickBatchDel = _ref2.onClickBatchDelete,
15367
+ onClickBatchDelete = _ref2$onClickBatchDel === void 0 ? function () {} : _ref2$onClickBatchDel,
13417
15368
  hoveredFeatureId = _ref2.hoveredFeatureId,
13418
15369
  expandedSections = _ref2.expandedSections,
13419
15370
  setExpandedSections = _ref2.setExpandedSections,
@@ -13423,7 +15374,15 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13423
15374
  _ref2$shouldDisableAv = _ref2.shouldDisableAviationAmendOption,
13424
15375
  shouldDisableAviationAmendOption = _ref2$shouldDisableAv === void 0 ? false : _ref2$shouldDisableAv,
13425
15376
  hiddenWarningIds = _ref2.hiddenWarningIds,
13426
- onToggleWarningVisibility = _ref2.onToggleWarningVisibility;
15377
+ onToggleWarningVisibility = _ref2.onToggleWarningVisibility,
15378
+ _ref2$selectedForBatc = _ref2.selectedForBatchDelete,
15379
+ selectedForBatchDelete = _ref2$selectedForBatc === void 0 ? [] : _ref2$selectedForBatc,
15380
+ _ref2$toggleWarningFo = _ref2.toggleWarningForBatchDelete,
15381
+ toggleWarningForBatchDelete = _ref2$toggleWarningFo === void 0 ? function () {} : _ref2$toggleWarningFo,
15382
+ _ref2$onSelectAllForB = _ref2.onSelectAllForBatchDelete,
15383
+ onSelectAllForBatchDelete = _ref2$onSelectAllForB === void 0 ? function () {} : _ref2$onSelectAllForB,
15384
+ _ref2$onClearBatchDel = _ref2.onClearBatchDeleteSelection,
15385
+ onClearBatchDeleteSelection = _ref2$onClearBatchDel === void 0 ? function () {} : _ref2$onClearBatchDel;
13427
15386
  var updateFilter = filterHookState.updateFilter,
13428
15387
  allSelected = filterHookState.allSelected,
13429
15388
  filterState = filterHookState.filterState,
@@ -13507,6 +15466,24 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13507
15466
  }
13508
15467
  }, [listRef, resetListIndex, warnings]);
13509
15468
  var filterHeight = useGetFilterHeight(filterRef);
15469
+ var warningIdSet = React.useMemo(function () {
15470
+ return new Set(warnings.map(function (warning) {
15471
+ return warning.id;
15472
+ }).filter(function (id) {
15473
+ return !!id;
15474
+ }));
15475
+ }, [warnings]);
15476
+ var selectedForBatchDeleteFiltered = React.useMemo(function () {
15477
+ return selectedForBatchDelete.filter(function (id) {
15478
+ return warningIdSet.has(id);
15479
+ });
15480
+ }, [selectedForBatchDelete, warningIdSet]);
15481
+ var batchDeletableWarningIds = React.useMemo(function () {
15482
+ return getBatchDeletableWarningIds(warnings);
15483
+ }, [warnings]);
15484
+ var batchSelectionState = React.useMemo(function () {
15485
+ return getBatchSelectionState(selectedForBatchDeleteFiltered, batchDeletableWarningIds);
15486
+ }, [batchDeletableWarningIds, selectedForBatchDeleteFiltered]);
13510
15487
  return jsxs(Fragment, {
13511
15488
  children: [isLoading ? jsx(LinearProgress, {
13512
15489
  color: "secondary",
@@ -13574,66 +15551,107 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13574
15551
  container: true,
13575
15552
  rowSpacing: 0,
13576
15553
  size: "grow",
13577
- sx: (_sx = {
15554
+ sx: {
13578
15555
  alignItems: 'center',
13579
- justifyContent: 'space-between',
13580
15556
  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, {
15557
+ display: 'flex',
15558
+ marginTop: '4px',
15559
+ height: '24px'
15560
+ },
15561
+ children: [jsx(Box, {
13587
15562
  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');
15563
+ display: 'flex',
15564
+ flex: 1,
15565
+ minWidth: 0
13613
15566
  },
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, {
15567
+ children: jsxs(Grid, {
15568
+ container: true,
15569
+ size: "grow",
15570
+ sx: (_sx = {
15571
+ display: 'none',
15572
+ alignItems: 'center',
15573
+ justifyContent: 'space-between',
15574
+ maxWidth: '100%'
15575
+ }, _sx["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
15576
+ display: 'flex'
15577
+ }, _sx),
15578
+ children: [jsx(WarningListHeaderContent, {
15579
+ sx: {
15580
+ paddingLeft: 2
15581
+ },
15582
+ title: t('warning-list-header-incidents')
15583
+ }), jsx(WarningListHeaderContent, {
15584
+ isSorted: sortState.key === 'lastUpdatedTime',
15585
+ onClick: function onClick() {
15586
+ return toggleSortDirection('lastUpdatedTime');
15587
+ },
15588
+ sortDirection: sortState.direction,
15589
+ sortable: true,
15590
+ title: t('warning-list-header-last-update') + " UTC",
15591
+ width: 142
15592
+ }), jsx(WarningListHeaderContent, {
15593
+ isSorted: sortState.key === 'validFrom',
15594
+ onClick: function onClick() {
15595
+ return toggleSortDirection('validFrom');
15596
+ },
15597
+ sortDirection: sortState.direction,
15598
+ sortable: true,
15599
+ title: t('warning-list-header-start-time') + " UTC",
15600
+ width: 142
15601
+ }), jsx(WarningListHeaderContent, {
15602
+ isSorted: sortState.key === 'validUntil',
15603
+ onClick: function onClick() {
15604
+ return toggleSortDirection('validUntil');
15605
+ },
15606
+ sortDirection: sortState.direction,
15607
+ sortable: true,
15608
+ title: t('warning-list-header-end-time') + " UTC",
15609
+ width: 142
15610
+ }), jsx(WarningListHeaderContent, {
15611
+ title: t('warning-list-header-domains')
15612
+ }), jsx(WarningListHeaderContent, {
15613
+ title: t('warning-list-header-phenomena'),
15614
+ width: 140
15615
+ }), jsx(WarningListHeaderContent, {
15616
+ sx: (_sx2 = {}, _sx2["@container publicWarningList (min-width: " + breakpoints.desktop + "px)"] = {
15617
+ width: 56
15618
+ }, _sx2),
15619
+ title: t('warning-list-header-levels')
15620
+ }), jsx(WarningListHeaderContent, {
15621
+ title: t('areas'),
15622
+ width: 100
15623
+ }), jsx(WarningListHeaderContent, {
15624
+ sx: {
15625
+ marginRight: '48px'
15626
+ },
15627
+ title: t('warning-list-header-status'),
15628
+ width: 76
15629
+ })]
15630
+ })
15631
+ }), jsxs(Box, {
13632
15632
  sx: {
13633
- marginRight: '48px'
15633
+ width: '60px',
15634
+ flexShrink: 0,
15635
+ display: 'flex',
15636
+ alignItems: 'flex-end',
15637
+ justifyContent: 'flex-end'
13634
15638
  },
13635
- title: t('warning-list-header-status'),
13636
- width: 76
15639
+ children: [selectedForBatchDeleteFiltered.length > 0 && jsx(CustomIconButton, {
15640
+ "data-testid": "batch-delete-button",
15641
+ onClick: function onClick() {
15642
+ onClickBatchDelete(selectedForBatchDelete);
15643
+ },
15644
+ tooltipTitle: t('warning-dialog-delete-all-button'),
15645
+ variant: "tool",
15646
+ children: jsx(Delete, {})
15647
+ }), jsx(SelectAllButton, {
15648
+ disabled: batchDeletableWarningIds.length === 0,
15649
+ onSelectAll: function onSelectAll() {
15650
+ onSelectAllForBatchDelete(batchDeletableWarningIds);
15651
+ },
15652
+ onSelectNone: onClearBatchDeleteSelection,
15653
+ selectionState: batchSelectionState
15654
+ })]
13637
15655
  })]
13638
15656
  }), sortedWarnings && !error ? jsx(Box, {
13639
15657
  "data-testid": "warnings-list",
@@ -13667,7 +15685,9 @@ var PublicWarningList = function PublicWarningList(_ref2) {
13667
15685
  onActionMaritimeWarning: onActionMaritimeWarning,
13668
15686
  shouldDisableAviationAmendOption: shouldDisableAviationAmendOption,
13669
15687
  hiddenWarningIds: hiddenWarningIds,
13670
- onToggleWarningVisibility: onToggleWarningVisibility
15688
+ onToggleWarningVisibility: onToggleWarningVisibility,
15689
+ selectedForBatchDelete: selectedForBatchDelete,
15690
+ toggleWarningForBatchDelete: toggleWarningForBatchDelete
13671
15691
  }
13672
15692
  })
13673
15693
  }) : null]
@@ -13695,7 +15715,7 @@ var ConfirmDeleteWarningDialog = function ConfirmDeleteWarningDialog(_ref) {
13695
15715
  setError = _React$useState2[1];
13696
15716
  var onSubmit = /*#__PURE__*/function () {
13697
15717
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
13698
- var _t;
15718
+ var result, _t;
13699
15719
  return _regenerator().w(function (_context) {
13700
15720
  while (1) switch (_context.p = _context.n) {
13701
15721
  case 0:
@@ -13704,7 +15724,8 @@ var ConfirmDeleteWarningDialog = function ConfirmDeleteWarningDialog(_ref) {
13704
15724
  _context.n = 2;
13705
15725
  return request();
13706
15726
  case 2:
13707
- callback == null || callback();
15727
+ result = _context.v;
15728
+ callback == null || callback(result);
13708
15729
  setIsLoading(false);
13709
15730
  _context.n = 4;
13710
15731
  break;
@@ -13750,6 +15771,56 @@ var ConfirmDeleteWarningDialog = function ConfirmDeleteWarningDialog(_ref) {
13750
15771
  }));
13751
15772
  };
13752
15773
 
15774
+ /* *
15775
+ * Licensed under the Apache License, Version 2.0 (the "License");
15776
+ * you may not use this file except in compliance with the License.
15777
+ * You may obtain a copy of the License at
15778
+ *
15779
+ * http://www.apache.org/licenses/LICENSE-2.0
15780
+ *
15781
+ * Unless required by applicable law or agreed to in writing, software
15782
+ * distributed under the License is distributed on an "AS IS" BASIS,
15783
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15784
+ * See the License for the specific language governing permissions and
15785
+ * limitations under the License.
15786
+ *
15787
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15788
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
15789
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
15790
+ * */
15791
+ var getSelectedFormAreaIds = function getSelectedFormAreaIds(selectedFormWarning) {
15792
+ var _selectedFormWarning$, _selectedFormWarning$2;
15793
+ return new Set(((_selectedFormWarning$ = selectedFormWarning == null || (_selectedFormWarning$2 = selectedFormWarning.warningDetail) == null ? void 0 : _selectedFormWarning$2.areas) != null ? _selectedFormWarning$ : []).map(function (area) {
15794
+ return area.areaId;
15795
+ }).filter(function (areaId) {
15796
+ return Boolean(areaId);
15797
+ }));
15798
+ };
15799
+ var shouldExcludeWarningFromFeatureSync = function shouldExcludeWarningFromFeatureSync(_ref) {
15800
+ var hiddenWarningIds = _ref.hiddenWarningIds,
15801
+ hasMatchingAreaId = _ref.hasMatchingAreaId,
15802
+ selectedWarningId = _ref.selectedWarningId,
15803
+ warningIds = _ref.warningIds;
15804
+ return warningIds.includes(selectedWarningId != null ? selectedWarningId : '') || hasMatchingAreaId || warningIds.some(function (warningId) {
15805
+ return hiddenWarningIds.has(warningId);
15806
+ });
15807
+ };
15808
+ var createWarningFeatureCollection = function createWarningFeatureCollection(allFeatures) {
15809
+ return {
15810
+ type: 'FeatureCollection',
15811
+ features: allFeatures.flatMap(function (feature) {
15812
+ return feature.geoJSON.features.map(function (geoFeature) {
15813
+ var _geoFeature$propertie;
15814
+ return Object.assign({}, geoFeature, {
15815
+ properties: Object.assign({}, (_geoFeature$propertie = geoFeature.properties) != null ? _geoFeature$propertie : {}, {
15816
+ originalId: feature.originalId
15817
+ })
15818
+ });
15819
+ });
15820
+ })
15821
+ };
15822
+ };
15823
+
13753
15824
  var _excluded = ["expandedSections", "hoveredWarningIds"];
13754
15825
  var getWarningsFilters = function getWarningsFilters(store) {
13755
15826
  if (store != null && store.warningsFilters) {
@@ -13787,21 +15858,185 @@ var getWarningsPresetById = createSelector(getWarningsFilterPanelById, function
13787
15858
  filterState: null,
13788
15859
  expandedSections: null
13789
15860
  };
13790
- }
15861
+ }
15862
+ return {
15863
+ filterState: getFilterStateFromPanelState(panelState),
15864
+ expandedSections: panelState.expandedSections
15865
+ };
15866
+ }, selectorMemoizationOptions);
15867
+
15868
+ var selectors = /*#__PURE__*/Object.freeze({
15869
+ __proto__: null,
15870
+ getExpandedSectionsByPanelId: getExpandedSectionsByPanelId,
15871
+ getHoveredWarningIdsByPanelId: getHoveredWarningIdsByPanelId,
15872
+ getWarningsFilterById: getWarningsFilterById,
15873
+ getWarningsFilters: getWarningsFilters,
15874
+ getWarningsPresetById: getWarningsPresetById
15875
+ });
15876
+
15877
+ /* *
15878
+ * Licensed under the Apache License, Version 2.0 (the "License");
15879
+ * you may not use this file except in compliance with the License.
15880
+ * You may obtain a copy of the License at
15881
+ *
15882
+ * http://www.apache.org/licenses/LICENSE-2.0
15883
+ *
15884
+ * Unless required by applicable law or agreed to in writing, software
15885
+ * distributed under the License is distributed on an "AS IS" BASIS,
15886
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15887
+ * See the License for the specific language governing permissions and
15888
+ * limitations under the License.
15889
+ *
15890
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15891
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
15892
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
15893
+ * */
15894
+ var WARNING_HOVER_DISPATCH_DELAY = 50;
15895
+ var useWarningListFeatureSync = function useWarningListFeatureSync(_ref) {
15896
+ var _hoveredLinkedFeature;
15897
+ var filteredWarningsByExpandedSections = _ref.filteredWarningsByExpandedSections,
15898
+ hiddenWarningIds = _ref.hiddenWarningIds,
15899
+ panelId = _ref.panelId,
15900
+ selectedFormWarning = _ref.selectedFormWarning,
15901
+ selectedWarningId = _ref.selectedWarningId;
15902
+ var dispatch = useDispatch();
15903
+ var store = useStore();
15904
+ var selectedFormAreaIds = React.useMemo(function () {
15905
+ return getSelectedFormAreaIds(selectedFormWarning);
15906
+ }, [selectedFormWarning]);
15907
+ var allFeatures = React.useMemo(function () {
15908
+ return filteredWarningsByExpandedSections.flatMap(function (warning) {
15909
+ var _warning$warningDetai, _warning$warningDetai2, _warning$warningDetai3, _warning$warningDetai4, _warning$warningDetai5;
15910
+ var id = warning == null ? void 0 : warning.id;
15911
+ if (!id) {
15912
+ return [];
15913
+ }
15914
+ var warningIds = [warning == null ? void 0 : warning.id, warning == null || (_warning$warningDetai = warning.warningDetail) == null ? void 0 : _warning$warningDetai.id].filter(function (warningId) {
15915
+ return Boolean(warningId);
15916
+ });
15917
+ var hasMatchingAreaId = ((_warning$warningDetai2 = warning == null || (_warning$warningDetai3 = warning.warningDetail) == null ? void 0 : _warning$warningDetai3.areas) != null ? _warning$warningDetai2 : []).some(function (area) {
15918
+ return area.areaId !== undefined && selectedFormAreaIds.has(area.areaId);
15919
+ });
15920
+ if (shouldExcludeWarningFromFeatureSync({
15921
+ hiddenWarningIds: hiddenWarningIds,
15922
+ hasMatchingAreaId: hasMatchingAreaId,
15923
+ selectedWarningId: selectedWarningId,
15924
+ warningIds: warningIds
15925
+ })) {
15926
+ return [];
15927
+ }
15928
+ var originalId = id;
15929
+ var areas = (_warning$warningDetai4 = warning == null || (_warning$warningDetai5 = warning.warningDetail) == null ? void 0 : _warning$warningDetai5.areas) != null ? _warning$warningDetai4 : [];
15930
+ return areas.filter(function (area) {
15931
+ return !!area.geoJSON;
15932
+ }).map(function (area) {
15933
+ var _warning$warningDetai6, _area$areaId;
15934
+ var level = warning == null || (_warning$warningDetai6 = warning.warningDetail) == null ? void 0 : _warning$warningDetai6.level;
15935
+ var isAviationWarning = level === 'SIG' || level === 'AIR';
15936
+ var styledGeoJSON = level ? warningLevelFeatureColors(isAviationWarning ? undefined : level, area.geoJSON, isAviationWarning) : area.geoJSON;
15937
+ return {
15938
+ id: originalId + ((_area$areaId = area.areaId) != null ? _area$areaId : ''),
15939
+ originalId: originalId,
15940
+ geoJSON: styledGeoJSON
15941
+ };
15942
+ });
15943
+ }).filter(function (feature) {
15944
+ return !!feature.id;
15945
+ });
15946
+ }, [filteredWarningsByExpandedSections, hiddenWarningIds, selectedFormAreaIds, selectedWarningId]);
15947
+ useRegisterFeatureSyncSource(panelId);
15948
+ var warningFeatureCollection = React.useMemo(function () {
15949
+ return createWarningFeatureCollection(allFeatures);
15950
+ }, [allFeatures]);
15951
+ var warningLayerId = React.useRef(webmapUtils.generateLayerId()).current;
15952
+ var warningFeatureLayersById = React.useMemo(function () {
15953
+ var _ref2;
15954
+ return _ref2 = {}, _ref2[warningLayerId] = {
15955
+ id: warningLayerId,
15956
+ geojson: warningFeatureCollection
15957
+ }, _ref2;
15958
+ }, [warningFeatureCollection, warningLayerId]);
15959
+ useUpdateFeatureSyncLayers(warningFeatureLayersById, panelId);
15960
+ var workspaceViewsById = useSelector(function (state) {
15961
+ return syncGroupsSelector.getWorkspaceViewsById(state);
15962
+ });
15963
+ var ownedFeatureLayerIds = useSelector(function (state) {
15964
+ return genericSelectors.selectFeatureSyncLayerIdsForPanel(state, panelId);
15965
+ }, shallowEqual);
15966
+ var linkedTargetIds = useSelector(function (state) {
15967
+ return genericSelectors.getLinkedTargetIds(state, panelId);
15968
+ }, shallowEqual);
15969
+ var hoveredLinkedFeatureIds = useSelector(function (state) {
15970
+ return genericSelectors.selectHoveredFeatureIdsForPanel(state, panelId);
15971
+ }, shallowEqual);
15972
+ var hoveredLocalWarningIds = useSelector(function (state) {
15973
+ return getHoveredWarningIdsByPanelId(state, panelId);
15974
+ });
15975
+ var hasLinkedTimelineTarget = linkedTargetIds.some(function (targetId) {
15976
+ var _workspaceViewsById$t;
15977
+ return (workspaceViewsById == null || (_workspaceViewsById$t = workspaceViewsById[targetId]) == null ? void 0 : _workspaceViewsById$t.componentType) === 'WarningsTimeline';
15978
+ });
15979
+ var _React$useState = React.useState(undefined),
15980
+ localHoveredWarningId = _React$useState[0],
15981
+ setLocalHoveredWarningId = _React$useState[1];
15982
+ var _React$useState2 = React.useState(false),
15983
+ isUsingLocalHoverOverride = _React$useState2[0],
15984
+ setIsUsingLocalHoverOverride = _React$useState2[1];
15985
+ var hoverDispatchTimeoutRef = React.useRef(undefined);
15986
+ var hoveredFeatureId = isUsingLocalHoverOverride ? localHoveredWarningId : (_hoveredLinkedFeature = hoveredLinkedFeatureIds[0]) != null ? _hoveredLinkedFeature : hoveredLocalWarningIds[0];
15987
+ var handleHoverWarning = React.useCallback(function (warningId) {
15988
+ setLocalHoveredWarningId(warningId);
15989
+ setIsUsingLocalHoverOverride(true);
15990
+ if (hoverDispatchTimeoutRef.current) {
15991
+ window.clearTimeout(hoverDispatchTimeoutRef.current);
15992
+ }
15993
+ hoverDispatchTimeoutRef.current = window.setTimeout(function () {
15994
+ if (!ownedFeatureLayerIds.length && hasLinkedTimelineTarget) {
15995
+ dispatch(warningsFiltersActions.setHoveredWarningIdsForPanel({
15996
+ panelId: panelId,
15997
+ warningIds: warningId ? [warningId] : []
15998
+ }));
15999
+ }
16000
+ ownedFeatureLayerIds.forEach(function (layerId) {
16001
+ dispatch(layerActions.setHoveredFeatures({
16002
+ layerId: layerId,
16003
+ hoveredFeatureIds: warningId ? [warningId] : []
16004
+ }));
16005
+ });
16006
+ setIsUsingLocalHoverOverride(false);
16007
+ }, WARNING_HOVER_DISPATCH_DELAY);
16008
+ }, [dispatch, hasLinkedTimelineTarget, ownedFeatureLayerIds, panelId]);
16009
+ React.useEffect(function () {
16010
+ return function () {
16011
+ if (hoverDispatchTimeoutRef.current) {
16012
+ window.clearTimeout(hoverDispatchTimeoutRef.current);
16013
+ }
16014
+ var ownedLayerIds = genericSelectors.selectFeatureSyncLayerIdsForPanel(store.getState(), panelId);
16015
+ var currentLinkedTargetIds = genericSelectors.getLinkedTargetIds(store.getState(), panelId);
16016
+ var currentWorkspaceViewsById = syncGroupsSelector.getWorkspaceViewsById(store.getState());
16017
+ var hasCurrentLinkedTimelineTarget = currentLinkedTargetIds.some(function (targetId) {
16018
+ var _currentWorkspaceView;
16019
+ return ((_currentWorkspaceView = currentWorkspaceViewsById[targetId]) == null ? void 0 : _currentWorkspaceView.componentType) === 'WarningsTimeline';
16020
+ });
16021
+ if (!ownedLayerIds.length && hasCurrentLinkedTimelineTarget) {
16022
+ dispatch(warningsFiltersActions.setHoveredWarningIdsForPanel({
16023
+ panelId: panelId,
16024
+ warningIds: []
16025
+ }));
16026
+ }
16027
+ ownedLayerIds.forEach(function (layerId) {
16028
+ dispatch(layerActions.setHoveredFeatures({
16029
+ layerId: layerId,
16030
+ hoveredFeatureIds: []
16031
+ }));
16032
+ });
16033
+ };
16034
+ }, [dispatch, panelId, store]);
13791
16035
  return {
13792
- filterState: getFilterStateFromPanelState(panelState),
13793
- expandedSections: panelState.expandedSections
16036
+ handleHoverWarning: handleHoverWarning,
16037
+ hoveredFeatureId: hoveredFeatureId
13794
16038
  };
13795
- }, selectorMemoizationOptions);
13796
-
13797
- var selectors = /*#__PURE__*/Object.freeze({
13798
- __proto__: null,
13799
- getExpandedSectionsByPanelId: getExpandedSectionsByPanelId,
13800
- getHoveredWarningIdsByPanelId: getHoveredWarningIdsByPanelId,
13801
- getWarningsFilterById: getWarningsFilterById,
13802
- getWarningsFilters: getWarningsFilters,
13803
- getWarningsPresetById: getWarningsPresetById
13804
- });
16039
+ };
13805
16040
 
13806
16041
  /* *
13807
16042
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -14119,10 +16354,10 @@ var CancelAviationDialogContent = function CancelAviationDialogContent(_ref) {
14119
16354
  maxWidth: 600
14120
16355
  },
14121
16356
  children: [jsx(Typography, {
14122
- variant: "inherit",
14123
16357
  sx: {
14124
16358
  fontWeight: 'medium'
14125
16359
  },
16360
+ variant: "inherit",
14126
16361
  children: t('cancel-message')
14127
16362
  }), jsx("div", {
14128
16363
  style: {
@@ -14137,10 +16372,10 @@ var CancelAviationDialogContent = function CancelAviationDialogContent(_ref) {
14137
16372
  children: cancelContent
14138
16373
  })
14139
16374
  }), jsx(Typography, {
14140
- variant: "inherit",
14141
16375
  sx: {
14142
16376
  fontWeight: 'medium'
14143
16377
  },
16378
+ variant: "inherit",
14144
16379
  children: t('will-cancel-message')
14145
16380
  }), jsx("div", {
14146
16381
  style: {
@@ -14271,12 +16506,29 @@ var CancelAviationConfirmDialog = function CancelAviationConfirmDialog(_ref) {
14271
16506
  });
14272
16507
  };
14273
16508
 
14274
- var WARNING_HOVER_DISPATCH_DELAY = 50;
14275
16509
  var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14276
- var _hoveredLinkedFeature;
14277
16510
  var panelId = _ref.panelId,
14278
16511
  presetExpandedSections = _ref.presetExpandedSections,
14279
16512
  presetFilterState = _ref.presetFilterState;
16513
+ var _React$useState = React.useState([]),
16514
+ selectedForBatchDelete = _React$useState[0],
16515
+ setSelectedForBatchDelete = _React$useState[1];
16516
+ var toggleWarningForBatchDelete = React.useCallback(function (warningId) {
16517
+ setSelectedForBatchDelete(function (prev) {
16518
+ if (prev.includes(warningId)) {
16519
+ return prev.filter(function (id) {
16520
+ return id !== warningId;
16521
+ });
16522
+ }
16523
+ return [].concat(prev, [warningId]);
16524
+ });
16525
+ }, []);
16526
+ var selectAllForBatchDelete = React.useCallback(function (warningIds) {
16527
+ setSelectedForBatchDelete(Array.from(new Set(warningIds)));
16528
+ }, []);
16529
+ var clearBatchDeleteSelection = React.useCallback(function () {
16530
+ setSelectedForBatchDelete([]);
16531
+ }, []);
14280
16532
  var updatePublicWarningEditor = useMutatePublicWarningEditor();
14281
16533
  var _useMutateMaritimeWar = useMutateMaritimeWarningsEditor(),
14282
16534
  updateMaritimeWarningEditor = _useMutateMaritimeWar.mutateAsync;
@@ -14304,9 +16556,9 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14304
16556
  dataUpdatedAt = _useWarnings.dataUpdatedAt;
14305
16557
  useAutoRefetchOnExpiry(combinedWarnings, refetchWarnings);
14306
16558
  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];
16559
+ var _React$useState2 = React.useState(undefined),
16560
+ confirmDialogOptions = _React$useState2[0],
16561
+ setConfirmDialogOptions = _React$useState2[1];
14310
16562
  var selectedWarningId = useSelector(getSelectedWarningId);
14311
16563
  var selectedFormWarning = useSelector(getPublicWarning);
14312
16564
  var isFormDirty = useSelector(getSelectedPublicIsFormDirty);
@@ -14358,6 +16610,14 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14358
16610
  }
14359
16611
  };
14360
16612
  var createWarning = function createWarning(warningType) {
16613
+ // TODO: Public warning events use their own Redux-connected dialog (for now, perhaps later we should integrate it here)
16614
+ if (warningType === 'warningEvent') {
16615
+ dispatch(uiActions.setToggleOpenDialog({
16616
+ setOpen: true,
16617
+ type: warningEventDialogType
16618
+ }));
16619
+ return;
16620
+ }
14361
16621
  void openPublicWarningDialog('', undefined, warningType);
14362
16622
  };
14363
16623
  var editWarning = /*#__PURE__*/function () {
@@ -14516,9 +16776,9 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14516
16776
  return _ref5.apply(this, arguments);
14517
16777
  };
14518
16778
  }();
14519
- var _React$useState2 = React.useState(new Set()),
14520
- hiddenWarningIds = _React$useState2[0],
14521
- setHiddenWarningIds = _React$useState2[1];
16779
+ var _React$useState3 = React.useState(new Set()),
16780
+ hiddenWarningIds = _React$useState3[0],
16781
+ setHiddenWarningIds = _React$useState3[1];
14522
16782
  var handleToggleWarningVisibility = React.useCallback(function (warningId) {
14523
16783
  setHiddenWarningIds(function (prev) {
14524
16784
  var next = new Set(prev);
@@ -14530,12 +16790,12 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14530
16790
  return next;
14531
16791
  });
14532
16792
  }, []);
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];
16793
+ var _React$useState4 = React.useState(false),
16794
+ cancelOpen = _React$useState4[0],
16795
+ setCancelOpen = _React$useState4[1];
16796
+ var _React$useState5 = React.useState(null),
16797
+ cancelCtx = _React$useState5[0],
16798
+ setCancelCtx = _React$useState5[1];
14539
16799
  var openCancelDialog = function openCancelDialog(warning) {
14540
16800
  var type = warning.warningDetail.level === 'SIG' ? 'sigmet' : 'airmet';
14541
16801
  var product = warning.sigmetAirmetDetails;
@@ -14701,658 +16961,404 @@ var PublicWarningListConnect = function PublicWarningListConnect(_ref) {
14701
16961
  function request() {
14702
16962
  return _request4.apply(this, arguments);
14703
16963
  }
14704
- return request;
14705
- }(),
14706
- callback: function callback() {
14707
- return onRemoveSuccess(warningToExtend.id, t('warning-dialog-extend-succes'));
14708
- }
14709
- });
14710
- void refetchWarnings();
14711
- };
14712
- var handleMaritimeProductClick = function handleMaritimeProductClick(warning, actionType) {
14713
- if (!warning) {
14714
- return;
14715
- }
14716
- switch (actionType) {
14717
- case MaritimeWarningAction.SELECT:
14718
- void openPublicWarningDialog('', undefined, warning.type);
14719
- break;
14720
- case MaritimeWarningAction.UPDATE:
14721
- void editMaritimeWarning(warning);
14722
- break;
14723
- case MaritimeWarningAction.EXTEND:
14724
- extendMaritimeWarning(warning);
14725
- break;
14726
- }
14727
- };
14728
- var openSnackbar = function openSnackbar(message) {
14729
- dispatch(snackbarActions.openSnackbar({
14730
- type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
14731
- message: message
14732
- }));
14733
- };
14734
- var deleteWarning = function deleteWarning(warningId, warningEditor) {
14735
- var _auth$username3;
14736
- var editor = warningEditor != null ? warningEditor : '';
14737
- var currentUser = (_auth$username3 = auth == null ? void 0 : auth.username) != null ? _auth$username3 : '';
14738
- var isLocked = editor !== '' && editor !== currentUser;
14739
- setConfirmDialogOptions({
14740
- confirmLabel: t('warning-dialog-delete-confirm'),
14741
- title: t('warning-dialog-delete-title'),
14742
- description: t('warning-dialog-delete-description'),
14743
- request: function () {
14744
- var _request5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0() {
14745
- return _regenerator().w(function (_context0) {
14746
- while (1) switch (_context0.n) {
14747
- case 0:
14748
- return _context0.a(2, deletePublicWarning({
14749
- id: warningId
14750
- }, {
14751
- onSuccess: function onSuccess() {
14752
- return onRemoveSuccessHooks(warningId);
14753
- }
14754
- }));
14755
- }
14756
- }, _callee0);
14757
- }));
14758
- function request() {
14759
- return _request5.apply(this, arguments);
14760
- }
14761
- return request;
14762
- }(),
14763
- isLocked: isLocked
14764
- });
14765
- };
14766
- var deleteReviewWarning = function deleteReviewWarning(warning) {
14767
- var ignoredWarning = Object.assign({}, warning, {
14768
- status: PublicWarningStatus.IGNORED
14769
- });
14770
- setConfirmDialogOptions({
14771
- confirmLabel: t('warning-dialog-delete-confirm'),
14772
- title: t('warning-dialog-delete-title'),
14773
- description: t('warning-dialog-delete-description'),
14774
- request: function () {
14775
- var _request6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1() {
14776
- return _regenerator().w(function (_context1) {
14777
- while (1) switch (_context1.n) {
14778
- case 0:
14779
- return _context1.a(2, saveWarning({
14780
- id: ignoredWarning.id,
14781
- data: Object.assign({}, ignoredWarning, {
14782
- type: 'public'
14783
- })
14784
- }));
14785
- }
14786
- }, _callee1);
14787
- }));
14788
- function request() {
14789
- return _request6.apply(this, arguments);
14790
- }
14791
- return request;
14792
- }(),
14793
- callback: function callback() {
14794
- return onRemoveSuccess(ignoredWarning.id, t('warning-dialog-delete-succes'));
14795
- }
14796
- });
14797
- void refetchWarnings();
14798
- };
14799
- var onRemoveSuccessHooks = function onRemoveSuccessHooks(warningId) {
14800
- setConfirmDialogOptions(undefined);
14801
- // Close warning dialog if needed
14802
- if (selectedWarningId === warningId) {
14803
- dispatch(uiActions.setToggleOpenDialog({
14804
- setOpen: false,
14805
- type: publicWarningDialogType
14806
- }));
14807
- }
16964
+ return request;
16965
+ }(),
16966
+ callback: function callback() {
16967
+ return onRemoveSuccess(warningToExtend.id, t('warning-dialog-extend-succes'));
16968
+ }
16969
+ });
16970
+ void refetchWarnings();
14808
16971
  };
14809
- // TODO remove when all is moved to tanstack
14810
- var onRemoveSuccess = function onRemoveSuccess(warningId, snackbarMessage) {
14811
- // close confirm dialog
14812
- setConfirmDialogOptions(undefined);
14813
- // Close warning dialog if needed
14814
- if (selectedWarningId === warningId) {
14815
- dispatch(uiActions.setToggleOpenDialog({
14816
- setOpen: false,
14817
- type: publicWarningDialogType
14818
- }));
16972
+ var handleMaritimeProductClick = function handleMaritimeProductClick(warning, actionType) {
16973
+ if (!warning) {
16974
+ return;
14819
16975
  }
14820
- if (snackbarMessage) {
14821
- openSnackbar(snackbarMessage);
16976
+ switch (actionType) {
16977
+ case MaritimeWarningAction.SELECT:
16978
+ void openPublicWarningDialog('', undefined, warning.type);
16979
+ break;
16980
+ case MaritimeWarningAction.UPDATE:
16981
+ void editMaritimeWarning(warning);
16982
+ break;
16983
+ case MaritimeWarningAction.EXTEND:
16984
+ extendMaritimeWarning(warning);
16985
+ break;
14822
16986
  }
14823
- refetchWarnings();
14824
16987
  };
14825
- var onUpdateFilters = React.useCallback(function (filterState, systemUpdate) {
14826
- if (systemUpdate === void 0) {
14827
- systemUpdate = false;
14828
- }
14829
- dispatch(warningsFiltersActions.setWarningFilters({
14830
- filterState: filterState,
14831
- panelId: panelId,
14832
- systemUpdate: systemUpdate
14833
- }));
14834
- }, [dispatch, panelId]);
14835
- var filterHookState = useWarningFilters(combinedWarnings, onUpdateFilters, savedFilterState, presetFilterState);
14836
- var filteredWarnings = React.useMemo(function () {
14837
- return combinedWarnings.filter(filterHookState.byFilterState);
14838
- }, [combinedWarnings, filterHookState.byFilterState]);
14839
- var isOverLimit = filteredWarnings.length > MAX_WARNINGS_DISPLAY;
14840
- var hasCustomTimeFilter = savedFilterState.time.mode === TimeFilterMode.custom;
14841
- var shouldShowAlertBanner = hasCustomTimeFilter && isOverLimit;
14842
- var displayedWarnings = React.useMemo(function () {
14843
- return shouldShowAlertBanner ? [] : filteredWarnings;
14844
- }, [shouldShowAlertBanner, filteredWarnings]);
14845
- var expandedSections = useSelector(function (store) {
14846
- return getExpandedSectionsByPanelId(store, panelId);
14847
- });
14848
- var setExpandedSections = React.useCallback(function (nextExpandedSections) {
14849
- dispatch(warningsFiltersActions.setExpandedSectionsForPanel({
14850
- panelId: panelId,
14851
- expandedSections: nextExpandedSections,
14852
- systemUpdate: false
14853
- }));
14854
- }, [dispatch, panelId]);
14855
- React.useEffect(function () {
14856
- if (!presetExpandedSections) {
14857
- return;
14858
- }
14859
- dispatch(warningsFiltersActions.setExpandedSectionsForPanel({
14860
- panelId: panelId,
14861
- expandedSections: presetExpandedSections,
14862
- systemUpdate: true
14863
- }));
14864
- }, [dispatch, panelId, presetExpandedSections]);
14865
- var filteredWarningsByExpandedSections = React.useMemo(function () {
14866
- return displayedWarnings.filter(function (warning) {
14867
- var sectionKey = warning.status || warning.productStatus;
14868
- return sectionKey ? Boolean(expandedSections[sectionKey]) : false;
14869
- });
14870
- }, [displayedWarnings, expandedSections]);
14871
- var selectedFormAreaIds = React.useMemo(function () {
14872
- var _selectedFormWarning$, _selectedFormWarning$2;
14873
- return new Set(((_selectedFormWarning$ = selectedFormWarning == null || (_selectedFormWarning$2 = selectedFormWarning.warningDetail) == null ? void 0 : _selectedFormWarning$2.areas) != null ? _selectedFormWarning$ : []).map(function (area) {
14874
- return area.areaId;
14875
- }).filter(function (areaId) {
14876
- return Boolean(areaId);
16988
+ var openSnackbar = function openSnackbar(message) {
16989
+ dispatch(snackbarActions.openSnackbar({
16990
+ type: snackbarTypes.SnackbarMessageType.VERBATIM_MESSAGE,
16991
+ message: message
14877
16992
  }));
14878
- }, [selectedFormWarning]);
14879
- var allFeatures = React.useMemo(function () {
14880
- return filteredWarningsByExpandedSections.flatMap(function (warning) {
14881
- var _warning$warningDetai, _warning$warningDetai2, _warning$warningDetai3, _warning$warningDetai4, _warning$warningDetai5;
14882
- var id = warning == null ? void 0 : warning.id;
14883
- var warningIds = [warning == null ? void 0 : warning.id, warning == null || (_warning$warningDetai = warning.warningDetail) == null ? void 0 : _warning$warningDetai.id].filter(function (warningId) {
14884
- return Boolean(warningId);
14885
- });
14886
- var hasMatchingAreaId = ((_warning$warningDetai2 = warning == null || (_warning$warningDetai3 = warning.warningDetail) == null ? void 0 : _warning$warningDetai3.areas) != null ? _warning$warningDetai2 : []).some(function (area) {
14887
- return area.areaId !== undefined && selectedFormAreaIds.has(area.areaId);
14888
- });
14889
- if (!id || warningIds.includes(selectedWarningId) || hasMatchingAreaId || hiddenWarningIds.has(id)) {
14890
- return [];
14891
- }
14892
- var areas = (_warning$warningDetai4 = warning == null || (_warning$warningDetai5 = warning.warningDetail) == null ? void 0 : _warning$warningDetai5.areas) != null ? _warning$warningDetai4 : [];
14893
- return areas.filter(function (area) {
14894
- return !!area.geoJSON;
14895
- }).map(function (area) {
14896
- var _warning$warningDetai6, _area$areaId;
14897
- var level = warning == null || (_warning$warningDetai6 = warning.warningDetail) == null ? void 0 : _warning$warningDetai6.level;
14898
- var isAviationWarning = warning.warningDetail.level === 'SIG' || warning.warningDetail.level === 'AIR';
14899
- var styledGeoJSON = level ? warningLevelFeatureColors(level, area.geoJSON, isAviationWarning) : area.geoJSON;
14900
- return {
14901
- id: id + ((_area$areaId = area.areaId) != null ? _area$areaId : ''),
14902
- originalId: id,
14903
- geoJSON: styledGeoJSON
14904
- };
14905
- });
14906
- }).filter(function (feature) {
14907
- return !!feature.id;
14908
- });
14909
- }, [filteredWarningsByExpandedSections, hiddenWarningIds, selectedFormAreaIds, selectedWarningId]);
14910
- useRegisterFeatureSyncSource(panelId);
14911
- var warningFeatureCollection = React.useMemo(function () {
14912
- return {
14913
- type: 'FeatureCollection',
14914
- features: allFeatures.flatMap(function (feature) {
14915
- return feature.geoJSON.features.map(function (geoFeature) {
14916
- var _geoFeature$propertie;
14917
- return Object.assign({}, geoFeature, {
14918
- properties: Object.assign({}, (_geoFeature$propertie = geoFeature.properties) != null ? _geoFeature$propertie : {}, {
14919
- originalId: feature.originalId
14920
- })
14921
- });
14922
- });
14923
- })
14924
- };
14925
- }, [allFeatures]);
14926
- var warningLayerId = React.useRef(webmapUtils.generateLayerId()).current;
14927
- var warningFeatureLayersById = React.useMemo(function () {
14928
- var _ref7;
14929
- return _ref7 = {}, _ref7[warningLayerId] = {
14930
- id: warningLayerId,
14931
- geojson: warningFeatureCollection
14932
- }, _ref7;
14933
- }, [warningLayerId, warningFeatureCollection]);
14934
- useUpdateFeatureSyncLayers(warningFeatureLayersById, panelId);
14935
- var store = useStore();
14936
- var workspaceViewsById = useSelector(function (state) {
14937
- return syncGroupsSelector.getWorkspaceViewsById(state);
14938
- });
14939
- var ownedFeatureLayerIds = useSelector(function (state) {
14940
- return genericSelectors.selectFeatureSyncLayerIdsForPanel(state, panelId);
14941
- }, shallowEqual);
14942
- var linkedTargetIds = useSelector(function (state) {
14943
- return genericSelectors.getLinkedTargetIds(state, panelId);
14944
- }, shallowEqual);
14945
- var hoveredLinkedFeatureIds = useSelector(function (state) {
14946
- return genericSelectors.selectHoveredFeatureIdsForPanel(state, panelId);
14947
- }, shallowEqual);
14948
- var hoveredLocalWarningIds = useSelector(function (state) {
14949
- return getHoveredWarningIdsByPanelId(state, panelId);
14950
- });
14951
- var hasLinkedTimelineTarget = linkedTargetIds.some(function (targetId) {
14952
- var _workspaceViewsById$t;
14953
- return (workspaceViewsById == null || (_workspaceViewsById$t = workspaceViewsById[targetId]) == null ? void 0 : _workspaceViewsById$t.componentType) === 'WarningsTimeline';
14954
- });
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];
14961
- var hoverDispatchTimeoutRef = React.useRef(undefined);
14962
- var hoveredFeatureId = isUsingLocalHoverOverride ? localHoveredWarningId : (_hoveredLinkedFeature = hoveredLinkedFeatureIds[0]) != null ? _hoveredLinkedFeature : hoveredLocalWarningIds[0];
14963
- var handleHoverWarning = React.useCallback(function (warningId) {
14964
- setLocalHoveredWarningId(warningId);
14965
- setIsUsingLocalHoverOverride(true);
14966
- if (hoverDispatchTimeoutRef.current) {
14967
- window.clearTimeout(hoverDispatchTimeoutRef.current);
14968
- }
14969
- hoverDispatchTimeoutRef.current = window.setTimeout(function () {
14970
- if (!ownedFeatureLayerIds.length && hasLinkedTimelineTarget) {
14971
- dispatch(warningsFiltersActions.setHoveredWarningIdsForPanel({
14972
- panelId: panelId,
14973
- warningIds: warningId ? [warningId] : []
14974
- }));
14975
- }
14976
- ownedFeatureLayerIds.forEach(function (layerId) {
14977
- dispatch(layerActions.setHoveredFeatures({
14978
- layerId: layerId,
14979
- hoveredFeatureIds: warningId ? [warningId] : []
14980
- }));
14981
- });
14982
- setIsUsingLocalHoverOverride(false);
14983
- }, WARNING_HOVER_DISPATCH_DELAY);
14984
- }, [dispatch, hasLinkedTimelineTarget, ownedFeatureLayerIds, panelId]);
14985
- React.useEffect(function () {
14986
- return function () {
14987
- if (hoverDispatchTimeoutRef.current) {
14988
- window.clearTimeout(hoverDispatchTimeoutRef.current);
14989
- }
14990
- var ownedLayerIds = genericSelectors.selectFeatureSyncLayerIdsForPanel(store.getState(), panelId);
14991
- var currentLinkedTargetIds = genericSelectors.getLinkedTargetIds(store.getState(), panelId);
14992
- var currentWorkspaceViewsById = syncGroupsSelector.getWorkspaceViewsById(store.getState());
14993
- var hasCurrentLinkedTimelineTarget = currentLinkedTargetIds.some(function (targetId) {
14994
- var _currentWorkspaceView;
14995
- return ((_currentWorkspaceView = currentWorkspaceViewsById[targetId]) == null ? void 0 : _currentWorkspaceView.componentType) === 'WarningsTimeline';
14996
- });
14997
- if (!ownedLayerIds.length && hasCurrentLinkedTimelineTarget) {
14998
- dispatch(warningsFiltersActions.setHoveredWarningIdsForPanel({
14999
- panelId: panelId,
15000
- warningIds: []
15001
- }));
15002
- }
15003
- ownedLayerIds.forEach(function (layerId) {
15004
- dispatch(layerActions.setHoveredFeatures({
15005
- layerId: layerId,
15006
- hoveredFeatureIds: []
15007
- }));
15008
- });
15009
- };
15010
- }, [dispatch, panelId, store]);
15011
- return isLoggedIn ? jsxs(Fragment, {
15012
- children: [jsx(PublicWarningList, {
15013
- error: error != null ? error : undefined,
15014
- expandedSections: expandedSections,
15015
- filterHookState: filterHookState,
15016
- hiddenWarningIds: hiddenWarningIds,
15017
- hoveredFeatureId: hoveredFeatureId,
15018
- isLoading: isFetching,
15019
- lastUpdatedTime: lastUpdateTime,
15020
- limitAlertCount: filteredWarnings.length,
15021
- onActionAviationWarning: handleAviationProductClick,
15022
- onActionMaritimeWarning: handleMaritimeProductClick,
15023
- onCreateWarning: createWarning,
15024
- onDeleteReviewWarning: deleteReviewWarning,
15025
- onDeleteWarning: deleteWarning,
15026
- onEditWarning: editWarning,
15027
- onExpireWarning: expireWarning,
15028
- onHoverWarning: handleHoverWarning,
15029
- onRefetchWarnings: refetchWarnings,
15030
- onSelectWarning: selectWarning,
15031
- onToggleWarningVisibility: handleToggleWarningVisibility,
15032
- onWithdrawWarning: withdrawWarning,
15033
- selectedWarningId: selectedWarningId,
15034
- setExpandedSections: setExpandedSections,
15035
- shouldDisableAviationAmendOption: (aviationConfig == null ? void 0 : aviationConfig.disable_amend_action) === true,
15036
- showLimitAlert: shouldShowAlertBanner,
15037
- warnings: displayedWarnings
15038
- }), confirmDialogOptions ? jsx(ConfirmDeleteWarningDialog, {
15039
- callback: confirmDialogOptions.callback,
15040
- confirmLabel: confirmDialogOptions.confirmLabel,
15041
- description: confirmDialogOptions.description,
15042
- isLocked: confirmDialogOptions.isLocked,
15043
- onClose: function onClose() {
15044
- return setConfirmDialogOptions(undefined);
15045
- },
15046
- request: confirmDialogOptions.request,
15047
- title: confirmDialogOptions.title
15048
- }) : null, !!cancelCtx && jsx(CancelAviationConfirmDialog, {
15049
- aviationConfig: aviationConfig,
15050
- 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) {
16993
+ };
16994
+ var deleteWarning = function deleteWarning(warningId, warningEditor) {
16995
+ var _auth$username3;
16996
+ var editor = warningEditor != null ? warningEditor : '';
16997
+ var currentUser = (_auth$username3 = auth == null ? void 0 : auth.username) != null ? _auth$username3 : '';
16998
+ var isLocked = editor !== '' && editor !== currentUser;
16999
+ setConfirmDialogOptions({
17000
+ confirmLabel: t('warning-dialog-delete-confirm'),
17001
+ title: t('warning-dialog-delete-title'),
17002
+ description: t('warning-dialog-delete-description'),
17003
+ request: function () {
17004
+ var _request5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0() {
17005
+ return _regenerator().w(function (_context0) {
17006
+ while (1) switch (_context0.n) {
17007
+ case 0:
17008
+ return _context0.a(2, deletePublicWarning({
17009
+ id: warningId
17010
+ }, {
17011
+ onSuccess: function onSuccess() {
17012
+ return onRemoveSuccessHooks(warningId);
17013
+ }
17014
+ }));
17015
+ }
17016
+ }, _callee0);
17017
+ }));
17018
+ function request() {
17019
+ return _request5.apply(this, arguments);
17020
+ }
17021
+ return request;
17022
+ }(),
17023
+ isLocked: isLocked
17024
+ });
17025
+ };
17026
+ var deleteReviewWarning = function deleteReviewWarning(warning) {
17027
+ var ignoredWarning = Object.assign({}, warning, {
17028
+ status: PublicWarningStatus.IGNORED
17029
+ });
17030
+ setConfirmDialogOptions({
17031
+ confirmLabel: t('warning-dialog-delete-confirm'),
17032
+ title: t('warning-dialog-delete-title'),
17033
+ description: t('warning-dialog-delete-description'),
17034
+ request: function () {
17035
+ var _request6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1() {
17036
+ return _regenerator().w(function (_context1) {
17037
+ while (1) switch (_context1.n) {
15054
17038
  case 0:
15055
- return _context10.a(2, _cancelAviationProduct(product, t, opts));
17039
+ return _context1.a(2, saveWarning({
17040
+ id: ignoredWarning.id,
17041
+ data: Object.assign({}, ignoredWarning, {
17042
+ type: 'public'
17043
+ })
17044
+ }));
15056
17045
  }
15057
- }, _callee10);
17046
+ }, _callee1);
15058
17047
  }));
15059
- function cancelAviationProduct(_x11, _x12, _x13) {
15060
- return _cancelAviationProduct2.apply(this, arguments);
17048
+ function request() {
17049
+ return _request6.apply(this, arguments);
15061
17050
  }
15062
- return cancelAviationProduct;
17051
+ return request;
15063
17052
  }(),
15064
- confirmLabel: getConfirmationDialogButtonLabel(t, ProductAction.CANCEL, cancelCtx.type),
15065
- onClose: closeCancelDialog,
15066
- open: cancelOpen,
15067
- product: cancelCtx.product,
15068
- showVA: cancelCtx.showVA,
15069
- sigmet: cancelCtx.sigmet,
15070
- title: getConfirmationDialogTitle(t, ProductAction.CANCEL, cancelCtx.type),
15071
- type: cancelCtx.type
15072
- })]
15073
- }) : jsx(AlertBanner, {
15074
- dataTestId: "public-warning-list-auth-error",
15075
- severity: "error",
15076
- title: t('error-auth-login')
15077
- });
15078
- };
15079
-
15080
- /* *
15081
- * Licensed under the Apache License, Version 2.0 (the "License");
15082
- * you may not use this file except in compliance with the License.
15083
- * You may obtain a copy of the License at
15084
- *
15085
- * http://www.apache.org/licenses/LICENSE-2.0
15086
- *
15087
- * Unless required by applicable law or agreed to in writing, software
15088
- * distributed under the License is distributed on an "AS IS" BASIS,
15089
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15090
- * See the License for the specific language governing permissions and
15091
- * limitations under the License.
15092
- *
15093
- * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15094
- * Copyright 2026 - Finnish Meteorological Institute (FMI)
15095
- * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
15096
- * */
15097
- var draftStripes = function draftStripes(stripeColor, bgColor) {
15098
- return "repeating-linear-gradient(\n -45deg,\n transparent,\n transparent 8px,\n " + stripeColor + " 8px,\n " + stripeColor + " 9px\n ), " + bgColor;
15099
- };
15100
- var TimelineColors = {
15101
- // Public warnings - Extreme (Red)
15102
- extreme: {
15103
- published: {
15104
- background: LevelColors.extreme.color,
15105
- border: LevelColors.extreme.borderColor,
15106
- iconColor: LevelColors.extreme.textColor,
15107
- letterColor: LevelColors.extreme.textColor
15108
- },
15109
- draft: {
15110
- background: '#F1D0D0',
15111
- stripeColor: 'rgba(255, 255, 255, 0.5)',
15112
- border: LevelColors.extreme.borderColor,
15113
- iconColor: LevelColors.extreme.color,
15114
- letterColor: LevelColors.extreme.color
15115
- },
15116
- expired: {
15117
- background: '#EFEFEF',
15118
- border: LevelColors.extreme.borderColor,
15119
- iconColor: LevelColors.extreme.color,
15120
- letterColor: LevelColors.extreme.color
15121
- }
15122
- },
15123
- // Public warnings - Severe (Orange)
15124
- severe: {
15125
- published: {
15126
- background: LevelColors.severe.color,
15127
- border: LevelColors.severe.borderColor,
15128
- iconColor: 'white',
15129
- letterColor: 'white'
15130
- },
15131
- draft: {
15132
- background: '#FADDC2',
15133
- stripeColor: 'rgba(255, 255, 255, 0.5)',
15134
- border: '#E27000',
15135
- iconColor: '#9C4D00',
15136
- letterColor: '#9C4D00'
15137
- },
15138
- expired: {
15139
- background: '#EFEFEF',
15140
- border: '#E27000',
15141
- iconColor: '#9C4D00',
15142
- letterColor: '#9C4D00'
15143
- }
15144
- },
15145
- // Public warnings - Moderate (Yellow)
15146
- moderate: {
15147
- published: {
15148
- background: LevelColors.moderate.color,
15149
- border: LevelColors.moderate.borderColor,
15150
- iconColor: '#3A3400',
15151
- letterColor: '#3A3400'
15152
- },
15153
- draft: {
15154
- background: '#FFFACE',
15155
- stripeColor: 'rgba(250, 226, 28, 0.5)',
15156
- // Yellow stripes
15157
- border: LevelColors.moderate.borderColor,
15158
- iconColor: '#3A3400',
15159
- letterColor: '#3A3400'
15160
- },
15161
- expired: {
15162
- background: '#EFEFEF',
15163
- border: LevelColors.moderate.borderColor,
15164
- iconColor: '#3A3400',
15165
- letterColor: '#3A3400'
15166
- }
15167
- },
15168
- // Aviation (SIGMET/AIRMET) - Blue
15169
- aviation: {
15170
- published: {
15171
- background: '#186DFF',
15172
- border: '#0800B9',
15173
- iconColor: '#FFFFFF',
15174
- letterColor: '#FFFFFF'
15175
- },
15176
- draft: {
15177
- background: '#E3EDFF',
15178
- stripeColor: 'rgba(255, 255, 255, 0.5)',
15179
- border: '#0800B9',
15180
- iconColor: '#0800B9',
15181
- letterColor: '#0800B9'
15182
- },
15183
- expired: {
15184
- background: '#EFEFEF',
15185
- border: '#0800B9',
15186
- iconColor: '#186DFF',
15187
- letterColor: '#186DFF'
15188
- }
15189
- },
15190
- // Default/fallback
15191
- "default": {
15192
- published: {
15193
- background: '#FFFFFF',
15194
- border: '#AAAAAA',
15195
- iconColor: '#333333',
15196
- letterColor: '#333333'
15197
- },
15198
- draft: {
15199
- background: '#FFFFFF',
15200
- stripeColor: 'rgba(255, 255, 255, 0.5)',
15201
- border: '#AAAAAA',
15202
- iconColor: '#333333',
15203
- letterColor: '#333333'
15204
- },
15205
- expired: {
15206
- background: '#EFEFEF',
15207
- border: '#AAAAAA',
15208
- iconColor: '#333333',
15209
- letterColor: '#333333'
17053
+ callback: function callback() {
17054
+ return onRemoveSuccess(ignoredWarning.id, t('warning-dialog-delete-succes'));
17055
+ }
17056
+ });
17057
+ void refetchWarnings();
17058
+ };
17059
+ var onRemoveSuccessHooks = function onRemoveSuccessHooks(warningId) {
17060
+ setConfirmDialogOptions(undefined);
17061
+ // Close warning dialog if needed
17062
+ if (selectedWarningId === warningId) {
17063
+ dispatch(uiActions.setToggleOpenDialog({
17064
+ setOpen: false,
17065
+ type: publicWarningDialogType
17066
+ }));
15210
17067
  }
15211
- }
15212
- };
15213
- var getThemeForLevel = function getThemeForLevel(level, isAviation) {
15214
- if (isAviation) {
15215
- return TimelineColors.aviation;
15216
- }
15217
- switch (level) {
15218
- case WarningLevel.extreme:
15219
- return TimelineColors.extreme;
15220
- case WarningLevel.severe:
15221
- return TimelineColors.severe;
15222
- case WarningLevel.moderate:
15223
- return TimelineColors.moderate;
15224
- default:
15225
- return TimelineColors["default"];
15226
- }
15227
- };
15228
- var getBlockStyle = function getBlockStyle(level, status, isAviation) {
15229
- var theme = getThemeForLevel(level, isAviation);
15230
- if (status === PublicWarningStatus.DRAFT || status === PublicWarningStatus.DRAFT_PUBLISHED) {
15231
- var _theme$draft = theme.draft,
15232
- stripeColor = _theme$draft.stripeColor,
15233
- background = _theme$draft.background,
15234
- border = _theme$draft.border,
15235
- iconColor = _theme$draft.iconColor,
15236
- letterColor = _theme$draft.letterColor;
15237
- return {
15238
- background: draftStripes(stripeColor, background),
15239
- border: "1px solid " + border,
15240
- borderColor: border,
15241
- iconColor: iconColor,
15242
- letterColor: letterColor
15243
- };
15244
- }
15245
- if (status === PublicWarningStatus.EXPIRED) {
15246
- return {
15247
- background: theme.expired.background,
15248
- border: "1px solid " + theme.expired.border,
15249
- borderColor: theme.expired.border,
15250
- iconColor: theme.expired.iconColor,
15251
- letterColor: theme.expired.letterColor
15252
- };
15253
- }
15254
- // Published (default)
15255
- return {
15256
- background: theme.published.background,
15257
- border: "1px solid " + theme.published.border,
15258
- borderColor: theme.published.border,
15259
- iconColor: theme.published.iconColor,
15260
- letterColor: theme.published.letterColor
15261
17068
  };
15262
- };
15263
-
15264
- var _STATUS_SORT_ORDER;
15265
- var EDGE_PADDING = 24;
15266
- var getEffectiveStatus = function getEffectiveStatus(warning) {
15267
- var _warning$status;
15268
- return (_warning$status = warning.status) != null ? _warning$status : mapProductStatusToWarningStatus(warning.productStatus);
15269
- };
15270
- var STATUS_SORT_ORDER = (_STATUS_SORT_ORDER = {}, _STATUS_SORT_ORDER[PublicWarningStatus.PUBLISHED] = 0, _STATUS_SORT_ORDER[PublicWarningStatus.DRAFT_PUBLISHED] = 0, _STATUS_SORT_ORDER[PublicWarningStatus.EXPIRED] = 1, _STATUS_SORT_ORDER[PublicWarningStatus.WITHDRAWN] = 1, _STATUS_SORT_ORDER[PublicWarningStatus.IGNORED] = 1, _STATUS_SORT_ORDER[PublicWarningStatus.DRAFT] = 2, _STATUS_SORT_ORDER[PublicWarningStatus.TODO] = 3, _STATUS_SORT_ORDER);
15271
- var compareWarningsByStatus = function compareWarningsByStatus(warningA, warningB) {
15272
- return STATUS_SORT_ORDER[getEffectiveStatus(warningA)] - STATUS_SORT_ORDER[getEffectiveStatus(warningB)];
15273
- };
15274
- var SIZE_THRESHOLDS = {
15275
- xxs: 24,
15276
- xs: 50,
15277
- sm: 100
15278
- };
15279
- var getTimelineX = function getTimelineX(targetTime, timelineStart, timelineEnd, drawableWidth) {
15280
- var totalTimelineDuration = timelineEnd.getTime() - timelineStart.getTime();
15281
- if (totalTimelineDuration <= 0) {
15282
- return 0;
15283
- }
15284
- var elapsedMs = targetTime.getTime() - timelineStart.getTime();
15285
- return EDGE_PADDING + elapsedMs / totalTimelineDuration * drawableWidth;
15286
- };
15287
- var getTimeFromX = function getTimeFromX(x, timelineStart, timelineEnd, drawableWidth) {
15288
- var totalTimelineDuration = timelineEnd.getTime() - timelineStart.getTime();
15289
- if (drawableWidth <= 0) {
15290
- return new Date(timelineStart);
15291
- }
15292
- var adjustedX = x - EDGE_PADDING;
15293
- var ratio = adjustedX / drawableWidth;
15294
- var timeMs = timelineStart.getTime() + ratio * totalTimelineDuration;
15295
- return new Date(timeMs);
15296
- };
15297
- var generateTicks = function generateTicks(timelineStart, timelineEnd) {
15298
- var ticks = [];
15299
- var hourInterval = 3;
15300
- var current = new Date(timelineStart);
15301
- current.setUTCMinutes(0, 0, 0);
15302
- if (current < timelineStart) {
15303
- current.setUTCHours(current.getUTCHours() + 1);
15304
- }
15305
- while (current <= timelineEnd) {
15306
- var hour = current.getUTCHours();
15307
- if (hour === 0) {
15308
- ticks.push({
15309
- time: new Date(current),
15310
- type: 'day'
15311
- });
15312
- } else if (hour % hourInterval === 0) {
15313
- ticks.push({
15314
- time: new Date(current),
15315
- type: 'major'
15316
- });
15317
- } else {
15318
- ticks.push({
15319
- time: new Date(current),
15320
- type: 'dashed'
17069
+ // TODO remove when all is moved to tanstack
17070
+ var onRemoveSuccess = function onRemoveSuccess(warningId, snackbarMessage) {
17071
+ // close confirm dialog
17072
+ setConfirmDialogOptions(undefined);
17073
+ // Close warning dialog if needed
17074
+ if (selectedWarningId === warningId) {
17075
+ dispatch(uiActions.setToggleOpenDialog({
17076
+ setOpen: false,
17077
+ type: publicWarningDialogType
17078
+ }));
17079
+ }
17080
+ if (snackbarMessage) {
17081
+ openSnackbar(snackbarMessage);
17082
+ }
17083
+ refetchWarnings();
17084
+ };
17085
+ var onUpdateFilters = React.useCallback(function (filterState, systemUpdate) {
17086
+ if (systemUpdate === void 0) {
17087
+ systemUpdate = false;
17088
+ }
17089
+ dispatch(warningsFiltersActions.setWarningFilters({
17090
+ filterState: filterState,
17091
+ panelId: panelId,
17092
+ systemUpdate: systemUpdate
17093
+ }));
17094
+ }, [dispatch, panelId]);
17095
+ var filterHookState = useWarningFilters(combinedWarnings, onUpdateFilters, savedFilterState, presetFilterState);
17096
+ var filteredWarnings = React.useMemo(function () {
17097
+ return combinedWarnings.filter(filterHookState.byFilterState);
17098
+ }, [combinedWarnings, filterHookState.byFilterState]);
17099
+ var isOverLimit = filteredWarnings.length > MAX_WARNINGS_DISPLAY;
17100
+ var hasCustomTimeFilter = savedFilterState.time.mode === TimeFilterMode.custom;
17101
+ var shouldShowAlertBanner = hasCustomTimeFilter && isOverLimit;
17102
+ var displayedWarnings = React.useMemo(function () {
17103
+ return shouldShowAlertBanner ? [] : filteredWarnings;
17104
+ }, [shouldShowAlertBanner, filteredWarnings]);
17105
+ React.useEffect(function () {
17106
+ setSelectedForBatchDelete(function (prev) {
17107
+ var visibleIds = new Set(displayedWarnings.map(function (warning) {
17108
+ return warning.id;
17109
+ }).filter(function (id) {
17110
+ return !!id;
17111
+ }));
17112
+ var next = prev.filter(function (id) {
17113
+ return visibleIds.has(id);
15321
17114
  });
17115
+ return next.length === prev.length ? prev : next;
17116
+ });
17117
+ }, [displayedWarnings]);
17118
+ var expandedSections = useSelector(function (store) {
17119
+ return getExpandedSectionsByPanelId(store, panelId);
17120
+ });
17121
+ var setExpandedSections = React.useCallback(function (nextExpandedSections) {
17122
+ dispatch(warningsFiltersActions.setExpandedSectionsForPanel({
17123
+ panelId: panelId,
17124
+ expandedSections: nextExpandedSections,
17125
+ systemUpdate: false
17126
+ }));
17127
+ }, [dispatch, panelId]);
17128
+ React.useEffect(function () {
17129
+ if (!presetExpandedSections) {
17130
+ return;
15322
17131
  }
15323
- current.setUTCHours(current.getUTCHours() + 1);
15324
- }
15325
- return ticks;
15326
- };
15327
- var getTickLineStyle = function getTickLineStyle(tickType) {
15328
- if (tickType === 'day') {
15329
- return {
15330
- width: '2px',
15331
- borderLeft: '2px solid #ABC3FF'
15332
- };
15333
- }
15334
- if (tickType === 'dashed') {
15335
- return {
15336
- width: '1px',
15337
- borderLeft: '1px dashed #E7ECFA'
17132
+ dispatch(warningsFiltersActions.setExpandedSectionsForPanel({
17133
+ panelId: panelId,
17134
+ expandedSections: presetExpandedSections,
17135
+ systemUpdate: true
17136
+ }));
17137
+ }, [dispatch, panelId, presetExpandedSections]);
17138
+ var filteredWarningsByExpandedSections = React.useMemo(function () {
17139
+ return displayedWarnings.filter(function (warning) {
17140
+ var sectionKey = warning.status || warning.productStatus;
17141
+ return sectionKey ? Boolean(expandedSections[sectionKey]) : false;
17142
+ });
17143
+ }, [displayedWarnings, expandedSections]);
17144
+ var _useWarningListFeatur = useWarningListFeatureSync({
17145
+ filteredWarningsByExpandedSections: filteredWarningsByExpandedSections,
17146
+ hiddenWarningIds: hiddenWarningIds,
17147
+ panelId: panelId,
17148
+ selectedFormWarning: selectedFormWarning,
17149
+ selectedWarningId: selectedWarningId
17150
+ }),
17151
+ handleHoverWarning = _useWarningListFeatur.handleHoverWarning,
17152
+ hoveredFeatureId = _useWarningListFeatur.hoveredFeatureId;
17153
+ var doBatchDelete = /*#__PURE__*/function () {
17154
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee11(warningIds) {
17155
+ var warningsById, promises, results;
17156
+ return _regenerator().w(function (_context11) {
17157
+ while (1) switch (_context11.n) {
17158
+ case 0:
17159
+ warningsById = new Map(displayedWarnings.map(function (warning) {
17160
+ return [warning.id, warning];
17161
+ }));
17162
+ promises = warningIds.flatMap(function (warningId) {
17163
+ var warning = warningsById.get(warningId);
17164
+ if (!warning) {
17165
+ return [];
17166
+ }
17167
+ if (warning.type === 'public') {
17168
+ var promise = warning.status === PublicWarningStatus.TODO ? saveWarning({
17169
+ id: warning.id,
17170
+ data: Object.assign({}, warning, {
17171
+ status: PublicWarningStatus.IGNORED,
17172
+ type: 'public'
17173
+ })
17174
+ }) : deletePublicWarning({
17175
+ id: warningId
17176
+ });
17177
+ return [{
17178
+ id: warningId,
17179
+ promise: promise
17180
+ }];
17181
+ }
17182
+ if (warning.type === 'airmet' || warning.type === 'sigmet') {
17183
+ return [{
17184
+ id: warningId,
17185
+ promise: postAviationProduct(warning.sigmetAirmetDetails, 'DISCARDED', warning.type)
17186
+ }];
17187
+ }
17188
+ // Maritime warnings are ignored as they cannot have status DRAFT/TODO
17189
+ return [];
17190
+ }); // Correct version
17191
+ _context11.n = 1;
17192
+ return Promise.allSettled(promises.map(/*#__PURE__*/function () {
17193
+ var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee10(_ref8) {
17194
+ var promise;
17195
+ return _regenerator().w(function (_context10) {
17196
+ while (1) switch (_context10.n) {
17197
+ case 0:
17198
+ promise = _ref8.promise;
17199
+ return _context10.a(2, promise);
17200
+ }
17201
+ }, _callee10);
17202
+ }));
17203
+ return function (_x12) {
17204
+ return _ref9.apply(this, arguments);
17205
+ };
17206
+ }()));
17207
+ case 1:
17208
+ results = _context11.v;
17209
+ return _context11.a(2, promises.filter(function (_, index) {
17210
+ return results[index].status === 'fulfilled';
17211
+ }).map(function (_ref0) {
17212
+ var id = _ref0.id;
17213
+ return id;
17214
+ }));
17215
+ }
17216
+ }, _callee11);
17217
+ }));
17218
+ return function doBatchDelete(_x11) {
17219
+ return _ref7.apply(this, arguments);
15338
17220
  };
15339
- }
15340
- return {
15341
- width: '1px',
15342
- borderLeft: '1px solid #90caf9'
17221
+ }();
17222
+ var onClickBatchDelete = function onClickBatchDelete(warningIds) {
17223
+ // Filter out any warnings that are excluded because of the filter
17224
+ var warningIdSet = new Set(displayedWarnings.map(function (warning) {
17225
+ return warning.id;
17226
+ }));
17227
+ var filteredWarningIds = warningIds.filter(function (id) {
17228
+ return warningIdSet.has(id);
17229
+ });
17230
+ var isLocked = filteredWarningIds.some(function (warningId) {
17231
+ var _fullWarning$editor, _auth$username4;
17232
+ var fullWarning = displayedWarnings.find(function (warning) {
17233
+ return warning.id === warningId;
17234
+ });
17235
+ var editor = (_fullWarning$editor = fullWarning == null ? void 0 : fullWarning.editor) != null ? _fullWarning$editor : '';
17236
+ var currentUser = (_auth$username4 = auth == null ? void 0 : auth.username) != null ? _auth$username4 : '';
17237
+ return editor !== '' && editor !== currentUser;
17238
+ });
17239
+ setConfirmDialogOptions({
17240
+ confirmLabel: t('warning-dialog-delete-all-confirm'),
17241
+ title: t('warning-dialog-delete-all-title'),
17242
+ description: t('warning-dialog-delete-all-description', {
17243
+ ns: WARN_NAMESPACE,
17244
+ NUMBER: filteredWarningIds.length
17245
+ }),
17246
+ request: function () {
17247
+ var _request7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee12() {
17248
+ return _regenerator().w(function (_context12) {
17249
+ while (1) switch (_context12.n) {
17250
+ case 0:
17251
+ return _context12.a(2, doBatchDelete(filteredWarningIds));
17252
+ }
17253
+ }, _callee12);
17254
+ }));
17255
+ function request() {
17256
+ return _request7.apply(this, arguments);
17257
+ }
17258
+ return request;
17259
+ }(),
17260
+ callback: function callback(data) {
17261
+ var successfulIds = data || [];
17262
+ if (filteredWarningIds.includes(selectedWarningId)) {
17263
+ dispatch(uiActions.setToggleOpenDialog({
17264
+ setOpen: false,
17265
+ type: publicWarningDialogType
17266
+ }));
17267
+ }
17268
+ // Only show snackbar and remove from selection if there were successes
17269
+ if (successfulIds.length > 0) {
17270
+ openSnackbar(t('warning-dialog-delete-all-succes'));
17271
+ setSelectedForBatchDelete(function (prev) {
17272
+ return prev.filter(function (id) {
17273
+ return !successfulIds.includes(id);
17274
+ });
17275
+ });
17276
+ }
17277
+ var failedCount = filteredWarningIds.length - successfulIds.length;
17278
+ if (failedCount > 0) {
17279
+ throw new Error(t('warning-dialog-delete-all-failed', {
17280
+ NUMBER: failedCount
17281
+ }));
17282
+ } else {
17283
+ setConfirmDialogOptions(undefined);
17284
+ }
17285
+ refetchWarnings();
17286
+ },
17287
+ isLocked: isLocked
17288
+ });
15343
17289
  };
15344
- };
15345
- var getBlockSize = function getBlockSize(width) {
15346
- if (width < SIZE_THRESHOLDS.xxs) {
15347
- return 'xxs';
15348
- }
15349
- if (width < SIZE_THRESHOLDS.xs) {
15350
- return 'xs';
15351
- }
15352
- if (width < SIZE_THRESHOLDS.sm) {
15353
- return 's';
15354
- }
15355
- return 'l';
17290
+ return isLoggedIn ? jsxs(Fragment, {
17291
+ children: [jsx(PublicWarningList, {
17292
+ error: error != null ? error : undefined,
17293
+ expandedSections: expandedSections,
17294
+ filterHookState: filterHookState,
17295
+ hiddenWarningIds: hiddenWarningIds,
17296
+ hoveredFeatureId: hoveredFeatureId,
17297
+ isLoading: isFetching,
17298
+ lastUpdatedTime: lastUpdateTime,
17299
+ limitAlertCount: filteredWarnings.length,
17300
+ onActionAviationWarning: handleAviationProductClick,
17301
+ onActionMaritimeWarning: handleMaritimeProductClick,
17302
+ onClearBatchDeleteSelection: clearBatchDeleteSelection,
17303
+ onClickBatchDelete: onClickBatchDelete,
17304
+ onCreateWarning: createWarning,
17305
+ onDeleteReviewWarning: deleteReviewWarning,
17306
+ onDeleteWarning: deleteWarning,
17307
+ onEditWarning: editWarning,
17308
+ onExpireWarning: expireWarning,
17309
+ onHoverWarning: handleHoverWarning,
17310
+ onRefetchWarnings: refetchWarnings,
17311
+ onSelectAllForBatchDelete: selectAllForBatchDelete,
17312
+ onSelectWarning: selectWarning,
17313
+ onToggleWarningVisibility: handleToggleWarningVisibility,
17314
+ onWithdrawWarning: withdrawWarning,
17315
+ selectedForBatchDelete: selectedForBatchDelete,
17316
+ selectedWarningId: selectedWarningId,
17317
+ setExpandedSections: setExpandedSections,
17318
+ shouldDisableAviationAmendOption: (aviationConfig == null ? void 0 : aviationConfig.disable_amend_action) === true,
17319
+ showLimitAlert: shouldShowAlertBanner,
17320
+ toggleWarningForBatchDelete: toggleWarningForBatchDelete,
17321
+ warnings: displayedWarnings
17322
+ }), confirmDialogOptions ? jsx(ConfirmDeleteWarningDialog, {
17323
+ callback: confirmDialogOptions.callback,
17324
+ confirmLabel: confirmDialogOptions.confirmLabel,
17325
+ description: confirmDialogOptions.description,
17326
+ isLocked: confirmDialogOptions.isLocked,
17327
+ onClose: function onClose() {
17328
+ return setConfirmDialogOptions(undefined);
17329
+ },
17330
+ request: confirmDialogOptions.request,
17331
+ title: confirmDialogOptions.title
17332
+ }) : null, !!cancelCtx && jsx(CancelAviationConfirmDialog, {
17333
+ aviationConfig: aviationConfig,
17334
+ cancelAviationProduct: function () {
17335
+ var _cancelAviationProduct2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee13(product, t, opts) {
17336
+ return _regenerator().w(function (_context13) {
17337
+ while (1) switch (_context13.n) {
17338
+ case 0:
17339
+ return _context13.a(2, _cancelAviationProduct(product, t, opts));
17340
+ }
17341
+ }, _callee13);
17342
+ }));
17343
+ function cancelAviationProduct(_x13, _x14, _x15) {
17344
+ return _cancelAviationProduct2.apply(this, arguments);
17345
+ }
17346
+ return cancelAviationProduct;
17347
+ }(),
17348
+ confirmLabel: getConfirmationDialogButtonLabel(t, ProductAction.CANCEL, cancelCtx.type),
17349
+ onClose: closeCancelDialog,
17350
+ open: cancelOpen,
17351
+ product: cancelCtx.product,
17352
+ showVA: cancelCtx.showVA,
17353
+ sigmet: cancelCtx.sigmet,
17354
+ title: getConfirmationDialogTitle(t, ProductAction.CANCEL, cancelCtx.type),
17355
+ type: cancelCtx.type
17356
+ })]
17357
+ }) : jsx(AlertBanner, {
17358
+ dataTestId: "public-warning-list-auth-error",
17359
+ severity: "error",
17360
+ title: t('error-auth-login')
17361
+ });
15356
17362
  };
15357
17363
 
15358
17364
  /**
@@ -15760,8 +17766,8 @@ var WarningsTimeline = function WarningsTimeline(_ref) {
15760
17766
  var _loop = function _loop() {
15761
17767
  var entry = _step.value;
15762
17768
  var nextSize = {
15763
- width: entry.contentRect.width,
15764
- height: entry.contentRect.height
17769
+ width: Math.round(entry.contentRect.width),
17770
+ height: Math.round(entry.contentRect.height)
15765
17771
  };
15766
17772
  setContainerSize(function (currentSize) {
15767
17773
  return currentSize.width === nextSize.width && currentSize.height === nextSize.height ? currentSize : nextSize;
@@ -15926,6 +17932,7 @@ var WarningsTimeline = function WarningsTimeline(_ref) {
15926
17932
  sx: {
15927
17933
  flex: 1,
15928
17934
  overflow: 'auto',
17935
+ scrollbarGutter: 'stable',
15929
17936
  minHeight: 0
15930
17937
  },
15931
17938
  children: jsx(Box$1, {
@@ -16188,4 +18195,4 @@ ComponentsLookUpWrapper) {
16188
18195
  }
16189
18196
  };
16190
18197
 
16191
- export { DrawingToolConnect, Wrapper as DrawingToolForm, DrawingToolFormConnect, DrawingToolMapButtonConnect, ObjectManagerConnect, ObjectManagerMapButtonConnect, PublicWarningsFormDialog, PublicWarningsFormDialogConnect, WARN_NAMESPACE, WarningsTimeline, WarningsTimelineConnect, componentsLookUp, createMockStore, isAlreadyEdited, selectors as publicWarningsSelectors, useObjectDrawDialogAction, warningFormConfirmationOptions, warningsDrawingsActions, warningsDrawingsReducer, warningsFiltersActions, warningsFiltersReducer, warningsFormActions, warningsFormListener, warningsFormReducer, warningsMiddlewares, warningsReducersMap, warningsTranslations };
18198
+ export { DrawingToolConnect, Wrapper as DrawingToolForm, DrawingToolFormConnect, DrawingToolMapButtonConnect, ObjectManagerConnect, ObjectManagerMapButtonConnect, PublicWarningsFormDialog, PublicWarningsFormDialogConnect, WARN_NAMESPACE, WarningEventDialog, WarningEventDialogConnect, WarningEventFormContent, WarningsTimeline, WarningsTimelineConnect, componentsLookUp, createMockStore, isAlreadyEdited, selectors as publicWarningsSelectors, useObjectDrawDialogAction, warningFormConfirmationOptions, warningsDrawingsActions, warningsDrawingsReducer, warningsFiltersActions, warningsFiltersReducer, warningsFormActions, warningsFormListener, warningsFormReducer, warningsMiddlewares, warningsReducersMap, warningsTranslations };