From de34d1e5a7b0da5025c4b05ab86b3d0c6edfdc8c Mon Sep 17 00:00:00 2001 From: Josh Callender <1569818+saponifi3d@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:22:40 -0700 Subject: [PATCH 1/4] WIP --- .../components/automationListTable/index.tsx | 18 +++++- static/images/features/alerts-not-found.svg | 55 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 static/images/features/alerts-not-found.svg diff --git a/static/app/views/automations/components/automationListTable/index.tsx b/static/app/views/automations/components/automationListTable/index.tsx index 65a6c40db30b21..93467189003f19 100644 --- a/static/app/views/automations/components/automationListTable/index.tsx +++ b/static/app/views/automations/components/automationListTable/index.tsx @@ -1,12 +1,17 @@ import {useCallback, useMemo, useState, type ComponentProps} from 'react'; import styled from '@emotion/styled'; +import NoAlertsImage from 'sentry-images/features/alerts-not-found.svg'; + +import {Button} from '@sentry/scraps/button'; import {Flex} from '@sentry/scraps/layout'; +import {Text} from '@sentry/scraps/text'; import {hasEveryAccess} from 'sentry/components/acl/access'; import {LoadingError} from 'sentry/components/loadingError'; import {SimpleTable} from 'sentry/components/tables/simpleTable'; import {SelectAllHeaderCheckbox} from 'sentry/components/workflowEngine/ui/selectAllHeaderCheckbox'; +import {IconSearch} from 'sentry/icons'; import {t} from 'sentry/locale'; import type {Automation} from 'sentry/types/workflowEngine/automations'; import type {Sort} from 'sentry/utils/discover/fields'; @@ -173,7 +178,18 @@ export function AutomationListTable({ /> )} {isSuccess && automations.length === 0 && ( - {t('No alerts found')} + {/* TODO - pull this out so it's on it's own */} + + {/* TODO - Gap 16px, padding 56px */} + + + {t('No alerts found.')} + {t('Looking for a monitor? Try looking on the monitors page')} + + + )} {isError && } {isPending && } diff --git a/static/images/features/alerts-not-found.svg b/static/images/features/alerts-not-found.svg new file mode 100644 index 00000000000000..b838eecd118c45 --- /dev/null +++ b/static/images/features/alerts-not-found.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7723c3e6aac4adb257879e42d77367abb1e4b238 Mon Sep 17 00:00:00 2001 From: Josh Callender <1569818+saponifi3d@users.noreply.github.com> Date: Wed, 15 Apr 2026 15:00:23 -0700 Subject: [PATCH 2/4] add empty states for the detector and workflow list views --- .../components/automationListTable/index.tsx | 33 ++++++++++++++----- .../components/detectorListTable/index.tsx | 17 +++++++++- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/static/app/views/automations/components/automationListTable/index.tsx b/static/app/views/automations/components/automationListTable/index.tsx index 93467189003f19..5ebf4e152ce18b 100644 --- a/static/app/views/automations/components/automationListTable/index.tsx +++ b/static/app/views/automations/components/automationListTable/index.tsx @@ -3,7 +3,7 @@ import styled from '@emotion/styled'; import NoAlertsImage from 'sentry-images/features/alerts-not-found.svg'; -import {Button} from '@sentry/scraps/button'; +import {LinkButton} from '@sentry/scraps/button'; import {Flex} from '@sentry/scraps/layout'; import {Text} from '@sentry/scraps/text'; @@ -15,6 +15,7 @@ import {IconSearch} from 'sentry/icons'; import {t} from 'sentry/locale'; import type {Automation} from 'sentry/types/workflowEngine/automations'; import type {Sort} from 'sentry/utils/discover/fields'; +import {decodeScalar} from 'sentry/utils/queryString'; import {useLocation} from 'sentry/utils/useLocation'; import {useNavigate} from 'sentry/utils/useNavigate'; import {useOrganization} from 'sentry/utils/useOrganization'; @@ -24,6 +25,7 @@ import { AutomationListRowSkeleton, } from 'sentry/views/automations/components/automationListTable/row'; import {AUTOMATION_LIST_PAGE_LIMIT} from 'sentry/views/automations/constants'; +import {makeMonitorBasePathname} from 'sentry/views/detectors/pathnames'; type AutomationListTableProps = { allResultsVisible: boolean; @@ -88,6 +90,7 @@ export function AutomationListTable({ queryCount, allResultsVisible, }: AutomationListTableProps) { + const location = useLocation(); const organization = useOrganization(); const canEditAutomations = hasEveryAccess(['alerts:write'], {organization}); @@ -178,17 +181,27 @@ export function AutomationListTable({ /> )} {isSuccess && automations.length === 0 && ( - {/* TODO - pull this out so it's on it's own */} - {/* TODO - Gap 16px, padding 56px */} - + {t('No alerts found.')} - {t('Looking for a monitor? Try looking on the monitors page')} - - + + )} {isError && } @@ -206,6 +219,10 @@ export function AutomationListTable({ ); } +const StyledFlex = styled(Flex)` + padding: 56px; +`; + const AutomationsSimpleTable = styled(SimpleTable)` grid-template-columns: 1fr; diff --git a/static/app/views/detectors/components/detectorListTable/index.tsx b/static/app/views/detectors/components/detectorListTable/index.tsx index e85d3f3c23d278..5044212ed968d5 100644 --- a/static/app/views/detectors/components/detectorListTable/index.tsx +++ b/static/app/views/detectors/components/detectorListTable/index.tsx @@ -10,8 +10,11 @@ import {css, type Theme} from '@emotion/react'; import styled from '@emotion/styled'; import {useQueryState} from 'nuqs'; +import NoAlertsImage from 'sentry-images/features/alerts-not-found.svg'; + import {Button} from '@sentry/scraps/button'; import {Container, Flex} from '@sentry/scraps/layout'; +import {Text} from '@sentry/scraps/text'; import { GridLineLabels, @@ -242,7 +245,15 @@ export function DetectorListTable({ {isError && {t('Error loading monitors')}} {isPending && } {isSuccess && detectors.length === 0 && ( - {t('No monitors found')} + + + + {t('No monitors found.')} + + {t("Sorry, we couldn't find what you were looking for.")} + + + )} {hasVisualization && ( Date: Wed, 15 Apr 2026 15:32:17 -0700 Subject: [PATCH 3/4] Fix PR Feedback --- .../components/automationListTable/index.tsx | 17 +++++++---------- .../components/detectorListTable/index.tsx | 6 +++--- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/static/app/views/automations/components/automationListTable/index.tsx b/static/app/views/automations/components/automationListTable/index.tsx index 5ebf4e152ce18b..4eaf532c06c90a 100644 --- a/static/app/views/automations/components/automationListTable/index.tsx +++ b/static/app/views/automations/components/automationListTable/index.tsx @@ -1,11 +1,12 @@ import {useCallback, useMemo, useState, type ComponentProps} from 'react'; import styled from '@emotion/styled'; +import {parseAsString, useQueryState} from 'nuqs'; import NoAlertsImage from 'sentry-images/features/alerts-not-found.svg'; import {LinkButton} from '@sentry/scraps/button'; import {Flex} from '@sentry/scraps/layout'; -import {Text} from '@sentry/scraps/text'; +import {Heading, Text} from '@sentry/scraps/text'; import {hasEveryAccess} from 'sentry/components/acl/access'; import {LoadingError} from 'sentry/components/loadingError'; @@ -15,7 +16,6 @@ import {IconSearch} from 'sentry/icons'; import {t} from 'sentry/locale'; import type {Automation} from 'sentry/types/workflowEngine/automations'; import type {Sort} from 'sentry/utils/discover/fields'; -import {decodeScalar} from 'sentry/utils/queryString'; import {useLocation} from 'sentry/utils/useLocation'; import {useNavigate} from 'sentry/utils/useNavigate'; import {useOrganization} from 'sentry/utils/useOrganization'; @@ -90,10 +90,9 @@ export function AutomationListTable({ queryCount, allResultsVisible, }: AutomationListTableProps) { - const location = useLocation(); const organization = useOrganization(); const canEditAutomations = hasEveryAccess(['alerts:write'], {organization}); - + const [query] = useQueryState('query', parseAsString); const [selected, setSelected] = useState(new Set()); const togglePageSelected = (pageSelected: boolean) => { @@ -184,9 +183,9 @@ export function AutomationListTable({ - {t('No alerts found.')} + {t('No alerts found.')} - {t('Looking for a monitor? Try looking on the monitors page')} + {t('Try out that same query on the Monitors page.')} {t('Search Monitors')} @@ -220,7 +217,7 @@ export function AutomationListTable({ } const StyledFlex = styled(Flex)` - padding: 56px; + padding: ${p => p.theme.size.sm}; `; const AutomationsSimpleTable = styled(SimpleTable)` diff --git a/static/app/views/detectors/components/detectorListTable/index.tsx b/static/app/views/detectors/components/detectorListTable/index.tsx index 5044212ed968d5..804c3ea7dcfc30 100644 --- a/static/app/views/detectors/components/detectorListTable/index.tsx +++ b/static/app/views/detectors/components/detectorListTable/index.tsx @@ -14,7 +14,7 @@ import NoAlertsImage from 'sentry-images/features/alerts-not-found.svg'; import {Button} from '@sentry/scraps/button'; import {Container, Flex} from '@sentry/scraps/layout'; -import {Text} from '@sentry/scraps/text'; +import {Heading, Text} from '@sentry/scraps/text'; import { GridLineLabels, @@ -248,7 +248,7 @@ export function DetectorListTable({ - {t('No monitors found.')} + {t('No monitors found.')} {t("Sorry, we couldn't find what you were looking for.")} @@ -516,7 +516,7 @@ const VisualizationHeaderContainer = styled(Container)` `; const StyledFlex = styled(Flex)` - padding: 56px; + padding: ${p => p.theme.size.xs}; `; const VisualizationExpandButton = styled('div')` From 48b5812341eea658de77eccb72459bae92bab161 Mon Sep 17 00:00:00 2001 From: Josh Callender <1569818+saponifi3d@users.noreply.github.com> Date: Wed, 15 Apr 2026 15:32:49 -0700 Subject: [PATCH 4/4] make alerts-not-found svg smaller --- static/images/features/alerts-not-found.svg | 56 +-------------------- 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/static/images/features/alerts-not-found.svg b/static/images/features/alerts-not-found.svg index b838eecd118c45..e44095c1399e29 100644 --- a/static/images/features/alerts-not-found.svg +++ b/static/images/features/alerts-not-found.svg @@ -1,55 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file