11import { observer } from "mobx-react" ;
22import PivotTable from "./PivotTable" ;
33import Select from "./Select" ;
4+ import SearchableSelect from "./SearchableSelect" ;
45import Button from "./Button" ;
56import FilterInput from "./FilterInput" ;
67import { state } from "../App" ;
@@ -41,19 +42,17 @@ const FieldSelector = ({
4142 < div className = "space-y-2" >
4243 { fields . map ( ( field , index ) => (
4344 < div key = { index } className = "flex items-center space-x-2" >
44- < Select
45+ < SearchableSelect
4546 value = { field }
46- onChange = { ( e ) => onFieldChange ( index , e . target . value ) }
47+ onChange = { ( value ) => onFieldChange ( index , value ) }
48+ options = { [
49+ { value : "" , label : "Select a field..." } ,
50+ ...( availableKeys ?. map ( ( key ) => ( { value : key , label : key } ) ) ||
51+ [ ] ) ,
52+ ] }
4753 size = "sm"
4854 className = "min-w-48"
49- >
50- < option value = "" > Select a field...</ option >
51- { availableKeys ?. map ( ( key ) => (
52- < option key = { key } value = { key } >
53- { key }
54- </ option >
55- ) ) }
56- </ Select >
55+ />
5756 { fields . length > 0 && (
5857 < button
5958 onClick = { ( ) => onRemoveField ( index ) }
@@ -90,19 +89,16 @@ const SingleFieldSelector = ({
9089} ) => (
9190 < div className = "mb-4" >
9291 < div className = "text-xs font-medium text-gray-700 mb-2" > { title } :</ div >
93- < Select
92+ < SearchableSelect
9493 value = { field }
95- onChange = { ( e ) => onFieldChange ( e . target . value ) }
94+ onChange = { ( value ) => onFieldChange ( value ) }
95+ options = { [
96+ { value : "" , label : "Select a field..." } ,
97+ ...( availableKeys ?. map ( ( key ) => ( { value : key , label : key } ) ) || [ ] ) ,
98+ ] }
9699 size = "sm"
97100 className = "min-w-48"
98- >
99- < option value = "" > Select a field...</ option >
100- { availableKeys ?. map ( ( key ) => (
101- < option key = { key } value = { key } >
102- { key }
103- </ option >
104- ) ) }
105- </ Select >
101+ />
106102 </ div >
107103) ;
108104
@@ -117,18 +113,19 @@ const AggregatorSelector = ({
117113 < div className = "text-xs font-medium text-gray-700 mb-2" >
118114 Aggregation Method:
119115 </ div >
120- < Select
116+ < SearchableSelect
121117 value = { aggregator }
122- onChange = { ( e ) => onAggregatorChange ( e . target . value ) }
118+ onChange = { ( value ) => onAggregatorChange ( value ) }
119+ options = { [
120+ { value : "count" , label : "Count" } ,
121+ { value : "sum" , label : "Sum" } ,
122+ { value : "avg" , label : "Average" } ,
123+ { value : "min" , label : "Minimum" } ,
124+ { value : "max" , label : "Maximum" } ,
125+ ] }
123126 size = "sm"
124127 className = "min-w-48"
125- >
126- < option value = "count" > Count</ option >
127- < option value = "sum" > Sum</ option >
128- < option value = "avg" > Average</ option >
129- < option value = "min" > Minimum</ option >
130- < option value = "max" > Maximum</ option >
131- </ Select >
128+ />
132129 </ div >
133130) ;
134131
@@ -168,37 +165,33 @@ const FilterSelector = ({
168165
169166 return (
170167 < div key = { index } className = "flex items-center space-x-2" >
171- < Select
168+ < SearchableSelect
172169 value = { filter . field }
173- onChange = { ( e ) => {
174- const newField = e . target . value ;
170+ onChange = { ( value ) => {
171+ const newField = value ;
175172 const newType = getFieldType ( newField ) ;
176173 updateFilter ( index , { field : newField , type : newType } ) ;
177174 } }
175+ options = { [
176+ { value : "" , label : "Select a field..." } ,
177+ ...( availableKeys ?. map ( ( key ) => ( {
178+ value : key ,
179+ label : key ,
180+ } ) ) || [ ] ) ,
181+ ] }
178182 size = "sm"
179183 className = "min-w-48"
180- >
181- < option value = "" > Select a field...</ option >
182- { availableKeys ?. map ( ( key ) => (
183- < option key = { key } value = { key } >
184- { key }
185- </ option >
186- ) ) }
187- </ Select >
188- < Select
184+ />
185+ < SearchableSelect
189186 value = { filter . operator }
190- onChange = { ( e ) =>
191- updateFilter ( index , { operator : e . target . value } )
192- }
187+ onChange = { ( value ) => updateFilter ( index , { operator : value } ) }
188+ options = { operators . map ( ( op ) => ( {
189+ value : op . value ,
190+ label : op . label ,
191+ } ) ) }
193192 size = "sm"
194193 className = "min-w-32"
195- >
196- { operators . map ( ( op ) => (
197- < option key = { op . value } value = { op . value } >
198- { op . label }
199- </ option >
200- ) ) }
201- </ Select >
194+ />
202195 < FilterInput
203196 filter = { filter }
204197 index = { index }
0 commit comments