fix: fix T-2749 (#3194)

This commit is contained in:
YANG QIA 2023-12-15 11:33:08 +08:00 committed by GitHub
parent f6fdec1226
commit 33779d3da2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 7 deletions

View File

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

View File

@ -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'}>
<FormItem className={className} {...props} extra={extra} /> <ErrorBoundary onError={(err) => console.log(err)} FallbackComponent={ErrorFallback}>
<FormItem className={className} {...props} extra={extra} />
</ErrorBoundary>
</BlockItem> </BlockItem>
</ACLCollectionFieldProvider> </ACLCollectionFieldProvider>
); );

View File

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

View File

@ -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];
};