drizzle-cube 0.2.11 → 0.2.13
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/compiler-CMwSRhTS.cjs +22 -0
- package/dist/adapters/{compiler-gcKytLwd.js → compiler-DrkCCzf0.js} +16 -11
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +8 -8
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +9 -9
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +11 -11
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +59 -59
- package/dist/client/charts.js +11 -11
- package/dist/client/chunks/{chart-activitygridchart-D17Fxiuf.js → chart-activitygridchart-CUGN9Xq9.js} +3 -2
- package/dist/client/chunks/chart-activitygridchart-CUGN9Xq9.js.map +1 -0
- package/dist/client/chunks/{chart-areachart-udSbAzl1.js → chart-areachart-B4tknnsY.js} +25 -25
- package/dist/client/chunks/{chart-areachart-udSbAzl1.js.map → chart-areachart-B4tknnsY.js.map} +1 -1
- package/dist/client/chunks/{chart-axisformatcontrols-DqSa245M.js → chart-axisformatcontrols-Ch_IYF94.js} +18 -18
- package/dist/client/chunks/chart-axisformatcontrols-Ch_IYF94.js.map +1 -0
- package/dist/client/chunks/{chart-barchart-CDIpqCKS.js → chart-barchart-D_op06r-.js} +6 -6
- package/dist/client/chunks/{chart-barchart-CDIpqCKS.js.map → chart-barchart-D_op06r-.js.map} +1 -1
- package/dist/client/chunks/{chart-bubblechart-CivK_yfh.js → chart-bubblechart-BsaIXUbS.js} +3 -3
- package/dist/client/chunks/chart-bubblechart-BsaIXUbS.js.map +1 -0
- package/dist/client/chunks/{chart-charttooltip-BVEdz4Q-.js → chart-charttooltip-Bx3I8jQv.js} +2 -2
- package/dist/client/chunks/{chart-charttooltip-BVEdz4Q-.js.map → chart-charttooltip-Bx3I8jQv.js.map} +1 -1
- package/dist/client/chunks/{chart-datatable-NHE7BTMr.js → chart-datatable-C7MS9q4Y.js} +2 -2
- package/dist/client/chunks/{chart-datatable-NHE7BTMr.js.map → chart-datatable-C7MS9q4Y.js.map} +1 -1
- package/dist/client/chunks/{chart-kpidelta-D-FR2o4V.js → chart-kpidelta-7-KOmb3w.js} +62 -60
- package/dist/client/chunks/chart-kpidelta-7-KOmb3w.js.map +1 -0
- package/dist/client/chunks/{chart-kpinumber-DSH8RJxb.js → chart-kpinumber-HOPfcK2N.js} +4 -4
- package/dist/client/chunks/{chart-kpinumber-DSH8RJxb.js.map → chart-kpinumber-HOPfcK2N.js.map} +1 -1
- package/dist/client/chunks/{chart-kpitext-Z9oh0bJq.js → chart-kpitext-BZkC9u3A.js} +24 -24
- package/dist/client/chunks/{chart-kpitext-Z9oh0bJq.js.map → chart-kpitext-BZkC9u3A.js.map} +1 -1
- package/dist/client/chunks/{chart-linechart-D4r0uD1j.js → chart-linechart-DqFmLbRe.js} +7 -7
- package/dist/client/chunks/{chart-linechart-D4r0uD1j.js.map → chart-linechart-DqFmLbRe.js.map} +1 -1
- package/dist/client/chunks/chart-markdownchart-9n_TemoB.js +256 -0
- package/dist/client/chunks/chart-markdownchart-9n_TemoB.js.map +1 -0
- package/dist/client/chunks/{chart-piechart-BhttUWuH.js → chart-piechart-CrXFd9pE.js} +6 -6
- package/dist/client/chunks/{chart-piechart-BhttUWuH.js.map → chart-piechart-CrXFd9pE.js.map} +1 -1
- package/dist/client/chunks/{chart-radarchart-DnqlfoGr.js → chart-radarchart-tar2GBkO.js} +5 -5
- package/dist/client/chunks/{chart-radarchart-DnqlfoGr.js.map → chart-radarchart-tar2GBkO.js.map} +1 -1
- package/dist/client/chunks/{chart-radialbarchart-BFxxiqLw.js → chart-radialbarchart-ab8Swtal.js} +5 -5
- package/dist/client/chunks/{chart-radialbarchart-BFxxiqLw.js.map → chart-radialbarchart-ab8Swtal.js.map} +1 -1
- package/dist/client/chunks/{chart-scatterchart-MN4SM-w7.js → chart-scatterchart-BP06BeU5.js} +5 -5
- package/dist/client/chunks/{chart-scatterchart-MN4SM-w7.js.map → chart-scatterchart-BP06BeU5.js.map} +1 -1
- package/dist/client/chunks/{chart-treemapchart-Nozh2m26.js → chart-treemapchart-DAiixITm.js} +31 -31
- package/dist/client/chunks/{chart-treemapchart-Nozh2m26.js.map → chart-treemapchart-DAiixITm.js.map} +1 -1
- package/dist/client/chunks/{charts-BSDHSv4l.js → charts-CHzWeaY1.js} +26 -26
- package/dist/client/chunks/charts-CHzWeaY1.js.map +1 -0
- package/dist/client/chunks/{components-CbDovlG-.js → components-DnM9CCUS.js} +2453 -2445
- package/dist/client/chunks/components-DnM9CCUS.js.map +1 -0
- package/dist/client/chunks/{index-th92_8oL.js → index-DlsvcKXf.js} +135 -135
- package/dist/client/chunks/index-DlsvcKXf.js.map +1 -0
- package/dist/client/components/AnalysisBuilder/AnalysisAxisDropZone.d.ts +5 -5
- package/dist/client/components/AnalysisBuilder/SectionHeading.d.ts +2 -7
- package/dist/client/components/AnalysisBuilder/types.d.ts +8 -8
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/useResponsiveDashboard.d.ts +2 -8
- package/dist/client/hooks.js +2 -2
- package/dist/client/hooks.js.map +1 -1
- package/dist/client/icons/types.d.ts +2 -2
- package/dist/client/index.js +3 -3
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.js +16 -11
- package/package.json +3 -3
- package/dist/adapters/compiler-DP1pPIcg.cjs +0 -22
- package/dist/client/chunks/chart-activitygridchart-D17Fxiuf.js.map +0 -1
- package/dist/client/chunks/chart-axisformatcontrols-DqSa245M.js.map +0 -1
- package/dist/client/chunks/chart-bubblechart-CivK_yfh.js.map +0 -1
- package/dist/client/chunks/chart-kpidelta-D-FR2o4V.js.map +0 -1
- package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js +0 -254
- package/dist/client/chunks/chart-markdownchart-C3FAQFuO.js.map +0 -1
- package/dist/client/chunks/charts-BSDHSv4l.js.map +0 -1
- package/dist/client/chunks/components-CbDovlG-.js.map +0 -1
- package/dist/client/chunks/index-th92_8oL.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-markdownchart-9n_TemoB.js","sources":["../../../src/client/components/charts/MarkdownChart.tsx"],"sourcesContent":["import React from 'react'\nimport type { ChartProps } from '../../types'\n\ninterface MarkdownNode {\n type: 'text' | 'bold' | 'italic' | 'link' | 'header' | 'list' | 'listItem' | 'paragraph' | 'break'\n content?: string\n url?: string\n level?: number\n ordered?: boolean\n children?: MarkdownNode[]\n parentOrdered?: boolean // For list items to know if parent list is ordered\n}\n\nexport default function MarkdownChart({ \n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const content = displayConfig.content || ''\n const accentColorIndex = displayConfig.accentColorIndex ?? 0\n const fontSize = displayConfig.fontSize || 'medium'\n const alignment = displayConfig.alignment || 'left'\n\n // Get accent color from palette\n const getAccentColor = (): string => {\n if (colorPalette?.colors && accentColorIndex < colorPalette.colors.length) {\n return colorPalette.colors[accentColorIndex]\n }\n return '#8884d8' // Default color\n }\n\n const accentColor = getAccentColor()\n\n // Font size mapping\n const fontSizeClasses = {\n small: 'text-sm',\n medium: 'text-lg', \n large: 'text-xl'\n }\n\n // Alignment mapping\n const alignmentClasses = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right'\n }\n\n // Simple markdown parser\n const parseMarkdown = (text: string): MarkdownNode[] => {\n const lines = text.split('\\n')\n const nodes: MarkdownNode[] = []\n let currentList: MarkdownNode | null = null\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim()\n \n if (!line) {\n // Empty line - end current list and add line break\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n nodes.push({ type: 'break' })\n continue\n }\n\n // Headers\n const headerMatch = line.match(/^(#{1,3})\\s+(.*)$/)\n if (headerMatch) {\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n nodes.push({\n type: 'header',\n level: headerMatch[1].length,\n content: headerMatch[2]\n })\n continue\n }\n\n // Unordered list\n const unorderedMatch = line.match(/^[-*+]\\s+(.*)$/)\n if (unorderedMatch) {\n if (!currentList || currentList.ordered) {\n if (currentList) nodes.push(currentList)\n currentList = { type: 'list', ordered: false, children: [] }\n }\n currentList.children!.push({\n type: 'listItem',\n children: parseInline(unorderedMatch[1]),\n parentOrdered: false\n })\n continue\n }\n\n // Ordered list\n const orderedMatch = line.match(/^\\d+\\.\\s+(.*)$/)\n if (orderedMatch) {\n if (!currentList || !currentList.ordered) {\n if (currentList) nodes.push(currentList)\n currentList = { type: 'list', ordered: true, children: [] }\n }\n currentList.children!.push({\n type: 'listItem',\n children: parseInline(orderedMatch[1]),\n parentOrdered: true\n })\n continue\n }\n\n // Regular paragraph\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n \n nodes.push({\n type: 'paragraph',\n children: parseInline(line)\n })\n }\n\n // Add any remaining list\n if (currentList) {\n nodes.push(currentList)\n }\n\n return nodes\n }\n\n // Parse inline elements (bold, italic, links)\n const parseInline = (text: string): MarkdownNode[] => {\n const nodes: MarkdownNode[] = []\n let remaining = text\n \n while (remaining) {\n // Try to match link first [text](url)\n const linkMatch = remaining.match(/^(.*?)\\[([^\\]]+)\\]\\(([^)]+)\\)(.*)$/)\n if (linkMatch) {\n const [, before, linkText, url, after] = linkMatch\n if (before) {\n nodes.push(...parseSimpleInline(before))\n }\n nodes.push({\n type: 'link',\n content: linkText,\n url: url\n })\n remaining = after\n continue\n }\n\n // No more special formatting, parse remaining as simple inline\n nodes.push(...parseSimpleInline(remaining))\n break\n }\n\n return nodes\n }\n\n // Parse bold and italic\n const parseSimpleInline = (text: string): MarkdownNode[] => {\n const nodes: MarkdownNode[] = []\n let remaining = text\n\n while (remaining) {\n // Try bold first **text**\n const boldMatch = remaining.match(/^(.*?)\\*\\*([^*]+)\\*\\*(.*)$/)\n if (boldMatch) {\n const [, before, boldText, after] = boldMatch\n if (before) nodes.push({ type: 'text', content: before })\n nodes.push({ type: 'bold', content: boldText })\n remaining = after\n continue\n }\n\n // Try italic *text*\n const italicMatch = remaining.match(/^(.*?)\\*([^*]+)\\*(.*)$/)\n if (italicMatch) {\n const [, before, italicText, after] = italicMatch\n if (before) nodes.push({ type: 'text', content: before })\n nodes.push({ type: 'italic', content: italicText })\n remaining = after\n continue\n }\n\n // No more formatting, add as text\n nodes.push({ type: 'text', content: remaining })\n break\n }\n\n return nodes\n }\n\n // Render markdown nodes to React elements\n const renderNode = (node: MarkdownNode, key: number, listNumber?: number): React.ReactNode => {\n switch (node.type) {\n case 'text':\n return <span key={key} className=\"text-dc-text\">{node.content}</span>\n\n case 'bold':\n return <strong key={key} className=\"font-bold text-dc-text\">{node.content}</strong>\n\n case 'italic':\n return <em key={key} className=\"italic text-dc-text\">{node.content}</em>\n\n case 'link':\n return (\n <a \n key={key}\n href={node.url}\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n className=\"hover:underline transition-colors\"\n style={{ color: accentColor }}\n >\n {node.content}\n </a>\n )\n\n case 'header': {\n // Header classes that scale with fontSize setting\n const getHeaderClasses = (level: number, fontSize: string) => {\n const baseClasses = 'font-bold'\n const marginClasses = {\n 1: 'mb-4',\n 2: 'mb-3',\n 3: 'mb-2'\n }\n\n let sizeClasses = ''\n if (fontSize === 'small') {\n sizeClasses = { 1: 'text-lg', 2: 'text-base', 3: 'text-sm' }[level] || 'text-sm'\n } else if (fontSize === 'large') {\n sizeClasses = { 1: 'text-5xl', 2: 'text-4xl', 3: 'text-3xl' }[level] || 'text-3xl'\n } else { // medium (default)\n sizeClasses = { 1: 'text-3xl', 2: 'text-2xl', 3: 'text-xl' }[level] || 'text-xl'\n }\n\n return `${baseClasses} ${sizeClasses} ${marginClasses[level as keyof typeof marginClasses]}`\n }\n\n const HeaderTag = `h${node.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n return (\n <HeaderTag\n key={key}\n className={getHeaderClasses(node.level as number, fontSize)}\n style={{ color: accentColor }}\n >\n {node.content}\n </HeaderTag>\n )\n }\n\n case 'paragraph':\n return (\n <p key={key} className=\"mb-3 leading-relaxed\">\n {node.children?.map((child, i) => renderNode(child, i))}\n </p>\n )\n\n case 'list': {\n const ListTag = node.ordered ? 'ol' : 'ul'\n let listClasses = 'mb-3'\n\n if (alignment === 'center') {\n listClasses += ' list-none flex flex-col items-center'\n } else if (alignment === 'right') {\n listClasses += ' list-none ml-auto max-w-max'\n } else {\n listClasses += ' list-none ml-6'\n }\n\n return (\n <ListTag key={key} className={listClasses}>\n {node.children?.map((child, i) => renderNode(child, i, node.ordered ? i + 1 : undefined))}\n </ListTag>\n )\n }\n\n case 'listItem':\n if (node.children) {\n // For ordered lists, use custom colored numbers\n if (node.parentOrdered && listNumber !== undefined) {\n const numberSizeClass = fontSizeClasses[fontSize as keyof typeof fontSizeClasses]\n \n if (alignment === 'center') {\n return (\n <li key={key} className=\"mb-1 flex items-center justify-center\">\n <span \n className={`inline-block mr-2 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n <span className=\"text-center\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n } else if (alignment === 'right') {\n return (\n <li key={key} className=\"mb-1 flex items-start justify-end\">\n <span className=\"text-right\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n <span \n className={`inline-block ml-2 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n </li>\n )\n } else {\n return (\n <li key={key} className=\"mb-1 flex items-start\">\n <span \n className={`inline-block mr-3 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n <span className=\"flex-1\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n }\n }\n \n // For unordered lists, use custom bullets with alignment\n if (alignment === 'center') {\n return (\n <li key={key} className=\"mb-1 flex items-center justify-center\">\n <span \n className=\"inline-block w-2 h-2 rounded-full mr-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n <span className=\"text-center\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n } else if (alignment === 'right') {\n return (\n <li key={key} className=\"mb-1 flex items-start justify-end\">\n <span className=\"text-right\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n <span \n className=\"inline-block w-2 h-2 rounded-full ml-2 mt-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n </li>\n )\n } else {\n return (\n <li key={key} className=\"mb-1 flex items-start\">\n <span \n className=\"inline-block w-2 h-2 rounded-full mr-3 mt-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n <span className=\"flex-1\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n }\n }\n return null\n\n case 'break':\n return <br key={key} />\n\n default:\n return null\n }\n }\n\n if (!content.trim()) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No content</div>\n <div className=\"text-xs text-dc-text-secondary\">Add markdown content in the chart configuration</div>\n </div>\n </div>\n )\n }\n\n const parsedNodes = parseMarkdown(content)\n\n return (\n <div \n className={`p-4 w-full h-full overflow-auto ${fontSizeClasses[fontSize as keyof typeof fontSizeClasses]} ${alignmentClasses[alignment as keyof typeof alignmentClasses]}`}\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {parsedNodes.map((node, index) => renderNode(node, index))}\n </div>\n )\n}"],"names":["MarkdownChart","displayConfig","height","colorPalette","content","accentColorIndex","fontSize","alignment","accentColor","fontSizeClasses","alignmentClasses","parseMarkdown","text","lines","nodes","currentList","i","line","headerMatch","unorderedMatch","parseInline","orderedMatch","remaining","linkMatch","before","linkText","url","after","parseSimpleInline","boldMatch","boldText","italicMatch","italicText","renderNode","node","key","listNumber","jsx","getHeaderClasses","level","baseClasses","marginClasses","sizeClasses","HeaderTag","child","ListTag","listClasses","numberSizeClass","jsxs","parsedNodes","index"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { jsx as e, jsxs as c } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as b } from "react";
|
|
3
3
|
import { PieChart as w, Pie as g, Cell as F, Legend as L } from "recharts";
|
|
4
4
|
import { C as S } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as T } from "./chart-charttooltip-
|
|
6
|
-
import { u as j, t as E, b as C, c as Y, a as A, f as $ } from "./chart-activitygridchart-
|
|
5
|
+
import { C as T } from "./chart-charttooltip-Bx3I8jQv.js";
|
|
6
|
+
import { u as j, t as E, b as C, c as Y, a as A, f as $ } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
7
7
|
function H({
|
|
8
8
|
data: x,
|
|
9
9
|
chartConfig: r,
|
|
@@ -30,12 +30,12 @@ function H({
|
|
|
30
30
|
else if (r?.x && r?.y)
|
|
31
31
|
a = r.x, o = Array.isArray(r.y) ? r.y : [r.y];
|
|
32
32
|
else
|
|
33
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-
|
|
33
|
+
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: d }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
34
34
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
35
35
|
/* @__PURE__ */ e("div", { className: "text-xs", children: "chartConfig.x/y or chartConfig.xAxis/yAxis required for pie chart" })
|
|
36
36
|
] }) });
|
|
37
37
|
if (!a || !o || o.length === 0)
|
|
38
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-
|
|
38
|
+
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: d }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
39
39
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
40
40
|
/* @__PURE__ */ e("div", { className: "text-xs", children: "Missing required X-axis or Y-axis fields" })
|
|
41
41
|
] }) });
|
|
@@ -114,7 +114,7 @@ function H({
|
|
|
114
114
|
)
|
|
115
115
|
] }) });
|
|
116
116
|
} catch (n) {
|
|
117
|
-
return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-
|
|
117
|
+
return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-dc-error p-4", style: { height: d }, children: /* @__PURE__ */ c("div", { className: "text-center", children: [
|
|
118
118
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Pie Chart Error" }),
|
|
119
119
|
/* @__PURE__ */ e("div", { className: "text-xs mb-2", children: n instanceof Error ? n.message : "Unknown rendering error" }),
|
|
120
120
|
/* @__PURE__ */ e("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
@@ -124,4 +124,4 @@ function H({
|
|
|
124
124
|
export {
|
|
125
125
|
H as default
|
|
126
126
|
};
|
|
127
|
-
//# sourceMappingURL=chart-piechart-
|
|
127
|
+
//# sourceMappingURL=chart-piechart-CrXFd9pE.js.map
|
package/dist/client/chunks/{chart-piechart-BhttUWuH.js.map → chart-piechart-CrXFd9pE.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-piechart-BhttUWuH.js","sources":["../../../src/client/components/charts/PieChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function PieChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { labelMap } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in pie chart</div>\n </div>\n </div>\n )\n }\n\n let pieData: Array<{name: string, value: number}>\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisFields: string[]\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">chartConfig.x/y or chartConfig.xAxis/yAxis required for pie chart</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisFields || yAxisFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields,\n labelMap\n )\n \n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({\n name: String(key),\n value: firstRow[key]\n })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xAxisField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xAxisField] === 'boolean') {\n name = item[xAxisField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string' \n ? parseFloat(item[yAxisFields[0]]) \n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or zero)\n const originalLength = pieData.length\n pieData = pieData.filter(item => \n item.value != null && \n !isNaN(item.value) && \n item.value !== 0 && \n item.value > 0\n )\n \n if (pieData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">\n {originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n </div>\n </div>\n </div>\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) => \n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n >\n {pieData.map((_entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'PieChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Pie Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["PieChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","useCubeContext","safeDisplayConfig","jsx","jsxs","pieData","xAxisField","yAxisFields","seriesFields","chartData","transformChartDataWithSeries","firstRow","key","granularity","getFieldGranularity","item","name","formatTimeValue","originalLength","ChartContainer","RechartsPieChart","Pie","percent","_entry","index","Cell","CHART_COLORS","ChartTooltip","value","formatAxisValue","Legend","o","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-piechart-CrXFd9pE.js","sources":["../../../src/client/components/charts/PieChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function PieChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { labelMap } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in pie chart</div>\n </div>\n </div>\n )\n }\n\n let pieData: Array<{name: string, value: number}>\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisFields: string[]\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">chartConfig.x/y or chartConfig.xAxis/yAxis required for pie chart</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisFields || yAxisFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields,\n labelMap\n )\n \n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({\n name: String(key),\n value: firstRow[key]\n })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xAxisField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xAxisField] === 'boolean') {\n name = item[xAxisField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string' \n ? parseFloat(item[yAxisFields[0]]) \n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or zero)\n const originalLength = pieData.length\n pieData = pieData.filter(item => \n item.value != null && \n !isNaN(item.value) && \n item.value !== 0 && \n item.value > 0\n )\n \n if (pieData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">\n {originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n </div>\n </div>\n </div>\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) => \n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n >\n {pieData.map((_entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'PieChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Pie Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["PieChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","labelMap","useCubeContext","safeDisplayConfig","jsx","jsxs","pieData","xAxisField","yAxisFields","seriesFields","chartData","transformChartDataWithSeries","firstRow","key","granularity","getFieldGranularity","item","name","formatTimeValue","originalLength","ChartContainer","RechartsPieChart","Pie","percent","_entry","index","Cell","CHART_COLORS","ChartTooltip","value","formatAxisValue","Legend","o","error"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { jsx as e, jsxs as h } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as F } from "react";
|
|
3
3
|
import { RadarChart as S, PolarGrid as L, PolarAngleAxis as R, PolarRadiusAxis as j, Legend as k, Radar as T } from "recharts";
|
|
4
4
|
import { C } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as Y } from "./chart-charttooltip-
|
|
6
|
-
import { t as z, b as E, c as G, f as g, a as v } from "./chart-activitygridchart-
|
|
5
|
+
import { C as Y } from "./chart-charttooltip-Bx3I8jQv.js";
|
|
6
|
+
import { t as z, b as E, c as G, f as g, a as v } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
7
7
|
function V({
|
|
8
8
|
data: d,
|
|
9
9
|
chartConfig: o,
|
|
@@ -42,7 +42,7 @@ function V({
|
|
|
42
42
|
(r) => typeof t[r] == "number" && r !== l
|
|
43
43
|
);
|
|
44
44
|
if (i.length === 0)
|
|
45
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-
|
|
45
|
+
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: x }, children: /* @__PURE__ */ h("div", { className: "text-center", children: [
|
|
46
46
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
47
47
|
/* @__PURE__ */ e("div", { className: "text-xs", children: "No numeric fields found for radar chart values" })
|
|
48
48
|
] }) });
|
|
@@ -118,7 +118,7 @@ function V({
|
|
|
118
118
|
))
|
|
119
119
|
] }) });
|
|
120
120
|
} catch (a) {
|
|
121
|
-
return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-
|
|
121
|
+
return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-dc-error p-4", style: { height: x }, children: /* @__PURE__ */ h("div", { className: "text-center", children: [
|
|
122
122
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Radar Chart Error" }),
|
|
123
123
|
/* @__PURE__ */ e("div", { className: "text-xs mb-2", children: a instanceof Error ? a.message : "Unknown rendering error" }),
|
|
124
124
|
/* @__PURE__ */ e("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
@@ -128,4 +128,4 @@ function V({
|
|
|
128
128
|
export {
|
|
129
129
|
V as default
|
|
130
130
|
};
|
|
131
|
-
//# sourceMappingURL=chart-radarchart-
|
|
131
|
+
//# sourceMappingURL=chart-radarchart-tar2GBkO.js.map
|
package/dist/client/chunks/{chart-radarchart-DnqlfoGr.js.map → chart-radarchart-tar2GBkO.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-radarchart-DnqlfoGr.js","sources":["../../../src/client/components/charts/RadarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in radar chart</div>\n </div>\n </div>\n )\n }\n\n let radarData: any[]\n let seriesKeys: string[] = []\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Subject/category field\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis] // Value fields\n const seriesFields = chartConfig.series || []\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys: transformedSeriesKeys } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields\n )\n \n radarData = chartData\n seriesKeys = transformedSeriesKeys\n } else {\n // Legacy format or auto-detection - try to find suitable fields\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find subject/category field\n const subjectField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find numeric fields for values\n const valueFields = keys.filter(key => \n typeof firstRow[key] === 'number' && key !== subjectField\n )\n\n if (valueFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No numeric fields found for radar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radar chart\n if (subjectField) {\n // Use subject field for radar categories\n const granularity = getFieldGranularity(queryObject, subjectField)\n radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n \n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = typeof item[field] === 'string' \n ? parseFloat(item[field]) \n : (item[field] || 0)\n })\n \n return transformedItem\n })\n \n seriesKeys = valueFields.map(field => field.split('.').pop() || field)\n } else {\n // Fallback - use first value field only\n radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: typeof item[valueFields[0]] === 'string' \n ? parseFloat(item[valueFields[0]]) \n : (item[valueFields[0]] || 0)\n }))\n seriesKeys = ['value']\n }\n }\n \n // Validate transformed data\n if (!radarData || radarData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for radar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n tickFormatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any) => formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : undefined\n }\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => (\n <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\n stroke={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n ))}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadarChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Radar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["RadarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radarData","seriesKeys","xAxisField","yAxisFields","seriesFields","chartData","transformedSeriesKeys","transformChartDataWithSeries","firstRow","keys","subjectField","key","valueFields","granularity","getFieldGranularity","item","transformedItem","formatTimeValue","field","displayName","ChartContainer","RechartsRadarChart","PolarGrid","PolarAngleAxis","PolarRadiusAxis","value","formatAxisValue","ChartTooltip","name","Legend","o","seriesKey","index","Radar","CHART_COLORS","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-radarchart-tar2GBkO.js","sources":["../../../src/client/components/charts/RadarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in radar chart</div>\n </div>\n </div>\n )\n }\n\n let radarData: any[]\n let seriesKeys: string[] = []\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Subject/category field\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis] // Value fields\n const seriesFields = chartConfig.series || []\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys: transformedSeriesKeys } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields\n )\n \n radarData = chartData\n seriesKeys = transformedSeriesKeys\n } else {\n // Legacy format or auto-detection - try to find suitable fields\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find subject/category field\n const subjectField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find numeric fields for values\n const valueFields = keys.filter(key => \n typeof firstRow[key] === 'number' && key !== subjectField\n )\n\n if (valueFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No numeric fields found for radar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radar chart\n if (subjectField) {\n // Use subject field for radar categories\n const granularity = getFieldGranularity(queryObject, subjectField)\n radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n \n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = typeof item[field] === 'string' \n ? parseFloat(item[field]) \n : (item[field] || 0)\n })\n \n return transformedItem\n })\n \n seriesKeys = valueFields.map(field => field.split('.').pop() || field)\n } else {\n // Fallback - use first value field only\n radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: typeof item[valueFields[0]] === 'string' \n ? parseFloat(item[valueFields[0]]) \n : (item[valueFields[0]] || 0)\n }))\n seriesKeys = ['value']\n }\n }\n \n // Validate transformed data\n if (!radarData || radarData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for radar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n tickFormatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any) => formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : undefined\n }\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => (\n <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\n stroke={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n ))}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadarChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Radar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["RadarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radarData","seriesKeys","xAxisField","yAxisFields","seriesFields","chartData","transformedSeriesKeys","transformChartDataWithSeries","firstRow","keys","subjectField","key","valueFields","granularity","getFieldGranularity","item","transformedItem","formatTimeValue","field","displayName","ChartContainer","RechartsRadarChart","PolarGrid","PolarAngleAxis","PolarRadiusAxis","value","formatAxisValue","ChartTooltip","name","Legend","o","seriesKey","index","Radar","CHART_COLORS","error"],"mappings":"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"}
|
package/dist/client/chunks/{chart-radialbarchart-BFxxiqLw.js → chart-radialbarchart-ab8Swtal.js}
RENAMED
|
@@ -2,8 +2,8 @@ import { jsx as t, jsxs as f } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as b } from "react";
|
|
3
3
|
import { RadialBarChart as g, Legend as w, RadialBar as F, Cell as L } from "recharts";
|
|
4
4
|
import { C as R } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { C as S } from "./chart-charttooltip-
|
|
6
|
-
import { b as C, a as u, c as T, f as A } from "./chart-activitygridchart-
|
|
5
|
+
import { C as S } from "./chart-charttooltip-Bx3I8jQv.js";
|
|
6
|
+
import { b as C, a as u, c as T, f as A } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
7
7
|
function D({
|
|
8
8
|
data: c,
|
|
9
9
|
chartConfig: n,
|
|
@@ -39,7 +39,7 @@ function D({
|
|
|
39
39
|
(r) => typeof e[r] == "number" && r !== x
|
|
40
40
|
) || a[1];
|
|
41
41
|
if (!l)
|
|
42
|
-
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-
|
|
42
|
+
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: m }, children: /* @__PURE__ */ f("div", { className: "text-center", children: [
|
|
43
43
|
/* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
44
44
|
/* @__PURE__ */ t("div", { className: "text-xs", children: "No numeric field found for radial bar chart values" })
|
|
45
45
|
] }) });
|
|
@@ -107,7 +107,7 @@ function D({
|
|
|
107
107
|
}
|
|
108
108
|
) });
|
|
109
109
|
} catch (i) {
|
|
110
|
-
return /* @__PURE__ */ t("div", { className: "flex flex-col items-center justify-center w-full text-
|
|
110
|
+
return /* @__PURE__ */ t("div", { className: "flex flex-col items-center justify-center w-full text-dc-error p-4", style: { height: m }, children: /* @__PURE__ */ f("div", { className: "text-center", children: [
|
|
111
111
|
/* @__PURE__ */ t("div", { className: "text-sm font-semibold mb-1", children: "Radial Bar Chart Error" }),
|
|
112
112
|
/* @__PURE__ */ t("div", { className: "text-xs mb-2", children: i instanceof Error ? i.message : "Unknown rendering error" }),
|
|
113
113
|
/* @__PURE__ */ t("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
@@ -117,4 +117,4 @@ function D({
|
|
|
117
117
|
export {
|
|
118
118
|
D as default
|
|
119
119
|
};
|
|
120
|
-
//# sourceMappingURL=chart-radialbarchart-
|
|
120
|
+
//# sourceMappingURL=chart-radialbarchart-ab8Swtal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-radialbarchart-BFxxiqLw.js","sources":["../../../src/client/components/charts/RadialBarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadialBarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in radial bar chart</div>\n </div>\n </div>\n )\n }\n\n let radialData: Array<{name: string, value: number, fill?: string}>\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Value field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for values\n const valueField = keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!valueField) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No numeric field found for radial bar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radial bar chart\n radialData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n value: typeof item[valueField] === 'string' \n ? parseFloat(item[valueField]) \n : (item[valueField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values\n radialData = radialData.filter(item => item.value != null && item.value !== 0)\n \n if (radialData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for radial bar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart \n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar\n dataKey=\"value\"\n cornerRadius={4}\n label={{\n position: 'insideStart',\n fill: '#fff',\n fontSize: 12,\n formatter: safeDisplayConfig.leftYAxisFormat\n ? (value: any) => formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : undefined\n }}\n >\n {radialData.map((entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadialBarChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Radial Bar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["RadialBarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radialData","xAxisField","yAxisField","granularity","getFieldGranularity","item","index","formatTimeValue","CHART_COLORS","firstRow","keys","nameField","key","valueField","name","ChartContainer","RechartsRadialBarChart","ChartTooltip","value","formatAxisValue","Legend","o","RadialBar","entry","Cell","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-radialbarchart-ab8Swtal.js","sources":["../../../src/client/components/charts/RadialBarChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nexport default function RadialBarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in radial bar chart</div>\n </div>\n </div>\n )\n }\n\n let radialData: Array<{name: string, value: number, fill?: string}>\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Value field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for values\n const valueField = keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!valueField) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No numeric field found for radial bar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radial bar chart\n radialData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n value: typeof item[valueField] === 'string' \n ? parseFloat(item[valueField]) \n : (item[valueField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values\n radialData = radialData.filter(item => item.value != null && item.value !== 0)\n \n if (radialData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for radial bar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart \n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar\n dataKey=\"value\"\n cornerRadius={4}\n label={{\n position: 'insideStart',\n fill: '#fff',\n fontSize: 12,\n formatter: safeDisplayConfig.leftYAxisFormat\n ? (value: any) => formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : undefined\n }}\n >\n {radialData.map((entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadialBarChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Radial Bar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["RadialBarChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","safeDisplayConfig","jsx","jsxs","radialData","xAxisField","yAxisField","granularity","getFieldGranularity","item","index","formatTimeValue","CHART_COLORS","firstRow","keys","nameField","key","valueField","name","ChartContainer","RechartsRadialBarChart","ChartTooltip","value","formatAxisValue","Legend","o","RadialBar","entry","Cell","error"],"mappings":"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"}
|
package/dist/client/chunks/{chart-scatterchart-MN4SM-w7.js → chart-scatterchart-BP06BeU5.js}
RENAMED
|
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as l } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as O } from "react";
|
|
3
3
|
import { ScatterChart as Y, CartesianGrid as B, XAxis as C, YAxis as U, Tooltip as W, Legend as $, Scatter as R } from "recharts";
|
|
4
4
|
import { C as J } from "./chart-chartcontainer-CdwzIKP1.js";
|
|
5
|
-
import { u as Q, b as V, c as F, p as I, i as X, C as Z, f as k, a as L } from "./chart-activitygridchart-
|
|
5
|
+
import { u as Q, b as V, c as F, p as I, i as X, C as Z, f as k, a as L } from "./chart-activitygridchart-CUGN9Xq9.js";
|
|
6
6
|
function ae({
|
|
7
7
|
data: g,
|
|
8
8
|
chartConfig: i,
|
|
@@ -31,12 +31,12 @@ function ae({
|
|
|
31
31
|
} else if (i?.x && i?.y)
|
|
32
32
|
a = i.x, o = Array.isArray(i.y) ? i.y[0] : i.y;
|
|
33
33
|
else
|
|
34
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-
|
|
34
|
+
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: m }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
35
35
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
36
36
|
/* @__PURE__ */ e("div", { className: "text-xs", children: "Invalid or missing chart axis configuration" })
|
|
37
37
|
] }) });
|
|
38
38
|
if (!a || !o)
|
|
39
|
-
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-
|
|
39
|
+
return /* @__PURE__ */ e("div", { className: "flex items-center justify-center w-full text-dc-warning", style: { height: m }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
40
40
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
41
41
|
/* @__PURE__ */ e("div", { className: "text-xs", children: "Missing required X-axis or Y-axis fields" })
|
|
42
42
|
] }) });
|
|
@@ -190,7 +190,7 @@ function ae({
|
|
|
190
190
|
)
|
|
191
191
|
] }) });
|
|
192
192
|
} catch (u) {
|
|
193
|
-
return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-
|
|
193
|
+
return /* @__PURE__ */ e("div", { className: "flex flex-col items-center justify-center w-full text-dc-error p-4", style: { height: m }, children: /* @__PURE__ */ l("div", { className: "text-center", children: [
|
|
194
194
|
/* @__PURE__ */ e("div", { className: "text-sm font-semibold mb-1", children: "Scatter Chart Error" }),
|
|
195
195
|
/* @__PURE__ */ e("div", { className: "text-xs mb-2", children: u instanceof Error ? u.message : "Unknown rendering error" }),
|
|
196
196
|
/* @__PURE__ */ e("div", { className: "text-xs text-dc-text-muted", children: "Check the data and configuration" })
|
|
@@ -200,4 +200,4 @@ function ae({
|
|
|
200
200
|
export {
|
|
201
201
|
ae as default
|
|
202
202
|
};
|
|
203
|
-
//# sourceMappingURL=chart-scatterchart-
|
|
203
|
+
//# sourceMappingURL=chart-scatterchart-BP06BeU5.js.map
|
package/dist/client/chunks/{chart-scatterchart-MN4SM-w7.js.map → chart-scatterchart-BP06BeU5.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-scatterchart-MN4SM-w7.js","sources":["../../../src/client/components/charts/ScatterChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { ScatterChart as RechartsScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Legend, Tooltip } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function ScatterChart({ \n data, \n chartConfig, \n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { getFieldLabel } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true\n }\n\n // Extract axis format configs\n // For scatter charts, xAxis uses xAxisFormat, yAxis uses leftYAxisFormat\n const xAxisFormat = displayConfig?.xAxisFormat\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in scatter chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisField: string\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - handle both string and array values\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n // Normalize series to array\n const seriesConfig = chartConfig.series\n seriesFields = seriesConfig ? (Array.isArray(seriesConfig) ? seriesConfig : [seriesConfig]) : []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format (adapt for scatter chart)\n xAxisField = chartConfig.x\n yAxisField = Array.isArray(chartConfig.y) ? chartConfig.y[0] : chartConfig.y\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Invalid or missing chart axis configuration</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisField) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n // Extract time dimensions from query for tooltip display\n const timeDimensions = queryObject?.timeDimensions || []\n const timeDimensionFields = timeDimensions.map((td: any) => td.dimension)\n\n // Transform data for scatter plot\n // Null handling: Filter out data points where x or y coordinates are null\n let scatterData: any[]\n let seriesGroups: { [key: string]: any[] } = {}\n\n if (seriesFields.length > 0) {\n // Group data by series field\n const seriesField = seriesFields[0]\n data.forEach(item => {\n const seriesValue = String(item[seriesField] || 'Default')\n if (!seriesGroups[seriesValue]) {\n seriesGroups[seriesValue] = []\n }\n\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n\n // Only add point if both x and y are valid numbers\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n if (isValidNumericValue(xNum) && yValue !== null) {\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n seriesGroups[seriesValue].push({\n x: xNum,\n y: yValue,\n name: seriesValue,\n timeValues,\n originalItem: item\n })\n }\n })\n\n // Collect all valid points from all series for validation\n // (The actual rendering uses seriesGroups with series separated)\n const seriesKeys = Object.keys(seriesGroups)\n scatterData = seriesKeys.flatMap(key => seriesGroups[key])\n } else {\n // Single series scatter plot\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n scatterData = data\n .map(item => {\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n return {\n x: xNum,\n y: yValue,\n name: `Point`,\n timeValues,\n originalItem: item,\n isValid: isValidNumericValue(xNum) && yValue !== null\n }\n })\n .filter(point => point.isValid)\n }\n \n // Validate transformed data\n if (!scatterData || scatterData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for scatter chart after transformation</div>\n </div>\n </div>\n )\n }\n\n const seriesKeys = Object.keys(seriesGroups)\n // Limit series to prevent performance issues with high-cardinality fields (e.g., dates)\n // If more than 20 unique series, fall back to single-series mode\n const MAX_SERIES = 20\n const hasSeries = seriesKeys.length > 1 && seriesKeys.length <= MAX_SERIES\n \n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend && hasSeries\n \n // Use custom chart margins with extra left space for Y-axis label\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40 // Increased from 20 to 40 for Y-axis label space\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsScatterChart margin={chartMargins}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis\n type=\"number\"\n dataKey=\"x\"\n name={xAxisFormat?.label || getFieldLabel(xAxisField)}\n tick={{ fontSize: 12 }}\n tickFormatter={xAxisFormat ? (value) => formatAxisValue(value, xAxisFormat) : undefined}\n />\n <YAxis\n type=\"number\"\n dataKey=\"y\"\n name={yAxisFormat?.label || getFieldLabel(yAxisField)}\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (value) => formatAxisValue(value, yAxisFormat) : undefined}\n label={{ value: yAxisFormat?.label || getFieldLabel(yAxisField), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\n />\n {safeDisplayConfig.showTooltip && (\n <Tooltip\n cursor={{ strokeDasharray: '3 3' }}\n content={({ active, payload }) => {\n if (!active || !payload || payload.length === 0) return null\n // Only show the first (active) point\n const point = payload[0]?.payload\n if (!point) return null\n\n return (\n <div style={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n padding: '8px 12px'\n }}>\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>{point.name}</div>\n {/* Show time dimension values if present */}\n {point.timeValues && Object.keys(point.timeValues).length > 0 && (\n <div style={{ marginBottom: '4px', color: '#6b7280' }}>\n {Object.entries(point.timeValues).map(([field, value]) => (\n <div key={field}>{getFieldLabel(field)}: {value as string}</div>\n ))}\n </div>\n )}\n <div>{xAxisFormat?.label || getFieldLabel(xAxisField)}: {formatAxisValue(point.x, xAxisFormat)}</div>\n <div>{yAxisFormat?.label || getFieldLabel(yAxisField)}: {formatAxisValue(point.y, yAxisFormat)}</div>\n </div>\n )\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {hasSeries ? (\n // Multiple series\n seriesKeys.map((seriesKey, index) => (\n <Scatter\n key={seriesKey}\n name={seriesKey}\n data={seriesGroups[seriesKey]}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n />\n ))\n ) : (\n // Single series\n <Scatter\n name=\"Data\"\n data={scatterData}\n fill={(colorPalette?.colors && colorPalette.colors[0]) || CHART_COLORS[0]}\n />\n )}\n </RechartsScatterChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'ScatterChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Scatter Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["ScatterChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","getFieldLabel","useCubeContext","safeDisplayConfig","xAxisFormat","yAxisFormat","jsx","jsxs","xAxisField","yAxisField","seriesFields","seriesConfig","timeDimensionFields","td","scatterData","seriesGroups","seriesField","item","seriesValue","xGranularity","getFieldGranularity","xValue","formatTimeValue","yValue","parseNumericValue","xNum","isValidNumericValue","timeValues","field","granularity","key","point","seriesKeys","hasSeries","showLegend","chartMargins","CHART_MARGINS","ChartContainer","RechartsScatterChart","CartesianGrid","XAxis","value","formatAxisValue","YAxis","Tooltip","active","payload","Legend","o","seriesKey","index","Scatter","CHART_COLORS","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-scatterchart-BP06BeU5.js","sources":["../../../src/client/components/charts/ScatterChart.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { ScatterChart as RechartsScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Legend, Tooltip } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\nexport default function ScatterChart({ \n data, \n chartConfig, \n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const { getFieldLabel } = useCubeContext()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true\n }\n\n // Extract axis format configs\n // For scatter charts, xAxis uses xAxisFormat, yAxis uses leftYAxisFormat\n const xAxisFormat = displayConfig?.xAxisFormat\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in scatter chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisField: string\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - handle both string and array values\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n // Normalize series to array\n const seriesConfig = chartConfig.series\n seriesFields = seriesConfig ? (Array.isArray(seriesConfig) ? seriesConfig : [seriesConfig]) : []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format (adapt for scatter chart)\n xAxisField = chartConfig.x\n yAxisField = Array.isArray(chartConfig.y) ? chartConfig.y[0] : chartConfig.y\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Invalid or missing chart axis configuration</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisField) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n // Extract time dimensions from query for tooltip display\n const timeDimensions = queryObject?.timeDimensions || []\n const timeDimensionFields = timeDimensions.map((td: any) => td.dimension)\n\n // Transform data for scatter plot\n // Null handling: Filter out data points where x or y coordinates are null\n let scatterData: any[]\n let seriesGroups: { [key: string]: any[] } = {}\n\n if (seriesFields.length > 0) {\n // Group data by series field\n const seriesField = seriesFields[0]\n data.forEach(item => {\n const seriesValue = String(item[seriesField] || 'Default')\n if (!seriesGroups[seriesValue]) {\n seriesGroups[seriesValue] = []\n }\n\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n\n // Only add point if both x and y are valid numbers\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n if (isValidNumericValue(xNum) && yValue !== null) {\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n seriesGroups[seriesValue].push({\n x: xNum,\n y: yValue,\n name: seriesValue,\n timeValues,\n originalItem: item\n })\n }\n })\n\n // Collect all valid points from all series for validation\n // (The actual rendering uses seriesGroups with series separated)\n const seriesKeys = Object.keys(seriesGroups)\n scatterData = seriesKeys.flatMap(key => seriesGroups[key])\n } else {\n // Single series scatter plot\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n scatterData = data\n .map(item => {\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n return {\n x: xNum,\n y: yValue,\n name: `Point`,\n timeValues,\n originalItem: item,\n isValid: isValidNumericValue(xNum) && yValue !== null\n }\n })\n .filter(point => point.isValid)\n }\n \n // Validate transformed data\n if (!scatterData || scatterData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for scatter chart after transformation</div>\n </div>\n </div>\n )\n }\n\n const seriesKeys = Object.keys(seriesGroups)\n // Limit series to prevent performance issues with high-cardinality fields (e.g., dates)\n // If more than 20 unique series, fall back to single-series mode\n const MAX_SERIES = 20\n const hasSeries = seriesKeys.length > 1 && seriesKeys.length <= MAX_SERIES\n \n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend && hasSeries\n \n // Use custom chart margins with extra left space for Y-axis label\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40 // Increased from 20 to 40 for Y-axis label space\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsScatterChart margin={chartMargins}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis\n type=\"number\"\n dataKey=\"x\"\n name={xAxisFormat?.label || getFieldLabel(xAxisField)}\n tick={{ fontSize: 12 }}\n tickFormatter={xAxisFormat ? (value) => formatAxisValue(value, xAxisFormat) : undefined}\n />\n <YAxis\n type=\"number\"\n dataKey=\"y\"\n name={yAxisFormat?.label || getFieldLabel(yAxisField)}\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (value) => formatAxisValue(value, yAxisFormat) : undefined}\n label={{ value: yAxisFormat?.label || getFieldLabel(yAxisField), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\n />\n {safeDisplayConfig.showTooltip && (\n <Tooltip\n cursor={{ strokeDasharray: '3 3' }}\n content={({ active, payload }) => {\n if (!active || !payload || payload.length === 0) return null\n // Only show the first (active) point\n const point = payload[0]?.payload\n if (!point) return null\n\n return (\n <div style={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n padding: '8px 12px'\n }}>\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>{point.name}</div>\n {/* Show time dimension values if present */}\n {point.timeValues && Object.keys(point.timeValues).length > 0 && (\n <div style={{ marginBottom: '4px', color: '#6b7280' }}>\n {Object.entries(point.timeValues).map(([field, value]) => (\n <div key={field}>{getFieldLabel(field)}: {value as string}</div>\n ))}\n </div>\n )}\n <div>{xAxisFormat?.label || getFieldLabel(xAxisField)}: {formatAxisValue(point.x, xAxisFormat)}</div>\n <div>{yAxisFormat?.label || getFieldLabel(yAxisField)}: {formatAxisValue(point.y, yAxisFormat)}</div>\n </div>\n )\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {hasSeries ? (\n // Multiple series\n seriesKeys.map((seriesKey, index) => (\n <Scatter\n key={seriesKey}\n name={seriesKey}\n data={seriesGroups[seriesKey]}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n />\n ))\n ) : (\n // Single series\n <Scatter\n name=\"Data\"\n data={scatterData}\n fill={(colorPalette?.colors && colorPalette.colors[0]) || CHART_COLORS[0]}\n />\n )}\n </RechartsScatterChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'ScatterChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Scatter Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n}"],"names":["ScatterChart","data","chartConfig","displayConfig","queryObject","height","colorPalette","hoveredLegend","setHoveredLegend","useState","getFieldLabel","useCubeContext","safeDisplayConfig","xAxisFormat","yAxisFormat","jsx","jsxs","xAxisField","yAxisField","seriesFields","seriesConfig","timeDimensionFields","td","scatterData","seriesGroups","seriesField","item","seriesValue","xGranularity","getFieldGranularity","xValue","formatTimeValue","yValue","parseNumericValue","xNum","isValidNumericValue","timeValues","field","granularity","key","point","seriesKeys","hasSeries","showLegend","chartMargins","CHART_MARGINS","ChartContainer","RechartsScatterChart","CartesianGrid","XAxis","value","formatAxisValue","YAxis","Tooltip","active","payload","Legend","o","seriesKey","index","Scatter","CHART_COLORS","error"],"mappings":"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"}
|