|
1 | 1 | import { observer } from "mobx-react"; |
2 | 2 | import PivotTable from "./PivotTable"; |
3 | 3 | import Select from "./Select"; |
| 4 | +import Button from "./Button"; |
4 | 5 | import { state } from "../App"; |
5 | | -import { useState } from "react"; |
| 6 | +import { useEffect } from "react"; |
6 | 7 |
|
7 | 8 | interface FieldSelectorProps { |
8 | 9 | title: string; |
@@ -243,45 +244,61 @@ const FilterSelector = ({ |
243 | 244 | }; |
244 | 245 |
|
245 | 246 | const PivotTab = observer(() => { |
246 | | - const [selectedRowFields, setSelectedRowFields] = useState<string[]>([ |
247 | | - "$.eval_metadata.name", |
248 | | - ]); |
249 | | - const [selectedColumnFields, setSelectedColumnFields] = useState<string[]>([ |
250 | | - "$.input_metadata.completion_params.model", |
251 | | - ]); |
252 | | - const [selectedValueField, setSelectedValueField] = useState<string>( |
253 | | - "$.evaluation_result.score" |
254 | | - ); |
255 | | - const [selectedAggregator, setSelectedAggregator] = useState<string>("avg"); |
256 | | - const [filters, setFilters] = useState< |
257 | | - Array<{ field: string; operator: string; value: string }> |
258 | | - >([]); |
| 247 | + // Use global state instead of local state |
| 248 | + const { pivotConfig } = state; |
| 249 | + |
| 250 | + // Update global state when configuration changes |
| 251 | + const updateRowFields = (index: number, value: string) => { |
| 252 | + const newRowFields = [...pivotConfig.selectedRowFields]; |
| 253 | + newRowFields[index] = value; |
| 254 | + state.updatePivotConfig({ selectedRowFields: newRowFields }); |
| 255 | + }; |
| 256 | + |
| 257 | + const updateColumnFields = (index: number, value: string) => { |
| 258 | + const newColumnFields = [...pivotConfig.selectedColumnFields]; |
| 259 | + newColumnFields[index] = value; |
| 260 | + state.updatePivotConfig({ selectedColumnFields: newColumnFields }); |
| 261 | + }; |
| 262 | + |
| 263 | + const updateValueField = (value: string) => { |
| 264 | + state.updatePivotConfig({ selectedValueField: value }); |
| 265 | + }; |
| 266 | + |
| 267 | + const updateAggregator = (value: string) => { |
| 268 | + state.updatePivotConfig({ selectedAggregator: value }); |
| 269 | + }; |
| 270 | + |
| 271 | + const updateFilters = ( |
| 272 | + filters: Array<{ field: string; operator: string; value: string }> |
| 273 | + ) => { |
| 274 | + state.updatePivotConfig({ filters }); |
| 275 | + }; |
259 | 276 |
|
260 | 277 | const createFieldHandler = ( |
261 | | - setter: React.Dispatch<React.SetStateAction<string[]>> |
| 278 | + updater: (index: number, value: string) => void |
262 | 279 | ) => { |
263 | 280 | return (index: number, value: string) => { |
264 | | - setter((prev) => { |
265 | | - const newFields = [...prev]; |
266 | | - newFields[index] = value; |
267 | | - return newFields; |
268 | | - }); |
| 281 | + updater(index, value); |
269 | 282 | }; |
270 | 283 | }; |
271 | 284 |
|
272 | 285 | const createAddHandler = ( |
273 | | - setter: React.Dispatch<React.SetStateAction<string[]>> |
| 286 | + fields: string[], |
| 287 | + updater: (fields: string[]) => void |
274 | 288 | ) => { |
275 | 289 | return () => { |
276 | | - setter((prev) => (prev.length < 3 ? [...prev, ""] : prev)); |
| 290 | + if (fields.length < 3) { |
| 291 | + updater([...fields, ""]); |
| 292 | + } |
277 | 293 | }; |
278 | 294 | }; |
279 | 295 |
|
280 | 296 | const createRemoveHandler = ( |
281 | | - setter: React.Dispatch<React.SetStateAction<string[]>> |
| 297 | + fields: string[], |
| 298 | + updater: (fields: string[]) => void |
282 | 299 | ) => { |
283 | 300 | return (index: number) => { |
284 | | - setter((prev) => prev.filter((_, i) => i !== index)); |
| 301 | + updater(fields.filter((_, i) => i !== index)); |
285 | 302 | }; |
286 | 303 | }; |
287 | 304 |
|
@@ -338,63 +355,85 @@ const PivotTab = observer(() => { |
338 | 355 | specific subsets of your data. |
339 | 356 | </div> |
340 | 357 |
|
| 358 | + {/* Controls Section with Reset Button */} |
| 359 | + <div className="mb-4 flex justify-between items-center"> |
| 360 | + <Button |
| 361 | + onClick={() => state.resetPivotConfig()} |
| 362 | + variant="secondary" |
| 363 | + size="sm" |
| 364 | + > |
| 365 | + Reset to Defaults |
| 366 | + </Button> |
| 367 | + </div> |
| 368 | + |
341 | 369 | <FieldSelector |
342 | 370 | title="Row Fields" |
343 | | - fields={selectedRowFields} |
344 | | - onFieldChange={createFieldHandler(setSelectedRowFields)} |
345 | | - onAddField={createAddHandler(setSelectedRowFields)} |
346 | | - onRemoveField={createRemoveHandler(setSelectedRowFields)} |
| 371 | + fields={pivotConfig.selectedRowFields} |
| 372 | + onFieldChange={createFieldHandler(updateRowFields)} |
| 373 | + onAddField={createAddHandler(pivotConfig.selectedRowFields, (fields) => |
| 374 | + state.updatePivotConfig({ selectedRowFields: fields }) |
| 375 | + )} |
| 376 | + onRemoveField={createRemoveHandler( |
| 377 | + pivotConfig.selectedRowFields, |
| 378 | + (fields) => state.updatePivotConfig({ selectedRowFields: fields }) |
| 379 | + )} |
347 | 380 | availableKeys={availableKeys} |
348 | 381 | variant="row" |
349 | 382 | /> |
350 | 383 |
|
351 | 384 | <FieldSelector |
352 | 385 | title="Column Fields" |
353 | | - fields={selectedColumnFields} |
354 | | - onFieldChange={createFieldHandler(setSelectedColumnFields)} |
355 | | - onAddField={createAddHandler(setSelectedColumnFields)} |
356 | | - onRemoveField={createRemoveHandler(setSelectedColumnFields)} |
| 386 | + fields={pivotConfig.selectedColumnFields} |
| 387 | + onFieldChange={createFieldHandler(updateColumnFields)} |
| 388 | + onAddField={createAddHandler( |
| 389 | + pivotConfig.selectedColumnFields, |
| 390 | + (fields) => state.updatePivotConfig({ selectedColumnFields: fields }) |
| 391 | + )} |
| 392 | + onRemoveField={createRemoveHandler( |
| 393 | + pivotConfig.selectedColumnFields, |
| 394 | + (fields) => state.updatePivotConfig({ selectedColumnFields: fields }) |
| 395 | + )} |
357 | 396 | availableKeys={availableKeys} |
358 | 397 | variant="column" |
359 | 398 | /> |
360 | 399 |
|
361 | 400 | <SingleFieldSelector |
362 | 401 | title="Value Field" |
363 | | - field={selectedValueField} |
364 | | - onFieldChange={setSelectedValueField} |
| 402 | + field={pivotConfig.selectedValueField} |
| 403 | + onFieldChange={updateValueField} |
365 | 404 | availableKeys={availableKeys} |
366 | 405 | /> |
367 | 406 |
|
368 | 407 | <AggregatorSelector |
369 | | - aggregator={selectedAggregator} |
370 | | - onAggregatorChange={setSelectedAggregator} |
| 408 | + aggregator={pivotConfig.selectedAggregator} |
| 409 | + onAggregatorChange={updateAggregator} |
371 | 410 | /> |
372 | 411 |
|
373 | 412 | <FilterSelector |
374 | | - filters={filters} |
375 | | - onFiltersChange={setFilters} |
| 413 | + filters={pivotConfig.filters} |
| 414 | + onFiltersChange={updateFilters} |
376 | 415 | availableKeys={availableKeys} |
377 | 416 | /> |
378 | 417 |
|
379 | 418 | <PivotTable |
380 | 419 | data={state.flattenedDataset} |
381 | 420 | rowFields={ |
382 | | - selectedRowFields.filter( |
| 421 | + pivotConfig.selectedRowFields.filter( |
383 | 422 | (field) => field !== "" |
384 | 423 | ) as (keyof (typeof state.flattenedDataset)[number])[] |
385 | 424 | } |
386 | 425 | columnFields={ |
387 | | - selectedColumnFields.filter( |
| 426 | + pivotConfig.selectedColumnFields.filter( |
388 | 427 | (field) => field !== "" |
389 | 428 | ) as (keyof (typeof state.flattenedDataset)[number])[] |
390 | 429 | } |
391 | 430 | valueField={ |
392 | | - selectedValueField as keyof (typeof state.flattenedDataset)[number] |
| 431 | + pivotConfig.selectedValueField as keyof (typeof state.flattenedDataset)[number] |
393 | 432 | } |
394 | | - aggregator={selectedAggregator as any} |
| 433 | + aggregator={pivotConfig.selectedAggregator as any} |
395 | 434 | showRowTotals |
396 | 435 | showColumnTotals |
397 | | - filter={createFilterFunction(filters)} |
| 436 | + filter={createFilterFunction(pivotConfig.filters)} |
398 | 437 | /> |
399 | 438 | </div> |
400 | 439 | ); |
|
0 commit comments