exploreda 0.0.6 → 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 -11288
- package/dist/ExplorEda.cjs.map +1 -1
- package/dist/ExplorEda.css +2282 -1689
- package/dist/ExplorEda.css.map +1 -1
- package/dist/ExplorEda.d.cts +124 -278
- package/dist/ExplorEda.d.ts +124 -278
- package/dist/ExplorEda.js +4479 -11166
- 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 +30 -52
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useCreateCharts.ts","../src/components/SummaryTable/components/ChartActions.tsx","../src/components/SummaryTable/components/FieldDistribution.tsx","../src/components/SummaryTable/components/CompactSummaryTable.tsx","../src/components/charts/SummaryTable/SummaryTable.tsx","../src/components/charts/SummaryTable/SummaryTableSettingsPanel.tsx","../src/components/charts/SummaryTable/definition.ts"],"names":["jsx","jsxs","width","bars","Fragment","useState"],"mappings":"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","file":"chunk-PP4VCONW.js","sourcesContent":["import { getChartDefinition } from \"@/charts/registry\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { ChartLayout, ChartType } from \"@/types/ChartTypes\";\n\nexport function useCreateCharts() {\n const profiles = useDataLayer((s) => s.fieldProfiles);\n const charts = useDataLayer((s) => s.charts);\n const addChart = useDataLayer((s) => s.addChart);\n\n const createChart = (\n type: ChartType,\n field: string,\n initialLayout?: ChartLayout\n ) => {\n const layout = initialLayout ?? {\n x: 0,\n y: Math.max(0, ...charts.map((chart) => chart.layout.y + chart.layout.h)),\n w: 6,\n h: 4,\n };\n\n const definition = getChartDefinition(type);\n if (!definition) {\n throw new Error(`Chart type ${type} not registered`);\n }\n\n const numeric = profiles\n .filter((profile) => profile.dataType === \"numeric\")\n .map((profile) => profile.name);\n const categories = profiles\n .filter((profile) => profile.dataType !== \"numeric\")\n .map((profile) => profile.name);\n const selectedField =\n field ||\n (type === \"row\" ? categories[0] : numeric[0]) ||\n profiles[0]?.name ||\n \"\";\n const settings = definition.createDefaultSettings(layout, selectedField);\n if (settings.type === \"scatter\" || settings.type === \"3d-scatter\") {\n settings.xField = numeric[0] || \"__ID\";\n settings.yField = field || numeric[1] || numeric[0] || \"__ID\";\n settings.xAxisLabel = \"\";\n settings.yAxisLabel = \"\";\n if (settings.type === \"3d-scatter\")\n settings.zField = numeric[2] || numeric[0] || \"__ID\";\n }\n if (settings.type === \"line\") {\n settings.xField = \"__ID\";\n settings.seriesField = selectedField ? [selectedField] : [];\n settings.xAxisLabel = \"\";\n settings.yAxisLabel = \"\";\n }\n if (settings.type === \"data-table\")\n settings.columns = profiles\n .slice(0, 8)\n .map((profile) => ({ id: profile.name, field: profile.name }));\n if (settings.type === \"pivot\") {\n settings.rowFields = categories.slice(0, 1);\n settings.columnField = categories[1] || \"\";\n settings.valueFields = selectedField\n ? [{ field: selectedField, aggregation: \"count\" }]\n : [];\n }\n if (settings.type === \"color-legend\")\n settings.fields = categories.slice(0, 1);\n if (settings.type === \"bar\" || settings.type === \"row\") {\n settings.xAxisLabel = settings.type === \"row\" ? \"Records\" : \"\";\n settings.yAxisLabel = settings.type === \"bar\" ? \"Records\" : \"\";\n }\n if (settings.type === \"boxplot\") settings.yAxisLabel = \"\";\n settings.title = \"\";\n addChart(settings);\n };\n\n return { createChart };\n}\n","import { Button } from \"@/components/ui/button\";\nimport { ActionTooltip } from \"@/components/ui/tooltip\";\nimport { BarChart, ScatterChart, Table2 } from \"lucide-react\";\nimport { useCreateCharts } from \"@/hooks/useCreateCharts\";\n\ninterface ChartActionsProps {\n columnName: string;\n dataType: \"numeric\" | \"categorical\" | \"datetime\" | \"boolean\";\n}\n\nexport function ChartActions({ columnName, dataType }: ChartActionsProps) {\n const { createChart } = useCreateCharts();\n\n return (\n <div className=\"flex gap-1\">\n {dataType === \"categorical\" && (\n <ActionTooltip content=\"Create row chart\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={`Create row chart for ${columnName}`}\n onClick={() => createChart(\"row\", columnName)}\n >\n <BarChart className=\"h-4 w-4 rotate-90\" />\n </Button>\n </ActionTooltip>\n )}\n\n {dataType === \"numeric\" && (\n <>\n <ActionTooltip content=\"Create bar chart\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={`Create bar chart for ${columnName}`}\n onClick={() => createChart(\"bar\", columnName)}\n >\n <BarChart className=\"h-4 w-4\" />\n </Button>\n </ActionTooltip>\n\n <ActionTooltip content=\"Create scatter plot\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={`Create scatter chart for ${columnName}`}\n onClick={() => createChart(\"scatter\", columnName)}\n >\n <ScatterChart className=\"h-4 w-4\" />\n </Button>\n </ActionTooltip>\n </>\n )}\n\n {(dataType === \"categorical\" || dataType === \"datetime\") && (\n <ActionTooltip content=\"Create pivot table\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={`Create pivot table for ${columnName}`}\n onClick={() => createChart(\"pivot\", columnName)}\n >\n <Table2 className=\"h-4 w-4\" />\n </Button>\n </ActionTooltip>\n )}\n </div>\n );\n}\n","import { useState, type PointerEvent } from \"react\";\nimport { categoryLabel } from \"@/lib/categories\";\nimport type { FieldProfile } from \"@/lib/fieldProfiles\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { binValues, DISTRIBUTION_BINS } from \"../utils/statisticsCalculator\";\n\nconst WIDTH = 96;\nconst HEIGHT = 20;\nconst SHARE_SEGMENTS = 5;\nconst OTHER_LABEL = \"Other values\";\n\n/** One mark in a sparkline: a histogram bin or a category share. */\nexport type SparkBar = { label: string; count: number; muted?: boolean };\n\nexport type FieldSummary = {\n /** Visual shape of the values. Hidden from assistive technology. */\n graphic: React.ReactNode;\n /** Marks behind the graphic, used for its hover details. */\n bars: SparkBar[];\n /** Low end of a range, such as a minimum or first date. */\n low?: string;\n /** High end of a range, such as a maximum or last date. */\n high?: string;\n /** Text reading that spans the range columns, such as a top value. */\n label?: string;\n /** Name of the trailing statistic, such as \"median\". */\n statLabel?: string;\n /** Value of the trailing statistic. */\n stat?: string;\n /** Full sentence for screen readers. */\n description: string;\n};\n\nconst percent = (share: number) =>\n share > 0 && share < 0.01 ? \"<1%\" : `${Math.round(share * 100)}%`;\n\n/**\n * Wraps a sparkline so hovering a mark names its values and row count.\n * The marks stay hidden from assistive technology; the row already reads the\n * same summary aloud.\n */\nfunction SparkDetails({\n bars,\n total,\n fieldLabel,\n locate,\n children,\n}: {\n bars: SparkBar[];\n total: number;\n fieldLabel: string;\n locate: (fraction: number) => number;\n children: (active: number | undefined) => React.ReactNode;\n}) {\n const [active, setActive] = useState<number>();\n const bar = active === undefined ? undefined : bars[active];\n const onPointerMove = (event: PointerEvent<HTMLSpanElement>) => {\n const box = event.currentTarget.getBoundingClientRect();\n if (box.width <= 0) return;\n const fraction = (event.clientX - box.left) / box.width;\n const index = locate(Math.min(0.9999, Math.max(0, fraction)));\n setActive(index >= 0 && index < bars.length ? index : undefined);\n };\n return (\n <TooltipProvider>\n <Tooltip open={bar !== undefined}>\n <TooltipTrigger asChild>\n <span\n className=\"eda-summary-spark-hit\"\n aria-hidden=\"true\"\n onPointerMove={onPointerMove}\n onPointerLeave={() => setActive(undefined)}\n >\n {children(active)}\n </span>\n </TooltipTrigger>\n {bar && (\n <TooltipContent side=\"top\" collisionPadding={12}>\n <p className=\"text-muted-foreground\">{fieldLabel}</p>\n <p className=\"font-medium\">{bar.label}</p>\n <p className=\"tabular-nums\">\n {bar.count.toLocaleString()} {bar.count === 1 ? \"row\" : \"rows\"}\n {total > 0 && (\n <span className=\"text-muted-foreground\">\n {\" \"}\n · {percent(bar.count / total)}\n </span>\n )}\n </p>\n </TooltipContent>\n )}\n </Tooltip>\n </TooltipProvider>\n );\n}\n\ntype SparkProps = { bars: SparkBar[]; total: number; fieldLabel: string };\n\nfunction Histogram({ bars, total, fieldLabel }: SparkProps) {\n const peak = Math.max(...bars.map((bar) => bar.count), 1);\n const step = WIDTH / Math.max(1, bars.length);\n const gap = bars.length > 1 ? Math.min(1, step * 0.2) : 0;\n return (\n <SparkDetails\n bars={bars}\n total={total}\n fieldLabel={fieldLabel}\n locate={(fraction) => Math.floor(fraction * bars.length)}\n >\n {(active) => (\n <svg\n className=\"eda-summary-spark\"\n viewBox={`0 0 ${WIDTH} ${HEIGHT}`}\n preserveAspectRatio=\"none\"\n focusable=\"false\"\n >\n {active !== undefined && (\n <rect\n className=\"eda-summary-spark-focus\"\n x={active * step}\n y={0}\n width={step}\n height={HEIGHT}\n />\n )}\n <line\n className=\"eda-summary-spark-base\"\n x1={0}\n x2={WIDTH}\n y1={HEIGHT - 0.5}\n y2={HEIGHT - 0.5}\n />\n {bars.map(({ count }, index) => {\n if (count === 0) return null;\n const height = Math.max(1.5, (count / peak) * (HEIGHT - 1));\n return (\n <rect\n key={index}\n className=\"eda-summary-spark-bar\"\n data-active={index === active || undefined}\n x={index * step + gap / 2}\n y={HEIGHT - height}\n width={Math.max(0.5, step - gap)}\n height={height}\n />\n );\n })}\n </svg>\n )}\n </SparkDetails>\n );\n}\n\nfunction ShareBar({ bars, total, fieldLabel }: SparkProps) {\n const shares = bars.map((bar) => (total > 0 ? bar.count / total : 0));\n const starts = shares.map((_, index) =>\n shares.slice(0, index).reduce((sum, share) => sum + share, 0)\n );\n return (\n <SparkDetails\n bars={bars}\n total={total}\n fieldLabel={fieldLabel}\n locate={(fraction) =>\n starts.findIndex(\n (start, index) =>\n fraction >= start && fraction < start + shares[index]!\n )\n }\n >\n {(active) => (\n <svg\n className=\"eda-summary-spark\"\n viewBox={`0 0 ${WIDTH} ${HEIGHT}`}\n preserveAspectRatio=\"none\"\n focusable=\"false\"\n >\n {bars.map((bar, index) => (\n <rect\n key={index}\n className={\n bar.muted ? \"eda-summary-share-rest\" : \"eda-summary-share\"\n }\n data-rank={index}\n data-active={index === active || undefined}\n x={starts[index]! * WIDTH}\n y={5}\n width={Math.max(0.5, shares[index]! * WIDTH - 1)}\n height={HEIGHT - 10}\n />\n ))}\n </svg>\n )}\n </SparkDetails>\n );\n}\n\nfunction dateBins(profile: FieldProfile) {\n const times: number[] = [];\n let first: { time: number; value: unknown } | undefined;\n let last: { time: number; value: unknown } | undefined;\n for (const { value, count } of profile.categories?.distribution ?? []) {\n const time = Date.parse(String(value));\n if (!Number.isFinite(time)) continue;\n for (let i = 0; i < count; i += 1) times.push(time);\n if (!first || time < first.time) first = { time, value };\n if (!last || time > last.time) last = { time, value };\n }\n if (!first || !last) return undefined;\n times.sort((a, b) => a - b);\n return {\n first: first.value,\n last: last.value,\n firstTime: first.time,\n lastTime: last.time,\n bins: binValues(times, first.time, last.time),\n };\n}\n\n/** Name each bin by the values it covers. */\nexport function labelBins(\n bins: number[],\n min: number,\n max: number,\n label: (value: number) => string\n): SparkBar[] {\n // binValues gives small integer ranges fewer bins, one per value.\n const oneBinPerValue =\n bins.length === 1 ||\n (bins.length < DISTRIBUTION_BINS &&\n Number.isInteger(min) &&\n bins.length === max - min + 1);\n const width = (max - min) / Math.max(1, bins.length);\n return bins.map((count, index) => {\n if (oneBinPerValue) return { label: label(min + index), count };\n const start = label(min + index * width);\n const end = label(\n index === bins.length - 1 ? max : min + (index + 1) * width\n );\n return { label: start === end ? start : `${start} – ${end}`, count };\n });\n}\n\nconst isoDate = (time: number) => new Date(time).toISOString().slice(0, 10);\n\nexport function summarizeField(\n profile: FieldProfile,\n format: (value: unknown) => string,\n fieldLabel = profile.name\n): FieldSummary | undefined {\n const present =\n profile.totalCount - profile.nullCount - (profile.excludedCount ?? 0);\n if (present <= 0) return undefined;\n\n if (profile.statistics) {\n const { min, max, median, bins = [] } = profile.statistics;\n const low = format(min);\n const high = format(max);\n const bars = labelBins(bins, min, max, format);\n const graphic = (\n <Histogram bars={bars} total={present} fieldLabel={fieldLabel} />\n );\n if (min === max) {\n return { graphic, bars, low, description: `Every value is ${low}` };\n }\n return {\n graphic,\n bars,\n low,\n high,\n statLabel: \"median\",\n stat: format(median),\n description: `Range ${low} to ${high}, median ${format(median)}`,\n };\n }\n\n if (profile.dataType === \"datetime\") {\n const dates = dateBins(profile);\n if (dates) {\n const first = format(dates.first);\n const last = format(dates.last);\n const bars = labelBins(\n dates.bins,\n dates.firstTime,\n dates.lastTime,\n isoDate\n );\n return {\n graphic: (\n <Histogram bars={bars} total={present} fieldLabel={fieldLabel} />\n ),\n bars,\n low: first,\n high: first === last ? undefined : last,\n description: `Dates from ${first} to ${last}`,\n };\n }\n }\n\n const top = profile.categories?.topValues ?? [];\n if (!top[0]) return undefined;\n\n if (profile.uniqueCount === present && present > 1) {\n const bars = [\n { label: \"Each value appears once\", count: present, muted: true },\n ];\n return {\n graphic: <ShareBar bars={bars} total={present} fieldLabel={fieldLabel} />,\n bars,\n label: \"All values unique\",\n description: `Every value is unique, for example ${categoryLabel(top[0].value)}`,\n };\n }\n\n const bars: SparkBar[] = top\n .slice(0, SHARE_SEGMENTS)\n .map(({ value, count }) => ({ label: categoryLabel(value), count }));\n const rest = present - bars.reduce((sum, bar) => sum + bar.count, 0);\n if (rest > 0) bars.push({ label: OTHER_LABEL, count: rest, muted: true });\n const leader = categoryLabel(top[0].value);\n const share = percent(top[0].count / present);\n return {\n graphic: <ShareBar bars={bars} total={present} fieldLabel={fieldLabel} />,\n bars,\n label: leader,\n statLabel: \"share\",\n stat: share,\n description: `Most common value ${leader}, ${share} of rows with a value`,\n };\n}\n","import type { CSSProperties } from \"react\";\nimport { CalculatedFieldBadge } from \"@/components/calculations/CalculatedFieldBadge\";\nimport { Button } from \"@/components/ui/button\";\nimport { ArrowDown, ArrowUp, ArrowUpDown, Settings2 } from \"lucide-react\";\nimport { FieldMetadata } from \"@/components/FieldMetadata\";\nimport { ChartActions } from \"./ChartActions\";\nimport { FieldInspector } from \"./FieldInspector\";\nimport { summarizeField, type FieldSummary } from \"./FieldDistribution\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport type { FieldProfile } from \"@/lib/fieldProfiles\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport { cn } from \"@/lib/utils\";\nimport { getChartSummary } from \"../../charts/chartAccessibility\";\nimport type { SummaryTableSettings } from \"../../charts/SummaryTable/definition\";\n\nexport type SummarySortColumn = \"name\" | \"uniqueCount\" | \"nullCount\";\nexport type SummarySort = {\n column: SummarySortColumn | null;\n direction: \"asc\" | \"desc\";\n};\n\ninterface CompactSummaryTableProps {\n data: FieldProfile[];\n onSort: (column: SummarySortColumn) => void;\n sort?: SummarySort;\n settings: SummaryTableSettings;\n}\n\nconst MAX_TRACK = 16;\nconst width = (values: Array<string | undefined>) =>\n Math.min(\n MAX_TRACK,\n Math.max(0, ...values.map((value) => value?.length ?? 0))\n );\n\n/**\n * Size the reading tracks from the longest value in each, so ranges, medians,\n * and shares line up down the table instead of following each row's text.\n */\nfunction readingColumns(summaries: Array<FieldSummary | undefined>) {\n const present = summaries.filter(\n (summary): summary is FieldSummary => summary !== undefined\n );\n const measuredLow = width(present.map((summary) => summary.low));\n const high = width(present.map((summary) => summary.high));\n const label = width(present.map((summary) => summary.label));\n // Top values span the range tracks and truncate past them. A table of only\n // text fields gives the label its own width.\n const low = measuredLow === 0 && high === 0 ? label : measuredLow;\n return {\n \"--eda-summary-low\": `${low}ch`,\n \"--eda-summary-high\": `${high}ch`,\n \"--eda-summary-stat-label\": `${width(present.map((summary) => summary.statLabel))}ch`,\n \"--eda-summary-stat\": `${width(present.map((summary) => summary.stat))}ch`,\n } as CSSProperties;\n}\n\nfunction SortHeader({\n column,\n label,\n sort,\n onSort,\n className,\n}: {\n column: SummarySortColumn;\n label: string;\n sort?: SummarySort;\n onSort: (column: SummarySortColumn) => void;\n className?: string;\n}) {\n const active = sort?.column === column;\n const Icon = !active\n ? ArrowUpDown\n : sort.direction === \"asc\"\n ? ArrowUp\n : ArrowDown;\n return (\n <th\n scope=\"col\"\n className={className}\n aria-sort={\n active\n ? sort.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n }\n >\n <button\n type=\"button\"\n className=\"eda-summary-sort\"\n data-active={active || undefined}\n onClick={() => onSort(column)}\n >\n <span>{label}</span>\n <Icon aria-hidden=\"true\" />\n </button>\n </th>\n );\n}\n\nexport function CompactSummaryTable({\n data,\n onSort,\n sort,\n settings,\n}: CompactSummaryTableProps) {\n const formatValue = useDataLayer((state) => state.formatFieldValue);\n const getFieldLabel = useDataLayer((state) => state.getFieldLabel);\n const label = getFieldLabel ?? ((field: string) => field);\n const rows = data.map((profile) => ({\n profile,\n summary: summarizeField(\n profile,\n (value) => formatValue(profile.name, value as datum),\n label(profile.name)\n ),\n }));\n return (\n <table\n className=\"eda-summary-table\"\n style={readingColumns(rows.map((row) => row.summary))}\n >\n <caption className=\"sr-only\">{getChartSummary(settings)}</caption>\n <colgroup>\n <col className=\"eda-summary-col-field\" />\n <col className=\"eda-summary-col-count\" />\n <col className=\"eda-summary-col-count\" />\n <col />\n <col className=\"eda-summary-col-actions\" />\n </colgroup>\n <thead>\n <tr>\n <SortHeader column=\"name\" label=\"Field\" sort={sort} onSort={onSort} />\n <SortHeader\n column=\"uniqueCount\"\n label=\"Distinct\"\n sort={sort}\n onSort={onSort}\n className=\"eda-summary-num\"\n />\n <SortHeader\n column=\"nullCount\"\n label=\"Missing\"\n sort={sort}\n onSort={onSort}\n className=\"eda-summary-num\"\n />\n <th scope=\"col\">Values</th>\n <th scope=\"col\">\n <span className=\"sr-only\">Actions</span>\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map(({ profile, summary }) => {\n const fieldLabel = label(profile.name);\n const missingShare =\n profile.totalCount > 0 ? profile.nullCount / profile.totalCount : 0;\n return (\n <tr key={profile.name}>\n <th scope=\"row\" className=\"eda-summary-field\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <FieldMetadata\n profile={profile}\n label={fieldLabel}\n compact\n showDetail={false}\n className=\"min-w-0\"\n />\n <CalculatedFieldBadge field={profile.name} />\n </span>\n </th>\n <td className=\"eda-summary-num\">\n {profile.uniqueCount.toLocaleString()}\n </td>\n <td\n className={cn(\n \"eda-summary-num\",\n profile.nullCount > 0 && \"eda-summary-missing\"\n )}\n >\n {profile.nullCount > 0 ? (\n <>\n {profile.nullCount.toLocaleString()}\n <span className=\"eda-summary-share-label\">\n {missingShare < 0.01\n ? \"<1%\"\n : `${Math.round(missingShare * 100)}%`}\n </span>\n </>\n ) : (\n <>\n <span aria-hidden=\"true\" className=\"text-muted-foreground\">\n –\n </span>\n <span className=\"sr-only\">None</span>\n </>\n )}\n </td>\n <td className=\"eda-summary-values\">\n {summary ? (\n <div className=\"eda-summary-profile\">\n {summary.graphic}\n <span className=\"sr-only\">{summary.description}</span>\n <span aria-hidden=\"true\" className=\"eda-summary-reading\">\n <span className=\"eda-summary-range\">\n {summary.label !== undefined ? (\n <span className=\"eda-summary-label\">\n {summary.label}\n </span>\n ) : (\n <>\n <span className=\"eda-summary-low\">\n {summary.low}\n </span>\n {summary.high !== undefined && (\n <>\n <span className=\"eda-summary-sep\">–</span>\n <span className=\"eda-summary-high\">\n {summary.high}\n </span>\n </>\n )}\n </>\n )}\n </span>\n {summary.stat !== undefined && (\n <span className=\"eda-summary-stat-group\">\n <span className=\"eda-summary-stat-label\">\n {summary.statLabel}\n </span>\n <span className=\"eda-summary-stat\">\n {summary.stat}\n </span>\n </span>\n )}\n </span>\n </div>\n ) : (\n <span className=\"text-muted-foreground\">\n {profile.totalCount === 0\n ? \"No rows in the current filter\"\n : \"No values\"}\n </span>\n )}\n </td>\n <td className=\"eda-summary-actions-cell\">\n <div className=\"eda-summary-actions\">\n <FieldInspector field={profile.name}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Inspect ${fieldLabel}`}\n >\n <Settings2 />\n </Button>\n </FieldInspector>\n <ChartActions\n columnName={profile.name}\n dataType={profile.dataType}\n />\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n","import { categoryLabel } from \"@/lib/categories\";\nimport { BaseChartProps, datum } from \"@/types/ChartTypes\";\nimport { Button } from \"@/components/ui/button\";\nimport { ActionTooltip } from \"@/components/ui/tooltip\";\nimport {\n buildFieldProfile,\n emptyFieldProfile,\n FieldProfile,\n} from \"@/lib/fieldProfiles\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport { Download } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { toast } from \"sonner\";\nimport {\n CompactSummaryTable,\n type SummarySort,\n type SummarySortColumn,\n} from \"../../SummaryTable/components/CompactSummaryTable\";\nimport type { SummaryTableSettings } from \"./definition\";\n\nconst exportToCSV = (profiles: FieldProfile[]) => {\n const headers = [\n \"Column\",\n \"Type\",\n \"Total\",\n \"Unique\",\n \"Missing\",\n \"Min\",\n \"Max\",\n \"Mean\",\n \"Median\",\n \"StdDev\",\n \"Top Values\",\n ];\n const rows = profiles.map((profile) => [\n profile.name,\n profile.dataType,\n profile.totalCount,\n profile.uniqueCount,\n profile.nullCount,\n profile.statistics?.min ?? \"\",\n profile.statistics?.max ?? \"\",\n profile.statistics?.mean ?? \"\",\n profile.statistics?.median ?? \"\",\n profile.statistics?.stdDev ?? \"\",\n profile.categories?.topValues\n .map((value) => `${categoryLabel(value.value)}(${value.count})`)\n .join(\"; \") ?? \"\",\n ]);\n\n const csvContent = [\n headers.join(\",\"),\n ...rows.map((row) =>\n row.map((cell) => `\"${String(cell).replace(/\"/g, '\"\"')}\"`).join(\",\")\n ),\n ].join(\"\\n\");\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n link.href = url;\n link.download = \"summary_table.csv\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n toast.success(\"Summary table exported to CSV\");\n};\n\nexport function SummaryTable({\n height,\n settings,\n toolbarTarget,\n}: BaseChartProps<SummaryTableSettings>) {\n const sourceProfiles = useDataLayer((state) => state.fieldProfiles);\n const data = useDataLayer((state) => state.data);\n const calculations = useDataLayer((state) => state.calculations);\n const fieldSettings = useDataLayer((state) => state.fieldSettings);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const crossfilterWrapper = useDataLayer((state) => state.crossfilterWrapper);\n const liveItems = useDataLayer((state) => state.liveItems);\n const chartState = useDataLayer((state) => state.charts);\n const [sortConfig, setSortConfig] = useState<SummarySort>({\n column: null,\n direction: \"asc\",\n });\n\n const allProfiles = useMemo(() => {\n const filteredIds = new Set(\n chartState.length\n ? crossfilterWrapper.getFilteredRowIds()\n : data.map((row) => row.__ID)\n );\n const filteredRows = data.filter((row) => filteredIds.has(row.__ID));\n const profileColumn = (name: string) =>\n Object.fromEntries(\n filteredRows.map((row) => [row.__ID, row[name]])\n ) as Record<number, datum>;\n\n const source = sourceProfiles.map((profile) =>\n filteredRows.length === 0\n ? emptyFieldProfile(profile)\n : buildFieldProfile(\n profile.name,\n profileColumn(profile.name),\n profile.dataType\n )\n );\n const calculated = calculations.map((calculation) => {\n const allColumnData = getColumnData(calculation.resultColumnName);\n const filteredColumnData = Object.fromEntries(\n filteredRows.map((row) => [row.__ID, allColumnData[row.__ID]])\n ) as Record<number, datum>;\n const profile = buildFieldProfile(\n calculation.resultColumnName,\n allColumnData\n );\n return filteredRows.length === 0\n ? emptyFieldProfile(profile)\n : buildFieldProfile(\n calculation.resultColumnName,\n filteredColumnData,\n profile.dataType\n );\n });\n\n return [...source, ...calculated];\n }, [\n sourceProfiles,\n data,\n calculations,\n getColumnData,\n crossfilterWrapper,\n chartState,\n liveItems,\n fieldSettings,\n ]);\n\n const sortedProfiles = useMemo(() => {\n if (!sortConfig.column) {\n return allProfiles;\n }\n\n return [...allProfiles].sort((a, b) => {\n const aValue = a[sortConfig.column!];\n const bValue = b[sortConfig.column!];\n if (aValue === bValue) {\n return 0;\n }\n if (aValue == null) {\n return 1;\n }\n if (bValue == null) {\n return -1;\n }\n const result =\n typeof aValue === \"number\" && typeof bValue === \"number\"\n ? aValue - bValue\n : String(aValue).localeCompare(String(bValue));\n return sortConfig.direction === \"asc\" ? result : -result;\n });\n }, [allProfiles, sortConfig]);\n\n // Ascending, then descending, then back to source order.\n const handleSort = (column: SummarySortColumn) => {\n setSortConfig((current) => {\n if (current.column !== column) return { column, direction: \"asc\" };\n if (current.direction === \"asc\") return { column, direction: \"desc\" };\n return { column: null, direction: \"asc\" };\n });\n };\n\n const toolbar = (\n <div className=\"eda-table-toolbar-compact\">\n <span className=\"text-muted-foreground tabular-nums\">\n {(allProfiles[0]?.totalCount ?? 0).toLocaleString()} rows\n </span>\n <ActionTooltip content=\"Export summary as CSV\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Export summary as CSV\"\n onClick={() => exportToCSV(sortedProfiles)}\n >\n <Download className=\"h-3.5 w-3.5\" />\n </Button>\n </ActionTooltip>\n </div>\n );\n\n return (\n <div className=\"eda-summary-view overflow-auto\" style={{ height }}>\n {toolbarTarget === undefined\n ? toolbar\n : toolbarTarget && createPortal(toolbar, toolbarTarget)}\n <CompactSummaryTable\n data={sortedProfiles}\n onSort={handleSort}\n sort={sortConfig}\n settings={settings}\n />\n </div>\n );\n}\n","export function SummaryTableSettingsPanel() {\n // Summary table has no additional settings beyond the base settings\n return null;\n}\n","import { BaseChartSettings, ChartDefinition } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { Info } from \"lucide-react\";\n\nimport { SummaryTable } from \"./SummaryTable\";\nimport { SummaryTableSettingsPanel } from \"./SummaryTableSettingsPanel\";\n\nexport interface SummaryTableSettings extends BaseChartSettings {\n type: \"summary\";\n // Summary table is a simple display of statistics\n // It inherits all base settings and doesn't need additional settings\n}\n\nexport const summaryTableDefinition: ChartDefinition<SummaryTableSettings> = {\n type: \"summary\",\n name: \"Summary Table\",\n description: \"Display summary statistics for your data\",\n icon: Info,\n\n component: SummaryTable,\n settingsPanel: SummaryTableSettingsPanel,\n\n createDefaultSettings: (layout) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"summary\",\n title: \"Summary Table\",\n layout,\n margin: { top: 20, right: 20, bottom: 20, left: 20 },\n }),\n\n validateSettings: () => {\n // Summary table is always valid as it shows basic statistics\n return true;\n },\n\n getFilterFunction: () => {\n // Summary table doesn't support filtering\n return () => true;\n },\n};\n"]}
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkC7GQT65O_cjs = require('./chunk-C7GQT65O.cjs');
|
|
4
|
+
var chunkMJROUIDZ_cjs = require('./chunk-MJROUIDZ.cjs');
|
|
5
|
+
var chunk5B23JVH3_cjs = require('./chunk-5B23JVH3.cjs');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var lucideReact = require('lucide-react');
|
|
8
|
+
var SelectPrimitive = require('@radix-ui/react-select');
|
|
9
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
+
|
|
11
|
+
function _interopNamespace(e) {
|
|
12
|
+
if (e && e.__esModule) return e;
|
|
13
|
+
var n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
Object.keys(e).forEach(function (k) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return e[k]; }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
n.default = e;
|
|
26
|
+
return Object.freeze(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var SelectPrimitive__namespace = /*#__PURE__*/_interopNamespace(SelectPrimitive);
|
|
30
|
+
|
|
31
|
+
function Select({
|
|
32
|
+
...props
|
|
33
|
+
}) {
|
|
34
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Root, { "data-slot": "select", ...props });
|
|
35
|
+
}
|
|
36
|
+
function SelectValue({
|
|
37
|
+
...props
|
|
38
|
+
}) {
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Value, { "data-slot": "select-value", ...props });
|
|
40
|
+
}
|
|
41
|
+
function SelectTrigger({
|
|
42
|
+
className,
|
|
43
|
+
children,
|
|
44
|
+
...props
|
|
45
|
+
}) {
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
47
|
+
SelectPrimitive__namespace.Trigger,
|
|
48
|
+
{
|
|
49
|
+
"data-slot": "select-trigger",
|
|
50
|
+
className: chunk5B23JVH3_cjs.cn(
|
|
51
|
+
"border-input data-[placeholder]:text-muted-foreground aria-invalid:border-destructive ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex h-9 w-full items-center justify-between rounded-md border bg-transparent px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-0 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&>span]:line-clamp-1",
|
|
52
|
+
className
|
|
53
|
+
),
|
|
54
|
+
...props,
|
|
55
|
+
children: [
|
|
56
|
+
children,
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "size-4 opacity-50" }) })
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
function SelectContent({
|
|
63
|
+
className,
|
|
64
|
+
children,
|
|
65
|
+
position = "popper",
|
|
66
|
+
...props
|
|
67
|
+
}) {
|
|
68
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
69
|
+
SelectPrimitive__namespace.Content,
|
|
70
|
+
{
|
|
71
|
+
"data-slot": "select-content",
|
|
72
|
+
className: chunk5B23JVH3_cjs.cn(
|
|
73
|
+
"bg-popover text-popover-foreground motion-safe:data-[state=open]:animate-in motion-safe:data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border shadow-md",
|
|
74
|
+
position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
|
75
|
+
className
|
|
76
|
+
),
|
|
77
|
+
position,
|
|
78
|
+
...props,
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectScrollUpButton, {}),
|
|
81
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
82
|
+
SelectPrimitive__namespace.Viewport,
|
|
83
|
+
{
|
|
84
|
+
className: chunk5B23JVH3_cjs.cn(
|
|
85
|
+
"p-1",
|
|
86
|
+
position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
|
|
87
|
+
),
|
|
88
|
+
children
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectScrollDownButton, {})
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
) });
|
|
95
|
+
}
|
|
96
|
+
function SelectItem({
|
|
97
|
+
className,
|
|
98
|
+
children,
|
|
99
|
+
...props
|
|
100
|
+
}) {
|
|
101
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
102
|
+
SelectPrimitive__namespace.Item,
|
|
103
|
+
{
|
|
104
|
+
"data-slot": "select-item",
|
|
105
|
+
className: chunk5B23JVH3_cjs.cn(
|
|
106
|
+
"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
|
|
107
|
+
className
|
|
108
|
+
),
|
|
109
|
+
...props,
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "size-4" }) }) }),
|
|
112
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, { children })
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
function SelectScrollUpButton({
|
|
118
|
+
className,
|
|
119
|
+
...props
|
|
120
|
+
}) {
|
|
121
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
122
|
+
SelectPrimitive__namespace.ScrollUpButton,
|
|
123
|
+
{
|
|
124
|
+
"data-slot": "select-scroll-up-button",
|
|
125
|
+
className: chunk5B23JVH3_cjs.cn(
|
|
126
|
+
"flex cursor-default items-center justify-center py-1",
|
|
127
|
+
className
|
|
128
|
+
),
|
|
129
|
+
...props,
|
|
130
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "size-4" })
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
function SelectScrollDownButton({
|
|
135
|
+
className,
|
|
136
|
+
...props
|
|
137
|
+
}) {
|
|
138
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
139
|
+
SelectPrimitive__namespace.ScrollDownButton,
|
|
140
|
+
{
|
|
141
|
+
"data-slot": "select-scroll-down-button",
|
|
142
|
+
className: chunk5B23JVH3_cjs.cn(
|
|
143
|
+
"flex cursor-default items-center justify-center py-1",
|
|
144
|
+
className
|
|
145
|
+
),
|
|
146
|
+
...props,
|
|
147
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "size-4" })
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
var dataTypes = ["numeric", "categorical", "datetime", "boolean"];
|
|
152
|
+
var formats = [
|
|
153
|
+
"auto",
|
|
154
|
+
"number",
|
|
155
|
+
"currency",
|
|
156
|
+
"percent",
|
|
157
|
+
"date",
|
|
158
|
+
"datetime"
|
|
159
|
+
];
|
|
160
|
+
function FieldInspector({ field, children, open, onOpenChange }) {
|
|
161
|
+
const fieldSettings = chunk5B23JVH3_cjs.useDataLayer((state) => state.fieldSettings);
|
|
162
|
+
const updateFieldSettings = chunk5B23JVH3_cjs.useDataLayer(
|
|
163
|
+
(state) => state.updateFieldSettings
|
|
164
|
+
);
|
|
165
|
+
const getFieldConversionPreview = chunk5B23JVH3_cjs.useDataLayer(
|
|
166
|
+
(state) => state.getFieldConversionPreview
|
|
167
|
+
);
|
|
168
|
+
const getFieldLabel = chunk5B23JVH3_cjs.useDataLayer((state) => state.getFieldLabel);
|
|
169
|
+
const getColumnData = chunk5B23JVH3_cjs.useDataLayer((state) => state.getColumnData);
|
|
170
|
+
const calculations = chunk5B23JVH3_cjs.useDataLayer((state) => state.calculations);
|
|
171
|
+
const fieldProfiles = chunk5B23JVH3_cjs.useDataLayer((state) => state.fieldProfiles);
|
|
172
|
+
const [draft, setDraft] = react.useState({});
|
|
173
|
+
const [showAllFailures, setShowAllFailures] = react.useState(false);
|
|
174
|
+
const [localOpen, setLocalOpen] = react.useState(false);
|
|
175
|
+
const isOpen = open ?? localOpen;
|
|
176
|
+
const setOpen = onOpenChange ?? setLocalOpen;
|
|
177
|
+
react.useEffect(() => {
|
|
178
|
+
if (isOpen && field) {
|
|
179
|
+
setDraft((fieldSettings ?? {})[field] ?? {});
|
|
180
|
+
setShowAllFailures(false);
|
|
181
|
+
}
|
|
182
|
+
}, [isOpen, field, fieldSettings]);
|
|
183
|
+
const applied = field ? (fieldSettings ?? {})[field] ?? {} : {};
|
|
184
|
+
const isCalculated = Boolean(
|
|
185
|
+
field && (calculations ?? []).some(
|
|
186
|
+
(calculation) => calculation.resultColumnName === field
|
|
187
|
+
)
|
|
188
|
+
);
|
|
189
|
+
const calculatedProfile = (fieldProfiles ?? []).find(
|
|
190
|
+
(profile) => profile.name === field
|
|
191
|
+
);
|
|
192
|
+
const preview = react.useMemo(() => {
|
|
193
|
+
if (!isOpen || !field) return null;
|
|
194
|
+
if (!isCalculated) return getFieldConversionPreview(field, draft);
|
|
195
|
+
const values = getColumnData(field);
|
|
196
|
+
const rows = Object.values(values).map((value) => ({ [field]: value }));
|
|
197
|
+
return chunk5B23JVH3_cjs.buildConversionPreview(
|
|
198
|
+
field,
|
|
199
|
+
rows,
|
|
200
|
+
draft,
|
|
201
|
+
calculatedProfile?.dataType ?? "categorical"
|
|
202
|
+
);
|
|
203
|
+
}, [
|
|
204
|
+
field,
|
|
205
|
+
getFieldConversionPreview,
|
|
206
|
+
getColumnData,
|
|
207
|
+
calculatedProfile?.dataType,
|
|
208
|
+
isCalculated,
|
|
209
|
+
isOpen,
|
|
210
|
+
draft
|
|
211
|
+
]);
|
|
212
|
+
const settingsError = chunk5B23JVH3_cjs.getFieldSettingsError(draft);
|
|
213
|
+
const conversionChanged = !isCalculated && (draft.type !== applied.type || draft.datePreset !== applied.datePreset || JSON.stringify(draft.nullTokens ?? []) !== JSON.stringify(applied.nullTokens ?? []));
|
|
214
|
+
if (!field) return null;
|
|
215
|
+
const update = (next) => setDraft((current) => ({ ...current, ...next }));
|
|
216
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkMJROUIDZ_cjs.Popover, { open: isOpen, onOpenChange: setOpen, modal: false, children: [
|
|
217
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.ActionTooltip, { content: `Inspect ${getFieldLabel(field)}`, children: /* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.PopoverTrigger, { asChild: true, children: children ?? /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.Button, { variant: "ghost", size: "icon", "aria-label": `Inspect ${field}`, children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings2, { className: "h-4 w-4" }) }) }) }),
|
|
218
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
219
|
+
chunkMJROUIDZ_cjs.PopoverContent,
|
|
220
|
+
{
|
|
221
|
+
"aria-label": `Inspect field: ${getFieldLabel(field)}`,
|
|
222
|
+
align: "start",
|
|
223
|
+
side: "bottom",
|
|
224
|
+
collisionPadding: 12,
|
|
225
|
+
className: "w-[min(400px,calc(100vw-24px))] max-h-[min(480px,var(--radix-popover-content-available-height))] overflow-y-auto p-3",
|
|
226
|
+
children: [
|
|
227
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 space-y-1", children: [
|
|
228
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm font-semibold", children: [
|
|
229
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings2, { className: "h-4 w-4" }),
|
|
230
|
+
"Inspect field: ",
|
|
231
|
+
getFieldLabel(field)
|
|
232
|
+
] }),
|
|
233
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: field !== getFieldLabel(field) ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
234
|
+
"Source name: ",
|
|
235
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { children: field })
|
|
236
|
+
] }) : "Field settings for this analysis" })
|
|
237
|
+
] }),
|
|
238
|
+
preview && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 flex flex-wrap gap-x-3 gap-y-1 rounded bg-muted/50 px-2 py-2 text-xs", children: [
|
|
239
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-x-3 gap-y-1", children: [
|
|
240
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
241
|
+
"Inferred: ",
|
|
242
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: preview.inferredType })
|
|
243
|
+
] }),
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
245
|
+
"Effective: ",
|
|
246
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: preview.effectiveType })
|
|
247
|
+
] }),
|
|
248
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
249
|
+
preview.validCount,
|
|
250
|
+
" valid"
|
|
251
|
+
] }),
|
|
252
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
253
|
+
preview.missingCount,
|
|
254
|
+
" missing"
|
|
255
|
+
] }),
|
|
256
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
257
|
+
preview.failedCount,
|
|
258
|
+
" failed"
|
|
259
|
+
] })
|
|
260
|
+
] }),
|
|
261
|
+
preview.failedCount > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 text-destructive", children: "Invalid values become missing. Review the failed rows below." })
|
|
262
|
+
] }),
|
|
263
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkC7GQT65O_cjs.Tabs, { defaultValue: "display", children: [
|
|
264
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkC7GQT65O_cjs.TabsList, { className: "grid h-8 w-full grid-cols-3", children: [
|
|
265
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkC7GQT65O_cjs.TabsTrigger, { value: "display", className: "text-xs", children: "Display" }),
|
|
266
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkC7GQT65O_cjs.TabsTrigger, { value: "type", className: "text-xs", children: "Type" }),
|
|
267
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkC7GQT65O_cjs.TabsTrigger, { value: "preview", className: "text-xs", children: "Preview" })
|
|
268
|
+
] }),
|
|
269
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkC7GQT65O_cjs.TabsContent, { value: "display", className: "mt-3 space-y-3", children: [
|
|
270
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
271
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { htmlFor: "field-label", children: "Display label" }),
|
|
272
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
273
|
+
chunkMJROUIDZ_cjs.Input,
|
|
274
|
+
{
|
|
275
|
+
id: "field-label",
|
|
276
|
+
value: draft.label ?? "",
|
|
277
|
+
placeholder: field,
|
|
278
|
+
onChange: (event) => update({ label: event.target.value })
|
|
279
|
+
}
|
|
280
|
+
)
|
|
281
|
+
] }),
|
|
282
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
283
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { htmlFor: "field-description", children: "Description" }),
|
|
284
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
285
|
+
chunkMJROUIDZ_cjs.Input,
|
|
286
|
+
{
|
|
287
|
+
id: "field-description",
|
|
288
|
+
value: draft.description ?? "",
|
|
289
|
+
onChange: (event) => update({ description: event.target.value })
|
|
290
|
+
}
|
|
291
|
+
)
|
|
292
|
+
] }),
|
|
293
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
294
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
295
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { children: "Display format" }),
|
|
296
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
297
|
+
Select,
|
|
298
|
+
{
|
|
299
|
+
value: draft.format ?? "auto",
|
|
300
|
+
onValueChange: (value) => update({ format: value }),
|
|
301
|
+
children: [
|
|
302
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { "aria-label": "Display format", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, {}) }),
|
|
303
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: formats.map((format) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: format, children: format }, format)) })
|
|
304
|
+
]
|
|
305
|
+
}
|
|
306
|
+
)
|
|
307
|
+
] }),
|
|
308
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
309
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { htmlFor: "field-precision", children: "Precision" }),
|
|
310
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
311
|
+
chunkMJROUIDZ_cjs.Input,
|
|
312
|
+
{
|
|
313
|
+
id: "field-precision",
|
|
314
|
+
type: "number",
|
|
315
|
+
min: 0,
|
|
316
|
+
max: 20,
|
|
317
|
+
value: draft.precision ?? "",
|
|
318
|
+
onChange: (event) => update({
|
|
319
|
+
precision: event.target.value === "" ? void 0 : Number(event.target.value)
|
|
320
|
+
})
|
|
321
|
+
}
|
|
322
|
+
)
|
|
323
|
+
] }),
|
|
324
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
325
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { htmlFor: "field-unit", children: "Unit suffix" }),
|
|
326
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
327
|
+
chunkMJROUIDZ_cjs.Input,
|
|
328
|
+
{
|
|
329
|
+
id: "field-unit",
|
|
330
|
+
value: draft.unit ?? "",
|
|
331
|
+
placeholder: "kg, ms, USD",
|
|
332
|
+
onChange: (event) => update({ unit: event.target.value })
|
|
333
|
+
}
|
|
334
|
+
)
|
|
335
|
+
] }),
|
|
336
|
+
draft.format === "currency" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
337
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { htmlFor: "field-currency", children: "Currency code" }),
|
|
338
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
339
|
+
chunkMJROUIDZ_cjs.Input,
|
|
340
|
+
{
|
|
341
|
+
id: "field-currency",
|
|
342
|
+
value: draft.currency ?? "USD",
|
|
343
|
+
maxLength: 3,
|
|
344
|
+
onChange: (event) => update({ currency: event.target.value.toUpperCase() })
|
|
345
|
+
}
|
|
346
|
+
)
|
|
347
|
+
] })
|
|
348
|
+
] })
|
|
349
|
+
] }),
|
|
350
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkC7GQT65O_cjs.TabsContent, { value: "type", className: "mt-3 space-y-3", children: [
|
|
351
|
+
isCalculated && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "This is a calculated field. Its formula controls the runtime type. Use the formula editor for type changes; this inspector controls display settings and previews calculated values." }),
|
|
352
|
+
preview && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
353
|
+
" ",
|
|
354
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-2 text-muted-foreground", children: [
|
|
355
|
+
"Automatic inference currently treats this field as",
|
|
356
|
+
" ",
|
|
357
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: preview.inferredType }),
|
|
358
|
+
". An override changes runtime values, filters, calculations, and chart positions."
|
|
359
|
+
] })
|
|
360
|
+
] }),
|
|
361
|
+
!isCalculated && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
362
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { children: "Type override" }),
|
|
363
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
364
|
+
Select,
|
|
365
|
+
{
|
|
366
|
+
value: draft.type ?? "auto",
|
|
367
|
+
onValueChange: (value) => update({
|
|
368
|
+
type: value === "auto" ? void 0 : value
|
|
369
|
+
}),
|
|
370
|
+
children: [
|
|
371
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { "aria-label": "Type override", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, {}) }),
|
|
372
|
+
/* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { children: [
|
|
373
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "auto", children: "Automatic" }),
|
|
374
|
+
dataTypes.map((type) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: type, children: type }, type))
|
|
375
|
+
] })
|
|
376
|
+
]
|
|
377
|
+
}
|
|
378
|
+
)
|
|
379
|
+
] }),
|
|
380
|
+
!isCalculated && draft.type === "datetime" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
381
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { children: "Date input preset" }),
|
|
382
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
383
|
+
Select,
|
|
384
|
+
{
|
|
385
|
+
value: draft.datePreset ?? "iso",
|
|
386
|
+
onValueChange: (value) => update({ datePreset: value }),
|
|
387
|
+
children: [
|
|
388
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { "aria-label": "Date input preset", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, {}) }),
|
|
389
|
+
/* @__PURE__ */ jsxRuntime.jsxs(SelectContent, { children: [
|
|
390
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "iso", children: "ISO" }),
|
|
391
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "month-day-year", children: "Month / day / year" }),
|
|
392
|
+
/* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: "day-month-year", children: "Day / month / year" })
|
|
393
|
+
] })
|
|
394
|
+
]
|
|
395
|
+
}
|
|
396
|
+
)
|
|
397
|
+
] }),
|
|
398
|
+
!isCalculated && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
399
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkMJROUIDZ_cjs.Label, { htmlFor: "field-null-tokens", children: "Null tokens" }),
|
|
400
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
401
|
+
chunkMJROUIDZ_cjs.Input,
|
|
402
|
+
{
|
|
403
|
+
id: "field-null-tokens",
|
|
404
|
+
value: draft.nullTokens?.join(", ") ?? "",
|
|
405
|
+
placeholder: "NA, N/A, -",
|
|
406
|
+
onChange: (event) => update({
|
|
407
|
+
nullTokens: event.target.value.split(",").map((token) => token.trim()).filter(Boolean)
|
|
408
|
+
})
|
|
409
|
+
}
|
|
410
|
+
)
|
|
411
|
+
] }),
|
|
412
|
+
conversionChanged && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2 rounded-md border border-warning/40 bg-warning/10 p-3 text-xs", children: [
|
|
413
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { className: "mt-0.5 h-4 w-4 shrink-0 text-warning" }),
|
|
414
|
+
"Applying a type, date preset, or null-token change clears filters for this field."
|
|
415
|
+
] })
|
|
416
|
+
] }),
|
|
417
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkC7GQT65O_cjs.TabsContent, { value: "preview", className: "mt-3", children: [
|
|
418
|
+
preview && preview.examples.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
419
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xs font-medium", children: "Conversion preview" }),
|
|
420
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto rounded-md border", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full text-xs", children: [
|
|
421
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b text-left", children: [
|
|
422
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "p-2", children: "Row" }),
|
|
423
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "p-2", children: "Raw" }),
|
|
424
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "p-2", children: "Runtime" })
|
|
425
|
+
] }) }),
|
|
426
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: preview.examples.map((example) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
427
|
+
"tr",
|
|
428
|
+
{
|
|
429
|
+
className: "border-b last:border-0",
|
|
430
|
+
children: [
|
|
431
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2 tabular-nums", children: example.row + 1 }),
|
|
432
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2 font-mono", children: String(example.raw) }),
|
|
433
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2", children: String(example.value ?? "Missing") })
|
|
434
|
+
]
|
|
435
|
+
},
|
|
436
|
+
example.row
|
|
437
|
+
)) })
|
|
438
|
+
] }) })
|
|
439
|
+
] }),
|
|
440
|
+
preview && preview.failures.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 space-y-1.5 text-xs", children: [
|
|
441
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-medium text-destructive", children: "Failed rows" }),
|
|
442
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "max-h-24 overflow-y-auto text-muted-foreground", children: (showAllFailures ? preview.failures : preview.failures.slice(0, 12)).map((failure) => /* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
443
|
+
"Row ",
|
|
444
|
+
failure.row + 1,
|
|
445
|
+
": ",
|
|
446
|
+
String(failure.raw),
|
|
447
|
+
" \u2014",
|
|
448
|
+
" ",
|
|
449
|
+
failure.reason
|
|
450
|
+
] }, failure.row)) }),
|
|
451
|
+
preview.failures.length > 12 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
452
|
+
chunk5B23JVH3_cjs.Button,
|
|
453
|
+
{
|
|
454
|
+
variant: "ghost",
|
|
455
|
+
size: "sm",
|
|
456
|
+
onClick: () => setShowAllFailures((current) => !current),
|
|
457
|
+
children: showAllFailures ? "Show fewer failed rows" : `Show all ${preview.failures.length} failed rows`
|
|
458
|
+
}
|
|
459
|
+
)
|
|
460
|
+
] }),
|
|
461
|
+
!preview?.examples.length && !preview?.failures.length && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "No conversion issues or sample rows." })
|
|
462
|
+
] })
|
|
463
|
+
] }),
|
|
464
|
+
settingsError && /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "text-xs text-destructive", children: settingsError }),
|
|
465
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sticky bottom-[-16px] mt-4 flex justify-end gap-2 border-t bg-popover py-3", children: [
|
|
466
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.Button, { variant: "outline", size: "sm", onClick: () => setOpen(false), children: "Cancel" }),
|
|
467
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
468
|
+
chunk5B23JVH3_cjs.Button,
|
|
469
|
+
{
|
|
470
|
+
size: "sm",
|
|
471
|
+
disabled: Boolean(settingsError),
|
|
472
|
+
onClick: () => {
|
|
473
|
+
updateFieldSettings(field, draft);
|
|
474
|
+
setOpen(false);
|
|
475
|
+
},
|
|
476
|
+
children: "Apply field settings"
|
|
477
|
+
}
|
|
478
|
+
)
|
|
479
|
+
] })
|
|
480
|
+
]
|
|
481
|
+
}
|
|
482
|
+
)
|
|
483
|
+
] });
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
exports.FieldInspector = FieldInspector;
|
|
487
|
+
//# sourceMappingURL=chunk-PRMC2A6P.cjs.map
|
|
488
|
+
//# sourceMappingURL=chunk-PRMC2A6P.cjs.map
|