drizzle-cube 0.11.2 → 0.12.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/dist/adapters/ActivityGridChart.config-D2pyoHSf.cjs +1 -0
- package/dist/adapters/ActivityGridChart.config-DW-AgFxA.js +2 -0
- package/dist/adapters/AreaChart.config-BP3BU4W2.js +2 -0
- package/dist/adapters/AreaChart.config-CRyAhIvc.cjs +1 -0
- package/dist/adapters/BarChart.config-A6F0Q9OX.cjs +1 -0
- package/dist/adapters/BarChart.config-BInCLrWt.js +2 -0
- package/dist/adapters/BoxPlotChart.config-DUTvglWv.cjs +1 -0
- package/dist/adapters/BoxPlotChart.config-DXvJdMSr.js +2 -0
- package/dist/adapters/BubbleChart.config-B66v-bb5.cjs +1 -0
- package/dist/adapters/BubbleChart.config-nIFyWuBW.js +2 -0
- package/dist/adapters/CandlestickChart.config-C05c1RMZ.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-D4axcOge.js +2 -0
- package/dist/adapters/DataTable.config-BOIQnyoS.js +2 -0
- package/dist/adapters/DataTable.config-CeFswxJI.cjs +1 -0
- package/dist/adapters/DotStripChart.config-B4DU-F1R.cjs +1 -0
- package/dist/adapters/DotStripChart.config-BsWG7BRS.js +2 -0
- package/dist/adapters/FunnelChart.config-BuAkxiFx.js +2 -0
- package/dist/adapters/FunnelChart.config-CEVsDKfR.cjs +1 -0
- package/dist/adapters/GaugeChart.config-JhbBQ77o.cjs +1 -0
- package/dist/adapters/GaugeChart.config-g3iF-G9g.js +2 -0
- package/dist/adapters/HeatMapChart.config-BzSlU0B1.cjs +1 -0
- package/dist/adapters/HeatMapChart.config-C6D638Sr.js +2 -0
- package/dist/adapters/KpiDelta.config-B5UKJ4n-.js +2 -0
- package/dist/adapters/KpiDelta.config-C3E_pfdr.cjs +1 -0
- package/dist/adapters/KpiNumber.config-B8mACkJy.js +2 -0
- package/dist/adapters/KpiNumber.config-BgNPzbNS.cjs +1 -0
- package/dist/adapters/KpiText.config-BsXkIGNW.js +2 -0
- package/dist/adapters/KpiText.config-vp2VuogK.cjs +1 -0
- package/dist/adapters/LineChart.config-B3NcBB9q.cjs +1 -0
- package/dist/adapters/LineChart.config-D_CAQVHv.js +2 -0
- package/dist/adapters/MarkdownChart.config-D_oVj4zs.js +2 -0
- package/dist/adapters/MarkdownChart.config-zhKb-tLR.cjs +1 -0
- package/dist/adapters/MeasureProfileChart.config-B-wBjGdA.cjs +1 -0
- package/dist/adapters/MeasureProfileChart.config-bRBJlzNa.js +2 -0
- package/dist/adapters/PieChart.config-CR9SlQ2E.cjs +1 -0
- package/dist/adapters/PieChart.config-DeGWqMNO.js +2 -0
- package/dist/adapters/ProportionBarChart.config-Bz0ssM8J.cjs +1 -0
- package/dist/adapters/ProportionBarChart.config-CXhHPnpM.js +2 -0
- package/dist/adapters/RadarChart.config-ColTmOOV.js +2 -0
- package/dist/adapters/RadarChart.config-QV34AUcy.cjs +1 -0
- package/dist/adapters/RadialBarChart.config-BU4kj-pP.js +2 -0
- package/dist/adapters/RadialBarChart.config-CxBOhmiO.cjs +1 -0
- package/dist/adapters/RecordsTable.config-B51ugEpH.js +2 -0
- package/dist/adapters/RecordsTable.config-LxS0O10c.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-DjunHInA.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-Xna3wl8a.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-DJBHUdn1.cjs +1 -0
- package/dist/adapters/RetentionHeatmap.config-DMAmGV7x.js +2 -0
- package/dist/adapters/SankeyChart.config-CKuUbXMt.js +2 -0
- package/dist/adapters/SankeyChart.config-JrhBtNH4.cjs +1 -0
- package/dist/adapters/ScatterChart.config-BARL2-vh.cjs +1 -0
- package/dist/adapters/ScatterChart.config-Ch4yWKYL.js +2 -0
- package/dist/adapters/SunburstChart.config-CbvgqJ8d.cjs +1 -0
- package/dist/adapters/SunburstChart.config-Q89VT8vO.js +2 -0
- package/dist/adapters/TreeMapChart.config-Bee0ahde.js +2 -0
- package/dist/adapters/TreeMapChart.config-Dz1mOrnC.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-BCJ4ZD6x.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-Bz3tEEKN.js +2 -0
- package/dist/adapters/{compiler-BhityGUO.js → compiler-Cfy_zqyJ.js} +1 -1
- package/dist/adapters/{compiler-B-yljK02.cjs → compiler-ia3Lmjpw.cjs} +1 -1
- package/dist/adapters/core/index.cjs +1 -1
- package/dist/adapters/core/index.js +1 -1
- package/dist/adapters/{core-CQOrzBNh.cjs → core-ClA09uBX.cjs} +1 -1
- package/dist/adapters/{core-xZE0miIu.js → core-D4mTEaeK.js} +2 -2
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +5 -5
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +5 -5
- package/dist/adapters/{handler-ByeQ0-1r.js → handler-Bnp5LEMQ.js} +34 -33
- package/dist/adapters/{handler-DSNmfv1R.cjs → handler-TCnGdCyr.cjs} +3 -3
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +4 -4
- package/dist/adapters/mcp-app-html-D37s8SEa.js +5 -0
- package/dist/adapters/mcp-app-html-MZNCuL3w.cjs +1 -0
- package/dist/adapters/mcp-app-html.cjs +1 -1
- package/dist/adapters/mcp-app-html.js +1 -1
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +3 -3
- package/dist/adapters/{mcp-transport-DnLP5FPL.cjs → mcp-transport-6CWmHVtJ.cjs} +2 -2
- package/dist/adapters/{mcp-transport-Cy6n4uj1.js → mcp-transport-cd2BlW-Z.js} +28 -4
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +5 -5
- package/dist/adapters/{openai-D3Nt6Bj7.js → openai-CIIYPf0X.js} +1 -1
- package/dist/adapters/{openai-z1ai-G4Q.cjs → openai-Cl5zHeHg.cjs} +1 -1
- package/dist/adapters/{openai-C4HrjyJj.js → openai-DioFEjMP.js} +1 -1
- package/dist/adapters/{openai-BQl0yJCS.cjs → openai-yJ8nX3dq.cjs} +1 -1
- package/dist/adapters/{utils-BaxFceDq.js → utils-B3_hJWlf.js} +9 -0
- package/dist/adapters/{utils-a2p2B6x8.cjs → utils-CeveyqY3.cjs} +1 -1
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.js +1 -1
- package/dist/cjs/client/charts/chartConfigs.d.ts +17 -0
- package/dist/cjs/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +9 -2
- package/dist/cjs/client/types.d.ts +15 -1
- package/dist/cjs/client/utils/recordsTableUtils.d.ts +6 -3
- package/dist/cjs/server/ai/chart-schema.d.ts +25 -2
- package/dist/client/charts/chartConfigs.d.ts +17 -0
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/{DashboardEditModal-BrZuaG5z.js → DashboardEditModal-BFC08Qog.js} +315 -198
- package/dist/client/chunks/DashboardEditModal-BFC08Qog.js.map +1 -0
- package/dist/client/chunks/{DotStripChart-B9IVCFPO.js → DotStripChart-BwitDmpR.js} +3 -3
- package/dist/client/chunks/{DotStripChart-B9IVCFPO.js.map → DotStripChart-BwitDmpR.js.map} +1 -1
- package/dist/client/chunks/{ProportionBarChart-DieF9AzP.js → ProportionBarChart-CpUHH9UH.js} +3 -3
- package/dist/client/chunks/{ProportionBarChart-DieF9AzP.js.map → ProportionBarChart-CpUHH9UH.js.map} +1 -1
- package/dist/client/chunks/{RecordsTable-Mo3ai5_M.js → RecordsTable-BoQZiVVM.js} +85 -63
- package/dist/client/chunks/RecordsTable-BoQZiVVM.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-Bie4ADyA.js → RetentionCombinedChart-Dd07baUu.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-Bie4ADyA.js.map → RetentionCombinedChart-Dd07baUu.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-qstIAx5B.js → RetentionHeatmap-DlD2XmJe.js} +2 -2
- package/dist/client/chunks/{RetentionHeatmap-qstIAx5B.js.map → RetentionHeatmap-DlD2XmJe.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-CwKFNoe7.js → analysis-builder-DVWOTd7e.js} +9 -9
- package/dist/client/chunks/{analysis-builder-CwKFNoe7.js.map → analysis-builder-DVWOTd7e.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-D1SsD4qC.js → analysis-builder-shared-CXDGMDB-.js} +9 -9
- package/dist/client/chunks/{analysis-builder-shared-D1SsD4qC.js.map → analysis-builder-shared-CXDGMDB-.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-Ly_-2B-f.js → chart-activity-grid-BHaBagS8.js} +12 -3
- package/dist/client/chunks/chart-activity-grid-BHaBagS8.js.map +1 -0
- package/dist/client/chunks/{chart-area-D3l-71Wy.js → chart-area-9lHCX2OO.js} +2 -2
- package/dist/client/chunks/{chart-area-D3l-71Wy.js.map → chart-area-9lHCX2OO.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-BaTyQOqs.js → chart-bar-Dk1CH41V.js} +3 -3
- package/dist/client/chunks/{chart-bar-BaTyQOqs.js.map → chart-bar-Dk1CH41V.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-Cem6PHjz.js → chart-box-plot-CMkzjTFz.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-Cem6PHjz.js.map → chart-box-plot-CMkzjTFz.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-DFlfqCDG.js → chart-bubble-q8f7wXlp.js} +2 -2
- package/dist/client/chunks/{chart-bubble-DFlfqCDG.js.map → chart-bubble-q8f7wXlp.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-BkAFBXtZ.js → chart-candlestick-DTX3wu-1.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-BkAFBXtZ.js.map → chart-candlestick-DTX3wu-1.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-Cxd0cdAl.js → chart-data-table-BYQzVqtc.js} +4 -3
- package/dist/client/chunks/chart-data-table-BYQzVqtc.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-71Kn4eeF.js → chart-funnel-CxW1voDU.js} +2 -2
- package/dist/client/chunks/{chart-funnel-71Kn4eeF.js.map → chart-funnel-CxW1voDU.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-BddS_9oS.js → chart-gauge-0M-Jufnw.js} +3 -3
- package/dist/client/chunks/{chart-gauge-BddS_9oS.js.map → chart-gauge-0M-Jufnw.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-BQIsrn8m.js → chart-heat-map-BZvPdZAu.js} +3 -3
- package/dist/client/chunks/{chart-heat-map-BQIsrn8m.js.map → chart-heat-map-BZvPdZAu.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-DndbqdZT.js → chart-kpi-delta-De-F9NUk.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-DndbqdZT.js.map → chart-kpi-delta-De-F9NUk.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-DAbfoHMt.js → chart-kpi-number-MSdv2_ha.js} +5 -5
- package/dist/client/chunks/{chart-kpi-number-DAbfoHMt.js.map → chart-kpi-number-MSdv2_ha.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-D8oQgpxL.js → chart-kpi-text-Zt9JlUi2.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-D8oQgpxL.js.map → chart-kpi-text-Zt9JlUi2.js.map} +1 -1
- package/dist/client/chunks/{chart-line-BNqjUowg.js → chart-line-VFRY7_Zn.js} +3 -3
- package/dist/client/chunks/{chart-line-BNqjUowg.js.map → chart-line-VFRY7_Zn.js.map} +1 -1
- package/dist/client/chunks/{chart-markdown-XWU1MyCy.js → chart-markdown-RumOX5HX.js} +2 -2
- package/dist/client/chunks/{chart-markdown-XWU1MyCy.js.map → chart-markdown-RumOX5HX.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-D5nZMWlI.js → chart-measure-profile-5FFyPuV_.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-D5nZMWlI.js.map → chart-measure-profile-5FFyPuV_.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-D8r9HCZ4.js → chart-pie-Bf5SbxZt.js} +3 -3
- package/dist/client/chunks/{chart-pie-D8r9HCZ4.js.map → chart-pie-Bf5SbxZt.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-R4PuCIWp.js → chart-radar-D9NgUbth.js} +3 -3
- package/dist/client/chunks/{chart-radar-R4PuCIWp.js.map → chart-radar-D9NgUbth.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-hmrSFa6O.js → chart-radial-bar-BlFXSc1c.js} +3 -3
- package/dist/client/chunks/{chart-radial-bar-hmrSFa6O.js.map → chart-radial-bar-BlFXSc1c.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-CFXPybny.js → chart-sankey-BkanN_ql.js} +2 -2
- package/dist/client/chunks/{chart-sankey-CFXPybny.js.map → chart-sankey-BkanN_ql.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-CH82md0L.js → chart-scatter-DqqWojlQ.js} +3 -3
- package/dist/client/chunks/{chart-scatter-CH82md0L.js.map → chart-scatter-DqqWojlQ.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-CTj95eEC.js → chart-sunburst-BMhXLThV.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-CTj95eEC.js.map → chart-sunburst-BMhXLThV.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-CmysE4bF.js → chart-tree-map-eaHTIJ76.js} +3 -3
- package/dist/client/chunks/{chart-tree-map-CmysE4bF.js.map → chart-tree-map-eaHTIJ76.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-Bv1mPvlB.js → chart-waterfall-4MOpuCrR.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-Bv1mPvlB.js.map → chart-waterfall-4MOpuCrR.js.map} +1 -1
- package/dist/client/chunks/{charts-core-BdEQgbqN.js → charts-core-CTTLxFYp.js} +2 -2
- package/dist/client/chunks/{charts-core-BdEQgbqN.js.map → charts-core-CTTLxFYp.js.map} +1 -1
- package/dist/client/chunks/charts-loader-DQ7MgPWB.js +87 -0
- package/dist/client/chunks/{charts-loader-DMdE-Azc.js.map → charts-loader-DQ7MgPWB.js.map} +1 -1
- package/dist/client/chunks/{en-US-HP6FHuNy.js → en-US-CXODg-om.js} +3 -1
- package/dist/client/chunks/{en-US-HP6FHuNy.js.map → en-US-CXODg-om.js.map} +1 -1
- package/dist/client/chunks/{nl-NL-DVZXf8U7.js → nl-NL-CpH637df.js} +10 -1
- package/dist/client/chunks/nl-NL-CpH637df.js.map +1 -0
- package/dist/client/chunks/{schema-visualization-MlRrcJQH.js → schema-visualization-26uy1UwE.js} +3 -3
- package/dist/client/chunks/{schema-visualization-MlRrcJQH.js.map → schema-visualization-26uy1UwE.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-DUyYwuN_.js → useDirtyStateTracking-CnEIH78A.js} +4 -4
- package/dist/client/chunks/{useDirtyStateTracking-DUyYwuN_.js.map → useDirtyStateTracking-CnEIH78A.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-BtoS3tb5.js → useExplainAI-SbAIGXOr.js} +4 -4
- package/dist/client/chunks/{useExplainAI-BtoS3tb5.js.map → useExplainAI-SbAIGXOr.js.map} +1 -1
- package/dist/client/chunks/{vendor-BfBpNmMa.js → vendor-Cn44d7zS.js} +2 -2
- package/dist/client/chunks/{vendor-BfBpNmMa.js.map → vendor-Cn44d7zS.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +9 -2
- package/dist/client/components.js +1 -1
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +13 -13
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/types.d.ts +15 -1
- package/dist/client/utils/recordsTableUtils.d.ts +6 -3
- package/dist/client/utils.js +4 -4
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +69 -69
- package/dist/server/ai/chart-schema.d.ts +25 -2
- package/dist/server/index.cjs +3 -3
- package/dist/server/index.js +37 -3
- package/package.json +1 -1
- package/dist/adapters/ActivityGridChart.config-XMtoteb6.js +0 -2
- package/dist/adapters/ActivityGridChart.config-h1AXPvn0.cjs +0 -1
- package/dist/adapters/AreaChart.config-DYf9wufo.cjs +0 -1
- package/dist/adapters/AreaChart.config-We6b53aT.js +0 -2
- package/dist/adapters/BarChart.config-4SX44IYv.cjs +0 -1
- package/dist/adapters/BarChart.config-CwBnyptL.js +0 -2
- package/dist/adapters/BoxPlotChart.config-BzNe-FlW.cjs +0 -1
- package/dist/adapters/BoxPlotChart.config-mfAHqmcp.js +0 -2
- package/dist/adapters/BubbleChart.config-CBT5jMdc.cjs +0 -1
- package/dist/adapters/BubbleChart.config-DxG_Umal.js +0 -2
- package/dist/adapters/CandlestickChart.config-Cqw3XP1h.js +0 -2
- package/dist/adapters/CandlestickChart.config-DPSSlzUD.cjs +0 -1
- package/dist/adapters/DataTable.config-DS1bvaDu.js +0 -2
- package/dist/adapters/DataTable.config-D_NsMeyz.cjs +0 -1
- package/dist/adapters/DotStripChart.config-BApWn6QV.cjs +0 -1
- package/dist/adapters/DotStripChart.config-Bdk5-YfB.js +0 -2
- package/dist/adapters/FunnelChart.config-BT5up_Bg.cjs +0 -1
- package/dist/adapters/FunnelChart.config-ISZiz9fn.js +0 -2
- package/dist/adapters/GaugeChart.config-Biaq1cKc.cjs +0 -1
- package/dist/adapters/GaugeChart.config-BjGfB84t.js +0 -2
- package/dist/adapters/HeatMapChart.config-Bmca8KiH.cjs +0 -1
- package/dist/adapters/HeatMapChart.config-uWvR0B-N.js +0 -2
- package/dist/adapters/KpiDelta.config-CJeDdj_1.js +0 -2
- package/dist/adapters/KpiDelta.config-CKr9pAxL.cjs +0 -1
- package/dist/adapters/KpiNumber.config-6YLEF2fy.cjs +0 -1
- package/dist/adapters/KpiNumber.config-C00M46GA.js +0 -2
- package/dist/adapters/KpiText.config-C8Av_D2W.cjs +0 -1
- package/dist/adapters/KpiText.config-bKTHob0C.js +0 -2
- package/dist/adapters/LineChart.config-DH68HT_B.js +0 -2
- package/dist/adapters/LineChart.config-DPq7GvL9.cjs +0 -1
- package/dist/adapters/MarkdownChart.config-CaaJPO3c.js +0 -2
- package/dist/adapters/MarkdownChart.config-ca_UyhWJ.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-C1Il0IqL.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-DMOnkmb6.js +0 -2
- package/dist/adapters/PieChart.config-Bg-8cxWK.js +0 -2
- package/dist/adapters/PieChart.config-joJcF--K.cjs +0 -1
- package/dist/adapters/ProportionBarChart.config-B2sltKsI.cjs +0 -1
- package/dist/adapters/ProportionBarChart.config-BlCedy1v.js +0 -2
- package/dist/adapters/RadarChart.config-DD1pX6FZ.js +0 -2
- package/dist/adapters/RadarChart.config-DVCCLSVw.cjs +0 -1
- package/dist/adapters/RadialBarChart.config--VIE2jMM.js +0 -2
- package/dist/adapters/RadialBarChart.config-BZwyWhTg.cjs +0 -1
- package/dist/adapters/RecordsTable.config-CTBQc-2r.js +0 -2
- package/dist/adapters/RecordsTable.config-DPdO0DL5.cjs +0 -1
- package/dist/adapters/RetentionCombinedChart.config-PGVxnkRL.js +0 -2
- package/dist/adapters/RetentionCombinedChart.config-mX5PMh82.cjs +0 -1
- package/dist/adapters/RetentionHeatmap.config-Co-JMzBm.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-Cub3-ksy.cjs +0 -1
- package/dist/adapters/SankeyChart.config-BkIyUcAE.cjs +0 -1
- package/dist/adapters/SankeyChart.config-DGTnRmYg.js +0 -2
- package/dist/adapters/ScatterChart.config-CdZrBorg.js +0 -2
- package/dist/adapters/ScatterChart.config-CwN9niUL.cjs +0 -1
- package/dist/adapters/SunburstChart.config-D0ZkRSJv.cjs +0 -1
- package/dist/adapters/SunburstChart.config-RF3uu5Sa.js +0 -2
- package/dist/adapters/TreeMapChart.config-B2Yn_V7p.cjs +0 -1
- package/dist/adapters/TreeMapChart.config-diJtcs4D.js +0 -2
- package/dist/adapters/WaterfallChart.config-B10PxftT.cjs +0 -1
- package/dist/adapters/WaterfallChart.config-BImlkLmR.js +0 -2
- package/dist/adapters/mcp-app-html-BCkzy3a2.cjs +0 -1
- package/dist/adapters/mcp-app-html-WiSFu1oD.js +0 -5
- package/dist/client/chunks/DashboardEditModal-BrZuaG5z.js.map +0 -1
- package/dist/client/chunks/RecordsTable-Mo3ai5_M.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-Ly_-2B-f.js.map +0 -1
- package/dist/client/chunks/chart-data-table-Cxd0cdAl.js.map +0 -1
- package/dist/client/chunks/charts-loader-DMdE-Azc.js +0 -87
- package/dist/client/chunks/nl-NL-DVZXf8U7.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as e, S as t, o as n, s as r, w as i } from "./chart-activity-grid-
|
|
2
|
-
import { D as a, O as o, k as s } from "./chart-area-
|
|
1
|
+
import { F as e, S as t, o as n, s as r, w as i } from "./chart-activity-grid-BHaBagS8.js";
|
|
2
|
+
import { D as a, O as o, k as s } from "./chart-area-9lHCX2OO.js";
|
|
3
3
|
import c, { useMemo as l, useState as u } from "react";
|
|
4
4
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
5
5
|
var p = {
|
|
@@ -405,4 +405,4 @@ var D = c.memo(function({ data: m, chartConfig: h, displayConfig: _ = {}, height
|
|
|
405
405
|
//#endregion
|
|
406
406
|
export { D as default };
|
|
407
407
|
|
|
408
|
-
//# sourceMappingURL=DotStripChart-
|
|
408
|
+
//# sourceMappingURL=DotStripChart-BwitDmpR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DotStripChart-B9IVCFPO.js","names":["useTranslation","useCubeFieldLabel","useChartDimensions","CHART_COLORS","formatAxisValue","ChartConfigError","ChartEmptyState","ChartRenderError","React","DOT_RADIUS","DOT_GAP","parseNumeric","v","n","median","sortedValues","mid","laneAtStep","step","magnitude","packSwarm","minSeparation","radius","laneHeight","sorted","dots","a","b","lanes","placed","dot","x","scale","chosenLane","lane","occupied","other","swarmHeight","maxAbsLane","acc","d","needed","computeSpread","min","max","count","groupIntoBands","order","grouped","row","rows","bandLabel","bandField","value","valueField","labelField","bands","all","label","sort","medianOf","values","ma","mb","computeDomain","rawMin","rawMax","pad","computeTicks","i","GUTTER_WIDTH","AXIS_HEIGHT","PLOT_PADDING_X","GUTTER_HEIGHT_WITH_STATS","GUTTER_HEIGHT_NAME_ONLY","firstField","BandStrip","centreY","band","extremes","useMemo","showExtremeLabels","width","showGrid","ticks","tick","showMedianMarker","isExtreme","accentColor","color","drillEnabled","onDotClick","event","onDotHover","onDotLeave","DotStripChart","getFieldLabel","hovered","setHovered","useState","displayConfig","showTooltip","showBandStats","bandSort","xAxisFormat","chartConfig","t","plotWidth","dimensions","gutterHeight","empty","configError","data","domain","span","inner","group","r","palette","colorPalette","formatValue","handleDotClick","onDataPointClick","handleDotHover","containerRef","truncated","error"],"sources":["../../../src/client/components/charts/DotStripChart.helpers.ts","../../../src/client/components/charts/DotStripChart.tsx"],"sourcesContent":["/**\n * Layout maths for the dot strip (beeswarm) chart.\n *\n * Kept out of the component — like `ScatterChart.helpers.ts` and\n * `BubbleChart.render.ts` — so the swarm packing can be unit-tested without a\n * DOM. Everything here is pure: same input, same output, every time.\n */\n\n/** Hard caps so one pathological band cannot blow up the layout. */\nexport const MAX_BANDS = 50\nexport const MAX_DOTS_PER_BAND = 500\nexport const MAX_LANES = 8\n\nexport const MIN_ROW_HEIGHT = 44\nexport const MAX_ROW_HEIGHT = 220\n/** Vertical breathing room added above and below the outermost lanes. */\nexport const ROW_VERTICAL_PADDING = 12\n\nexport const DOT_RADIUS: Record<'small' | 'medium' | 'large', number> = {\n small: 3.5,\n medium: 5,\n large: 7,\n}\n\n/** Gap between the edges of two adjacent dots in the same lane. */\nexport const DOT_GAP = 1.5\n\nexport interface DotDatum {\n /** Raw numeric value of the measure. */\n value: number\n /** Identity label for the dot (from the optional series dimension). */\n label: string\n /** The source row, handed back on click. */\n row: Record<string, unknown>\n}\n\nexport interface PlacedDot extends DotDatum {\n /** Pixel x within the plot area. */\n x: number\n /** Lane index: 0 is the centre line, then +1, -1, +2, -2, … */\n lane: number\n /** Pixel y offset from the band's centre line. */\n y: number\n}\n\nexport interface BandStats {\n /** The band's own label (the value of the band dimension). */\n label: string\n dots: PlacedDot[]\n count: number\n median: number | null\n min: number | null\n max: number | null\n /**\n * max / min. `null` when it cannot be stated meaningfully — fewer than two\n * dots, or a non-positive minimum (the ratio is infinite or sign-flipped).\n */\n spread: number | null\n /** True when the band has rows but not one usable numeric value. */\n noData: boolean\n /** Rendered height of this band's row, in px. */\n height: number\n /** True when the band's dots were truncated at MAX_DOTS_PER_BAND. */\n truncated: boolean\n}\n\nexport function parseNumeric(v: unknown): number | null {\n if (v === undefined || v === null || v === '') return null\n const n = typeof v === 'number' ? v : parseFloat(String(v))\n return Number.isFinite(n) ? n : null\n}\n\nexport function median(sortedValues: number[]): number | null {\n const n = sortedValues.length\n if (n === 0) return null\n const mid = Math.floor(n / 2)\n return n % 2 === 0 ? (sortedValues[mid - 1] + sortedValues[mid]) / 2 : sortedValues[mid]\n}\n\n/**\n * Walk lanes outward from the centre: 0, +1, -1, +2, -2, …\n * Returns the lane index for the nth step.\n */\nfunction laneAtStep(step: number): number {\n if (step === 0) return 0\n const magnitude = Math.ceil(step / 2)\n return step % 2 === 1 ? magnitude : -magnitude\n}\n\n/**\n * Greedy deterministic beeswarm packing.\n *\n * Dots are sorted by x (ties broken by label, so the output is stable for a\n * given input rather than dependent on row order) and each is dropped into the\n * first lane — searched outward from the centre — where it clears every dot\n * already in that lane by at least `2r + gap`. Beyond `MAX_LANES` the dot is\n * forced onto the outermost lane and simply overlaps; the surface-coloured\n * stroke keeps that readable.\n *\n * A force simulation would do this too, but it settles asynchronously and\n * non-deterministically, which makes it untestable and jittery on re-render.\n */\nexport function packSwarm(dots: DotDatum[], scale: (v: number) => number, radius: number): PlacedDot[] {\n const minSeparation = 2 * radius + DOT_GAP\n const laneHeight = 2 * radius + DOT_GAP\n\n const sorted = [...dots].sort((a, b) => (a.value - b.value) || a.label.localeCompare(b.label))\n\n // lane index -> x positions already placed in that lane\n const lanes = new Map<number, number[]>()\n const placed: PlacedDot[] = []\n\n for (const dot of sorted) {\n const x = scale(dot.value)\n\n let chosenLane = laneAtStep(2 * MAX_LANES)\n for (let step = 0; step <= 2 * MAX_LANES; step++) {\n const lane = laneAtStep(step)\n const occupied = lanes.get(lane)\n if (!occupied || occupied.every((other) => Math.abs(x - other) >= minSeparation)) {\n chosenLane = lane\n break\n }\n }\n\n const occupied = lanes.get(chosenLane)\n if (occupied) occupied.push(x)\n else lanes.set(chosenLane, [x])\n\n placed.push({ ...dot, x, lane: chosenLane, y: chosenLane * laneHeight })\n }\n\n return placed\n}\n\n/** Row height needed to show every lane the swarm used. */\nexport function swarmHeight(placed: PlacedDot[], radius: number): number {\n const maxAbsLane = placed.reduce((acc, d) => Math.max(acc, Math.abs(d.lane)), 0)\n const laneHeight = 2 * radius + DOT_GAP\n const needed = (2 * maxAbsLane + 1) * laneHeight + 2 * ROW_VERTICAL_PADDING\n return Math.min(Math.max(needed, MIN_ROW_HEIGHT), MAX_ROW_HEIGHT)\n}\n\n/** max / min, or null when the ratio would be meaningless. */\nexport function computeSpread(min: number | null, max: number | null, count: number): number | null {\n if (min === null || max === null || count < 2) return null\n if (min <= 0) return null\n return max / min\n}\n\nexport type BandSort = 'none' | 'valueDesc' | 'valueAsc' | 'count'\n\n/**\n * Group rows into bands, in the order requested. Sorting happens before the\n * swarm is packed so row heights follow the rows the user actually sees.\n */\nexport function groupIntoBands(\n rows: Record<string, unknown>[],\n bandField: string,\n valueField: string,\n labelField: string | undefined,\n sort: BandSort\n): Array<{ label: string; values: DotDatum[]; truncated: boolean }> {\n const order: string[] = []\n const grouped = new Map<string, DotDatum[]>()\n\n for (const row of rows) {\n const bandLabel = String(row[bandField] ?? '')\n if (!grouped.has(bandLabel)) {\n grouped.set(bandLabel, [])\n order.push(bandLabel)\n }\n const value = parseNumeric(row[valueField])\n if (value === null) continue\n grouped.get(bandLabel)!.push({\n value,\n label: labelField ? String(row[labelField] ?? '') : bandLabel,\n row,\n })\n }\n\n let bands = order.map((label) => {\n const all = grouped.get(label)!\n return {\n label,\n values: all.slice(0, MAX_DOTS_PER_BAND),\n truncated: all.length > MAX_DOTS_PER_BAND,\n }\n })\n\n if (sort !== 'none') {\n const medianOf = (values: DotDatum[]) => median(values.map((d) => d.value).sort((a, b) => a - b))\n bands = [...bands].sort((a, b) => {\n if (sort === 'count') return b.values.length - a.values.length\n const ma = medianOf(a.values)\n const mb = medianOf(b.values)\n if (ma === null && mb === null) return 0\n if (ma === null) return 1\n if (mb === null) return -1\n return sort === 'valueDesc' ? mb - ma : ma - mb\n })\n }\n\n return bands.slice(0, MAX_BANDS)\n}\n\n/** Nicely padded numeric domain across every dot in every band. */\nexport function computeDomain(values: number[]): { min: number; max: number } {\n if (values.length === 0) return { min: 0, max: 1 }\n const rawMin = Math.min(...values)\n const rawMax = Math.max(...values)\n if (rawMin === rawMax) {\n const pad = Math.abs(rawMin) * 0.1 || 1\n return { min: rawMin - pad, max: rawMax + pad }\n }\n const pad = (rawMax - rawMin) * 0.1\n return { min: rawMin - pad, max: rawMax + pad }\n}\n\n/** Evenly spaced axis ticks across the domain. */\nexport function computeTicks(min: number, max: number, count = 5): number[] {\n if (max === min) return [min]\n const step = (max - min) / (count - 1)\n return Array.from({ length: count }, (_, i) => min + i * step)\n}\n","import React, { useMemo, useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport { ChartConfigError, ChartEmptyState, ChartRenderError } from './ChartStates.js'\nimport { useChartDimensions } from './useChartDimensions.js'\nimport {\n DOT_RADIUS,\n MAX_BANDS,\n computeDomain,\n computeSpread,\n computeTicks,\n groupIntoBands,\n median,\n packSwarm,\n swarmHeight,\n type BandSort,\n type BandStats,\n type PlacedDot,\n} from './DotStripChart.helpers.js'\nimport type { ChartProps } from '../../types.js'\n\nconst GUTTER_WIDTH = 190\nconst AXIS_HEIGHT = 44\nconst PLOT_PADDING_X = 24\n\n/**\n * Height the left gutter needs for its own content, so a band with a flat swarm\n * still gets a row tall enough for the name and the badges. Folded into the\n * band height rather than left to the grid, so the strip SVG always fills the\n * whole row and its gridlines stay continuous between bands.\n *\n * `dc:text-sm` line (20) + `dc:gap-1` (4) + badge line (20) + `dc:py-2` (16).\n */\nconst GUTTER_HEIGHT_WITH_STATS = 60\nconst GUTTER_HEIGHT_NAME_ONLY = 36\n\n/**\n * Read a drop zone's field, tolerating both shapes it is stored in: the\n * AnalysisBuilder writes a bare string into any zone with `maxItems: 1`\n * (`addFieldToAxis` in `AnalysisBuilder/utils/axisConfigUtils.ts`), while the\n * agent's `inferChartConfig` always writes an array.\n */\nfunction firstField(value: unknown): string | undefined {\n if (Array.isArray(value)) return typeof value[0] === 'string' ? value[0] : undefined\n return typeof value === 'string' && value !== '' ? value : undefined\n}\n\ninterface HoveredDot {\n band: string\n dot: PlacedDot\n clientX: number\n clientY: number\n}\n\n/**\n * One band's strip: gridlines, the baseline, the median tick and the swarm.\n * The x-scale is passed in so every band and the axis share one domain.\n */\nfunction BandStrip({\n band,\n width,\n radius,\n ticks,\n scale,\n showGrid,\n showMedianMarker,\n showExtremeLabels,\n color,\n accentColor,\n drillEnabled,\n onDotClick,\n onDotHover,\n onDotLeave,\n}: {\n band: BandStats\n width: number\n radius: number\n ticks: number[]\n scale: (v: number) => number\n showGrid: boolean\n showMedianMarker: boolean\n showExtremeLabels: boolean\n color: string\n accentColor: string\n drillEnabled: boolean\n onDotClick: (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => void\n onDotHover: (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => void\n onDotLeave: () => void\n}) {\n const centreY = band.height / 2\n const extremes = useMemo(() => {\n if (!showExtremeLabels || band.dots.length < 2) return new Set<PlacedDot>()\n const sorted = [...band.dots].sort((a, b) => a.value - b.value)\n return new Set<PlacedDot>([sorted[0], sorted[sorted.length - 1]])\n }, [band.dots, showExtremeLabels])\n\n return (\n <svg\n width={width}\n height={band.height}\n viewBox={`0 0 ${width} ${band.height}`}\n data-testid={`dot-strip-band-${band.label}`}\n >\n {showGrid &&\n ticks.map((tick, i) => (\n <line\n key={i}\n x1={scale(tick)}\n x2={scale(tick)}\n y1={0}\n y2={band.height}\n stroke=\"currentColor\"\n strokeOpacity={0.08}\n strokeWidth={1}\n className=\"text-dc-text-secondary\"\n />\n ))}\n\n {band.dots.length > 0 && (\n <line\n x1={scale(band.min!)}\n x2={scale(band.max!)}\n y1={centreY}\n y2={centreY}\n stroke=\"currentColor\"\n strokeOpacity={0.25}\n strokeWidth={1}\n className=\"text-dc-text-secondary\"\n />\n )}\n\n {showMedianMarker && band.median !== null && (\n <line\n x1={scale(band.median)}\n x2={scale(band.median)}\n y1={centreY - Math.min(centreY - 2, 16)}\n y2={centreY + Math.min(centreY - 2, 16)}\n stroke=\"currentColor\"\n strokeOpacity={0.55}\n strokeWidth={2}\n className=\"text-dc-text-secondary\"\n data-testid={`dot-strip-median-${band.label}`}\n />\n )}\n\n {band.dots.map((dot, i) => {\n const isExtreme = extremes.has(dot)\n return (\n <g key={`${dot.label}-${i}`}>\n <circle\n cx={dot.x}\n cy={centreY + dot.y}\n r={radius}\n fill={isExtreme ? accentColor : color}\n stroke=\"var(--dc-surface, #ffffff)\"\n strokeWidth={1.25}\n cursor={drillEnabled ? 'pointer' : undefined}\n data-testid=\"dot-strip-dot\"\n onClick={(event) => onDotClick(band, dot, event)}\n onMouseEnter={(event) => onDotHover(band, dot, event)}\n onMouseLeave={onDotLeave}\n />\n {isExtreme && (\n <text\n x={dot.x}\n y={centreY + dot.y + (dot.y <= 0 ? -radius - 6 : radius + 14)}\n textAnchor=\"middle\"\n fontSize={11}\n fill={accentColor}\n data-testid={`dot-strip-extreme-${dot.label}`}\n >\n {dot.label}\n </text>\n )}\n </g>\n )\n })}\n </svg>\n )\n}\n\nconst DotStripChart = React.memo(function DotStripChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n colorPalette,\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n const { containerRef, dimensions } = useChartDimensions()\n const [hovered, setHovered] = useState<HoveredDot | null>(null)\n\n const showGrid = displayConfig.showGrid !== false\n const showTooltip = displayConfig.showTooltip !== false\n const showMedianMarker = displayConfig.showMedianMarker !== false\n const showBandStats = displayConfig.showBandStats !== false\n const showExtremeLabels = displayConfig.showExtremeLabels === true\n const radius = DOT_RADIUS[displayConfig.dotSize ?? 'medium'] ?? DOT_RADIUS.medium\n const bandSort: BandSort = displayConfig.bandSort ?? 'none'\n const xAxisFormat = displayConfig.xAxisFormat\n\n const { bandField, valueField, labelField, configError } = useMemo(() => {\n const bandField = firstField(chartConfig?.xAxis) ?? firstField(chartConfig?.x)\n const valueField = firstField(chartConfig?.yAxis) ?? firstField(chartConfig?.y)\n const labelField = firstField(chartConfig?.series)\n\n if (!bandField || !valueField) {\n return {\n bandField,\n valueField,\n labelField,\n configError: t('chart.runtime.configErrorHint.dotStrip'),\n }\n }\n return { bandField, valueField, labelField, configError: null as string | null }\n }, [chartConfig, t])\n\n const plotWidth = Math.max((dimensions.width || 720) - GUTTER_WIDTH - PLOT_PADDING_X, 80)\n\n const gutterHeight = showBandStats ? GUTTER_HEIGHT_WITH_STATS : GUTTER_HEIGHT_NAME_ONLY\n\n const { bands, ticks, scale, truncated } = useMemo(() => {\n const empty = { bands: [] as BandStats[], ticks: [] as number[], scale: (_: number) => 0, truncated: false }\n if (configError || !bandField || !valueField || !data || data.length === 0) return empty\n\n const rows = data as Record<string, unknown>[]\n const grouped = groupIntoBands(rows, bandField, valueField, labelField, bandSort)\n\n const allValues = grouped.flatMap((b) => b.values.map((d) => d.value))\n const domain = computeDomain(allValues)\n const span = domain.max - domain.min\n const inner = Math.max(plotWidth - 2 * radius - 2, 10)\n const scale = (v: number) => radius + 1 + (span === 0 ? inner / 2 : ((v - domain.min) / span) * inner)\n\n const bands: BandStats[] = grouped.map((group) => {\n const placed = packSwarm(group.values, scale, radius)\n const sortedValues = group.values.map((d) => d.value).sort((a, b) => a - b)\n const min = sortedValues.length > 0 ? sortedValues[0] : null\n const max = sortedValues.length > 0 ? sortedValues[sortedValues.length - 1] : null\n return {\n label: group.label,\n dots: placed,\n count: placed.length,\n median: median(sortedValues),\n min,\n max,\n spread: computeSpread(min, max, placed.length),\n noData: placed.length === 0,\n height: Math.max(swarmHeight(placed, radius), gutterHeight),\n truncated: group.truncated,\n }\n })\n\n return {\n bands,\n ticks: computeTicks(domain.min, domain.max, 5),\n scale,\n truncated: new Set(rows.map((r) => String(r[bandField] ?? ''))).size > MAX_BANDS,\n }\n }, [data, bandField, valueField, labelField, bandSort, configError, plotWidth, radius, gutterHeight])\n\n const palette = colorPalette?.colors ?? CHART_COLORS\n const color = palette[0]\n const accentColor = palette[palette.length > 1 ? 1 : 0]\n\n const formatValue = (v: number) => formatAxisValue(v, xAxisFormat)\n\n const handleDotClick = (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => {\n if (!onDataPointClick || !drillEnabled || !bandField) return\n onDataPointClick({\n dataPoint: dot.row,\n clickedField: bandField,\n xValue: band.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n\n const handleDotHover = (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => {\n if (!showTooltip) return\n setHovered({ band: band.label, dot, clientX: event.clientX, clientY: event.clientY })\n }\n\n if (configError) {\n return <ChartConfigError height={height} hint={configError} />\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.dotStrip')} />\n }\n\n if (bands.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={t('chart.runtime.noValidDataHint.dotStrip')}\n />\n )\n }\n\n try {\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full dc:overflow-y-auto\" style={{ height }}>\n <div\n className=\"dc:grid dc:items-stretch\"\n style={{ gridTemplateColumns: `${GUTTER_WIDTH}px 1fr` }}\n data-testid=\"dot-strip-grid\"\n >\n {bands.map((band) => (\n <React.Fragment key={band.label}>\n <div\n className=\"dc:flex dc:flex-col dc:justify-center dc:gap-1 dc:pr-3 dc:py-2 dc:border-b border-dc-border\"\n style={{ minHeight: band.height }}\n >\n <div className=\"dc:text-sm dc:font-semibold dc:truncate text-dc-text\" title={band.label}>\n {band.label || t('chart.runtime.dotStrip.unlabelledBand')}\n </div>\n {showBandStats && (\n <div className=\"dc:flex dc:flex-wrap dc:gap-1 dc:text-xs\">\n <span className=\"dc:rounded-sm dc:px-1.5 dc:py-0.5 bg-dc-surface-secondary text-dc-text-secondary\">\n {t(\n band.truncated\n ? 'chart.runtime.dotStrip.countTruncated'\n : 'chart.runtime.dotStrip.count',\n { count: band.count }\n )}\n </span>\n {band.noData ? (\n <span className=\"dc:rounded-sm dc:px-1.5 dc:py-0.5 bg-dc-surface-secondary text-dc-text-muted\">\n {t('chart.runtime.dotStrip.noDataRecorded')}\n </span>\n ) : (\n band.spread !== null && (\n <span className=\"dc:rounded-sm dc:px-1.5 dc:py-0.5 bg-dc-surface-secondary text-dc-text-secondary\">\n {t('chart.runtime.dotStrip.spread', { spread: band.spread.toFixed(2) })}\n </span>\n )\n )}\n </div>\n )}\n </div>\n <div\n className=\"dc:flex dc:items-center dc:border-b border-dc-border\"\n style={{ minHeight: band.height, paddingRight: PLOT_PADDING_X }}\n >\n <BandStrip\n band={band}\n width={plotWidth}\n radius={radius}\n ticks={ticks}\n scale={scale}\n showGrid={showGrid}\n showMedianMarker={showMedianMarker}\n showExtremeLabels={showExtremeLabels}\n color={color}\n accentColor={accentColor}\n drillEnabled={drillEnabled === true}\n onDotClick={handleDotClick}\n onDotHover={handleDotHover}\n onDotLeave={() => setHovered(null)}\n />\n </div>\n </React.Fragment>\n ))}\n\n <div />\n <div style={{ paddingRight: PLOT_PADDING_X }}>\n <svg\n width={plotWidth}\n height={AXIS_HEIGHT}\n viewBox={`0 0 ${plotWidth} ${AXIS_HEIGHT}`}\n data-testid=\"dot-strip-axis\"\n >\n <line x1={0} x2={plotWidth} y1={1} y2={1} stroke=\"currentColor\" strokeOpacity={0.2} className=\"text-dc-text-secondary\" />\n {ticks.map((tick, i) => (\n <g key={i} transform={`translate(${scale(tick)}, 0)`}>\n <line y1={1} y2={7} stroke=\"currentColor\" strokeOpacity={0.4} className=\"text-dc-text-secondary\" />\n <text\n y={22}\n textAnchor=\"middle\"\n fontSize={11}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n >\n {formatValue(tick)}\n </text>\n </g>\n ))}\n {valueField && (\n <text\n x={plotWidth / 2}\n y={39}\n textAnchor=\"middle\"\n fontSize={11}\n fill=\"currentColor\"\n className=\"text-dc-text-muted\"\n >\n {getFieldLabel(valueField)}\n </text>\n )}\n </svg>\n </div>\n </div>\n\n {truncated && (\n <div className=\"dc:text-xs text-dc-warning dc:text-center dc:mt-1\">\n {t('chart.runtime.dotStrip.truncated', { max: MAX_BANDS })}\n </div>\n )}\n\n {showTooltip && hovered && (\n <div\n className=\"dc:fixed dc:z-50 dc:pointer-events-none dc:rounded-sm dc:px-2 dc:py-1 dc:text-xs dc:shadow-lg bg-dc-surface text-dc-text dc:border border-dc-border\"\n style={{ left: hovered.clientX + 12, top: hovered.clientY + 12 }}\n data-testid=\"dot-strip-tooltip\"\n >\n <div className=\"dc:font-semibold\">{hovered.dot.label}</div>\n <div className=\"text-dc-text-secondary\">{hovered.band}</div>\n <div>{formatValue(hovered.dot.value)}</div>\n </div>\n )}\n </div>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Dot Strip Chart\" error={error} />\n }\n})\n\nexport default DotStripChart\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DotStripChart-BwitDmpR.js","names":["useTranslation","useCubeFieldLabel","useChartDimensions","CHART_COLORS","formatAxisValue","ChartConfigError","ChartEmptyState","ChartRenderError","React","DOT_RADIUS","DOT_GAP","parseNumeric","v","n","median","sortedValues","mid","laneAtStep","step","magnitude","packSwarm","minSeparation","radius","laneHeight","sorted","dots","a","b","lanes","placed","dot","x","scale","chosenLane","lane","occupied","other","swarmHeight","maxAbsLane","acc","d","needed","computeSpread","min","max","count","groupIntoBands","order","grouped","row","rows","bandLabel","bandField","value","valueField","labelField","bands","all","label","sort","medianOf","values","ma","mb","computeDomain","rawMin","rawMax","pad","computeTicks","i","GUTTER_WIDTH","AXIS_HEIGHT","PLOT_PADDING_X","GUTTER_HEIGHT_WITH_STATS","GUTTER_HEIGHT_NAME_ONLY","firstField","BandStrip","centreY","band","extremes","useMemo","showExtremeLabels","width","showGrid","ticks","tick","showMedianMarker","isExtreme","accentColor","color","drillEnabled","onDotClick","event","onDotHover","onDotLeave","DotStripChart","getFieldLabel","hovered","setHovered","useState","displayConfig","showTooltip","showBandStats","bandSort","xAxisFormat","chartConfig","t","plotWidth","dimensions","gutterHeight","empty","configError","data","domain","span","inner","group","r","palette","colorPalette","formatValue","handleDotClick","onDataPointClick","handleDotHover","containerRef","truncated","error"],"sources":["../../../src/client/components/charts/DotStripChart.helpers.ts","../../../src/client/components/charts/DotStripChart.tsx"],"sourcesContent":["/**\n * Layout maths for the dot strip (beeswarm) chart.\n *\n * Kept out of the component — like `ScatterChart.helpers.ts` and\n * `BubbleChart.render.ts` — so the swarm packing can be unit-tested without a\n * DOM. Everything here is pure: same input, same output, every time.\n */\n\n/** Hard caps so one pathological band cannot blow up the layout. */\nexport const MAX_BANDS = 50\nexport const MAX_DOTS_PER_BAND = 500\nexport const MAX_LANES = 8\n\nexport const MIN_ROW_HEIGHT = 44\nexport const MAX_ROW_HEIGHT = 220\n/** Vertical breathing room added above and below the outermost lanes. */\nexport const ROW_VERTICAL_PADDING = 12\n\nexport const DOT_RADIUS: Record<'small' | 'medium' | 'large', number> = {\n small: 3.5,\n medium: 5,\n large: 7,\n}\n\n/** Gap between the edges of two adjacent dots in the same lane. */\nexport const DOT_GAP = 1.5\n\nexport interface DotDatum {\n /** Raw numeric value of the measure. */\n value: number\n /** Identity label for the dot (from the optional series dimension). */\n label: string\n /** The source row, handed back on click. */\n row: Record<string, unknown>\n}\n\nexport interface PlacedDot extends DotDatum {\n /** Pixel x within the plot area. */\n x: number\n /** Lane index: 0 is the centre line, then +1, -1, +2, -2, … */\n lane: number\n /** Pixel y offset from the band's centre line. */\n y: number\n}\n\nexport interface BandStats {\n /** The band's own label (the value of the band dimension). */\n label: string\n dots: PlacedDot[]\n count: number\n median: number | null\n min: number | null\n max: number | null\n /**\n * max / min. `null` when it cannot be stated meaningfully — fewer than two\n * dots, or a non-positive minimum (the ratio is infinite or sign-flipped).\n */\n spread: number | null\n /** True when the band has rows but not one usable numeric value. */\n noData: boolean\n /** Rendered height of this band's row, in px. */\n height: number\n /** True when the band's dots were truncated at MAX_DOTS_PER_BAND. */\n truncated: boolean\n}\n\nexport function parseNumeric(v: unknown): number | null {\n if (v === undefined || v === null || v === '') return null\n const n = typeof v === 'number' ? v : parseFloat(String(v))\n return Number.isFinite(n) ? n : null\n}\n\nexport function median(sortedValues: number[]): number | null {\n const n = sortedValues.length\n if (n === 0) return null\n const mid = Math.floor(n / 2)\n return n % 2 === 0 ? (sortedValues[mid - 1] + sortedValues[mid]) / 2 : sortedValues[mid]\n}\n\n/**\n * Walk lanes outward from the centre: 0, +1, -1, +2, -2, …\n * Returns the lane index for the nth step.\n */\nfunction laneAtStep(step: number): number {\n if (step === 0) return 0\n const magnitude = Math.ceil(step / 2)\n return step % 2 === 1 ? magnitude : -magnitude\n}\n\n/**\n * Greedy deterministic beeswarm packing.\n *\n * Dots are sorted by x (ties broken by label, so the output is stable for a\n * given input rather than dependent on row order) and each is dropped into the\n * first lane — searched outward from the centre — where it clears every dot\n * already in that lane by at least `2r + gap`. Beyond `MAX_LANES` the dot is\n * forced onto the outermost lane and simply overlaps; the surface-coloured\n * stroke keeps that readable.\n *\n * A force simulation would do this too, but it settles asynchronously and\n * non-deterministically, which makes it untestable and jittery on re-render.\n */\nexport function packSwarm(dots: DotDatum[], scale: (v: number) => number, radius: number): PlacedDot[] {\n const minSeparation = 2 * radius + DOT_GAP\n const laneHeight = 2 * radius + DOT_GAP\n\n const sorted = [...dots].sort((a, b) => (a.value - b.value) || a.label.localeCompare(b.label))\n\n // lane index -> x positions already placed in that lane\n const lanes = new Map<number, number[]>()\n const placed: PlacedDot[] = []\n\n for (const dot of sorted) {\n const x = scale(dot.value)\n\n let chosenLane = laneAtStep(2 * MAX_LANES)\n for (let step = 0; step <= 2 * MAX_LANES; step++) {\n const lane = laneAtStep(step)\n const occupied = lanes.get(lane)\n if (!occupied || occupied.every((other) => Math.abs(x - other) >= minSeparation)) {\n chosenLane = lane\n break\n }\n }\n\n const occupied = lanes.get(chosenLane)\n if (occupied) occupied.push(x)\n else lanes.set(chosenLane, [x])\n\n placed.push({ ...dot, x, lane: chosenLane, y: chosenLane * laneHeight })\n }\n\n return placed\n}\n\n/** Row height needed to show every lane the swarm used. */\nexport function swarmHeight(placed: PlacedDot[], radius: number): number {\n const maxAbsLane = placed.reduce((acc, d) => Math.max(acc, Math.abs(d.lane)), 0)\n const laneHeight = 2 * radius + DOT_GAP\n const needed = (2 * maxAbsLane + 1) * laneHeight + 2 * ROW_VERTICAL_PADDING\n return Math.min(Math.max(needed, MIN_ROW_HEIGHT), MAX_ROW_HEIGHT)\n}\n\n/** max / min, or null when the ratio would be meaningless. */\nexport function computeSpread(min: number | null, max: number | null, count: number): number | null {\n if (min === null || max === null || count < 2) return null\n if (min <= 0) return null\n return max / min\n}\n\nexport type BandSort = 'none' | 'valueDesc' | 'valueAsc' | 'count'\n\n/**\n * Group rows into bands, in the order requested. Sorting happens before the\n * swarm is packed so row heights follow the rows the user actually sees.\n */\nexport function groupIntoBands(\n rows: Record<string, unknown>[],\n bandField: string,\n valueField: string,\n labelField: string | undefined,\n sort: BandSort\n): Array<{ label: string; values: DotDatum[]; truncated: boolean }> {\n const order: string[] = []\n const grouped = new Map<string, DotDatum[]>()\n\n for (const row of rows) {\n const bandLabel = String(row[bandField] ?? '')\n if (!grouped.has(bandLabel)) {\n grouped.set(bandLabel, [])\n order.push(bandLabel)\n }\n const value = parseNumeric(row[valueField])\n if (value === null) continue\n grouped.get(bandLabel)!.push({\n value,\n label: labelField ? String(row[labelField] ?? '') : bandLabel,\n row,\n })\n }\n\n let bands = order.map((label) => {\n const all = grouped.get(label)!\n return {\n label,\n values: all.slice(0, MAX_DOTS_PER_BAND),\n truncated: all.length > MAX_DOTS_PER_BAND,\n }\n })\n\n if (sort !== 'none') {\n const medianOf = (values: DotDatum[]) => median(values.map((d) => d.value).sort((a, b) => a - b))\n bands = [...bands].sort((a, b) => {\n if (sort === 'count') return b.values.length - a.values.length\n const ma = medianOf(a.values)\n const mb = medianOf(b.values)\n if (ma === null && mb === null) return 0\n if (ma === null) return 1\n if (mb === null) return -1\n return sort === 'valueDesc' ? mb - ma : ma - mb\n })\n }\n\n return bands.slice(0, MAX_BANDS)\n}\n\n/** Nicely padded numeric domain across every dot in every band. */\nexport function computeDomain(values: number[]): { min: number; max: number } {\n if (values.length === 0) return { min: 0, max: 1 }\n const rawMin = Math.min(...values)\n const rawMax = Math.max(...values)\n if (rawMin === rawMax) {\n const pad = Math.abs(rawMin) * 0.1 || 1\n return { min: rawMin - pad, max: rawMax + pad }\n }\n const pad = (rawMax - rawMin) * 0.1\n return { min: rawMin - pad, max: rawMax + pad }\n}\n\n/** Evenly spaced axis ticks across the domain. */\nexport function computeTicks(min: number, max: number, count = 5): number[] {\n if (max === min) return [min]\n const step = (max - min) / (count - 1)\n return Array.from({ length: count }, (_, i) => min + i * step)\n}\n","import React, { useMemo, useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport { ChartConfigError, ChartEmptyState, ChartRenderError } from './ChartStates.js'\nimport { useChartDimensions } from './useChartDimensions.js'\nimport {\n DOT_RADIUS,\n MAX_BANDS,\n computeDomain,\n computeSpread,\n computeTicks,\n groupIntoBands,\n median,\n packSwarm,\n swarmHeight,\n type BandSort,\n type BandStats,\n type PlacedDot,\n} from './DotStripChart.helpers.js'\nimport type { ChartProps } from '../../types.js'\n\nconst GUTTER_WIDTH = 190\nconst AXIS_HEIGHT = 44\nconst PLOT_PADDING_X = 24\n\n/**\n * Height the left gutter needs for its own content, so a band with a flat swarm\n * still gets a row tall enough for the name and the badges. Folded into the\n * band height rather than left to the grid, so the strip SVG always fills the\n * whole row and its gridlines stay continuous between bands.\n *\n * `dc:text-sm` line (20) + `dc:gap-1` (4) + badge line (20) + `dc:py-2` (16).\n */\nconst GUTTER_HEIGHT_WITH_STATS = 60\nconst GUTTER_HEIGHT_NAME_ONLY = 36\n\n/**\n * Read a drop zone's field, tolerating both shapes it is stored in: the\n * AnalysisBuilder writes a bare string into any zone with `maxItems: 1`\n * (`addFieldToAxis` in `AnalysisBuilder/utils/axisConfigUtils.ts`), while the\n * agent's `inferChartConfig` always writes an array.\n */\nfunction firstField(value: unknown): string | undefined {\n if (Array.isArray(value)) return typeof value[0] === 'string' ? value[0] : undefined\n return typeof value === 'string' && value !== '' ? value : undefined\n}\n\ninterface HoveredDot {\n band: string\n dot: PlacedDot\n clientX: number\n clientY: number\n}\n\n/**\n * One band's strip: gridlines, the baseline, the median tick and the swarm.\n * The x-scale is passed in so every band and the axis share one domain.\n */\nfunction BandStrip({\n band,\n width,\n radius,\n ticks,\n scale,\n showGrid,\n showMedianMarker,\n showExtremeLabels,\n color,\n accentColor,\n drillEnabled,\n onDotClick,\n onDotHover,\n onDotLeave,\n}: {\n band: BandStats\n width: number\n radius: number\n ticks: number[]\n scale: (v: number) => number\n showGrid: boolean\n showMedianMarker: boolean\n showExtremeLabels: boolean\n color: string\n accentColor: string\n drillEnabled: boolean\n onDotClick: (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => void\n onDotHover: (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => void\n onDotLeave: () => void\n}) {\n const centreY = band.height / 2\n const extremes = useMemo(() => {\n if (!showExtremeLabels || band.dots.length < 2) return new Set<PlacedDot>()\n const sorted = [...band.dots].sort((a, b) => a.value - b.value)\n return new Set<PlacedDot>([sorted[0], sorted[sorted.length - 1]])\n }, [band.dots, showExtremeLabels])\n\n return (\n <svg\n width={width}\n height={band.height}\n viewBox={`0 0 ${width} ${band.height}`}\n data-testid={`dot-strip-band-${band.label}`}\n >\n {showGrid &&\n ticks.map((tick, i) => (\n <line\n key={i}\n x1={scale(tick)}\n x2={scale(tick)}\n y1={0}\n y2={band.height}\n stroke=\"currentColor\"\n strokeOpacity={0.08}\n strokeWidth={1}\n className=\"text-dc-text-secondary\"\n />\n ))}\n\n {band.dots.length > 0 && (\n <line\n x1={scale(band.min!)}\n x2={scale(band.max!)}\n y1={centreY}\n y2={centreY}\n stroke=\"currentColor\"\n strokeOpacity={0.25}\n strokeWidth={1}\n className=\"text-dc-text-secondary\"\n />\n )}\n\n {showMedianMarker && band.median !== null && (\n <line\n x1={scale(band.median)}\n x2={scale(band.median)}\n y1={centreY - Math.min(centreY - 2, 16)}\n y2={centreY + Math.min(centreY - 2, 16)}\n stroke=\"currentColor\"\n strokeOpacity={0.55}\n strokeWidth={2}\n className=\"text-dc-text-secondary\"\n data-testid={`dot-strip-median-${band.label}`}\n />\n )}\n\n {band.dots.map((dot, i) => {\n const isExtreme = extremes.has(dot)\n return (\n <g key={`${dot.label}-${i}`}>\n <circle\n cx={dot.x}\n cy={centreY + dot.y}\n r={radius}\n fill={isExtreme ? accentColor : color}\n stroke=\"var(--dc-surface, #ffffff)\"\n strokeWidth={1.25}\n cursor={drillEnabled ? 'pointer' : undefined}\n data-testid=\"dot-strip-dot\"\n onClick={(event) => onDotClick(band, dot, event)}\n onMouseEnter={(event) => onDotHover(band, dot, event)}\n onMouseLeave={onDotLeave}\n />\n {isExtreme && (\n <text\n x={dot.x}\n y={centreY + dot.y + (dot.y <= 0 ? -radius - 6 : radius + 14)}\n textAnchor=\"middle\"\n fontSize={11}\n fill={accentColor}\n data-testid={`dot-strip-extreme-${dot.label}`}\n >\n {dot.label}\n </text>\n )}\n </g>\n )\n })}\n </svg>\n )\n}\n\nconst DotStripChart = React.memo(function DotStripChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n colorPalette,\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n const { containerRef, dimensions } = useChartDimensions()\n const [hovered, setHovered] = useState<HoveredDot | null>(null)\n\n const showGrid = displayConfig.showGrid !== false\n const showTooltip = displayConfig.showTooltip !== false\n const showMedianMarker = displayConfig.showMedianMarker !== false\n const showBandStats = displayConfig.showBandStats !== false\n const showExtremeLabels = displayConfig.showExtremeLabels === true\n const radius = DOT_RADIUS[displayConfig.dotSize ?? 'medium'] ?? DOT_RADIUS.medium\n const bandSort: BandSort = displayConfig.bandSort ?? 'none'\n const xAxisFormat = displayConfig.xAxisFormat\n\n const { bandField, valueField, labelField, configError } = useMemo(() => {\n const bandField = firstField(chartConfig?.xAxis) ?? firstField(chartConfig?.x)\n const valueField = firstField(chartConfig?.yAxis) ?? firstField(chartConfig?.y)\n const labelField = firstField(chartConfig?.series)\n\n if (!bandField || !valueField) {\n return {\n bandField,\n valueField,\n labelField,\n configError: t('chart.runtime.configErrorHint.dotStrip'),\n }\n }\n return { bandField, valueField, labelField, configError: null as string | null }\n }, [chartConfig, t])\n\n const plotWidth = Math.max((dimensions.width || 720) - GUTTER_WIDTH - PLOT_PADDING_X, 80)\n\n const gutterHeight = showBandStats ? GUTTER_HEIGHT_WITH_STATS : GUTTER_HEIGHT_NAME_ONLY\n\n const { bands, ticks, scale, truncated } = useMemo(() => {\n const empty = { bands: [] as BandStats[], ticks: [] as number[], scale: (_: number) => 0, truncated: false }\n if (configError || !bandField || !valueField || !data || data.length === 0) return empty\n\n const rows = data as Record<string, unknown>[]\n const grouped = groupIntoBands(rows, bandField, valueField, labelField, bandSort)\n\n const allValues = grouped.flatMap((b) => b.values.map((d) => d.value))\n const domain = computeDomain(allValues)\n const span = domain.max - domain.min\n const inner = Math.max(plotWidth - 2 * radius - 2, 10)\n const scale = (v: number) => radius + 1 + (span === 0 ? inner / 2 : ((v - domain.min) / span) * inner)\n\n const bands: BandStats[] = grouped.map((group) => {\n const placed = packSwarm(group.values, scale, radius)\n const sortedValues = group.values.map((d) => d.value).sort((a, b) => a - b)\n const min = sortedValues.length > 0 ? sortedValues[0] : null\n const max = sortedValues.length > 0 ? sortedValues[sortedValues.length - 1] : null\n return {\n label: group.label,\n dots: placed,\n count: placed.length,\n median: median(sortedValues),\n min,\n max,\n spread: computeSpread(min, max, placed.length),\n noData: placed.length === 0,\n height: Math.max(swarmHeight(placed, radius), gutterHeight),\n truncated: group.truncated,\n }\n })\n\n return {\n bands,\n ticks: computeTicks(domain.min, domain.max, 5),\n scale,\n truncated: new Set(rows.map((r) => String(r[bandField] ?? ''))).size > MAX_BANDS,\n }\n }, [data, bandField, valueField, labelField, bandSort, configError, plotWidth, radius, gutterHeight])\n\n const palette = colorPalette?.colors ?? CHART_COLORS\n const color = palette[0]\n const accentColor = palette[palette.length > 1 ? 1 : 0]\n\n const formatValue = (v: number) => formatAxisValue(v, xAxisFormat)\n\n const handleDotClick = (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => {\n if (!onDataPointClick || !drillEnabled || !bandField) return\n onDataPointClick({\n dataPoint: dot.row,\n clickedField: bandField,\n xValue: band.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n\n const handleDotHover = (band: BandStats, dot: PlacedDot, event: React.MouseEvent) => {\n if (!showTooltip) return\n setHovered({ band: band.label, dot, clientX: event.clientX, clientY: event.clientY })\n }\n\n if (configError) {\n return <ChartConfigError height={height} hint={configError} />\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.dotStrip')} />\n }\n\n if (bands.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={t('chart.runtime.noValidDataHint.dotStrip')}\n />\n )\n }\n\n try {\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full dc:overflow-y-auto\" style={{ height }}>\n <div\n className=\"dc:grid dc:items-stretch\"\n style={{ gridTemplateColumns: `${GUTTER_WIDTH}px 1fr` }}\n data-testid=\"dot-strip-grid\"\n >\n {bands.map((band) => (\n <React.Fragment key={band.label}>\n <div\n className=\"dc:flex dc:flex-col dc:justify-center dc:gap-1 dc:pr-3 dc:py-2 dc:border-b border-dc-border\"\n style={{ minHeight: band.height }}\n >\n <div className=\"dc:text-sm dc:font-semibold dc:truncate text-dc-text\" title={band.label}>\n {band.label || t('chart.runtime.dotStrip.unlabelledBand')}\n </div>\n {showBandStats && (\n <div className=\"dc:flex dc:flex-wrap dc:gap-1 dc:text-xs\">\n <span className=\"dc:rounded-sm dc:px-1.5 dc:py-0.5 bg-dc-surface-secondary text-dc-text-secondary\">\n {t(\n band.truncated\n ? 'chart.runtime.dotStrip.countTruncated'\n : 'chart.runtime.dotStrip.count',\n { count: band.count }\n )}\n </span>\n {band.noData ? (\n <span className=\"dc:rounded-sm dc:px-1.5 dc:py-0.5 bg-dc-surface-secondary text-dc-text-muted\">\n {t('chart.runtime.dotStrip.noDataRecorded')}\n </span>\n ) : (\n band.spread !== null && (\n <span className=\"dc:rounded-sm dc:px-1.5 dc:py-0.5 bg-dc-surface-secondary text-dc-text-secondary\">\n {t('chart.runtime.dotStrip.spread', { spread: band.spread.toFixed(2) })}\n </span>\n )\n )}\n </div>\n )}\n </div>\n <div\n className=\"dc:flex dc:items-center dc:border-b border-dc-border\"\n style={{ minHeight: band.height, paddingRight: PLOT_PADDING_X }}\n >\n <BandStrip\n band={band}\n width={plotWidth}\n radius={radius}\n ticks={ticks}\n scale={scale}\n showGrid={showGrid}\n showMedianMarker={showMedianMarker}\n showExtremeLabels={showExtremeLabels}\n color={color}\n accentColor={accentColor}\n drillEnabled={drillEnabled === true}\n onDotClick={handleDotClick}\n onDotHover={handleDotHover}\n onDotLeave={() => setHovered(null)}\n />\n </div>\n </React.Fragment>\n ))}\n\n <div />\n <div style={{ paddingRight: PLOT_PADDING_X }}>\n <svg\n width={plotWidth}\n height={AXIS_HEIGHT}\n viewBox={`0 0 ${plotWidth} ${AXIS_HEIGHT}`}\n data-testid=\"dot-strip-axis\"\n >\n <line x1={0} x2={plotWidth} y1={1} y2={1} stroke=\"currentColor\" strokeOpacity={0.2} className=\"text-dc-text-secondary\" />\n {ticks.map((tick, i) => (\n <g key={i} transform={`translate(${scale(tick)}, 0)`}>\n <line y1={1} y2={7} stroke=\"currentColor\" strokeOpacity={0.4} className=\"text-dc-text-secondary\" />\n <text\n y={22}\n textAnchor=\"middle\"\n fontSize={11}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n >\n {formatValue(tick)}\n </text>\n </g>\n ))}\n {valueField && (\n <text\n x={plotWidth / 2}\n y={39}\n textAnchor=\"middle\"\n fontSize={11}\n fill=\"currentColor\"\n className=\"text-dc-text-muted\"\n >\n {getFieldLabel(valueField)}\n </text>\n )}\n </svg>\n </div>\n </div>\n\n {truncated && (\n <div className=\"dc:text-xs text-dc-warning dc:text-center dc:mt-1\">\n {t('chart.runtime.dotStrip.truncated', { max: MAX_BANDS })}\n </div>\n )}\n\n {showTooltip && hovered && (\n <div\n className=\"dc:fixed dc:z-50 dc:pointer-events-none dc:rounded-sm dc:px-2 dc:py-1 dc:text-xs dc:shadow-lg bg-dc-surface text-dc-text dc:border border-dc-border\"\n style={{ left: hovered.clientX + 12, top: hovered.clientY + 12 }}\n data-testid=\"dot-strip-tooltip\"\n >\n <div className=\"dc:font-semibold\">{hovered.dot.label}</div>\n <div className=\"text-dc-text-secondary\">{hovered.band}</div>\n <div>{formatValue(hovered.dot.value)}</div>\n </div>\n )}\n </div>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Dot Strip Chart\" error={error} />\n }\n})\n\nexport default DotStripChart\n"],"mappings":"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"}
|
package/dist/client/chunks/{ProportionBarChart-DieF9AzP.js → ProportionBarChart-CpUHH9UH.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as e, S as t, w as n } from "./chart-activity-grid-
|
|
2
|
-
import { D as r, O as i, k as a, s as o } from "./chart-area-
|
|
1
|
+
import { F as e, S as t, w as n } from "./chart-activity-grid-BHaBagS8.js";
|
|
2
|
+
import { D as r, O as i, k as a, s as o } from "./chart-area-9lHCX2OO.js";
|
|
3
3
|
import s, { useMemo as c } from "react";
|
|
4
4
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
5
|
//#region src/client/components/charts/ProportionBarChart.tsx
|
|
@@ -106,4 +106,4 @@ var d = s.memo(function({ data: s, chartConfig: d, displayConfig: f = {}, height
|
|
|
106
106
|
//#endregion
|
|
107
107
|
export { d as default };
|
|
108
108
|
|
|
109
|
-
//# sourceMappingURL=ProportionBarChart-
|
|
109
|
+
//# sourceMappingURL=ProportionBarChart-CpUHH9UH.js.map
|
package/dist/client/chunks/{ProportionBarChart-DieF9AzP.js.map → ProportionBarChart-CpUHH9UH.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProportionBarChart-
|
|
1
|
+
{"version":3,"file":"ProportionBarChart-CpUHH9UH.js","names":["useTranslation","useCubeFieldLabel","formatAxisValue","ChartConfigError","ChartEmptyState","ChartRenderError","getSeriesColor","React","ProportionBarChart","getFieldLabel","categoryField","useMemo","x","chartConfig","valueField","y","sortSegments","displayConfig","data","rows","raw","row","num","label","sourceIndex","b","a","sum","acc","colorPalette","index","t","segments","total","showLabels","showPercentages","decimals","segment","error"],"sources":["../../../src/client/components/charts/ProportionBarChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { getSeriesColor } from './cartesianChartHelpers.js'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport type { ChartProps } from '../../types.js'\n\ninterface Segment {\n /**\n * React key. Category labels are not reliably unique - a query can return\n * duplicates, and every null collapses to the same empty string - so the key\n * is tied to the source row instead. Stable across sorting, which reorders\n * the segments under the same identity.\n */\n id: string\n label: string\n value: number\n share: number\n color: string\n}\n\n/**\n * A single 100%-wide stacked bar plus a labelled percentage legend.\n *\n * A flatter alternative to a pie chart for part-to-whole breakdowns: shares are\n * far easier to compare along one axis than as angles, and it costs a fraction\n * of the vertical space. Deliberately plain HTML rather than Recharts — there is\n * no axis, scale or interaction to justify an SVG chart.\n */\nconst ProportionBarChart = React.memo(function ProportionBarChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n\n const categoryField = useMemo(() => {\n const x = chartConfig?.xAxis\n return (Array.isArray(x) ? x[0] : x) || ''\n }, [chartConfig?.xAxis])\n\n const valueField = useMemo(() => {\n const y = chartConfig?.yAxis\n return (Array.isArray(y) ? y[0] : y) || ''\n }, [chartConfig?.yAxis])\n\n const sortSegments = displayConfig.sortSegments ?? false\n\n const { segments, total } = useMemo(() => {\n if (!data || !categoryField || !valueField) return { segments: [] as Segment[], total: 0 }\n\n const rows = data\n .map((row: any, sourceIndex: number) => {\n const raw = row?.[valueField]\n const num = typeof raw === 'number' ? raw : parseFloat(String(raw))\n const label = String(row?.[categoryField] ?? '')\n return {\n id: `${sourceIndex}:${label}`,\n label,\n // Negative shares cannot be drawn in a part-to-whole bar.\n value: !isNaN(num) && isFinite(num) && num > 0 ? num : 0\n }\n })\n .filter((row) => row.value > 0)\n\n if (sortSegments) rows.sort((a, b) => b.value - a.value)\n\n const sum = rows.reduce((acc, row) => acc + row.value, 0)\n return {\n total: sum,\n segments: rows.map((row, index) => ({\n ...row,\n share: sum > 0 ? (row.value / sum) * 100 : 0,\n color: getSeriesColor(colorPalette, index)\n }))\n }\n }, [data, categoryField, valueField, colorPalette, sortSegments])\n\n try {\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.proportionBar')} />\n }\n\n if (!categoryField || !valueField) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.proportionBar')} />\n }\n\n if (segments.length === 0 || total === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={t('chart.runtime.noValidDataHint.proportionBar')}\n />\n )\n }\n\n const showLabels = displayConfig.showLabels ?? true\n const showPercentages = displayConfig.showPercentages ?? true\n const decimals = displayConfig.decimals ?? 0\n\n return (\n <div\n className=\"dc:w-full dc:h-full dc:flex dc:flex-col dc:justify-center dc:gap-3 dc:px-3 dc:py-2 dc:overflow-hidden\"\n // Fill the parent rather than the `height` prop, which is a pixel value\n // that can exceed the visible panel and push this short content low.\n style={{ height: '100%', minHeight: '80px' }}\n data-testid=\"proportion-bar\"\n >\n <div className=\"dc:flex dc:w-full dc:overflow-hidden dc:rounded-sm\" style={{ height: 10 }}>\n {segments.map((segment) => (\n <div\n key={segment.id}\n data-testid=\"proportion-bar-segment\"\n title={`${segment.label}: ${formatAxisValue(segment.value, displayConfig.leftYAxisFormat)}`}\n style={{ width: `${segment.share}%`, backgroundColor: segment.color }}\n />\n ))}\n </div>\n\n {(showLabels || showPercentages) && (\n <div className=\"dc:flex dc:flex-wrap dc:gap-x-6 dc:gap-y-2\">\n {segments.map((segment) => (\n <div key={segment.id} className=\"dc:flex dc:flex-col dc:gap-0.5 dc:min-w-0\">\n {showLabels && (\n <span\n className=\"text-dc-text-muted dc:uppercase dc:truncate dc:font-semibold\"\n style={{ fontSize: '11px', letterSpacing: '0.06em' }}\n >\n {segment.label}\n </span>\n )}\n {showPercentages && (\n <span\n className=\"dc:font-semibold dc:leading-none\"\n style={{ fontSize: '18px', color: segment.color }}\n >\n {segment.share.toFixed(decimals)}%\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType={getFieldLabel(valueField)} error={error} />\n }\n})\n\nexport default ProportionBarChart\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as e, y as t } from "./chart-data-table-
|
|
2
|
-
import { B as n, E as r, F as i, w as a } from "./chart-activity-grid-
|
|
3
|
-
import { O as o } from "./chart-area-
|
|
1
|
+
import { i as e, y as t } from "./chart-data-table-BYQzVqtc.js";
|
|
2
|
+
import { B as n, E as r, F as i, w as a } from "./chart-activity-grid-BHaBagS8.js";
|
|
3
|
+
import { O as o } from "./chart-area-9lHCX2OO.js";
|
|
4
4
|
import s, { useCallback as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
|
|
5
5
|
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
6
6
|
//#region src/client/utils/rowLinkUtils.ts
|
|
@@ -78,23 +78,24 @@ var k = {
|
|
|
78
78
|
text: ""
|
|
79
79
|
};
|
|
80
80
|
function A(e, t) {
|
|
81
|
-
return
|
|
81
|
+
return G(e) ? k : (j[t?.kind ?? "text"] ?? M)(e, t);
|
|
82
82
|
}
|
|
83
83
|
var j = {
|
|
84
84
|
text: M,
|
|
85
85
|
number: N,
|
|
86
86
|
date: P,
|
|
87
87
|
badge: I,
|
|
88
|
-
progress: R
|
|
88
|
+
progress: R,
|
|
89
|
+
link: M
|
|
89
90
|
};
|
|
90
91
|
function M(e) {
|
|
91
92
|
return {
|
|
92
93
|
kind: "text",
|
|
93
|
-
text:
|
|
94
|
+
text: V(e)
|
|
94
95
|
};
|
|
95
96
|
}
|
|
96
97
|
function N(e, t) {
|
|
97
|
-
let n =
|
|
98
|
+
let n = H(e);
|
|
98
99
|
return n === null ? {
|
|
99
100
|
kind: "text",
|
|
100
101
|
text: String(e)
|
|
@@ -113,7 +114,7 @@ function F(e) {
|
|
|
113
114
|
return Array.isArray(e?.badgeColors) ? e.badgeColors.filter((e) => e && typeof e.colorIndex == "number") : [];
|
|
114
115
|
}
|
|
115
116
|
function I(e, t) {
|
|
116
|
-
let n =
|
|
117
|
+
let n = V(e);
|
|
117
118
|
return {
|
|
118
119
|
kind: "badge",
|
|
119
120
|
text: n,
|
|
@@ -126,25 +127,32 @@ var L = {
|
|
|
126
127
|
decimals: 0
|
|
127
128
|
};
|
|
128
129
|
function R(e, t) {
|
|
129
|
-
let n =
|
|
130
|
+
let n = H(e);
|
|
130
131
|
return n === null ? {
|
|
131
132
|
kind: "text",
|
|
132
133
|
text: String(e)
|
|
133
134
|
} : {
|
|
134
135
|
kind: "progress",
|
|
135
|
-
fraction:
|
|
136
|
+
fraction: B(n, t),
|
|
136
137
|
style: t?.progressStyle ?? "bar",
|
|
137
|
-
text: a(n, t?.numberFormat ?? L)
|
|
138
|
+
text: a(n, t?.numberFormat ?? L),
|
|
139
|
+
colorIndex: z(n, t)
|
|
138
140
|
};
|
|
139
141
|
}
|
|
140
142
|
function z(e, t) {
|
|
143
|
+
if (!Array.isArray(t?.progressBands)) return;
|
|
144
|
+
let n;
|
|
145
|
+
for (let r of t.progressBands) r && typeof r.value == "number" && Number.isFinite(r.value) && (!Number.isInteger(r.colorIndex) || r.colorIndex < 0 || r.value <= e && (!n || r.value >= n.value) && (n = r));
|
|
146
|
+
return n?.colorIndex;
|
|
147
|
+
}
|
|
148
|
+
function B(e, t) {
|
|
141
149
|
let n = t?.progressMin ?? 0, r = (t?.progressMax ?? 100) - n;
|
|
142
|
-
return r === 0 ? 1 :
|
|
150
|
+
return r === 0 ? 1 : U((e - n) / r, 0, 1);
|
|
143
151
|
}
|
|
144
|
-
function
|
|
152
|
+
function V(e) {
|
|
145
153
|
return typeof e == "boolean" ? e ? "true" : "false" : typeof e == "number" ? e.toLocaleString() : e instanceof Date ? e.toISOString() : String(e);
|
|
146
154
|
}
|
|
147
|
-
function
|
|
155
|
+
function H(e) {
|
|
148
156
|
if (typeof e == "number") return Number.isFinite(e) ? e : null;
|
|
149
157
|
if (typeof e == "string" && e.trim() !== "") {
|
|
150
158
|
let t = Number(e);
|
|
@@ -152,25 +160,25 @@ function V(e) {
|
|
|
152
160
|
}
|
|
153
161
|
return null;
|
|
154
162
|
}
|
|
155
|
-
function
|
|
163
|
+
function U(e, t, n) {
|
|
156
164
|
return Math.min(n, Math.max(t, e));
|
|
157
165
|
}
|
|
158
|
-
function
|
|
166
|
+
function W(e, t, n) {
|
|
159
167
|
let r = n === "asc" ? 1 : -1;
|
|
160
168
|
return [...e].sort((e, n) => {
|
|
161
|
-
let i =
|
|
162
|
-
return i || a ? i && a ? 0 : i ? 1 : -1 : r *
|
|
169
|
+
let i = G(e[t]), a = G(n[t]);
|
|
170
|
+
return i || a ? i && a ? 0 : i ? 1 : -1 : r * K(e[t], n[t]);
|
|
163
171
|
});
|
|
164
172
|
}
|
|
165
|
-
function
|
|
173
|
+
function G(e) {
|
|
166
174
|
return e == null || e === "";
|
|
167
175
|
}
|
|
168
|
-
function
|
|
169
|
-
let n =
|
|
176
|
+
function K(e, t) {
|
|
177
|
+
let n = H(e), r = H(t);
|
|
170
178
|
return n !== null && r !== null ? n - r : String(e).localeCompare(String(t));
|
|
171
179
|
}
|
|
172
180
|
function ee(e) {
|
|
173
|
-
let { rows: t, chartConfig: n, queryObject: r } = e, i = u(() =>
|
|
181
|
+
let { rows: t, chartConfig: n, queryObject: r } = e, i = u(() => q(t, n, r), [
|
|
174
182
|
t,
|
|
175
183
|
n,
|
|
176
184
|
r
|
|
@@ -205,7 +213,7 @@ function ee(e) {
|
|
|
205
213
|
])
|
|
206
214
|
};
|
|
207
215
|
}
|
|
208
|
-
function
|
|
216
|
+
function q(t, n, r) {
|
|
209
217
|
let i = Object.keys(t[0] ?? {}), a = new Set(n?.hiddenColumns ?? []), o = n?.columns?.filter((e) => i.includes(e));
|
|
210
218
|
if (o && o.length > 0) return o.filter((e) => !a.has(e));
|
|
211
219
|
let s = e(r).filter((e) => i.includes(e));
|
|
@@ -262,7 +270,7 @@ function ne(e) {
|
|
|
262
270
|
column: e,
|
|
263
271
|
direction: "asc"
|
|
264
272
|
});
|
|
265
|
-
}, [n]), h = u(() => !d && i ?
|
|
273
|
+
}, [n]), h = u(() => !d && i ? W(t, i.column, i.direction) : t, [
|
|
266
274
|
t,
|
|
267
275
|
d,
|
|
268
276
|
i
|
|
@@ -290,7 +298,7 @@ function ne(e) {
|
|
|
290
298
|
}
|
|
291
299
|
//#endregion
|
|
292
300
|
//#region src/client/components/charts/RecordsTable.tsx
|
|
293
|
-
var
|
|
301
|
+
var re = t("chevronUp"), ie = t("chevronDown"), ae = s.memo(function({ data: e, chartConfig: t, displayConfig: r = {}, queryObject: a, colorPalette: s, height: l = 300, onDataPointClick: d, drillEnabled: f, pagination: h }) {
|
|
294
302
|
let { t: g } = i(), { getFieldLabel: v } = n(), y = u(() => Array.isArray(e) ? e : [], [e]), b = r.columnFormats ?? {}, { columns: x, storageKey: S, draggedColumn: C, didDragRef: w, startColumnDrag: T, endColumnDrag: E, dropColumn: D } = ee({
|
|
295
303
|
rows: y,
|
|
296
304
|
chartConfig: t,
|
|
@@ -348,7 +356,7 @@ var q = t("chevronUp"), re = t("chevronDown"), ie = s.memo(function({ data: e, c
|
|
|
348
356
|
/* @__PURE__ */ p("colgroup", { children: x.map((e) => /* @__PURE__ */ p("col", { style: { width: O[e] ?? 160 } }, e)) }),
|
|
349
357
|
/* @__PURE__ */ p("thead", {
|
|
350
358
|
className: "bg-dc-surface-secondary dc:sticky dc:top-0 dc:z-20",
|
|
351
|
-
children: /* @__PURE__ */ p("tr", { children: x.map((e) => /* @__PURE__ */ p(
|
|
359
|
+
children: /* @__PURE__ */ p("tr", { children: x.map((e) => /* @__PURE__ */ p(oe, {
|
|
352
360
|
column: e,
|
|
353
361
|
label: b[e]?.label || v(e),
|
|
354
362
|
align: b[e]?.align ?? J(b[e]),
|
|
@@ -363,7 +371,7 @@ var q = t("chevronUp"), re = t("chevronDown"), ie = s.memo(function({ data: e, c
|
|
|
363
371
|
}),
|
|
364
372
|
/* @__PURE__ */ p("tbody", {
|
|
365
373
|
className: "bg-dc-surface",
|
|
366
|
-
children: F.map((e, t) => /* @__PURE__ */ p(
|
|
374
|
+
children: F.map((e, t) => /* @__PURE__ */ p(se, {
|
|
367
375
|
row: e,
|
|
368
376
|
columns: x,
|
|
369
377
|
columnFormats: b,
|
|
@@ -409,7 +417,7 @@ var q = t("chevronUp"), re = t("chevronDown"), ie = s.memo(function({ data: e, c
|
|
|
409
417
|
function J(e) {
|
|
410
418
|
return e?.kind === "number" ? "right" : "left";
|
|
411
419
|
}
|
|
412
|
-
function
|
|
420
|
+
function oe({ column: e, label: t, align: n, sortDirection: r, isDropTarget: i, onClick: a, onResizeStart: o, onDragStart: s, onDragEnd: c, onDrop: l }) {
|
|
413
421
|
return /* @__PURE__ */ m("th", {
|
|
414
422
|
draggable: !0,
|
|
415
423
|
onDragStart: (t) => {
|
|
@@ -431,8 +439,8 @@ function ae({ column: e, label: t, align: n, sortDirection: r, isDropTarget: i,
|
|
|
431
439
|
className: "dc:truncate",
|
|
432
440
|
children: t
|
|
433
441
|
}),
|
|
434
|
-
r === "asc" && /* @__PURE__ */ p(
|
|
435
|
-
r === "desc" && /* @__PURE__ */ p(
|
|
442
|
+
r === "asc" && /* @__PURE__ */ p(re, { className: "dc:w-3 dc:h-3 text-dc-accent dc:shrink-0" }),
|
|
443
|
+
r === "desc" && /* @__PURE__ */ p(ie, { className: "dc:w-3 dc:h-3 text-dc-accent dc:shrink-0" })
|
|
436
444
|
]
|
|
437
445
|
}), /* @__PURE__ */ p("div", {
|
|
438
446
|
onMouseDown: (t) => o(t, e),
|
|
@@ -440,26 +448,32 @@ function ae({ column: e, label: t, align: n, sortDirection: r, isDropTarget: i,
|
|
|
440
448
|
})]
|
|
441
449
|
});
|
|
442
450
|
}
|
|
443
|
-
function
|
|
451
|
+
function se({ row: e, columns: t, columnFormats: n, colorPalette: r, href: i, target: a, clickable: o, onCellClick: s }) {
|
|
444
452
|
return /* @__PURE__ */ p("tr", {
|
|
445
453
|
className: `dc:border-b border-dc-border hover:bg-dc-surface-secondary${o ? " dc:cursor-pointer" : ""}`,
|
|
446
454
|
children: t.map((t) => {
|
|
447
|
-
let o = n[t], c = o?.align ?? J(o);
|
|
455
|
+
let o = n[t], c = o?.align ?? J(o), l = A(e[t], o), u = ce(o, l, e);
|
|
448
456
|
return /* @__PURE__ */ p("td", {
|
|
449
|
-
onClick: (n) =>
|
|
457
|
+
onClick: (n) => {
|
|
458
|
+
u || s(e, t, n);
|
|
459
|
+
},
|
|
450
460
|
className: `dc:px-3 dc:py-1.5 dc:text-sm text-dc-text dc:overflow-hidden${c === "right" ? " dc:text-right dc:tabular-nums" : ""}`,
|
|
451
|
-
children: /* @__PURE__ */ p(
|
|
452
|
-
cell:
|
|
461
|
+
children: /* @__PURE__ */ p(le, {
|
|
462
|
+
cell: l,
|
|
453
463
|
colorPalette: r,
|
|
454
|
-
href: i,
|
|
455
|
-
target: a
|
|
464
|
+
href: u ?? i,
|
|
465
|
+
target: u ? void 0 : a,
|
|
466
|
+
isCellLink: u !== null
|
|
456
467
|
})
|
|
457
468
|
}, t);
|
|
458
469
|
})
|
|
459
470
|
});
|
|
460
471
|
}
|
|
461
|
-
function
|
|
462
|
-
|
|
472
|
+
function ce(e, t, n) {
|
|
473
|
+
return e?.kind !== "link" || typeof e.linkTemplate != "string" || t.text === "" ? null : _(e.linkTemplate, n);
|
|
474
|
+
}
|
|
475
|
+
function le({ cell: e, colorPalette: t, href: n, target: r, isCellLink: i }) {
|
|
476
|
+
let a = /* @__PURE__ */ p(ue, {
|
|
463
477
|
cell: e,
|
|
464
478
|
colorPalette: t
|
|
465
479
|
});
|
|
@@ -467,11 +481,11 @@ function se({ cell: e, colorPalette: t, href: n, target: r }) {
|
|
|
467
481
|
href: n,
|
|
468
482
|
target: r === "blank" ? "_blank" : void 0,
|
|
469
483
|
rel: r === "blank" ? "noopener noreferrer" : void 0,
|
|
470
|
-
className: "dc:block dc:no-underline dc:text-inherit hover:
|
|
471
|
-
children:
|
|
472
|
-
}) :
|
|
484
|
+
className: i ? "dc:block dc:no-underline text-dc-accent dc:hover:underline" : "dc:block dc:no-underline dc:text-inherit dc:hover:underline",
|
|
485
|
+
children: a
|
|
486
|
+
}) : a;
|
|
473
487
|
}
|
|
474
|
-
function
|
|
488
|
+
function ue({ cell: e, colorPalette: t }) {
|
|
475
489
|
if (e.kind === "badge") {
|
|
476
490
|
let n = e.colorIndex === void 0 ? void 0 : t?.colors[e.colorIndex];
|
|
477
491
|
return /* @__PURE__ */ p("span", {
|
|
@@ -488,28 +502,36 @@ function ce({ cell: e, colorPalette: t }) {
|
|
|
488
502
|
children: e.text
|
|
489
503
|
});
|
|
490
504
|
}
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
505
|
+
if (e.kind === "progress") {
|
|
506
|
+
let n = e.colorIndex === void 0 ? void 0 : t?.colors[e.colorIndex];
|
|
507
|
+
return /* @__PURE__ */ m("div", {
|
|
508
|
+
className: "dc:flex dc:items-center dc:gap-2",
|
|
509
|
+
children: [e.style === "circle" ? /* @__PURE__ */ p(de, {
|
|
510
|
+
fraction: e.fraction,
|
|
511
|
+
label: e.text,
|
|
512
|
+
color: n
|
|
513
|
+
}) : /* @__PURE__ */ p("div", {
|
|
514
|
+
className: "dc:flex-1 dc:h-2 dc:rounded-full dc:overflow-hidden dc:border border-dc-border bg-dc-surface-secondary dc:min-w-[2rem]",
|
|
515
|
+
children: /* @__PURE__ */ p("div", {
|
|
516
|
+
className: `dc:h-full dc:rounded-full${n ? "" : " bg-dc-primary"}`,
|
|
517
|
+
style: {
|
|
518
|
+
width: `${e.fraction * 100}%`,
|
|
519
|
+
backgroundColor: n
|
|
520
|
+
}
|
|
521
|
+
})
|
|
522
|
+
}), /* @__PURE__ */ p("span", {
|
|
523
|
+
className: "dc:w-16 dc:shrink-0 dc:text-right dc:text-xs dc:tabular-nums dc:truncate",
|
|
524
|
+
children: e.text
|
|
525
|
+
})]
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
return /* @__PURE__ */ p("span", {
|
|
507
529
|
className: "dc:truncate dc:block",
|
|
508
530
|
children: e.text
|
|
509
531
|
});
|
|
510
532
|
}
|
|
511
533
|
var Y = 18, X = 3, Z = Y / 2, Q = Z - X / 2;
|
|
512
|
-
function
|
|
534
|
+
function de({ fraction: e, label: t, color: n }) {
|
|
513
535
|
return /* @__PURE__ */ m("svg", {
|
|
514
536
|
role: "img",
|
|
515
537
|
"aria-label": t,
|
|
@@ -529,7 +551,7 @@ function le({ fraction: e, label: t }) {
|
|
|
529
551
|
cy: Z,
|
|
530
552
|
r: Q,
|
|
531
553
|
fill: "none",
|
|
532
|
-
stroke: "var(--dc-primary)",
|
|
554
|
+
stroke: n ?? "var(--dc-primary)",
|
|
533
555
|
strokeWidth: X,
|
|
534
556
|
strokeLinecap: "round",
|
|
535
557
|
pathLength: 100,
|
|
@@ -551,6 +573,6 @@ function $({ label: e, disabled: t, onClick: n, children: r }) {
|
|
|
551
573
|
});
|
|
552
574
|
}
|
|
553
575
|
//#endregion
|
|
554
|
-
export {
|
|
576
|
+
export { ae as default };
|
|
555
577
|
|
|
556
|
-
//# sourceMappingURL=RecordsTable-
|
|
578
|
+
//# sourceMappingURL=RecordsTable-BoQZiVVM.js.map
|