Skip to content
This repository was archived by the owner on May 13, 2025. It is now read-only.

Commit 78ab65c

Browse files
authored
feat: Add autocomplete for value selection in filters (#391)
1 parent ef4d635 commit 78ab65c

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

src/pages/Stream/components/Querier/FilterQueryBuilder.tsx

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import {
66
Box,
77
ThemeIcon,
88
Select,
9-
Input,
109
CloseIcon,
1110
Pill,
1211
ActionIcon,
12+
Autocomplete,
1313
} from '@mantine/core';
1414
import { IconFilter, IconPlus } from '@tabler/icons-react';
1515
import classes from '../../styles/Querier.module.css';
@@ -23,7 +23,7 @@ export const FilterPlaceholder = () => {
2323
);
2424
};
2525

26-
import { useCallback, useEffect } from 'react';
26+
import { useCallback, useEffect, useMemo, useState } from 'react';
2727
import { useFilterStore, filterStoreReducers, operatorLabelMap } from '../../providers/FilterProvider';
2828
import { useLogsStore } from '../../providers/LogsProvider';
2929
import {
@@ -60,6 +60,22 @@ type RuleViewType = {
6060
const RuleView = (props: RuleViewType) => {
6161
const { rule, type, groupId } = props;
6262
const [fieldNames, setFilterStore] = useFilterStore((store) => store.fieldNames);
63+
const [pageData] = useLogsStore((store) => store.tableOpts.pageData);
64+
const [columnValues, setColumnValues] = useState<string[]>([]);
65+
66+
const getUniqueColValues = useMemo(() => {
67+
if (!rule.field) return [];
68+
return Array.from(
69+
new Set(pageData.filter((item) => item[rule.field] !== null).map((item) => String(item[rule.field]))),
70+
);
71+
}, [pageData, rule.field]);
72+
73+
useEffect(() => {
74+
if (rule.field) {
75+
setColumnValues(getUniqueColValues);
76+
}
77+
}, [rule.field, getUniqueColValues]);
78+
6379
const onFieldChange = useCallback((field: string | null) => {
6480
if (field === null) return;
6581
setFilterStore((store) => updateRule(store, groupId, rule.id, { field }));
@@ -70,8 +86,8 @@ const RuleView = (props: RuleViewType) => {
7086
setFilterStore((store) => updateRule(store, groupId, rule.id, { operator }));
7187
}, []);
7288

73-
const onValueChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
74-
setFilterStore((store) => updateRule(store, groupId, rule.id, { value: e.target.value }));
89+
const onValueChange = useCallback((value: string) => {
90+
setFilterStore((store) => updateRule(store, groupId, rule.id, { value }));
7591
}, []);
7692

7793
const deleteBtnHandler = useCallback(() => {
@@ -91,14 +107,15 @@ const RuleView = (props: RuleViewType) => {
91107
onChange={onOperatorChange}
92108
w="33%"
93109
/>
94-
<Input
110+
111+
<Autocomplete
95112
value={value}
96-
onChange={onValueChange}
97113
w="33%"
98-
classNames={{ input: classes.fieldInput }}
99114
error={isError}
100-
type={type}
101-
disabled={isDisabled}
115+
limit={10}
116+
classNames={{ input: classes.fieldInput }}
117+
onChange={onValueChange}
118+
data={columnValues}
102119
/>
103120
<ActionIcon className={classes.deleteRulebtn} onClick={deleteBtnHandler} variant="light">
104121
<CloseIcon />

0 commit comments

Comments
 (0)