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 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 { 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';
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;
@@ -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;