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')}
+ } priority="primary">
+ {t('Search Monitors')}
+
+
+
)}
{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')}
- } priority="primary">
+
+ {t('Looking for a monitor? Try looking on the monitors page')}
+
+
+ }
+ priority="primary"
+ to={{
+ pathname: makeMonitorBasePathname(organization.slug),
+ query: {
+ query: decodeScalar(location.query?.query),
+ },
+ }}
+ >
{t('Search Monitors')}
-
-
+
+
)}
{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