diff --git a/packages/form-render/src/render-core/FieldItem/main.tsx b/packages/form-render/src/render-core/FieldItem/main.tsx index 574f67b94..56f6747e7 100644 --- a/packages/form-render/src/render-core/FieldItem/main.tsx +++ b/packages/form-render/src/render-core/FieldItem/main.tsx @@ -174,7 +174,6 @@ export default (props: any) => { const initialValue = schema.default ?? schema.defaultValue; const classRest = { 'fr-hide-label': label === 'fr-hide-label', 'fr-inline-field': inlineSelf, 'fr-field-visibility': !visible, [schema.className] : !! schema.className }; - debugger; const formItem = ( { const { schema, rootPath } = props; const { items, ...listSchema } = schema || {}; - const store = useContext(FRContext); + const store:any = useContext(FRContext); const { schema: formSchema } = store.getState(); - const configCtx = useContext(ConfigContext); + const configCtx: any = useContext(ConfigContext); const mustacheDisabled = configCtx?.globalConfig?.mustacheDisabled; const dependencies = schema?.dependencies; diff --git a/packages/form-render/src/render-core/FieldList/main.tsx b/packages/form-render/src/render-core/FieldList/main.tsx index 5268c9117..96cc3ff6e 100644 --- a/packages/form-render/src/render-core/FieldList/main.tsx +++ b/packages/form-render/src/render-core/FieldList/main.tsx @@ -12,7 +12,7 @@ export default (props: any) => { const [_, setListData] = useState([]); const { configContext } = props; - const store = useContext(FRContext); + const store: any = useContext(FRContext); const formCtx: any = useStore(store, (state: any) => state.context); const upperCtx: any = useContext(UpperContext); diff --git a/packages/form-render/src/utils/index.ts b/packages/form-render/src/utils/index.ts index f8ff0dd67..d00ac8a84 100644 --- a/packages/form-render/src/utils/index.ts +++ b/packages/form-render/src/utils/index.ts @@ -92,8 +92,6 @@ export function isCheckBoxType(schema: any, readOnly: boolean) { } } - - export const translation = (configCtx: any) => (key: string) => { const locale = configCtx?.locale.FormRender; return locale[key]; diff --git a/packages/form-render/src/widgets/listDrawer/drawerForm.tsx b/packages/form-render/src/widgets/listDrawer/drawerForm.tsx index 59baba107..3373ec151 100644 --- a/packages/form-render/src/widgets/listDrawer/drawerForm.tsx +++ b/packages/form-render/src/widgets/listDrawer/drawerForm.tsx @@ -1,30 +1,16 @@ import React, { useContext } from 'react'; import { Button, Drawer, Space, ConfigProvider } from 'antd'; -import FRender, { useForm } from '../../index'; import { translation } from '../utils'; const DrawerForm = (props: any) => { - const { schema, widgets, onClose, data, configContext } = props; + const { children, onConfirm, onClose } = props; - const form: any = useForm(); const configCtx = useContext(ConfigProvider.ConfigContext); const t = translation(configCtx); - const handleFinish = (data: any) => { - onClose(data); - }; - - const handleClose = () => { - onClose(); - }; - - let drawerProps: any = { - open: true - }; + let drawerProps: any = { open: true }; if ((window as any).antdVersion === 'v4') { - drawerProps = { - visible: true - }; + drawerProps = { visible: true }; } return ( @@ -32,26 +18,17 @@ const DrawerForm = (props: any) => { {...drawerProps} width={600} title={t('operate')} - onClose={handleClose} + onClose={onClose} extra={ - - + } > - + {children} ); } diff --git a/packages/form-render/src/widgets/listDrawer/index.tsx b/packages/form-render/src/widgets/listDrawer/index.tsx index cd1b23f50..4ef739543 100644 --- a/packages/form-render/src/widgets/listDrawer/index.tsx +++ b/packages/form-render/src/widgets/listDrawer/index.tsx @@ -2,13 +2,12 @@ -import React, { useState, useRef, useContext } from 'react'; -import { Space, Table, Form, Button, Popconfirm, ConfigProvider, Tooltip, Divider } from 'antd'; +import React, { useState, useRef } from 'react'; +import { Space, Table, Form, Button, Popconfirm, Tooltip, Divider } from 'antd'; import { ArrowDownOutlined, ArrowUpOutlined, PlusOutlined, InfoCircleOutlined, CloseOutlined, CopyOutlined } from '@ant-design/icons'; import type { FormListFieldData, FormListOperation, TableColumnsType } from 'antd'; import FormDrawer from './drawerForm'; import FButton from '../components/FButton'; -import { translation } from '../utils'; import './index.less'; interface Props { @@ -61,6 +60,7 @@ const TableList: React.FC = (props: any) => { hideAdd, hideEdit, + operation, addItem, copyItem, moveItem, @@ -69,17 +69,11 @@ const TableList: React.FC = (props: any) => { } = props; const { colHeaderText, ...otherActionColumnProps } = actionColumnProps; - - - const configCtx = useContext(ConfigProvider.ConfigContext); - const t = translation(configCtx); - const paginationConfig = { size: 'small', hideOnSinglePage: true, ...pagination, }; - const columnSchema = schema?.items?.properties || {}; const [visible, setVisible] = useState(false); @@ -92,23 +86,23 @@ const TableList: React.FC = (props: any) => { }; const handleAdd = () => { - indexRef.current = -1; setVisible(true); + addItem(); }; - const handleDrawerClose = (data: any) => { - setVisible(false); - setItemData(null); - if (!data) { - return; - } - - if (indexRef.current === -1) { - addItem(data); + const handleRepeal = () => { + if (!indexRef.current && indexRef.current !== 0) { + operation.remove(fields.length-1); } else { - form.setFieldValue([...rootPath, indexRef.current], data); + form.setFieldValue([...rootPath, indexRef.current], itemData); } - indexRef.current === null; + hanldeConfirm(); + }; + + const hanldeConfirm = () => { + setItemData(null); + setVisible(false); + indexRef.current = null; }; const columns: TableColumnsType = Object.keys(columnSchema).map(dataIndex => { @@ -228,8 +222,11 @@ const TableList: React.FC = (props: any) => { data={itemData} widgets={widgets} configContext={configContext} - onClose={handleDrawerClose} - /> + onClose={handleRepeal} + onConfirm={hanldeConfirm} + > + {renderCore({ schema: schema.items, parentPath: [fields.length - 1], rootPath: [...rootPath, fields.length - 1] })} + )} ); diff --git a/packages/form-render/src/widgets/utils/hooks.ts b/packages/form-render/src/widgets/utils/hooks.ts new file mode 100644 index 000000000..d7c10ccb5 --- /dev/null +++ b/packages/form-render/src/widgets/utils/hooks.ts @@ -0,0 +1,17 @@ +import { message } from 'antd'; +import { useReducer, useRef, useEffect, useState } from 'react'; + +export function usePrevious(value: any) { + const ref = useRef(); + useEffect(() => { + ref.current = value; + }, [value]); + return ref.current; +} + +// 类似于class component的setState +export const useSet = (initState: any) => { + return useReducer((state: any, newState: any) => { + return { ...state, ...newState }; + }, initState); +}; \ No newline at end of file diff --git a/packages/form-render/src/withProvider.tsx b/packages/form-render/src/withProvider.tsx index 09b651be4..cdfabaf5c 100644 --- a/packages/form-render/src/withProvider.tsx +++ b/packages/form-render/src/withProvider.tsx @@ -59,7 +59,7 @@ export default function withProvider(Element: React.ComponentType, default const langPack: any = { ...antdLocale, - "FormRender": locales[locale], + 'FormRender': locales[locale], ...configProvider?.locale };