Pivot: fix slice filtering by zipping __ROW_PATH__ with group_by columns

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Paul Trowbridge 2026-04-14 22:14:45 -04:00
parent 7ec571635a
commit 1631dbd2cc

View File

@ -49,19 +49,24 @@ function normalize(v) {
function filterRows(allRows, row, config) { function filterRows(allRows, row, config) {
const groupBy = config.group_by || [] const groupBy = config.group_by || []
const splitBy = config.split_by || []
const pivotCols = [...groupBy, ...splitBy]
if (pivotCols.length === 0) { if (groupBy.length === 0) {
// Flat view the clicked row IS one underlying row; return it directly // Flat view clicked row IS the record
// (no need to re-filter; Perspective already shows one row per record)
return [row] return [row]
} }
// Pivoted filter allRows by each group/split column value // __ROW_PATH__ is an array of the group_by values in order, e.g. ["Groceries", "Wal-Mart"]
const criteria = pivotCols const rowPath = row['__ROW_PATH__']
.map(col => ({ col, val: normalize(row[col]) })) const pathVals = Array.isArray(rowPath)
.filter(({ val }) => val != null) ? rowPath
: String(rowPath).split(',').map(s => s.trim())
// Zip group_by columns with __ROW_PATH__ values to build filter criteria
const criteria = groupBy
.map((col, i) => ({ col, val: pathVals[i] != null ? String(pathVals[i]).trim() : null }))
.filter(({ val }) => val != null && val !== '')
if (criteria.length === 0) return allRows
return allRows.filter(r => return allRows.filter(r =>
criteria.every(({ col, val }) => normalize(r[col]) === val) criteria.every(({ col, val }) => normalize(r[col]) === val)
@ -113,12 +118,14 @@ export default function Pivot({ source }) {
const viewer = viewerRef.current const viewer = viewerRef.current
viewer.addEventListener('perspective-click', (e) => { viewer.addEventListener('perspective-click', async (e) => {
const detail = e.detail || {} const detail = e.detail || {}
const { row, config, column_names } = detail const { row, column_names } = detail
if (!row) return if (!row) return
// perspective-click's config only has filter save() gives us the full config incl. group_by
const config = await viewer.save()
setClickDetail({ row, config, column_names }) setClickDetail({ row, config, column_names })
const matched = filterRows(allRowsRef.current, row, config || {}) const matched = filterRows(allRowsRef.current, row, config)
setInspectedRows(matched) setInspectedRows(matched)
}) })