From f4425fb717cddd441d1696ea021b22931d5590c4 Mon Sep 17 00:00:00 2001 From: Ryan Carroll Date: Thu, 2 Apr 2026 08:53:27 -0500 Subject: [PATCH 1/2] Handle case where event definition is missing --- .../events/events/hooks/useEventDefinition.tsx | 7 +++---- .../events/EventsList/EventDetails.test.tsx | 3 ++- .../events/filters/EventDefinitionName.tsx | 18 +++++++----------- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/graylog2-web-interface/src/components/events/events/hooks/useEventDefinition.tsx b/graylog2-web-interface/src/components/events/events/hooks/useEventDefinition.tsx index 65ac4fe8a373..6ec64381133e 100644 --- a/graylog2-web-interface/src/components/events/events/hooks/useEventDefinition.tsx +++ b/graylog2-web-interface/src/components/events/events/hooks/useEventDefinition.tsx @@ -19,21 +19,20 @@ import { keepPreviousData, useQuery } from '@tanstack/react-query'; import fetch from 'logic/rest/FetchProvider'; import { qualifyUrl } from 'util/URLUtils'; import type { EventDefinition } from 'components/event-definitions/event-definitions-types'; -import { defaultOnError } from 'util/conditional/onError'; export const fetchEventDefinitionDetails = async (eventDefinitionId: string): Promise => fetch('GET', qualifyUrl(`/events/definitions/${eventDefinitionId}`)); const useEventDefinition = (eventDefId: string, enabled = true) => { - const { data, isFetching, isInitialLoading } = useQuery({ + const { data, isFetching, isInitialLoading, isError } = useQuery({ queryKey: ['get-event-definition-details', eventDefId], - queryFn: () => defaultOnError(fetchEventDefinitionDetails(eventDefId), 'Loading archives failed with status'), + queryFn: () => fetchEventDefinitionDetails(eventDefId), retry: 0, placeholderData: keepPreviousData, enabled: !!eventDefId && enabled, }); - return { data, isFetching, isInitialLoading }; + return { data, isFetching, isInitialLoading, isError }; }; export default useEventDefinition; diff --git a/graylog2-web-interface/src/views/components/widgets/events/EventsList/EventDetails.test.tsx b/graylog2-web-interface/src/views/components/widgets/events/EventsList/EventDetails.test.tsx index 1568b9d0aa45..e597d4672cc5 100644 --- a/graylog2-web-interface/src/views/components/widgets/events/EventsList/EventDetails.test.tsx +++ b/graylog2-web-interface/src/views/components/widgets/events/EventsList/EventDetails.test.tsx @@ -52,7 +52,7 @@ describe('EventDetails', () => { ); asMock(useCurrentUser).mockReturnValue(adminUser); - asMock(useEventDefinition).mockReturnValue({ data: undefined, isFetching: false, isInitialLoading: false }); + asMock(useEventDefinition).mockReturnValue({ data: undefined, isFetching: false, isInitialLoading: false, isError: false }); asMock(useEventById).mockImplementation(() => ({ data: mockEventData.event, @@ -86,6 +86,7 @@ describe('EventDetails', () => { data: mockEventDefinitionTwoAggregations, isFetching: false, isInitialLoading: false, + isError: false, }); renderEventDetails(); diff --git a/graylog2-web-interface/src/views/components/widgets/events/filters/EventDefinitionName.tsx b/graylog2-web-interface/src/views/components/widgets/events/filters/EventDefinitionName.tsx index 72f00ce9f7aa..4e48d168e040 100644 --- a/graylog2-web-interface/src/views/components/widgets/events/filters/EventDefinitionName.tsx +++ b/graylog2-web-interface/src/views/components/widgets/events/filters/EventDefinitionName.tsx @@ -30,26 +30,22 @@ type Props = { const EventDefinitionName = ({ eventDefinitionId, displayAsLink = true }: Props) => { const currentUser = useCurrentUser(); const canViewDefinition = isPermitted(currentUser.permissions, `eventdefinitions:read:${eventDefinitionId}`); - const { data: eventDefinition, isFetching } = useEventDefinition(eventDefinitionId, canViewDefinition); + const { data: eventDefinition, isFetching, isError } = useEventDefinition(eventDefinitionId, canViewDefinition); const title = eventDefinition?.title ?? eventDefinitionId; if (isFetching) { return ; } - if (!displayAsLink || !canViewDefinition) { + if (!displayAsLink || !canViewDefinition || !eventDefinition || isError) { return <>{title}; } - if (eventDefinition) { - return ( - - {title} - - ); - } - - return null; + return ( + + {title} + + ); }; export default EventDefinitionName; From 1d55492d1a2daab26920ece7240d0f6ae8791ce9 Mon Sep 17 00:00:00 2001 From: Ryan Carroll Date: Thu, 2 Apr 2026 08:57:41 -0500 Subject: [PATCH 2/2] add cl entry --- changelog/unreleased/pr-25548.toml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/unreleased/pr-25548.toml diff --git a/changelog/unreleased/pr-25548.toml b/changelog/unreleased/pr-25548.toml new file mode 100644 index 000000000000..88970122bc3e --- /dev/null +++ b/changelog/unreleased/pr-25548.toml @@ -0,0 +1,5 @@ +type = "fixed" +message = "Show event definition ID instead of throwing errors in the Events Overview widget when the event definition has been deleted" + +pulls = ["25548"] +issues = ["graylog-plugin-enterprise#13756"]