1- import { Grid , Column , TextField , Label , ListItem , Select , Icon , Button } from '@umami/react-zen' ;
2- import { useFilters } from '@/components/hooks' ;
1+ import { useState } from 'react' ;
2+ import { Grid , Column , TextField , Label , Select , Icon , Button , ListItem } from '@umami/react-zen' ;
3+ import { useFilters , useFormat , useWebsiteValuesQuery } from '@/components/hooks' ;
34import { Close } from '@/components/icons' ;
5+ import { isSearchOperator } from '@/lib/params' ;
46
57export interface FilterRecordProps {
8+ websiteId : string ;
9+ type : string ;
10+ startDate : Date ;
11+ endDate : Date ;
612 name : string ;
713 operator : string ;
814 value : string ;
@@ -12,6 +18,10 @@ export interface FilterRecordProps {
1218}
1319
1420export function FilterRecord ( {
21+ websiteId,
22+ type,
23+ startDate,
24+ endDate,
1525 name,
1626 operator,
1727 value,
@@ -20,16 +30,40 @@ export function FilterRecord({
2030 onChange,
2131} : FilterRecordProps ) {
2232 const { fields, operators } = useFilters ( ) ;
33+ const [ selected , setSelected ] = useState ( value ) ;
34+ const [ search , setSearch ] = useState ( '' ) ;
35+ const { formatValue } = useFormat ( ) ;
36+ const { data, isLoading } = useWebsiteValuesQuery ( {
37+ websiteId,
38+ type,
39+ search,
40+ startDate,
41+ endDate,
42+ } ) ;
43+ const isSearch = isSearchOperator ( operator ) ;
44+
45+ const handleSearch = value => {
46+ setSearch ( value ) ;
47+ } ;
48+
49+ const handleSelectOperator = value => {
50+ onSelect ?.( name , value ) ;
51+ } ;
52+
53+ const handleSelectValue = value => {
54+ setSelected ( value ) ;
55+ onChange ?.( name , value ) ;
56+ } ;
2357
2458 return (
25- < >
59+ < Column >
2660 < Label > { fields . find ( f => f . name === name ) ?. label } </ Label >
2761 < Grid columns = "1fr auto" gap >
2862 < Grid columns = "200px 1fr" gap >
2963 < Select
3064 items = { operators . filter ( ( { type } ) => type === 'string' ) }
3165 value = { operator }
32- onSelectionChange = { value => onSelect ?. ( name , value ) }
66+ onSelectionChange = { handleSelectOperator }
3367 >
3468 { ( { name, label } : any ) => {
3569 return (
@@ -39,7 +73,28 @@ export function FilterRecord({
3973 ) ;
4074 } }
4175 </ Select >
42- < TextField value = { value } onChange = { e => onChange ?.( name , e . target . value ) } />
76+ { isSearch && (
77+ < TextField value = { selected } defaultValue = { selected } onChange = { handleSelectValue } />
78+ ) }
79+ { ! isSearch && (
80+ < Select
81+ items = { data }
82+ value = { selected }
83+ onChange = { handleSelectValue }
84+ searchValue = { search }
85+ onSearch = { handleSearch }
86+ isLoading = { isLoading }
87+ allowSearch
88+ >
89+ { data ?. map ( ( { value } ) => {
90+ return (
91+ < ListItem key = { value } id = { value } >
92+ { formatValue ( value , type ) }
93+ </ ListItem >
94+ ) ;
95+ } ) }
96+ </ Select >
97+ ) }
4398 </ Grid >
4499 < Column justifyContent = "flex-end" >
45100 < Button variant = "quiet" onPress = { ( ) => onRemove ?.( name ) } >
@@ -49,6 +104,6 @@ export function FilterRecord({
49104 </ Button >
50105 </ Column >
51106 </ Grid >
52- </ >
107+ </ Column >
53108 ) ;
54109}
0 commit comments