import LocalisedText from '@/components/LocalisedText' import SortableList from '@/components/common/SortableList' import { countsAxisFields, countsFilterFields, countsFieldLabel, useCountsDefinition } from '@/lib/countsDefinitions' import { useClientMotion } from '@/lib/useClientMotion' import { cn, inputClass } from '@/lib/utils' import { useUITranslation } from '@/lib/useUITranslation' import { readCountState, encodeCountState } from '@/lib/queryState' import type { CountsAxis } from '@/lib/countsDefinitions' const CountsAxes = ({ params, update }: { params: URLSearchParams; update: (key: string, value: string) => void }, ) => { const { label, message } = useUITranslation ('counts') const definition = useCountsDefinition () const motion = useClientMotion () const available = countsAxisFields (definition, params.get ('definition') === 'history') const rows = readCountState (params, 'rows', []) const cols = readCountState (params, 'cols', []) const axes = [...rows, ...cols] const groups = { available: available.map (field => field.key).filter (id => !axes.some ( axis => axis.field === id)), rows: rows.map (axis => axis.field), cols: cols.map (axis => axis.field) } const name = (id: string) => { const axis = axes.find (item => item.field === id) return axis == null ? message (available.find (field => field.key === id)?.label ?? 'axis') : message (countsFieldLabel (axis.field)) } const commit = (next: Record) => { for (const group of ['rows', 'cols'] as const) { if (next[group].join (' ') === groups[group].join (' ')) continue const selected = next[group].map (field => axes.find (axis => axis.field === field) ?? { field, ...(countsFilterFields (definition)[field] === 'datetime' ? { grain: 'month' } : { }) }) update (group, encodeCountState (group, selected)) } } const place = (id: string, target?: 'rows' | 'cols') => { const next = Object.fromEntries (Object.entries (groups).map (([key, ids]) => [ key, ids.filter (value => value !== id)])) if (target != null) next[target].push (id) else next.available.push (id) commit (next) } return
{label (id === 'available' ? 'axisItems' : id)}
{content}
} renderItem={(id, group) => { const axis = axes.find (axis => axis.field === id) return
{name (id).text} {group === 'available' && {(['rows', 'cols'] as const).map (target => )} } {group !== 'available' && <> {countsFilterFields (definition)[id] === 'datetime' && } }
}}/> } export default CountsAxes