fix: fix T-2749 (#3194)
This commit is contained in:
		
							parent
							
								
									f6fdec1226
								
							
						
					
					
						commit
						33779d3da2
					
				| @ -12,6 +12,7 @@ import { | |||||||
|   useCompile, |   useCompile, | ||||||
|   useDesignable, |   useDesignable, | ||||||
|   SchemaSettingsSelectItem, |   SchemaSettingsSelectItem, | ||||||
|  |   CollectionFieldOptions, | ||||||
| } from '@nocobase/client'; | } from '@nocobase/client'; | ||||||
| import { useChartsTranslation } from '../locale'; | import { useChartsTranslation } from '../locale'; | ||||||
| import { Schema, useField, useFieldSchema } from '@formily/react'; | import { Schema, useField, useFieldSchema } from '@formily/react'; | ||||||
| @ -22,6 +23,7 @@ import { getPropsSchemaByComponent, setDefaultValue } from './utils'; | |||||||
| import { ChartFilterVariableInput } from './FilterVariableInput'; | import { ChartFilterVariableInput } from './FilterVariableInput'; | ||||||
| import { useChartFilter, useCollectionJoinFieldTitle } from '../hooks'; | import { useChartFilter, useCollectionJoinFieldTitle } from '../hooks'; | ||||||
| import { Typography } from 'antd'; | import { Typography } from 'antd'; | ||||||
|  | import { getFormulaInterface } from '../utils'; | ||||||
| const { Text } = Typography; | const { Text } = Typography; | ||||||
| 
 | 
 | ||||||
