drizzle-cube 0.4.42 → 0.4.43
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 +1 -1
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +2 -2
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +2 -2
- package/dist/adapters/{handler-dHHEEbG9.cjs → handler-BneUGY0k.cjs} +1 -1
- package/dist/adapters/{handler-fto6TSVn.js → handler-CiQoQsnP.js} +1 -1
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +5 -5
- package/dist/adapters/{mcp-transport-tB5a7Het.js → mcp-transport-CC3hQOnb.js} +1099 -1338
- package/dist/adapters/mcp-transport-mmuPvjfR.cjs +255 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +2 -2
- package/dist/adapters/{openai-Ckpe7iU7.js → openai-CQfaz257.js} +1 -1
- package/dist/{server/openai-DKpZPCay.cjs → adapters/openai-CZ74gWd4.cjs} +1 -1
- package/dist/adapters/{openai-Bc8qwEKW.cjs → openai-DLfardui.cjs} +1 -1
- package/dist/adapters/{openai-DxeVtl8X.js → openai-DaxuhJLS.js} +1 -1
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/{DashboardEditModal-4zzjtZRR.js → DashboardEditModal-BTdV528l.js} +1421 -1396
- package/dist/client/chunks/DashboardEditModal-BTdV528l.js.map +1 -0
- package/dist/client/chunks/{FieldSearchModal-trURu9Sa.js → FieldSearchModal-D75vy4Wb.js} +4 -4
- package/dist/client/chunks/{FieldSearchModal-trURu9Sa.js.map → FieldSearchModal-D75vy4Wb.js.map} +1 -1
- package/dist/client/chunks/KpiDelta-Bk8bzKYM.js +2 -0
- package/dist/client/chunks/KpiNumber-CKF-8e_T.js +2 -0
- package/dist/client/chunks/KpiText-Iz1vIvu_.js +2 -0
- package/dist/client/chunks/{RetentionCombinedChart-B1hUYaXt.js → RetentionCombinedChart-DIhK5pD8.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-B1hUYaXt.js.map → RetentionCombinedChart-DIhK5pD8.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-Dn2ocjVf.js → RetentionHeatmap-CyREolyP.js} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-Dn2ocjVf.js.map → RetentionHeatmap-CyREolyP.js.map} +1 -1
- package/dist/client/chunks/SchemaVisualization-B1GUT-FM.js +2 -0
- package/dist/client/chunks/SchemaVisualizationLazy-DymwT34e.js +2 -0
- package/dist/client/chunks/{analysis-builder-B7XSIMkr.js → analysis-builder-C1CJ0c7L.js} +52 -52
- package/dist/client/chunks/{analysis-builder-B7XSIMkr.js.map → analysis-builder-C1CJ0c7L.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-DaqtrLxd.js → analysis-builder-shared-rkjJfWLT.js} +9 -9
- package/dist/client/chunks/{analysis-builder-shared-DaqtrLxd.js.map → analysis-builder-shared-rkjJfWLT.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-wR2Twpo7.js → chart-activity-grid-DLktOINm.js} +2 -2
- package/dist/client/chunks/{chart-activity-grid-wR2Twpo7.js.map → chart-activity-grid-DLktOINm.js.map} +1 -1
- package/dist/client/chunks/{chart-area-e9ysnatQ.js → chart-area-BwYaflNk.js} +3 -3
- package/dist/client/chunks/{chart-area-e9ysnatQ.js.map → chart-area-BwYaflNk.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-CPt67rLR.js → chart-bar-BiENfFgE.js} +4 -4
- package/dist/client/chunks/{chart-bar-CPt67rLR.js.map → chart-bar-BiENfFgE.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-Dp_nqQen.js → chart-box-plot-BJF1tBXC.js} +3 -3
- package/dist/client/chunks/{chart-box-plot-Dp_nqQen.js.map → chart-box-plot-BJF1tBXC.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-CYQ8loeS.js → chart-bubble-DQQhGVDJ.js} +3 -3
- package/dist/client/chunks/{chart-bubble-CYQ8loeS.js.map → chart-bubble-DQQhGVDJ.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-DTeSf7C5.js → chart-candlestick-C2UuXbLe.js} +3 -3
- package/dist/client/chunks/{chart-candlestick-DTeSf7C5.js.map → chart-candlestick-C2UuXbLe.js.map} +1 -1
- package/dist/client/chunks/{chart-config-activity-grid-BSWS08cI.js → chart-config-activity-grid-DJOU3TEz.js} +2 -2
- package/dist/client/chunks/{chart-config-activity-grid-BSWS08cI.js.map → chart-config-activity-grid-DJOU3TEz.js.map} +1 -1
- package/dist/client/chunks/{chart-config-area-DKwgcHp4.js → chart-config-area-CWnWVT6a.js} +2 -2
- package/dist/client/chunks/{chart-config-area-DKwgcHp4.js.map → chart-config-area-CWnWVT6a.js.map} +1 -1
- package/dist/client/chunks/{chart-config-bar-deTjEhap.js → chart-config-bar-C-7Dr1Ho.js} +2 -2
- package/dist/client/chunks/{chart-config-bar-deTjEhap.js.map → chart-config-bar-C-7Dr1Ho.js.map} +1 -1
- package/dist/client/chunks/{chart-config-box-plot-DU4iWk3V.js → chart-config-box-plot-mVOwmLdu.js} +2 -2
- package/dist/client/chunks/{chart-config-box-plot-DU4iWk3V.js.map → chart-config-box-plot-mVOwmLdu.js.map} +1 -1
- package/dist/client/chunks/{chart-config-bubble-B8FSHSW-.js → chart-config-bubble-BPE2CeiD.js} +2 -2
- package/dist/client/chunks/{chart-config-bubble-B8FSHSW-.js.map → chart-config-bubble-BPE2CeiD.js.map} +1 -1
- package/dist/client/chunks/{chart-config-candlestick-BGfyWFft.js → chart-config-candlestick-BSB9DRy2.js} +2 -2
- package/dist/client/chunks/{chart-config-candlestick-BGfyWFft.js.map → chart-config-candlestick-BSB9DRy2.js.map} +1 -1
- package/dist/client/chunks/{chart-config-data-table-DKRcGa8t.js → chart-config-data-table-Bhdx5Hem.js} +2 -2
- package/dist/client/chunks/{chart-config-data-table-DKRcGa8t.js.map → chart-config-data-table-Bhdx5Hem.js.map} +1 -1
- package/dist/client/chunks/{chart-config-funnel-Bt4iGFo_.js → chart-config-funnel-Cl-v-bm1.js} +2 -2
- package/dist/client/chunks/{chart-config-funnel-Bt4iGFo_.js.map → chart-config-funnel-Cl-v-bm1.js.map} +1 -1
- package/dist/client/chunks/{chart-config-gauge-Bk4Jjp3W.js → chart-config-gauge-CdrUTJMJ.js} +2 -2
- package/dist/client/chunks/{chart-config-gauge-Bk4Jjp3W.js.map → chart-config-gauge-CdrUTJMJ.js.map} +1 -1
- package/dist/client/chunks/{chart-config-heat-map-CkHsqkrY.js → chart-config-heat-map-DGE3NzoF.js} +2 -2
- package/dist/client/chunks/{chart-config-heat-map-CkHsqkrY.js.map → chart-config-heat-map-DGE3NzoF.js.map} +1 -1
- package/dist/client/chunks/{chart-config-kpi-delta-CkUX98JV.js → chart-config-kpi-delta-DMrQerUW.js} +2 -2
- package/dist/client/chunks/{chart-config-kpi-delta-CkUX98JV.js.map → chart-config-kpi-delta-DMrQerUW.js.map} +1 -1
- package/dist/client/chunks/{chart-config-kpi-number-DcxyiUgs.js → chart-config-kpi-number-DCytCytn.js} +2 -2
- package/dist/client/chunks/{chart-config-kpi-number-DcxyiUgs.js.map → chart-config-kpi-number-DCytCytn.js.map} +1 -1
- package/dist/client/chunks/{chart-config-kpi-text-DI4mj8CN.js → chart-config-kpi-text-KdKQUvHo.js} +2 -2
- package/dist/client/chunks/{chart-config-kpi-text-DI4mj8CN.js.map → chart-config-kpi-text-KdKQUvHo.js.map} +1 -1
- package/dist/client/chunks/{chart-config-line--j7-dLue.js → chart-config-line-Bl9VDAdz.js} +2 -2
- package/dist/client/chunks/{chart-config-line--j7-dLue.js.map → chart-config-line-Bl9VDAdz.js.map} +1 -1
- package/dist/client/chunks/{chart-config-markdown-DUjvVjV4.js → chart-config-markdown-BX26b94i.js} +2 -2
- package/dist/client/chunks/{chart-config-markdown-DUjvVjV4.js.map → chart-config-markdown-BX26b94i.js.map} +1 -1
- package/dist/client/chunks/{chart-config-measure-profile-B9FKBNGc.js → chart-config-measure-profile-DwtRhEFh.js} +2 -2
- package/dist/client/chunks/{chart-config-measure-profile-B9FKBNGc.js.map → chart-config-measure-profile-DwtRhEFh.js.map} +1 -1
- package/dist/client/chunks/{chart-config-pie-yU4jipl9.js → chart-config-pie-BzBcqPMJ.js} +2 -2
- package/dist/client/chunks/{chart-config-pie-yU4jipl9.js.map → chart-config-pie-BzBcqPMJ.js.map} +1 -1
- package/dist/client/chunks/{chart-config-radar-R9Fkc8wL.js → chart-config-radar-6ZOgt__z.js} +2 -2
- package/dist/client/chunks/{chart-config-radar-R9Fkc8wL.js.map → chart-config-radar-6ZOgt__z.js.map} +1 -1
- package/dist/client/chunks/{chart-config-radial-bar-DeoXfpIp.js → chart-config-radial-bar-Df6Eta7N.js} +2 -2
- package/dist/client/chunks/{chart-config-radial-bar-DeoXfpIp.js.map → chart-config-radial-bar-Df6Eta7N.js.map} +1 -1
- package/dist/client/chunks/{chart-config-sankey-CXEsxo6s.js → chart-config-sankey-DgqKBFvN.js} +2 -2
- package/dist/client/chunks/{chart-config-sankey-CXEsxo6s.js.map → chart-config-sankey-DgqKBFvN.js.map} +1 -1
- package/dist/client/chunks/{chart-config-scatter-MVUFupub.js → chart-config-scatter-D5nVLDvi.js} +2 -2
- package/dist/client/chunks/{chart-config-scatter-MVUFupub.js.map → chart-config-scatter-D5nVLDvi.js.map} +1 -1
- package/dist/client/chunks/{chart-config-sunburst-Z_gqIY5u.js → chart-config-sunburst-Ca3FX9nW.js} +2 -2
- package/dist/client/chunks/{chart-config-sunburst-Z_gqIY5u.js.map → chart-config-sunburst-Ca3FX9nW.js.map} +1 -1
- package/dist/client/chunks/{chart-config-tree-map-BD-xAeIy.js → chart-config-tree-map-Bjy4QNa3.js} +2 -2
- package/dist/client/chunks/{chart-config-tree-map-BD-xAeIy.js.map → chart-config-tree-map-Bjy4QNa3.js.map} +1 -1
- package/dist/client/chunks/{chart-config-waterfall-CHwVkXZc.js → chart-config-waterfall-C5K2eqR7.js} +2 -2
- package/dist/client/chunks/{chart-config-waterfall-CHwVkXZc.js.map → chart-config-waterfall-C5K2eqR7.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-BZ7StNWv.js → chart-data-table-2iCsn0CF.js} +1099 -933
- package/dist/client/chunks/chart-data-table-2iCsn0CF.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-C9JRW79j.js → chart-funnel-poyOf7-e.js} +3 -3
- package/dist/client/chunks/{chart-funnel-C9JRW79j.js.map → chart-funnel-poyOf7-e.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-_Xdgk_qI.js → chart-gauge-D5J4gRky.js} +3 -3
- package/dist/client/chunks/{chart-gauge-_Xdgk_qI.js.map → chart-gauge-D5J4gRky.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-BOMQeUDL.js → chart-heat-map-BAMVhLGG.js} +3 -3
- package/dist/client/chunks/{chart-heat-map-BOMQeUDL.js.map → chart-heat-map-BAMVhLGG.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-C2tdpWki.js → chart-kpi-delta-KQjUIeal.js} +71 -73
- package/dist/client/chunks/{chart-kpi-delta-C2tdpWki.js.map → chart-kpi-delta-KQjUIeal.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-BUNKM7yg.js → chart-kpi-number-CsQgV_x3.js} +62 -63
- package/dist/client/chunks/{chart-kpi-number-BUNKM7yg.js.map → chart-kpi-number-CsQgV_x3.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-COF8iN0K.js → chart-kpi-text-BR0IyeUU.js} +26 -27
- package/dist/client/chunks/{chart-kpi-text-COF8iN0K.js.map → chart-kpi-text-BR0IyeUU.js.map} +1 -1
- package/dist/client/chunks/{chart-line-D3SEwXDS.js → chart-line-B5_WntY5.js} +4 -4
- package/dist/client/chunks/{chart-line-D3SEwXDS.js.map → chart-line-B5_WntY5.js.map} +1 -1
- package/dist/client/chunks/{chart-markdown-DMekYkKz.js → chart-markdown-B6bENbel.js} +2 -2
- package/dist/client/chunks/{chart-markdown-DMekYkKz.js.map → chart-markdown-B6bENbel.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-BPhI1Z9s.js → chart-measure-profile-yWk-obNb.js} +4 -4
- package/dist/client/chunks/{chart-measure-profile-BPhI1Z9s.js.map → chart-measure-profile-yWk-obNb.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-COl3Rmdk.js → chart-pie-BodrUoHv.js} +4 -4
- package/dist/client/chunks/{chart-pie-COl3Rmdk.js.map → chart-pie-BodrUoHv.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-BKZXylBB.js → chart-radar-gG3zfLud.js} +4 -4
- package/dist/client/chunks/{chart-radar-BKZXylBB.js.map → chart-radar-gG3zfLud.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-CMfC7SPd.js → chart-radial-bar-C2IPCV8c.js} +4 -4
- package/dist/client/chunks/{chart-radial-bar-CMfC7SPd.js.map → chart-radial-bar-C2IPCV8c.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-8nRYnupt.js → chart-sankey-BOyxfG1Q.js} +3 -3
- package/dist/client/chunks/{chart-sankey-8nRYnupt.js.map → chart-sankey-BOyxfG1Q.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-xQMa3dUt.js → chart-scatter-B8OwlsAX.js} +4 -4
- package/dist/client/chunks/{chart-scatter-xQMa3dUt.js.map → chart-scatter-B8OwlsAX.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-BGhJ4fui.js → chart-sunburst-D9lGEOCc.js} +4 -4
- package/dist/client/chunks/{chart-sunburst-BGhJ4fui.js.map → chart-sunburst-D9lGEOCc.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-Cn1pmrAw.js → chart-tree-map-DZaKy9he.js} +4 -4
- package/dist/client/chunks/{chart-tree-map-Cn1pmrAw.js.map → chart-tree-map-DZaKy9he.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-C2nVN4pn.js → chart-waterfall-BCdUx4DC.js} +4 -4
- package/dist/client/chunks/{chart-waterfall-C2nVN4pn.js.map → chart-waterfall-BCdUx4DC.js.map} +1 -1
- package/dist/client/chunks/{charts-core-Cy3rHADX.js → charts-core-C5Yokk-x.js} +2 -2
- package/dist/client/chunks/{charts-core-Cy3rHADX.js.map → charts-core-C5Yokk-x.js.map} +1 -1
- package/dist/client/chunks/{core-BdWfCZ3y.js → core-DcfMGTVa.js} +2 -2
- package/dist/client/chunks/{core-BdWfCZ3y.js.map → core-DcfMGTVa.js.map} +1 -1
- package/dist/client/chunks/{dist-BWPE2m_X.js → dist-eZurnOde.js} +1 -1
- package/dist/client/chunks/{dist-BWPE2m_X.js.map → dist-eZurnOde.js.map} +1 -1
- package/dist/client/chunks/exceljs.min-CcjgM-qg.js +31986 -0
- package/dist/client/chunks/exceljs.min-CcjgM-qg.js.map +1 -0
- package/dist/client/chunks/{javascript-O1RIRkZr.js → javascript-DFvvCuoP.js} +1 -1
- package/dist/client/chunks/{javascript-O1RIRkZr.js.map → javascript-DFvvCuoP.js.map} +1 -1
- package/dist/client/chunks/{json-C5bX2tt1.js → json-BBm9TlrA.js} +1 -1
- package/dist/client/chunks/{json-C5bX2tt1.js.map → json-BBm9TlrA.js.map} +1 -1
- package/dist/client/chunks/{rolldown-runtime-lc2dmIiU.js → rolldown-runtime-CCl2IeXn.js} +5 -2
- package/dist/client/chunks/{schema-visualization-DVdfx6N8.js → schema-visualization-t1KiOORo.js} +261 -265
- package/dist/client/chunks/{schema-visualization-DVdfx6N8.js.map → schema-visualization-t1KiOORo.js.map} +1 -1
- package/dist/client/chunks/{sql-D2qikO5q.js → sql-k0GA6oZ_.js} +1 -1
- package/dist/client/chunks/{sql-D2qikO5q.js.map → sql-k0GA6oZ_.js.map} +1 -1
- package/dist/client/chunks/{syntaxHighlighting-BYYWYmjr.js → syntaxHighlighting-CnDujqwg.js} +2 -2
- package/dist/client/chunks/{syntaxHighlighting-BYYWYmjr.js.map → syntaxHighlighting-CnDujqwg.js.map} +1 -1
- package/dist/client/chunks/{useDebounce-Bel8J05v.js → useDebounce-CKqkM42n.js} +11 -14
- package/dist/client/chunks/{useDebounce-Bel8J05v.js.map → useDebounce-CKqkM42n.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-CxdzY2N0.js → useExplainAI-DBIfYwz-.js} +12 -12
- package/dist/client/chunks/{useExplainAI-CxdzY2N0.js.map → useExplainAI-DBIfYwz-.js.map} +1 -1
- package/dist/client/chunks/{utils-CMkS7h9x.js → utils--qCr8Yn5.js} +2 -2
- package/dist/client/chunks/utils--qCr8Yn5.js.map +1 -0
- package/dist/client/chunks/{vendor-BoWEubRu.js → vendor-BRlsCGnK.js} +46 -46
- package/dist/client/chunks/{vendor-BoWEubRu.js.map → vendor-BRlsCGnK.js.map} +1 -1
- package/dist/client/components.js +3 -3
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons/types.d.ts +1 -0
- package/dist/client/icons.js +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.js +168 -168
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/types.d.ts +6 -0
- package/dist/client/utils/exportXlsx.d.ts +20 -0
- package/dist/client/utils/index.d.ts +1 -0
- package/dist/client/utils.js +7 -7
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/{openai-DqCEogm0.js → openai-CqZg6zYL.js} +1 -1
- package/dist/server/{openai-0HbLlZq6.cjs → openai-D9Zjuby1.cjs} +1 -1
- package/dist/{adapters/openai-C96O8M75.cjs → server/openai-DmuEbFd6.cjs} +1 -1
- package/dist/server/{openai-DnGeU9PT.js → openai-rwauPzCT.js} +1 -1
- package/package.json +6 -1
- package/dist/adapters/mcp-transport-ro4OL4BW.cjs +0 -255
- package/dist/client/chunks/DashboardEditModal-4zzjtZRR.js.map +0 -1
- package/dist/client/chunks/chart-data-table-BZ7StNWv.js.map +0 -1
- package/dist/client/chunks/utils-CMkS7h9x.js.map +0 -1
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
1
|
+
import { B as e, z as t } from "./chart-data-table-2iCsn0CF.js";
|
|
2
|
+
import { _ as n } from "./chart-activity-grid-DLktOINm.js";
|
|
3
|
+
import { a as r, i, r as a } from "./chart-area-BwYaflNk.js";
|
|
4
|
+
import { n as o } from "./chart-kpi-delta-KQjUIeal.js";
|
|
5
|
+
import s, { useCallback as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
|
|
6
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
8
7
|
//#region src/client/components/DataHistogram.tsx
|
|
9
|
-
function
|
|
8
|
+
function h({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 12, height: a = 32, formatValue: o = (e) => e.toString(), width: s, showAverageIndicator: c = !0, targetValue: l }) {
|
|
10
9
|
let u = Array(i).fill(0), d = n - t;
|
|
11
10
|
e.forEach((e) => {
|
|
12
11
|
if (d === 0) u[Math.floor(i / 2)]++;
|
|
@@ -15,11 +14,11 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
15
14
|
n = Math.max(0, Math.min(i - 1, n)), u[n]++;
|
|
16
15
|
}
|
|
17
16
|
});
|
|
18
|
-
let f = Math.max(...u),
|
|
19
|
-
return /* @__PURE__ */
|
|
17
|
+
let f = Math.max(...u), h = e.reduce((e, t) => e + t, 0) / e.length, g = d === 0 ? 50 : (h - t) / d * 100, _ = l !== void 0 && d > 0 ? (l - t) / d * 100 : null;
|
|
18
|
+
return /* @__PURE__ */ m("div", {
|
|
20
19
|
className: "dc:flex dc:flex-col dc:items-center",
|
|
21
20
|
children: [
|
|
22
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ m("div", {
|
|
23
22
|
className: "dc:relative dc:flex dc:items-end dc:justify-center dc:space-x-0.5",
|
|
24
23
|
style: {
|
|
25
24
|
height: `${a}px`,
|
|
@@ -29,7 +28,7 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
29
28
|
children: [
|
|
30
29
|
u.map((e, t) => {
|
|
31
30
|
let n = f > 0 ? e / f : 0, i = .1;
|
|
32
|
-
return /* @__PURE__ */
|
|
31
|
+
return /* @__PURE__ */ p("div", {
|
|
33
32
|
className: "dc:flex-1 dc:rounded-t-sm dc:transition-all dc:duration-300 dc:ease-out",
|
|
34
33
|
style: {
|
|
35
34
|
height: `${(e > 0 ? Math.max(i, n) : i) * a}px`,
|
|
@@ -39,7 +38,7 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
39
38
|
title: `${e} values in this range`
|
|
40
39
|
}, t);
|
|
41
40
|
}),
|
|
42
|
-
c && /* @__PURE__ */
|
|
41
|
+
c && /* @__PURE__ */ p("div", {
|
|
43
42
|
className: "dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none",
|
|
44
43
|
style: {
|
|
45
44
|
left: `${g}%`,
|
|
@@ -49,8 +48,8 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
49
48
|
opacity: .8,
|
|
50
49
|
zIndex: 10
|
|
51
50
|
},
|
|
52
|
-
title: `Average: ${o(
|
|
53
|
-
children: /* @__PURE__ */
|
|
51
|
+
title: `Average: ${o(h)}`,
|
|
52
|
+
children: /* @__PURE__ */ p("div", {
|
|
54
53
|
className: "dc:absolute dc:-top-1",
|
|
55
54
|
style: {
|
|
56
55
|
left: "50%",
|
|
@@ -63,7 +62,7 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
63
62
|
}
|
|
64
63
|
})
|
|
65
64
|
}),
|
|
66
|
-
_ !== null && l !== void 0 && /* @__PURE__ */
|
|
65
|
+
_ !== null && l !== void 0 && /* @__PURE__ */ p("div", {
|
|
67
66
|
className: "dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none",
|
|
68
67
|
style: {
|
|
69
68
|
left: `${Math.max(0, Math.min(100, _))}%`,
|
|
@@ -74,7 +73,7 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
74
73
|
zIndex: 11
|
|
75
74
|
},
|
|
76
75
|
title: `Target: ${o(l)}`,
|
|
77
|
-
children: /* @__PURE__ */
|
|
76
|
+
children: /* @__PURE__ */ p("div", {
|
|
78
77
|
className: "dc:absolute dc:-top-1",
|
|
79
78
|
style: {
|
|
80
79
|
left: "50%",
|
|
@@ -89,15 +88,15 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
89
88
|
})
|
|
90
89
|
]
|
|
91
90
|
}),
|
|
92
|
-
/* @__PURE__ */
|
|
91
|
+
/* @__PURE__ */ m("div", {
|
|
93
92
|
className: "dc:flex dc:justify-between dc:mt-2 dc:text-xs text-dc-text-muted",
|
|
94
93
|
style: {
|
|
95
94
|
width: s ? `${s}px` : "200px",
|
|
96
95
|
minWidth: "200px"
|
|
97
96
|
},
|
|
98
|
-
children: [/* @__PURE__ */
|
|
97
|
+
children: [/* @__PURE__ */ p("span", { children: o(t) }), /* @__PURE__ */ p("span", { children: o(n) })]
|
|
99
98
|
}),
|
|
100
|
-
/* @__PURE__ */
|
|
99
|
+
/* @__PURE__ */ m("div", {
|
|
101
100
|
className: "dc:text-center dc:mt-1 dc:text-xs text-dc-text-muted",
|
|
102
101
|
children: [
|
|
103
102
|
"Average of ",
|
|
@@ -110,30 +109,30 @@ function g({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: i = 1
|
|
|
110
109
|
}
|
|
111
110
|
//#endregion
|
|
112
111
|
//#region src/client/components/charts/KpiNumber.tsx
|
|
113
|
-
var
|
|
114
|
-
let [x, S] =
|
|
115
|
-
if (!
|
|
116
|
-
let
|
|
117
|
-
return A && (
|
|
112
|
+
var g = s.memo(function({ data: s, chartConfig: g, displayConfig: _ = {}, queryObject: v, height: y = "100%", colorPalette: b }) {
|
|
113
|
+
let [x, S] = f(32), [C, w] = f(250), T = d(null), E = d(null), D = n(), O = u(() => g?.yAxis ? typeof g.yAxis == "string" ? [g.yAxis] : Array.isArray(g.yAxis) ? g.yAxis : [] : [], [g?.yAxis]), k = O[0] || "", A = v?.timeDimensions?.[0]?.dimension || void 0, j = u(() => {
|
|
114
|
+
if (!s || s.length === 0) return [];
|
|
115
|
+
let e = [...s];
|
|
116
|
+
return A && (e = e.sort((e, t) => {
|
|
118
117
|
let n = e[A], r = t[A];
|
|
119
118
|
return n < r ? -1 : n > r ? 1 : 0;
|
|
120
|
-
})),
|
|
121
|
-
}, [
|
|
119
|
+
})), e;
|
|
120
|
+
}, [s, A]), { useLastCompletePeriod: M = !0, skipLastPeriod: N = !1 } = _, { filteredData: P, excludedIncompletePeriod: F, skippedLastPeriod: I, granularity: L } = u(() => j.length === 0 ? {
|
|
122
121
|
filteredData: [],
|
|
123
122
|
excludedIncompletePeriod: !1,
|
|
124
123
|
skippedLastPeriod: !1,
|
|
125
124
|
granularity: void 0
|
|
126
|
-
} :
|
|
125
|
+
} : o(j, A, v, M, N), [
|
|
127
126
|
j,
|
|
128
127
|
A,
|
|
129
128
|
v,
|
|
130
129
|
M,
|
|
131
130
|
N
|
|
132
|
-
]), R = P, z =
|
|
131
|
+
]), R = P, z = u(() => !k || R.length === 0 ? [] : R.map((e) => {
|
|
133
132
|
if (e[k] !== void 0) return e[k];
|
|
134
133
|
let t = Object.keys(e).filter((t) => typeof e[t] == "number" && !isNaN(e[t]));
|
|
135
134
|
if (t.length > 0) return e[t[0]];
|
|
136
|
-
}).filter((e) => e != null && !isNaN(Number(e))).map((e) => Number(e)), [R, k]), { avg: B, min: V, max: H } =
|
|
135
|
+
}).filter((e) => e != null && !isNaN(Number(e))).map((e) => Number(e)), [R, k]), { avg: B, min: V, max: H } = u(() => z.length === 0 ? {
|
|
137
136
|
avg: 0,
|
|
138
137
|
min: 0,
|
|
139
138
|
max: 0
|
|
@@ -141,24 +140,24 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
141
140
|
avg: z.reduce((e, t) => e + t, 0) / z.length,
|
|
142
141
|
min: Math.min(...z),
|
|
143
142
|
max: Math.max(...z)
|
|
144
|
-
}, [z]), U =
|
|
143
|
+
}, [z]), U = c((e) => {
|
|
145
144
|
if (_.formatValue) return _.formatValue(e);
|
|
146
145
|
if (e == null) return "—";
|
|
147
146
|
let t = _.decimals ?? 0, n = _.prefix ?? "", r;
|
|
148
147
|
return r = Math.abs(e) >= 1e9 ? (e / 1e9).toFixed(t) + "B" : Math.abs(e) >= 1e6 ? (e / 1e6).toFixed(t) + "M" : Math.abs(e) >= 1e3 ? (e / 1e3).toFixed(t) + "K" : e.toFixed(t), n + r;
|
|
149
|
-
}, [_]), W = z.length === 1 ? z[0] : B, G = z.length > 1, K =
|
|
148
|
+
}, [_]), W = z.length === 1 ? z[0] : B, G = z.length > 1, K = u(() => {
|
|
150
149
|
if (_.valueColorIndex !== void 0 && b?.colors) {
|
|
151
150
|
let e = _.valueColorIndex;
|
|
152
151
|
if (e >= 0 && e < b.colors.length) return b.colors[e];
|
|
153
152
|
}
|
|
154
153
|
return b?.colors?.[0] || "#1f2937";
|
|
155
|
-
}, [_.valueColorIndex, b?.colors]), q =
|
|
154
|
+
}, [_.valueColorIndex, b?.colors]), q = u(() => r(_?.target || ""), [_?.target]), J = q.length > 0 ? q[0] : null, Y = J !== null && z.length > 0 ? a(W, J) : null, X = u(() => Y === null ? "#6B7280" : Y >= 0 ? b?.colors?.[_.positiveColorIndex ?? 1] || "#10B981" : b?.colors?.[_.negativeColorIndex ?? 7] || "#EF4444", [
|
|
156
155
|
Y,
|
|
157
156
|
_.positiveColorIndex,
|
|
158
157
|
_.negativeColorIndex,
|
|
159
158
|
b?.colors
|
|
160
159
|
]);
|
|
161
|
-
return
|
|
160
|
+
return l(() => {
|
|
162
161
|
let e = () => {
|
|
163
162
|
if (T.current) {
|
|
164
163
|
let e = T.current.getBoundingClientRect(), t = e.width, n = e.height;
|
|
@@ -178,23 +177,23 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
178
177
|
return T.current && n.observe(T.current), () => {
|
|
179
178
|
clearTimeout(t), n.disconnect();
|
|
180
179
|
};
|
|
181
|
-
}, [
|
|
180
|
+
}, [s, g]), !s || s.length === 0 ? /* @__PURE__ */ p("div", {
|
|
182
181
|
className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
|
|
183
182
|
style: {
|
|
184
183
|
height: y === "100%" ? "100%" : y,
|
|
185
184
|
minHeight: y === "100%" ? "200px" : void 0
|
|
186
185
|
},
|
|
187
|
-
children: /* @__PURE__ */
|
|
186
|
+
children: /* @__PURE__ */ m("div", {
|
|
188
187
|
className: "dc:text-center text-dc-text-muted",
|
|
189
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ p("div", {
|
|
190
189
|
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
191
190
|
children: "No data available"
|
|
192
|
-
}), /* @__PURE__ */
|
|
191
|
+
}), /* @__PURE__ */ p("div", {
|
|
193
192
|
className: "dc:text-xs text-dc-text-secondary",
|
|
194
193
|
children: "No data points to display"
|
|
195
194
|
})]
|
|
196
195
|
})
|
|
197
|
-
}) : O.length === 0 ? /* @__PURE__ */
|
|
196
|
+
}) : O.length === 0 ? /* @__PURE__ */ p("div", {
|
|
198
197
|
className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
|
|
199
198
|
style: {
|
|
200
199
|
height: y === "100%" ? "100%" : y,
|
|
@@ -203,17 +202,17 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
203
202
|
color: "var(--dc-danger)",
|
|
204
203
|
borderColor: "var(--dc-danger-border)"
|
|
205
204
|
},
|
|
206
|
-
children: /* @__PURE__ */
|
|
205
|
+
children: /* @__PURE__ */ m("div", {
|
|
207
206
|
className: "dc:text-center",
|
|
208
|
-
children: [/* @__PURE__ */
|
|
207
|
+
children: [/* @__PURE__ */ p("div", {
|
|
209
208
|
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
210
209
|
children: "Configuration Error"
|
|
211
|
-
}), /* @__PURE__ */
|
|
210
|
+
}), /* @__PURE__ */ p("div", {
|
|
212
211
|
className: "dc:text-xs",
|
|
213
212
|
children: "No measure fields configured"
|
|
214
213
|
})]
|
|
215
214
|
})
|
|
216
|
-
}) : z.length === 0 ? /* @__PURE__ */
|
|
215
|
+
}) : z.length === 0 ? /* @__PURE__ */ m("div", {
|
|
217
216
|
ref: T,
|
|
218
217
|
className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4",
|
|
219
218
|
style: {
|
|
@@ -221,7 +220,7 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
221
220
|
minHeight: y === "100%" ? "200px" : void 0
|
|
222
221
|
},
|
|
223
222
|
children: [
|
|
224
|
-
/* @__PURE__ */
|
|
223
|
+
/* @__PURE__ */ p("div", {
|
|
225
224
|
className: "text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3",
|
|
226
225
|
style: {
|
|
227
226
|
fontSize: "14px",
|
|
@@ -229,17 +228,17 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
229
228
|
},
|
|
230
229
|
children: D(k)
|
|
231
230
|
}),
|
|
232
|
-
/* @__PURE__ */
|
|
231
|
+
/* @__PURE__ */ p("div", {
|
|
233
232
|
className: "dc:font-bold dc:leading-none text-dc-text-muted",
|
|
234
233
|
style: { fontSize: `${x}px` },
|
|
235
234
|
children: "—"
|
|
236
235
|
}),
|
|
237
|
-
/* @__PURE__ */
|
|
236
|
+
/* @__PURE__ */ p("div", {
|
|
238
237
|
className: "dc:text-xs text-dc-text-muted dc:mt-2",
|
|
239
238
|
children: "No data"
|
|
240
239
|
})
|
|
241
240
|
]
|
|
242
|
-
}) : /* @__PURE__ */
|
|
241
|
+
}) : /* @__PURE__ */ m("div", {
|
|
243
242
|
ref: T,
|
|
244
243
|
className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4",
|
|
245
244
|
style: {
|
|
@@ -247,27 +246,27 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
247
246
|
minHeight: y === "100%" ? "200px" : void 0
|
|
248
247
|
},
|
|
249
248
|
children: [
|
|
250
|
-
/* @__PURE__ */
|
|
249
|
+
/* @__PURE__ */ m("div", {
|
|
251
250
|
className: "text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3 dc:flex dc:items-center dc:justify-center dc:gap-1",
|
|
252
251
|
style: {
|
|
253
252
|
fontSize: "14px",
|
|
254
253
|
lineHeight: "1.2"
|
|
255
254
|
},
|
|
256
|
-
children: [/* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ p("span", { children: (() => {
|
|
257
256
|
let e = D(k);
|
|
258
257
|
return e && e.length > 1 ? e : k;
|
|
259
|
-
})() }), (F || I) && /* @__PURE__ */
|
|
258
|
+
})() }), (F || I) && /* @__PURE__ */ p("span", {
|
|
260
259
|
title: I ? `Excludes last ${L || "period"}` : `Excludes current incomplete ${L}`,
|
|
261
260
|
className: "dc:cursor-help",
|
|
262
|
-
children: /* @__PURE__ */
|
|
263
|
-
icon:
|
|
261
|
+
children: /* @__PURE__ */ p(e, {
|
|
262
|
+
icon: t,
|
|
264
263
|
className: "dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70"
|
|
265
264
|
})
|
|
266
265
|
})]
|
|
267
266
|
}),
|
|
268
|
-
/* @__PURE__ */
|
|
267
|
+
/* @__PURE__ */ m("div", {
|
|
269
268
|
className: "dc:flex dc:items-center dc:justify-center dc:gap-4 dc:mb-3",
|
|
270
|
-
children: [/* @__PURE__ */
|
|
269
|
+
children: [/* @__PURE__ */ p("div", {
|
|
271
270
|
ref: E,
|
|
272
271
|
className: "dc:font-bold dc:leading-none",
|
|
273
272
|
style: {
|
|
@@ -275,17 +274,17 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
275
274
|
color: K
|
|
276
275
|
},
|
|
277
276
|
children: U(W)
|
|
278
|
-
}), J !== null && Y !== null && /* @__PURE__ */
|
|
277
|
+
}), J !== null && Y !== null && /* @__PURE__ */ m("div", {
|
|
279
278
|
className: "dc:flex dc:flex-col dc:items-start",
|
|
280
|
-
children: [/* @__PURE__ */
|
|
279
|
+
children: [/* @__PURE__ */ p("div", {
|
|
281
280
|
className: "dc:font-semibold",
|
|
282
281
|
style: {
|
|
283
282
|
fontSize: `${Math.max(12, x * .3)}px`,
|
|
284
283
|
color: X,
|
|
285
284
|
lineHeight: "1.2"
|
|
286
285
|
},
|
|
287
|
-
children:
|
|
288
|
-
}), /* @__PURE__ */
|
|
286
|
+
children: i(Y, 1)
|
|
287
|
+
}), /* @__PURE__ */ m("div", {
|
|
289
288
|
className: "text-dc-text-muted dc:text-xs",
|
|
290
289
|
style: {
|
|
291
290
|
opacity: .7,
|
|
@@ -295,7 +294,7 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
295
294
|
})]
|
|
296
295
|
})]
|
|
297
296
|
}),
|
|
298
|
-
_.suffix && !_.formatValue && /* @__PURE__ */
|
|
297
|
+
_.suffix && !_.formatValue && /* @__PURE__ */ p("div", {
|
|
299
298
|
className: "text-dc-text-muted dc:text-center",
|
|
300
299
|
style: {
|
|
301
300
|
fontSize: "14px",
|
|
@@ -304,9 +303,9 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
304
303
|
},
|
|
305
304
|
children: _.suffix
|
|
306
305
|
}),
|
|
307
|
-
G && /* @__PURE__ */
|
|
306
|
+
G && /* @__PURE__ */ p("div", {
|
|
308
307
|
className: "dc:mt-4",
|
|
309
|
-
children: /* @__PURE__ */
|
|
308
|
+
children: /* @__PURE__ */ p(h, {
|
|
310
309
|
values: z,
|
|
311
310
|
min: V,
|
|
312
311
|
max: H,
|
|
@@ -321,6 +320,6 @@ var _ = /* @__PURE__ */ e({ default: () => v }), v = c.memo(function({ data: e,
|
|
|
321
320
|
});
|
|
322
321
|
});
|
|
323
322
|
//#endregion
|
|
324
|
-
export {
|
|
323
|
+
export { h as n, g as t };
|
|
325
324
|
|
|
326
|
-
//# sourceMappingURL=chart-kpi-number-
|
|
325
|
+
//# sourceMappingURL=chart-kpi-number-CsQgV_x3.js.map
|
package/dist/client/chunks/{chart-kpi-number-BUNKM7yg.js.map → chart-kpi-number-CsQgV_x3.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-kpi-number-BUNKM7yg.js","names":[],"sources":["../../../src/client/components/DataHistogram.tsx","../../../src/client/components/charts/KpiNumber.tsx"],"sourcesContent":["\ninterface DataHistogramProps {\n /** Array of numeric values to create histogram from */\n values: number[]\n /** Minimum value in the dataset */\n min: number\n /** Maximum value in the dataset */\n max: number\n /** Color for the histogram bars */\n color?: string\n /** Number of buckets/bars to create (default: 12) */\n bucketCount?: number\n /** Height of the histogram in pixels (default: 32) */\n height?: number\n /** Format function for min/max labels */\n formatValue?: (value: number) => string\n /** Width of the histogram to match text above */\n width?: number\n /** Whether to show average indicator line (default: true) */\n showAverageIndicator?: boolean\n /** Target value to show as green line */\n targetValue?: number\n}\n\n/**\n * Reusable histogram component that shows the distribution of actual data values\n */\nexport default function DataHistogram({\n values,\n min,\n max,\n color = '#1f2937',\n bucketCount = 12,\n height = 32,\n formatValue = (val) => val.toString(),\n width,\n showAverageIndicator = true,\n targetValue\n}: DataHistogramProps) {\n // Create histogram buckets from actual data\n const buckets = new Array(bucketCount).fill(0)\n const range = max - min\n \n // Distribute actual values into buckets\n values.forEach(value => {\n if (range === 0) {\n // All values are the same, put everything in middle bucket\n buckets[Math.floor(bucketCount / 2)]++\n } else {\n // Calculate which bucket this value belongs to\n let bucketIndex = Math.floor(((value - min) / range) * (bucketCount - 1))\n // Clamp to valid bucket range\n bucketIndex = Math.max(0, Math.min(bucketCount - 1, bucketIndex))\n buckets[bucketIndex]++\n }\n })\n \n // Find max bucket count for normalization\n const maxBucketCount = Math.max(...buckets)\n \n // Calculate average for indicator positioning\n const average = values.reduce((sum, val) => sum + val, 0) / values.length\n \n // Calculate average position as percentage of histogram width\n const averagePosition = range === 0 ? 50 : ((average - min) / range) * 100\n \n // Calculate target position if target value is provided\n const targetPosition = targetValue !== undefined && range > 0 \n ? ((targetValue - min) / range) * 100 \n : null\n\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center\">\n {/* Horizontal bars representing actual data distribution */}\n <div \n className=\"dc:relative dc:flex dc:items-end dc:justify-center dc:space-x-0.5\" \n style={{ \n height: `${height}px`,\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n {buckets.map((count, i) => {\n // Normalize height based on actual data frequency\n const normalizedHeight = maxBucketCount > 0 ? count / maxBucketCount : 0\n const minHeight = 0.1 // minimum height for empty buckets\n const displayHeight = count > 0 ? Math.max(minHeight, normalizedHeight) : minHeight\n \n return (\n <div\n key={i}\n className=\"dc:flex-1 dc:rounded-t-sm dc:transition-all dc:duration-300 dc:ease-out\"\n style={{\n height: `${displayHeight * height}px`,\n backgroundColor: color,\n opacity: count > 0 ? 0.7 + (normalizedHeight * 0.3) : 0.2 // higher opacity for buckets with data\n }}\n title={`${count} values in this range`} // tooltip showing actual count\n />\n )\n })}\n \n {/* Average indicator line */}\n {showAverageIndicator && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${averagePosition}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#ef4444',\n opacity: 0.8,\n zIndex: 10\n }}\n title={`Average: ${formatValue(average)}`}\n >\n {/* Small triangle at top to indicate average */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #ef4444'\n }}\n />\n </div>\n )}\n \n {/* Target indicator line */}\n {targetPosition !== null && targetValue !== undefined && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${Math.max(0, Math.min(100, targetPosition))}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#10b981',\n opacity: 0.8,\n zIndex: 11\n }}\n title={`Target: ${formatValue(targetValue)}`}\n >\n {/* Small triangle at top to indicate target */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #10b981'\n }}\n />\n </div>\n )}\n </div>\n \n {/* Min/Max values aligned with histogram width */}\n <div\n className=\"dc:flex dc:justify-between dc:mt-2 dc:text-xs text-dc-text-muted\"\n style={{\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n\n {/* Average indicator */}\n <div className=\"dc:text-center dc:mt-1 dc:text-xs text-dc-text-muted\">\n Average of {values.length} values\n </div>\n </div>\n )\n}","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { Icon } from '@iconify/react'\nimport infoCircleIcon from '@iconify-icons/tabler/info-circle'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport DataHistogram from '../DataHistogram'\nimport { parseTargetValues, calculateVariance, formatVariance } from '../../utils/targetUtils'\nimport { filterIncompletePeriod } from '../../utils/periodUtils'\nimport type { ChartProps } from '../../types'\n\nconst KpiNumber = React.memo(function KpiNumber({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(32)\n const [textWidth, setTextWidth] = useState(250)\n const containerRef = useRef<HTMLDivElement>(null)\n const valueRef = useRef<HTMLDivElement>(null)\n\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = useMemo(() => {\n if (!chartConfig?.yAxis) return []\n if (typeof chartConfig.yAxis === 'string') return [chartConfig.yAxis]\n if (Array.isArray(chartConfig.yAxis)) return chartConfig.yAxis\n return []\n }, [chartConfig?.yAxis])\n\n const valueField = valueFields[0] || '' // Use first measure field\n\n // Get time dimension field if present (for incomplete period filtering)\n const timeDimensionField = queryObject?.timeDimensions?.[0]?.dimension || undefined\n\n // Memoize sorted data to prevent recalculation on every render\n const sortedData = useMemo(() => {\n if (!data || data.length === 0) return []\n let sorted = [...data]\n if (timeDimensionField) {\n sorted = sorted.sort((a, b) => {\n const aVal = a[timeDimensionField]\n const bVal = b[timeDimensionField]\n if (aVal < bVal) return -1\n if (aVal > bVal) return 1\n return 0\n })\n }\n return sorted\n }, [data, timeDimensionField])\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } = displayConfig\n\n // Memoize filtered data\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity\n } = useMemo(() => {\n if (sortedData.length === 0) {\n return { filteredData: [], excludedIncompletePeriod: false, skippedLastPeriod: false, granularity: undefined }\n }\n return filterIncompletePeriod(sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod)\n }, [sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod])\n\n // Use filtered data for calculations\n const dataToUse = filteredData\n\n // Memoize value extraction to prevent recalculation\n const values = useMemo(() => {\n if (!valueField || dataToUse.length === 0) return []\n\n const rawValues = dataToUse.map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n\n // If not found, try finding the first numeric field as fallback\n const numericFields = Object.keys(row).filter(key =>\n typeof row[key] === 'number' && !isNaN(row[key])\n )\n\n if (numericFields.length > 0) {\n return row[numericFields[0]]\n }\n\n return undefined\n })\n\n return rawValues\n .filter(val => val !== null && val !== undefined && !isNaN(Number(val)))\n .map(val => Number(val))\n }, [dataToUse, valueField])\n\n // Memoize statistics calculations\n const { avg, min, max } = useMemo(() => {\n if (values.length === 0) return { avg: 0, min: 0, max: 0 }\n const sum = values.reduce((acc, val) => acc + val, 0)\n const avg = sum / values.length\n const min = Math.min(...values)\n const max = Math.max(...values)\n return { avg, min, max }\n }, [values])\n\n // Memoize format function to prevent re-creating on every render\n const formatNumber = useCallback((value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 0\n const prefix = displayConfig.prefix ?? ''\n\n let formattedValue: string\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + 'K'\n } else {\n formattedValue = value.toFixed(decimals)\n }\n\n return prefix + formattedValue\n }, [displayConfig])\n\n const mainValue = values.length === 1 ? values[0] : avg\n const showStats = values.length > 1\n\n // Memoize color calculation to prevent re-creating function on every render\n const valueColor = useMemo((): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }, [displayConfig.valueColorIndex, colorPalette?.colors])\n\n // Process target values for variance calculation\n const targetValues = useMemo(() => parseTargetValues(displayConfig?.target || ''), [displayConfig?.target])\n const targetValue = targetValues.length > 0 ? targetValues[0] : null // Use first target value\n const variance = targetValue !== null && values.length > 0 ? calculateVariance(mainValue, targetValue) : null\n\n // Memoize variance color calculation\n const varianceColor = useMemo((): string => {\n if (variance === null) return '#6B7280' // Gray for no target\n\n if (variance >= 0) {\n // Positive variance - use positive color from palette\n const positiveIndex = displayConfig.positiveColorIndex ?? 1\n return colorPalette?.colors?.[positiveIndex] || '#10B981' // Green fallback\n } else {\n // Negative variance - use negative color from palette\n const negativeIndex = displayConfig.negativeColorIndex ?? 7\n return colorPalette?.colors?.[negativeIndex] || '#EF4444' // Red fallback\n }\n }, [variance, displayConfig.positiveColorIndex, displayConfig.negativeColorIndex, colorPalette?.colors])\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n\n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI displays, we want the text to be large and prominent\n // Reserve space for the label by using more conservative sizing\n const widthBasedSize = containerWidth / 5\n const heightBasedSize = containerHeight / 4 // More conservative to leave room for label\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(24, Math.min(baseFontSize, 120)) // Lower max to ensure label fits\n setFontSize(clampedFontSize)\n\n // Use a timeout to measure text width after font size is applied\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect()\n const measuredWidth = textRect.width\n // Ensure we have a minimum width and use container width as fallback\n const effectiveWidth = Math.max(measuredWidth, Math.min(containerWidth * 0.6, 300))\n setTextWidth(effectiveWidth)\n }\n }, 10)\n }\n }\n }\n\n // Initial calculation - reduce delay for faster initial render\n const timer = setTimeout(updateDimensions, 50)\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n setTimeout(updateDimensions, 10)\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n // Early returns AFTER all hooks\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"dc:text-center text-dc-text-muted\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display</div>\n </div>\n </div>\n )\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">No measure fields configured</div>\n </div>\n </div>\n )\n }\n\n // Null handling: If all values are null, show placeholder instead of error\n if (values.length === 0) {\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n {getFieldLabel(valueField)}\n </div>\n\n {/* No Data Placeholder */}\n <div\n className=\"dc:font-bold dc:leading-none text-dc-text-muted\"\n style={{\n fontSize: `${fontSize}px`\n }}\n >\n —\n </div>\n\n <div className=\"dc:text-xs text-dc-text-muted dc:mt-2\">No data</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label - Bolder and bigger */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3 dc:flex dc:items-center dc:justify-center dc:gap-1\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField)\n // Temporary fix: if label seems wrong, use the field name directly\n const displayLabel = (label && label.length > 1) ? label : valueField\n return displayLabel\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={skippedLastPeriod\n ? `Excludes last ${granularity || 'period'}`\n : `Excludes current incomplete ${granularity}`}\n className=\"dc:cursor-help\"\n >\n <Icon icon={infoCircleIcon} className=\"dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70\" />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Variance - Horizontal layout */}\n <div className=\"dc:flex dc:items-center dc:justify-center dc:gap-4 dc:mb-3\">\n <div\n ref={valueRef}\n className=\"dc:font-bold dc:leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: valueColor\n }}\n >\n {formatNumber(mainValue)}\n </div>\n\n {/* Target Variance Display - To the right of main value */}\n {targetValue !== null && variance !== null && (\n <div className=\"dc:flex dc:flex-col dc:items-start\">\n <div\n className=\"dc:font-semibold\"\n style={{\n fontSize: `${Math.max(12, fontSize * 0.3)}px`,\n color: varianceColor,\n lineHeight: '1.2'\n }}\n >\n {formatVariance(variance, 1)}\n </div>\n <div\n className=\"text-dc-text-muted dc:text-xs\"\n style={{\n opacity: 0.7,\n fontSize: `${Math.max(10, fontSize * 0.2)}px`\n }}\n >\n vs {formatNumber(targetValue)}\n </div>\n </div>\n )}\n </div>\n\n {/* Unit/Suffix - Larger, not bold (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted dc:text-center\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2',\n opacity: 0.8\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Data Histogram for multiple values */}\n {showStats && (\n <div className=\"dc:mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth}\n targetValue={targetValue || undefined}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiNumber\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-kpi-number-CsQgV_x3.js","names":[],"sources":["../../../src/client/components/DataHistogram.tsx","../../../src/client/components/charts/KpiNumber.tsx"],"sourcesContent":["\ninterface DataHistogramProps {\n /** Array of numeric values to create histogram from */\n values: number[]\n /** Minimum value in the dataset */\n min: number\n /** Maximum value in the dataset */\n max: number\n /** Color for the histogram bars */\n color?: string\n /** Number of buckets/bars to create (default: 12) */\n bucketCount?: number\n /** Height of the histogram in pixels (default: 32) */\n height?: number\n /** Format function for min/max labels */\n formatValue?: (value: number) => string\n /** Width of the histogram to match text above */\n width?: number\n /** Whether to show average indicator line (default: true) */\n showAverageIndicator?: boolean\n /** Target value to show as green line */\n targetValue?: number\n}\n\n/**\n * Reusable histogram component that shows the distribution of actual data values\n */\nexport default function DataHistogram({\n values,\n min,\n max,\n color = '#1f2937',\n bucketCount = 12,\n height = 32,\n formatValue = (val) => val.toString(),\n width,\n showAverageIndicator = true,\n targetValue\n}: DataHistogramProps) {\n // Create histogram buckets from actual data\n const buckets = new Array(bucketCount).fill(0)\n const range = max - min\n \n // Distribute actual values into buckets\n values.forEach(value => {\n if (range === 0) {\n // All values are the same, put everything in middle bucket\n buckets[Math.floor(bucketCount / 2)]++\n } else {\n // Calculate which bucket this value belongs to\n let bucketIndex = Math.floor(((value - min) / range) * (bucketCount - 1))\n // Clamp to valid bucket range\n bucketIndex = Math.max(0, Math.min(bucketCount - 1, bucketIndex))\n buckets[bucketIndex]++\n }\n })\n \n // Find max bucket count for normalization\n const maxBucketCount = Math.max(...buckets)\n \n // Calculate average for indicator positioning\n const average = values.reduce((sum, val) => sum + val, 0) / values.length\n \n // Calculate average position as percentage of histogram width\n const averagePosition = range === 0 ? 50 : ((average - min) / range) * 100\n \n // Calculate target position if target value is provided\n const targetPosition = targetValue !== undefined && range > 0 \n ? ((targetValue - min) / range) * 100 \n : null\n\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center\">\n {/* Horizontal bars representing actual data distribution */}\n <div \n className=\"dc:relative dc:flex dc:items-end dc:justify-center dc:space-x-0.5\" \n style={{ \n height: `${height}px`,\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n {buckets.map((count, i) => {\n // Normalize height based on actual data frequency\n const normalizedHeight = maxBucketCount > 0 ? count / maxBucketCount : 0\n const minHeight = 0.1 // minimum height for empty buckets\n const displayHeight = count > 0 ? Math.max(minHeight, normalizedHeight) : minHeight\n \n return (\n <div\n key={i}\n className=\"dc:flex-1 dc:rounded-t-sm dc:transition-all dc:duration-300 dc:ease-out\"\n style={{\n height: `${displayHeight * height}px`,\n backgroundColor: color,\n opacity: count > 0 ? 0.7 + (normalizedHeight * 0.3) : 0.2 // higher opacity for buckets with data\n }}\n title={`${count} values in this range`} // tooltip showing actual count\n />\n )\n })}\n \n {/* Average indicator line */}\n {showAverageIndicator && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${averagePosition}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#ef4444',\n opacity: 0.8,\n zIndex: 10\n }}\n title={`Average: ${formatValue(average)}`}\n >\n {/* Small triangle at top to indicate average */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #ef4444'\n }}\n />\n </div>\n )}\n \n {/* Target indicator line */}\n {targetPosition !== null && targetValue !== undefined && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${Math.max(0, Math.min(100, targetPosition))}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#10b981',\n opacity: 0.8,\n zIndex: 11\n }}\n title={`Target: ${formatValue(targetValue)}`}\n >\n {/* Small triangle at top to indicate target */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #10b981'\n }}\n />\n </div>\n )}\n </div>\n \n {/* Min/Max values aligned with histogram width */}\n <div\n className=\"dc:flex dc:justify-between dc:mt-2 dc:text-xs text-dc-text-muted\"\n style={{\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n\n {/* Average indicator */}\n <div className=\"dc:text-center dc:mt-1 dc:text-xs text-dc-text-muted\">\n Average of {values.length} values\n </div>\n </div>\n )\n}","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { Icon } from '@iconify/react'\nimport infoCircleIcon from '@iconify-icons/tabler/info-circle'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport DataHistogram from '../DataHistogram'\nimport { parseTargetValues, calculateVariance, formatVariance } from '../../utils/targetUtils'\nimport { filterIncompletePeriod } from '../../utils/periodUtils'\nimport type { ChartProps } from '../../types'\n\nconst KpiNumber = React.memo(function KpiNumber({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(32)\n const [textWidth, setTextWidth] = useState(250)\n const containerRef = useRef<HTMLDivElement>(null)\n const valueRef = useRef<HTMLDivElement>(null)\n\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = useMemo(() => {\n if (!chartConfig?.yAxis) return []\n if (typeof chartConfig.yAxis === 'string') return [chartConfig.yAxis]\n if (Array.isArray(chartConfig.yAxis)) return chartConfig.yAxis\n return []\n }, [chartConfig?.yAxis])\n\n const valueField = valueFields[0] || '' // Use first measure field\n\n // Get time dimension field if present (for incomplete period filtering)\n const timeDimensionField = queryObject?.timeDimensions?.[0]?.dimension || undefined\n\n // Memoize sorted data to prevent recalculation on every render\n const sortedData = useMemo(() => {\n if (!data || data.length === 0) return []\n let sorted = [...data]\n if (timeDimensionField) {\n sorted = sorted.sort((a, b) => {\n const aVal = a[timeDimensionField]\n const bVal = b[timeDimensionField]\n if (aVal < bVal) return -1\n if (aVal > bVal) return 1\n return 0\n })\n }\n return sorted\n }, [data, timeDimensionField])\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } = displayConfig\n\n // Memoize filtered data\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity\n } = useMemo(() => {\n if (sortedData.length === 0) {\n return { filteredData: [], excludedIncompletePeriod: false, skippedLastPeriod: false, granularity: undefined }\n }\n return filterIncompletePeriod(sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod)\n }, [sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod])\n\n // Use filtered data for calculations\n const dataToUse = filteredData\n\n // Memoize value extraction to prevent recalculation\n const values = useMemo(() => {\n if (!valueField || dataToUse.length === 0) return []\n\n const rawValues = dataToUse.map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n\n // If not found, try finding the first numeric field as fallback\n const numericFields = Object.keys(row).filter(key =>\n typeof row[key] === 'number' && !isNaN(row[key])\n )\n\n if (numericFields.length > 0) {\n return row[numericFields[0]]\n }\n\n return undefined\n })\n\n return rawValues\n .filter(val => val !== null && val !== undefined && !isNaN(Number(val)))\n .map(val => Number(val))\n }, [dataToUse, valueField])\n\n // Memoize statistics calculations\n const { avg, min, max } = useMemo(() => {\n if (values.length === 0) return { avg: 0, min: 0, max: 0 }\n const sum = values.reduce((acc, val) => acc + val, 0)\n const avg = sum / values.length\n const min = Math.min(...values)\n const max = Math.max(...values)\n return { avg, min, max }\n }, [values])\n\n // Memoize format function to prevent re-creating on every render\n const formatNumber = useCallback((value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 0\n const prefix = displayConfig.prefix ?? ''\n\n let formattedValue: string\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + 'K'\n } else {\n formattedValue = value.toFixed(decimals)\n }\n\n return prefix + formattedValue\n }, [displayConfig])\n\n const mainValue = values.length === 1 ? values[0] : avg\n const showStats = values.length > 1\n\n // Memoize color calculation to prevent re-creating function on every render\n const valueColor = useMemo((): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }, [displayConfig.valueColorIndex, colorPalette?.colors])\n\n // Process target values for variance calculation\n const targetValues = useMemo(() => parseTargetValues(displayConfig?.target || ''), [displayConfig?.target])\n const targetValue = targetValues.length > 0 ? targetValues[0] : null // Use first target value\n const variance = targetValue !== null && values.length > 0 ? calculateVariance(mainValue, targetValue) : null\n\n // Memoize variance color calculation\n const varianceColor = useMemo((): string => {\n if (variance === null) return '#6B7280' // Gray for no target\n\n if (variance >= 0) {\n // Positive variance - use positive color from palette\n const positiveIndex = displayConfig.positiveColorIndex ?? 1\n return colorPalette?.colors?.[positiveIndex] || '#10B981' // Green fallback\n } else {\n // Negative variance - use negative color from palette\n const negativeIndex = displayConfig.negativeColorIndex ?? 7\n return colorPalette?.colors?.[negativeIndex] || '#EF4444' // Red fallback\n }\n }, [variance, displayConfig.positiveColorIndex, displayConfig.negativeColorIndex, colorPalette?.colors])\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n\n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI displays, we want the text to be large and prominent\n // Reserve space for the label by using more conservative sizing\n const widthBasedSize = containerWidth / 5\n const heightBasedSize = containerHeight / 4 // More conservative to leave room for label\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(24, Math.min(baseFontSize, 120)) // Lower max to ensure label fits\n setFontSize(clampedFontSize)\n\n // Use a timeout to measure text width after font size is applied\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect()\n const measuredWidth = textRect.width\n // Ensure we have a minimum width and use container width as fallback\n const effectiveWidth = Math.max(measuredWidth, Math.min(containerWidth * 0.6, 300))\n setTextWidth(effectiveWidth)\n }\n }, 10)\n }\n }\n }\n\n // Initial calculation - reduce delay for faster initial render\n const timer = setTimeout(updateDimensions, 50)\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n setTimeout(updateDimensions, 10)\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n // Early returns AFTER all hooks\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"dc:text-center text-dc-text-muted\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display</div>\n </div>\n </div>\n )\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">No measure fields configured</div>\n </div>\n </div>\n )\n }\n\n // Null handling: If all values are null, show placeholder instead of error\n if (values.length === 0) {\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n {getFieldLabel(valueField)}\n </div>\n\n {/* No Data Placeholder */}\n <div\n className=\"dc:font-bold dc:leading-none text-dc-text-muted\"\n style={{\n fontSize: `${fontSize}px`\n }}\n >\n —\n </div>\n\n <div className=\"dc:text-xs text-dc-text-muted dc:mt-2\">No data</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label - Bolder and bigger */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3 dc:flex dc:items-center dc:justify-center dc:gap-1\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField)\n // Temporary fix: if label seems wrong, use the field name directly\n const displayLabel = (label && label.length > 1) ? label : valueField\n return displayLabel\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={skippedLastPeriod\n ? `Excludes last ${granularity || 'period'}`\n : `Excludes current incomplete ${granularity}`}\n className=\"dc:cursor-help\"\n >\n <Icon icon={infoCircleIcon} className=\"dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70\" />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Variance - Horizontal layout */}\n <div className=\"dc:flex dc:items-center dc:justify-center dc:gap-4 dc:mb-3\">\n <div\n ref={valueRef}\n className=\"dc:font-bold dc:leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: valueColor\n }}\n >\n {formatNumber(mainValue)}\n </div>\n\n {/* Target Variance Display - To the right of main value */}\n {targetValue !== null && variance !== null && (\n <div className=\"dc:flex dc:flex-col dc:items-start\">\n <div\n className=\"dc:font-semibold\"\n style={{\n fontSize: `${Math.max(12, fontSize * 0.3)}px`,\n color: varianceColor,\n lineHeight: '1.2'\n }}\n >\n {formatVariance(variance, 1)}\n </div>\n <div\n className=\"text-dc-text-muted dc:text-xs\"\n style={{\n opacity: 0.7,\n fontSize: `${Math.max(10, fontSize * 0.2)}px`\n }}\n >\n vs {formatNumber(targetValue)}\n </div>\n </div>\n )}\n </div>\n\n {/* Unit/Suffix - Larger, not bold (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted dc:text-center\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2',\n opacity: 0.8\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Data Histogram for multiple values */}\n {showStats && (\n <div className=\"dc:mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth}\n targetValue={targetValue || undefined}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiNumber\n"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
1
|
+
import { _ as e } from "./chart-activity-grid-DLktOINm.js";
|
|
2
|
+
import { n as t } from "./chart-kpi-number-CsQgV_x3.js";
|
|
3
|
+
import n, { useEffect as r, useRef as i, useState as a } from "react";
|
|
4
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
5
|
//#region src/client/components/charts/KpiText.tsx
|
|
7
|
-
var
|
|
8
|
-
let [f, p] =
|
|
9
|
-
if (
|
|
6
|
+
var c = n.memo(function({ data: n, chartConfig: c, displayConfig: l = {}, height: u = "100%", colorPalette: d }) {
|
|
7
|
+
let [f, p] = a(28), [m, h] = a(0), g = i(null), _ = i(null), v = e();
|
|
8
|
+
if (r(() => {
|
|
10
9
|
let e = () => {
|
|
11
10
|
if (g.current) {
|
|
12
11
|
let e = g.current.getBoundingClientRect(), t = e.width, n = e.height;
|
|
@@ -22,25 +21,25 @@ var l = /* @__PURE__ */ e({ default: () => u }), u = r.memo(function({ data: e,
|
|
|
22
21
|
return g.current && n.observe(g.current), () => {
|
|
23
22
|
clearTimeout(t), n.disconnect();
|
|
24
23
|
};
|
|
25
|
-
}, [
|
|
24
|
+
}, [n, c]), !n || n.length === 0) return /* @__PURE__ */ o("div", {
|
|
26
25
|
className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
|
|
27
26
|
style: {
|
|
28
27
|
height: u === "100%" ? "100%" : u,
|
|
29
28
|
minHeight: u === "100%" ? "200px" : void 0
|
|
30
29
|
},
|
|
31
|
-
children: /* @__PURE__ */
|
|
30
|
+
children: /* @__PURE__ */ s("div", {
|
|
32
31
|
className: "dc:text-center text-dc-text-muted",
|
|
33
|
-
children: [/* @__PURE__ */
|
|
32
|
+
children: [/* @__PURE__ */ o("div", {
|
|
34
33
|
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
35
34
|
children: "No data available"
|
|
36
|
-
}), /* @__PURE__ */
|
|
35
|
+
}), /* @__PURE__ */ o("div", {
|
|
37
36
|
className: "dc:text-xs text-dc-text-secondary",
|
|
38
37
|
children: "No data points to display"
|
|
39
38
|
})]
|
|
40
39
|
})
|
|
41
40
|
});
|
|
42
41
|
let y = [];
|
|
43
|
-
if (
|
|
42
|
+
if (c?.yAxis && (typeof c.yAxis == "string" ? y = [c.yAxis] : Array.isArray(c.yAxis) && (y = c.yAxis)), y.length === 0) return /* @__PURE__ */ o("div", {
|
|
44
43
|
className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
|
|
45
44
|
style: {
|
|
46
45
|
height: u === "100%" ? "100%" : u,
|
|
@@ -49,23 +48,23 @@ var l = /* @__PURE__ */ e({ default: () => u }), u = r.memo(function({ data: e,
|
|
|
49
48
|
color: "var(--dc-danger)",
|
|
50
49
|
borderColor: "var(--dc-danger-border)"
|
|
51
50
|
},
|
|
52
|
-
children: /* @__PURE__ */
|
|
51
|
+
children: /* @__PURE__ */ s("div", {
|
|
53
52
|
className: "dc:text-center",
|
|
54
|
-
children: [/* @__PURE__ */
|
|
53
|
+
children: [/* @__PURE__ */ o("div", {
|
|
55
54
|
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
56
55
|
children: "Configuration Error"
|
|
57
|
-
}), /* @__PURE__ */
|
|
56
|
+
}), /* @__PURE__ */ o("div", {
|
|
58
57
|
className: "dc:text-xs",
|
|
59
58
|
children: "No measure fields configured"
|
|
60
59
|
})]
|
|
61
60
|
})
|
|
62
61
|
});
|
|
63
|
-
let b = y[0], x =
|
|
62
|
+
let b = y[0], x = n.map((e) => {
|
|
64
63
|
if (e[b] !== void 0) return e[b];
|
|
65
64
|
let t = Object.keys(e);
|
|
66
65
|
if (t.length > 0) return e[t[0]];
|
|
67
66
|
}).filter((e) => e != null);
|
|
68
|
-
if (x.length === 0) return /* @__PURE__ */
|
|
67
|
+
if (x.length === 0) return /* @__PURE__ */ o("div", {
|
|
69
68
|
className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
|
|
70
69
|
style: {
|
|
71
70
|
height: u === "100%" ? "100%" : u,
|
|
@@ -74,12 +73,12 @@ var l = /* @__PURE__ */ e({ default: () => u }), u = r.memo(function({ data: e,
|
|
|
74
73
|
color: "var(--dc-warning)",
|
|
75
74
|
borderColor: "var(--dc-warning-border)"
|
|
76
75
|
},
|
|
77
|
-
children: /* @__PURE__ */
|
|
76
|
+
children: /* @__PURE__ */ s("div", {
|
|
78
77
|
className: "dc:text-center",
|
|
79
|
-
children: [/* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ o("div", {
|
|
80
79
|
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
81
80
|
children: "No valid data"
|
|
82
|
-
}), /* @__PURE__ */
|
|
81
|
+
}), /* @__PURE__ */ o("div", {
|
|
83
82
|
className: "dc:text-xs",
|
|
84
83
|
children: "All values are null or invalid"
|
|
85
84
|
})]
|
|
@@ -114,14 +113,14 @@ var l = /* @__PURE__ */ e({ default: () => u }), u = r.memo(function({ data: e,
|
|
|
114
113
|
}
|
|
115
114
|
return d?.colors?.[0] || "#1f2937";
|
|
116
115
|
})();
|
|
117
|
-
return /* @__PURE__ */
|
|
116
|
+
return /* @__PURE__ */ s("div", {
|
|
118
117
|
ref: g,
|
|
119
118
|
className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4",
|
|
120
119
|
style: {
|
|
121
120
|
height: u === "100%" ? "100%" : u,
|
|
122
121
|
minHeight: u === "100%" ? "200px" : void 0
|
|
123
122
|
},
|
|
124
|
-
children: [/* @__PURE__ */
|
|
123
|
+
children: [/* @__PURE__ */ o("div", {
|
|
125
124
|
ref: _,
|
|
126
125
|
className: "dc:font-bold dc:leading-tight dc:text-center",
|
|
127
126
|
style: {
|
|
@@ -129,9 +128,9 @@ var l = /* @__PURE__ */ e({ default: () => u }), u = r.memo(function({ data: e,
|
|
|
129
128
|
color: k
|
|
130
129
|
},
|
|
131
130
|
children: O
|
|
132
|
-
}), E && w !== null && T !== null && /* @__PURE__ */
|
|
131
|
+
}), E && w !== null && T !== null && /* @__PURE__ */ o("div", {
|
|
133
132
|
className: "dc:mt-4",
|
|
134
|
-
children: /* @__PURE__ */
|
|
133
|
+
children: /* @__PURE__ */ o(t, {
|
|
135
134
|
values: x,
|
|
136
135
|
min: w,
|
|
137
136
|
max: T,
|
|
@@ -144,6 +143,6 @@ var l = /* @__PURE__ */ e({ default: () => u }), u = r.memo(function({ data: e,
|
|
|
144
143
|
});
|
|
145
144
|
});
|
|
146
145
|
//#endregion
|
|
147
|
-
export {
|
|
146
|
+
export { c as t };
|
|
148
147
|
|
|
149
|
-
//# sourceMappingURL=chart-kpi-text-
|
|
148
|
+
//# sourceMappingURL=chart-kpi-text-BR0IyeUU.js.map
|