dynamicformdjx-react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -2
- package/dist/antd/hooks/PopSelect.d.ts +24 -0
- package/dist/antd/hooks/renderForm.d.ts +21 -2
- package/dist/antd/index.cjs +1 -173
- package/dist/antd/index.mjs +346 -15145
- package/dist/components/antd/AntdIndex.d.ts +2 -0
- package/dist/components/antd/allForm.d.ts +2 -0
- package/dist/components/antd/customForm.d.ts +2 -0
- package/dist/components/antd/simpleForm.d.ts +2 -0
- package/dist/components/cascadeInput.d.ts +2 -0
- package/dist/components/singleInput.d.ts +2 -0
- package/dist/types/form.d.ts +13 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -35,8 +35,6 @@ pnpm add dynamicformdjx-react
|
|
|
35
35
|
|
|
36
36
|
##### 简单表单
|
|
37
37
|
|
|
38
|
-
> 更多render函数请等待后续更新,可直接使用下方自定义渲染
|
|
39
|
-
|
|
40
38
|
```tsx
|
|
41
39
|
import {useRef, useState} from "react";
|
|
42
40
|
import {Button, Input, Radio} from "antd";
|
|
@@ -267,6 +265,207 @@ export default CustomForm;
|
|
|
267
265
|
|
|
268
266
|
```
|
|
269
267
|
|
|
268
|
+
##### 总表单
|
|
269
|
+
|
|
270
|
+
> 除renderDynamicTags,renderCheckbox,renderSlider,renderInputNumber等待后续更新
|
|
271
|
+
|
|
272
|
+
```tsx
|
|
273
|
+
import {useRef, useState} from "react";
|
|
274
|
+
import {Button, Input, Radio} from "antd";
|
|
275
|
+
import {
|
|
276
|
+
AdDynamicForm,
|
|
277
|
+
type adDynamicFormRef, renderCheckboxGroup, renderDatePicker,
|
|
278
|
+
renderInput,
|
|
279
|
+
renderPopSelect, renderRadioButtonGroup, renderRadioGroup,
|
|
280
|
+
renderSelect, renderSwitch, renderTimePicker,
|
|
281
|
+
renderTreeSelect
|
|
282
|
+
} from "dynamicformdjx-react/antd";
|
|
283
|
+
import {useDyForm, useReactiveForm} from "dynamicformdjx-react";
|
|
284
|
+
import type {Rule} from "antd/es/form";
|
|
285
|
+
|
|
286
|
+
type RowProps = {
|
|
287
|
+
username: string
|
|
288
|
+
password: string
|
|
289
|
+
gender: number
|
|
290
|
+
description: string
|
|
291
|
+
email: string
|
|
292
|
+
birthday: string
|
|
293
|
+
desc: string
|
|
294
|
+
sex: number
|
|
295
|
+
birthdayT: number
|
|
296
|
+
admin: number
|
|
297
|
+
favorite: number[]
|
|
298
|
+
job: number
|
|
299
|
+
job2: number
|
|
300
|
+
job3: number
|
|
301
|
+
}
|
|
302
|
+
const AllForm = () => {
|
|
303
|
+
const [formItems, setFormItems] = useReactiveForm<RowProps, Rule | Rule[]>([
|
|
304
|
+
{
|
|
305
|
+
key: "username",
|
|
306
|
+
label: "用户名",
|
|
307
|
+
value: "",
|
|
308
|
+
allowClear: true,
|
|
309
|
+
render2: f => renderInput({}, f),
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
key: "password",
|
|
313
|
+
label: "密码",
|
|
314
|
+
required: true,
|
|
315
|
+
value: "",
|
|
316
|
+
render2: (f) => renderInput({}, {...f, type: 'password'}),
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
key: "gender",
|
|
320
|
+
label: "性别",
|
|
321
|
+
value: null,
|
|
322
|
+
placeholder: '请选择性别',
|
|
323
|
+
labelField: 'f',
|
|
324
|
+
valueField: 'v',
|
|
325
|
+
showSearch: true,
|
|
326
|
+
allowClear: true,
|
|
327
|
+
searchOnLabel: true,
|
|
328
|
+
options: [
|
|
329
|
+
{f: <b>男</b>, v: 0},
|
|
330
|
+
{f: '女', v: 1}
|
|
331
|
+
],
|
|
332
|
+
render2: (f) => renderSelect([], {}, f)
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
key: "job",
|
|
336
|
+
label: "职业",
|
|
337
|
+
value: null,
|
|
338
|
+
placeholder: '请选择职业',
|
|
339
|
+
labelField: 'f',
|
|
340
|
+
valueField: 'v',
|
|
341
|
+
showSearch: true,
|
|
342
|
+
allowClear: true,
|
|
343
|
+
searchOnLabel: true,
|
|
344
|
+
childField: 'childOptions',
|
|
345
|
+
options: [
|
|
346
|
+
{
|
|
347
|
+
f: '前端', v: '1', childOptions: [
|
|
348
|
+
{f: '网页开发', v: '1-1'},
|
|
349
|
+
{f: '小程序开发', v: '1-2'},
|
|
350
|
+
]
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
f: '后端', v: '2', childOptions: [
|
|
354
|
+
{f: '后台开发', v: '2-1'},
|
|
355
|
+
{f: '运维', v: '2-2'},
|
|
356
|
+
]
|
|
357
|
+
}
|
|
358
|
+
],
|
|
359
|
+
render2: (f) => renderTreeSelect([], {
|
|
360
|
+
treeDefaultExpandAll: true
|
|
361
|
+
}, f),
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
key: "job2",
|
|
365
|
+
label: "职位2",
|
|
366
|
+
value: null,
|
|
367
|
+
labelField: 'l',
|
|
368
|
+
valueField: 'v',
|
|
369
|
+
options: ['Drive My Car', 'Norwegian Wood'].map((label, index) => ({
|
|
370
|
+
l: label,
|
|
371
|
+
v: label,
|
|
372
|
+
children: [
|
|
373
|
+
{l: 'aaa' + index, v: 'aaa' + index},
|
|
374
|
+
{l: 'bbb' + index, v: 'bbb' + index},
|
|
375
|
+
]
|
|
376
|
+
})),
|
|
377
|
+
// mode: 'multiple',
|
|
378
|
+
render2: f => renderPopSelect([], {}, f),
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
key: "sex",
|
|
382
|
+
label: "性别",
|
|
383
|
+
labelField: 'label1',
|
|
384
|
+
valueField: 'value1',
|
|
385
|
+
value: null,
|
|
386
|
+
options: [
|
|
387
|
+
{label1: '男', value1: 0}, {label1: '女', value1: 1},
|
|
388
|
+
],
|
|
389
|
+
render2: f => renderRadioGroup([], {}, f),
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
key: "favorite",
|
|
393
|
+
label: "爱好",
|
|
394
|
+
labelField: 'fl',
|
|
395
|
+
valueField: 'fv',
|
|
396
|
+
sort: 1,
|
|
397
|
+
options: [
|
|
398
|
+
{fl: '吃饭', fv: 0},
|
|
399
|
+
{fl: '睡觉', fv: 1},
|
|
400
|
+
{fl: '打豆豆', fv: 2},
|
|
401
|
+
],
|
|
402
|
+
value: [],
|
|
403
|
+
render2: f => renderCheckboxGroup([], {}, f),
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
key: "admin",
|
|
407
|
+
label: "管理员?",
|
|
408
|
+
value: null,
|
|
409
|
+
render2: f => renderSwitch({}, f),
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
key: "birthday",
|
|
413
|
+
label: "生日",
|
|
414
|
+
value: null,
|
|
415
|
+
render2: f => renderDatePicker({showTime: true}, f),
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
key: "birthdayT",
|
|
419
|
+
label: "时间",
|
|
420
|
+
value: null,
|
|
421
|
+
render2: f => renderTimePicker({}, f),
|
|
422
|
+
},
|
|
423
|
+
])
|
|
424
|
+
const useForm = useDyForm([formItems, setFormItems])
|
|
425
|
+
const antdFormRef = useRef<adDynamicFormRef>(null)
|
|
426
|
+
const rules: Partial<Record<keyof RowProps, Rule | Rule[]>> = {
|
|
427
|
+
desc: [{required: true, message: '请输入详情'}]
|
|
428
|
+
}
|
|
429
|
+
return (
|
|
430
|
+
<div className='dynamicFormTest'>
|
|
431
|
+
<AdDynamicForm ref={antdFormRef} rules={rules} items={formItems}/>
|
|
432
|
+
<div className="footer" style={{
|
|
433
|
+
display: 'flex',
|
|
434
|
+
gap: '5px'
|
|
435
|
+
}}>
|
|
436
|
+
<Button color={'green'} variant={'outlined'} onClick={() => {
|
|
437
|
+
// const res=antdFormRef.current?.getResult?.()
|
|
438
|
+
const res = useForm.getValues()
|
|
439
|
+
console.log(res)
|
|
440
|
+
}}>getData</Button>
|
|
441
|
+
<Button color={'orange'} variant={'outlined'} onClick={() => {
|
|
442
|
+
useForm.setValues({
|
|
443
|
+
username: 'antd',
|
|
444
|
+
password: 'I love you'
|
|
445
|
+
})
|
|
446
|
+
}}>setData</Button>
|
|
447
|
+
<Button color={'blue'} variant={'outlined'} onClick={() => {
|
|
448
|
+
antdFormRef.current?.validator().then(v => {
|
|
449
|
+
console.log(v)
|
|
450
|
+
}).catch(r => {
|
|
451
|
+
console.log(r)
|
|
452
|
+
})
|
|
453
|
+
}}>validator</Button>
|
|
454
|
+
<Button color={'red'} variant={'outlined'} onClick={() => {
|
|
455
|
+
useForm.onReset()
|
|
456
|
+
}}>reset</Button>
|
|
457
|
+
<Button variant={'outlined'} onClick={() => {
|
|
458
|
+
useForm.setDisabled(true)
|
|
459
|
+
}}>setDisabled</Button>
|
|
460
|
+
</div>
|
|
461
|
+
</div>
|
|
462
|
+
);
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
export default AllForm;
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
|
|
270
469
|
### 动态录入
|
|
271
470
|
|
|
272
471
|
> 此录入无需组件库依赖
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { default as React, ReactNode } from 'react';
|
|
2
|
+
import { Dropdown, Popover, DropdownProps, PopoverProps, ButtonProps } from 'antd';
|
|
3
|
+
type PropsOf<C> = C extends React.ComponentType<infer P> ? P : never;
|
|
4
|
+
export type PopSelectSingleProps = PropsOf<typeof Dropdown>;
|
|
5
|
+
export type PopSelectMultipleProps = PropsOf<typeof Popover>;
|
|
6
|
+
export type PopSelectOptionProps = PopSelectSingleProps | PopSelectMultipleProps;
|
|
7
|
+
type BasicOption = Record<string, any>;
|
|
8
|
+
export type SelectOption = BasicOption;
|
|
9
|
+
type PopSelectCoreProps = {
|
|
10
|
+
value?: string | number | null | Array<string | number>;
|
|
11
|
+
onChange?: (next: any) => void;
|
|
12
|
+
options: Array<SelectOption>;
|
|
13
|
+
labelField?: string;
|
|
14
|
+
valueField?: string;
|
|
15
|
+
multiple?: boolean;
|
|
16
|
+
onChangeEx?: (val: any, opt: any) => void;
|
|
17
|
+
/** props */
|
|
18
|
+
dropdownProps?: Omit<DropdownProps, "menu" | "children">;
|
|
19
|
+
popoverProps?: Omit<PopoverProps, "content" | "children">;
|
|
20
|
+
buttonProps?: ButtonProps;
|
|
21
|
+
defaultRender?: ReactNode;
|
|
22
|
+
};
|
|
23
|
+
export declare function PopSelect(props: PopSelectCoreProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export {};
|
|
@@ -1,5 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { default as React, ReactNode } from 'react';
|
|
2
|
+
import { PopSelectMultipleProps, PopSelectSingleProps, SelectOption } from './PopSelect.tsx';
|
|
3
|
+
import { TreeSelectProps, SelectProps, TimePickerProps, DatePickerProps, SwitchProps } from 'antd';
|
|
4
|
+
import { DyFormItem, SelectOptionItem, TreeSelectOption } from '../../types/form';
|
|
5
|
+
import { InputProps, PasswordProps, TextAreaProps } from 'antd/es/input';
|
|
6
|
+
import { RadioGroupProps } from 'antd/es/radio/interface';
|
|
7
|
+
import { CheckboxGroupProps } from 'antd/es/checkbox';
|
|
3
8
|
export declare function renderInput(optionProps: PasswordProps, rf?: DyFormItem): JSX.Element;
|
|
4
9
|
export declare function renderInput(optionProps: TextAreaProps, rf?: DyFormItem): JSX.Element;
|
|
5
10
|
export declare function renderInput(optionProps?: InputProps, rf?: DyFormItem): JSX.Element;
|
|
11
|
+
export declare function renderSelect(options?: SelectOptionItem[], optionProps?: SelectProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function renderTreeSelect(options: TreeSelectOption[], optionProps?: TreeSelectProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare function renderPopSelect(options: Array<SelectOption>, optionProps?: PopSelectMultipleProps, rf?: DyFormItem, defaultRender?: ReactNode): React.ReactElement;
|
|
14
|
+
export declare function renderPopSelect(options: Array<SelectOption>, optionProps?: PopSelectSingleProps, rf?: DyFormItem, defaultRender?: ReactNode): React.ReactElement;
|
|
15
|
+
export declare function renderRadioGroup(options?: SelectOptionItem[], optionProps?: RadioGroupProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare function renderRadioButtonGroup(options?: SelectOptionItem[], optionProps?: RadioGroupProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export declare function renderCheckboxGroup(options?: SelectOptionItem[], optionProps?: CheckboxGroupProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare function renderSwitch(optionProps?: SwitchProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare function renderDatePicker(optionProps?: DatePickerProps & {
|
|
20
|
+
isRange?: boolean;
|
|
21
|
+
}, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function renderTimePicker(optionProps?: TimePickerProps & {
|
|
23
|
+
isRange?: boolean;
|
|
24
|
+
}, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|