Skip to content

Commit 4d15f1c

Browse files
malwilleyandrewshie-sentry
authored andcommitted
feat(aci): Add pagination to detector list page (#93190)
1 parent 447d4c8 commit 4d15f1c

File tree

4 files changed

+39
-5
lines changed

4 files changed

+39
-5
lines changed

static/app/views/detectors/components/detectorListRow.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ const RowWrapper = styled('div')<{disabled?: boolean}>`
101101
align-items: center;
102102
padding: ${space(2)};
103103
104+
&:not(:last-child) {
105+
border-bottom: 1px solid ${p => p.theme.innerBorder};
106+
}
107+
104108
${p =>
105109
p.disabled &&
106110
css`

static/app/views/detectors/constants.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {FieldValueType} from 'sentry/utils/fields';
22

3-
export const DETECTOR_LIST_PAGE_LIMIT = 25;
3+
export const DETECTOR_LIST_PAGE_LIMIT = 20;
44

55
export const DETECTOR_FILTER_KEYS: Record<
66
string,

static/app/views/detectors/hooks/index.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ import {
1010
} from 'sentry/utils/queryClient';
1111
import useApi from 'sentry/utils/useApi';
1212
import useOrganization from 'sentry/utils/useOrganization';
13+
import {DETECTOR_LIST_PAGE_LIMIT} from 'sentry/views/detectors/constants';
1314

1415
interface UseDetectorsQueryKeyOptions {
16+
cursor?: string;
17+
limit?: number;
1518
projects?: number[];
1619
query?: string;
1720
sortBy?: string;
@@ -22,25 +25,31 @@ const makeDetectorListQueryKey = ({
2225
query,
2326
sortBy,
2427
projects,
28+
limit,
29+
cursor,
2530
}: {
2631
orgSlug: string;
32+
cursor?: string;
33+
limit?: number;
2734
projects?: number[];
2835
query?: string;
2936
sortBy?: string;
3037
}): ApiQueryKey => [
3138
`/organizations/${orgSlug}/detectors/`,
32-
{query: {query, sortBy, project: projects}},
39+
{query: {query, sortBy, project: projects, per_page: limit, cursor}},
3340
];
3441

3542
export function useDetectorsQuery({
3643
query,
3744
sortBy,
3845
projects,
46+
limit = DETECTOR_LIST_PAGE_LIMIT,
47+
cursor,
3948
}: UseDetectorsQueryKeyOptions = {}) {
4049
const org = useOrganization();
4150

4251
return useApiQuery<Detector[]>(
43-
makeDetectorListQueryKey({orgSlug: org.slug, query, sortBy, projects}),
52+
makeDetectorListQueryKey({orgSlug: org.slug, query, sortBy, projects, limit, cursor}),
4453
{
4554
staleTime: 0,
4655
retry: false,

static/app/views/detectors/list.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {Flex} from 'sentry/components/container/flex';
44
import {LinkButton} from 'sentry/components/core/button/linkButton';
55
import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container';
66
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
7+
import Pagination from 'sentry/components/pagination';
78
import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
89
import {ActionsProvider} from 'sentry/components/workflowEngine/layout/actions';
910
import ListLayout from 'sentry/components/workflowEngine/layout/list';
@@ -12,6 +13,7 @@ import {IconAdd} from 'sentry/icons';
1213
import {t} from 'sentry/locale';
1314
import {space} from 'sentry/styles/space';
1415
import {useLocation} from 'sentry/utils/useLocation';
16+
import {useNavigate} from 'sentry/utils/useNavigate';
1517
import useOrganization from 'sentry/utils/useOrganization';
1618
import usePageFilters from 'sentry/utils/usePageFilters';
1719
import DetectorListTable from 'sentry/views/detectors/components/detectorListTable';
@@ -23,14 +25,22 @@ export default function DetectorsList() {
2325
useWorkflowEngineFeatureGate({redirect: true});
2426

2527
const location = useLocation();
28+
const navigate = useNavigate();
2629
const {selection} = usePageFilters();
2730

2831
const query =
2932
typeof location.query.query === 'string' ? location.query.query : undefined;
3033
const sortBy =
3134
typeof location.query.sort === 'string' ? location.query.sort : undefined;
35+
const cursor =
36+
typeof location.query.cursor === 'string' ? location.query.cursor : undefined;
3237

33-
const {data: detectors, isPending} = useDetectorsQuery({
38+
const {
39+
data: detectors,
40+
isPending,
41+
getResponseHeader,
42+
} = useDetectorsQuery({
43+
cursor,
3444
query,
3545
sortBy,
3646
projects: selection.projects,
@@ -42,7 +52,18 @@ export default function DetectorsList() {
4252
<ActionsProvider actions={<Actions />}>
4353
<ListLayout>
4454
<TableHeader />
45-
<DetectorListTable detectors={detectors ?? []} isPending={isPending} />
55+
<div>
56+
<DetectorListTable detectors={detectors ?? []} isPending={isPending} />
57+
<Pagination
58+
pageLinks={getResponseHeader?.('Link')}
59+
onCursor={newCursor => {
60+
navigate({
61+
pathname: location.pathname,
62+
query: {...location.query, cursor: newCursor},
63+
});
64+
}}
65+
/>
66+
</div>
4667
</ListLayout>
4768
</ActionsProvider>
4869
</PageFiltersContainer>

0 commit comments

Comments
 (0)