dynamicformdjx-react 0.1.1 → 0.2.1
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 +245 -3
- package/dist/antd/hooks/PopSelect.d.ts +24 -0
- package/dist/antd/hooks/renderForm.d.ts +26 -2
- package/dist/antd/index.cjs +1 -1
- package/dist/antd/index.mjs +379 -109
- package/dist/constants/index.d.ts +2 -1
- package/dist/index-B4EyP31q.cjs +1 -0
- package/dist/index-px61OvsX.js +75 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +340 -388
- package/dist/types/form.d.ts +13 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dynamicformdjx-react
|
|
2
2
|
|
|
3
|
-
基于 **React**
|
|
3
|
+
基于 **React** 的动态表单及录入。
|
|
4
4
|
|
|
5
5
|
[Document](https://xczcdjx.github.io/dynamicFormDoc/react/install.html)
|
|
6
6
|
|
|
@@ -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,250 @@ export default CustomForm;
|
|
|
267
265
|
|
|
268
266
|
```
|
|
269
267
|
|
|
268
|
+
##### 总表单
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
import {useRef, useState} from "react";
|
|
272
|
+
import {Button, Input, Radio} from "antd";
|
|
273
|
+
import {
|
|
274
|
+
AdDynamicForm,
|
|
275
|
+
type adDynamicFormRef, renderCheckbox, renderCheckboxGroup, renderDatePicker, renderDynamicTags,
|
|
276
|
+
renderInput, renderInputNumber,
|
|
277
|
+
renderPopSelect, renderRadioButtonGroup, renderRadioGroup,
|
|
278
|
+
renderSelect, renderSlider, renderSwitch, renderTimePicker,
|
|
279
|
+
renderTreeSelect
|
|
280
|
+
} from "dynamicformdjx-react/antd";
|
|
281
|
+
import {useDyForm, useReactiveForm} from "dynamicformdjx-react";
|
|
282
|
+
import type {Rule} from "antd/es/form";
|
|
283
|
+
|
|
284
|
+
type RowProps = {
|
|
285
|
+
username: string
|
|
286
|
+
password: string
|
|
287
|
+
gender: number
|
|
288
|
+
description: string
|
|
289
|
+
email: string
|
|
290
|
+
birthday: string
|
|
291
|
+
desc: string
|
|
292
|
+
sex: number
|
|
293
|
+
birthdayT: number
|
|
294
|
+
admin: number
|
|
295
|
+
favorite: number[]
|
|
296
|
+
job: number
|
|
297
|
+
job2: number
|
|
298
|
+
job3: number
|
|
299
|
+
checkbox: boolean
|
|
300
|
+
future: string[]
|
|
301
|
+
slider: number
|
|
302
|
+
inputNumber: number
|
|
303
|
+
}
|
|
304
|
+
const AllForm = () => {
|
|
305
|
+
const [formItems, setFormItems] = useReactiveForm<RowProps, Rule | Rule[]>([
|
|
306
|
+
{
|
|
307
|
+
key: "username",
|
|
308
|
+
label: "用户名",
|
|
309
|
+
value: "",
|
|
310
|
+
allowClear: true,
|
|
311
|
+
render2: f => renderInput({}, f),
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
key: "password",
|
|
315
|
+
label: "密码",
|
|
316
|
+
required: true,
|
|
317
|
+
value: "",
|
|
318
|
+
render2: (f) => renderInput({}, {...f, type: 'password'}),
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
key: "gender",
|
|
322
|
+
label: "性别",
|
|
323
|
+
value: null,
|
|
324
|
+
placeholder: '请选择性别',
|
|
325
|
+
labelField: 'f',
|
|
326
|
+
valueField: 'v',
|
|
327
|
+
showSearch: true,
|
|
328
|
+
allowClear: true,
|
|
329
|
+
searchOnLabel: true,
|
|
330
|
+
options: [
|
|
331
|
+
{f: <b>男</b>, v: 0},
|
|
332
|
+
{f: '女', v: 1}
|
|
333
|
+
],
|
|
334
|
+
render2: (f) => renderSelect([], {}, f)
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
key: "job",
|
|
338
|
+
label: "职业",
|
|
339
|
+
value: null,
|
|
340
|
+
placeholder: '请选择职业',
|
|
341
|
+
labelField: 'f',
|
|
342
|
+
valueField: 'v',
|
|
343
|
+
showSearch: true,
|
|
344
|
+
allowClear: true,
|
|
345
|
+
searchOnLabel: true,
|
|
346
|
+
childField: 'childOptions',
|
|
347
|
+
options: [
|
|
348
|
+
{
|
|
349
|
+
f: '前端', v: '1', childOptions: [
|
|
350
|
+
{f: '网页开发', v: '1-1'},
|
|
351
|
+
{f: '小程序开发', v: '1-2'},
|
|
352
|
+
]
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
f: '后端', v: '2', childOptions: [
|
|
356
|
+
{f: '后台开发', v: '2-1'},
|
|
357
|
+
{f: '运维', v: '2-2'},
|
|
358
|
+
]
|
|
359
|
+
}
|
|
360
|
+
],
|
|
361
|
+
render2: (f) => renderTreeSelect([], {
|
|
362
|
+
treeDefaultExpandAll: true
|
|
363
|
+
}, f),
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
key: "job2",
|
|
367
|
+
label: "职位2",
|
|
368
|
+
value: null,
|
|
369
|
+
labelField: 'l',
|
|
370
|
+
valueField: 'v',
|
|
371
|
+
options: ['Drive My Car', 'Norwegian Wood'].map((label, index) => ({
|
|
372
|
+
l: label,
|
|
373
|
+
v: label,
|
|
374
|
+
children: [
|
|
375
|
+
{l: 'aaa' + index, v: 'aaa' + index},
|
|
376
|
+
{l: 'bbb' + index, v: 'bbb' + index},
|
|
377
|
+
]
|
|
378
|
+
})),
|
|
379
|
+
// mode: 'multiple',
|
|
380
|
+
render2: f => renderPopSelect([], {}, f),
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
key: "sex",
|
|
384
|
+
label: "性别",
|
|
385
|
+
labelField: 'label1',
|
|
386
|
+
valueField: 'value1',
|
|
387
|
+
value: null,
|
|
388
|
+
options: [
|
|
389
|
+
{label1: '男', value1: 0}, {label1: '女', value1: 1},
|
|
390
|
+
],
|
|
391
|
+
render2: f => renderRadioGroup([], {}, f),
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
key: "favorite",
|
|
395
|
+
label: "爱好",
|
|
396
|
+
labelField: 'fl',
|
|
397
|
+
valueField: 'fv',
|
|
398
|
+
sort: 1,
|
|
399
|
+
options: [
|
|
400
|
+
{fl: '吃饭', fv: 0},
|
|
401
|
+
{fl: '睡觉', fv: 1},
|
|
402
|
+
{fl: '打豆豆', fv: 2},
|
|
403
|
+
],
|
|
404
|
+
value: [],
|
|
405
|
+
render2: f => renderCheckboxGroup([], {}, f),
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
key: "admin",
|
|
409
|
+
label: "管理员?",
|
|
410
|
+
value: null,
|
|
411
|
+
render2: f => renderSwitch({}, f),
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
key: "birthday",
|
|
415
|
+
label: "生日",
|
|
416
|
+
value: null,
|
|
417
|
+
render2: f => renderDatePicker({showTime: true}, f),
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
key: "birthdayT",
|
|
421
|
+
label: "时间",
|
|
422
|
+
value: null,
|
|
423
|
+
render2: f => renderTimePicker({}, f),
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
key: "future",
|
|
427
|
+
label: "未来",
|
|
428
|
+
value: [
|
|
429
|
+
{label: '你没见过不等于没有', value: 'hello world 1'},
|
|
430
|
+
{
|
|
431
|
+
label: '不要给自己设限',
|
|
432
|
+
value: 'hello world 2'
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
label: '不要说连升两级',
|
|
436
|
+
value: 'hello world 3'
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
label: '直接升到 CEO 都是有可能的',
|
|
440
|
+
value: 'hello world 4'
|
|
441
|
+
}
|
|
442
|
+
],
|
|
443
|
+
render2: f => renderDynamicTags(f.value, {}, f),
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
key: "checkbox",
|
|
447
|
+
label: "复选",
|
|
448
|
+
value: true,
|
|
449
|
+
render2: f => renderCheckbox({}, f),
|
|
450
|
+
formItemProps: {
|
|
451
|
+
valuePropName: 'checked',
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
key: "slider",
|
|
456
|
+
label: "滑块",
|
|
457
|
+
value: 0,
|
|
458
|
+
render2: f => renderSlider({}, f),
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
key: "inputNumber",
|
|
462
|
+
label: "数字输入",
|
|
463
|
+
value: 20,
|
|
464
|
+
render2: f => renderInputNumber({}, f),
|
|
465
|
+
},
|
|
466
|
+
])
|
|
467
|
+
const useForm = useDyForm([formItems, setFormItems])
|
|
468
|
+
const antdFormRef = useRef<adDynamicFormRef>(null)
|
|
469
|
+
const rules: Partial<Record<keyof RowProps, Rule | Rule[]>> = {
|
|
470
|
+
desc: [{required: true, message: '请输入详情'}]
|
|
471
|
+
}
|
|
472
|
+
return (
|
|
473
|
+
<div className='dynamicFormTest'>
|
|
474
|
+
<AdDynamicForm ref={antdFormRef} rules={rules} items={formItems}/>
|
|
475
|
+
<div className="footer" style={{
|
|
476
|
+
display: 'flex',
|
|
477
|
+
gap: '5px'
|
|
478
|
+
}}>
|
|
479
|
+
<Button color={'green'} variant={'outlined'} onClick={() => {
|
|
480
|
+
// const res=antdFormRef.current?.getResult?.()
|
|
481
|
+
const res = useForm.getValues()
|
|
482
|
+
console.log(res)
|
|
483
|
+
}}>getData</Button>
|
|
484
|
+
<Button color={'orange'} variant={'outlined'} onClick={() => {
|
|
485
|
+
useForm.setValues({
|
|
486
|
+
username: 'antd',
|
|
487
|
+
password: 'I love you'
|
|
488
|
+
})
|
|
489
|
+
}}>setData</Button>
|
|
490
|
+
<Button color={'blue'} variant={'outlined'} onClick={() => {
|
|
491
|
+
antdFormRef.current?.validator().then(v => {
|
|
492
|
+
console.log(v)
|
|
493
|
+
}).catch(r => {
|
|
494
|
+
console.log(r)
|
|
495
|
+
})
|
|
496
|
+
}}>validator</Button>
|
|
497
|
+
<Button color={'red'} variant={'outlined'} onClick={() => {
|
|
498
|
+
useForm.onReset()
|
|
499
|
+
}}>reset</Button>
|
|
500
|
+
<Button variant={'outlined'} onClick={() => {
|
|
501
|
+
useForm.setDisabled(true)
|
|
502
|
+
}}>setDisabled</Button>
|
|
503
|
+
</div>
|
|
504
|
+
</div>
|
|
505
|
+
);
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
export default AllForm;
|
|
509
|
+
|
|
510
|
+
```
|
|
511
|
+
|
|
270
512
|
### 动态录入
|
|
271
513
|
|
|
272
514
|
> 此录入无需组件库依赖
|
|
@@ -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,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { default as React, ReactNode } from 'react';
|
|
2
|
+
import { PopSelectMultipleProps, PopSelectSingleProps, SelectOption } from './PopSelect';
|
|
3
|
+
import { CheckboxProps, InputNumberProps, 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';
|
|
8
|
+
import { SliderProps } from 'antd/es/slider';
|
|
3
9
|
export declare function renderInput(optionProps: PasswordProps, rf?: DyFormItem): JSX.Element;
|
|
4
10
|
export declare function renderInput(optionProps: TextAreaProps, rf?: DyFormItem): JSX.Element;
|
|
5
11
|
export declare function renderInput(optionProps?: InputProps, rf?: DyFormItem): JSX.Element;
|
|
12
|
+
export declare function renderSelect(options?: SelectOptionItem[], optionProps?: SelectProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare function renderTreeSelect(options: TreeSelectOption[], optionProps?: TreeSelectProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare function renderPopSelect(options: Array<SelectOption>, optionProps?: PopSelectMultipleProps, rf?: DyFormItem, defaultRender?: ReactNode): React.ReactElement;
|
|
15
|
+
export declare function renderPopSelect(options: Array<SelectOption>, optionProps?: PopSelectSingleProps, rf?: DyFormItem, defaultRender?: ReactNode): React.ReactElement;
|
|
16
|
+
export declare function renderRadioGroup(options?: SelectOptionItem[], optionProps?: RadioGroupProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export declare function renderRadioButtonGroup(options?: SelectOptionItem[], optionProps?: RadioGroupProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare function renderCheckboxGroup(options?: SelectOptionItem[], optionProps?: CheckboxGroupProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare function renderSwitch(optionProps?: SwitchProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare function renderDatePicker(optionProps?: DatePickerProps & {
|
|
21
|
+
isRange?: boolean;
|
|
22
|
+
}, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export declare function renderTimePicker(optionProps?: TimePickerProps & {
|
|
24
|
+
isRange?: boolean;
|
|
25
|
+
}, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare function renderCheckbox(optionProps?: CheckboxProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export declare function renderSlider(optionProps?: SliderProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export declare function renderInputNumber(optionProps?: InputNumberProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export declare function renderDynamicTags(options?: SelectOptionItem[], optionProps?: SelectProps, rf?: DyFormItem): import("react/jsx-runtime").JSX.Element;
|
package/dist/antd/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("react/jsx-runtime"),b=require("react"),y=require("antd");function I(e){return Array.isArray(e)?e:typeof e=="string"&&e.includes(".")?e.split("."):e}function p(e){return Array.isArray(e)?e.join("."):String(e)}function E(e,l){return(Array.isArray(l)?l:[l]).reduce((a,c)=>a==null?a:a[c],e)}function B(e,l,s){const a=Array.isArray(l)?l:[l];let c=e;for(let m=0;m<a.length;m++){const d=a[m];m===a.length-1?c[d]=s:((c[d]==null||typeof c[d]!="object")&&(c[d]={}),c=c[d])}}function w(e){const l={};return e.forEach(s=>{const a=I(s?.path??s?.key);B(l,a,s?.value)}),l}const S=b.forwardRef((e,l)=>{const[s]=y.Form.useForm(),a=e.validateTrigger??"onBlur",c=e.validateTrigger===null?void 0:a,m=e.preset??"fullRow",[d,A]=b.useState({}),u=b.useMemo(()=>(e.items??[]).filter(r=>!r?.hidden),[e.items]),q=b.useMemo(()=>[...u].sort((r,t)=>{const o=r?.sort??1/0,f=t?.sort??1/0;return Number(o)-Number(f)}),[u]),P=b.useMemo(()=>{const r={};return u.forEach(t=>{const o=I(t?.path??t?.key),f=p(o);let i=t?.rule;if(t?.required&&!t?.rule){const n=typeof t?.label=="string"?t.label:"";i={required:!0,message:t?.requiredHint?.(n)??`${n||t?.key}不能为空`,validateTrigger:c}}if(i&&(r[f]=i,t.isCustom)){const n=Array.isArray(i)?i:[i];A(C=>({...C,[o]:{status:!1,help:n.map(h=>h.message).filter(Boolean).join(",")}}))}}),{...r,...e.rules??{}}},[u,e.rules]);b.useEffect(()=>{s.setFieldsValue(w(u))},[s,u]);const R=(r,t)=>{u.forEach(o=>{const f=I(o?.path??o?.key);o.value=E(t,f)})};b.useImperativeHandle(l,()=>({reset:(r=null)=>{u.forEach(t=>t.value=r),s.setFieldsValue(w(u))},validator:async()=>{const r=u.filter(n=>!n.isCustom).map(n=>I(n?.path??n?.key)),t=await s.validateFields(r);let o={};const f=u.filter(n=>n.isCustom),i=[];for(const n of f){const C=I(n?.path??n?.key),h=p(C),j=P[h],F=Array.isArray(j)?j:j?[j]:[];A(v=>({...v,[h]:{status:"validating",help:""}})),o={...o,[h]:n.value};try{await M(n.value,F),A(v=>({...v,[h]:{status:"success",help:""}}))}catch(v){const x=v?.message||F.map(k=>k.message).filter(Boolean).join(",");A(k=>({...k,[h]:{status:"error",help:x}})),i.push({name:h,errors:[x]})}}return i.length?Promise.reject({errorFields:i,outOfDate:!1}):{...t,...o}},getResult:(r="res")=>r==="ori"?u:w(u),form:s}));const T=(r,t)=>typeof r?.render2=="function"?r.render2.length>=2?r.render2(r,t):r.render2(r):null,N=r=>{const t=I(r?.path??r?.key),o=p(t),f=P[o],i=Array.isArray(f)?f:f?[f]:void 0;let n=i?.map(x=>x.validateTrigger)?.filter(Boolean)??[];c&&(n=n.concat(a));const C=r?.colProps??{span:r?.span??24,offset:r?.offset??0},h=r?.formItemProps??{},{status:j,help:F}=d[o]??{status:void 0,help:void 0},v=r.isCustom?g.jsx(y.Form.Item,{name:void 0,label:r?.label,required:!!r?.required||d[o],validateStatus:j,help:j==="error"?F:void 0,...h,children:T(r,s)},o):g.jsx(y.Form.Item,{name:t,label:r?.label,rules:i,validateTrigger:n,...h,children:T(r,s)},o);return m==="grid"?g.jsx(y.Col,{...C,children:v},o):v};return g.jsxs("div",{className:"dynamicForm",children:[e.header&&g.jsx("div",{className:"header",children:e.header()}),g.jsx(y.Form,{form:s,onValuesChange:R,...e.formConfig,children:m==="grid"?g.jsx(y.Row,{gutter:e.gridConfig?.gutter??10,...e.gridConfig,children:q.map(N)}):q.map(N)}),e.footer&&g.jsx("div",{className:"footer",children:e.footer()})]})});function V(e){return!!(e==null||e===""||Array.isArray(e)&&e.length===0||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0)}async function M(e,l){for(const s of l){const a=s;if(a?.required&&V(e))throw new Error(a?.message||"必填");typeof a?.validator=="function"&&await a.validator(a,e)}}function O(e={},l){const{type:s="text",key:a,render2:c,...m}=l??{},d=A=>{l?.onChange?.(A.target.value,l),e?.onChange?.(A)};switch(s){case"password":return g.jsx(y.Input.Password,{...m,...e,onChange:d});case"textarea":return g.jsx(y.Input.TextArea,{...m,...e,onChange:d});default:return g.jsx(y.Input,{...m,...e,onChange:d})}}exports.AdDynamicForm=S;exports.renderInput=O;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),R=require("react"),m=require("antd"),T=require("../index-B4EyP31q.cjs");function _(e){return Array.isArray(e)?e:typeof e=="string"&&e.includes(".")?e.split("."):e}function G(e){return Array.isArray(e)?e.join("."):String(e)}function W(e,n){return(Array.isArray(n)?n:[n]).reduce((a,o)=>a==null?a:a[o],e)}function J(e,n,r){const a=Array.isArray(n)?n:[n];let o=e;for(let l=0;l<a.length;l++){const s=a[l];l===a.length-1?o[s]=r:((o[s]==null||typeof o[s]!="object")&&(o[s]={}),o=o[s])}}function N(e){const n={};return e.forEach(r=>{const a=_(r?.path??r?.key);J(n,a,r?.value)}),n}const Q=R.forwardRef((e,n)=>{const[r]=m.Form.useForm(),a=e.validateTrigger??"onBlur",o=e.validateTrigger===null?void 0:a,l=e.preset??"fullRow",[s,u]=R.useState({}),h=R.useMemo(()=>(e.items??[]).filter(t=>!t?.hidden),[e.items]),j=R.useMemo(()=>[...h].sort((t,c)=>{const d=t?.sort??1/0,g=c?.sort??1/0;return Number(d)-Number(g)}),[h]),k=R.useMemo(()=>{const t={};return h.forEach(c=>{const d=_(c?.path??c?.key),g=G(d);let b=c?.rule;if(c?.required&&!c?.rule){const f=typeof c?.label=="string"?c.label:"";b={required:!0,message:c?.requiredHint?.(f)??`${f||c?.key}不能为空`,validateTrigger:o}}if(b&&(t[g]=b,c.isCustom)){const f=Array.isArray(b)?b:[b];u(S=>({...S,[d]:{status:!1,help:f.map(x=>x.message).filter(Boolean).join(",")}}))}}),{...t,...e.rules??{}}},[h,e.rules]);R.useEffect(()=>{r.setFieldsValue(N(h))},[r,h]);const C=(t,c)=>{h.forEach(d=>{const g=_(d?.path??d?.key);d.value=W(c,g)})};R.useImperativeHandle(n,()=>({reset:(t=null)=>{h.forEach(c=>c.value=t),r.setFieldsValue(N(h))},validator:async()=>{const t=h.filter(f=>!f.isCustom).map(f=>_(f?.path??f?.key)),c=await r.validateFields(t);let d={};const g=h.filter(f=>f.isCustom),b=[];for(const f of g){const S=_(f?.path??f?.key),x=G(S),O=k[x],v=Array.isArray(O)?O:O?[O]:[];u(F=>({...F,[x]:{status:"validating",help:""}})),d={...d,[x]:f.value};try{await X(f.value,v),u(F=>({...F,[x]:{status:"success",help:""}}))}catch(F){const w=F?.message||v.map(I=>I.message).filter(Boolean).join(",");u(I=>({...I,[x]:{status:"error",help:w}})),b.push({name:x,errors:[w]})}}return b.length?Promise.reject({errorFields:b,outOfDate:!1}):{...c,...d}},getResult:(t="res")=>t==="ori"?h:N(h),form:r}));const y=(t,c)=>typeof t?.render2=="function"?t.render2.length>=2?t.render2(t,c):t.render2(t):null,p=t=>{const c=_(t?.path??t?.key),d=G(c),g=k[d],b=Array.isArray(g)?g:g?[g]:void 0;let f=b?.map(w=>w.validateTrigger)?.filter(Boolean)??[];o&&(f=f.concat(a));const S=t?.colProps??{span:t?.span??24,offset:t?.offset??0},x=t?.formItemProps??{},{status:O,help:v}=s[d]??{status:void 0,help:void 0},F=t.isCustom?i.jsx(m.Form.Item,{name:void 0,label:t?.label,required:!!t?.required||s[d],validateStatus:O,help:O==="error"?v:void 0,...x,children:y(t,r)},d):i.jsx(m.Form.Item,{name:c,label:t?.label,rules:b,validateTrigger:f,...x,children:y(t,r)},d);return l==="grid"?i.jsx(m.Col,{...S,children:F},d):F};return i.jsxs("div",{className:"dynamicForm",children:[e.header&&i.jsx("div",{className:"header",children:e.header()}),i.jsx(m.Form,{form:r,onValuesChange:C,...e.formConfig,children:l==="grid"?i.jsx(m.Row,{gutter:e.gridConfig?.gutter??10,...e.gridConfig,children:j.map(p)}):j.map(p)}),e.footer&&i.jsx("div",{className:"footer",children:e.footer()})]})});function U(e){return!!(e==null||e===""||Array.isArray(e)&&e.length===0||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0)}async function X(e,n){for(const r of n){const a=r;if(a?.required&&U(e))throw new Error(a?.message||"必填");typeof a?.validator=="function"&&await a.validator(a,e)}}function A(e,n,r){return e?.[n]??r}function Y(e){return!!e&&(e.type==="group"||Array.isArray(e.children)||Array.isArray(e.options))}function V(e){return(e??[]).map(n=>{if(Y(n)){const r=n.children??n.options??[];return{...n,__isGroup:!0,__children:r}}return{...n,__isGroup:!1}})}function Z(e,n,r="label",a="value"){const o=V(n);for(const l of o)if(l.__isGroup){for(const s of l.__children)if(A(s,a,s.value)===e)return A(s,r,s.label)}else if(A(l,a,l.value)===e)return A(l,r,l.label);return""}function ee(e,n,r){const a=V(e),o=new Map;return{items:a.map((s,u)=>{if(s.__isGroup){const C=A(s,n,s.label),y=(s.__children??[]).map((p,t)=>{const c=A(p,n,p.label),d=A(p,r,p.value),g=`opt-${u}-${t}`;return o.set(g,{value:d,option:p}),{key:g,label:c,disabled:!!p.disabled}});return{key:`group-${u}`,type:"group",label:C,children:y}}const h=A(s,n,s.label),j=A(s,r,s.value),k=`opt-${u}`;return o.set(k,{value:j,option:s}),{key:k,label:h,disabled:!!s.disabled}}),keyMap:o,opts:a}}function ne(e){const{value:n,onChange:r,options:a,labelField:o="label",valueField:l="value",multiple:s,onChangeEx:u,dropdownProps:h,popoverProps:j,buttonProps:k,defaultRender:C}=e,y=a??[],p=s??Array.isArray(n),{items:t,keyMap:c,opts:d}=R.useMemo(()=>ee(y,o,l),[y,o,l]),g=R.useMemo(()=>{if(C)return C;const S=p?Array.isArray(n)&&n.length?`已选 ${n.length} 项`:"请选择":n!=null?Z(n,y,o,l)||String(n):"请选择";return i.jsx(m.Button,{...k,children:S})},[C,p,n,y,o,l,k]);if(p){const S=d.flatMap(v=>v.__isGroup?v.__children??[]:[v]),x=Array.isArray(n)?n:[],O=i.jsx("div",{style:{maxWidth:360},children:i.jsx(m.Checkbox.Group,{value:x,onChange:v=>{r?.(v);const F=S.filter(w=>v.includes(A(w,l,w.value)));u?.(v,F)},children:i.jsx(m.Space,{direction:"vertical",size:8,style:{width:"100%"},children:d.map((v,F)=>{if(v.__isGroup){const E=A(v,o,v.label),$=v.__children??[];return i.jsxs("div",{children:[i.jsx(m.Typography.Text,{strong:!0,children:E}),i.jsx("div",{style:{marginTop:8},children:i.jsx(m.Space,{wrap:!0,children:$.map((P,K)=>{const z=A(P,o,P.label),H=A(P,l,P.value);return i.jsx(m.Checkbox,{value:H,disabled:!!P.disabled,children:z},P.key??`${F}-${K}`)})})}),i.jsx(m.Divider,{style:{margin:"12px 0"}})]},`g-${F}`)}const w=A(v,o,v.label),I=A(v,l,v.value);return i.jsx(m.Checkbox,{value:I,disabled:!!v.disabled,children:w},v.key??`o-${F}`)})})})});return i.jsx(m.Popover,{trigger:"click",placement:"bottom",content:O,...j,children:i.jsx("span",{style:{display:"inline-block"},children:g})})}const b=R.useMemo(()=>{if(n!=null){for(const[S,x]of c.entries())if(x.value===n)return S}},[n,c]),f={items:t,onClick:({key:S})=>{const x=c.get(String(S));x&&(r?.(x.value),u?.(x.value,x.option))},selectedKeys:b};return i.jsx(m.Dropdown,{trigger:["click"],menu:f,...h,children:i.jsx("span",{style:{display:"inline-block"},children:g})})}function M(e){return e==null||e===!1||e===!0?"":typeof e=="string"||typeof e=="number"?String(e):Array.isArray(e)?e.map(M).join(""):R.isValidElement(e)?M(e.props?.children):""}function re(e={},n){const{type:r="text",key:a,render2:o,...l}=n??{},s=u=>{n?.onChange?.(u.target.value,n),e?.onChange?.(u)};switch(r){case"password":return i.jsx(m.Input.Password,{...l,...e,onChange:s});case"textarea":return i.jsx(m.Input.TextArea,{...l,...e,onChange:s});default:return i.jsx(m.Input,{...l,...e,onChange:s})}}function L(e,n,r="label"){const{labelField:a,valueField:o,childField:l,options:s=[]}=n,u=e.length?e:s,h=a??"label",j=o??"value",k=l??"children";return u.map(C=>{const y=C[h],p={...C,[r]:y,value:C[j],searchText:M(y)};return Array.isArray(C[k])&&(p.children=L(C[k],n,r)),p})}function D(e,n,r="label"){const{labelField:a,valueField:o,options:l=[]}=n,s=e.length?e:l,u=a??"label",h=o??"value";return s.map(j=>{const k=j[u];return{[r]:k,value:j[h]}})}function B(e=[],n={},r){const{type:a,key:o,render2:l,searchOnLabel:s,...u}=r??{},{labelField:h,valueField:j,childField:k,...C}=u,y=L(e,u),p=c=>{n?.onSearch?.(c);const d=c.trim().toLowerCase(),g=y.filter(f=>(f.searchText??"").toLowerCase().includes(d)),b=g.find(f=>(f.searchText??"").toLowerCase()===d);if(b)return t(b.value,b);if(g.length===1)return t(g[0].value,g[0])},t=(c,d)=>{r?.onChange?.(c,r,d),n?.onChange?.(c,d)};return i.jsx(m.Select,{...C,options:y,onSearch:s?p:void 0,optionFilterProp:s?"searchText":void 0,...n,onChange:t})}function te(e,n={},r){const{type:a,key:o,render2:l,searchOnLabel:s,...u}=r??{},{labelField:h,valueField:j,childField:k,...C}=u,y=L(e,u,"title"),p=c=>{n?.onSearch?.(c);const d=c.trim().toLowerCase(),g=y.filter(f=>(f.searchText??"").toLowerCase().includes(d)),b=g.find(f=>(f.searchText??"").toLowerCase()===d);if(b)return t(b.value,r,b);if(g.length===1)return t(g[0].value,r,g[0])},t=(c,d,g)=>{r?.onChange?.(c,r,d),n?.onChange?.(c,d,g)};return i.jsx(m.TreeSelect,{...C,treeData:y,onSearch:s?p:void 0,treeNodeFilterProp:s?"searchText":void 0,...n,onChange:t})}function oe(e=[],n={},r,a){const{labelField:o,valueField:l,onChange:s,mode:u,key:h,...j}=r??{},k=(p,t)=>{s?.(p,r,t)},C=u==="multiple",y=e.length?e:r?.options;return i.jsx(ne,{...j,options:y,labelField:o,valueField:l,multiple:C,defaultRender:a,onChangeEx:k,dropdownProps:C?void 0:n,popoverProps:C?n:void 0})}function q(e=[],n={},r){const{type:a,key:o,render2:l,searchOnLabel:s,...u}=r??{},{labelField:h,valueField:j,childField:k,...C}=u,y=D(e,u),p=t=>{r?.onChange?.(t.target.value,r,y),n?.onChange?.(t)};return i.jsx(m.Radio.Group,{...C,options:y,onChange:p,...n})}function se(e=[],n={},r){return q(e,{optionType:"button",...n},r)}function ae(e=[],n={},r){const{type:a,key:o,render2:l,searchOnLabel:s,...u}=r??{},{labelField:h,valueField:j,childField:k,...C}=u,y=D(e,u),p=t=>{r?.onChange?.(t,r,y),n?.onChange?.(t)};return i.jsx(m.Checkbox.Group,{...C,options:y,onChange:p,...n})}function le(e={},n){const r=T.OmitValue(n,T.omitAllCommonKey),a=(o,l)=>{n?.onChange?.(o,n),e?.onChange?.(o,l)};return i.jsx(m.Switch,{...r,onChange:a,...e})}function ce(e={},n){const r=T.OmitValue(n,T.omitAllCommonKey),a=(u,h)=>{n?.onChange?.(h,n),e?.onChange?.(u,h)},{isRange:o,...l}=e,s={...r,onChange:a,...l};return o?i.jsx(m.DatePicker.RangePicker,{...s}):i.jsx(m.DatePicker,{...s})}function ie(e={},n){const r=T.OmitValue(n,T.omitAllCommonKey),a=(u,h)=>{n?.onChange?.(h,n),e?.onChange?.(u,h)},{isRange:o,...l}=e,s={...r,onChange:a,...l};return o?i.jsx(m.TimePicker.RangePicker,{...s}):i.jsx(m.TimePicker,{...s})}function ue(e={},n){const r=T.OmitValue(n,T.omitAllCommonKey),a=o=>{const l=o.target.checked;n?.onChange?.(l,n),e?.onChange?.(o)};return i.jsx(m.Checkbox,{...r,checked:!!n?.value,onChange:a,...e})}function de(e={},n){const r=T.OmitValue(n,T.omitAllCommonKey),a=o=>{n?.onChange?.(o,n),e?.onChange?.(o)};return i.jsx(m.Slider,{...r,onChange:a,...e})}function he(e={},n){const r=T.OmitValue(n,T.omitAllCommonKey),a=o=>{n?.onChange?.(o,n),e?.onChange?.(o)};return i.jsx(m.InputNumber,{...r,onChange:a,...e})}function me(e=[],n={},r){return B(e,{mode:"tags",...n},r)}exports.AdDynamicForm=Q;exports.renderCheckbox=ue;exports.renderCheckboxGroup=ae;exports.renderDatePicker=ce;exports.renderDynamicTags=me;exports.renderInput=re;exports.renderInputNumber=he;exports.renderPopSelect=oe;exports.renderRadioButtonGroup=se;exports.renderRadioGroup=q;exports.renderSelect=B;exports.renderSlider=de;exports.renderSwitch=le;exports.renderTimePicker=ie;exports.renderTreeSelect=te;
|