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 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 { DyFormItem } from '../../types/form';
2
- import { PasswordProps, TextAreaProps, InputProps } from 'antd/es/input';
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;