@@ -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