Skip to content

Commit 0ade79a

Browse files
JackWang032jialan
andauthored
feat: support form layout (#8)
* feat(core): support form item layout feature via row and col * docs(core): add docs for formItemLayout * feat(playground): add span in editor field completion * feat(core): support all row and col props fo form layout * docs(core): update docs for row and col props * feat(playground): update colProps --------- Co-authored-by: jialan <jialan@dtstack.com>
1 parent 11753c4 commit 0ade79a

File tree

8 files changed

+74
-43
lines changed

8 files changed

+74
-43
lines changed

docs/FormRenderer.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
- `jsonConfig` 解析后的表单 json 配置,详情看[这里](./JsonConfig.md)
1010
- `formServicePool` FormService 的集合,详情看[这里](./FormService.md)
11+
- `rowProps` 用于表单的排版布局,与 [ant-design#Row](https://ant.design/components/grid-cn#row) 一致
12+
- `defaultColSpan` 用于表单项的默认占用栅格大小, 默认为`24`
1113
- `ruleMap` 自定义的表单校验器的集合
1214
- `docsMap` 自定义的 tooltip 的集合
1315
- `getWidgets` 接收表单自定义组件的名称,返回表单自定义组件,详情看[这里](./Widget.md)

docs/FormService.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
FormService 的基本格式如下所示
1010

1111
```js
12-
function service1(formData, extraData, trigger, args) {
12+
function service1({ formData, extraData, trigger, args }) {
1313
return new Promise((resolve) => {
1414
resolve(data);
1515
});
@@ -116,4 +116,4 @@ FormRenderer 内部维护了一个存储外部数据的容器-`extraData` ,`ex
116116
- `onFocus` 当前表单项组件触发 focus 事件时
117117
- `onSearch` 当前表单项组件触发 search 事件时
118118

119-
除了 `onMount` 外,当 FormService 被触发时 trigger 对应事件的回调函数的参数,会被作为 FormService 的第四个参数`args`)传给 FormService
119+
除了 `onMount` 外,当 FormService 被触发时 trigger 对应事件的回调函数的参数,会被作为 FormService 参数`args`)传给 FormService