| const EditTitle = () => { | const EditTitle = () => { | ||||||
| @ -76,9 +78,19 @@ const EditOperator = () => { | |||||||
|   const { dn } = useDesignable(); |   const { dn } = useDesignable(); | ||||||
|   const { setField } = useContext(ChartFilterContext); |   const { setField } = useContext(ChartFilterContext); | ||||||
|   const { getInterface, getCollectionJoinField } = useCollectionManager(); |   const { getInterface, getCollectionJoinField } = useCollectionManager(); | ||||||
|  | 
 | ||||||
|  |   const getOperators = (props: CollectionFieldOptions) => { | ||||||
|  |     let fieldInterface = props?.interface; | ||||||
|  |     if (fieldInterface === 'formula') { | ||||||
|  |       fieldInterface = getFormulaInterface(props.dataType) || props.dataType; | ||||||
|  |     } | ||||||
|  |     const interfaceConfig = getInterface(fieldInterface); | ||||||
|  |     const operatorList = interfaceConfig?.filterable?.operators || []; | ||||||
|  |     return { operatorList, interfaceConfig }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   let props = getCollectionJoinField(fieldName); |   let props = getCollectionJoinField(fieldName); | ||||||
|   let interfaceConfig = getInterface(props?.interface); |   let { operatorList, interfaceConfig } = getOperators(props); | ||||||
|   let operatorList = interfaceConfig?.filterable?.operators || []; |  | ||||||
|   if (!operatorList.length) { |   if (!operatorList.length) { | ||||||
|     const names = fieldName.split('.'); |     const names = fieldName.split('.'); | ||||||
|     const name = names.pop(); |     const name = names.pop(); | ||||||
| @ -86,7 +98,9 @@ const EditOperator = () => { | |||||||
|     if (!props) { |     if (!props) { | ||||||
|       return null; |       return null; | ||||||
|     } |     } | ||||||
|     interfaceConfig = getInterface(props.interface); |     const res = getOperators(props); | ||||||
|  |     operatorList = res.operatorList; | ||||||
|  |     interfaceConfig = res.interfaceConfig; | ||||||
|     if (!interfaceConfig) { |     if (!interfaceConfig) { | ||||||
|       return null; |       return null; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -20,11 +20,13 @@ import { useMemoizedFn } from 'ahooks'; | |||||||
| import { FormLayout, FormItem } from '@formily/antd-v5'; | import { FormLayout, FormItem } from '@formily/antd-v5'; | ||||||
| import { uid } from '@formily/shared'; | import { uid } from '@formily/shared'; | ||||||
| import { useChartData, useChartFilter, useChartFilterSourceFields, useFieldComponents } from '../hooks/filter'; | import { useChartData, useChartFilter, useChartFilterSourceFields, useFieldComponents } from '../hooks/filter'; | ||||||
| import { Alert } from 'antd'; | import { Alert, Typography } from 'antd'; | ||||||
| import { getPropsSchemaByComponent } from './utils'; | import { getPropsSchemaByComponent } from './utils'; | ||||||
| import { Field, onFieldValueChange } from '@formily/core'; | import { Field, onFieldValueChange } from '@formily/core'; | ||||||
| import { css, cx } from '@emotion/css'; | import { css, cx } from '@emotion/css'; | ||||||
| import { ConfigProvider } from 'antd'; | import { ConfigProvider } from 'antd'; | ||||||
|  | import { ErrorBoundary } from 'react-error-boundary'; | ||||||
|  | const { Paragraph, Text } = Typography; | ||||||
| 
 | 
 | ||||||
| const FieldComponentProps: React.FC = observer((props) => { | const FieldComponentProps: React.FC = observer((props) => { | ||||||
|   const form = useForm(); |   const form = useForm(); | ||||||
| @ -32,6 +34,16 @@ const FieldComponentProps: React.FC = observer((props) => { | |||||||
|   return schema ? <SchemaComponent schema={schema} {...props} /> : null; |   return schema ? <SchemaComponent schema={schema} {...props} /> : null; | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | const ErrorFallback = ({ error }) => { | ||||||
|  |   return ( | ||||||
|  |     <Paragraph copyable> | ||||||
|  |       <Text type="danger" style={{ whiteSpace: 'pre-line', textAlign: 'center', padding: '5px' }}> | ||||||
|  |         {error.message} | ||||||
|  |       </Text> | ||||||
|  |     </Paragraph> | ||||||
|  |   ); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| export const ChartFilterFormItem = observer( | export const ChartFilterFormItem = observer( | ||||||
|   (props: any) => { |   (props: any) => { | ||||||
|     const field = useField<Field>(); |     const field = useField<Field>(); | ||||||
| @ -68,7 +80,9 @@ export const ChartFilterFormItem = observer( | |||||||
|     return ( |     return ( | ||||||
|       <ACLCollectionFieldProvider> |       <ACLCollectionFieldProvider> | ||||||
|         <BlockItem className={'nb-form-item'}> |         <BlockItem className={'nb-form-item'}> | ||||||
|  |           <ErrorBoundary onError={(err) => console.log(err)} FallbackComponent={ErrorFallback}> | ||||||
|             <FormItem className={className} {...props} extra={extra} /> |             <FormItem className={className} {...props} extra={extra} /> | ||||||
|  |           </ErrorBoundary> | ||||||
|         </BlockItem> |         </BlockItem> | ||||||
|       </ACLCollectionFieldProvider> |       </ACLCollectionFieldProvider> | ||||||
|     ); |     ); | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ import { ChartFilterContext } from '../filter/FilterProvider'; | |||||||
| import { useMemoizedFn } from 'ahooks'; | import { useMemoizedFn } from 'ahooks'; | ||||||
| import { parse } from '@nocobase/utils/client'; | import { parse } from '@nocobase/utils/client'; | ||||||
| import lodash from 'lodash'; | import lodash from 'lodash'; | ||||||
| import { getValuesByPath } from '../utils'; | import { getFormulaComponent, getValuesByPath } from '../utils'; | ||||||
| import deepmerge from 'deepmerge'; | import deepmerge from 'deepmerge'; | ||||||
| 
 | 
 | ||||||
| export const useCustomFieldInterface = () => { | export const useCustomFieldInterface = () => { | ||||||
| @ -88,9 +88,10 @@ export const useChartFilter = () => { | |||||||
|         }, |         }, | ||||||
|       }; |       }; | ||||||
|       if (field.interface === 'formula') { |       if (field.interface === 'formula') { | ||||||
|  |         const component = getFormulaComponent(field.dataType) || 'Input'; | ||||||
|         schema = { |         schema = { | ||||||
|           ...schema, |           ...schema, | ||||||
|           'x-component': 'InputNumber', |           'x-component': component, | ||||||
|         }; |         }; | ||||||
|       } |       } | ||||||
|       if (['oho', 'o2m'].includes(field.interface)) { |       if (['oho', 'o2m'].includes(field.interface)) { | ||||||
|  | |||||||
| @ -133,3 +133,27 @@ export const getValuesByPath = (values: any, path: string) => { | |||||||
|   } |   } | ||||||
|   return result; |   return result; | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | export const getFormulaComponent = (type: string) => { | ||||||
|  |   return { | ||||||
|  |     boolean: 'Checkbox', | ||||||
|  |     integer: 'InputNumber', | ||||||
|  |     bigInt: 'InputNumber', | ||||||
|  |     double: 'InputNumber', | ||||||
|  |     decimal: 'InputNumber', | ||||||
|  |     date: 'DatePicker', | ||||||
|  |     string: 'Input', | ||||||
|  |   }[type]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export const getFormulaInterface = (type: string) => { | ||||||
|  |   return { | ||||||
|  |     boolean: 'boolean', | ||||||
|  |     integer: 'integer', | ||||||
|  |     bigInt: 'integer', | ||||||
|  |     double: 'number', | ||||||
|  |     decimal: 'number', | ||||||
|  |     date: 'datetime', | ||||||
|  |     string: 'input', | ||||||
|  |   }[type]; | ||||||
|  | }; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user