Skip to content

Commit 7894e87

Browse files
committed
feat(aci): UI to filter monitors by assignee
1 parent 1e6b9e2 commit 7894e87

File tree

3 files changed

+51
-38
lines changed

3 files changed

+51
-38
lines changed

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

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,25 @@
11
import {SearchQueryBuilder} from 'sentry/components/searchQueryBuilder';
22
import {t} from 'sentry/locale';
3-
import type {TagCollection} from 'sentry/types/group';
4-
import type {FieldDefinition} from 'sentry/utils/fields';
5-
import {FieldKind} from 'sentry/utils/fields';
6-
import {DETECTOR_FILTER_KEYS} from 'sentry/views/detectors/constants';
3+
import {getFieldDefinition} from 'sentry/utils/fields';
4+
import {useDetectorFilterKeys} from 'sentry/views/detectors/utils/useDetectorFilterKeys';
75

86
type DetectorSearchProps = {
97
initialQuery: string;
108
onSearch: (query: string) => void;
119
};
1210

13-
function getDetectorFilterKeyDefinition(filterKey: string): FieldDefinition | null {
14-
if (DETECTOR_FILTER_KEYS.hasOwnProperty(filterKey) && DETECTOR_FILTER_KEYS[filterKey]) {
15-
const {description, valueType, keywords, values} = DETECTOR_FILTER_KEYS[filterKey];
16-
17-
return {
18-
kind: FieldKind.FIELD,
19-
desc: description,
20-
valueType,
21-
keywords,
22-
values,
23-
};
24-
}
25-
26-
return null;
27-
}
28-
29-
const FILTER_KEYS: TagCollection = Object.fromEntries(
30-
Object.keys(DETECTOR_FILTER_KEYS).map(key => {
31-
const {values} = DETECTOR_FILTER_KEYS[key] ?? {};
32-
33-
return [
34-
key,
35-
{
36-
key,
37-
name: key,
38-
predefined: values !== undefined,
39-
values,
40-
},
41-
];
42-
})
43-
);
44-
4511
export function DetectorSearch({initialQuery, onSearch}: DetectorSearchProps) {
12+
const filterKeys = useDetectorFilterKeys();
13+
4614
return (
4715
<SearchQueryBuilder
4816
initialQuery={initialQuery}
4917
placeholder={t('Search for monitors')}
5018
onSearch={onSearch}
51-
filterKeys={FILTER_KEYS}
19+
filterKeys={filterKeys}
5220
getTagValues={() => Promise.resolve([])}
5321
searchSource="detectors-list"
54-
fieldDefinitionGetter={getDetectorFilterKeyDefinition}
22+
fieldDefinitionGetter={getFieldDefinition}
5523
disallowUnsupportedFilters
5624
disallowWildcard
5725
disallowLogicalOperators

static/app/views/detectors/constants.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ export const DETECTOR_FILTER_KEYS: Record<
3636
] satisfies DetectorType[],
3737
keywords: ['type'],
3838
},
39+
assignee: {
40+
description: 'User or team assigned to the monitor',
41+
valueType: FieldValueType.STRING,
42+
keywords: ['assigned', 'owner'],
43+
},
3944
};
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import {useMemo} from 'react';
2+
3+
import type {TagCollection} from 'sentry/types/group';
4+
import useAssignedSearchValues from 'sentry/utils/membersAndTeams/useAssignedSearchValues';
5+
import {DETECTOR_FILTER_KEYS} from 'sentry/views/detectors/constants';
6+
7+
export function useDetectorFilterKeys(): TagCollection {
8+
const assignedValues = useAssignedSearchValues();
9+
10+
return useMemo(() => {
11+
return Object.fromEntries(
12+
Object.keys(DETECTOR_FILTER_KEYS).map(key => {
13+
const {values} = DETECTOR_FILTER_KEYS[key] ?? {};
14+
15+
// Special handling for assignee field to provide user/team values
16+
if (key === 'assignee') {
17+
return [
18+
key,
19+
{
20+
key,
21+
name: key,
22+
predefined: true,
23+
values: assignedValues,
24+
},
25+
];
26+
}
27+
28+
return [
29+
key,
30+
{
31+
key,
32+
name: key,
33+
predefined: values !== undefined,
34+
values,
35+
},
36+
];
37+
})
38+
);
39+
}, [assignedValues]);
40+
}

0 commit comments

Comments
 (0)