docs/JsonConfig.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,5 @@ JsonConfig 用于描述表单的渲染,它的一级结构如下所示
4646
- `labelAlign` 同 ant-design FormItem 的 labelAlign
4747
- `colon` 同 ant-design FormItem 的 colon
4848
- `extra` 同 ant-design FormItem 的 extra
49-
- `noStyle` 同 ant-design FormItem 的 noStyle
49+
- `noStyle` 同 ant-design FormItem 的 noStyle,
50+
- `colProps` 用于表单项排版布局,同 ant-design Col [ant-design#Col](https://ant.design/components/grid-cn#col)

packages/core/src/components/formItemWrapper/index.tsx

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useContext, useEffect, useMemo } from 'react';
2-
import { Form, FormInstance } from 'antd';
2+
import { Form, FormInstance, Col } from 'antd';
33
import { debounce } from '../helpers';
44
import ExtraContext from '../../extraDataContext';
55
import internalWidgets from '../internalWidgets';
@@ -18,6 +18,7 @@ const { Item: FormItem, useFormInstance } = Form;
1818
export type GetWidgets = (widget: string) => React.ComponentType<any>;
1919
export interface FormItemWrapperProps {
2020
formItemMeta: FieldItemMetaType;
21+
defaultSpan?: number;
2122
getWidgets: GetWidgets;
2223
publishServiceEvent: PubSubCenter['publishServiceEvent'];
2324
onDerivedValueChange: (fieldName: string, value: any) => any;
@@ -28,6 +29,7 @@ export interface FormItemWrapperProps {
2829
const FormItemWrapper: React.FC<FormItemWrapperProps> = (props) => {
2930
const {
3031
formItemMeta,
32+
defaultSpan,
3133
getWidgets,
3234
publishServiceEvent,
3335
valueGetter,
@@ -50,6 +52,7 @@ const FormItemWrapper: React.FC<FormItemWrapperProps> = (props) => {
5052
trigger,
5153
valueDerived,
5254
servicesTriggers,
55+
colProps,
5356
destroy,
5457
required,
5558
noStyle,
@@ -164,29 +167,38 @@ const FormItemWrapper: React.FC<FormItemWrapperProps> = (props) => {
164167
onFocus && (serviceProps.onFocus = onFocus);
165168
onSearch && (serviceProps.onSearch = onSearch);
166169
return (
167-
<FormItem
168-
name={fieldName}
169-
initialValue={initialValue}
170-
tooltip={tooltip}
171-
label={valueGetter(label)}
172-
rules={valueGetter(rules)}
173-
hidden={valueGetter(hidden)}
174-
colon={colon}
175-
extra={extra}
176-
labelAlign={labelAlign}
177-
trigger={trigger}
178-
valuePropName={valuePropName}
179-
{...(required === undefined
180-
? {}
181-
: { required: valueGetter(required) })}
182-
noStyle={noStyle}
183-
validateFirst
170+
<Col
171+
{...colProps}
172+
span={
173+
valueGetter(hidden)
174+
? 0
175+
: colProps?.span ?? defaultSpan
176+
}
184177
>
185-
<Widget
186-
{...widgetPropsGetter(widgetProps)}
187-
{...serviceProps}
188-
/>
189-
</FormItem>
178+
<FormItem
179+
name={fieldName}
180+
initialValue={initialValue}
181+
tooltip={tooltip}
182+
label={valueGetter(label)}
183+
rules={valueGetter(rules)}
184+
hidden={valueGetter(hidden)}
185+
colon={colon}
186+
extra={extra}
187+
labelAlign={labelAlign}
188+
trigger={trigger}
189+
valuePropName={valuePropName}
190+
{...(required === undefined
191+
? {}
192+
: { required: valueGetter(required) })}
193+
noStyle={noStyle}
194+
validateFirst
195+
>
196+
<Widget
197+
{...widgetPropsGetter(widgetProps)}
198+
{...serviceProps}
199+
/>
200+
</FormItem>
201+
</Col>
190202
);
191203
}}
192204
</FormItem>

packages/core/src/components/formRenderer/index.tsx

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import React, {
55
useImperativeHandle,
66
useLayoutEffect,
77
} from 'react';
8-
import { Form } from 'antd';
8+
import { Form, Row } from 'antd';
9+
import type { RowProps } from 'antd';
910
import type { FormInstance, FormProps } from 'antd/es/form/Form';
1011
import type {
1112
FormServicePoolType,
@@ -27,6 +28,8 @@ const { useForm } = Form;
2728
export interface FormRendererProps extends FormProps {
2829
jsonConfig: JsonConfigType;
2930
formServicePool?: FormServicePoolType;
31+
rowProps?: RowProps;
32+
defaultColSpan?: number;
3033
ruleMap?: FormItemRuleMapType;
3134
docsMap?: DocsMapType;
3235
getWidgets?: GetWidgets;
@@ -53,6 +56,8 @@ const FormRenderer: React.ForwardRefRenderFunction<
5356
const {
5457
jsonConfig,
5558
formServicePool,
59+
rowProps,
60+
defaultColSpan = 24,
5661
defaultExtraData,
5762
ruleMap,
5863
getWidgets,
@@ -198,21 +203,24 @@ const FormRenderer: React.ForwardRefRenderFunction<
198203
{typeof header === 'function'
199204
? header?.(form, extraDataRef.current)
200205
: header}
201-
{formItemsMeta.map((formItemMeta) => {
202-
return (
203-
<FormItemWrapper
204-
debounceSearch={debounceSearch}
205-
valueGetter={valueGetter}
206-
getWidgets={getWidgets}
207-
key={formItemMeta.fieldName}
208-
formItemMeta={formItemMeta}
209-
onDerivedValueChange={onDerivedValueChange}
210-
publishServiceEvent={
211-
pubSubCenterRef.current.publishServiceEvent
212-
}
213-
/>
214-
);
215-
})}
206+
<Row style={{ width: '100%' }} {...rowProps}>
207+
{formItemsMeta.map((formItemMeta) => {
208+
return (
209+
<FormItemWrapper
210+
debounceSearch={debounceSearch}
211+
valueGetter={valueGetter}
212+
getWidgets={getWidgets}
213+
defaultSpan={defaultColSpan}
214+
key={formItemMeta.fieldName}
215+
formItemMeta={formItemMeta}
216+
onDerivedValueChange={onDerivedValueChange}
217+
publishServiceEvent={
218+
pubSubCenterRef.current.publishServiceEvent
219+
}
220+
/>
221+
);
222+
})}
223+
</Row>
216224
{typeof footer === 'function'
217225
? footer?.(form, extraDataRef.current)
218226
: footer}

packages/core/src/type.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import type { FormItemProps } from 'antd';
2+
import type { ColProps, FormItemProps } from 'antd';
33
import type { TransformedFnType } from './expressionParser/fnExpressionTransformer';
44

55
/**
@@ -161,6 +161,7 @@ export interface JsonConfigFieldType {
161161
valueDerived?: FunctionExprType;
162162
required?: FunctionExprType | boolean;
163163
noStyle?: boolean;
164+
colProps?: ColProps;
164165
}
165166

166167
/**
@@ -200,4 +201,5 @@ export interface FieldItemMetaType {
200201
valueDerived?: TransformedFnType;
201202
servicesTriggers?: ServiceTriggerKind[];
202203
noStyle?: boolean;
204+
colProps?: ColProps;
203205
}

packages/playground/src/components/editor/languages.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ export const fieldCompletionsCreator: (
9090
label: 'valueDerived',
9191
detail: '值的派生',
9292
},
93+
{
94+
label: 'colProps',
95+
detail: '表单项栅格布局属性',
96+
insertText: `"${'colProps'}": { "span": 24$1 },`,
97+
},
9398
].map((i) => ({
9499
...i,
95100
range: range,

packages/playground/src/components/formSample/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const FormSample: React.FC<IProps> = (props) => {
4343
ref={formRef}
4444
{...formLayout}
4545
docsMap={docsMap}
46+
rowProps={{ gutter: [16, 0] }}
4647
getWidgets={getWidgets}
4748
ruleMap={ruleMap}
4849
formServicePool={formServicePool}

0 commit comments

Comments
 (0)