dp-widgets-framework 1.3.9 → 1.4.1
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/index.esm.js +1385 -110
- package/dist/index.js +1385 -110
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2020,7 +2020,7 @@ const borderRadiusMap$2 = {
|
|
|
2020
2020
|
large: "0.5rem",
|
|
2021
2021
|
"extra-large": "0.75rem",
|
|
2022
2022
|
};
|
|
2023
|
-
const getStyleValues$
|
|
2023
|
+
const getStyleValues$a = (styles = {}) => {
|
|
2024
2024
|
return {
|
|
2025
2025
|
backgroundColor: styles.backgroundColor || "transparent",
|
|
2026
2026
|
borderRadius: borderRadiusMap$2[styles.borderRadius || "rounded"],
|
|
@@ -2033,7 +2033,7 @@ const getStyleValues$5 = (styles = {}) => {
|
|
|
2033
2033
|
};
|
|
2034
2034
|
function HeaderWidget({ widget }) {
|
|
2035
2035
|
var _a, _b;
|
|
2036
|
-
const styles = getStyleValues$
|
|
2036
|
+
const styles = getStyleValues$a((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
2037
2037
|
const content = ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.content) || {};
|
|
2038
2038
|
return (jsxRuntimeExports.jsx("div", { className: "w-full", style: styles, children: jsxRuntimeExports.jsxs("div", { className: cn("flex items-center justify-between"), children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [content.showLogo && content.logoUrl && (jsxRuntimeExports.jsx("img", { src: content.logoUrl, alt: "Logo", className: "h-8 w-auto" })), jsxRuntimeExports.jsx("h1", { className: cn("font-semibold", content.titleSize || "text-xl"), children: content.title || "Header" })] }), content.showRightContent && (jsxRuntimeExports.jsx("div", { className: "flex items-center gap-4", children: content.rightContent }))] }) }));
|
|
2039
2039
|
}
|
|
@@ -2044,7 +2044,7 @@ const borderRadiusMap$1 = {
|
|
|
2044
2044
|
large: "0.5rem",
|
|
2045
2045
|
"extra-large": "0.75rem",
|
|
2046
2046
|
};
|
|
2047
|
-
const getStyleValues$
|
|
2047
|
+
const getStyleValues$9 = (styles = {}) => {
|
|
2048
2048
|
return {
|
|
2049
2049
|
backgroundColor: styles.backgroundColor || "transparent",
|
|
2050
2050
|
borderRadius: borderRadiusMap$1[styles.borderRadius || "rounded"],
|
|
@@ -2057,7 +2057,7 @@ const getStyleValues$4 = (styles = {}) => {
|
|
|
2057
2057
|
};
|
|
2058
2058
|
function FooterWidget({ widget }) {
|
|
2059
2059
|
var _a, _b;
|
|
2060
|
-
const styles = getStyleValues$
|
|
2060
|
+
const styles = getStyleValues$9((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
2061
2061
|
const content = ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.content) || {};
|
|
2062
2062
|
return (jsxRuntimeExports.jsx("footer", { className: "w-full", style: styles, children: jsxRuntimeExports.jsxs("div", { className: cn("flex items-center", content.layout === "centered" ? "justify-center" : "justify-between"), children: [jsxRuntimeExports.jsx("div", { className: "text-sm", children: content.leftContent || "© 2024 Your Company" }), content.showCenterContent && (jsxRuntimeExports.jsx("div", { className: "text-sm", children: content.centerContent })), content.showRightContent && (jsxRuntimeExports.jsx("div", { className: "flex items-center gap-4 text-sm", children: content.rightContent }))] }) }));
|
|
2063
2063
|
}
|
|
@@ -2068,7 +2068,7 @@ const borderRadiusMap = {
|
|
|
2068
2068
|
large: "0.5rem",
|
|
2069
2069
|
"extra-large": "0.75rem",
|
|
2070
2070
|
};
|
|
2071
|
-
const getStyleValues$
|
|
2071
|
+
const getStyleValues$8 = (styles = {}) => {
|
|
2072
2072
|
const borderRadius = (styles.borderRadius || "rounded");
|
|
2073
2073
|
return {
|
|
2074
2074
|
backgroundColor: styles.backgroundColor || "transparent",
|
|
@@ -2083,12 +2083,12 @@ const getStyleValues$3 = (styles = {}) => {
|
|
|
2083
2083
|
};
|
|
2084
2084
|
function TextWidget({ widget }) {
|
|
2085
2085
|
var _a, _b;
|
|
2086
|
-
const styles = getStyleValues$
|
|
2086
|
+
const styles = getStyleValues$8((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
2087
2087
|
const content = ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.content) || {};
|
|
2088
2088
|
return (jsxRuntimeExports.jsx("div", { className: "w-full", style: styles, children: jsxRuntimeExports.jsx("div", { className: cn("prose max-w-none", content.blockType === "heading-1" && "text-[24px] font-bold", content.blockType === "heading-2" && "text-[22px] font-bold", content.blockType === "heading-3" && "text-[18px] font-bold", content.blockType === "paragraph" && "text-base"), dangerouslySetInnerHTML: { __html: content.displayText || "Text content" } }) }));
|
|
2089
2089
|
}
|
|
2090
2090
|
|
|
2091
|
-
const getStyleValues$
|
|
2091
|
+
const getStyleValues$7 = (styles = {}) => {
|
|
2092
2092
|
return {
|
|
2093
2093
|
borderColor: styles.color || "#e5e7eb",
|
|
2094
2094
|
borderStyle: styles.style || "solid",
|
|
@@ -2098,7 +2098,7 @@ const getStyleValues$2 = (styles = {}) => {
|
|
|
2098
2098
|
};
|
|
2099
2099
|
function DividerWidget({ widget }) {
|
|
2100
2100
|
var _a, _b;
|
|
2101
|
-
const styles = getStyleValues$
|
|
2101
|
+
const styles = getStyleValues$7((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
2102
2102
|
const content = ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.content) || {};
|
|
2103
2103
|
return (jsxRuntimeExports.jsxs("div", { className: "w-full", style: { margin: styles.margin }, children: [jsxRuntimeExports.jsx("hr", { className: cn("w-full", content.variant === "dashed" && "border-dashed", content.variant === "dotted" && "border-dotted"), style: {
|
|
2104
2104
|
borderColor: styles.borderColor,
|
|
@@ -17689,19 +17689,24 @@ function DataGrid({ title, data, className }) {
|
|
|
17689
17689
|
}
|
|
17690
17690
|
setExpandedGroups(newExpanded);
|
|
17691
17691
|
};
|
|
17692
|
+
const formatWithCommas = (value) => {
|
|
17693
|
+
if (value == null || value === "")
|
|
17694
|
+
return "";
|
|
17695
|
+
let str = value.toString().trim();
|
|
17696
|
+
let num = Number(str);
|
|
17697
|
+
if (isNaN(num))
|
|
17698
|
+
return str;
|
|
17699
|
+
let [integer, decimal] = str.split(".");
|
|
17700
|
+
integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
17701
|
+
return decimal ? `${integer}.${decimal}` : integer;
|
|
17702
|
+
};
|
|
17692
17703
|
const formatValueWithUnit = (value, columnIndex) => {
|
|
17693
17704
|
if (value === null || value === undefined)
|
|
17694
17705
|
return "—";
|
|
17695
17706
|
const unit = units === null || units === void 0 ? void 0 : units[columnIndex];
|
|
17696
|
-
console.log('value==>', value, unit);
|
|
17697
17707
|
// Format the value with commas if it's a number or numeric string
|
|
17698
17708
|
let valueStr;
|
|
17699
|
-
|
|
17700
|
-
valueStr = value.toLocaleString();
|
|
17701
|
-
}
|
|
17702
|
-
else {
|
|
17703
|
-
valueStr = String(value);
|
|
17704
|
-
}
|
|
17709
|
+
valueStr = formatWithCommas(value);
|
|
17705
17710
|
// If no unit or unit length > 3, return value only
|
|
17706
17711
|
if (!unit || unit.length > 3) {
|
|
17707
17712
|
return valueStr;
|
|
@@ -38431,10 +38436,10 @@ function SummaryWidget({ title, data, metadata, className }) {
|
|
|
38431
38436
|
}, children: title }) })), jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-auto space-y-4", children: jsxRuntimeExports.jsx("div", { className: "prose prose-sm max-w-none", children: jsxRuntimeExports.jsx(Markdown, { className: "text-gray-800", children: data.content }) }) })] }));
|
|
38432
38437
|
}
|
|
38433
38438
|
|
|
38434
|
-
const CHART_REFRESH_TIMEOUT = 3000;
|
|
38435
|
-
const DEFAULT_COLORS = ["#E4DCB8", "#DAC46C", "#808080", "#582809", "#A3ADD0", "#398E6F", "#AF123D", "#8C99C4", "#5290AC", "#601B07", "#50649D", "#B4A8A0", "#6F2587"];
|
|
38439
|
+
const CHART_REFRESH_TIMEOUT$4 = 3000;
|
|
38440
|
+
const DEFAULT_COLORS$3 = ["#E4DCB8", "#DAC46C", "#808080", "#582809", "#A3ADD0", "#398E6F", "#AF123D", "#8C99C4", "#5290AC", "#601B07", "#50649D", "#B4A8A0", "#6F2587"];
|
|
38436
38441
|
const LINE_COLORS = ["#243D84", "#69238B", "#4A959F", "#D0A677", "#B31E47", "#396431"];
|
|
38437
|
-
const clearChat = async (widgetBackendUrl, widgetId) => {
|
|
38442
|
+
const clearChat$4 = async (widgetBackendUrl, widgetId) => {
|
|
38438
38443
|
if (!widgetBackendUrl || !widgetId)
|
|
38439
38444
|
return;
|
|
38440
38445
|
console.log('clearChat called for widgetId:', widgetId);
|
|
@@ -38456,8 +38461,8 @@ const clearChat = async (widgetBackendUrl, widgetId) => {
|
|
|
38456
38461
|
console.error('Failed to clear chat:', error);
|
|
38457
38462
|
}
|
|
38458
38463
|
};
|
|
38459
|
-
const createLoadingComponent = (message = "Loading chart data...") => (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.RefreshCw, { className: "h-6 w-6 animate-spin text-gray-800" }), jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-500", children: message })] }) }));
|
|
38460
|
-
const createInitialChartState = (agentType, widgetIds, datasetId) => {
|
|
38464
|
+
const createLoadingComponent$4 = (message = "Loading chart data...") => (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.RefreshCw, { className: "h-6 w-6 animate-spin text-gray-800" }), jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-500", children: message })] }) }));
|
|
38465
|
+
const createInitialChartState$4 = (agentType, widgetIds, datasetId) => {
|
|
38461
38466
|
const baseState = { dataset_id: datasetId || "home_generation_dataset" };
|
|
38462
38467
|
switch (agentType) {
|
|
38463
38468
|
case "Pie Chart Agent":
|
|
@@ -38484,6 +38489,8 @@ const createInitialChartState = (agentType, widgetIds, datasetId) => {
|
|
|
38484
38489
|
title: "",
|
|
38485
38490
|
type: "series_bar",
|
|
38486
38491
|
chart_type: "financial",
|
|
38492
|
+
x_axis_title: "",
|
|
38493
|
+
y_axis_title: "",
|
|
38487
38494
|
orientation: "vertical",
|
|
38488
38495
|
units: "",
|
|
38489
38496
|
data: { labels: [], series: [], total: 0, average: 0 },
|
|
@@ -38512,7 +38519,7 @@ const createInitialChartState = (agentType, widgetIds, datasetId) => {
|
|
|
38512
38519
|
return Object.assign({ widget_ids: widgetIds }, baseState);
|
|
38513
38520
|
}
|
|
38514
38521
|
};
|
|
38515
|
-
const loadAgentState = async (widgetBackendUrl, threadId, agentName) => {
|
|
38522
|
+
const loadAgentState$4 = async (widgetBackendUrl, threadId, agentName) => {
|
|
38516
38523
|
try {
|
|
38517
38524
|
const response = await fetch(`${widgetBackendUrl}/api/copilot/${agentName}`, {
|
|
38518
38525
|
method: 'POST',
|
|
@@ -38541,7 +38548,7 @@ const loadAgentState = async (widgetBackendUrl, threadId, agentName) => {
|
|
|
38541
38548
|
return null;
|
|
38542
38549
|
}
|
|
38543
38550
|
};
|
|
38544
|
-
const parseAndUpdateChartState = (apiResponse, setChartState) => {
|
|
38551
|
+
const parseAndUpdateChartState$4 = (apiResponse, setChartState) => {
|
|
38545
38552
|
var _a, _b;
|
|
38546
38553
|
try {
|
|
38547
38554
|
if ((_b = (_a = apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.data) === null || _a === void 0 ? void 0 : _a.loadAgentState) === null || _b === void 0 ? void 0 : _b.state) {
|
|
@@ -38584,7 +38591,7 @@ const parseAndUpdateChartState = (apiResponse, setChartState) => {
|
|
|
38584
38591
|
console.error('Failed to parse and update chart state:', error);
|
|
38585
38592
|
}
|
|
38586
38593
|
};
|
|
38587
|
-
const getStyleValues$
|
|
38594
|
+
const getStyleValues$6 = (styles = {}) => {
|
|
38588
38595
|
const borderRadiusMap = {
|
|
38589
38596
|
none: "0px",
|
|
38590
38597
|
rounded: "0.375rem",
|
|
@@ -38618,7 +38625,7 @@ function BarChartComponent({ orientation, barChartState, styles, appendMessage,
|
|
|
38618
38625
|
const isEmpty = labels.length === 0 || values.length === 0;
|
|
38619
38626
|
const handleRefresh = async () => {
|
|
38620
38627
|
if (query && widgetBackendUrl && widgetId) {
|
|
38621
|
-
await clearChat(widgetBackendUrl, widgetId);
|
|
38628
|
+
await clearChat$4(widgetBackendUrl, widgetId);
|
|
38622
38629
|
appendMessage(new TextMessage({
|
|
38623
38630
|
content: `${query} and render data on a bar chart`,
|
|
38624
38631
|
role: Role.User,
|
|
@@ -38642,10 +38649,10 @@ function BarChartComponent({ orientation, barChartState, styles, appendMessage,
|
|
|
38642
38649
|
}
|
|
38643
38650
|
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout]);
|
|
38644
38651
|
const finalColors = React.useMemo(() => {
|
|
38645
|
-
return shuffleColors(DEFAULT_COLORS, labels === null || labels === void 0 ? void 0 : labels.length);
|
|
38652
|
+
return shuffleColors(DEFAULT_COLORS$3, labels === null || labels === void 0 ? void 0 : labels.length);
|
|
38646
38653
|
}, [labels.length]);
|
|
38647
38654
|
if (isEmpty) {
|
|
38648
|
-
return createLoadingComponent();
|
|
38655
|
+
return createLoadingComponent$4();
|
|
38649
38656
|
}
|
|
38650
38657
|
const transformedData = {
|
|
38651
38658
|
labels: labels,
|
|
@@ -38659,7 +38666,7 @@ function BarChartComponent({ orientation, barChartState, styles, appendMessage,
|
|
|
38659
38666
|
};
|
|
38660
38667
|
return (jsxRuntimeExports.jsx(BarChart, { orientation: orientation, title: chartTitle, data: transformedData, units: units, content: content }));
|
|
38661
38668
|
}
|
|
38662
|
-
function SeriesBarChartComponent({ orientation, seriesBarChartState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content }) {
|
|
38669
|
+
function SeriesBarChartComponent$2({ orientation, seriesBarChartState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content }) {
|
|
38663
38670
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
|
|
38664
38671
|
const hasCalledRef = React.useRef(false);
|
|
38665
38672
|
const labels = ((_b = (_a = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.labels) || ((_e = (_d = (_c = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.state) === null || _c === void 0 ? void 0 : _c.series_bar_chart_data) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.labels) || [];
|
|
@@ -38671,7 +38678,7 @@ function SeriesBarChartComponent({ orientation, seriesBarChartState, styles, app
|
|
|
38671
38678
|
const isEmpty = labels.length === 0 || series.length === 0;
|
|
38672
38679
|
const handleRefresh = async () => {
|
|
38673
38680
|
if (query) {
|
|
38674
|
-
await clearChat(widgetBackendUrl, widgetId);
|
|
38681
|
+
await clearChat$4(widgetBackendUrl, widgetId);
|
|
38675
38682
|
// Send trigger event to clear chart state
|
|
38676
38683
|
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
38677
38684
|
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
@@ -38697,10 +38704,10 @@ function SeriesBarChartComponent({ orientation, seriesBarChartState, styles, app
|
|
|
38697
38704
|
}
|
|
38698
38705
|
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout]);
|
|
38699
38706
|
const finalColors = React.useMemo(() => {
|
|
38700
|
-
return shuffleColors(DEFAULT_COLORS, series === null || series === void 0 ? void 0 : series.length);
|
|
38707
|
+
return shuffleColors(DEFAULT_COLORS$3, series === null || series === void 0 ? void 0 : series.length);
|
|
38701
38708
|
}, [series.length]);
|
|
38702
38709
|
if (isEmpty) {
|
|
38703
|
-
return createLoadingComponent();
|
|
38710
|
+
return createLoadingComponent$4();
|
|
38704
38711
|
}
|
|
38705
38712
|
const transformedData = {
|
|
38706
38713
|
labels: labels,
|
|
@@ -38724,7 +38731,7 @@ function SeriesLineChartComponent({ orientation, seriesLineChartState, styles, a
|
|
|
38724
38731
|
const isEmpty = labels.length === 0 || series.length === 0;
|
|
38725
38732
|
const handleRefresh = async () => {
|
|
38726
38733
|
if (query) {
|
|
38727
|
-
await clearChat(widgetBackendUrl, widgetId);
|
|
38734
|
+
await clearChat$4(widgetBackendUrl, widgetId);
|
|
38728
38735
|
// Send trigger event to clear chart state
|
|
38729
38736
|
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
38730
38737
|
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
@@ -38750,10 +38757,10 @@ function SeriesLineChartComponent({ orientation, seriesLineChartState, styles, a
|
|
|
38750
38757
|
}
|
|
38751
38758
|
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout]);
|
|
38752
38759
|
const finalColors = React.useMemo(() => {
|
|
38753
|
-
return shuffleColors([...LINE_COLORS, ...DEFAULT_COLORS], series === null || series === void 0 ? void 0 : series.length);
|
|
38760
|
+
return shuffleColors([...LINE_COLORS, ...DEFAULT_COLORS$3], series === null || series === void 0 ? void 0 : series.length);
|
|
38754
38761
|
}, [series.length]);
|
|
38755
38762
|
if (isEmpty) {
|
|
38756
|
-
return createLoadingComponent();
|
|
38763
|
+
return createLoadingComponent$4();
|
|
38757
38764
|
}
|
|
38758
38765
|
const transformedData = {
|
|
38759
38766
|
labels: labels,
|
|
@@ -38772,7 +38779,7 @@ function SeriesLineChartComponent({ orientation, seriesLineChartState, styles, a
|
|
|
38772
38779
|
};
|
|
38773
38780
|
return (jsxRuntimeExports.jsx(SeriesLineChart, { orientation: orientation, title: chartTitle, data: transformedData, units: units, content: content, x_axis_title: x_axis_title, y_axis_title: y_axis_title }));
|
|
38774
38781
|
}
|
|
38775
|
-
function PieChartComponent({ pieChartState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content }) {
|
|
38782
|
+
function PieChartComponent$1({ pieChartState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content }) {
|
|
38776
38783
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1;
|
|
38777
38784
|
const hasCalledRef = React.useRef(false);
|
|
38778
38785
|
const labels = ((_b = (_a = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.labels) || ((_e = (_d = (_c = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.state) === null || _c === void 0 ? void 0 : _c.pie_chart_data) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.labels) || [];
|
|
@@ -38783,7 +38790,7 @@ function PieChartComponent({ pieChartState, styles, appendMessage, query, isFirs
|
|
|
38783
38790
|
const isEmpty = labels.length === 0 || values.length === 0;
|
|
38784
38791
|
const handleRefresh = async () => {
|
|
38785
38792
|
if (query) {
|
|
38786
|
-
await clearChat(widgetBackendUrl, widgetId);
|
|
38793
|
+
await clearChat$4(widgetBackendUrl, widgetId);
|
|
38787
38794
|
// Send trigger event to clear chart state
|
|
38788
38795
|
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
38789
38796
|
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
@@ -38809,10 +38816,10 @@ function PieChartComponent({ pieChartState, styles, appendMessage, query, isFirs
|
|
|
38809
38816
|
}
|
|
38810
38817
|
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout]);
|
|
38811
38818
|
const backgroundColors = React.useMemo(() => {
|
|
38812
|
-
return shuffleColors(DEFAULT_COLORS, labels.length);
|
|
38819
|
+
return shuffleColors(DEFAULT_COLORS$3, labels.length);
|
|
38813
38820
|
}, [labels.length]);
|
|
38814
38821
|
if (isEmpty) {
|
|
38815
|
-
return createLoadingComponent();
|
|
38822
|
+
return createLoadingComponent$4();
|
|
38816
38823
|
}
|
|
38817
38824
|
const colors = ((_y = (_x = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _x === void 0 ? void 0 : _x.data) === null || _y === void 0 ? void 0 : _y.colors) || ((_1 = (_0 = (_z = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.state) === null || _z === void 0 ? void 0 : _z.pie_chart_data) === null || _0 === void 0 ? void 0 : _0.data) === null || _1 === void 0 ? void 0 : _1.colors) || labels.map((_, index) => backgroundColors[index % backgroundColors.length]);
|
|
38818
38825
|
const transformedData = {
|
|
@@ -38839,7 +38846,7 @@ function LineChartComponent({ lineChartState, styles, appendMessage, query, isFi
|
|
|
38839
38846
|
const isEmpty = labels.length === 0 || values.length === 0;
|
|
38840
38847
|
const handleRefresh = async () => {
|
|
38841
38848
|
if (query && widgetBackendUrl && widgetId) {
|
|
38842
|
-
await clearChat(widgetBackendUrl, widgetId);
|
|
38849
|
+
await clearChat$4(widgetBackendUrl, widgetId);
|
|
38843
38850
|
appendMessage(new TextMessage({
|
|
38844
38851
|
content: `${query} and render data on a bar chart`,
|
|
38845
38852
|
role: Role.User,
|
|
@@ -38865,7 +38872,7 @@ function LineChartComponent({ lineChartState, styles, appendMessage, query, isFi
|
|
|
38865
38872
|
return LINE_COLORS[Math.floor(Math.random() * LINE_COLORS.length)];
|
|
38866
38873
|
}, [labels.length]);
|
|
38867
38874
|
if (isEmpty) {
|
|
38868
|
-
return createLoadingComponent();
|
|
38875
|
+
return createLoadingComponent$4();
|
|
38869
38876
|
}
|
|
38870
38877
|
const transformedData = {
|
|
38871
38878
|
labels: labels,
|
|
@@ -38885,7 +38892,7 @@ function LineChartComponent({ lineChartState, styles, appendMessage, query, isFi
|
|
|
38885
38892
|
};
|
|
38886
38893
|
return (jsxRuntimeExports.jsx(LineChart, { title: chartTitle, data: transformedData, units: units, content: content }));
|
|
38887
38894
|
}
|
|
38888
|
-
function DataGridComponent({ dataGridState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout }) {
|
|
38895
|
+
function DataGridComponent$1({ dataGridState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout }) {
|
|
38889
38896
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
|
|
38890
38897
|
const hasCalledRef = React.useRef(false);
|
|
38891
38898
|
const columns = ((_b = (_a = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.matrix_grid_data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.headers) || ((_e = (_d = (_c = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.state) === null || _c === void 0 ? void 0 : _c.matrix_grid_data) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.headers) || [];
|
|
@@ -38895,7 +38902,7 @@ function DataGridComponent({ dataGridState, styles, appendMessage, query, isFirs
|
|
|
38895
38902
|
const isEmpty = columns.length === 0 || rows.length === 0;
|
|
38896
38903
|
const handleRefresh = async () => {
|
|
38897
38904
|
if (query) {
|
|
38898
|
-
await clearChat(widgetBackendUrl, widgetId);
|
|
38905
|
+
await clearChat$4(widgetBackendUrl, widgetId);
|
|
38899
38906
|
// Send trigger event to clear chart state
|
|
38900
38907
|
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
38901
38908
|
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
@@ -38921,7 +38928,7 @@ function DataGridComponent({ dataGridState, styles, appendMessage, query, isFirs
|
|
|
38921
38928
|
}
|
|
38922
38929
|
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout]);
|
|
38923
38930
|
if (isEmpty) {
|
|
38924
|
-
return createLoadingComponent("Loading table data...");
|
|
38931
|
+
return createLoadingComponent$4("Loading table data...");
|
|
38925
38932
|
}
|
|
38926
38933
|
const transformedData = {
|
|
38927
38934
|
columns: columns,
|
|
@@ -38942,7 +38949,7 @@ function SummaryComponent({ summaryState, styles, appendMessage, query, isFirstL
|
|
|
38942
38949
|
const isEmpty = !content || content.trim() === "";
|
|
38943
38950
|
const handleRefresh = async () => {
|
|
38944
38951
|
if (query) {
|
|
38945
|
-
await clearChat(widgetBackendUrl, widgetId);
|
|
38952
|
+
await clearChat$4(widgetBackendUrl, widgetId);
|
|
38946
38953
|
// Send trigger event to clear chart state
|
|
38947
38954
|
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
38948
38955
|
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
@@ -38955,7 +38962,7 @@ function SummaryComponent({ summaryState, styles, appendMessage, query, isFirstL
|
|
|
38955
38962
|
React.useEffect(() => {
|
|
38956
38963
|
if (isEmpty && query && isFirstLoad && !(summaryState === null || summaryState === void 0 ? void 0 : summaryState.agent_message) && !hasCalledRef.current) {
|
|
38957
38964
|
hasCalledRef.current = true;
|
|
38958
|
-
setChartState(
|
|
38965
|
+
setChartState(Object.assign(Object.assign({}, summaryState), { widget_ids: widget_ids }));
|
|
38959
38966
|
setTimeout(() => {
|
|
38960
38967
|
handleRefresh();
|
|
38961
38968
|
}, 500);
|
|
@@ -38971,12 +38978,12 @@ function SummaryComponent({ summaryState, styles, appendMessage, query, isFirstL
|
|
|
38971
38978
|
}
|
|
38972
38979
|
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout]);
|
|
38973
38980
|
if (isEmpty) {
|
|
38974
|
-
return createLoadingComponent("Loading summary...");
|
|
38981
|
+
return createLoadingComponent$4("Loading summary...");
|
|
38975
38982
|
}
|
|
38976
38983
|
return (jsxRuntimeExports.jsx(SummaryWidget, { title: title, data: data, metadata: metadata, className: "" }));
|
|
38977
38984
|
}
|
|
38978
|
-
function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds, widgetBackendUrl, datasetId }) {
|
|
38979
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29
|
|
38985
|
+
function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds, widgetBackendUrl, datasetId, widgetData, }) {
|
|
38986
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29;
|
|
38980
38987
|
const agentType = (_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentType;
|
|
38981
38988
|
const orientation = (_b = widget.config) === null || _b === void 0 ? void 0 : _b.orientation;
|
|
38982
38989
|
const isFirstLoad = (_c = widget.config) === null || _c === void 0 ? void 0 : _c.isFirstLoad;
|
|
@@ -38991,7 +38998,7 @@ function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds,
|
|
|
38991
38998
|
}, [widget.id, setThreadId]);
|
|
38992
38999
|
const { state: chartState, setState: setChartState } = reactCore.useCoAgent({
|
|
38993
39000
|
name: (_e = widget.config) === null || _e === void 0 ? void 0 : _e.agentName,
|
|
38994
|
-
initialState: createInitialChartState(agentType || '', widgetIds, datasetId),
|
|
39001
|
+
initialState: createInitialChartState$4(agentType || '', widgetIds, datasetId),
|
|
38995
39002
|
});
|
|
38996
39003
|
// Function to handle timeout and call loadAgentState API
|
|
38997
39004
|
const handleLoadingTimeout = React.useCallback(async () => {
|
|
@@ -39010,9 +39017,9 @@ function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds,
|
|
|
39010
39017
|
// Increment the API call counter
|
|
39011
39018
|
setApiCallCount(prev => prev + 1);
|
|
39012
39019
|
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || "adk-construction-project-agent";
|
|
39013
|
-
const apiResponse = await loadAgentState(widgetBackendUrl, widget.id, agentName);
|
|
39020
|
+
const apiResponse = await loadAgentState$4(widgetBackendUrl, widget.id, agentName);
|
|
39014
39021
|
if (apiResponse && !(chartState === null || chartState === void 0 ? void 0 : chartState.agent_message)) {
|
|
39015
|
-
parseAndUpdateChartState(apiResponse, setChartState);
|
|
39022
|
+
parseAndUpdateChartState$4(apiResponse, setChartState);
|
|
39016
39023
|
}
|
|
39017
39024
|
}, [widgetBackendUrl, widget.id, isTimeoutTriggered, setChartState, (_f = widget.config) === null || _f === void 0 ? void 0 : _f.agentName, chartState, apiCallCount, hasTimeoutError]);
|
|
39018
39025
|
// Function to start timeout
|
|
@@ -39023,7 +39030,7 @@ function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds,
|
|
|
39023
39030
|
setIsTimeoutTriggered(false);
|
|
39024
39031
|
timeoutRef.current = setTimeout(() => {
|
|
39025
39032
|
handleLoadingTimeout();
|
|
39026
|
-
}, CHART_REFRESH_TIMEOUT);
|
|
39033
|
+
}, CHART_REFRESH_TIMEOUT$4);
|
|
39027
39034
|
}, [handleLoadingTimeout]);
|
|
39028
39035
|
// Function to clear timeout
|
|
39029
39036
|
const clearLoadingTimeout = React.useCallback(() => {
|
|
@@ -39032,29 +39039,6 @@ function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds,
|
|
|
39032
39039
|
timeoutRef.current = null;
|
|
39033
39040
|
}
|
|
39034
39041
|
}, []);
|
|
39035
|
-
// Function to clear chat and reset chart state
|
|
39036
|
-
React.useCallback(async (widgetId) => {
|
|
39037
|
-
if (!widgetBackendUrl)
|
|
39038
|
-
return;
|
|
39039
|
-
try {
|
|
39040
|
-
await fetch(`${widgetBackendUrl}/api/clear-chat`, {
|
|
39041
|
-
method: 'POST',
|
|
39042
|
-
headers: {
|
|
39043
|
-
'Content-Type': 'application/json',
|
|
39044
|
-
},
|
|
39045
|
-
body: JSON.stringify({
|
|
39046
|
-
session_id: widgetId,
|
|
39047
|
-
delete_state: true
|
|
39048
|
-
}),
|
|
39049
|
-
});
|
|
39050
|
-
setChartState(createInitialChartState(agentType || '', widgetIds, datasetId));
|
|
39051
|
-
setApiCallCount(0);
|
|
39052
|
-
setHasTimeoutError(false);
|
|
39053
|
-
}
|
|
39054
|
-
catch (error) {
|
|
39055
|
-
console.error('Failed to clear chat and state:', error);
|
|
39056
|
-
}
|
|
39057
|
-
}, [widgetBackendUrl, setChartState, agentType, widgetIds]);
|
|
39058
39042
|
// Clean up timeout on unmount
|
|
39059
39043
|
React.useEffect(() => {
|
|
39060
39044
|
return () => {
|
|
@@ -39103,7 +39087,7 @@ function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds,
|
|
|
39103
39087
|
messageContent = `${query} and render the data on a summary widget`;
|
|
39104
39088
|
}
|
|
39105
39089
|
console.log('triggering to datasetId==>', datasetId);
|
|
39106
|
-
setChartState(createInitialChartState(agentType || '', widgetIds, datasetId));
|
|
39090
|
+
setChartState(createInitialChartState$4(agentType || '', widgetIds, datasetId));
|
|
39107
39091
|
appendMessage(new TextMessage({
|
|
39108
39092
|
content: messageContent,
|
|
39109
39093
|
role: Role.User,
|
|
@@ -39113,7 +39097,7 @@ function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds,
|
|
|
39113
39097
|
const handleClearChartState = (event) => {
|
|
39114
39098
|
const { widgetId } = event.detail;
|
|
39115
39099
|
if (widgetId === widget.id) {
|
|
39116
|
-
setChartState(createInitialChartState(agentType || '', widgetIds, datasetId));
|
|
39100
|
+
setChartState(createInitialChartState$4(agentType || '', widgetIds, datasetId));
|
|
39117
39101
|
setApiCallCount(0);
|
|
39118
39102
|
setHasTimeoutError(false);
|
|
39119
39103
|
}
|
|
@@ -39133,16 +39117,11 @@ function CopilotKitAgent({ widget, showHeader, styles, onResetReady, widgetIds,
|
|
|
39133
39117
|
(agentType === "Pie Chart Agent" && (!((_2 = (_1 = (_0 = chartState.pie_chart_data) === null || _0 === void 0 ? void 0 : _0.data) === null || _1 === void 0 ? void 0 : _1.labels) === null || _2 === void 0 ? void 0 : _2.length) || !((_5 = (_4 = (_3 = chartState.pie_chart_data) === null || _3 === void 0 ? void 0 : _3.data) === null || _4 === void 0 ? void 0 : _4.values) === null || _5 === void 0 ? void 0 : _5.length))) ||
|
|
39134
39118
|
(agentType === "Line Chart Agent" && (!((_8 = (_7 = (_6 = chartState.bar_chart_data) === null || _6 === void 0 ? void 0 : _6.data) === null || _7 === void 0 ? void 0 : _7.labels) === null || _8 === void 0 ? void 0 : _8.length) || !((_11 = (_10 = (_9 = chartState.bar_chart_data) === null || _9 === void 0 ? void 0 : _9.data) === null || _10 === void 0 ? void 0 : _10.values) === null || _11 === void 0 ? void 0 : _11.length))) ||
|
|
39135
39119
|
(agentType === "Data Grid Agent" && (!((_14 = (_13 = (_12 = chartState.matrix_grid_data) === null || _12 === void 0 ? void 0 : _12.data) === null || _13 === void 0 ? void 0 : _13.headers) === null || _14 === void 0 ? void 0 : _14.length) || !((_17 = (_16 = (_15 = chartState.matrix_grid_data) === null || _15 === void 0 ? void 0 : _15.data) === null || _16 === void 0 ? void 0 : _16.rows) === null || _17 === void 0 ? void 0 : _17.length))) ||
|
|
39136
|
-
(agentType === "Summary Agent" && (!((_19 = (_18 = chartState.summary_data) === null || _18 === void 0 ? void 0 : _18.data) === null || _19 === void 0 ? void 0 : _19.content) || ((_22 = (_21 = (_20 = chartState.summary_data) === null || _20 === void 0 ? void 0 : _20.data) === null || _21 === void 0 ? void 0 : _21.content) === null || _22 === void 0 ? void 0 : _22.trim()) === ""))) ? (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full p-4", children: jsxRuntimeExports.jsx("div", { className: "text-center max-w-md", children: jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-700", children: chartState.agent_message }) }) })) : agentType === "Bar Chart Agent" ? (jsxRuntimeExports.jsx(BarChartComponent, { barChartState: chartState, styles: styles, orientation: orientation, content: content, appendMessage: appendMessage, query: (_23 = widget.config) === null || _23 === void 0 ? void 0 : _23.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Series Bar Chart Agent" ? (jsxRuntimeExports.jsx(SeriesBarChartComponent, { seriesBarChartState: chartState, styles: styles, orientation: orientation, content: content, appendMessage: appendMessage, query: (_24 = widget.config) === null || _24 === void 0 ? void 0 : _24.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Series Line Chart Agent" ? (jsxRuntimeExports.jsx(SeriesLineChartComponent, { seriesLineChartState: chartState, styles: styles, orientation: orientation, content: content, appendMessage: appendMessage, query: (_25 = widget.config) === null || _25 === void 0 ? void 0 : _25.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Pie Chart Agent" ? (jsxRuntimeExports.jsx(PieChartComponent, { pieChartState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_26 = widget.config) === null || _26 === void 0 ? void 0 : _26.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Line Chart Agent" ? (jsxRuntimeExports.jsx(LineChartComponent, { lineChartState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_27 = widget.config) === null || _27 === void 0 ? void 0 : _27.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Data Grid Agent" ? (jsxRuntimeExports.jsx(DataGridComponent, { dataGridState: chartState, styles: styles, appendMessage: appendMessage, query: (_28 = widget.config) === null || _28 === void 0 ? void 0 : _28.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Summary Agent" ? (jsxRuntimeExports.jsx(SummaryComponent, { summaryState: chartState, styles: styles, appendMessage: appendMessage, query: (_29 = widget.config) === null || _29 === void 0 ? void 0 : _29.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, widget_ids: widgetIds, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout, setChartState: setChartState })) :
|
|
39137
|
-
title: ((_30 = widget.config) === null || _30 === void 0 ? void 0 : _30.copilotTitle) || widget.title,
|
|
39138
|
-
initial: ((_31 = widget.config) === null || _31 === void 0 ? void 0 : _31.copilotInitialMessage) || ((_32 = widget.config) === null || _32 === void 0 ? void 0 : _32.placeholder) || "How can I help you today?"
|
|
39139
|
-
}, onSubmitMessage: () => {
|
|
39140
|
-
setChartState(prevState => (Object.assign(Object.assign({}, prevState), { widget_ids: widgetIds, dataset_id: datasetId })));
|
|
39141
|
-
} })) })] }));
|
|
39120
|
+
(agentType === "Summary Agent" && (!((_19 = (_18 = chartState.summary_data) === null || _18 === void 0 ? void 0 : _18.data) === null || _19 === void 0 ? void 0 : _19.content) || ((_22 = (_21 = (_20 = chartState.summary_data) === null || _20 === void 0 ? void 0 : _20.data) === null || _21 === void 0 ? void 0 : _21.content) === null || _22 === void 0 ? void 0 : _22.trim()) === ""))) ? (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full p-4", children: jsxRuntimeExports.jsx("div", { className: "text-center max-w-md", children: jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-700", children: chartState.agent_message }) }) })) : agentType === "Bar Chart Agent" ? (jsxRuntimeExports.jsx(BarChartComponent, { barChartState: chartState, styles: styles, orientation: orientation, content: content, appendMessage: appendMessage, query: (_23 = widget.config) === null || _23 === void 0 ? void 0 : _23.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Series Bar Chart Agent" ? (jsxRuntimeExports.jsx(SeriesBarChartComponent$2, { seriesBarChartState: chartState, styles: styles, orientation: orientation, content: content, appendMessage: appendMessage, query: (_24 = widget.config) === null || _24 === void 0 ? void 0 : _24.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Series Line Chart Agent" ? (jsxRuntimeExports.jsx(SeriesLineChartComponent, { seriesLineChartState: chartState, styles: styles, orientation: orientation, content: content, appendMessage: appendMessage, query: (_25 = widget.config) === null || _25 === void 0 ? void 0 : _25.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Pie Chart Agent" ? (jsxRuntimeExports.jsx(PieChartComponent$1, { pieChartState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_26 = widget.config) === null || _26 === void 0 ? void 0 : _26.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Line Chart Agent" ? (jsxRuntimeExports.jsx(LineChartComponent, { lineChartState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_27 = widget.config) === null || _27 === void 0 ? void 0 : _27.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Data Grid Agent" ? (jsxRuntimeExports.jsx(DataGridComponent$1, { dataGridState: chartState, styles: styles, appendMessage: appendMessage, query: (_28 = widget.config) === null || _28 === void 0 ? void 0 : _28.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout })) : agentType === "Summary Agent" ? (jsxRuntimeExports.jsx(SummaryComponent, { summaryState: chartState, styles: styles, appendMessage: appendMessage, query: (_29 = widget.config) === null || _29 === void 0 ? void 0 : _29.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, widget_ids: widgetIds, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout, setChartState: setChartState })) : null })] }));
|
|
39142
39121
|
}
|
|
39143
|
-
function AgentWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady, widgetIds, datasetId, }) {
|
|
39122
|
+
function AgentWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady, widgetIds, datasetId, widgetData, }) {
|
|
39144
39123
|
var _a, _b;
|
|
39145
|
-
const styles = getStyleValues$
|
|
39124
|
+
const styles = getStyleValues$6((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
39146
39125
|
// Construct the runtime URL using the configurable backend URL
|
|
39147
39126
|
const getRuntimeUrl = () => {
|
|
39148
39127
|
var _a;
|
|
@@ -39153,7 +39132,7 @@ function AgentWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady
|
|
|
39153
39132
|
return (jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: jsxRuntimeExports.jsx(reactCore.CopilotKit, { runtimeUrl: getRuntimeUrl(), showDevConsole: false, agent: ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.agentName) || "widget_assistant", children: jsxRuntimeExports.jsx(CopilotKitAgent, { widget: widget, showHeader: showHeader, styles: styles, onResetReady: onResetReady, widgetIds: widgetIds, widgetBackendUrl: widgetBackendUrl, datasetId: datasetId }) }) }));
|
|
39154
39133
|
}
|
|
39155
39134
|
|
|
39156
|
-
const getStyleValues = (styles = {}) => {
|
|
39135
|
+
const getStyleValues$5 = (styles = {}) => {
|
|
39157
39136
|
(styles.borderRadius || "rounded");
|
|
39158
39137
|
return {
|
|
39159
39138
|
// backgroundColor: styles.backgroundColor || "10px",
|
|
@@ -39161,37 +39140,1333 @@ const getStyleValues = (styles = {}) => {
|
|
|
39161
39140
|
};
|
|
39162
39141
|
function SpacerWidget({ widget }) {
|
|
39163
39142
|
var _a, _b;
|
|
39164
|
-
const styles = getStyleValues((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
39143
|
+
const styles = getStyleValues$5((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
39165
39144
|
((_b = widget.config) === null || _b === void 0 ? void 0 : _b.content) || {};
|
|
39166
39145
|
return (jsxRuntimeExports.jsx("div", { className: "w-full", style: styles }));
|
|
39167
39146
|
}
|
|
39168
39147
|
|
|
39169
|
-
|
|
39170
|
-
const
|
|
39171
|
-
|
|
39172
|
-
|
|
39148
|
+
const getStyleValues$4 = (styles = {}) => {
|
|
39149
|
+
const borderRadiusMap = {
|
|
39150
|
+
none: "0px",
|
|
39151
|
+
rounded: "0.375rem",
|
|
39152
|
+
large: "0.5rem",
|
|
39153
|
+
"extra-large": "0.75rem",
|
|
39154
|
+
};
|
|
39155
|
+
const paddingMap = {
|
|
39156
|
+
small: "0.5rem",
|
|
39157
|
+
medium: "1rem",
|
|
39158
|
+
large: "1.5rem",
|
|
39159
|
+
"extra-large": "2rem",
|
|
39160
|
+
};
|
|
39161
|
+
const alignment = styles.alignment || "left";
|
|
39162
|
+
return {
|
|
39163
|
+
backgroundColor: styles.backgroundColor || "#ffffff",
|
|
39164
|
+
borderRadius: borderRadiusMap[styles.borderRadius || "rounded"],
|
|
39165
|
+
padding: paddingMap[styles.padding || "medium"],
|
|
39166
|
+
color: styles.textColor || "#000000",
|
|
39167
|
+
fontSize: styles.fontSize || "14px",
|
|
39168
|
+
textAlign: alignment,
|
|
39169
|
+
};
|
|
39170
|
+
};
|
|
39171
|
+
function CopilotKitChatbot({ widget, showHeader, styles, onResetReady, widgetIds, datasetId, }) {
|
|
39172
|
+
var _a, _b, _c, _d;
|
|
39173
|
+
const { threadId, setThreadId } = reactCore.useCopilotContext();
|
|
39174
|
+
React.useEffect(() => {
|
|
39175
|
+
setThreadId(widget.id);
|
|
39176
|
+
}, [widget.id, setThreadId]);
|
|
39177
|
+
const { state: chatbotState, setState: setChatbotState } = reactCore.useCoAgent({
|
|
39178
|
+
name: ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || "widget_assistant",
|
|
39179
|
+
initialState: {
|
|
39180
|
+
widget_ids: widgetIds,
|
|
39181
|
+
dataset_id: datasetId
|
|
39182
|
+
},
|
|
39183
|
+
});
|
|
39184
|
+
const { reset } = reactCore.useCopilotChat();
|
|
39185
|
+
// Register the reset function with the parent component
|
|
39186
|
+
React.useEffect(() => {
|
|
39187
|
+
if (onResetReady && reset && widget.id) {
|
|
39188
|
+
console.log('on reset ready=>');
|
|
39189
|
+
const wrappedReset = () => {
|
|
39190
|
+
reset();
|
|
39191
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId: widget.id } }));
|
|
39192
|
+
};
|
|
39193
|
+
onResetReady(widget.id, wrappedReset);
|
|
39173
39194
|
}
|
|
39195
|
+
}, [reset, widget.id, onResetReady]);
|
|
39196
|
+
// Listen for clearChartState events for this widget
|
|
39197
|
+
React.useEffect(() => {
|
|
39198
|
+
const handleClearChartState = (event) => {
|
|
39199
|
+
const { widgetId } = event.detail;
|
|
39200
|
+
if (widgetId === widget.id) {
|
|
39201
|
+
setChatbotState({
|
|
39202
|
+
widget_ids: widgetIds,
|
|
39203
|
+
dataset_id: datasetId
|
|
39204
|
+
});
|
|
39205
|
+
}
|
|
39206
|
+
};
|
|
39207
|
+
window.addEventListener('clearChartState', handleClearChartState);
|
|
39208
|
+
return () => {
|
|
39209
|
+
window.removeEventListener('clearChartState', handleClearChartState);
|
|
39210
|
+
};
|
|
39211
|
+
}, [widget.id, widgetIds, datasetId, setChatbotState]);
|
|
39212
|
+
return (jsxRuntimeExports.jsxs("div", { className: cn("flex flex-col h-full"), children: [showHeader && (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between pb-2 border-b", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.Bot, { className: "h-4 w-4" }), jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium", children: widget.title })] }) })), jsxRuntimeExports.jsx("div", { className: "flex-1 h-full", children: jsxRuntimeExports.jsx(reactUi.CopilotChat, { className: "h-full text-xs [&_.copilot-chat-message]:text-xs [&_.copilot-chat-input]:text-xs", labels: {
|
|
39213
|
+
title: ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.copilotTitle) || widget.title,
|
|
39214
|
+
initial: ((_c = widget.config) === null || _c === void 0 ? void 0 : _c.copilotInitialMessage) || ((_d = widget.config) === null || _d === void 0 ? void 0 : _d.placeholder) || "How can I help you today?"
|
|
39215
|
+
}, onSubmitMessage: () => {
|
|
39216
|
+
setChatbotState(prevState => (Object.assign(Object.assign({}, prevState), { widget_ids: widgetIds, dataset_id: datasetId })));
|
|
39217
|
+
} }) })] }));
|
|
39218
|
+
}
|
|
39219
|
+
function ChatbotWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady, widgetIds, datasetId, }) {
|
|
39220
|
+
var _a, _b;
|
|
39221
|
+
const styles = getStyleValues$4((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
39222
|
+
// Construct the runtime URL using the configurable backend URL
|
|
39223
|
+
const getRuntimeUrl = () => {
|
|
39224
|
+
var _a;
|
|
39225
|
+
const baseUrl = widgetBackendUrl || '';
|
|
39226
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || 'default-agent';
|
|
39227
|
+
return `${baseUrl}/api/copilot/${agentName}`;
|
|
39174
39228
|
};
|
|
39175
|
-
|
|
39176
|
-
|
|
39177
|
-
|
|
39178
|
-
|
|
39179
|
-
|
|
39180
|
-
|
|
39181
|
-
|
|
39182
|
-
|
|
39183
|
-
|
|
39184
|
-
|
|
39185
|
-
|
|
39186
|
-
|
|
39187
|
-
|
|
39188
|
-
|
|
39189
|
-
|
|
39190
|
-
|
|
39191
|
-
|
|
39192
|
-
|
|
39193
|
-
|
|
39194
|
-
|
|
39229
|
+
return (jsxRuntimeExports.jsx(reactCore.CopilotKit, { runtimeUrl: getRuntimeUrl(), showDevConsole: false, agent: ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.agentName) || "widget_assistant", children: jsxRuntimeExports.jsx(CopilotKitChatbot, { widget: widget, showHeader: showHeader, styles: styles, onResetReady: onResetReady, widgetIds: widgetIds, datasetId: datasetId }) }));
|
|
39230
|
+
}
|
|
39231
|
+
|
|
39232
|
+
const CHART_REFRESH_TIMEOUT$3 = 3000;
|
|
39233
|
+
const DEFAULT_COLORS$2 = ["#E4DCB8", "#DAC46C", "#808080", "#582809", "#A3ADD0", "#398E6F", "#AF123D", "#8C99C4", "#5290AC", "#601B07", "#50649D", "#B4A8A0", "#6F2587"];
|
|
39234
|
+
const clearChat$3 = async (widgetBackendUrl, widgetId) => {
|
|
39235
|
+
if (!widgetBackendUrl || !widgetId)
|
|
39236
|
+
return;
|
|
39237
|
+
console.log('clearChat called for widgetId:', widgetId);
|
|
39238
|
+
try {
|
|
39239
|
+
await fetch(`${widgetBackendUrl}/api/clear-chat`, {
|
|
39240
|
+
method: 'POST',
|
|
39241
|
+
headers: {
|
|
39242
|
+
'Content-Type': 'application/json',
|
|
39243
|
+
},
|
|
39244
|
+
body: JSON.stringify({
|
|
39245
|
+
session_id: widgetId,
|
|
39246
|
+
delete_state: true
|
|
39247
|
+
}),
|
|
39248
|
+
});
|
|
39249
|
+
console.log('Dispatching clearChartState event from clearChat for widgetId:', widgetId);
|
|
39250
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
39251
|
+
}
|
|
39252
|
+
catch (error) {
|
|
39253
|
+
console.error('Failed to clear chat:', error);
|
|
39254
|
+
}
|
|
39255
|
+
};
|
|
39256
|
+
const createLoadingComponent$3 = (message = "Loading chart data...") => (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.RefreshCw, { className: "h-6 w-6 animate-spin text-gray-800" }), jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-500", children: message })] }) }));
|
|
39257
|
+
const createInitialChartState$3 = (datasetId, pieChartState) => {
|
|
39258
|
+
return {
|
|
39259
|
+
pie_chart_data: {
|
|
39260
|
+
title: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.title) || "",
|
|
39261
|
+
type: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.type) || "pie",
|
|
39262
|
+
chart_type: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.chart_type) || "financial",
|
|
39263
|
+
data: { labels: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.data.labels) || [], values: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.data.values) || [], percentages: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.data.percentages) || [], total: pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.data.total },
|
|
39264
|
+
metadata: { categories: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.metadata.categories) || 0, largest_category: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.metadata.largest_category) || "", largest_value: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.metadata.largest_value) || 0, largest_percentage: (pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.metadata.largest_percentage) || 0 }
|
|
39265
|
+
},
|
|
39266
|
+
dataset_id: datasetId || "home_generation_dataset"
|
|
39267
|
+
};
|
|
39268
|
+
};
|
|
39269
|
+
const loadAgentState$3 = async (widgetBackendUrl, threadId, agentName) => {
|
|
39270
|
+
try {
|
|
39271
|
+
const response = await fetch(`${widgetBackendUrl}/api/copilot/${agentName}`, {
|
|
39272
|
+
method: 'POST',
|
|
39273
|
+
headers: {
|
|
39274
|
+
'Content-Type': 'application/json',
|
|
39275
|
+
},
|
|
39276
|
+
body: JSON.stringify({
|
|
39277
|
+
"operationName": "loadAgentState",
|
|
39278
|
+
"query": "query loadAgentState($data: LoadAgentStateInput!) {\n loadAgentState(data: $data) {\n threadId\n threadExists\n state\n messages\n __typename\n }\n}",
|
|
39279
|
+
"variables": {
|
|
39280
|
+
"data": {
|
|
39281
|
+
"agentName": agentName,
|
|
39282
|
+
"threadId": threadId
|
|
39283
|
+
}
|
|
39284
|
+
}
|
|
39285
|
+
}),
|
|
39286
|
+
});
|
|
39287
|
+
if (!response.ok) {
|
|
39288
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
39289
|
+
}
|
|
39290
|
+
const result = await response.json();
|
|
39291
|
+
return result;
|
|
39292
|
+
}
|
|
39293
|
+
catch (error) {
|
|
39294
|
+
console.error('Failed to load agent state:', error);
|
|
39295
|
+
return null;
|
|
39296
|
+
}
|
|
39297
|
+
};
|
|
39298
|
+
const parseAndUpdateChartState$3 = (apiResponse, setChartState) => {
|
|
39299
|
+
var _a, _b;
|
|
39300
|
+
try {
|
|
39301
|
+
if ((_b = (_a = apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.data) === null || _a === void 0 ? void 0 : _a.loadAgentState) === null || _b === void 0 ? void 0 : _b.state) {
|
|
39302
|
+
const stateString = apiResponse.data.loadAgentState.state;
|
|
39303
|
+
const parsedState = JSON.parse(stateString);
|
|
39304
|
+
if (parsedState.state) {
|
|
39305
|
+
const chartData = parsedState.state;
|
|
39306
|
+
setChartState((prevState) => {
|
|
39307
|
+
const newChartState = Object.assign({}, prevState);
|
|
39308
|
+
if (chartData.pie_chart_data) {
|
|
39309
|
+
newChartState.pie_chart_data = chartData.pie_chart_data;
|
|
39310
|
+
}
|
|
39311
|
+
if (chartData.agent_message) {
|
|
39312
|
+
newChartState.agent_message = chartData.agent_message;
|
|
39313
|
+
}
|
|
39314
|
+
return newChartState;
|
|
39315
|
+
});
|
|
39316
|
+
}
|
|
39317
|
+
}
|
|
39318
|
+
}
|
|
39319
|
+
catch (error) {
|
|
39320
|
+
console.error('Failed to parse and update chart state:', error);
|
|
39321
|
+
}
|
|
39322
|
+
};
|
|
39323
|
+
const getStyleValues$3 = (styles = {}) => {
|
|
39324
|
+
const borderRadiusMap = {
|
|
39325
|
+
none: "0px",
|
|
39326
|
+
rounded: "0.375rem",
|
|
39327
|
+
large: "0.5rem",
|
|
39328
|
+
"extra-large": "0.75rem",
|
|
39329
|
+
};
|
|
39330
|
+
const paddingMap = {
|
|
39331
|
+
small: "0.5rem",
|
|
39332
|
+
medium: "1rem",
|
|
39333
|
+
large: "1.5rem",
|
|
39334
|
+
"extra-large": "2rem",
|
|
39335
|
+
};
|
|
39336
|
+
const alignment = styles.alignment || "left";
|
|
39337
|
+
return {
|
|
39338
|
+
backgroundColor: styles.backgroundColor || "#ffffff",
|
|
39339
|
+
borderRadius: borderRadiusMap[styles.borderRadius || "rounded"],
|
|
39340
|
+
padding: paddingMap[styles.padding || "medium"],
|
|
39341
|
+
color: styles.textColor || "#000000",
|
|
39342
|
+
fontSize: styles.fontSize || "14px",
|
|
39343
|
+
textAlign: alignment,
|
|
39344
|
+
};
|
|
39345
|
+
};
|
|
39346
|
+
function PieChartComponent({ pieChartState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content, hasWidgetData }) {
|
|
39347
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
39348
|
+
const hasCalledRef = React.useRef(false);
|
|
39349
|
+
const labels = ((_b = (_a = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.labels) || [];
|
|
39350
|
+
const values = ((_d = (_c = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.values) || [];
|
|
39351
|
+
((_f = (_e = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _e === void 0 ? void 0 : _e.data) === null || _f === void 0 ? void 0 : _f.percentages) || [];
|
|
39352
|
+
const chartTitle = ((_g = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _g === void 0 ? void 0 : _g.title) || "";
|
|
39353
|
+
const units = ((_h = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _h === void 0 ? void 0 : _h.units) || "";
|
|
39354
|
+
const isEmpty = labels.length === 0 || values.length === 0;
|
|
39355
|
+
const handleRefresh = async () => {
|
|
39356
|
+
if (query) {
|
|
39357
|
+
await clearChat$3(widgetBackendUrl, widgetId);
|
|
39358
|
+
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
39359
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
39360
|
+
appendMessage(new TextMessage({
|
|
39361
|
+
content: `${query} and render data on pie chart`,
|
|
39362
|
+
role: Role.User,
|
|
39363
|
+
}));
|
|
39364
|
+
}
|
|
39365
|
+
};
|
|
39366
|
+
React.useEffect(() => {
|
|
39367
|
+
if (isEmpty && query && isFirstLoad && !(pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.agent_message) && !hasCalledRef.current) {
|
|
39368
|
+
hasCalledRef.current = true;
|
|
39369
|
+
handleRefresh();
|
|
39370
|
+
}
|
|
39371
|
+
}, [isEmpty, query, isFirstLoad, pieChartState]);
|
|
39372
|
+
React.useEffect(() => {
|
|
39373
|
+
console.log('PieChartComponent useEffect - isEmpty:', isEmpty, 'hasMessage:', !!(pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.agent_message), 'hasWidgetData:', hasWidgetData, 'isFirstLoad:', isFirstLoad);
|
|
39374
|
+
if (isEmpty && startLoadingTimeout && !(pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.agent_message)) {
|
|
39375
|
+
console.log('Starting loading timeout from PieChartComponent useEffect');
|
|
39376
|
+
startLoadingTimeout();
|
|
39377
|
+
}
|
|
39378
|
+
else if (!isEmpty && clearLoadingTimeout) {
|
|
39379
|
+
clearLoadingTimeout();
|
|
39380
|
+
}
|
|
39381
|
+
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout, pieChartState]);
|
|
39382
|
+
const backgroundColors = React.useMemo(() => {
|
|
39383
|
+
return shuffleColors(DEFAULT_COLORS$2, labels.length);
|
|
39384
|
+
}, [labels.length]);
|
|
39385
|
+
if (isEmpty) {
|
|
39386
|
+
return createLoadingComponent$3();
|
|
39387
|
+
}
|
|
39388
|
+
const colors = ((_k = (_j = pieChartState === null || pieChartState === void 0 ? void 0 : pieChartState.pie_chart_data) === null || _j === void 0 ? void 0 : _j.data) === null || _k === void 0 ? void 0 : _k.colors) || labels.map((_, index) => backgroundColors[index % backgroundColors.length]);
|
|
39389
|
+
const transformedData = {
|
|
39390
|
+
labels: labels,
|
|
39391
|
+
datasets: [
|
|
39392
|
+
{
|
|
39393
|
+
label: chartTitle || "Data",
|
|
39394
|
+
data: values,
|
|
39395
|
+
backgroundColor: colors,
|
|
39396
|
+
borderWidth: 0,
|
|
39397
|
+
},
|
|
39398
|
+
],
|
|
39399
|
+
};
|
|
39400
|
+
return (jsxRuntimeExports.jsx(PieChart, { title: chartTitle, data: transformedData, units: units, content: content }));
|
|
39401
|
+
}
|
|
39402
|
+
function CopilotKitPieChart({ widget, showHeader, styles, onResetReady, widgetBackendUrl, datasetId, widgetData, }) {
|
|
39403
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
39404
|
+
const isFirstLoad = (_a = widget.config) === null || _a === void 0 ? void 0 : _a.isFirstLoad;
|
|
39405
|
+
const content = (_b = widget.config) === null || _b === void 0 ? void 0 : _b.content;
|
|
39406
|
+
const widget_data = (_c = widget.widget_data) === null || _c === void 0 ? void 0 : _c.pie_chart_data;
|
|
39407
|
+
console.log('widget_data===>', widget_data);
|
|
39408
|
+
const { threadId, setThreadId } = reactCore.useCopilotContext();
|
|
39409
|
+
const timeoutRef = React.useRef(null);
|
|
39410
|
+
const [apiCallCount, setApiCallCount] = React.useState(0);
|
|
39411
|
+
const [hasTimeoutError, setHasTimeoutError] = React.useState(false);
|
|
39412
|
+
React.useEffect(() => {
|
|
39413
|
+
setThreadId(widget.id);
|
|
39414
|
+
}, [widget.id, setThreadId]);
|
|
39415
|
+
const { state: agentState, setState: setAgentState } = reactCore.useCoAgent({
|
|
39416
|
+
name: (_d = widget.config) === null || _d === void 0 ? void 0 : _d.agentName,
|
|
39417
|
+
initialState: createInitialChartState$3(datasetId, widget_data),
|
|
39418
|
+
});
|
|
39419
|
+
const [chartState, setChartState] = React.useState(createInitialChartState$3(datasetId, widget_data));
|
|
39420
|
+
const handleLoadingTimeout = React.useCallback(async () => {
|
|
39421
|
+
var _a;
|
|
39422
|
+
if (!widgetBackendUrl || !widget.id || (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) || hasTimeoutError) {
|
|
39423
|
+
console.log('Skipping API call - conditions not met');
|
|
39424
|
+
return;
|
|
39425
|
+
}
|
|
39426
|
+
console.log('Loading timeout triggered for widget:', widget.id, 'API call count:', apiCallCount);
|
|
39427
|
+
if (apiCallCount >= 30) {
|
|
39428
|
+
console.log('API call limit reached for widget:', widget.id);
|
|
39429
|
+
setHasTimeoutError(true);
|
|
39430
|
+
setChartState(prevState => (Object.assign(Object.assign({}, prevState), { agent_message: "Timeout: Unable to load data after multiple attempts. Please try refreshing the widget." })));
|
|
39431
|
+
return;
|
|
39432
|
+
}
|
|
39433
|
+
setApiCallCount(prev => prev + 1);
|
|
39434
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || "adk-construction-project-agent";
|
|
39435
|
+
console.log('Calling loadAgentState API for widget:', widget.id);
|
|
39436
|
+
const apiResponse = await loadAgentState$3(widgetBackendUrl, widget.id, agentName);
|
|
39437
|
+
console.log('API response received:', apiResponse);
|
|
39438
|
+
if (apiResponse && !(chartState === null || chartState === void 0 ? void 0 : chartState.agent_message)) {
|
|
39439
|
+
parseAndUpdateChartState$3(apiResponse, setChartState);
|
|
39440
|
+
}
|
|
39441
|
+
}, [widgetBackendUrl, widget.id, setChartState, (_e = widget.config) === null || _e === void 0 ? void 0 : _e.agentName, chartState, apiCallCount, hasTimeoutError]);
|
|
39442
|
+
const startLoadingTimeout = React.useCallback(() => {
|
|
39443
|
+
if (timeoutRef.current) {
|
|
39444
|
+
clearTimeout(timeoutRef.current);
|
|
39445
|
+
}
|
|
39446
|
+
console.log('Scheduling next API call in 3 seconds');
|
|
39447
|
+
timeoutRef.current = setTimeout(() => {
|
|
39448
|
+
handleLoadingTimeout();
|
|
39449
|
+
}, CHART_REFRESH_TIMEOUT$3);
|
|
39450
|
+
}, [handleLoadingTimeout]);
|
|
39451
|
+
const clearLoadingTimeout = React.useCallback(() => {
|
|
39452
|
+
if (timeoutRef.current) {
|
|
39453
|
+
clearTimeout(timeoutRef.current);
|
|
39454
|
+
timeoutRef.current = null;
|
|
39455
|
+
}
|
|
39456
|
+
}, []);
|
|
39457
|
+
React.useEffect(() => {
|
|
39458
|
+
return () => {
|
|
39459
|
+
if (timeoutRef.current) {
|
|
39460
|
+
clearTimeout(timeoutRef.current);
|
|
39461
|
+
}
|
|
39462
|
+
};
|
|
39463
|
+
}, []);
|
|
39464
|
+
const { appendMessage, reset } = reactCore.useCopilotChat();
|
|
39465
|
+
React.useEffect(() => {
|
|
39466
|
+
if (onResetReady && reset && widget.id) {
|
|
39467
|
+
const wrappedReset = () => {
|
|
39468
|
+
reset();
|
|
39469
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId: widget.id } }));
|
|
39470
|
+
};
|
|
39471
|
+
onResetReady(widget.id, wrappedReset);
|
|
39472
|
+
}
|
|
39473
|
+
}, [reset, widget.id, onResetReady]);
|
|
39474
|
+
React.useEffect(() => {
|
|
39475
|
+
const handleTriggerAgent = (event) => {
|
|
39476
|
+
const { widgetId, query, agentType: eventAgentType, datasetId } = event.detail;
|
|
39477
|
+
reset();
|
|
39478
|
+
if (widgetId === widget.id) {
|
|
39479
|
+
let messageContent = `${query} and render data on pie chart`;
|
|
39480
|
+
console.log('triggering to datasetId==>', datasetId);
|
|
39481
|
+
setChartState(createInitialChartState$3(datasetId));
|
|
39482
|
+
setAgentState(createInitialChartState$3(datasetId));
|
|
39483
|
+
setApiCallCount(0);
|
|
39484
|
+
setHasTimeoutError(false);
|
|
39485
|
+
appendMessage(new TextMessage({
|
|
39486
|
+
content: messageContent,
|
|
39487
|
+
role: Role.User,
|
|
39488
|
+
}));
|
|
39489
|
+
// Start polling for chart data
|
|
39490
|
+
startLoadingTimeout();
|
|
39491
|
+
}
|
|
39492
|
+
};
|
|
39493
|
+
const handleClearChartState = (event) => {
|
|
39494
|
+
const { widgetId } = event.detail;
|
|
39495
|
+
if (widgetId === widget.id) {
|
|
39496
|
+
setChartState(createInitialChartState$3(datasetId));
|
|
39497
|
+
setAgentState(createInitialChartState$3(datasetId));
|
|
39498
|
+
setApiCallCount(0);
|
|
39499
|
+
setHasTimeoutError(false);
|
|
39500
|
+
}
|
|
39501
|
+
};
|
|
39502
|
+
window.addEventListener('triggerAgent', handleTriggerAgent);
|
|
39503
|
+
window.addEventListener('clearChartState', handleClearChartState);
|
|
39504
|
+
return () => {
|
|
39505
|
+
window.removeEventListener('triggerAgent', handleTriggerAgent);
|
|
39506
|
+
window.removeEventListener('clearChartState', handleClearChartState);
|
|
39507
|
+
};
|
|
39508
|
+
}, [widget.id, appendMessage, setChartState, startLoadingTimeout]);
|
|
39509
|
+
return (jsxRuntimeExports.jsxs("div", { className: cn("flex flex-col h-full"), children: [showHeader && (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between pb-2 border-b", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.Bot, { className: "h-4 w-4" }), jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium", children: widget.title })] }) })), jsxRuntimeExports.jsx("div", { className: "flex-1 h-full", children: (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) &&
|
|
39510
|
+
(!((_h = (_g = (_f = chartState.pie_chart_data) === null || _f === void 0 ? void 0 : _f.data) === null || _g === void 0 ? void 0 : _g.labels) === null || _h === void 0 ? void 0 : _h.length) || !((_l = (_k = (_j = chartState.pie_chart_data) === null || _j === void 0 ? void 0 : _j.data) === null || _k === void 0 ? void 0 : _k.values) === null || _l === void 0 ? void 0 : _l.length))
|
|
39511
|
+
? (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full p-4", children: jsxRuntimeExports.jsx("div", { className: "text-center max-w-md", children: jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-700", children: chartState.agent_message }) }) })) : (jsxRuntimeExports.jsx(PieChartComponent, { pieChartState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_m = widget.config) === null || _m === void 0 ? void 0 : _m.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout, hasWidgetData: !!(((_p = (_o = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _o === void 0 ? void 0 : _o.labels) === null || _p === void 0 ? void 0 : _p.length) && ((_r = (_q = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _q === void 0 ? void 0 : _q.values) === null || _r === void 0 ? void 0 : _r.length)) })) })] }));
|
|
39512
|
+
}
|
|
39513
|
+
function PieChartWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady, widgetIds, datasetId, widgetData, }) {
|
|
39514
|
+
var _a, _b;
|
|
39515
|
+
const styles = getStyleValues$3((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
39516
|
+
const getRuntimeUrl = () => {
|
|
39517
|
+
var _a;
|
|
39518
|
+
const baseUrl = widgetBackendUrl || '';
|
|
39519
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || 'default-agent';
|
|
39520
|
+
return `${baseUrl}/api/copilot/${agentName}`;
|
|
39521
|
+
};
|
|
39522
|
+
return (jsxRuntimeExports.jsx(reactCore.CopilotKit, { runtimeUrl: getRuntimeUrl(), showDevConsole: false, agent: ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.agentName) || "widget_assistant", children: jsxRuntimeExports.jsx(CopilotKitPieChart, { widget: widget, showHeader: showHeader, styles: styles, onResetReady: onResetReady, widgetBackendUrl: widgetBackendUrl, datasetId: datasetId }) }));
|
|
39523
|
+
}
|
|
39524
|
+
|
|
39525
|
+
const CHART_REFRESH_TIMEOUT$2 = 3000;
|
|
39526
|
+
const DEFAULT_COLORS$1 = ["#E4DCB8", "#DAC46C", "#808080", "#582809", "#A3ADD0", "#398E6F", "#AF123D", "#8C99C4", "#5290AC", "#601B07", "#50649D", "#B4A8A0", "#6F2587"];
|
|
39527
|
+
const clearChat$2 = async (widgetBackendUrl, widgetId) => {
|
|
39528
|
+
if (!widgetBackendUrl || !widgetId)
|
|
39529
|
+
return;
|
|
39530
|
+
console.log('clearChat called for widgetId:', widgetId);
|
|
39531
|
+
try {
|
|
39532
|
+
await fetch(`${widgetBackendUrl}/api/clear-chat`, {
|
|
39533
|
+
method: 'POST',
|
|
39534
|
+
headers: {
|
|
39535
|
+
'Content-Type': 'application/json',
|
|
39536
|
+
},
|
|
39537
|
+
body: JSON.stringify({
|
|
39538
|
+
session_id: widgetId,
|
|
39539
|
+
delete_state: true
|
|
39540
|
+
}),
|
|
39541
|
+
});
|
|
39542
|
+
console.log('Dispatching clearChartState event from clearChat for widgetId:', widgetId);
|
|
39543
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
39544
|
+
}
|
|
39545
|
+
catch (error) {
|
|
39546
|
+
console.error('Failed to clear chat:', error);
|
|
39547
|
+
}
|
|
39548
|
+
};
|
|
39549
|
+
const createLoadingComponent$2 = (message = "Loading chart data...") => (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.RefreshCw, { className: "h-6 w-6 animate-spin text-gray-800" }), jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-500", children: message })] }) }));
|
|
39550
|
+
const createInitialChartState$2 = (datasetId, seriesBarChartState) => {
|
|
39551
|
+
return {
|
|
39552
|
+
series_bar_chart_data: {
|
|
39553
|
+
title: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.title) || "",
|
|
39554
|
+
type: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.type) || "series_bar",
|
|
39555
|
+
chart_type: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.chart_type) || "financial",
|
|
39556
|
+
x_axis_title: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.x_axis_title) || "",
|
|
39557
|
+
y_axis_title: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.y_axis_title) || "",
|
|
39558
|
+
orientation: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.orientation) || "vertical",
|
|
39559
|
+
units: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.units) || "",
|
|
39560
|
+
data: {
|
|
39561
|
+
labels: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.labels) || [],
|
|
39562
|
+
series: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.series) || [],
|
|
39563
|
+
total: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.total) || 0,
|
|
39564
|
+
average: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.average) || 0
|
|
39565
|
+
},
|
|
39566
|
+
metadata: {
|
|
39567
|
+
categories: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.categories) || 0,
|
|
39568
|
+
series_count: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.series_count) || 0,
|
|
39569
|
+
highest_category: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.highest_category) || "",
|
|
39570
|
+
highest_value: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.highest_value) || 0,
|
|
39571
|
+
highest_series: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.highest_series) || "",
|
|
39572
|
+
lowest_category: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.lowest_category) || "",
|
|
39573
|
+
lowest_value: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.lowest_value) || 0,
|
|
39574
|
+
lowest_series: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.lowest_series) || "",
|
|
39575
|
+
range: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.range) || 0,
|
|
39576
|
+
series_totals: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.series_totals) || {},
|
|
39577
|
+
series_averages: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.series_averages) || {}
|
|
39578
|
+
}
|
|
39579
|
+
},
|
|
39580
|
+
dataset_id: datasetId || "home_generation_dataset"
|
|
39581
|
+
};
|
|
39582
|
+
};
|
|
39583
|
+
const loadAgentState$2 = async (widgetBackendUrl, threadId, agentName) => {
|
|
39584
|
+
try {
|
|
39585
|
+
const response = await fetch(`${widgetBackendUrl}/api/copilot/${agentName}`, {
|
|
39586
|
+
method: 'POST',
|
|
39587
|
+
headers: {
|
|
39588
|
+
'Content-Type': 'application/json',
|
|
39589
|
+
},
|
|
39590
|
+
body: JSON.stringify({
|
|
39591
|
+
"operationName": "loadAgentState",
|
|
39592
|
+
"query": "query loadAgentState($data: LoadAgentStateInput!) {\n loadAgentState(data: $data) {\n threadId\n threadExists\n state\n messages\n __typename\n }\n}",
|
|
39593
|
+
"variables": {
|
|
39594
|
+
"data": {
|
|
39595
|
+
"agentName": agentName,
|
|
39596
|
+
"threadId": threadId
|
|
39597
|
+
}
|
|
39598
|
+
}
|
|
39599
|
+
}),
|
|
39600
|
+
});
|
|
39601
|
+
if (!response.ok) {
|
|
39602
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
39603
|
+
}
|
|
39604
|
+
const result = await response.json();
|
|
39605
|
+
return result;
|
|
39606
|
+
}
|
|
39607
|
+
catch (error) {
|
|
39608
|
+
console.error('Failed to load agent state:', error);
|
|
39609
|
+
return null;
|
|
39610
|
+
}
|
|
39611
|
+
};
|
|
39612
|
+
const parseAndUpdateChartState$2 = (apiResponse, setChartState) => {
|
|
39613
|
+
var _a, _b;
|
|
39614
|
+
try {
|
|
39615
|
+
if ((_b = (_a = apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.data) === null || _a === void 0 ? void 0 : _a.loadAgentState) === null || _b === void 0 ? void 0 : _b.state) {
|
|
39616
|
+
const stateString = apiResponse.data.loadAgentState.state;
|
|
39617
|
+
const parsedState = JSON.parse(stateString);
|
|
39618
|
+
if (parsedState.state) {
|
|
39619
|
+
const chartData = parsedState.state;
|
|
39620
|
+
setChartState((prevState) => {
|
|
39621
|
+
const newChartState = Object.assign({}, prevState);
|
|
39622
|
+
if (chartData.series_bar_chart_data) {
|
|
39623
|
+
newChartState.series_bar_chart_data = chartData.series_bar_chart_data;
|
|
39624
|
+
}
|
|
39625
|
+
if (chartData.agent_message) {
|
|
39626
|
+
newChartState.agent_message = chartData.agent_message;
|
|
39627
|
+
}
|
|
39628
|
+
return newChartState;
|
|
39629
|
+
});
|
|
39630
|
+
}
|
|
39631
|
+
}
|
|
39632
|
+
}
|
|
39633
|
+
catch (error) {
|
|
39634
|
+
console.error('Failed to parse and update chart state:', error);
|
|
39635
|
+
}
|
|
39636
|
+
};
|
|
39637
|
+
const getStyleValues$2 = (styles = {}) => {
|
|
39638
|
+
const borderRadiusMap = {
|
|
39639
|
+
none: "0px",
|
|
39640
|
+
rounded: "0.375rem",
|
|
39641
|
+
large: "0.5rem",
|
|
39642
|
+
"extra-large": "0.75rem",
|
|
39643
|
+
};
|
|
39644
|
+
const paddingMap = {
|
|
39645
|
+
small: "0.5rem",
|
|
39646
|
+
medium: "1rem",
|
|
39647
|
+
large: "1.5rem",
|
|
39648
|
+
"extra-large": "2rem",
|
|
39649
|
+
};
|
|
39650
|
+
const alignment = styles.alignment || "left";
|
|
39651
|
+
return {
|
|
39652
|
+
backgroundColor: styles.backgroundColor || "#ffffff",
|
|
39653
|
+
borderRadius: borderRadiusMap[styles.borderRadius || "rounded"],
|
|
39654
|
+
padding: paddingMap[styles.padding || "medium"],
|
|
39655
|
+
color: styles.textColor || "#000000",
|
|
39656
|
+
fontSize: styles.fontSize || "14px",
|
|
39657
|
+
textAlign: alignment,
|
|
39658
|
+
};
|
|
39659
|
+
};
|
|
39660
|
+
function SeriesBarChartComponent$1({ orientation, seriesBarChartState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content, hasWidgetData }) {
|
|
39661
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
39662
|
+
const hasCalledRef = React.useRef(false);
|
|
39663
|
+
const labels = ((_b = (_a = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.labels) || [];
|
|
39664
|
+
const series = ((_d = (_c = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.series) || [];
|
|
39665
|
+
const chartTitle = ((_e = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _e === void 0 ? void 0 : _e.title) || "";
|
|
39666
|
+
const units = ((_f = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _f === void 0 ? void 0 : _f.units) || "";
|
|
39667
|
+
const x_axis_title = ((_g = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _g === void 0 ? void 0 : _g.x_axis_title) || "";
|
|
39668
|
+
const y_axis_title = ((_h = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _h === void 0 ? void 0 : _h.y_axis_title) || "";
|
|
39669
|
+
const isEmpty = labels.length === 0 || series.length === 0;
|
|
39670
|
+
const handleRefresh = async () => {
|
|
39671
|
+
if (query) {
|
|
39672
|
+
await clearChat$2(widgetBackendUrl, widgetId);
|
|
39673
|
+
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
39674
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
39675
|
+
appendMessage(new TextMessage({
|
|
39676
|
+
content: `${query} and render data on a series bar chart`,
|
|
39677
|
+
role: Role.User,
|
|
39678
|
+
}));
|
|
39679
|
+
}
|
|
39680
|
+
};
|
|
39681
|
+
React.useEffect(() => {
|
|
39682
|
+
if (isEmpty && query && isFirstLoad && !(seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.agent_message) && !hasCalledRef.current) {
|
|
39683
|
+
hasCalledRef.current = true;
|
|
39684
|
+
handleRefresh();
|
|
39685
|
+
}
|
|
39686
|
+
}, [isEmpty, query, isFirstLoad, seriesBarChartState]);
|
|
39687
|
+
React.useEffect(() => {
|
|
39688
|
+
console.log('SeriesBarChartComponent useEffect - isEmpty:', isEmpty, 'hasMessage:', !!(seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.agent_message), 'hasWidgetData:', hasWidgetData, 'isFirstLoad:', isFirstLoad);
|
|
39689
|
+
if (isEmpty && startLoadingTimeout && !(seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.agent_message)) {
|
|
39690
|
+
console.log('Starting loading timeout from SeriesBarChartComponent useEffect');
|
|
39691
|
+
startLoadingTimeout();
|
|
39692
|
+
}
|
|
39693
|
+
else if (!isEmpty && clearLoadingTimeout) {
|
|
39694
|
+
clearLoadingTimeout();
|
|
39695
|
+
}
|
|
39696
|
+
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout, seriesBarChartState]);
|
|
39697
|
+
const finalColors = React.useMemo(() => {
|
|
39698
|
+
return shuffleColors(DEFAULT_COLORS$1, series.length);
|
|
39699
|
+
}, [series.length]);
|
|
39700
|
+
if (isEmpty) {
|
|
39701
|
+
return createLoadingComponent$2();
|
|
39702
|
+
}
|
|
39703
|
+
const transformedData = {
|
|
39704
|
+
labels: labels,
|
|
39705
|
+
datasets: series.map((seriesItem, index) => ({
|
|
39706
|
+
label: seriesItem.name,
|
|
39707
|
+
data: seriesItem.values,
|
|
39708
|
+
backgroundColor: (seriesItem === null || seriesItem === void 0 ? void 0 : seriesItem.colors) || (seriesItem === null || seriesItem === void 0 ? void 0 : seriesItem.color) || finalColors[index % finalColors.length],
|
|
39709
|
+
})),
|
|
39710
|
+
};
|
|
39711
|
+
return (jsxRuntimeExports.jsx(SeriesChart, { orientation: orientation, title: chartTitle, data: transformedData, units: units, content: content, x_axis_title: x_axis_title, y_axis_title: y_axis_title }));
|
|
39712
|
+
}
|
|
39713
|
+
function CopilotKitSeriesBarChart$1({ widget, showHeader, styles, onResetReady, widgetBackendUrl, datasetId, widgetData, }) {
|
|
39714
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
39715
|
+
const orientation = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.orientation) || "vertical";
|
|
39716
|
+
const isFirstLoad = (_b = widget.config) === null || _b === void 0 ? void 0 : _b.isFirstLoad;
|
|
39717
|
+
const content = (_c = widget.config) === null || _c === void 0 ? void 0 : _c.content;
|
|
39718
|
+
const widget_data = (_d = widget.widget_data) === null || _d === void 0 ? void 0 : _d.series_bar_chart_data;
|
|
39719
|
+
console.log('widget_data===>', widget_data);
|
|
39720
|
+
const { threadId, setThreadId } = reactCore.useCopilotContext();
|
|
39721
|
+
const timeoutRef = React.useRef(null);
|
|
39722
|
+
const [apiCallCount, setApiCallCount] = React.useState(0);
|
|
39723
|
+
const [hasTimeoutError, setHasTimeoutError] = React.useState(false);
|
|
39724
|
+
React.useEffect(() => {
|
|
39725
|
+
setThreadId(widget.id);
|
|
39726
|
+
}, [widget.id, setThreadId]);
|
|
39727
|
+
const { state: agentState, setState: setAgentState } = reactCore.useCoAgent({
|
|
39728
|
+
name: (_e = widget.config) === null || _e === void 0 ? void 0 : _e.agentName,
|
|
39729
|
+
initialState: createInitialChartState$2(datasetId, widget_data),
|
|
39730
|
+
});
|
|
39731
|
+
const [chartState, setChartState] = React.useState(createInitialChartState$2(datasetId, widget_data));
|
|
39732
|
+
const handleLoadingTimeout = React.useCallback(async () => {
|
|
39733
|
+
var _a;
|
|
39734
|
+
if (!widgetBackendUrl || !widget.id || (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) || hasTimeoutError) {
|
|
39735
|
+
console.log('Skipping API call - conditions not met');
|
|
39736
|
+
return;
|
|
39737
|
+
}
|
|
39738
|
+
console.log('Loading timeout triggered for widget:', widget.id, 'API call count:', apiCallCount);
|
|
39739
|
+
if (apiCallCount >= 30) {
|
|
39740
|
+
console.log('API call limit reached for widget:', widget.id);
|
|
39741
|
+
setHasTimeoutError(true);
|
|
39742
|
+
setChartState(prevState => (Object.assign(Object.assign({}, prevState), { agent_message: "Timeout: Unable to load data after multiple attempts. Please try refreshing the widget." })));
|
|
39743
|
+
return;
|
|
39744
|
+
}
|
|
39745
|
+
setApiCallCount(prev => prev + 1);
|
|
39746
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || "adk-construction-project-agent";
|
|
39747
|
+
console.log('Calling loadAgentState API for widget:', widget.id);
|
|
39748
|
+
const apiResponse = await loadAgentState$2(widgetBackendUrl, widget.id, agentName);
|
|
39749
|
+
console.log('API response received:', apiResponse);
|
|
39750
|
+
if (apiResponse && !(chartState === null || chartState === void 0 ? void 0 : chartState.agent_message)) {
|
|
39751
|
+
parseAndUpdateChartState$2(apiResponse, setChartState);
|
|
39752
|
+
}
|
|
39753
|
+
}, [widgetBackendUrl, widget.id, setChartState, (_f = widget.config) === null || _f === void 0 ? void 0 : _f.agentName, chartState, apiCallCount, hasTimeoutError]);
|
|
39754
|
+
const startLoadingTimeout = React.useCallback(() => {
|
|
39755
|
+
if (timeoutRef.current) {
|
|
39756
|
+
clearTimeout(timeoutRef.current);
|
|
39757
|
+
}
|
|
39758
|
+
console.log('Scheduling next API call in 3 seconds');
|
|
39759
|
+
timeoutRef.current = setTimeout(() => {
|
|
39760
|
+
handleLoadingTimeout();
|
|
39761
|
+
}, CHART_REFRESH_TIMEOUT$2);
|
|
39762
|
+
}, [handleLoadingTimeout]);
|
|
39763
|
+
const clearLoadingTimeout = React.useCallback(() => {
|
|
39764
|
+
if (timeoutRef.current) {
|
|
39765
|
+
clearTimeout(timeoutRef.current);
|
|
39766
|
+
timeoutRef.current = null;
|
|
39767
|
+
}
|
|
39768
|
+
}, []);
|
|
39769
|
+
React.useEffect(() => {
|
|
39770
|
+
return () => {
|
|
39771
|
+
if (timeoutRef.current) {
|
|
39772
|
+
clearTimeout(timeoutRef.current);
|
|
39773
|
+
}
|
|
39774
|
+
};
|
|
39775
|
+
}, []);
|
|
39776
|
+
const { appendMessage, reset } = reactCore.useCopilotChat();
|
|
39777
|
+
React.useEffect(() => {
|
|
39778
|
+
if (onResetReady && reset && widget.id) {
|
|
39779
|
+
const wrappedReset = () => {
|
|
39780
|
+
reset();
|
|
39781
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId: widget.id } }));
|
|
39782
|
+
};
|
|
39783
|
+
onResetReady(widget.id, wrappedReset);
|
|
39784
|
+
}
|
|
39785
|
+
}, [reset, widget.id, onResetReady]);
|
|
39786
|
+
React.useEffect(() => {
|
|
39787
|
+
const handleTriggerAgent = (event) => {
|
|
39788
|
+
const { widgetId, query, agentType: eventAgentType, datasetId } = event.detail;
|
|
39789
|
+
if (widgetId === widget.id) {
|
|
39790
|
+
let messageContent = `${query} and render data on a series bar chart`;
|
|
39791
|
+
reset();
|
|
39792
|
+
console.log('triggering to datasetId==>', datasetId);
|
|
39793
|
+
setChartState(createInitialChartState$2(datasetId));
|
|
39794
|
+
setAgentState(createInitialChartState$2(datasetId));
|
|
39795
|
+
setApiCallCount(0);
|
|
39796
|
+
setHasTimeoutError(false);
|
|
39797
|
+
appendMessage(new TextMessage({
|
|
39798
|
+
content: messageContent,
|
|
39799
|
+
role: Role.User,
|
|
39800
|
+
}));
|
|
39801
|
+
// Start polling for chart data
|
|
39802
|
+
startLoadingTimeout();
|
|
39803
|
+
}
|
|
39804
|
+
};
|
|
39805
|
+
const handleClearChartState = (event) => {
|
|
39806
|
+
const { widgetId } = event.detail;
|
|
39807
|
+
if (widgetId === widget.id) {
|
|
39808
|
+
setChartState(createInitialChartState$2(datasetId));
|
|
39809
|
+
setAgentState(createInitialChartState$2(datasetId));
|
|
39810
|
+
setApiCallCount(0);
|
|
39811
|
+
setHasTimeoutError(false);
|
|
39812
|
+
}
|
|
39813
|
+
};
|
|
39814
|
+
window.addEventListener('triggerAgent', handleTriggerAgent);
|
|
39815
|
+
window.addEventListener('clearChartState', handleClearChartState);
|
|
39816
|
+
return () => {
|
|
39817
|
+
window.removeEventListener('triggerAgent', handleTriggerAgent);
|
|
39818
|
+
window.removeEventListener('clearChartState', handleClearChartState);
|
|
39819
|
+
};
|
|
39820
|
+
}, [widget.id, appendMessage, setChartState, startLoadingTimeout]);
|
|
39821
|
+
return (jsxRuntimeExports.jsxs("div", { className: cn("flex flex-col h-full"), children: [showHeader && (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between pb-2 border-b", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.Bot, { className: "h-4 w-4" }), jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium", children: widget.title })] }) })), jsxRuntimeExports.jsx("div", { className: "flex-1 h-full", children: (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) &&
|
|
39822
|
+
(!((_j = (_h = (_g = chartState.series_bar_chart_data) === null || _g === void 0 ? void 0 : _g.data) === null || _h === void 0 ? void 0 : _h.labels) === null || _j === void 0 ? void 0 : _j.length) || !((_m = (_l = (_k = chartState.series_bar_chart_data) === null || _k === void 0 ? void 0 : _k.data) === null || _l === void 0 ? void 0 : _l.series) === null || _m === void 0 ? void 0 : _m.length))
|
|
39823
|
+
? (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full p-4", children: jsxRuntimeExports.jsx("div", { className: "text-center max-w-md", children: jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-700", children: chartState.agent_message }) }) })) : (jsxRuntimeExports.jsx(SeriesBarChartComponent$1, { orientation: orientation, seriesBarChartState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_o = widget.config) === null || _o === void 0 ? void 0 : _o.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout, hasWidgetData: !!(((_q = (_p = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _p === void 0 ? void 0 : _p.labels) === null || _q === void 0 ? void 0 : _q.length) && ((_s = (_r = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _r === void 0 ? void 0 : _r.series) === null || _s === void 0 ? void 0 : _s.length)) })) })] }));
|
|
39824
|
+
}
|
|
39825
|
+
function SeriesBarChartWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady, widgetIds, datasetId, widgetData, }) {
|
|
39826
|
+
var _a, _b;
|
|
39827
|
+
const styles = getStyleValues$2((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
39828
|
+
const getRuntimeUrl = () => {
|
|
39829
|
+
var _a;
|
|
39830
|
+
const baseUrl = widgetBackendUrl || '';
|
|
39831
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || 'default-agent';
|
|
39832
|
+
return `${baseUrl}/api/copilot/${agentName}`;
|
|
39833
|
+
};
|
|
39834
|
+
return (jsxRuntimeExports.jsx(reactCore.CopilotKit, { runtimeUrl: getRuntimeUrl(), showDevConsole: false, agent: ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.agentName) || "widget_assistant", children: jsxRuntimeExports.jsx(CopilotKitSeriesBarChart$1, { widget: widget, showHeader: showHeader, styles: styles, onResetReady: onResetReady, widgetBackendUrl: widgetBackendUrl, datasetId: datasetId }) }));
|
|
39835
|
+
}
|
|
39836
|
+
|
|
39837
|
+
const CHART_REFRESH_TIMEOUT$1 = 3000;
|
|
39838
|
+
const DEFAULT_COLORS = ["#E4DCB8", "#DAC46C", "#808080", "#582809", "#A3ADD0", "#398E6F", "#AF123D", "#8C99C4", "#5290AC", "#601B07", "#50649D", "#B4A8A0", "#6F2587"];
|
|
39839
|
+
const clearChat$1 = async (widgetBackendUrl, widgetId) => {
|
|
39840
|
+
if (!widgetBackendUrl || !widgetId)
|
|
39841
|
+
return;
|
|
39842
|
+
console.log('clearChat called for widgetId:', widgetId);
|
|
39843
|
+
try {
|
|
39844
|
+
await fetch(`${widgetBackendUrl}/api/clear-chat`, {
|
|
39845
|
+
method: 'POST',
|
|
39846
|
+
headers: {
|
|
39847
|
+
'Content-Type': 'application/json',
|
|
39848
|
+
},
|
|
39849
|
+
body: JSON.stringify({
|
|
39850
|
+
session_id: widgetId,
|
|
39851
|
+
delete_state: true
|
|
39852
|
+
}),
|
|
39853
|
+
});
|
|
39854
|
+
console.log('Dispatching clearChartState event from clearChat for widgetId:', widgetId);
|
|
39855
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
39856
|
+
}
|
|
39857
|
+
catch (error) {
|
|
39858
|
+
console.error('Failed to clear chat:', error);
|
|
39859
|
+
}
|
|
39860
|
+
};
|
|
39861
|
+
const createLoadingComponent$1 = (message = "Loading chart data...") => (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.RefreshCw, { className: "h-6 w-6 animate-spin text-gray-800" }), jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-500", children: message })] }) }));
|
|
39862
|
+
const createInitialChartState$1 = (datasetId, seriesBarChartState) => {
|
|
39863
|
+
return {
|
|
39864
|
+
series_bar_chart_data: {
|
|
39865
|
+
title: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.title) || "",
|
|
39866
|
+
type: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.type) || "series_bar",
|
|
39867
|
+
chart_type: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.chart_type) || "financial",
|
|
39868
|
+
x_axis_title: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.x_axis_title) || "",
|
|
39869
|
+
y_axis_title: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.y_axis_title) || "",
|
|
39870
|
+
orientation: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.orientation) || "vertical",
|
|
39871
|
+
units: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.units) || "",
|
|
39872
|
+
data: {
|
|
39873
|
+
labels: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.labels) || [],
|
|
39874
|
+
series: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.series) || [],
|
|
39875
|
+
total: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.total) || 0,
|
|
39876
|
+
average: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.data.average) || 0
|
|
39877
|
+
},
|
|
39878
|
+
metadata: {
|
|
39879
|
+
categories: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.categories) || 0,
|
|
39880
|
+
series_count: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.series_count) || 0,
|
|
39881
|
+
highest_category: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.highest_category) || "",
|
|
39882
|
+
highest_value: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.highest_value) || 0,
|
|
39883
|
+
highest_series: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.highest_series) || "",
|
|
39884
|
+
lowest_category: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.lowest_category) || "",
|
|
39885
|
+
lowest_value: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.lowest_value) || 0,
|
|
39886
|
+
lowest_series: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.lowest_series) || "",
|
|
39887
|
+
range: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.range) || 0,
|
|
39888
|
+
series_totals: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.series_totals) || {},
|
|
39889
|
+
series_averages: (seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.metadata.series_averages) || {}
|
|
39890
|
+
}
|
|
39891
|
+
},
|
|
39892
|
+
dataset_id: datasetId || "home_generation_dataset"
|
|
39893
|
+
};
|
|
39894
|
+
};
|
|
39895
|
+
const loadAgentState$1 = async (widgetBackendUrl, threadId, agentName) => {
|
|
39896
|
+
try {
|
|
39897
|
+
const response = await fetch(`${widgetBackendUrl}/api/copilot/${agentName}`, {
|
|
39898
|
+
method: 'POST',
|
|
39899
|
+
headers: {
|
|
39900
|
+
'Content-Type': 'application/json',
|
|
39901
|
+
},
|
|
39902
|
+
body: JSON.stringify({
|
|
39903
|
+
"operationName": "loadAgentState",
|
|
39904
|
+
"query": "query loadAgentState($data: LoadAgentStateInput!) {\n loadAgentState(data: $data) {\n threadId\n threadExists\n state\n messages\n __typename\n }\n}",
|
|
39905
|
+
"variables": {
|
|
39906
|
+
"data": {
|
|
39907
|
+
"agentName": agentName,
|
|
39908
|
+
"threadId": threadId
|
|
39909
|
+
}
|
|
39910
|
+
}
|
|
39911
|
+
}),
|
|
39912
|
+
});
|
|
39913
|
+
if (!response.ok) {
|
|
39914
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
39915
|
+
}
|
|
39916
|
+
const result = await response.json();
|
|
39917
|
+
return result;
|
|
39918
|
+
}
|
|
39919
|
+
catch (error) {
|
|
39920
|
+
console.error('Failed to load agent state:', error);
|
|
39921
|
+
return null;
|
|
39922
|
+
}
|
|
39923
|
+
};
|
|
39924
|
+
const parseAndUpdateChartState$1 = (apiResponse, setChartState) => {
|
|
39925
|
+
var _a, _b;
|
|
39926
|
+
try {
|
|
39927
|
+
if ((_b = (_a = apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.data) === null || _a === void 0 ? void 0 : _a.loadAgentState) === null || _b === void 0 ? void 0 : _b.state) {
|
|
39928
|
+
const stateString = apiResponse.data.loadAgentState.state;
|
|
39929
|
+
const parsedState = JSON.parse(stateString);
|
|
39930
|
+
if (parsedState.state) {
|
|
39931
|
+
const chartData = parsedState.state;
|
|
39932
|
+
setChartState((prevState) => {
|
|
39933
|
+
const newChartState = Object.assign({}, prevState);
|
|
39934
|
+
if (chartData.series_bar_chart_data) {
|
|
39935
|
+
newChartState.series_bar_chart_data = chartData.series_bar_chart_data;
|
|
39936
|
+
}
|
|
39937
|
+
if (chartData.agent_message) {
|
|
39938
|
+
newChartState.agent_message = chartData.agent_message;
|
|
39939
|
+
}
|
|
39940
|
+
return newChartState;
|
|
39941
|
+
});
|
|
39942
|
+
}
|
|
39943
|
+
}
|
|
39944
|
+
}
|
|
39945
|
+
catch (error) {
|
|
39946
|
+
console.error('Failed to parse and update chart state:', error);
|
|
39947
|
+
}
|
|
39948
|
+
};
|
|
39949
|
+
const getStyleValues$1 = (styles = {}) => {
|
|
39950
|
+
const borderRadiusMap = {
|
|
39951
|
+
none: "0px",
|
|
39952
|
+
rounded: "0.375rem",
|
|
39953
|
+
large: "0.5rem",
|
|
39954
|
+
"extra-large": "0.75rem",
|
|
39955
|
+
};
|
|
39956
|
+
const paddingMap = {
|
|
39957
|
+
small: "0.5rem",
|
|
39958
|
+
medium: "1rem",
|
|
39959
|
+
large: "1.5rem",
|
|
39960
|
+
"extra-large": "2rem",
|
|
39961
|
+
};
|
|
39962
|
+
const alignment = styles.alignment || "left";
|
|
39963
|
+
return {
|
|
39964
|
+
backgroundColor: styles.backgroundColor || "#ffffff",
|
|
39965
|
+
borderRadius: borderRadiusMap[styles.borderRadius || "rounded"],
|
|
39966
|
+
padding: paddingMap[styles.padding || "medium"],
|
|
39967
|
+
color: styles.textColor || "#000000",
|
|
39968
|
+
fontSize: styles.fontSize || "14px",
|
|
39969
|
+
textAlign: alignment,
|
|
39970
|
+
};
|
|
39971
|
+
};
|
|
39972
|
+
function SeriesBarChartComponent({ orientation, seriesBarChartState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content, hasWidgetData }) {
|
|
39973
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
39974
|
+
const hasCalledRef = React.useRef(false);
|
|
39975
|
+
const labels = ((_b = (_a = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.labels) || [];
|
|
39976
|
+
const series = ((_d = (_c = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.series) || [];
|
|
39977
|
+
const chartTitle = ((_e = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _e === void 0 ? void 0 : _e.title) || "";
|
|
39978
|
+
const units = ((_f = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _f === void 0 ? void 0 : _f.units) || "";
|
|
39979
|
+
const x_axis_title = ((_g = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _g === void 0 ? void 0 : _g.x_axis_title) || "";
|
|
39980
|
+
const y_axis_title = ((_h = seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.series_bar_chart_data) === null || _h === void 0 ? void 0 : _h.y_axis_title) || "";
|
|
39981
|
+
const isEmpty = labels.length === 0 || series.length === 0;
|
|
39982
|
+
const handleRefresh = async () => {
|
|
39983
|
+
if (query) {
|
|
39984
|
+
await clearChat$1(widgetBackendUrl, widgetId);
|
|
39985
|
+
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
39986
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
39987
|
+
appendMessage(new TextMessage({
|
|
39988
|
+
content: `${query} and render data on a series bar chart`,
|
|
39989
|
+
role: Role.User,
|
|
39990
|
+
}));
|
|
39991
|
+
}
|
|
39992
|
+
};
|
|
39993
|
+
React.useEffect(() => {
|
|
39994
|
+
if (isEmpty && query && isFirstLoad && !(seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.agent_message) && !hasCalledRef.current) {
|
|
39995
|
+
hasCalledRef.current = true;
|
|
39996
|
+
handleRefresh();
|
|
39997
|
+
}
|
|
39998
|
+
}, [isEmpty, query, isFirstLoad, seriesBarChartState]);
|
|
39999
|
+
React.useEffect(() => {
|
|
40000
|
+
console.log('SeriesBarChartComponent useEffect - isEmpty:', isEmpty, 'hasMessage:', !!(seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.agent_message), 'hasWidgetData:', hasWidgetData, 'isFirstLoad:', isFirstLoad);
|
|
40001
|
+
if (isEmpty && startLoadingTimeout && !(seriesBarChartState === null || seriesBarChartState === void 0 ? void 0 : seriesBarChartState.agent_message)) {
|
|
40002
|
+
console.log('Starting loading timeout from SeriesBarChartComponent useEffect');
|
|
40003
|
+
startLoadingTimeout();
|
|
40004
|
+
}
|
|
40005
|
+
else if (!isEmpty && clearLoadingTimeout) {
|
|
40006
|
+
clearLoadingTimeout();
|
|
40007
|
+
}
|
|
40008
|
+
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout, seriesBarChartState]);
|
|
40009
|
+
const finalColors = React.useMemo(() => {
|
|
40010
|
+
return shuffleColors(DEFAULT_COLORS, series.length);
|
|
40011
|
+
}, [series.length]);
|
|
40012
|
+
if (isEmpty) {
|
|
40013
|
+
return createLoadingComponent$1();
|
|
40014
|
+
}
|
|
40015
|
+
const transformedData = {
|
|
40016
|
+
labels: labels,
|
|
40017
|
+
datasets: series.map((seriesItem, index) => ({
|
|
40018
|
+
label: seriesItem.name,
|
|
40019
|
+
data: seriesItem.values,
|
|
40020
|
+
backgroundColor: (seriesItem === null || seriesItem === void 0 ? void 0 : seriesItem.colors) || (seriesItem === null || seriesItem === void 0 ? void 0 : seriesItem.color) || finalColors[index % finalColors.length],
|
|
40021
|
+
})),
|
|
40022
|
+
};
|
|
40023
|
+
return (jsxRuntimeExports.jsx(SeriesLineChart, { orientation: orientation, title: chartTitle, data: transformedData, units: units, content: content, x_axis_title: x_axis_title, y_axis_title: y_axis_title }));
|
|
40024
|
+
}
|
|
40025
|
+
function CopilotKitSeriesBarChart({ widget, showHeader, styles, onResetReady, widgetBackendUrl, datasetId, widgetData, }) {
|
|
40026
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
40027
|
+
const orientation = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.orientation) || "vertical";
|
|
40028
|
+
const isFirstLoad = (_b = widget.config) === null || _b === void 0 ? void 0 : _b.isFirstLoad;
|
|
40029
|
+
const content = (_c = widget.config) === null || _c === void 0 ? void 0 : _c.content;
|
|
40030
|
+
const widget_data = (_d = widget.widget_data) === null || _d === void 0 ? void 0 : _d.series_bar_chart_data;
|
|
40031
|
+
console.log('widget_data===>', widget_data);
|
|
40032
|
+
const { threadId, setThreadId } = reactCore.useCopilotContext();
|
|
40033
|
+
const timeoutRef = React.useRef(null);
|
|
40034
|
+
const [apiCallCount, setApiCallCount] = React.useState(0);
|
|
40035
|
+
const [hasTimeoutError, setHasTimeoutError] = React.useState(false);
|
|
40036
|
+
React.useEffect(() => {
|
|
40037
|
+
setThreadId(widget.id);
|
|
40038
|
+
}, [widget.id, setThreadId]);
|
|
40039
|
+
const { state: agentState, setState: setAgentState } = reactCore.useCoAgent({
|
|
40040
|
+
name: (_e = widget.config) === null || _e === void 0 ? void 0 : _e.agentName,
|
|
40041
|
+
initialState: createInitialChartState$1(datasetId, widget_data),
|
|
40042
|
+
});
|
|
40043
|
+
const [chartState, setChartState] = React.useState(createInitialChartState$1(datasetId, widget_data));
|
|
40044
|
+
const handleLoadingTimeout = React.useCallback(async () => {
|
|
40045
|
+
var _a;
|
|
40046
|
+
if (!widgetBackendUrl || !widget.id || (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) || hasTimeoutError) {
|
|
40047
|
+
console.log('Skipping API call - conditions not met');
|
|
40048
|
+
return;
|
|
40049
|
+
}
|
|
40050
|
+
console.log('Loading timeout triggered for widget:', widget.id, 'API call count:', apiCallCount);
|
|
40051
|
+
if (apiCallCount >= 30) {
|
|
40052
|
+
console.log('API call limit reached for widget:', widget.id);
|
|
40053
|
+
setHasTimeoutError(true);
|
|
40054
|
+
setChartState(prevState => (Object.assign(Object.assign({}, prevState), { agent_message: "Timeout: Unable to load data after multiple attempts. Please try refreshing the widget." })));
|
|
40055
|
+
return;
|
|
40056
|
+
}
|
|
40057
|
+
setApiCallCount(prev => prev + 1);
|
|
40058
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || "adk-construction-project-agent";
|
|
40059
|
+
console.log('Calling loadAgentState API for widget:', widget.id);
|
|
40060
|
+
const apiResponse = await loadAgentState$1(widgetBackendUrl, widget.id, agentName);
|
|
40061
|
+
console.log('API response received:', apiResponse);
|
|
40062
|
+
if (apiResponse && !(chartState === null || chartState === void 0 ? void 0 : chartState.agent_message)) {
|
|
40063
|
+
parseAndUpdateChartState$1(apiResponse, setChartState);
|
|
40064
|
+
}
|
|
40065
|
+
}, [widgetBackendUrl, widget.id, setChartState, (_f = widget.config) === null || _f === void 0 ? void 0 : _f.agentName, chartState, apiCallCount, hasTimeoutError]);
|
|
40066
|
+
const startLoadingTimeout = React.useCallback(() => {
|
|
40067
|
+
if (timeoutRef.current) {
|
|
40068
|
+
clearTimeout(timeoutRef.current);
|
|
40069
|
+
}
|
|
40070
|
+
console.log('Scheduling next API call in 3 seconds');
|
|
40071
|
+
timeoutRef.current = setTimeout(() => {
|
|
40072
|
+
handleLoadingTimeout();
|
|
40073
|
+
}, CHART_REFRESH_TIMEOUT$1);
|
|
40074
|
+
}, [handleLoadingTimeout]);
|
|
40075
|
+
const clearLoadingTimeout = React.useCallback(() => {
|
|
40076
|
+
if (timeoutRef.current) {
|
|
40077
|
+
clearTimeout(timeoutRef.current);
|
|
40078
|
+
timeoutRef.current = null;
|
|
40079
|
+
}
|
|
40080
|
+
}, []);
|
|
40081
|
+
React.useEffect(() => {
|
|
40082
|
+
return () => {
|
|
40083
|
+
if (timeoutRef.current) {
|
|
40084
|
+
clearTimeout(timeoutRef.current);
|
|
40085
|
+
}
|
|
40086
|
+
};
|
|
40087
|
+
}, []);
|
|
40088
|
+
const { appendMessage, reset } = reactCore.useCopilotChat();
|
|
40089
|
+
React.useEffect(() => {
|
|
40090
|
+
if (onResetReady && reset && widget.id) {
|
|
40091
|
+
const wrappedReset = () => {
|
|
40092
|
+
reset();
|
|
40093
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId: widget.id } }));
|
|
40094
|
+
};
|
|
40095
|
+
onResetReady(widget.id, wrappedReset);
|
|
40096
|
+
}
|
|
40097
|
+
}, [reset, widget.id, onResetReady]);
|
|
40098
|
+
React.useEffect(() => {
|
|
40099
|
+
const handleTriggerAgent = (event) => {
|
|
40100
|
+
const { widgetId, query, agentType: eventAgentType, datasetId } = event.detail;
|
|
40101
|
+
if (widgetId === widget.id) {
|
|
40102
|
+
let messageContent = `${query} and render data on a series bar chart`;
|
|
40103
|
+
reset();
|
|
40104
|
+
console.log('triggering to datasetId==>', datasetId);
|
|
40105
|
+
setChartState(createInitialChartState$1(datasetId));
|
|
40106
|
+
setAgentState(createInitialChartState$1(datasetId));
|
|
40107
|
+
setApiCallCount(0);
|
|
40108
|
+
setHasTimeoutError(false);
|
|
40109
|
+
appendMessage(new TextMessage({
|
|
40110
|
+
content: messageContent,
|
|
40111
|
+
role: Role.User,
|
|
40112
|
+
}));
|
|
40113
|
+
// Start polling for chart data
|
|
40114
|
+
startLoadingTimeout();
|
|
40115
|
+
}
|
|
40116
|
+
};
|
|
40117
|
+
const handleClearChartState = (event) => {
|
|
40118
|
+
const { widgetId } = event.detail;
|
|
40119
|
+
if (widgetId === widget.id) {
|
|
40120
|
+
setChartState(createInitialChartState$1(datasetId));
|
|
40121
|
+
setAgentState(createInitialChartState$1(datasetId));
|
|
40122
|
+
setApiCallCount(0);
|
|
40123
|
+
setHasTimeoutError(false);
|
|
40124
|
+
}
|
|
40125
|
+
};
|
|
40126
|
+
window.addEventListener('triggerAgent', handleTriggerAgent);
|
|
40127
|
+
window.addEventListener('clearChartState', handleClearChartState);
|
|
40128
|
+
return () => {
|
|
40129
|
+
window.removeEventListener('triggerAgent', handleTriggerAgent);
|
|
40130
|
+
window.removeEventListener('clearChartState', handleClearChartState);
|
|
40131
|
+
};
|
|
40132
|
+
}, [widget.id, appendMessage, setChartState, startLoadingTimeout]);
|
|
40133
|
+
return (jsxRuntimeExports.jsxs("div", { className: cn("flex flex-col h-full"), children: [showHeader && (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between pb-2 border-b", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.Bot, { className: "h-4 w-4" }), jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium", children: widget.title })] }) })), jsxRuntimeExports.jsx("div", { className: "flex-1 h-full", children: (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) &&
|
|
40134
|
+
(!((_j = (_h = (_g = chartState.series_bar_chart_data) === null || _g === void 0 ? void 0 : _g.data) === null || _h === void 0 ? void 0 : _h.labels) === null || _j === void 0 ? void 0 : _j.length) || !((_m = (_l = (_k = chartState.series_bar_chart_data) === null || _k === void 0 ? void 0 : _k.data) === null || _l === void 0 ? void 0 : _l.series) === null || _m === void 0 ? void 0 : _m.length))
|
|
40135
|
+
? (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full p-4", children: jsxRuntimeExports.jsx("div", { className: "text-center max-w-md", children: jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-700", children: chartState.agent_message }) }) })) : (jsxRuntimeExports.jsx(SeriesBarChartComponent, { orientation: orientation, seriesBarChartState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_o = widget.config) === null || _o === void 0 ? void 0 : _o.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout, hasWidgetData: !!(((_q = (_p = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _p === void 0 ? void 0 : _p.labels) === null || _q === void 0 ? void 0 : _q.length) && ((_s = (_r = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _r === void 0 ? void 0 : _r.series) === null || _s === void 0 ? void 0 : _s.length)) })) })] }));
|
|
40136
|
+
}
|
|
40137
|
+
function SeriesLineChartWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady, widgetIds, datasetId, widgetData, }) {
|
|
40138
|
+
var _a, _b;
|
|
40139
|
+
const styles = getStyleValues$1((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
40140
|
+
const getRuntimeUrl = () => {
|
|
40141
|
+
var _a;
|
|
40142
|
+
const baseUrl = widgetBackendUrl || '';
|
|
40143
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || 'default-agent';
|
|
40144
|
+
return `${baseUrl}/api/copilot/${agentName}`;
|
|
40145
|
+
};
|
|
40146
|
+
return (jsxRuntimeExports.jsx(reactCore.CopilotKit, { runtimeUrl: getRuntimeUrl(), showDevConsole: false, agent: ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.agentName) || "widget_assistant", children: jsxRuntimeExports.jsx(CopilotKitSeriesBarChart, { widget: widget, showHeader: showHeader, styles: styles, onResetReady: onResetReady, widgetBackendUrl: widgetBackendUrl, datasetId: datasetId }) }));
|
|
40147
|
+
}
|
|
40148
|
+
|
|
40149
|
+
const CHART_REFRESH_TIMEOUT = 3000;
|
|
40150
|
+
const clearChat = async (widgetBackendUrl, widgetId) => {
|
|
40151
|
+
if (!widgetBackendUrl || !widgetId)
|
|
40152
|
+
return;
|
|
40153
|
+
console.log('clearChat called for widgetId:', widgetId);
|
|
40154
|
+
try {
|
|
40155
|
+
await fetch(`${widgetBackendUrl}/api/clear-chat`, {
|
|
40156
|
+
method: 'POST',
|
|
40157
|
+
headers: {
|
|
40158
|
+
'Content-Type': 'application/json',
|
|
40159
|
+
},
|
|
40160
|
+
body: JSON.stringify({
|
|
40161
|
+
session_id: widgetId,
|
|
40162
|
+
delete_state: true
|
|
40163
|
+
}),
|
|
40164
|
+
});
|
|
40165
|
+
console.log('Dispatching clearChartState event from clearChat for widgetId:', widgetId);
|
|
40166
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
40167
|
+
}
|
|
40168
|
+
catch (error) {
|
|
40169
|
+
console.error('Failed to clear chat:', error);
|
|
40170
|
+
}
|
|
40171
|
+
};
|
|
40172
|
+
const createLoadingComponent = (message = "Loading table data...") => (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.RefreshCw, { className: "h-6 w-6 animate-spin text-gray-800" }), jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-500", children: message })] }) }));
|
|
40173
|
+
const createInitialChartState = (datasetId, dataGridState) => {
|
|
40174
|
+
return {
|
|
40175
|
+
matrix_grid_data: {
|
|
40176
|
+
title: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.title) || "",
|
|
40177
|
+
type: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.type) || "data_grid",
|
|
40178
|
+
grid_type: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.grid_type) || "",
|
|
40179
|
+
grouped: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.grouped) || false,
|
|
40180
|
+
data: {
|
|
40181
|
+
headers: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.data.headers) || [],
|
|
40182
|
+
units: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.data.units) || [],
|
|
40183
|
+
rows: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.data.rows) || [],
|
|
40184
|
+
row_count: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.data.row_count) || 0,
|
|
40185
|
+
column_count: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.data.column_count) || 0
|
|
40186
|
+
},
|
|
40187
|
+
metadata: {
|
|
40188
|
+
total_rows: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.metadata.total_rows) || 0,
|
|
40189
|
+
total_columns: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.metadata.total_columns) || 0,
|
|
40190
|
+
numeric_columns: (dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.metadata.numeric_columns) || []
|
|
40191
|
+
}
|
|
40192
|
+
},
|
|
40193
|
+
dataset_id: datasetId || "home_generation_dataset"
|
|
40194
|
+
};
|
|
40195
|
+
};
|
|
40196
|
+
const loadAgentState = async (widgetBackendUrl, threadId, agentName) => {
|
|
40197
|
+
try {
|
|
40198
|
+
const response = await fetch(`${widgetBackendUrl}/api/copilot/${agentName}`, {
|
|
40199
|
+
method: 'POST',
|
|
40200
|
+
headers: {
|
|
40201
|
+
'Content-Type': 'application/json',
|
|
40202
|
+
},
|
|
40203
|
+
body: JSON.stringify({
|
|
40204
|
+
"operationName": "loadAgentState",
|
|
40205
|
+
"query": "query loadAgentState($data: LoadAgentStateInput!) {\n loadAgentState(data: $data) {\n threadId\n threadExists\n state\n messages\n __typename\n }\n}",
|
|
40206
|
+
"variables": {
|
|
40207
|
+
"data": {
|
|
40208
|
+
"agentName": agentName,
|
|
40209
|
+
"threadId": threadId
|
|
40210
|
+
}
|
|
40211
|
+
}
|
|
40212
|
+
}),
|
|
40213
|
+
});
|
|
40214
|
+
if (!response.ok) {
|
|
40215
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
40216
|
+
}
|
|
40217
|
+
const result = await response.json();
|
|
40218
|
+
return result;
|
|
40219
|
+
}
|
|
40220
|
+
catch (error) {
|
|
40221
|
+
console.error('Failed to load agent state:', error);
|
|
40222
|
+
return null;
|
|
40223
|
+
}
|
|
40224
|
+
};
|
|
40225
|
+
const parseAndUpdateChartState = (apiResponse, setChartState) => {
|
|
40226
|
+
var _a, _b;
|
|
40227
|
+
try {
|
|
40228
|
+
if ((_b = (_a = apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.data) === null || _a === void 0 ? void 0 : _a.loadAgentState) === null || _b === void 0 ? void 0 : _b.state) {
|
|
40229
|
+
const stateString = apiResponse.data.loadAgentState.state;
|
|
40230
|
+
const parsedState = JSON.parse(stateString);
|
|
40231
|
+
if (parsedState.state) {
|
|
40232
|
+
const chartData = parsedState.state;
|
|
40233
|
+
setChartState((prevState) => {
|
|
40234
|
+
const newChartState = Object.assign({}, prevState);
|
|
40235
|
+
if (chartData.matrix_grid_data) {
|
|
40236
|
+
newChartState.matrix_grid_data = chartData.matrix_grid_data;
|
|
40237
|
+
}
|
|
40238
|
+
if (chartData.agent_message) {
|
|
40239
|
+
newChartState.agent_message = chartData.agent_message;
|
|
40240
|
+
}
|
|
40241
|
+
return newChartState;
|
|
40242
|
+
});
|
|
40243
|
+
}
|
|
40244
|
+
}
|
|
40245
|
+
}
|
|
40246
|
+
catch (error) {
|
|
40247
|
+
console.error('Failed to parse and update chart state:', error);
|
|
40248
|
+
}
|
|
40249
|
+
};
|
|
40250
|
+
const getStyleValues = (styles = {}) => {
|
|
40251
|
+
const borderRadiusMap = {
|
|
40252
|
+
none: "0px",
|
|
40253
|
+
rounded: "0.375rem",
|
|
40254
|
+
large: "0.5rem",
|
|
40255
|
+
"extra-large": "0.75rem",
|
|
40256
|
+
};
|
|
40257
|
+
const paddingMap = {
|
|
40258
|
+
small: "0.5rem",
|
|
40259
|
+
medium: "1rem",
|
|
40260
|
+
large: "1.5rem",
|
|
40261
|
+
"extra-large": "2rem",
|
|
40262
|
+
};
|
|
40263
|
+
const alignment = styles.alignment || "left";
|
|
40264
|
+
return {
|
|
40265
|
+
backgroundColor: styles.backgroundColor || "#ffffff",
|
|
40266
|
+
borderRadius: borderRadiusMap[styles.borderRadius || "rounded"],
|
|
40267
|
+
padding: paddingMap[styles.padding || "medium"],
|
|
40268
|
+
color: styles.textColor || "#000000",
|
|
40269
|
+
fontSize: styles.fontSize || "14px",
|
|
40270
|
+
textAlign: alignment,
|
|
40271
|
+
};
|
|
40272
|
+
};
|
|
40273
|
+
function DataGridComponent({ dataGridState, styles, appendMessage, query, isFirstLoad, widgetBackendUrl, widgetId, startLoadingTimeout, clearLoadingTimeout, content, hasWidgetData }) {
|
|
40274
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
40275
|
+
const hasCalledRef = React.useRef(false);
|
|
40276
|
+
const columns = ((_b = (_a = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.matrix_grid_data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.headers) || [];
|
|
40277
|
+
const rows = ((_d = (_c = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.matrix_grid_data) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.rows) || [];
|
|
40278
|
+
const gridTitle = ((_e = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.matrix_grid_data) === null || _e === void 0 ? void 0 : _e.title) || "";
|
|
40279
|
+
const units = ((_g = (_f = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.matrix_grid_data) === null || _f === void 0 ? void 0 : _f.data) === null || _g === void 0 ? void 0 : _g.units) || [];
|
|
40280
|
+
const isEmpty = columns.length === 0 || rows.length === 0;
|
|
40281
|
+
const handleRefresh = async () => {
|
|
40282
|
+
if (query) {
|
|
40283
|
+
await clearChat(widgetBackendUrl, widgetId);
|
|
40284
|
+
console.log('Dispatching clearChartState event for widgetId:', widgetId);
|
|
40285
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId } }));
|
|
40286
|
+
appendMessage(new TextMessage({
|
|
40287
|
+
content: `${query} and render data in a data grid table`,
|
|
40288
|
+
role: Role.User,
|
|
40289
|
+
}));
|
|
40290
|
+
}
|
|
40291
|
+
};
|
|
40292
|
+
React.useEffect(() => {
|
|
40293
|
+
if (isEmpty && query && isFirstLoad && !(dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.agent_message) && !hasCalledRef.current) {
|
|
40294
|
+
hasCalledRef.current = true;
|
|
40295
|
+
handleRefresh();
|
|
40296
|
+
}
|
|
40297
|
+
}, [isEmpty, query, isFirstLoad, dataGridState]);
|
|
40298
|
+
React.useEffect(() => {
|
|
40299
|
+
console.log('DataGridComponent useEffect - isEmpty:', isEmpty, 'hasMessage:', !!(dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.agent_message), 'hasWidgetData:', hasWidgetData, 'isFirstLoad:', isFirstLoad);
|
|
40300
|
+
if (isEmpty && startLoadingTimeout && !(dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.agent_message)) {
|
|
40301
|
+
console.log('Starting loading timeout from DataGridComponent useEffect');
|
|
40302
|
+
startLoadingTimeout();
|
|
40303
|
+
}
|
|
40304
|
+
else if (!isEmpty && clearLoadingTimeout) {
|
|
40305
|
+
clearLoadingTimeout();
|
|
40306
|
+
}
|
|
40307
|
+
}, [isEmpty, startLoadingTimeout, clearLoadingTimeout, dataGridState]);
|
|
40308
|
+
if (isEmpty) {
|
|
40309
|
+
return createLoadingComponent();
|
|
40310
|
+
}
|
|
40311
|
+
const transformedData = {
|
|
40312
|
+
columns: columns,
|
|
40313
|
+
units: units,
|
|
40314
|
+
rows: rows,
|
|
40315
|
+
grouped: ((_h = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.matrix_grid_data) === null || _h === void 0 ? void 0 : _h.grouped) || false,
|
|
40316
|
+
grouping: (_j = dataGridState === null || dataGridState === void 0 ? void 0 : dataGridState.matrix_grid_data) === null || _j === void 0 ? void 0 : _j.grouping
|
|
40317
|
+
};
|
|
40318
|
+
return (jsxRuntimeExports.jsx(DataGrid, { title: gridTitle, data: transformedData, className: "" }));
|
|
40319
|
+
}
|
|
40320
|
+
function CopilotKitDataGrid({ widget, showHeader, styles, onResetReady, widgetBackendUrl, datasetId, widgetData, }) {
|
|
40321
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
40322
|
+
const isFirstLoad = (_a = widget.config) === null || _a === void 0 ? void 0 : _a.isFirstLoad;
|
|
40323
|
+
const content = (_b = widget.config) === null || _b === void 0 ? void 0 : _b.content;
|
|
40324
|
+
const widget_data = (_c = widget.widget_data) === null || _c === void 0 ? void 0 : _c.matrix_grid_data;
|
|
40325
|
+
console.log('widget_data===>', widget_data);
|
|
40326
|
+
const { threadId, setThreadId } = reactCore.useCopilotContext();
|
|
40327
|
+
const timeoutRef = React.useRef(null);
|
|
40328
|
+
const [apiCallCount, setApiCallCount] = React.useState(0);
|
|
40329
|
+
const [hasTimeoutError, setHasTimeoutError] = React.useState(false);
|
|
40330
|
+
React.useEffect(() => {
|
|
40331
|
+
setThreadId(widget.id);
|
|
40332
|
+
}, [widget.id, setThreadId]);
|
|
40333
|
+
const { state: agentState, setState: setAgentState } = reactCore.useCoAgent({
|
|
40334
|
+
name: (_d = widget.config) === null || _d === void 0 ? void 0 : _d.agentName,
|
|
40335
|
+
initialState: createInitialChartState(datasetId, widget_data),
|
|
40336
|
+
});
|
|
40337
|
+
const [chartState, setChartState] = React.useState(createInitialChartState(datasetId, widget_data));
|
|
40338
|
+
const handleLoadingTimeout = React.useCallback(async () => {
|
|
40339
|
+
var _a;
|
|
40340
|
+
if (!widgetBackendUrl || !widget.id || (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) || hasTimeoutError) {
|
|
40341
|
+
console.log('Skipping API call - conditions not met');
|
|
40342
|
+
return;
|
|
40343
|
+
}
|
|
40344
|
+
console.log('Loading timeout triggered for widget:', widget.id, 'API call count:', apiCallCount);
|
|
40345
|
+
if (apiCallCount >= 30) {
|
|
40346
|
+
console.log('API call limit reached for widget:', widget.id);
|
|
40347
|
+
setHasTimeoutError(true);
|
|
40348
|
+
setChartState(prevState => (Object.assign(Object.assign({}, prevState), { agent_message: "Timeout: Unable to load data after multiple attempts. Please try refreshing the widget." })));
|
|
40349
|
+
return;
|
|
40350
|
+
}
|
|
40351
|
+
setApiCallCount(prev => prev + 1);
|
|
40352
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || "adk-construction-project-agent";
|
|
40353
|
+
console.log('Calling loadAgentState API for widget:', widget.id);
|
|
40354
|
+
const apiResponse = await loadAgentState(widgetBackendUrl, widget.id, agentName);
|
|
40355
|
+
console.log('API response received:', apiResponse);
|
|
40356
|
+
if (apiResponse && !(chartState === null || chartState === void 0 ? void 0 : chartState.agent_message)) {
|
|
40357
|
+
parseAndUpdateChartState(apiResponse, setChartState);
|
|
40358
|
+
}
|
|
40359
|
+
}, [widgetBackendUrl, widget.id, setChartState, (_e = widget.config) === null || _e === void 0 ? void 0 : _e.agentName, chartState, apiCallCount, hasTimeoutError]);
|
|
40360
|
+
const startLoadingTimeout = React.useCallback(() => {
|
|
40361
|
+
if (timeoutRef.current) {
|
|
40362
|
+
clearTimeout(timeoutRef.current);
|
|
40363
|
+
}
|
|
40364
|
+
console.log('Scheduling next API call in 3 seconds');
|
|
40365
|
+
timeoutRef.current = setTimeout(() => {
|
|
40366
|
+
handleLoadingTimeout();
|
|
40367
|
+
}, CHART_REFRESH_TIMEOUT);
|
|
40368
|
+
}, [handleLoadingTimeout]);
|
|
40369
|
+
const clearLoadingTimeout = React.useCallback(() => {
|
|
40370
|
+
if (timeoutRef.current) {
|
|
40371
|
+
clearTimeout(timeoutRef.current);
|
|
40372
|
+
timeoutRef.current = null;
|
|
40373
|
+
}
|
|
40374
|
+
}, []);
|
|
40375
|
+
React.useEffect(() => {
|
|
40376
|
+
return () => {
|
|
40377
|
+
if (timeoutRef.current) {
|
|
40378
|
+
clearTimeout(timeoutRef.current);
|
|
40379
|
+
}
|
|
40380
|
+
};
|
|
40381
|
+
}, []);
|
|
40382
|
+
const { appendMessage, reset } = reactCore.useCopilotChat();
|
|
40383
|
+
React.useEffect(() => {
|
|
40384
|
+
if (onResetReady && reset && widget.id) {
|
|
40385
|
+
const wrappedReset = () => {
|
|
40386
|
+
reset();
|
|
40387
|
+
window.dispatchEvent(new CustomEvent('clearChartState', { detail: { widgetId: widget.id } }));
|
|
40388
|
+
};
|
|
40389
|
+
onResetReady(widget.id, wrappedReset);
|
|
40390
|
+
}
|
|
40391
|
+
}, [reset, widget.id, onResetReady]);
|
|
40392
|
+
React.useEffect(() => {
|
|
40393
|
+
const handleTriggerAgent = (event) => {
|
|
40394
|
+
const { widgetId, query, agentType: eventAgentType, datasetId } = event.detail;
|
|
40395
|
+
reset();
|
|
40396
|
+
if (widgetId === widget.id) {
|
|
40397
|
+
let messageContent = `${query} and render data in a data grid table`;
|
|
40398
|
+
console.log('triggering to datasetId==>', datasetId);
|
|
40399
|
+
setChartState(createInitialChartState(datasetId));
|
|
40400
|
+
setAgentState(createInitialChartState(datasetId));
|
|
40401
|
+
setApiCallCount(0);
|
|
40402
|
+
setHasTimeoutError(false);
|
|
40403
|
+
appendMessage(new TextMessage({
|
|
40404
|
+
content: messageContent,
|
|
40405
|
+
role: Role.User,
|
|
40406
|
+
}));
|
|
40407
|
+
// Start polling for chart data
|
|
40408
|
+
startLoadingTimeout();
|
|
40409
|
+
}
|
|
40410
|
+
};
|
|
40411
|
+
const handleClearChartState = (event) => {
|
|
40412
|
+
const { widgetId } = event.detail;
|
|
40413
|
+
if (widgetId === widget.id) {
|
|
40414
|
+
setChartState(createInitialChartState(datasetId));
|
|
40415
|
+
setAgentState(createInitialChartState(datasetId));
|
|
40416
|
+
setApiCallCount(0);
|
|
40417
|
+
setHasTimeoutError(false);
|
|
40418
|
+
}
|
|
40419
|
+
};
|
|
40420
|
+
window.addEventListener('triggerAgent', handleTriggerAgent);
|
|
40421
|
+
window.addEventListener('clearChartState', handleClearChartState);
|
|
40422
|
+
return () => {
|
|
40423
|
+
window.removeEventListener('triggerAgent', handleTriggerAgent);
|
|
40424
|
+
window.removeEventListener('clearChartState', handleClearChartState);
|
|
40425
|
+
};
|
|
40426
|
+
}, [widget.id, appendMessage, setChartState, startLoadingTimeout]);
|
|
40427
|
+
return (jsxRuntimeExports.jsxs("div", { className: cn("flex flex-col h-full"), children: [showHeader && (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between pb-2 border-b", children: jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntimeExports.jsx(lucideReact.Bot, { className: "h-4 w-4" }), jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium", children: widget.title })] }) })), jsxRuntimeExports.jsx("div", { className: "flex-1 h-full", children: (chartState === null || chartState === void 0 ? void 0 : chartState.agent_message) &&
|
|
40428
|
+
(!((_h = (_g = (_f = chartState.matrix_grid_data) === null || _f === void 0 ? void 0 : _f.data) === null || _g === void 0 ? void 0 : _g.headers) === null || _h === void 0 ? void 0 : _h.length) || !((_l = (_k = (_j = chartState.matrix_grid_data) === null || _j === void 0 ? void 0 : _j.data) === null || _k === void 0 ? void 0 : _k.rows) === null || _l === void 0 ? void 0 : _l.length))
|
|
40429
|
+
? (jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full p-4", children: jsxRuntimeExports.jsx("div", { className: "text-center max-w-md", children: jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-700", children: chartState.agent_message }) }) })) : (jsxRuntimeExports.jsx(DataGridComponent, { dataGridState: chartState, styles: styles, appendMessage: appendMessage, content: content, query: (_m = widget.config) === null || _m === void 0 ? void 0 : _m.query, isFirstLoad: isFirstLoad, widgetBackendUrl: widgetBackendUrl, widgetId: widget.id, startLoadingTimeout: startLoadingTimeout, clearLoadingTimeout: clearLoadingTimeout, hasWidgetData: !!(((_p = (_o = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _o === void 0 ? void 0 : _o.headers) === null || _p === void 0 ? void 0 : _p.length) && ((_r = (_q = widget_data === null || widget_data === void 0 ? void 0 : widget_data.data) === null || _q === void 0 ? void 0 : _q.rows) === null || _r === void 0 ? void 0 : _r.length)) })) })] }));
|
|
40430
|
+
}
|
|
40431
|
+
function DatagridWidget({ widget, showHeader = true, widgetBackendUrl, onResetReady, widgetIds, datasetId, widgetData, }) {
|
|
40432
|
+
var _a, _b;
|
|
40433
|
+
const styles = getStyleValues((_a = widget.config) === null || _a === void 0 ? void 0 : _a.styles);
|
|
40434
|
+
const getRuntimeUrl = () => {
|
|
40435
|
+
var _a;
|
|
40436
|
+
const baseUrl = widgetBackendUrl || '';
|
|
40437
|
+
const agentName = ((_a = widget.config) === null || _a === void 0 ? void 0 : _a.agentName) || 'default-agent';
|
|
40438
|
+
return `${baseUrl}/api/copilot/${agentName}`;
|
|
40439
|
+
};
|
|
40440
|
+
return (jsxRuntimeExports.jsx(reactCore.CopilotKit, { runtimeUrl: getRuntimeUrl(), showDevConsole: false, agent: ((_b = widget.config) === null || _b === void 0 ? void 0 : _b.agentName) || "widget_assistant", children: jsxRuntimeExports.jsx(CopilotKitDataGrid, { widget: widget, showHeader: showHeader, styles: styles, onResetReady: onResetReady, widgetBackendUrl: widgetBackendUrl, datasetId: datasetId }) }));
|
|
40441
|
+
}
|
|
40442
|
+
|
|
40443
|
+
function WidgetRenderer({ widget, isTemplate = false, onConfigUpdate, widgetBackendUrl, onResetReady, widgetIds, datasetId, }) {
|
|
40444
|
+
const handleConfigUpdate = (config) => {
|
|
40445
|
+
if (onConfigUpdate) {
|
|
40446
|
+
onConfigUpdate(widget.id, config);
|
|
40447
|
+
}
|
|
40448
|
+
};
|
|
40449
|
+
getWidgetStyles(widget);
|
|
40450
|
+
const renderWidget = () => {
|
|
40451
|
+
switch (widget.type) {
|
|
40452
|
+
// Search-related widget cases removed
|
|
40453
|
+
// Available widgets
|
|
40454
|
+
case "header":
|
|
40455
|
+
return jsxRuntimeExports.jsx(HeaderWidget, { widget: widget, showHeader: false });
|
|
40456
|
+
case "footer":
|
|
40457
|
+
return jsxRuntimeExports.jsx(FooterWidget, { widget: widget, showHeader: false });
|
|
40458
|
+
case "text":
|
|
40459
|
+
return jsxRuntimeExports.jsx(TextWidget, { widget: widget, showHeader: false });
|
|
40460
|
+
case "spacer":
|
|
40461
|
+
return jsxRuntimeExports.jsx(SpacerWidget, { widget: widget, showHeader: false });
|
|
40462
|
+
case "divider":
|
|
40463
|
+
return jsxRuntimeExports.jsx(DividerWidget, { widget: widget, showHeader: false });
|
|
40464
|
+
case "facet":
|
|
40465
|
+
return (jsxRuntimeExports.jsx(FacetWidget, { widget: widget, showHeader: false, onConfigUpdate: handleConfigUpdate }));
|
|
40466
|
+
case "chatbot":
|
|
40467
|
+
return jsxRuntimeExports.jsx(ChatbotWidget, { widget: widget, showHeader: false, widgetBackendUrl: widgetBackendUrl, onResetReady: onResetReady, widgetIds: widgetIds, datasetId: datasetId });
|
|
40468
|
+
case "agent":
|
|
40469
|
+
return widget.config.agentType === "Pie Chart Agent" ? (jsxRuntimeExports.jsx(PieChartWidget, { widget: widget, showHeader: false, widgetBackendUrl: widgetBackendUrl, onResetReady: onResetReady, widgetIds: widgetIds, datasetId: datasetId })) : widget.config.agentType === "Series Bar Chart Agent" ? (jsxRuntimeExports.jsx(SeriesBarChartWidget, { widget: widget, showHeader: false, widgetBackendUrl: widgetBackendUrl, onResetReady: onResetReady, widgetIds: widgetIds, datasetId: datasetId })) : widget.config.agentType === "Series Line Chart Agent" ? (jsxRuntimeExports.jsx(SeriesLineChartWidget, { widget: widget, showHeader: false, widgetBackendUrl: widgetBackendUrl, onResetReady: onResetReady, widgetIds: widgetIds, datasetId: datasetId })) : widget.config.agentType === "Data Grid Agent" ? (jsxRuntimeExports.jsx(DatagridWidget, { widget: widget, showHeader: false, widgetBackendUrl: widgetBackendUrl, onResetReady: onResetReady, widgetIds: widgetIds, datasetId: datasetId })) : (jsxRuntimeExports.jsx(AgentWidget, { widget: widget, showHeader: false, widgetBackendUrl: widgetBackendUrl, onResetReady: onResetReady, widgetIds: widgetIds, datasetId: datasetId }));
|
|
39195
40470
|
default:
|
|
39196
40471
|
return (jsxRuntimeExports.jsxs("div", { className: "text-muted-foreground", children: ["Unknown widget type: ", widget.type] }));
|
|
39197
40472
|
}
|