Skip to content

Commit 06fb6ba

Browse files
authored
(feat)(chat-sdk) Optimize ChatMsg chart conditions (#2286)
1 parent 9ffdba9 commit 06fb6ba

File tree

1 file changed

+26
-10
lines changed
  • webapp/packages/chat-sdk/src/components/ChatMsg

1 file changed

+26
-10
lines changed

webapp/packages/chat-sdk/src/components/ChatMsg/index.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ const ChatMsg: React.FC<Props> = ({
5252

5353
const prefixCls = `${PREFIX_CLS}-chat-msg`;
5454

55-
const updateColummns = (queryColumnsValue: ColumnType[]) => {
55+
const updateColumns = (queryColumnsValue: ColumnType[]) => {
5656
const referenceColumn = queryColumnsValue.find(item => item.showType === 'more');
5757
setReferenceColumn(referenceColumn);
5858
setColumns(queryColumnsValue.filter(item => item.showType !== 'more'));
5959
};
6060

6161
useEffect(() => {
62-
updateColummns(queryColumns);
62+
updateColumns(queryColumns);
6363
setDataSource(queryResults);
6464
setDefaultMetricField(chatContext?.metrics?.[0]);
6565
setActiveMetricField(chatContext?.metrics?.[0]);
@@ -115,26 +115,45 @@ const ChatMsg: React.FC<Props> = ({
115115
metricFields.length > 0 &&
116116
categoryField.length <= 1 &&
117117
!(metricFields.length > 1 && categoryField.length > 0) &&
118-
!dataSource.every(item => item[dateField.bizName] === dataSource[0][dateField.bizName]);
118+
dataSource.some(item => item[dateField.bizName] !== dataSource[0][dateField.bizName]);
119119

120120
if (isMetricTrend) {
121121
return MsgContentTypeEnum.METRIC_TREND;
122122
}
123123

124+
/**
125+
* For Pie Chart:
126+
* 1. There should be at least one category field.
127+
* 2. There should be exactly one metric field.
128+
* 3. All metric values should be non-negative.
129+
* 4. limit the number of data points based on device type:
130+
* - For mobile devices, limit to 5 data points.
131+
* - For desktop devices, limit to 10 data points.
132+
*/
124133
const isMetricPie =
125134
categoryField.length > 0 &&
126135
metricFields?.length === 1 &&
127136
(isMobile ? dataSource?.length <= 5 : dataSource?.length <= 10) &&
128-
dataSource.every(item => item[metricFields[0].bizName] > 0);
137+
dataSource.every(item => item[metricFields[0].bizName] >= 0);
129138

130139
if (isMetricPie) {
131140
return MsgContentTypeEnum.METRIC_PIE;
132141
}
133142

143+
/**
144+
* For Bar Chart:
145+
* 1. There should be at least one category field.
146+
* 2. There should be exactly one metric field.
147+
* 3. The number of data points should be limited based on device type:
148+
* - For mobile devices, limit to 5 data points.
149+
* - For desktop devices, limit to 50 data points.
150+
* 4. All metric values should be finite numbers.
151+
*/
134152
const isMetricBar =
135153
categoryField?.length > 0 &&
136154
metricFields?.length === 1 &&
137-
(isMobile ? dataSource?.length <= 5 : dataSource?.length <= 50);
155+
(isMobile ? dataSource?.length <= 5 : dataSource?.length <= 50) &&
156+
dataSource.every(item => isFinite(Number(item[metricFields[0].bizName])));
138157

139158
if (isMetricBar) {
140159
return MsgContentTypeEnum.METRIC_BAR;
@@ -226,17 +245,14 @@ const ChatMsg: React.FC<Props> = ({
226245
);
227246
case MsgContentTypeEnum.METRIC_PIE:
228247
const categoryField = columns.find(item => item.showType === 'CATEGORY');
229-
if (!categoryField) {
230-
return null;
231-
}
232248
return (
233249
<Pie
234250
data={{ ...data, queryColumns: columns, queryResults: dataSource }}
235251
question={question}
236252
triggerResize={triggerResize}
237253
loading={loading}
238254
metricField={metricFields[0]}
239-
categoryField={categoryField}
255+
categoryField={categoryField!}
240256
/>
241257
);
242258
case MsgContentTypeEnum.MARKDOWN:
@@ -266,7 +282,7 @@ const ChatMsg: React.FC<Props> = ({
266282
});
267283
setLoading(false);
268284
if (res.code === 200) {
269-
updateColummns(res.data?.queryColumns || []);
285+
updateColumns(res.data?.queryColumns || []);
270286
setDataSource(res.data?.queryResults || []);
271287
}
272288
};

0 commit comments

Comments
 (0)