From 06fb6ba744c5ac07eab2bccdd1ebd32a50ebfedf Mon Sep 17 00:00:00 2001 From: FredTsang <979738295@qq.com> Date: Sun, 8 Jun 2025 07:35:19 +0800 Subject: [PATCH] (feat)(chat-sdk) Optimize ChatMsg chart conditions (#2286) --- .../chat-sdk/src/components/ChatMsg/index.tsx | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx b/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx index abf2ac8b4..70d89b906 100644 --- a/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx @@ -52,14 +52,14 @@ const ChatMsg: React.FC = ({ const prefixCls = `${PREFIX_CLS}-chat-msg`; - const updateColummns = (queryColumnsValue: ColumnType[]) => { + const updateColumns = (queryColumnsValue: ColumnType[]) => { const referenceColumn = queryColumnsValue.find(item => item.showType === 'more'); setReferenceColumn(referenceColumn); setColumns(queryColumnsValue.filter(item => item.showType !== 'more')); }; useEffect(() => { - updateColummns(queryColumns); + updateColumns(queryColumns); setDataSource(queryResults); setDefaultMetricField(chatContext?.metrics?.[0]); setActiveMetricField(chatContext?.metrics?.[0]); @@ -115,26 +115,45 @@ const ChatMsg: React.FC = ({ metricFields.length > 0 && categoryField.length <= 1 && !(metricFields.length > 1 && categoryField.length > 0) && - !dataSource.every(item => item[dateField.bizName] === dataSource[0][dateField.bizName]); + dataSource.some(item => item[dateField.bizName] !== dataSource[0][dateField.bizName]); if (isMetricTrend) { return MsgContentTypeEnum.METRIC_TREND; } + /** + * For Pie Chart: + * 1. There should be at least one category field. + * 2. There should be exactly one metric field. + * 3. All metric values should be non-negative. + * 4. limit the number of data points based on device type: + * - For mobile devices, limit to 5 data points. + * - For desktop devices, limit to 10 data points. + */ const isMetricPie = categoryField.length > 0 && metricFields?.length === 1 && (isMobile ? dataSource?.length <= 5 : dataSource?.length <= 10) && - dataSource.every(item => item[metricFields[0].bizName] > 0); + dataSource.every(item => item[metricFields[0].bizName] >= 0); if (isMetricPie) { return MsgContentTypeEnum.METRIC_PIE; } + /** + * For Bar Chart: + * 1. There should be at least one category field. + * 2. There should be exactly one metric field. + * 3. The number of data points should be limited based on device type: + * - For mobile devices, limit to 5 data points. + * - For desktop devices, limit to 50 data points. + * 4. All metric values should be finite numbers. + */ const isMetricBar = categoryField?.length > 0 && metricFields?.length === 1 && - (isMobile ? dataSource?.length <= 5 : dataSource?.length <= 50); + (isMobile ? dataSource?.length <= 5 : dataSource?.length <= 50) && + dataSource.every(item => isFinite(Number(item[metricFields[0].bizName]))); if (isMetricBar) { return MsgContentTypeEnum.METRIC_BAR; @@ -226,9 +245,6 @@ const ChatMsg: React.FC = ({ ); case MsgContentTypeEnum.METRIC_PIE: const categoryField = columns.find(item => item.showType === 'CATEGORY'); - if (!categoryField) { - return null; - } return ( = ({ triggerResize={triggerResize} loading={loading} metricField={metricFields[0]} - categoryField={categoryField} + categoryField={categoryField!} /> ); case MsgContentTypeEnum.MARKDOWN: @@ -266,7 +282,7 @@ const ChatMsg: React.FC = ({ }); setLoading(false); if (res.code === 200) { - updateColummns(res.data?.queryColumns || []); + updateColumns(res.data?.queryColumns || []); setDataSource(res.data?.queryResults || []); } };