@@ -20,46 +20,55 @@ const FieldSelector = ({
2020 onAddField,
2121 onRemoveField,
2222 availableKeys,
23- } : FieldSelectorProps ) => (
24- < div className = "mb-4" >
25- < div className = "text-xs font-medium text-gray-700 mb-2" > { title } :</ div >
26- < div className = "space-y-2" >
27- { fields . map ( ( field , index ) => (
28- < div key = { index } className = "flex items-center space-x-2" >
29- < Select
30- value = { field }
31- onChange = { ( e ) => onFieldChange ( index , e . target . value ) }
32- size = "sm"
33- className = "min-w-48"
34- >
35- < option value = "" > Select a field...</ option >
36- { availableKeys ?. map ( ( key ) => (
37- < option key = { key } value = { key } >
38- { key }
39- </ option >
40- ) ) }
41- </ Select >
42- { fields . length > 0 && (
43- < button
44- onClick = { ( ) => onRemoveField ( index ) }
45- className = "text-xs text-red-600 hover:text-red-800 px-2 py-1"
23+ variant = "default" ,
24+ } : FieldSelectorProps & { variant ?: "row" | "column" | "default" } ) => {
25+ const variantStyles = {
26+ row : "border-l-4 border-l-blue-500 pl-3" ,
27+ column : "border-l-4 border-l-green-500 pl-3" ,
28+ default : "" ,
29+ } ;
30+
31+ return (
32+ < div className = { `mb-4 ${ variantStyles [ variant ] } ` } >
33+ < div className = "text-xs font-medium text-gray-700 mb-2" > { title } :</ div >
34+ < div className = "space-y-2" >
35+ { fields . map ( ( field , index ) => (
36+ < div key = { index } className = "flex items-center space-x-2" >
37+ < Select
38+ value = { field }
39+ onChange = { ( e ) => onFieldChange ( index , e . target . value ) }
40+ size = "sm"
41+ className = "min-w-48"
4642 >
47- Remove
48- </ button >
49- ) }
50- </ div >
51- ) ) }
52- { fields . length < 3 && (
53- < button
54- onClick = { onAddField }
55- className = "text-xs text-blue-600 hover:text-blue-800 px-2 py-1"
56- >
57- + Add { title . slice ( 0 , - 1 ) } Field
58- </ button >
59- ) }
43+ < option value = "" > Select a field...</ option >
44+ { availableKeys ?. map ( ( key ) => (
45+ < option key = { key } value = { key } >
46+ { key }
47+ </ option >
48+ ) ) }
49+ </ Select >
50+ { fields . length > 0 && (
51+ < button
52+ onClick = { ( ) => onRemoveField ( index ) }
53+ className = "text-xs text-red-600 hover:text-red-800 px-2 py-1"
54+ >
55+ Remove
56+ </ button >
57+ ) }
58+ </ div >
59+ ) ) }
60+ { fields . length < 3 && (
61+ < button
62+ onClick = { onAddField }
63+ className = "text-xs text-blue-600 hover:text-blue-800 px-2 py-1"
64+ >
65+ + Add { title . slice ( 0 , - 1 ) } Field
66+ </ button >
67+ ) }
68+ </ div >
6069 </ div >
61- </ div >
62- ) ;
70+ ) ;
71+ } ;
6372
6473const SingleFieldSelector = ( {
6574 title,
@@ -90,6 +99,32 @@ const SingleFieldSelector = ({
9099 </ div >
91100) ;
92101
102+ const AggregatorSelector = ( {
103+ aggregator,
104+ onAggregatorChange,
105+ } : {
106+ aggregator : string ;
107+ onAggregatorChange : ( value : string ) => void ;
108+ } ) => (
109+ < div className = "mb-4" >
110+ < div className = "text-xs font-medium text-gray-700 mb-2" >
111+ Aggregation Method:
112+ </ div >
113+ < Select
114+ value = { aggregator }
115+ onChange = { ( e ) => onAggregatorChange ( e . target . value ) }
116+ size = "sm"
117+ className = "min-w-48"
118+ >
119+ < option value = "count" > Count</ option >
120+ < option value = "sum" > Sum</ option >
121+ < option value = "avg" > Average</ option >
122+ < option value = "min" > Minimum</ option >
123+ < option value = "max" > Maximum</ option >
124+ </ Select >
125+ </ div >
126+ ) ;
127+
93128const PivotTab = observer ( ( ) => {
94129 const [ selectedRowFields , setSelectedRowFields ] = useState < string [ ] > ( [
95130 "$.eval_metadata.name" ,
@@ -100,6 +135,7 @@ const PivotTab = observer(() => {
100135 const [ selectedValueField , setSelectedValueField ] = useState < string > (
101136 "$.evaluation_result.score"
102137 ) ;
138+ const [ selectedAggregator , setSelectedAggregator ] = useState < string > ( "avg" ) ;
103139
104140 const createFieldHandler = (
105141 setter : React . Dispatch < React . SetStateAction < string [ ] > >
@@ -147,6 +183,7 @@ const PivotTab = observer(() => {
147183 onAddField = { createAddHandler ( setSelectedRowFields ) }
148184 onRemoveField = { createRemoveHandler ( setSelectedRowFields ) }
149185 availableKeys = { availableKeys }
186+ variant = "row"
150187 />
151188
152189 < FieldSelector
@@ -156,6 +193,7 @@ const PivotTab = observer(() => {
156193 onAddField = { createAddHandler ( setSelectedColumnFields ) }
157194 onRemoveField = { createRemoveHandler ( setSelectedColumnFields ) }
158195 availableKeys = { availableKeys }
196+ variant = "column"
159197 />
160198
161199 < SingleFieldSelector
@@ -165,6 +203,11 @@ const PivotTab = observer(() => {
165203 availableKeys = { availableKeys }
166204 />
167205
206+ < AggregatorSelector
207+ aggregator = { selectedAggregator }
208+ onAggregatorChange = { setSelectedAggregator }
209+ />
210+
168211 < PivotTable
169212 data = { state . flattenedDataset }
170213 rowFields = {
@@ -180,7 +223,7 @@ const PivotTab = observer(() => {
180223 valueField = {
181224 selectedValueField as keyof ( typeof state . flattenedDataset ) [ number ]
182225 }
183- aggregator = "avg"
226+ aggregator = { selectedAggregator as any }
184227 showRowTotals
185228 showColumnTotals
186229 />
0 commit comments