exploreda 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +144 -0
- package/dist/ExplorEda.cjs +4608 -10858
- package/dist/ExplorEda.cjs.map +1 -1
- package/dist/ExplorEda.css +2332 -1653
- package/dist/ExplorEda.css.map +1 -1
- package/dist/ExplorEda.d.cts +125 -278
- package/dist/ExplorEda.d.ts +125 -278
- package/dist/ExplorEda.js +4521 -10782
- package/dist/ExplorEda.js.map +1 -1
- package/dist/calculations.cjs +18 -0
- package/dist/calculations.cjs.map +1 -0
- package/dist/calculations.d.cts +63 -0
- package/dist/calculations.d.ts +63 -0
- package/dist/calculations.js +3 -0
- package/dist/calculations.js.map +1 -0
- package/dist/charts/bar.cjs +27 -0
- package/dist/charts/bar.cjs.map +1 -0
- package/dist/charts/bar.d.cts +2 -0
- package/dist/charts/bar.d.ts +2 -0
- package/dist/charts/bar.js +18 -0
- package/dist/charts/bar.js.map +1 -0
- package/dist/charts/box-plot.cjs +26 -0
- package/dist/charts/box-plot.cjs.map +1 -0
- package/dist/charts/box-plot.d.cts +2 -0
- package/dist/charts/box-plot.d.ts +2 -0
- package/dist/charts/box-plot.js +17 -0
- package/dist/charts/box-plot.js.map +1 -0
- package/dist/charts/color-legend.cjs +22 -0
- package/dist/charts/color-legend.cjs.map +1 -0
- package/dist/charts/color-legend.d.cts +2 -0
- package/dist/charts/color-legend.d.ts +2 -0
- package/dist/charts/color-legend.js +13 -0
- package/dist/charts/color-legend.js.map +1 -0
- package/dist/charts/data-table.cjs +22 -0
- package/dist/charts/data-table.cjs.map +1 -0
- package/dist/charts/data-table.d.cts +2 -0
- package/dist/charts/data-table.d.ts +2 -0
- package/dist/charts/data-table.js +13 -0
- package/dist/charts/data-table.js.map +1 -0
- package/dist/charts/line.cjs +30 -0
- package/dist/charts/line.cjs.map +1 -0
- package/dist/charts/line.d.cts +2 -0
- package/dist/charts/line.d.ts +2 -0
- package/dist/charts/line.js +17 -0
- package/dist/charts/line.js.map +1 -0
- package/dist/charts/markdown.cjs +16 -0
- package/dist/charts/markdown.cjs.map +1 -0
- package/dist/charts/markdown.css +77 -0
- package/dist/charts/markdown.css.map +1 -0
- package/dist/charts/markdown.d.cts +2 -0
- package/dist/charts/markdown.d.ts +2 -0
- package/dist/charts/markdown.js +7 -0
- package/dist/charts/markdown.js.map +1 -0
- package/dist/charts/pivot-table.cjs +23 -0
- package/dist/charts/pivot-table.cjs.map +1 -0
- package/dist/charts/pivot-table.d.cts +2 -0
- package/dist/charts/pivot-table.d.ts +2 -0
- package/dist/charts/pivot-table.js +14 -0
- package/dist/charts/pivot-table.js.map +1 -0
- package/dist/charts/row.cjs +27 -0
- package/dist/charts/row.cjs.map +1 -0
- package/dist/charts/row.d.cts +6 -0
- package/dist/charts/row.d.ts +6 -0
- package/dist/charts/row.js +18 -0
- package/dist/charts/row.js.map +1 -0
- package/dist/charts/scatter.cjs +24 -0
- package/dist/charts/scatter.cjs.map +1 -0
- package/dist/charts/scatter.d.cts +2 -0
- package/dist/charts/scatter.d.ts +2 -0
- package/dist/charts/scatter.js +15 -0
- package/dist/charts/scatter.js.map +1 -0
- package/dist/charts/summary-table.cjs +19 -0
- package/dist/charts/summary-table.cjs.map +1 -0
- package/dist/charts/summary-table.d.cts +2 -0
- package/dist/charts/summary-table.d.ts +2 -0
- package/dist/charts/summary-table.js +10 -0
- package/dist/charts/summary-table.js.map +1 -0
- package/dist/charts/three-d-scatter.cjs +24 -0
- package/dist/charts/three-d-scatter.cjs.map +1 -0
- package/dist/charts/three-d-scatter.d.cts +6 -0
- package/dist/charts/three-d-scatter.d.ts +6 -0
- package/dist/charts/three-d-scatter.js +15 -0
- package/dist/charts/three-d-scatter.js.map +1 -0
- package/dist/chunk-3PGYFLE3.cjs +499 -0
- package/dist/chunk-3PGYFLE3.cjs.map +1 -0
- package/dist/chunk-4HNDKMWF.js +167 -0
- package/dist/chunk-4HNDKMWF.js.map +1 -0
- package/dist/chunk-4QNENKTV.cjs +1214 -0
- package/dist/chunk-4QNENKTV.cjs.map +1 -0
- package/dist/chunk-54M32JJB.js +132 -0
- package/dist/chunk-54M32JJB.js.map +1 -0
- package/dist/chunk-5B23JVH3.cjs +2238 -0
- package/dist/chunk-5B23JVH3.cjs.map +1 -0
- package/dist/chunk-5LH6NSNL.js +456 -0
- package/dist/chunk-5LH6NSNL.js.map +1 -0
- package/dist/chunk-6DOKKCJ5.cjs +313 -0
- package/dist/chunk-6DOKKCJ5.cjs.map +1 -0
- package/dist/chunk-6HZX5CBT.cjs +1074 -0
- package/dist/chunk-6HZX5CBT.cjs.map +1 -0
- package/dist/chunk-6U5DOIQM.js +1071 -0
- package/dist/chunk-6U5DOIQM.js.map +1 -0
- package/dist/chunk-7GBZIK2R.cjs +80 -0
- package/dist/chunk-7GBZIK2R.cjs.map +1 -0
- package/dist/chunk-7PTJNIOD.js +520 -0
- package/dist/chunk-7PTJNIOD.js.map +1 -0
- package/dist/chunk-AHZYQ7FN.js +319 -0
- package/dist/chunk-AHZYQ7FN.js.map +1 -0
- package/dist/chunk-AOODAOL4.cjs +55 -0
- package/dist/chunk-AOODAOL4.cjs.map +1 -0
- package/dist/chunk-ASKFIRMC.cjs +165 -0
- package/dist/chunk-ASKFIRMC.cjs.map +1 -0
- package/dist/chunk-B7OQUBH4.cjs +171 -0
- package/dist/chunk-B7OQUBH4.cjs.map +1 -0
- package/dist/chunk-BIMEHDLB.js +72 -0
- package/dist/chunk-BIMEHDLB.js.map +1 -0
- package/dist/chunk-C62KHV7S.js +1225 -0
- package/dist/chunk-C62KHV7S.js.map +1 -0
- package/dist/chunk-C7GQT65O.cjs +1119 -0
- package/dist/chunk-C7GQT65O.cjs.map +1 -0
- package/dist/chunk-CGDWDV4Z.js +1211 -0
- package/dist/chunk-CGDWDV4Z.js.map +1 -0
- package/dist/chunk-CJQQFNEY.js +69 -0
- package/dist/chunk-CJQQFNEY.js.map +1 -0
- package/dist/chunk-DHYLSXNR.js +964 -0
- package/dist/chunk-DHYLSXNR.js.map +1 -0
- package/dist/chunk-DKFA4KOJ.cjs +87 -0
- package/dist/chunk-DKFA4KOJ.cjs.map +1 -0
- package/dist/chunk-DS5BS7PP.cjs +357 -0
- package/dist/chunk-DS5BS7PP.cjs.map +1 -0
- package/dist/chunk-EGMFQSGK.js +909 -0
- package/dist/chunk-EGMFQSGK.js.map +1 -0
- package/dist/chunk-EU5EFHO5.cjs +53 -0
- package/dist/chunk-EU5EFHO5.cjs.map +1 -0
- package/dist/chunk-FM46QSDM.js +837 -0
- package/dist/chunk-FM46QSDM.js.map +1 -0
- package/dist/chunk-GV2LRR32.cjs +843 -0
- package/dist/chunk-GV2LRR32.cjs.map +1 -0
- package/dist/chunk-H3XKFSA5.cjs +322 -0
- package/dist/chunk-H3XKFSA5.cjs.map +1 -0
- package/dist/chunk-H5AVMMCE.js +347 -0
- package/dist/chunk-H5AVMMCE.js.map +1 -0
- package/dist/chunk-JDMUN4VK.cjs +986 -0
- package/dist/chunk-JDMUN4VK.cjs.map +1 -0
- package/dist/chunk-JNO7OXCC.js +2171 -0
- package/dist/chunk-JNO7OXCC.js.map +1 -0
- package/dist/chunk-JQMG4ZR7.js +111 -0
- package/dist/chunk-JQMG4ZR7.js.map +1 -0
- package/dist/chunk-L2Q2R43U.cjs +118 -0
- package/dist/chunk-L2Q2R43U.cjs.map +1 -0
- package/dist/chunk-LBTZVERO.js +466 -0
- package/dist/chunk-LBTZVERO.js.map +1 -0
- package/dist/chunk-LUUGGTTK.cjs +1227 -0
- package/dist/chunk-LUUGGTTK.cjs.map +1 -0
- package/dist/chunk-MEEPH7ZC.cjs +911 -0
- package/dist/chunk-MEEPH7ZC.cjs.map +1 -0
- package/dist/chunk-MJPDJ5AS.js +184 -0
- package/dist/chunk-MJPDJ5AS.js.map +1 -0
- package/dist/chunk-MJROUIDZ.cjs +219 -0
- package/dist/chunk-MJROUIDZ.cjs.map +1 -0
- package/dist/chunk-MUWSBYJS.js +528 -0
- package/dist/chunk-MUWSBYJS.js.map +1 -0
- package/dist/chunk-NDF5LCST.js +1088 -0
- package/dist/chunk-NDF5LCST.js.map +1 -0
- package/dist/chunk-NGWTPED4.js +311 -0
- package/dist/chunk-NGWTPED4.js.map +1 -0
- package/dist/chunk-PP4VCONW.js +739 -0
- package/dist/chunk-PP4VCONW.js.map +1 -0
- package/dist/chunk-PRMC2A6P.cjs +488 -0
- package/dist/chunk-PRMC2A6P.cjs.map +1 -0
- package/dist/chunk-PST6UU6S.cjs +742 -0
- package/dist/chunk-PST6UU6S.cjs.map +1 -0
- package/dist/chunk-Q7LK2UWH.js +33 -0
- package/dist/chunk-Q7LK2UWH.js.map +1 -0
- package/dist/chunk-SFV5LZPD.js +162 -0
- package/dist/chunk-SFV5LZPD.js.map +1 -0
- package/dist/chunk-SKXGYJJG.cjs +370 -0
- package/dist/chunk-SKXGYJJG.cjs.map +1 -0
- package/dist/chunk-SWLNKY6R.js +477 -0
- package/dist/chunk-SWLNKY6R.js.map +1 -0
- package/dist/chunk-TGVLNHUB.cjs +483 -0
- package/dist/chunk-TGVLNHUB.cjs.map +1 -0
- package/dist/chunk-TLLRW6S3.js +74 -0
- package/dist/chunk-TLLRW6S3.js.map +1 -0
- package/dist/chunk-TRAIXZ6M.cjs +140 -0
- package/dist/chunk-TRAIXZ6M.cjs.map +1 -0
- package/dist/chunk-U74A5VK5.cjs +74 -0
- package/dist/chunk-U74A5VK5.cjs.map +1 -0
- package/dist/chunk-UAVDLBTA.cjs +74 -0
- package/dist/chunk-UAVDLBTA.cjs.map +1 -0
- package/dist/chunk-UJWS6TRV.js +354 -0
- package/dist/chunk-UJWS6TRV.js.map +1 -0
- package/dist/chunk-UUJMUPB3.cjs +531 -0
- package/dist/chunk-UUJMUPB3.cjs.map +1 -0
- package/dist/chunk-VTKHZIJB.cjs +549 -0
- package/dist/chunk-VTKHZIJB.cjs.map +1 -0
- package/dist/chunk-YXPAWUXO.js +51 -0
- package/dist/chunk-YXPAWUXO.js.map +1 -0
- package/dist/chunk-ZD64SCZB.js +80 -0
- package/dist/chunk-ZD64SCZB.js.map +1 -0
- package/dist/core.cjs +28 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +22 -0
- package/dist/core.d.ts +22 -0
- package/dist/core.js +3 -0
- package/dist/core.js.map +1 -0
- package/dist/dataLayerState-B4XmQjQN.d.cts +258 -0
- package/dist/dataLayerState-B4XmQjQN.d.ts +258 -0
- package/package.json +32 -52
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/tabs.tsx","../src/components/FieldMetadata.tsx","../src/components/calculations/CalculationForm.tsx","../src/components/calculations/calculationHelpers.ts","../src/components/calculations/CalculationPreview.tsx","../src/components/calculations/CalculationTrace.tsx","../src/components/calculations/CalculationEditor.tsx","../src/components/calculations/CalculatedFieldBadge.tsx"],"names":["jsx","jsxs","useState","useRef","Fragment","useEffect"],"mappings":"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","file":"chunk-NDF5LCST.js","sourcesContent":["import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n \"bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-1\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"data-[state=active]:bg-background data-[state=active]:text-foreground ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 inline-flex items-center justify-center gap-2 rounded-md px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 aria-invalid:focus-visible:ring-0 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\n \"ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 flex-1 transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 aria-invalid:focus-visible:ring-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import type { datum } from \"@/types/ChartTypes\";\nimport { buildFieldProfile, type FieldProfile } from \"@/lib/fieldProfiles\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\nimport { CalendarDays, Hash, ToggleLeft, Type } from \"lucide-react\";\n\nconst typeLabels: Record<FieldProfile[\"dataType\"], string> = {\n numeric: \"Number\",\n categorical: \"Text\",\n datetime: \"Date\",\n boolean: \"Boolean\",\n};\nconst typeIcons = {\n numeric: Hash,\n categorical: Type,\n datetime: CalendarDays,\n boolean: ToggleLeft,\n};\n\nconst valueLabel = (value: unknown) => {\n if (value == null || value === \"\") return \"—\";\n if (typeof value === \"number\") {\n return new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 3 }).format(\n value\n );\n }\n return String(value);\n};\n\nexport function resolveFieldProfile(\n name: string,\n profiles: FieldProfile[],\n getColumnData: (field: string) => Record<number, datum>\n) {\n const profile = profiles.find((item) => item.name === name);\n if (profile) return profile;\n\n const columnData = getColumnData(name);\n return Object.keys(columnData).length\n ? buildFieldProfile(name, columnData)\n : undefined;\n}\n\nfunction dateRange(profile: FieldProfile) {\n if (profile.dataType !== \"datetime\") return undefined;\n\n let first: datum | undefined;\n let last: datum | undefined;\n let firstTime = Infinity;\n let lastTime = -Infinity;\n for (const { value } of profile.categories?.distribution ?? []) {\n const time = Date.parse(String(value));\n if (!Number.isFinite(time)) continue;\n if (time < firstTime) {\n first = value;\n firstTime = time;\n }\n if (time > lastTime) {\n last = value;\n lastTime = time;\n }\n }\n if (first == null || last == null) return undefined;\n\n const start = String(first);\n const end = String(last);\n return start === end ? start : `${start}–${end}`;\n}\n\nexport function fieldMetadata(profile: FieldProfile) {\n const range = profile.statistics\n ? `${valueLabel(profile.statistics.min)}–${valueLabel(profile.statistics.max)}`\n : dateRange(profile);\n const sample = profile.categories?.topValues[0]\n ? valueLabel(profile.categories.topValues[0].value)\n : undefined;\n return {\n type: typeLabels[profile.dataType],\n detail: range ?? (sample ? `e.g. ${sample}` : \"No sample\"),\n detailLabel: range ? \"Range\" : \"Sample\",\n nulls: `${profile.nullCount.toLocaleString()} null${profile.nullCount === 1 ? \"\" : \"s\"}`,\n excluded: profile.excludedCount\n ? `${profile.excludedCount.toLocaleString()} not finite`\n : undefined,\n };\n}\n\nexport function FieldMetadata({\n profile,\n label,\n compact = false,\n showDetail = true,\n className,\n tooltipSide = \"bottom\",\n}: {\n profile?: FieldProfile;\n label?: string;\n compact?: boolean;\n showDetail?: boolean;\n className?: string;\n tooltipSide?: \"bottom\" | \"left\" | \"top\";\n}) {\n if (!profile) return <span className={className}>{label}</span>;\n const metadata = fieldMetadata(profile);\n const description = [\n metadata.type,\n metadata.detail,\n metadata.nulls,\n metadata.excluded,\n ]\n .filter(Boolean)\n .join(\"; \");\n const TypeIcon = typeIcons[profile.dataType];\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className={cn(\n compact\n ? \"inline-flex min-w-0 items-center gap-1\"\n : \"inline-flex min-w-0 items-baseline gap-1.5\",\n className\n )}\n aria-label={`${label ?? profile.name}: ${description}`}\n >\n {compact && (\n <TypeIcon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n {label && <span className=\"truncate font-medium\">{label}</span>}\n {!compact && (\n <span className=\"flex min-w-0 gap-1.5 text-[10px] text-muted-foreground\">\n <span className=\"shrink-0\">{metadata.type}</span>\n {showDetail && (\n <span className=\"truncate\">{metadata.detail}</span>\n )}\n <span className=\"shrink-0\">{metadata.nulls}</span>\n </span>\n )}\n </span>\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} align=\"start\" collisionPadding={12}>\n <p className=\"mb-2 font-semibold\">{label ?? profile.name}</p>\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-xs\">\n <dt className=\"text-muted-foreground\">Type</dt>\n <dd>{metadata.type}</dd>\n <dt className=\"text-muted-foreground\">{metadata.detailLabel}</dt>\n <dd>{metadata.detail}</dd>\n <dt className=\"text-muted-foreground\">Nulls</dt>\n <dd>{metadata.nulls}</dd>\n {metadata.excluded && (\n <>\n <dt className=\"text-muted-foreground\">Excluded</dt>\n <dd>{metadata.excluded}</dd>\n </>\n )}\n <dt className=\"text-muted-foreground\">Distinct</dt>\n <dd>{profile.uniqueCount.toLocaleString()}</dd>\n </dl>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","/*\n * THESIS: edit a formula beside its inputs, result, and dependency chain.\n * OWN-WORLD: inherit the workspace's neutral surfaces, blue actions, and compact controls.\n * STORY: inspect a value, change one step, compare results, then apply deliberately.\n * FIRST VIEWPORT: formula and row preview on the left; chain or insertion library on the right.\n * FORM: a focused extension of the existing calculation editor; no new visual identity.\n */\nimport { useRef, useState, type ReactNode } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { calculationFunctions } from \"@/lib/calculations/functions/registry\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { FieldMetadata, resolveFieldProfile } from \"@/components/FieldMetadata\";\n\nexport type CalculationDraft = { name: string; expression: string };\ntype Props = {\n draft: CalculationDraft;\n onChange: (draft: CalculationDraft) => void;\n fields: string[];\n calculatedFields: string[];\n editing: boolean;\n nameLocked: boolean;\n checking: boolean;\n canApply: boolean;\n dirty: boolean;\n status: ReactNode;\n preview: ReactNode;\n trace: ReactNode;\n impact: string;\n onApply: () => void;\n onDiscard: () => void;\n onClose: () => void;\n};\n\nexport function CalculationForm({\n draft,\n onChange,\n fields,\n calculatedFields,\n editing,\n nameLocked,\n checking,\n canApply,\n dirty,\n status,\n preview,\n trace,\n impact,\n onApply,\n onDiscard,\n onClose,\n}: Props) {\n const fieldProfiles = useDataLayer((state) => state.fieldProfiles);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const input = useRef<HTMLTextAreaElement>(null);\n const [search, setSearch] = useState(\"\");\n const [tab, setTab] = useState(editing ? \"chain\" : \"fields\");\n const insert = (\n text: string,\n selectStart = text.length,\n selectEnd = selectStart\n ) => {\n const start = input.current?.selectionStart ?? draft.expression.length;\n const end = input.current?.selectionEnd ?? start;\n onChange({\n ...draft,\n expression:\n draft.expression.slice(0, start) + text + draft.expression.slice(end),\n });\n requestAnimationFrame(() => {\n input.current?.focus();\n input.current?.setSelectionRange(start + selectStart, start + selectEnd);\n });\n };\n const matches = fields.filter((field) =>\n field.toLowerCase().includes(search.toLowerCase())\n );\n return (\n <form\n className=\"eda-calc-form\"\n onSubmit={(event) => {\n event.preventDefault();\n if (canApply) onApply();\n }}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === \"Enter\") {\n event.preventDefault();\n if (canApply) onApply();\n }\n }}\n >\n <div className=\"eda-calc-editor-grid\">\n <div className=\"eda-calc-main\">\n <div\n className={\n nameLocked\n ? \"eda-calc-name eda-calc-name-locked\"\n : \"eda-calc-name\"\n }\n >\n <Label htmlFor=\"calculation-name\">Field name</Label>\n <Input\n id=\"calculation-name\"\n value={draft.name}\n readOnly={nameLocked}\n onChange={(event) =>\n onChange({ ...draft, name: event.target.value })\n }\n placeholder=\"e.g. Net sales\"\n />\n {nameLocked && (\n <p className=\"eda-calc-help\">\n This name is used by other calculations or views. Its formula\n can still change.\n </p>\n )}\n </div>\n <div className=\"eda-calc-section-heading\">\n <Label htmlFor=\"calculation-expression\">Formula</Label>\n <span>One result per source row · UTC dates</span>\n </div>\n <textarea\n ref={input}\n id=\"calculation-expression\"\n value={draft.expression}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n placeholder={'e.g. [\"Revenue\"] - [\"Cost\"]'}\n onChange={(event) =>\n onChange({ ...draft, expression: event.target.value })\n }\n aria-describedby=\"calculation-syntax calculation-validation\"\n />\n <div className=\"eda-calc-formula-tools\">\n <p id=\"calculation-syntax\" className=\"eda-calc-help\">\n Use [\"Field name\"] for a field and \"text\" for a literal.\n </p>\n <button\n type=\"button\"\n className=\"eda-calc-text-button\"\n onClick={() => setTab(\"functions\")}\n >\n Function help\n </button>\n </div>\n <div\n id=\"calculation-validation\"\n className=\"eda-calc-validation\"\n aria-live=\"polite\"\n aria-busy={checking}\n >\n {status}\n </div>\n {preview}\n </div>\n <aside className=\"eda-calc-aside\" aria-label=\"Calculation tools\">\n <Tabs value={tab} onValueChange={setTab}>\n <TabsList className=\"w-full\">\n <TabsTrigger value=\"chain\">Chain</TabsTrigger>\n <TabsTrigger value=\"fields\">Fields</TabsTrigger>\n <TabsTrigger value=\"functions\">Functions</TabsTrigger>\n </TabsList>\n <TabsContent value=\"chain\">{trace}</TabsContent>\n <TabsContent value=\"fields\">\n <p className=\"eda-calc-help mb-3\">\n Insert at the cursor, or replace selected text.\n </p>\n <Input\n aria-label=\"Find a field\"\n placeholder=\"Find a field…\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n {[true, false].map((calculated) => {\n const group = matches.filter(\n (field) => calculatedFields.includes(field) === calculated\n );\n return (\n group.length > 0 && (\n <section\n className=\"eda-calc-field-group\"\n key={String(calculated)}\n >\n <h3>\n {calculated ? \"Calculated fields\" : \"Source fields\"}\n <span>{group.length}</span>\n </h3>\n {group.map((field) => (\n <button\n key={field}\n type=\"button\"\n onClick={() =>\n insert(\"[\" + JSON.stringify(field) + \"]\")\n }\n >\n <span\n className={\n calculated\n ? \"eda-calc-symbol\"\n : \"text-muted-foreground\"\n }\n >\n {calculated ? \"ƒx\" : \"·\"}\n </span>\n <FieldMetadata\n profile={resolveFieldProfile(\n field,\n fieldProfiles,\n getColumnData\n )}\n label={field}\n compact\n className=\"min-w-0 flex-1\"\n />\n <span\n className=\"ml-auto text-muted-foreground\"\n aria-hidden=\"true\"\n >\n +\n </span>\n </button>\n ))}\n </section>\n )\n );\n })}\n {!matches.length && (\n <p className=\"eda-calc-help mt-4\">\n No fields match “{search}”.\n </p>\n )}\n </TabsContent>\n <TabsContent value=\"functions\">\n <p className=\"eda-calc-help mb-3\">\n Select a function to insert it. Replace the selected argument\n with a field or value.\n </p>\n <div className=\"eda-calc-function-list\">\n {Object.values(calculationFunctions).map((fn) => (\n <button\n key={fn.syntax}\n type=\"button\"\n onClick={() => {\n const text = fn.syntax.replace(\", …\", \"\");\n const start = text.indexOf(\"(\") + 1;\n const end = text.indexOf(\",\", start);\n insert(text, start, end === -1 ? text.length - 1 : end);\n }}\n >\n <code>{fn.syntax}</code>\n <span>{fn.description}</span>\n </button>\n ))}\n </div>\n <details className=\"eda-calc-syntax-help\">\n <summary>Operators and rules</summary>\n <p>Arithmetic: + − * / ^</p>\n <p>Compare: == != > >= < <=</p>\n <p>Logic: && (and), || (or), ! (not)</p>\n <code>if x > 0 then x else 0</code>\n <p>Guard missing values with x == null.</p>\n <p>Date components: year, month, day, quarter, week (ISO).</p>\n </details>\n </TabsContent>\n </Tabs>\n </aside>\n </div>\n <footer className=\"eda-calc-editor-footer\">\n <div className=\"min-w-0\">\n <p>{impact}</p>\n <p className=\"eda-calc-help\">\n {dirty\n ? \"Draft only. Apply to update the analysis. Closing keeps your draft in this session.\"\n : \"Active filters stay in place when you apply a change.\"}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {dirty && (\n <Button type=\"button\" variant=\"ghost\" onClick={onDiscard}>\n Discard draft\n </Button>\n )}\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Close\n </Button>\n <Button type=\"submit\" disabled={!canApply}>\n {editing ? \"Apply changes\" : \"Create calculation\"}\n <span className=\"eda-calc-shortcut\" aria-hidden=\"true\">\n ⌘/Ctrl ↵\n </span>\n </Button>\n </div>\n </footer>\n </form>\n );\n}\n","import type { CalculationDefinition } from \"@/lib/calculations/CalculationState\";\nimport type { datum } from \"@/types/ChartTypes\";\n\nexport function dependentCalculations(\n calculations: CalculationDefinition[],\n name: string\n) {\n const names = new Set([name]);\n let added = true;\n while (added) {\n added = false;\n for (const calc of calculations) {\n if (\n !names.has(calc.resultColumnName) &&\n calc.expression.dependencies.some((field) => names.has(field))\n ) {\n names.add(calc.resultColumnName);\n added = true;\n }\n }\n }\n return calculations.filter(\n (calc) => calc.resultColumnName !== name && names.has(calc.resultColumnName)\n );\n}\n\nconst numbers = new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 6 });\nexport function calculationValue(value: datum) {\n if (value == null) return \"Missing\";\n if (typeof value === \"number\") return numbers.format(value);\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n return value === \"\" ? '\"\"' : value;\n}\n","import { useState } from \"react\";\nimport type {\n CalculationDefinition,\n CalculationManager,\n} from \"@/lib/calculations/CalculationState\";\nimport type { DatumObject, HasId } from \"@/providers/DataLayerProvider\";\nimport { calculationValue } from \"./calculationHelpers\";\nimport { Button } from \"@/components/ui/button\";\n\ntype Props = {\n calculation: CalculationDefinition;\n manager: CalculationManager<DatumObject>;\n savedManager: CalculationManager<DatumObject>;\n data: (DatumObject & HasId)[];\n selectedRow: number;\n onSelectRow: (id: number) => void;\n changed: boolean;\n};\n\nexport function CalculationPreview({\n calculation,\n manager,\n savedManager,\n data,\n selectedRow,\n onSelectRow,\n changed,\n}: Props) {\n const [errorsOnly, setErrorsOnly] = useState(false);\n const [page, setPage] = useState(() =>\n Math.max(\n 0,\n Math.floor(data.findIndex((row) => row.__ID === selectedRow) / 5)\n )\n );\n const name = calculation.resultColumnName;\n const values = manager.executeCalculation(calculation);\n const errors = manager.getErrors(name);\n const dependencies = calculation.expression.dependencies;\n const definitions = manager.getCalculations();\n const saved = savedManager\n .getCalculations()\n .find((calc) => calc.resultColumnName === name);\n const before = saved ? savedManager.executeCalculation(saved) : null;\n const inputValues = dependencies.map((field) => {\n const calc = definitions.find((item) => item.resultColumnName === field);\n return calc ? manager.executeCalculation(calc) : null;\n });\n const rows = errorsOnly ? data.filter((row) => errors.has(row.__ID)) : data;\n const currentPage = Math.min(\n page,\n Math.max(0, Math.ceil(rows.length / 5) - 1)\n );\n const start = currentPage * 5;\n return (\n <section className=\"eda-calc-preview\" aria-label=\"Calculation preview\">\n <div className=\"eda-calc-section-heading\">\n <h3>Inputs → result</h3>\n <span>{changed ? \"Draft preview\" : \"Saved values\"}</span>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-2 mb-3\">\n <p className=\"eda-calc-help\">\n All loaded rows, before chart filters. Select a row to follow its\n values through the chain.\n </p>\n {errors.size > 0 && (\n <label className=\"flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={errorsOnly}\n onChange={(event) => {\n setErrorsOnly(event.target.checked);\n setPage(0);\n }}\n />\n Failed rows only\n </label>\n )}\n </div>\n <div className=\"eda-calc-preview-scroll\">\n <table>\n <thead>\n <tr>\n <th>Row</th>\n {dependencies.map((field) => (\n <th key={field}>\n {definitions.some(\n (calc) => calc.resultColumnName === field\n ) && <span className=\"eda-calc-symbol mr-1\">ƒx</span>}\n {field}\n </th>\n ))}\n {changed && before && <th>Saved result</th>}\n <th>{changed ? \"Draft result\" : \"Result\"}</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n {rows.slice(start, start + 5).map((row) => (\n <tr key={row.__ID} data-selected={row.__ID === selectedRow}>\n <td>\n <button\n type=\"button\"\n aria-label={\"Trace row \" + (row.__ID + 1)}\n aria-pressed={row.__ID === selectedRow}\n onClick={() => onSelectRow(row.__ID)}\n >\n {row.__ID + 1}\n </button>\n </td>\n {dependencies.map((field, index) => (\n <td key={field}>\n {calculationValue(\n inputValues[index]\n ? inputValues[index]!.get(row.__ID)\n : row[field]\n )}\n </td>\n ))}\n {changed && before && (\n <td className=\"text-muted-foreground\">\n {calculationValue(before.get(row.__ID))}\n </td>\n )}\n <td className=\"font-semibold\">\n {errors.has(row.__ID)\n ? \"—\"\n : calculationValue(values.get(row.__ID))}\n </td>\n <td\n className={\n errors.has(row.__ID)\n ? \"text-destructive\"\n : \"text-muted-foreground\"\n }\n >\n {errors.get(row.__ID) ??\n (values.get(row.__ID) == null ? \"Missing value\" : \"Valid\")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {!rows.length && (\n <p className=\"p-4 text-sm text-muted-foreground\">\n {errorsOnly ? \"No failed rows.\" : \"No loaded rows.\"}\n </p>\n )}\n </div>\n <div className=\"flex items-center justify-between gap-3 mt-2 text-xs text-muted-foreground\">\n <span>\n {rows.length ? start + 1 : 0}–{Math.min(start + 5, rows.length)} of{\" \"}\n {rows.length.toLocaleString()} rows\n </span>\n <div className=\"flex gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={currentPage === 0}\n onClick={() => setPage(currentPage - 1)}\n >\n Previous rows\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={start + 5 >= rows.length}\n onClick={() => setPage(currentPage + 1)}\n >\n Next rows\n </Button>\n </div>\n </div>\n </section>\n );\n}\n","import type {\n CalculationDefinition,\n CalculationManager,\n} from \"@/lib/calculations/CalculationState\";\nimport type { DatumObject, HasId } from \"@/providers/DataLayerProvider\";\nimport { calculationValue, dependentCalculations } from \"./calculationHelpers\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { FieldMetadata, resolveFieldProfile } from \"@/components/FieldMetadata\";\nimport { ActionTooltip } from \"@/components/ui/tooltip\";\n\ntype Props = {\n calculations: CalculationDefinition[];\n manager: CalculationManager<DatumObject>;\n row: DatumObject & HasId;\n root: string;\n selected: string;\n draftFields: string[];\n previewing: boolean;\n onSelect: (field: string) => void;\n};\n\nexport function CalculationTrace({\n calculations,\n manager,\n row,\n root,\n selected,\n draftFields,\n previewing,\n onSelect,\n}: Props) {\n const fieldProfiles = useDataLayer((state) => state.fieldProfiles);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const byName = new Map(\n calculations.map((calc) => [calc.resultColumnName, calc])\n );\n const dependents = dependentCalculations(calculations, selected);\n const node = (name: string, path: Set<string>): React.ReactNode => {\n if (path.has(name)) return null;\n const calc = byName.get(name);\n const value = calc\n ? manager.executeCalculation(calc).get(row.__ID)\n : row[name];\n const error = calc && manager.getErrors(name).get(row.__ID);\n const nextPath = new Set([...path, name]);\n return (\n <li key={name}>\n {calc ? (\n <ActionTooltip content={calc.expression.rawInput}>\n <button\n type=\"button\"\n className=\"eda-calc-node\"\n aria-pressed={name === selected}\n onClick={() => onSelect(name)}\n >\n <span className=\"eda-calc-symbol\" aria-hidden=\"true\">\n ƒx\n </span>\n <span className=\"min-w-0 flex-1\">\n <FieldMetadata\n profile={resolveFieldProfile(\n name,\n fieldProfiles,\n getColumnData\n )}\n label={name}\n compact\n className=\"min-w-0\"\n />\n {draftFields.includes(name) && (\n <small className=\"block text-xs font-normal text-muted-foreground\">\n {name === selected && previewing\n ? \"Draft preview\"\n : \"Draft kept\"}\n </small>\n )}\n </span>\n <ActionTooltip content={error || String(value ?? \"Missing\")}>\n <span\n className={error ? \"text-destructive\" : \"eda-calc-node-value\"}\n >\n {error ? \"Error\" : calculationValue(value)}\n </span>\n </ActionTooltip>\n </button>\n </ActionTooltip>\n ) : (\n <div className=\"eda-calc-source\">\n <FieldMetadata\n profile={resolveFieldProfile(name, fieldProfiles, getColumnData)}\n label={name}\n compact\n className=\"min-w-0 flex-1\"\n />\n <ActionTooltip content={String(value ?? \"Missing\")}>\n <span className=\"eda-calc-node-value\">\n {calculationValue(value)}\n </span>\n </ActionTooltip>\n </div>\n )}\n {calc && calc.expression.dependencies.length > 0 && (\n <ul>\n {calc.expression.dependencies.map((field) => node(field, nextPath))}\n </ul>\n )}\n </li>\n );\n };\n return (\n <div className=\"eda-calc-trace\">\n <div className=\"eda-calc-section-heading\">\n <h3>How this value is made</h3>\n <span>Row {row.__ID + 1}</span>\n </div>\n <p className=\"eda-calc-help\">\n Follow the inputs below. Select a calculation to inspect or edit that\n step.\n </p>\n <ul className=\"eda-calc-tree\" aria-label=\"Calculation dependency chain\">\n {node(root, new Set())}\n </ul>\n {root !== selected && (\n <button\n className=\"eda-calc-text-button\"\n type=\"button\"\n onClick={() => onSelect(root)}\n >\n Return to {root}\n </button>\n )}\n <div className=\"eda-calc-section-heading mt-6\">\n <h3>Used by</h3>\n <span>{dependents.length} calculations</span>\n </div>\n {dependents.length ? (\n <div className=\"eda-calc-link-list\">\n {dependents.map((calc) => (\n <button\n type=\"button\"\n key={calc.resultColumnName}\n onClick={() => onSelect(calc.resultColumnName)}\n >\n <span className=\"eda-calc-symbol\">ƒx</span>\n {calc.resultColumnName}\n </button>\n ))}\n </div>\n ) : (\n <p className=\"eda-calc-help\">No calculations depend on this field.</p>\n )}\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport {\n CalculationManager,\n type CalculationDefinition,\n} from \"@/lib/calculations/CalculationState\";\nimport { parseExpression } from \"@/lib/calculations/parser/semantics\";\nimport { useDataLayer, type DatumObject } from \"@/providers/DataLayerProvider\";\nimport {\n getChartFields,\n getChartTitle,\n} from \"@/components/charts/chartAccessibility\";\nimport { CalculationForm, type CalculationDraft } from \"./CalculationForm\";\nimport { CalculationPreview } from \"./CalculationPreview\";\nimport { CalculationTrace } from \"./CalculationTrace\";\nimport { dependentCalculations } from \"./calculationHelpers\";\nimport { CheckCircle2, CircleAlert } from \"lucide-react\";\n\ntype Editor = {\n open: (\n name?: string,\n rowId?: number,\n returnFocus?: HTMLElement | null\n ) => void;\n};\nconst EditorContext = createContext<Editor | null>(null);\nexport const useCalculationEditor = () => useContext(EditorContext);\ntype Preview = {\n key: string;\n manager?: CalculationManager<DatumObject>;\n calculation?: CalculationDefinition;\n error?: string;\n};\n\nexport function CalculationEditorProvider({\n children,\n}: {\n children: ReactNode;\n}) {\n const data = useDataLayer((state) => state.data);\n const calculations = useDataLayer((state) => state.calculations);\n const savedManager = useDataLayer((state) => state.calculationManager);\n const charts = useDataLayer((state) => state.charts);\n const getColumnNames = useDataLayer((state) => state.getColumnNames);\n const getFieldLabel = useDataLayer((state) => state.getFieldLabel);\n const addCalculation = useDataLayer((state) => state.addCalculation);\n const updateCalculation = useDataLayer((state) => state.updateCalculation);\n const [visible, setVisible] = useState(false);\n const [selected, setSelected] = useState<string>();\n const [root, setRoot] = useState<string>();\n const [rowId, setRowId] = useState(0);\n const [drafts, setDrafts] = useState<Record<string, CalculationDraft>>({});\n const [preview, setPreview] = useState<Preview>();\n const [saveError, setSaveError] = useState(\"\");\n const [savedMessage, setSavedMessage] = useState(\"\");\n const returnFocus = useRef<HTMLElement | null>(null);\n const open = useCallback(\n (name?: string, row?: number, target?: HTMLElement | null) => {\n returnFocus.current = target ?? (document.activeElement as HTMLElement);\n setSelected(name);\n setRoot(name);\n setRowId(row ?? 0);\n setSaveError(\"\");\n setSavedMessage(\"\");\n setVisible(true);\n },\n []\n );\n const editor = useMemo(() => ({ open }), [open]);\n useEffect(() => {\n setDrafts({});\n setVisible(false);\n }, [data]);\n\n const key = selected ?? \"\";\n const calculation = calculations.find(\n (calc) => calc.resultColumnName === selected\n );\n const draft = Object.hasOwn(drafts, key)\n ? drafts[key]!\n : {\n name: calculation?.resultColumnName ?? \"\",\n expression: calculation?.expression.rawInput ?? \"\",\n };\n const dirty =\n draft.name !== (calculation?.resultColumnName ?? \"\") ||\n draft.expression !== (calculation?.expression.rawInput ?? \"\");\n const previewKey = JSON.stringify([selected, draft.name, draft.expression]);\n useEffect(() => {\n if (!visible) return;\n setPreview(undefined);\n const timer = setTimeout(() => {\n if (!draft.name.trim() || !draft.expression.trim()) {\n setPreview({ key: previewKey });\n return;\n }\n try {\n const candidate = {\n resultColumnName: draft.name.trim(),\n expression: parseExpression(draft.expression),\n };\n const manager = new CalculationManager(data, [\n ...calculations.filter((calc) => calc.resultColumnName !== selected),\n candidate,\n ]);\n manager.executeCalculation(candidate);\n setPreview({ key: previewKey, manager, calculation: candidate });\n } catch (error) {\n setPreview({\n key: previewKey,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }, 220);\n return () => clearTimeout(timer);\n }, [visible, previewKey, data, calculations]);\n const current = preview?.key === previewKey ? preview : undefined;\n const checking =\n !current && Boolean(draft.name.trim() && draft.expression.trim());\n const dependents = dependentCalculations(\n calculations,\n selected ?? draft.name\n );\n const affected = new Set([\n selected ?? draft.name,\n ...dependents.map((calc) => calc.resultColumnName),\n ]);\n const usedViews = charts.filter((chart) =>\n [\n ...getChartFields(chart),\n ...chart.filters.map((filter) => filter.field),\n chart.facet?.rowVariable,\n chart.facet?.type === \"grid\" ? chart.facet.columnVariable : undefined,\n ].some((field) => field && affected.has(field))\n );\n const nameLocked = Boolean(\n calculation && (dependents.length || usedViews.length)\n );\n const canApply = Boolean(dirty && current?.manager && current.calculation);\n const errorCount = current?.manager?.getErrors(draft.name.trim()).size ?? 0;\n const removeDraft = () =>\n setDrafts((previous) => {\n const next = { ...previous };\n delete next[key];\n return next;\n });\n const apply = async () => {\n if (!canApply || !current?.calculation) return;\n try {\n if (selected) updateCalculation(selected, current.calculation);\n else await addCalculation(current.calculation);\n removeDraft();\n const name = current.calculation.resultColumnName;\n setSelected(name);\n if (!root || root === selected) setRoot(name);\n setSaveError(\"\");\n setSavedMessage(\n \"Applied. All dependent calculations and views are up to date.\"\n );\n } catch (error) {\n setSaveError(error instanceof Error ? error.message : String(error));\n }\n };\n const traceManager = current?.manager ?? savedManager;\n const traceCalculations = traceManager.getCalculations();\n const traceRoot =\n root === selected\n ? (current?.calculation?.resultColumnName ?? root)\n : (root ?? current?.calculation?.resultColumnName);\n const selectedRow = data.find((row) => row.__ID === rowId) ?? data[0];\n const status =\n saveError || current?.error ? (\n <p role=\"alert\" className=\"eda-calc-error\">\n <CircleAlert aria-hidden=\"true\" size={16} />\n <span>{saveError || current?.error}</span>\n </p>\n ) : checking ? (\n <p role=\"status\">\n Checking formula against {data.length.toLocaleString()} loaded rows…\n </p>\n ) : current?.manager ? (\n <p\n role=\"status\"\n className={errorCount ? \"eda-calc-error\" : \"eda-calc-valid\"}\n >\n {errorCount ? (\n <CircleAlert size={16} aria-hidden=\"true\" />\n ) : (\n <CheckCircle2 size={16} aria-hidden=\"true\" />\n )}\n <span>\n {errorCount\n ? errorCount.toLocaleString() +\n \" of \" +\n data.length.toLocaleString() +\n \" rows failed. Valid rows remain available.\"\n : \"Valid for all \" + data.length.toLocaleString() + \" rows.\"}\n {savedMessage && \" \" + savedMessage}\n </span>\n </p>\n ) : (\n <p>Enter a field name and formula to preview results.</p>\n );\n return (\n <EditorContext.Provider value={editor}>\n {children}\n <Dialog open={visible} onOpenChange={setVisible}>\n <DialogContent\n className=\"eda-calc-editor\"\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (returnFocus.current?.isConnected) returnFocus.current.focus();\n }}\n >\n <DialogHeader className=\"eda-calc-editor-header\">\n <DialogTitle>\n <span className=\"eda-calc-symbol mr-2\">ƒx</span>\n {selected ? \"Inspect calculation\" : \"New calculation\"}\n </DialogTitle>\n <DialogDescription>\n {root\n ? \"Following \" +\n root +\n \". Preview a change before applying it to the analysis.\"\n : \"Turn source fields into values you can reuse in any view.\"}\n </DialogDescription>\n </DialogHeader>\n <CalculationForm\n key={key}\n draft={draft}\n onChange={(next) => {\n setDrafts((previous) => ({ ...previous, [key]: next }));\n setSaveError(\"\");\n setSavedMessage(\"\");\n }}\n fields={getColumnNames().filter((field) => field !== selected)}\n calculatedFields={calculations.map((calc) => calc.resultColumnName)}\n editing={Boolean(calculation)}\n nameLocked={nameLocked}\n checking={checking}\n canApply={canApply}\n dirty={dirty}\n status={status}\n impact={\n dependents.length +\n \" dependent calculations · \" +\n usedViews.length +\n \" affected views\"\n }\n onApply={apply}\n onDiscard={() => {\n removeDraft();\n setSaveError(\"\");\n setSavedMessage(\"\");\n }}\n onClose={() => setVisible(false)}\n preview={\n current?.manager && current.calculation ? (\n <CalculationPreview\n key={key}\n calculation={current.calculation}\n manager={current.manager}\n savedManager={savedManager}\n data={data}\n selectedRow={selectedRow?.__ID ?? 0}\n onSelectRow={setRowId}\n changed={dirty}\n />\n ) : (\n <div className=\"eda-calc-preview-empty\">\n <h3>See the result before you apply</h3>\n <p>\n Inputs, saved values, and draft results appear here once the\n formula is valid.\n </p>\n </div>\n )\n }\n trace={\n <>\n {dirty && !current?.manager && (\n <p className=\"eda-calc-help mb-3\">\n The chain shows saved values until this draft can be\n previewed.\n </p>\n )}\n {traceRoot && selectedRow ? (\n <CalculationTrace\n calculations={traceCalculations}\n manager={traceManager}\n row={selectedRow}\n root={traceRoot}\n selected={selected ?? draft.name}\n draftFields={Object.keys(drafts)}\n previewing={Boolean(current?.manager)}\n onSelect={(field) => {\n if (\n root &&\n dependentCalculations(calculations, root).some(\n (calc) => calc.resultColumnName === field\n )\n )\n setRoot(field);\n setSelected(field);\n setSaveError(\"\");\n setSavedMessage(\"\");\n }}\n />\n ) : (\n <p className=\"eda-calc-help\">\n Add a formula to see how its fields connect.\n </p>\n )}\n {usedViews.length > 0 && (\n <section className=\"mt-6\">\n <h3 className=\"text-sm font-medium\">Used in views</h3>\n <ul className=\"eda-calc-view-list\">\n {usedViews.map((chart) => (\n <li key={chart.id}>\n {getChartTitle(chart, getFieldLabel)}\n </li>\n ))}\n </ul>\n </section>\n )}\n </>\n }\n />\n </DialogContent>\n </Dialog>\n </EditorContext.Provider>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { Button } from \"@/components/ui/button\";\nimport { useCalculationEditor } from \"./CalculationEditor\";\nimport { calculationValue, dependentCalculations } from \"./calculationHelpers\";\nimport { FieldMetadata, resolveFieldProfile } from \"@/components/FieldMetadata\";\n\nexport function CalculatedFieldBadge({\n field,\n showName = false,\n rowId = 0,\n children,\n hoverOpen = true,\n side = \"bottom\",\n}: {\n field: string;\n showName?: boolean;\n rowId?: number;\n children?: ReactNode;\n hoverOpen?: boolean;\n side?: \"bottom\" | \"left\" | \"top\" | \"right\";\n}) {\n const calculations = useDataLayer((state) => state.calculations) ?? [];\n const manager = useDataLayer((state) => state.calculationManager);\n const data = useDataLayer((state) => state.data);\n const fieldProfiles = useDataLayer((state) => state.fieldProfiles);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const editor = useCalculationEditor();\n const calc = calculations.find((item) => item.resultColumnName === field);\n const [open, setOpen] = useState(false);\n const pinned = useRef(false);\n const restoreFocus = useRef(false);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const trigger = useRef<HTMLButtonElement>(null);\n const cancelTimer = () => clearTimeout(timer.current);\n useEffect(() => () => clearTimeout(timer.current), []);\n if (!calc || !editor) return <>{children}</>;\n const leave = () => {\n cancelTimer();\n if (!pinned.current) timer.current = setTimeout(() => setOpen(false), 180);\n };\n const errors = open ? manager.getErrors(field) : new Map<number, string>();\n const value = open ? manager.executeCalculation(calc).get(rowId) : undefined;\n const profile = open\n ? resolveFieldProfile(field, fieldProfiles, getColumnData)\n : undefined;\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) pinned.current = false;\n }}\n >\n <PopoverTrigger asChild>\n <button\n ref={trigger}\n type=\"button\"\n className={\n children !== undefined ? \"eda-calc-cell\" : \"eda-calc-badge\"\n }\n aria-label={\n \"Inspect \" +\n field +\n \" calculation\" +\n (children !== undefined ? \", row \" + (rowId + 1) : \"\")\n }\n onPointerEnter={(event) => {\n if (!hoverOpen || event.pointerType === \"touch\" || event.buttons)\n return;\n cancelTimer();\n timer.current = setTimeout(() => setOpen(true), 250);\n }}\n onPointerLeave={leave}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n cancelTimer();\n pinned.current = true;\n restoreFocus.current = true;\n setOpen(true);\n }}\n >\n {children !== undefined ? (\n children\n ) : (\n <>\n <span className=\"eda-calc-symbol\" aria-hidden=\"true\">\n ƒx\n </span>\n {showName && <span>{field}</span>}\n </>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"eda-calc-peek\"\n align=\"start\"\n side={side}\n collisionPadding={12}\n onPointerEnter={cancelTimer}\n onPointerLeave={leave}\n onOpenAutoFocus={(event) => {\n if (!pinned.current) event.preventDefault();\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (restoreFocus.current) trigger.current?.focus();\n restoreFocus.current = false;\n }}\n >\n <div className=\"eda-calc-section-heading\">\n <FieldMetadata profile={profile} label={field} compact />\n <span>Calculated field</span>\n </div>\n <pre>{calc.expression.rawInput}</pre>\n <p className=\"eda-calc-help\">\n Uses{\" \"}\n {calc.expression.dependencies.length\n ? calc.expression.dependencies.join(\", \")\n : \"constant values\"}\n .\n </p>\n <div className=\"eda-calc-peek-result\">\n <span>Row {rowId + 1}</span>\n <strong>{errors.get(rowId) ?? calculationValue(value)}</strong>\n </div>\n <p className=\"eda-calc-help\">\n {errors.size\n ? errors.size.toLocaleString() +\n \" of \" +\n data.length.toLocaleString() +\n \" rows failed\"\n : \"All \" + data.length.toLocaleString() + \" rows valid\"}{\" \"}\n · {dependentCalculations(calculations, field).length} dependent\n calculations\n </p>\n <Button\n type=\"button\"\n className=\"mt-4 w-full\"\n onClick={() => {\n setOpen(false);\n pinned.current = false;\n restoreFocus.current = false;\n editor.open(field, rowId, trigger.current);\n }}\n >\n Inspect chain & edit\n </Button>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { useColorScales } from './chunk-4HNDKMWF.js';
|
|
2
|
+
import { DEFAULT_ROW_SETTINGS } from './chunk-CJQQFNEY.js';
|
|
3
|
+
import { BaseChart } from './chunk-UJWS6TRV.js';
|
|
4
|
+
import { numericScale } from './chunk-7PTJNIOD.js';
|
|
5
|
+
import { FieldSelector } from './chunk-SFV5LZPD.js';
|
|
6
|
+
import { NumericInputEnter } from './chunk-BIMEHDLB.js';
|
|
7
|
+
import { Switch } from './chunk-Q7LK2UWH.js';
|
|
8
|
+
import { useGetColumnDataForIds, useGetLiveData } from './chunk-ZD64SCZB.js';
|
|
9
|
+
import { applyFilter } from './chunk-YXPAWUXO.js';
|
|
10
|
+
import { Label } from './chunk-MJPDJ5AS.js';
|
|
11
|
+
import { useDataLayer, categoryValue, categoryLabel, categoryKey, hasFieldDisplayFormat, getChartAxisFields, getChartAxisLabel, categoryIncludes, categoryEqual } from './chunk-JNO7OXCC.js';
|
|
12
|
+
import { BarChart } from 'lucide-react';
|
|
13
|
+
import { scaleBand } from 'd3-scale';
|
|
14
|
+
import { useMemo } from 'react';
|
|
15
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
16
|
+
|
|
17
|
+
function RowChart({ settings, width, height, facetIds }) {
|
|
18
|
+
const allData = useGetColumnDataForIds(settings.field);
|
|
19
|
+
const data = useGetLiveData(settings, settings.field, facetIds);
|
|
20
|
+
const { getColorForValue } = useColorScales();
|
|
21
|
+
const updateChart = useDataLayer((s) => s.updateChart);
|
|
22
|
+
const formatFieldValue = useDataLayer((s) => s.formatFieldValue);
|
|
23
|
+
const getFieldLabel = useDataLayer((s) => s.getFieldLabel);
|
|
24
|
+
const fieldSettings = useDataLayer((s) => s.fieldSettings);
|
|
25
|
+
const valueFilter = settings.filters.find(
|
|
26
|
+
(f) => f.type === "value" && f.field === settings.field
|
|
27
|
+
);
|
|
28
|
+
const filterValues = valueFilter?.values ?? [];
|
|
29
|
+
const handleBarClick = (label) => {
|
|
30
|
+
const newValues = categoryIncludes(filterValues, label) ? filterValues.filter((f) => !categoryEqual(f, label)) : [...filterValues, label];
|
|
31
|
+
const newFilters = settings.filters.filter(
|
|
32
|
+
(f) => f.type !== "value" || f.field !== settings.field
|
|
33
|
+
);
|
|
34
|
+
if (newValues.length > 0) {
|
|
35
|
+
newFilters.push({
|
|
36
|
+
type: "value",
|
|
37
|
+
field: settings.field,
|
|
38
|
+
values: newValues
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
updateChart(settings.id, {
|
|
42
|
+
filters: newFilters
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const baseMargin = settings.margin;
|
|
46
|
+
const { displayCounts } = useMemo(() => {
|
|
47
|
+
const countMap = /* @__PURE__ */ new Map();
|
|
48
|
+
allData.forEach((value) => {
|
|
49
|
+
const key = categoryValue(value);
|
|
50
|
+
countMap.set(key, (countMap.get(key) || 0) + 1);
|
|
51
|
+
});
|
|
52
|
+
const sortedCounts = Array.from(countMap.entries()).map(([value, count]) => ({
|
|
53
|
+
value,
|
|
54
|
+
key: categoryKey(value),
|
|
55
|
+
label: value != null && hasFieldDisplayFormat(fieldSettings[settings.field]) ? formatFieldValue?.(settings.field, value) ?? categoryLabel(value) : categoryLabel(value),
|
|
56
|
+
count,
|
|
57
|
+
other: false
|
|
58
|
+
})).sort((a, b) => b.count - a.count);
|
|
59
|
+
const availableHeight = height - baseMargin.top - baseMargin.bottom;
|
|
60
|
+
const rowHeight = Math.max(
|
|
61
|
+
settings.minRowHeight,
|
|
62
|
+
Math.min(settings.maxRowHeight, availableHeight / sortedCounts.length)
|
|
63
|
+
);
|
|
64
|
+
const maxRows = Math.max(2, Math.floor(availableHeight / rowHeight));
|
|
65
|
+
const liveCounts = /* @__PURE__ */ new Map();
|
|
66
|
+
data.forEach((value) => {
|
|
67
|
+
const key = categoryValue(value);
|
|
68
|
+
liveCounts.set(key, (liveCounts.get(key) ?? 0) + 1);
|
|
69
|
+
});
|
|
70
|
+
const visible = sortedCounts.map((item) => ({
|
|
71
|
+
...item,
|
|
72
|
+
total: item.count,
|
|
73
|
+
count: liveCounts.get(item.value) ?? 0
|
|
74
|
+
}));
|
|
75
|
+
if (sortedCounts.length > maxRows) {
|
|
76
|
+
const visibleCounts = visible.slice(0, maxRows - 1);
|
|
77
|
+
const otherSum = visible.slice(maxRows - 1).reduce((sum, item) => sum + item.count, 0);
|
|
78
|
+
return {
|
|
79
|
+
displayCounts: [
|
|
80
|
+
...visibleCounts,
|
|
81
|
+
{
|
|
82
|
+
key: "__other",
|
|
83
|
+
label: "Other categories",
|
|
84
|
+
value: void 0,
|
|
85
|
+
other: true,
|
|
86
|
+
count: otherSum,
|
|
87
|
+
total: visible.slice(maxRows - 1).reduce((sum, item) => sum + item.total, 0)
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
displayCounts: visible
|
|
94
|
+
};
|
|
95
|
+
}, [
|
|
96
|
+
data,
|
|
97
|
+
allData,
|
|
98
|
+
height,
|
|
99
|
+
baseMargin.top,
|
|
100
|
+
baseMargin.bottom,
|
|
101
|
+
settings.minRowHeight,
|
|
102
|
+
settings.maxRowHeight,
|
|
103
|
+
formatFieldValue,
|
|
104
|
+
fieldSettings
|
|
105
|
+
]);
|
|
106
|
+
const yLabels = displayCounts.map((d) => d.label);
|
|
107
|
+
const axisFields = getChartAxisFields(settings);
|
|
108
|
+
const xAxisLabel = getChartAxisLabel(
|
|
109
|
+
axisFields.x,
|
|
110
|
+
settings.xAxisLabel,
|
|
111
|
+
getFieldLabel
|
|
112
|
+
);
|
|
113
|
+
const requestedLabelMargin = Math.max(
|
|
114
|
+
baseMargin.left,
|
|
115
|
+
...yLabels.map((label) => label.length * 7 + 24)
|
|
116
|
+
);
|
|
117
|
+
const minPlotWidth = Math.min(
|
|
118
|
+
80,
|
|
119
|
+
Math.max(0, width - baseMargin.left - baseMargin.right)
|
|
120
|
+
);
|
|
121
|
+
const maxLabelMargin = Math.max(0, width - baseMargin.right - minPlotWidth);
|
|
122
|
+
const labelMargin = Math.min(requestedLabelMargin, maxLabelMargin);
|
|
123
|
+
const margin = {
|
|
124
|
+
...baseMargin,
|
|
125
|
+
left: Math.min(labelMargin, width * 0.42),
|
|
126
|
+
right: Math.max(baseMargin.right, 48),
|
|
127
|
+
bottom: Math.max(baseMargin.bottom, xAxisLabel ? 42 : 26)
|
|
128
|
+
};
|
|
129
|
+
const innerWidth = width - margin.left - margin.right;
|
|
130
|
+
const innerHeight = height - margin.top - margin.bottom;
|
|
131
|
+
const chartSettings = { ...settings, margin };
|
|
132
|
+
const xScale = useMemo(() => {
|
|
133
|
+
const maxValue = Math.max(1, ...displayCounts.map((d) => d.total));
|
|
134
|
+
return numericScale(settings.xAxis).domain([0, maxValue]).range([0, innerWidth]).nice();
|
|
135
|
+
}, [displayCounts, innerWidth, settings.xAxis]);
|
|
136
|
+
const yScale = useMemo(() => {
|
|
137
|
+
return scaleBand().domain(displayCounts.map((d) => d.key)).range([0, innerHeight]).padding(0.3);
|
|
138
|
+
}, [displayCounts, innerHeight]);
|
|
139
|
+
if (displayCounts.length === 0) {
|
|
140
|
+
return /* @__PURE__ */ jsx("div", { style: { width, height }, children: "No data to display" });
|
|
141
|
+
}
|
|
142
|
+
const yLabelsByKey = new Map(
|
|
143
|
+
displayCounts.map((item) => [item.key, item.label])
|
|
144
|
+
);
|
|
145
|
+
return /* @__PURE__ */ jsx("div", { style: { width, height }, children: /* @__PURE__ */ jsx(
|
|
146
|
+
BaseChart,
|
|
147
|
+
{
|
|
148
|
+
width,
|
|
149
|
+
height,
|
|
150
|
+
xScale,
|
|
151
|
+
yScale,
|
|
152
|
+
settings: chartSettings,
|
|
153
|
+
yTickFormatter: (value) => yLabelsByKey.get(String(value)) ?? String(value),
|
|
154
|
+
overlay: /* @__PURE__ */ jsxs("g", { pointerEvents: "none", children: [
|
|
155
|
+
" ",
|
|
156
|
+
displayCounts.map(({ key, count }) => /* @__PURE__ */ jsx(
|
|
157
|
+
"text",
|
|
158
|
+
{
|
|
159
|
+
x: xScale(count) + 5,
|
|
160
|
+
y: yScale(key) + yScale.bandwidth() / 2,
|
|
161
|
+
dominantBaseline: "middle",
|
|
162
|
+
className: "fill-foreground",
|
|
163
|
+
fontSize: 11,
|
|
164
|
+
children: count.toLocaleString()
|
|
165
|
+
},
|
|
166
|
+
key
|
|
167
|
+
))
|
|
168
|
+
] }),
|
|
169
|
+
children: /* @__PURE__ */ jsx("g", { className: "select-none", children: displayCounts.map(({ key, label, value, count, other }) => {
|
|
170
|
+
let isFiltered = true;
|
|
171
|
+
if (valueFilter) {
|
|
172
|
+
isFiltered = applyFilter(value, valueFilter);
|
|
173
|
+
}
|
|
174
|
+
const color = valueFilter && !isFiltered ? "rgb(156 163 175)" : getColorForValue(settings.colorScaleId, value, "#3479a8");
|
|
175
|
+
const barWidth = xScale(count);
|
|
176
|
+
const barHeight = yScale.bandwidth();
|
|
177
|
+
if (barHeight < 1) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
return /* @__PURE__ */ jsx(
|
|
181
|
+
"rect",
|
|
182
|
+
{
|
|
183
|
+
x: 0,
|
|
184
|
+
y: yScale(key),
|
|
185
|
+
width: Math.max(0, barWidth),
|
|
186
|
+
rx: 2,
|
|
187
|
+
role: other ? void 0 : "button",
|
|
188
|
+
tabIndex: other ? void 0 : 0,
|
|
189
|
+
"aria-label": `${label}: ${count.toLocaleString()} rows`,
|
|
190
|
+
"aria-pressed": categoryIncludes(filterValues, value),
|
|
191
|
+
onKeyDown: (event) => {
|
|
192
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
193
|
+
event.preventDefault();
|
|
194
|
+
if (!other) handleBarClick(value);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
height: barHeight,
|
|
198
|
+
className: `chart-mark ${other ? "fill-muted/80 hover:fill-muted" : "cursor-pointer"}`,
|
|
199
|
+
style: {
|
|
200
|
+
fill: color,
|
|
201
|
+
opacity: valueFilter && !isFiltered ? 0.3 : 1
|
|
202
|
+
},
|
|
203
|
+
onClick: () => {
|
|
204
|
+
if (!other) handleBarClick(value);
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
key
|
|
208
|
+
);
|
|
209
|
+
}) })
|
|
210
|
+
}
|
|
211
|
+
) });
|
|
212
|
+
}
|
|
213
|
+
function RowChartSettingsPanel({
|
|
214
|
+
settings,
|
|
215
|
+
onSettingsChange
|
|
216
|
+
}) {
|
|
217
|
+
const { getOrCreateScaleForField } = useColorScales();
|
|
218
|
+
return /* @__PURE__ */ jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[120px_1fr] items-center gap-4", children: [
|
|
219
|
+
/* @__PURE__ */ jsx(Label, { children: "Data Field" }),
|
|
220
|
+
/* @__PURE__ */ jsx(
|
|
221
|
+
FieldSelector,
|
|
222
|
+
{
|
|
223
|
+
label: "",
|
|
224
|
+
value: settings.field ?? "",
|
|
225
|
+
onChange: (value) => onSettingsChange({ ...settings, field: value })
|
|
226
|
+
}
|
|
227
|
+
),
|
|
228
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "minRowHeight", children: "Min Row Height" }),
|
|
229
|
+
/* @__PURE__ */ jsx(
|
|
230
|
+
NumericInputEnter,
|
|
231
|
+
{
|
|
232
|
+
value: settings.minRowHeight || 30,
|
|
233
|
+
onChange: (value) => onSettingsChange({ ...settings, minRowHeight: value }),
|
|
234
|
+
min: 20,
|
|
235
|
+
max: 100,
|
|
236
|
+
stepSmall: 1,
|
|
237
|
+
stepMedium: 5,
|
|
238
|
+
stepLarge: 10,
|
|
239
|
+
placeholder: "Enter minimum row height"
|
|
240
|
+
}
|
|
241
|
+
),
|
|
242
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "maxRowHeight", children: "Max Row Height" }),
|
|
243
|
+
/* @__PURE__ */ jsx(
|
|
244
|
+
NumericInputEnter,
|
|
245
|
+
{
|
|
246
|
+
value: settings.maxRowHeight || 50,
|
|
247
|
+
onChange: (value) => onSettingsChange({ ...settings, maxRowHeight: value }),
|
|
248
|
+
min: 30,
|
|
249
|
+
max: 200,
|
|
250
|
+
stepSmall: 1,
|
|
251
|
+
stepMedium: 10,
|
|
252
|
+
stepLarge: 20,
|
|
253
|
+
placeholder: "Enter maximum row height"
|
|
254
|
+
}
|
|
255
|
+
),
|
|
256
|
+
/* @__PURE__ */ jsx("div", { className: "col-start-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
257
|
+
/* @__PURE__ */ jsx(
|
|
258
|
+
Switch,
|
|
259
|
+
{
|
|
260
|
+
id: "colorField",
|
|
261
|
+
checked: settings.field === settings.colorField,
|
|
262
|
+
onCheckedChange: (checked) => {
|
|
263
|
+
onSettingsChange({
|
|
264
|
+
...settings,
|
|
265
|
+
colorField: checked ? settings.field : void 0,
|
|
266
|
+
colorScaleId: checked && settings.field ? getOrCreateScaleForField(settings.field) : void 0
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
),
|
|
271
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "colorField", children: "Use as color field" })
|
|
272
|
+
] }) })
|
|
273
|
+
] }) });
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// src/components/charts/RowChart/definition.ts
|
|
277
|
+
var rowChartDefinition = {
|
|
278
|
+
type: "row",
|
|
279
|
+
name: "Row Chart",
|
|
280
|
+
description: "A horizontal bar chart showing values by category",
|
|
281
|
+
icon: BarChart,
|
|
282
|
+
component: RowChart,
|
|
283
|
+
settingsPanel: RowChartSettingsPanel,
|
|
284
|
+
createDefaultSettings: (layout, field) => ({
|
|
285
|
+
...DEFAULT_ROW_SETTINGS,
|
|
286
|
+
id: crypto.randomUUID(),
|
|
287
|
+
layout,
|
|
288
|
+
field: field ?? "",
|
|
289
|
+
filters: []
|
|
290
|
+
}),
|
|
291
|
+
validateSettings: (settings) => {
|
|
292
|
+
return Boolean(settings.field);
|
|
293
|
+
},
|
|
294
|
+
getFilterFunction: (settings, fieldGetter) => {
|
|
295
|
+
const dataHash = fieldGetter(settings.field);
|
|
296
|
+
const valueFilter = settings.filters.find(
|
|
297
|
+
(f) => f.type === "value" && f.field === settings.field
|
|
298
|
+
);
|
|
299
|
+
return (d) => {
|
|
300
|
+
if (!valueFilter) {
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
const value = dataHash[d];
|
|
304
|
+
return applyFilter(value, valueFilter);
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
export { rowChartDefinition };
|
|
310
|
+
//# sourceMappingURL=chunk-NGWTPED4.js.map
|
|
311
|
+
//# sourceMappingURL=chunk-NGWTPED4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/charts/RowChart/RowChart.tsx","../src/components/charts/RowChart/RowChartSettingsPanel.tsx","../src/components/charts/RowChart/definition.ts"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-NGWTPED4.js","sourcesContent":["import {\n categoryEqual,\n categoryIncludes,\n categoryKey,\n categoryLabel,\n categoryValue,\n} from \"@/lib/categories\";\nimport { numericScale } from \"../Axis/numericScale\";\nimport { BaseChartProps, RowChartSettings } from \"@/types/ChartTypes\";\n\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { datum, Filter, ValueFilter } from \"@/types/FilterTypes\";\nimport { scaleBand } from \"d3-scale\";\nimport { useMemo } from \"react\";\nimport { useGetColumnDataForIds } from \"../useGetColumnData\";\nimport { BaseChart } from \"../BaseChart\";\nimport { getChartAxisFields, getChartAxisLabel } from \"../chartAccessibility\";\nimport { useGetLiveData } from \"../useGetLiveData\";\nimport { hasFieldDisplayFormat } from \"@/lib/fieldSettings\";\n\ntype RowChartProps = BaseChartProps<RowChartSettings>;\n\nexport function RowChart({ settings, width, height, facetIds }: RowChartProps) {\n const allData = useGetColumnDataForIds(settings.field);\n const data = useGetLiveData(settings, settings.field, facetIds);\n\n const { getColorForValue } = useColorScales();\n\n const updateChart = useDataLayer((s) => s.updateChart);\n const formatFieldValue = useDataLayer((s) => s.formatFieldValue);\n const getFieldLabel = useDataLayer((s) => s.getFieldLabel);\n const fieldSettings = useDataLayer((s) => s.fieldSettings);\n void fieldSettings;\n\n const valueFilter = settings.filters.find(\n (f: Filter): f is ValueFilter =>\n f.type === \"value\" && f.field === settings.field\n );\n const filterValues = valueFilter?.values ?? [];\n\n const handleBarClick = (label: datum) => {\n const newValues = categoryIncludes(filterValues, label)\n ? filterValues.filter((f) => !categoryEqual(f, label))\n : [...filterValues, label];\n\n // Create new filters array with updated value filter\n const newFilters = settings.filters.filter(\n (f) => f.type !== \"value\" || f.field !== settings.field\n );\n\n if (newValues.length > 0) {\n newFilters.push({\n type: \"value\",\n field: settings.field,\n values: newValues,\n });\n }\n\n updateChart(settings.id, {\n filters: newFilters,\n });\n };\n\n // Chart dimensions\n const baseMargin = settings.margin;\n\n // Calculate counts and handle overflow\n const { displayCounts } = useMemo(() => {\n const countMap = new Map<datum, number>();\n allData.forEach((value) => {\n const key = categoryValue(value);\n countMap.set(key, (countMap.get(key) || 0) + 1);\n });\n\n // Convert to array and sort by count descending\n const sortedCounts = Array.from(countMap.entries())\n .map(([value, count]) => ({\n value,\n key: categoryKey(value),\n label:\n value != null && hasFieldDisplayFormat(fieldSettings[settings.field])\n ? (formatFieldValue?.(settings.field, value) ??\n categoryLabel(value))\n : categoryLabel(value),\n count,\n other: false,\n }))\n .sort((a, b) => b.count - a.count);\n\n // Calculate how many rows we can fit based on min and max row height constraints\n const availableHeight = height - baseMargin.top - baseMargin.bottom;\n const rowHeight = Math.max(\n settings.minRowHeight,\n Math.min(settings.maxRowHeight, availableHeight / sortedCounts.length)\n );\n const maxRows = Math.max(2, Math.floor(availableHeight / rowHeight));\n const liveCounts = new Map<datum, number>();\n data.forEach((value) => {\n const key = categoryValue(value);\n liveCounts.set(key, (liveCounts.get(key) ?? 0) + 1);\n });\n const visible = sortedCounts.map((item) => ({\n ...item,\n total: item.count,\n count: liveCounts.get(item.value) ?? 0,\n }));\n\n // If we have more items than we can display, create an \"Others\" category\n if (sortedCounts.length > maxRows) {\n const visibleCounts = visible.slice(0, maxRows - 1);\n const otherSum = visible\n .slice(maxRows - 1)\n .reduce((sum, item) => sum + item.count, 0);\n\n return {\n displayCounts: [\n ...visibleCounts,\n {\n key: \"__other\",\n label: \"Other categories\",\n value: undefined,\n other: true,\n count: otherSum,\n total: visible\n .slice(maxRows - 1)\n .reduce((sum, item) => sum + item.total, 0),\n },\n ],\n };\n }\n\n return {\n displayCounts: visible,\n };\n }, [\n data,\n allData,\n height,\n baseMargin.top,\n baseMargin.bottom,\n settings.minRowHeight,\n settings.maxRowHeight,\n formatFieldValue,\n fieldSettings,\n ]);\n\n const yLabels = displayCounts.map((d) => d.label);\n const axisFields = getChartAxisFields(settings);\n const xAxisLabel = getChartAxisLabel(\n axisFields.x,\n settings.xAxisLabel,\n getFieldLabel\n );\n const requestedLabelMargin = Math.max(\n baseMargin.left,\n ...yLabels.map((label) => label.length * 7 + 24)\n );\n const minPlotWidth = Math.min(\n 80,\n Math.max(0, width - baseMargin.left - baseMargin.right)\n );\n const maxLabelMargin = Math.max(0, width - baseMargin.right - minPlotWidth);\n const labelMargin = Math.min(requestedLabelMargin, maxLabelMargin);\n const margin = {\n ...baseMargin,\n left: Math.min(labelMargin, width * 0.42),\n right: Math.max(baseMargin.right, 48),\n bottom: Math.max(baseMargin.bottom, xAxisLabel ? 42 : 26),\n };\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n const chartSettings = { ...settings, margin };\n\n // Create scales with synchronized limits if in a facet\n const xScale = useMemo(() => {\n const maxValue = Math.max(1, ...displayCounts.map((d) => d.total));\n\n return numericScale(settings.xAxis)\n .domain([0, maxValue])\n .range([0, innerWidth])\n .nice();\n }, [displayCounts, innerWidth, settings.xAxis]);\n\n const yScale = useMemo(() => {\n return scaleBand()\n .domain(displayCounts.map((d) => d.key))\n .range([0, innerHeight])\n .padding(0.3);\n }, [displayCounts, innerHeight]);\n\n if (displayCounts.length === 0) {\n return <div style={{ width, height }}>No data to display</div>;\n }\n\n const yLabelsByKey = new Map(\n displayCounts.map((item) => [item.key, item.label])\n );\n\n return (\n <div style={{ width, height }}>\n <BaseChart\n width={width}\n height={height}\n xScale={xScale}\n yScale={yScale}\n settings={chartSettings}\n yTickFormatter={(value) =>\n yLabelsByKey.get(String(value)) ?? String(value)\n }\n overlay={\n <g pointerEvents=\"none\">\n {\" \"}\n {/* Count labels */}\n {displayCounts.map(({ key, count }) => (\n <text\n key={key}\n x={xScale(count) + 5}\n y={yScale(key)! + yScale.bandwidth() / 2}\n dominantBaseline=\"middle\"\n className=\"fill-foreground\"\n fontSize={11}\n >\n {count.toLocaleString()}\n </text>\n ))}\n </g>\n }\n >\n <g className=\"select-none\">\n {/* Bars */}\n {displayCounts.map(({ key, label, value, count, other }) => {\n let isFiltered = true;\n if (valueFilter) {\n isFiltered = applyFilter(value, valueFilter);\n }\n\n const color =\n valueFilter && !isFiltered\n ? \"rgb(156 163 175)\" // gray-400 for filtered out points\n : getColorForValue(settings.colorScaleId, value, \"#3479a8\");\n\n const barWidth = xScale(count);\n const barHeight = yScale.bandwidth();\n\n if (barHeight < 1) {\n return null;\n }\n\n return (\n <rect\n key={key}\n x={0}\n y={yScale(key)}\n width={Math.max(0, barWidth)}\n rx={2}\n role={other ? undefined : \"button\"}\n tabIndex={other ? undefined : 0}\n aria-label={`${label}: ${count.toLocaleString()} rows`}\n aria-pressed={categoryIncludes(filterValues, value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (!other) handleBarClick(value);\n }\n }}\n height={barHeight}\n className={`chart-mark ${\n other ? \"fill-muted/80 hover:fill-muted\" : \"cursor-pointer\"\n }`}\n style={{\n fill: color,\n opacity: valueFilter && !isFiltered ? 0.3 : 1,\n }}\n onClick={() => {\n if (!other) handleBarClick(value);\n }}\n />\n );\n })}\n </g>\n </BaseChart>\n </div>\n );\n}\n","import { FieldSelector } from \"@/components/FieldSelector\";\nimport { NumericInputEnter } from \"@/components/NumericInputEnter\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\nimport { ChartSettingsPanelProps, RowChartSettings } from \"@/types/ChartTypes\";\n\nexport function RowChartSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<RowChartSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>Data Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.field ?? \"\"}\n onChange={(value) => onSettingsChange({ ...settings, field: value })}\n />\n\n <Label htmlFor=\"minRowHeight\">Min Row Height</Label>\n <NumericInputEnter\n value={settings.minRowHeight || 30}\n onChange={(value) =>\n onSettingsChange({ ...settings, minRowHeight: value })\n }\n min={20}\n max={100}\n stepSmall={1}\n stepMedium={5}\n stepLarge={10}\n placeholder=\"Enter minimum row height\"\n />\n\n <Label htmlFor=\"maxRowHeight\">Max Row Height</Label>\n <NumericInputEnter\n value={settings.maxRowHeight || 50}\n onChange={(value) =>\n onSettingsChange({ ...settings, maxRowHeight: value })\n }\n min={30}\n max={200}\n stepSmall={1}\n stepMedium={10}\n stepLarge={20}\n placeholder=\"Enter maximum row height\"\n />\n\n <div className=\"col-start-2\">\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"colorField\"\n checked={settings.field === settings.colorField}\n onCheckedChange={(checked) => {\n onSettingsChange({\n ...settings,\n colorField: checked ? settings.field : undefined,\n colorScaleId:\n checked && settings.field\n ? getOrCreateScaleForField(settings.field)\n : undefined,\n });\n }}\n />\n <Label htmlFor=\"colorField\">Use as color field</Label>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { BarChart } from \"lucide-react\";\n\nimport { RowChart } from \"@/components/charts/RowChart/RowChart\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport {\n ChartDefinition,\n ChartLayout,\n RowChartSettings,\n datum,\n} from \"@/types/ChartTypes\";\nimport { Filter } from \"@/types/FilterTypes\";\nimport { DEFAULT_ROW_SETTINGS } from \"@/utils/defaultSettings\";\nimport { RowChartSettingsPanel } from \"./RowChartSettingsPanel\";\n\nexport const rowChartDefinition: ChartDefinition<RowChartSettings> = {\n type: \"row\",\n name: \"Row Chart\",\n description: \"A horizontal bar chart showing values by category\",\n icon: BarChart,\n\n component: RowChart,\n settingsPanel: RowChartSettingsPanel,\n\n createDefaultSettings: (layout: ChartLayout, field?: string) => ({\n ...DEFAULT_ROW_SETTINGS,\n id: crypto.randomUUID(),\n layout,\n field: field ?? \"\",\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return Boolean(settings.field);\n },\n\n getFilterFunction: (\n settings: RowChartSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const dataHash = fieldGetter(settings.field);\n const valueFilter = settings.filters.find(\n (f): f is Filter => f.type === \"value\" && f.field === settings.field\n );\n\n return (d: IdType) => {\n if (!valueFilter) {\n return true;\n }\n\n const value = dataHash[d];\n return applyFilter(value, valueFilter);\n };\n },\n};\n"]}
|