@@ -4,10 +4,19 @@ import ChartExport from "./ChartExport";
44import SearchableSelect from "./SearchableSelect" ;
55import Button from "./Button" ;
66import FilterSelector from "./FilterSelector" ;
7- import { state } from "../App" ;
87import { type FilterGroup } from "../types/filters" ;
9- import { createFilterFunction } from "../util/filter-utils" ;
10- import { computePivot } from "../util/pivot" ;
8+ import { usePivotData } from "../hooks/usePivotData" ;
9+ import {
10+ createFieldHandlerSet ,
11+ getAvailableKeys ,
12+ getPivotConfig ,
13+ updatePivotConfig ,
14+ resetPivotConfig ,
15+ updateFilterConfig ,
16+ getFlattenedDataset ,
17+ createFilterFunction ,
18+ getFilterConfig ,
19+ } from "../util/field-processors" ;
1120
1221interface FieldSelectorProps {
1322 title : string ;
@@ -127,62 +136,36 @@ const AggregatorSelector = ({
127136) ;
128137
129138const PivotTab = observer ( ( ) => {
130- const { pivotConfig } = state ;
139+ const pivotConfig = getPivotConfig ( ) ;
140+ const availableKeys = getAvailableKeys ( ) ;
131141
132- const updateRowFields = ( index : number , value : string ) => {
133- const newRowFields = [ ...pivotConfig . selectedRowFields ] ;
134- newRowFields [ index ] = value ;
135- state . updatePivotConfig ( { selectedRowFields : newRowFields } ) ;
136- } ;
137-
138- const updateColumnFields = ( index : number , value : string ) => {
139- const newColumnFields = [ ...pivotConfig . selectedColumnFields ] ;
140- newColumnFields [ index ] = value ;
141- state . updatePivotConfig ( { selectedColumnFields : newColumnFields } ) ;
142- } ;
142+ // Use the pivot data hook
143+ const pivotData = usePivotData ( {
144+ rowFields : pivotConfig . selectedRowFields ,
145+ columnFields : pivotConfig . selectedColumnFields ,
146+ valueField : pivotConfig . selectedValueField ,
147+ aggregator : pivotConfig . selectedAggregator as
148+ | "count"
149+ | "sum"
150+ | "avg"
151+ | "min"
152+ | "max" ,
153+ showRowTotals : true ,
154+ showColumnTotals : true ,
155+ } ) ;
143156
144157 const updateValueField = ( value : string ) => {
145- state . updatePivotConfig ( { selectedValueField : value } ) ;
158+ updatePivotConfig ( { selectedValueField : value } ) ;
146159 } ;
147160
148161 const updateAggregator = ( value : string ) => {
149- state . updatePivotConfig ( { selectedAggregator : value } ) ;
162+ updatePivotConfig ( { selectedAggregator : value } ) ;
150163 } ;
151164
152165 const updateFilters = ( filters : FilterGroup [ ] ) => {
153- state . updateFilterConfig ( filters ) ;
154- } ;
155-
156- const createFieldHandler = (
157- updater : ( index : number , value : string ) => void
158- ) => {
159- return ( index : number , value : string ) => {
160- updater ( index , value ) ;
161- } ;
162- } ;
163-
164- const createAddHandler = (
165- fields : string [ ] ,
166- updater : ( fields : string [ ] ) => void
167- ) => {
168- return ( ) => {
169- if ( fields . length < 3 ) {
170- updater ( [ ...fields , "" ] ) ;
171- }
172- } ;
166+ updateFilterConfig ( filters ) ;
173167 } ;
174168
175- const createRemoveHandler = (
176- fields : string [ ] ,
177- updater : ( fields : string [ ] ) => void
178- ) => {
179- return ( index : number ) => {
180- updater ( fields . filter ( ( _ , i ) => i !== index ) ) ;
181- } ;
182- } ;
183-
184- const availableKeys = state . flattenedDatasetKeys ;
185-
186169 return (
187170 < div >
188171 < div className = "text-xs text-gray-600 mb-2 max-w-2xl" >
@@ -196,7 +179,7 @@ const PivotTab = observer(() => {
196179 { /* Controls Section with Reset Button */ }
197180 < div className = "mb-4 flex justify-between items-center" >
198181 < Button
199- onClick = { ( ) => state . resetPivotConfig ( ) }
182+ onClick = { ( ) => resetPivotConfig ( ) }
200183 variant = "secondary"
201184 size = "sm"
202185 >
@@ -207,13 +190,8 @@ const PivotTab = observer(() => {
207190 < FieldSelector
208191 title = "Row Fields"
209192 fields = { pivotConfig . selectedRowFields }
210- onFieldChange = { createFieldHandler ( updateRowFields ) }
211- onAddField = { createAddHandler ( pivotConfig . selectedRowFields , ( fields ) =>
212- state . updatePivotConfig ( { selectedRowFields : fields } )
213- ) }
214- onRemoveField = { createRemoveHandler (
215- pivotConfig . selectedRowFields ,
216- ( fields ) => state . updatePivotConfig ( { selectedRowFields : fields } )
193+ { ...createFieldHandlerSet ( pivotConfig . selectedRowFields , ( fields ) =>
194+ updatePivotConfig ( { selectedRowFields : fields } )
217195 ) }
218196 availableKeys = { availableKeys }
219197 variant = "row"
@@ -222,14 +200,8 @@ const PivotTab = observer(() => {
222200 < FieldSelector
223201 title = "Column Fields"
224202 fields = { pivotConfig . selectedColumnFields }
225- onFieldChange = { createFieldHandler ( updateColumnFields ) }
226- onAddField = { createAddHandler (
227- pivotConfig . selectedColumnFields ,
228- ( fields ) => state . updatePivotConfig ( { selectedColumnFields : fields } )
229- ) }
230- onRemoveField = { createRemoveHandler (
231- pivotConfig . selectedColumnFields ,
232- ( fields ) => state . updatePivotConfig ( { selectedColumnFields : fields } )
203+ { ...createFieldHandlerSet ( pivotConfig . selectedColumnFields , ( fields ) =>
204+ updatePivotConfig ( { selectedColumnFields : fields } )
233205 ) }
234206 availableKeys = { availableKeys }
235207 variant = "column"
@@ -248,7 +220,7 @@ const PivotTab = observer(() => {
248220 />
249221
250222 < FilterSelector
251- filters = { state . filterConfig }
223+ filters = { getFilterConfig ( ) }
252224 onFiltersChange = { updateFilters }
253225 availableKeys = { availableKeys }
254226 title = "Filters"
@@ -265,72 +237,27 @@ const PivotTab = observer(() => {
265237 */ }
266238
267239 { /* Chart Export Component */ }
268- { pivotConfig . selectedRowFields . some ( ( field ) => field !== "" ) &&
269- pivotConfig . selectedColumnFields . some ( ( field ) => field !== "" ) && (
270- < ChartExport
271- pivotData = { computePivot ( {
272- data : state . flattenedDataset ,
273- rowFields : pivotConfig . selectedRowFields . filter (
274- ( field ) => field !== ""
275- ) as ( keyof ( typeof state . flattenedDataset ) [ number ] ) [ ] ,
276- columnFields : pivotConfig . selectedColumnFields . filter (
277- ( field ) => field !== ""
278- ) as ( keyof ( typeof state . flattenedDataset ) [ number ] ) [ ] ,
279- valueField :
280- pivotConfig . selectedValueField as keyof ( typeof state . flattenedDataset ) [ number ] ,
281- aggregator : pivotConfig . selectedAggregator as
282- | "count"
283- | "sum"
284- | "avg"
285- | "min"
286- | "max" ,
287- filter : createFilterFunction ( state . filterConfig ) ,
288- } ) }
289- rowFields = {
290- pivotConfig . selectedRowFields . filter (
291- ( field ) => field !== ""
292- ) as ( keyof ( typeof state . flattenedDataset ) [ number ] ) [ ]
293- }
294- columnFields = {
295- pivotConfig . selectedColumnFields . filter (
296- ( field ) => field !== ""
297- ) as ( keyof ( typeof state . flattenedDataset ) [ number ] ) [ ]
298- }
299- valueField = {
300- pivotConfig . selectedValueField as keyof ( typeof state . flattenedDataset ) [ number ]
301- }
302- aggregator = { pivotConfig . selectedAggregator }
303- showRowTotals
304- showColumnTotals
305- />
306- ) }
240+ { pivotData . hasValidConfiguration && (
241+ < ChartExport
242+ pivotData = { pivotData . pivotResult }
243+ rowFields = { pivotData . rowFields }
244+ columnFields = { pivotData . columnFields }
245+ valueField = { pivotData . valueField }
246+ aggregator = { pivotData . aggregator }
247+ showRowTotals
248+ showColumnTotals
249+ />
250+ ) }
307251
308252 < PivotTable
309- data = { state . flattenedDataset }
310- rowFields = {
311- pivotConfig . selectedRowFields . filter (
312- ( field ) => field !== ""
313- ) as ( keyof ( typeof state . flattenedDataset ) [ number ] ) [ ]
314- }
315- columnFields = {
316- pivotConfig . selectedColumnFields . filter (
317- ( field ) => field !== ""
318- ) as ( keyof ( typeof state . flattenedDataset ) [ number ] ) [ ]
319- }
320- valueField = {
321- pivotConfig . selectedValueField as keyof ( typeof state . flattenedDataset ) [ number ]
322- }
323- aggregator = {
324- pivotConfig . selectedAggregator as
325- | "count"
326- | "sum"
327- | "avg"
328- | "min"
329- | "max"
330- }
253+ data = { getFlattenedDataset ( ) }
254+ rowFields = { pivotData . rowFields }
255+ columnFields = { pivotData . columnFields }
256+ valueField = { pivotData . valueField }
257+ aggregator = { pivotData . aggregator }
331258 showRowTotals
332259 showColumnTotals
333- filter = { createFilterFunction ( state . filterConfig ) }
260+ filter = { createFilterFunction ( ) }
334261 />
335262 </ div >
336263 ) ;
0 commit comments