@trungkhai/dynamic-form 0.1.3 → 0.1.4

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/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),g=require("antd"),d=require("react"),J=require("dayjs"),Se=require("@ant-design/icons"),te=d.createContext(null);function M(){const e=d.useContext(te);if(!e)throw new Error("useDynamicFormContext must be used within DynamicFormProvider");return e}function Ze(){return d.useContext(te)}function Fe(e,t=[]){for(const r of t){if(typeof r=="function")continue;const{match:i,render:a}=r;if(typeof i=="string"){if(i===e.field?.type?.code||i===e.code)return a}else if(i(e))return a}const n=e.field?.type?.code;for(const r of t);}function je(e,t=[],n={}){return Fe(e,t)??n[e.code]??n[e.field?.type?.code??""]}function Ae(e,t){const n=t.option_config?.label_attr,r=t.option_config?.value_attr||"value";let i;if(n?.length){const a=n.join(" - ");e[a]!==void 0?i=String(e[a]):i=n.map(o=>e[o]).filter(o=>o!=null&&o!=="").join(" - ")}else i=String(e[r]??"");return{label:i,value:e[r]}}function ke(e,t){return t.option_config&&t.is_option_api?e?.map(n=>Ae(n,t)):t.metas?.map(n=>({label:n.label,value:n.value}))}function Q(e,t){let n;return(...r)=>{n&&clearTimeout(n),n=setTimeout(()=>e(...r),t)}}const et=({onSearchKeyword:e,searchDebounceMs:t=500,...n})=>{const[r,i]=d.useState(""),a=d.useMemo(()=>Q(s=>e?.(s),t),[e,t]),o=s=>{i(s),a(s)};return u.jsx(g.Select,{allowClear:!0,showSearch:!0,searchValue:r,onSearch:o,filterOption:!1,...n})},tt=d.memo(et),nt=({fieldName:e,formInstance:t,...n})=>{const r=g.Form.useWatch(e,t);d.useEffect(()=>{if(r?.fileList?.length&&r.fileList.some(o=>!o.type?.startsWith("image/"))){const o=r.fileList.filter(s=>s.type?.startsWith("image/"));t.setFieldValue(e,o?.length?{file:o[0]?.originFileObj,fileList:o}:null)}},[e,t,r]);const i=u.jsx("button",{style:{border:0,background:"none",cursor:"pointer"},type:"button",children:u.jsx(Se.FileImageOutlined,{})});return u.jsx(g.Upload,{listType:"picture-card",accept:"image/*",...n,children:i})},rt=d.memo(nt),it=({fieldName:e,formInstance:t,...n})=>{const r=g.Form.useWatch(e,t);return u.jsx(g.Upload,{fileList:r?.fileList,...n,children:u.jsx(g.Button,{icon:u.jsx(Se.UploadOutlined,{})})})},at=d.memo(it),Re=({formInstance:e,uploadUrl:t,setFieldState:n})=>{const{client:r,upload:i,i18n:a,renderers:o}=M(),{messages:s}=a,m=d.useCallback(()=>{if(i.upload)return i.upload;const l=t??i.uploadUrl;if(l)return async({file:h,signal:y,onProgress:f,fieldCode:w,fieldGroup:v,metadata:x})=>{const _=i.getPayload?i.getPayload({file:h,fieldCode:w,fieldGroup:v,uploadUrl:l,signal:y,onProgress:f,metadata:x}):(()=>{const S=new FormData;return S.append("file",h),x&&Object.entries(x).forEach(([k,E])=>{S.append(k,String(E))}),S})(),F=(await r.request({method:"POST",url:l,data:_,headers:_ instanceof FormData?{"Content-Type":"multipart/form-data"}:void 0,signal:y,onUploadProgress:S=>{f?.(Math.round(S.loaded*100/(S.total||1)))}})).data;return{uid:h.uid,...F,path:String(F.path??"")}}},[r,i,t]),c=d.useCallback((l,h)=>y=>{const{file:f,onProgress:w,onError:v,onSuccess:x}=y,_=new AbortController,j=m();return j?(j({file:f,fieldCode:l,fieldGroup:h,uploadUrl:t??i.uploadUrl,signal:_.signal,onProgress:F=>w?.({percent:F})}).then(F=>x?.({...F,uid:F.uid??f.uid,path:F.path,upload_date:J().format("YYYY-MM-DD HH:mm:ss")})).catch(F=>v?.(F)),{abort:()=>_.abort()}):(v?.(new Error(s.uploadError??"Upload not configured")),{abort(){}})},[s.uploadError,m,i.uploadUrl,t]),b=d.useCallback((l,h)=>async y=>{const f=y.response?.path;return f?i.remove({path:f,fieldCode:l,fieldGroup:h}):!0},[i]),p=d.useCallback((l,{state:h,options:y,optionsLoading:f,optionsError:w,onSearchKeyword:v,readOnly:x=!1})=>{const{additional_config:_,field:j}=l,F=j?.type?.code,S=x||l.is_readonly||h?.disabled,k=je(l,o.fields);if(k)return k(l,{state:h,options:y,optionsLoading:f,optionsError:w,onSearchKeyword:v,readOnly:x,formInstance:e,disabled:!!S,setFieldState:n});const E=ke(y,l);switch(F){case"text":return _?.text?.textarea?u.jsx(g.Input.TextArea,{disabled:S,placeholder:s.inputPlaceholder(l.label),rows:_?.text?.rows}):u.jsx(g.Input,{disabled:S,placeholder:s.inputPlaceholder(l.label)});case"number":return u.jsx(g.InputNumber,{style:{width:"100%"},disabled:S,placeholder:s.inputPlaceholder(l.label),min:_?.number?.min,max:_?.number?.max});case"select":{const D={disabled:S,options:E,placeholder:s.selectPlaceholder(l.label),allowClear:!0,loading:f,mode:_?.select?.multiple?"multiple":void 0,notFoundContent:w?s.optionError:f?s.optionLoading:void 0};return v?u.jsx(tt,{...D,onSearchKeyword:v,searchDebounceMs:_?.select?.searchDebounceMs??500}):u.jsx(g.Select,{...D,showSearch:!0,optionFilterProp:"label"})}case"radio":return u.jsx(g.Radio.Group,{disabled:S,options:E});case"checkbox":return u.jsx(g.Checkbox.Group,{disabled:S,options:E});case"datetime":return u.jsx(g.DatePicker,{style:{width:"100%"},disabled:S,showTime:_?.datetime?.showTime,format:_?.datetime?.format});case"file":return u.jsx(at,{disabled:S,fieldName:l.code,formInstance:e,multiple:_?.file?.multiple||!1,maxCount:_?.file?.max,accept:_?.file?.accept,customRequest:c(l.code,l),onRemove:b(l.code,l)});case"image":return u.jsx(rt,{disabled:S,fieldName:l.code,formInstance:e,multiple:_?.image?.multiple||!1,maxCount:_?.image?.max,accept:_?.image?.accept??"image/*",customRequest:c(l.code,l),onRemove:b(l.code,l)});default:return null}},[c,b,e,s,o.fields,n]);return d.useMemo(()=>({getDynamicField:p}),[p])};function X(e){return JSON.stringify(e)}function Ee(e,t){const n=e.get(t);if(n){if(Date.now()>n.expiresAt){e.delete(t);return}return n.data}}function Ce(e,t,n,r){e.set(t,{data:n,expiresAt:Date.now()+r})}async function Y(e,t,n,r,i){const a=e[t];if(e.cache.enabled){const c=Ee(a,n);if(c!==void 0)return c}const o=new AbortController,s=i?AbortSignal.any([i,o.signal]):o.signal,m=await r(s);return e.cache.enabled&&Ce(a,n,m,e.cache.ttlMs),m}function L(e,t){return t.split(".").reduce((n,r)=>{if(n&&typeof n=="object")return n[r]},e)}function st(e,t){if(typeof e!="string")return e;const n=e.match(/^\{\{(.+?)\}\}$/);if(!n)return e;const r=n[1].trim(),i=L(t,r);return i!==void 0?i:e}function Me(e,t){const n={};for(const r in e)n[r]=st(e[r],t);return n}function ot(e,t){const n={...e};return t.forEach(r=>{const i=e[r.code];if(i==null)return;switch(r.field?.type?.code){case"datetime":{const o=J(i);o.isValid()&&(n[r.code]=o);break}case"file":case"image":{if(Array.isArray(i)&&i.length>0){const o=i.map((s,m)=>{const c=s;return{uid:String(c.uid??c.path??m),name:c.name??`file-${m}`,status:"done",percent:100,type:c.type,size:c.size,response:s}});n[r.code]={fileList:o}}break}}}),n}function De(e){const t=e.option_config?.api_options?.params||{},n=e.option_config?.api_options?.data||{},r=i=>Object.values(i).filter(a=>typeof a=="string"&&a.startsWith("{{")&&a.endsWith("}}")).map(a=>a.slice(2,-2).trim());return Array.from(new Set([...r(t),...r(n)]))}function V(e,t){const n={};for(const r in e){const i=e[r];if(typeof i=="string"&&i.startsWith("{{")&&i.endsWith("}}")){const a=i.slice(2,-2).trim();n[r]=t?.[a]}else n[r]=i}return n}function q(e,t){return e.replace(/\{\{\s*(\w+)\s*\}\}/g,(n,r)=>{const i=t?.[r];return i!=null?String(i):""})}function lt(e,t,n){const i=t.find(a=>a.code===e)?.additional_config?.on_field_change?.clear??[];return i.length===0?[]:i.filter(a=>n?.[a]!==void 0&&n?.[a]!==null)}function Pe(e,t){const n=d.useMemo(()=>De(e),[e]),r=g.Form.useWatch(n.length>0?n:void 0,t);return d.useMemo(()=>{if(!n.length)return{};const i={};return n.forEach((a,o)=>{Array.isArray(r)?i[a]=r[o]:i[a]=r}),i},[n,r])}function Ve({group:e,formInstance:t,searchKeyword:n="",searchDebounceMs:r=500}){const i=M(),a=Pe(e,t),[o,s]=d.useState(),[m,c]=d.useState(!1),[b,p]=d.useState(),l=d.useRef(null),[h,y]=d.useState(n),f=e.additional_config?.select?.search_keyword??!1,w=d.useMemo(()=>Q(_=>y(_),r),[r]);d.useEffect(()=>{f?w(n):y("")},[n,f,w]);const v=d.useMemo(()=>{const _=e.option_config?.api_options?.params,j=e.option_config?.api_options?.data;if(!(!_&&!j))return{params:_?V(_,a):void 0,data:j?V(j,a):void 0}},[a,e]),x=d.useCallback(async()=>{if(!e.option_config||!e.is_option_api||!e.option_config.url)return;l.current?.abort();const _=new AbortController;l.current=_;const j=e.option_config.method?.toUpperCase()==="GET"||!e.option_config.method,F=f?h:"",S=X([e.code,e.option_config.url,e.option_config.method,v,F]);c(!0),p(void 0);try{const k=await Y(i,"optionCache",S,async E=>{const D=await i.client.request({method:e.option_config?.method||"GET",url:e.option_config?.url,params:j&&f?{...v?.params,keywords:F}:v?.params,data:!j&&f?{...v?.data,keywords:F}:v?.data,signal:E});return i.parsers.optionResponse(D.data,e)},_.signal);_.signal.aborted||s(k)}catch(k){_.signal.aborted||p(k)}finally{_.signal.aborted||c(!1)}},[v,i,h,e,f]);return d.useEffect(()=>(e.option_config&&e.is_option_api&&x(),()=>l.current?.abort()),[x,e]),{options:o,isLoading:m,error:b,refetch:x}}const ct=({group:e,formInstance:t,fieldState:n,setFieldState:r,uploadUrl:i,readOnly:a=!1,size:o="middle",...s})=>{const{getDynamicField:m}=Re({formInstance:t,uploadUrl:i,setFieldState:r}),c=g.Form.useWatch(e.code,t),[b,p]=d.useState(""),l=e.additional_config?.select?.search_keyword??!1,{options:h,isLoading:y,error:f}=Ve({group:e,formInstance:t,searchKeyword:b,searchDebounceMs:e.additional_config?.select?.searchDebounceMs??500}),w=d.useCallback(x=>{p(x)},[]);d.useEffect(()=>{e.additional_config?.on_field_empty?.disable?.length&&e.additional_config.on_field_empty.disable.forEach(x=>{r(x,{disabled:!c})})},[c,t,e,r]);const v=o==="small"?4:12;return u.jsx(g.Form.Item,{label:e.label,name:e.code,hidden:n?.hidden,rules:[{required:n?.required||!1}],style:{marginBottom:v,...s.style},...s,children:m(e,{state:n,options:h,optionsLoading:y,optionsError:f,onSearchKeyword:l?w:void 0,readOnly:a})})};function dt(e,t){return e.group.id===t.group.id&&e.readOnly===t.readOnly&&e.uploadUrl===t.uploadUrl&&e.size===t.size&&e.fieldState?.disabled===t.fieldState?.disabled&&e.fieldState?.hidden===t.fieldState?.hidden&&e.fieldState?.required===t.fieldState?.required}const Te=d.memo(ct,dt);function Le({fieldGroups:e,fieldStates:t,renderField:n,gutter:r,defaultColSpan:i}){return u.jsx(g.Row,{gutter:r,children:e.map(a=>{const o=t[a.code]?.hidden?0:Number(a.additional_config?.field_col_span)||i;return u.jsx(g.Col,{xs:o,children:n(a)},a.id)})})}function Oe(e){return d.useMemo(()=>{const t=e?.form?.field_groups??[],n=new Map,r={};t.forEach(a=>{n.set(a.code,a),a.additional_config?.default!==void 0&&(r[a.code]=a.additional_config.default)});const i=t.filter(a=>!a.is_hidden);return{fieldGroups:t,fieldByCode:n,visibleFieldGroups:i,initialValues:r}},[e])}function we(e){const t={};return e.forEach(n=>{t[n.code]={disabled:n.is_readonly,hidden:n.is_hidden,required:n.is_required}}),t}function qe(e){const[t,n]=d.useState(()=>we(e));d.useEffect(()=>{n(we(e))},[e]);const r=d.useCallback((i,a)=>{n(o=>({...o,[i]:{...o[i],...a}}))},[]);return{fieldStates:t,setFieldStates:n,setFieldState:r}}function Ue({formInstance:e,fieldByCode:t,relatedData:n,transformers:r}){return{buildProcessedValues:d.useCallback(async()=>{await e.validateFields();const a=e.getFieldsValue(),o={};for(const c of Object.keys(a)){const b=t.get(c);if(!b)continue;let p;switch(b.field?.type?.code){case"datetime":p=a[c]?J(a[c]).format(b.additional_config?.datetime?.format):null;break;case"image":case"file":a[c]?.fileList?.length&&(p=a[c].fileList.filter(l=>l.percent===100).map(l=>({...l.response,name:l.name,type:l.type,size:l.size})));break;default:p=a[c]}r.transformFieldValue&&(p=r.transformFieldValue(c,p,b)),o[c]=p}let s=o;return r.transformSubmitValues&&(s=r.transformSubmitValues(s,Array.from(t.values()),n)),(r.parseRelatedDataTemplates??Me)(s,n??{})},[t,e,n,r])}}const Ie=d.forwardRef(({formConfig:e,formInstance:t,relatedData:n,uploadUrl:r,uploadResourceUrl:i,submitTrackingUrl:a,onBeforeSubmit:o,onSubmitSuccess:s,onSubmitError:m,isRedirectAfterCreate:c,onRedirect:b,size:p="middle",manualSubmit:l=!1,onValuesChange:h,readOnly:y=!1,submitDebounceMs:f,gutter:w=[8,0],defaultColSpan:v=12,submitButtonLabel:x},_)=>{const{message:j}=g.App.useApp(),F=M(),{i18n:S,client:k,parsers:E,redirectHandler:D,renderers:I,transformers:B}=F,de=r??i,ue=f??F.submitDebounceMs,me=x??S.messages.submit,{fieldGroups:C,fieldByCode:Ne,initialValues:G}=Oe(e),{fieldStates:W,setFieldState:fe}=qe(C),{buildProcessedValues:K}=Ue({formInstance:t,fieldByCode:Ne,relatedData:n,transformers:B}),$=d.useRef(!1),[pe,he]=d.useState(!1),[ye,be]=d.useState(!1);d.useEffect(()=>{if(Object.keys(G).length>0){const A=B.normalizeInitialValues?B.normalizeInitialValues(G,C):G;t.setFieldsValue(A)}},[C,t,G,B]);const z=d.useCallback(async()=>{if(!$.current){$.current=!0,he(!0);try{let A=await K();try{a&&(be(!0),await k.request({method:"POST",url:a,data:A}));const R=await o?.(A);if(R===!1)return;R&&typeof R=="object"&&(A=R)}catch(R){console.error(R);return}finally{be(!1)}const P=await k.request({method:e.method,url:e.action,data:A});t.resetFields(C.filter(R=>!R.is_hidden).map(R=>R.code));const O=E.submitResponse(P.data);c&&O.redirectUrl&&(b??D)(O.redirectUrl,"_blank"),s?.({values:A,response:P.data,data:O.data??P.data})}catch(A){const P=A;j.error(P?.response?.data?.message??S.messages.submitError),m?.(A)}finally{$.current=!1,he(!1)}}},[K,k,C,e.action,e.method,t,S.messages.submitError,c,j,o,b,m,s,E,D,a]);d.useImperativeHandle(_,()=>({submit:z,getProcessedValues:K,isSubmitting:()=>$.current}),[K,z]);const _e=d.useMemo(()=>Q(()=>{z()},ue),[z,ue]),Je=d.useCallback((A,P)=>{Object.keys(A).forEach(O=>{const R=lt(O,C,t.getFieldsValue());R.length>0&&t.resetFields(R)}),h?.(A,P)},[C,t,h]),ve=d.useCallback(A=>u.jsx(Te,{group:A,formInstance:t,fieldState:W[A.code],setFieldState:fe,uploadUrl:de,readOnly:y,size:p},A.id),[W,t,y,de,fe,p]),Qe=I.layout?I.layout({fieldGroups:C,fieldStates:W,renderField:ve,gutter:w,defaultColSpan:v,size:p}):u.jsx(Le,{fieldGroups:C,fieldStates:W,renderField:ve,gutter:w,defaultColSpan:v,size:p}),Xe=!l&&!y&&(I.submitActions?I.submitActions({onSubmit:_e,loading:pe||ye,label:me}):u.jsx(g.Flex,{justify:"flex-end",children:u.jsx(g.Button,{type:"primary",onClick:_e,loading:pe||ye,children:me})}));return u.jsxs(g.Form,{layout:"vertical",form:t,size:p,onValuesChange:Je,children:[Qe,Xe]})});Ie.displayName="DynamicForm";function ne(e){if(!e)return;const{mode:t}=e;if(t==="api"&&e.api?.url)return e.api;if(t==="api_ids"&&e.api_ids?.url){const n=e.api_ids,r=n.method?.toUpperCase()==="POST";return{url:n.url,method:n.method,data_path:n.data_path,mapping_attr:n.mapping_attr,link:n.link,result_type:n.result_type??"array",params:n.params??(!r&&!n.data?{ids:"{{value}}"}:void 0),data:n.data??(r&&!n.params?{ids:"{{value}}"}:void 0)}}if(t==="api_detail"&&e.api_detail?.url){const n=e.api_detail;return{url:n.url,method:n.method,data_path:n.data_path,mapping_attr:n.mapping_attr,link:n.link,result_type:n.result_type??"object",url_template:n.url_template??!0,params:n.params,data:n.data}}}function ge(e){return{value:e,id:e}}function Be(e,t){const n=t.method||"GET",r=n.toUpperCase()==="GET";if(t.url_template)return(Array.isArray(e)?e.filter(m=>m!=null&&m!==""):e!=null&&e!==""?[e]:[]).map(m=>{const c=ge(m),b=q(t.url,c),p=t.params?V(t.params,c):void 0,l=t.data?V(t.data,c):void 0;return{method:n,url:b,params:r?p:void 0,data:r?void 0:l}});const i=ge(e),a=t.params?V(t.params,i):void 0,o=t.data?V(t.data,i):void 0;return[{method:n,url:t.url,params:r?a:void 0,data:r?void 0:o}]}function re(e,t){const n=t.data_path?L(e,t.data_path):e;return(t.result_type??(Array.isArray(n)?"array":"object"))==="array"?Array.isArray(n)?n:n!=null?[n]:[]:Array.isArray(n)?n.length?[n[0]]:[]:n&&typeof n=="object"?[n]:[]}function ie(e,t){return yt(e,t.mapping_attr)}function ae(e,t){return bt(t.link,e)}async function Ge(e,t,n,r){const i=Be(e,t);if(!i.length)return[];const a=await Promise.all(i.map(s=>n({...s,signal:r}))),o=[];for(const s of a)o.push(...re(s.data,t));return o}function T(e){return!!(e==null||e===""||Array.isArray(e)&&e.length===0)}function We(e,t){const n=e.option_config?.api_options?.params,r=e.option_config?.api_options?.data;if(!n&&!r)return;const i=a=>{const o={};for(const s in a)if(typeof a[s]=="string"&&a[s].startsWith("{{")&&a[s].endsWith("}}")){const m=a[s].slice(2,-2).trim();o[s]=t?.[m]}else o[s]=a[s];return o};return{params:n?i(n):void 0,data:r?i(r):void 0}}function ut(e,t){const n=t.option_config?.label_attr,r=t.option_config?.value_attr||"";if(n?.length){const i=n.join(" - ");return e[i]!==void 0?String(e[i]):n.map(a=>e[a]).filter(a=>a!=null&&a!=="").join(" - ")}return String(e[r]??"")}function mt(e,t){if(!t?.length)return null;const r=(Array.isArray(e)?e:[e]).map(i=>t.find(a=>String(a.value)===String(i))?.label).filter(i=>!!i);return r.length?r.join(", "):null}function ft(e,t,n){if(T(e))return null;const r=t.option_config?.value_attr||"value",i=Array.isArray(e)?e:[e];if(t.is_option_api&&n?.length){const o=i.map(s=>{const m=n.find(c=>String(c[r])===String(s));return m?ut(m,t):String(s)}).filter(Boolean);return o.length?o.join(", "):null}const a=mt(e,t.metas);return a||i.map(String).join(", ")}function pt(e,t){if(T(e))return null;const n=t.additional_config?.datetime?.format,r=J(e);return r.isValid()?n?r.format(n):r.format("YYYY-MM-DD HH:mm:ss"):String(e)}function ht(e){if(T(e))return null;if(Array.isArray(e)){const t=e.map(n=>typeof n=="object"&&n&&"name"in n?String(n.name):String(n)).filter(Boolean);return t.length?t.join(", "):null}return String(e)}function yt(e,t){return t?.length?t.map(n=>{const r=L(e,n)??e[n];return r!=null?String(r):""}).filter(Boolean).join(" - "):JSON.stringify(e)}function bt(e,t){return e?e.replace(/\{\{(.+?)\}\}/g,(n,r)=>{const i=r.trim(),a=L(t,i)??t[i];return a!=null?String(a):""}):null}function ee(e,t,n){if(T(e))return null;switch(t?.mode??"formatted"){case"raw":case"formatted":return Array.isArray(e)?e.map(String).join(", "):String(e);case"api":case"api_ids":case"api_detail":{const i=ne(t);if(!n||!i)return Array.isArray(e)?e.map(String).join(", "):String(e);const a=re(n,i);return a.length?a.map(s=>{const m=ie(s,i),c=ae(s,i);return c?`${m} (${c})`:m}).filter(Boolean).join(", ")||null:String(e)}default:return String(e)}}function Ke(e,t,n){const r=e.additional_config?.view_value;if(r?.mode==="api"||r?.mode==="api_ids"||r?.mode==="api_detail")return ee(t,r,n.viewValueFetched);switch(e.field?.type?.code){case"text":case"number":return T(t)?null:String(t);case"datetime":return pt(t,e);case"select":case"radio":case"checkbox":return ft(t,e,n.optionList);case"image":case"file":return ht(t);default:return r?ee(t,r,n.viewValueFetched):T(t)?null:String(t)}}const N=new Map,_t=3e4;function vt(e){const t=N.get(e);if(t){if(Date.now()>t.expiresAt){N.delete(e);return}return t.error}}function xe(e,t){N.set(e,{error:t,expiresAt:Date.now()+_t})}function U(e,t,n=!0){const r=M(),[i,a]=d.useState(),[o,s]=d.useState(!1),[m,c]=d.useState(),b=d.useRef(t),p=d.useRef(r);b.current=t,p.current=r;const l=X(e);return d.useEffect(()=>{if(!n){a(void 0),c(void 0),s(!1);return}const y=vt(l);if(y!==void 0){c(y),s(!1);return}const f=new AbortController;return s(!0),c(void 0),(async()=>{try{const v=await Y(p.current,"viewCache",l,x=>b.current(x),f.signal);f.signal.aborted||(a(v),c(void 0))}catch(v){f.signal.aborted||(xe(l,v),c(v))}finally{f.signal.aborted||s(!1)}})(),()=>f.abort()},[n,l]),{data:i,isLoading:o,error:m,refetch:async()=>{if(N.delete(l),!n)return;const y=new AbortController;s(!0),c(void 0);try{const f=await Y(p.current,"viewCache",l,w=>b.current(w),y.signal);return a(f),f}catch(f){throw xe(l,f),c(f),f}finally{s(!1)}}}}const wt=({value:e,code:t,modeConfig:n})=>{const{client:r,renderers:i,i18n:a}=M(),o=d.useMemo(()=>(Array.isArray(e)?e:[e]).filter(Boolean),[e]),{data:s,isLoading:m,error:c}=U(["api_detail",t,o,n?.url,n?.method],async l=>(await Promise.all(o.map(async y=>{const f=q(n?.url||"",{id:y});return(await r.request({method:n?.method,url:f,signal:l})).data}))).filter(Boolean),!!(o.length&&n?.url)),b=(l,h,y)=>i.link?i.link({url:l,label:h,data:y}):u.jsx("a",{href:l,target:"_blank",rel:"noreferrer",children:h}),p=l=>{const h=n?.mapping_attr?.map(y=>l?.[y]).join(" - ");if(n?.link){const y=q(n.link,l);return b(y,h,l)}return h};return m?u.jsx(u.Fragment,{children:i.viewLoading?.()??u.jsx(g.Spin,{size:"small"})}):c?u.jsx(u.Fragment,{children:i.viewError?.(c)??a.messages.viewError}):s?.length?u.jsx(u.Fragment,{children:s.map((l,h)=>u.jsx("div",{children:p(l)},h))}):u.jsx(u.Fragment,{children:i.viewEmpty?.()??a.messages.viewEmpty})},se=d.memo(wt),gt=({value:e,code:t,modeConfig:n})=>{const{client:r,renderers:i,i18n:a}=M(),{data:o,isLoading:s,error:m}=U(["api_ids",t,e,n?.url,n?.method],async p=>{const l=n?.method||"GET",h=l.toUpperCase()==="POST",y=Array.isArray(e)?e:[e],w=(await r.request({method:l,url:n?.url||"",data:h?{ids:y}:void 0,params:h?void 0:{ids:y},signal:p})).data,v=n?.data_path?L(w,n.data_path):w;return Array.isArray(v)?v:w},!!(e&&n?.url)),c=(p,l,h)=>i.link?i.link({url:p,label:l,data:h}):u.jsx("a",{href:p,target:"_blank",rel:"noreferrer",children:l}),b=p=>{const l=n?.mapping_attr?.map(h=>p?.[h]).join(" - ");if(n?.link){const h=q(n.link,p);return c(h,l,p)}return l};return s?u.jsx(u.Fragment,{children:i.viewLoading?.()??u.jsx(g.Spin,{size:"small"})}):m?u.jsx(u.Fragment,{children:i.viewError?.(m)??a.messages.viewError}):o?Array.isArray(e)?u.jsx(g.Flex,{vertical:!0,children:(Array.isArray(o)?o:[o]).map((p,l)=>u.jsx("div",{children:b(p)},p.id??l))}):b(Array.isArray(o)?o[0]:o):u.jsx(u.Fragment,{children:i.viewEmpty?.()??a.messages.viewEmpty})},oe=d.memo(gt),xt=({value:e,code:t,modeConfig:n,viewConfig:r})=>{const{client:i,renderers:a,i18n:o}=M(),s=d.useMemo(()=>n??(r?ne(r):void 0),[n,r]),m=d.useMemo(()=>["api_view",t,e,s?.url,s?.method,s?.data_path],[t,e,s?.url,s?.method,s?.data_path]),c=d.useCallback(async f=>s?Ge(e,s,w=>i.request({...w,signal:f})):[],[i,s,e]),{data:b,isLoading:p,error:l}=U(m,c,!!(e&&s?.url)),h=(f,w,v)=>a.link?a.link({url:f,label:w,data:v}):u.jsx("a",{href:f,target:"_blank",rel:"noreferrer",children:w}),y=(f,w)=>{if(!s)return null;const v=ie(f,s),x=ae(f,s),_=x?h(x,v,f):v;return u.jsx("div",{children:_},f.id??w)};return p?u.jsx(u.Fragment,{children:a.viewLoading?.()??u.jsx(g.Spin,{size:"small"})}):l?u.jsx(u.Fragment,{children:a.viewError?.(l)??o.messages.viewError}):b?.length?s?.result_type==="object"&&b.length===1?y(b[0],0):u.jsx(g.Flex,{vertical:!0,children:b.map(y)}):u.jsx(u.Fragment,{children:a.viewEmpty?.()??o.messages.viewEmpty})},le=d.memo(xt);function St(e){return!!(e.option_config&&e.is_option_api)}function Ft(e,t){const n=M(),r=X(["viewModeOptions",e.map(a=>a.code),t]),{data:i}=U([r],async a=>{const o={};return await Promise.all(e.map(async s=>{if(!s.option_config?.url)return;const m=We(s,t),c=s.option_config.method?.toUpperCase()==="GET"||!s.option_config.method,b=await n.client.request({method:s.option_config.method||"GET",url:s.option_config.url,params:c?m?.params:void 0,data:c?void 0:m?.data,signal:a});o[s.code]={optionList:n.parsers.optionResponse(b.data,s)}})),o},e.length>0);return i??{}}const jt=({formConfig:e,formValues:t})=>{const n=e?.form?.field_groups??[],r=d.useMemo(()=>n.filter(St),[n]),i=Ft(r,t);return d.useMemo(()=>n.filter(o=>!o.is_hidden).map(o=>{const s=t?.[o.code],m=o.additional_config?.view_value,c=m?.mode;if(c==="api"&&m)return{key:o.code,label:o.label,rawValue:s,viewValue:u.jsx(le,{code:o.code,value:s,viewConfig:m}),field_group:o};if(c==="api_ids"&&m?.api_ids)return{key:o.code,label:o.label,rawValue:s,viewValue:u.jsx(oe,{code:o.code,value:s,modeConfig:m.api_ids}),field_group:o};if(c==="api_detail"&&m?.api_detail)return{key:o.code,label:o.label,rawValue:s,viewValue:u.jsx(se,{code:o.code,value:s,modeConfig:m.api_detail}),field_group:o};const b=i[o.code]??{};return{key:o.code,label:o.label,rawValue:s,viewValue:Ke(o,s,b),field_group:o}}),[i,n,t])},At=({code:e,value:t,fieldGroup:n})=>{const r=n?.additional_config?.view_value;switch(r?.mode){case"raw":return t;case"api":return u.jsx(le,{code:e,value:t,viewConfig:r});case"api_ids":{const i=r?.api_ids;return u.jsx(oe,{code:e,value:t,modeConfig:i})}case"api_detail":{const i=r?.api_detail;return u.jsx(se,{code:e,value:t,modeConfig:i})}default:return t}},kt=d.memo(At),ce={submit:"Save",submitError:"Failed to submit form",inputPlaceholder:e=>`Enter ${e}`,selectPlaceholder:e=>`Select ${e}`,optionLoading:"Loading...",optionError:"Failed to load options",uploadError:"Upload failed",viewLoading:"Loading...",viewEmpty:"-",viewError:"Failed to load"},Rt={messages:ce},$e=e=>{if(Array.isArray(e))return e;if(e&&typeof e=="object"&&"items"in e&&Array.isArray(e.items))return e.items;if(e&&typeof e=="object"&&"data"in e&&e.data&&typeof e.data=="object"&&"items"in(e.data??{})){const t=e.data;return Array.isArray(t.items)?t.items:[]}return[]},ze=e=>({redirectUrl:e?.redirect_after_create,data:e}),He=(e,t)=>t?.dataPath?L(e,t.dataPath):e,H={optionResponse:$e,submitResponse:ze,viewResponse:He},Ye=(e,t="_blank")=>{window.open(e,t)},Z={upload:async()=>{throw new Error("Upload adapter is not configured")},remove:async()=>!1};function Et({children:e,client:t,upload:n,i18n:r,parsers:i,renderers:a={},transformers:o={},cache:s,submitDebounceMs:m=200,redirectHandler:c,requestClient:b,uploadAdapter:p,deleteUploadAdapter:l,messages:h,optionResponseParser:y,customFieldRenderers:f}){const w=d.useRef(new Map),v=d.useRef(new Map),x=d.useMemo(()=>{const _=t??{request:b??(()=>{throw new Error("DynamicFormProvider requires client or requestClient")})},j=f?Object.entries(f).map(([k,E])=>({match:k,render:E})):[],F={...ce,...r?.messages,...h},S={...Z,...n,upload:n?.upload??p??Z.upload,remove:n?.remove??(l?k=>l(k.path):Z.remove)};return{client:_,upload:S,i18n:{messages:F},parsers:{optionResponse:i?.optionResponse??y??H.optionResponse,submitResponse:i?.submitResponse??H.submitResponse,viewResponse:i?.viewResponse??H.viewResponse},renderers:{...a,fields:[...a.fields??[],...j]},transformers:o,cache:{enabled:s?.enabled??!0,ttlMs:s?.ttlMs??6e4},submitDebounceMs:m,redirectHandler:c??Ye,optionCache:w.current,viewCache:v.current}},[t,b,n,p,l,r?.messages,h,i?.optionResponse,i?.submitResponse,i?.viewResponse,y,a,f,o,s?.enabled,s?.ttlMs,m,c]);return u.jsx(te.Provider,{value:x,children:e})}function Ct(e){return{request:async t=>({data:(await e({method:t.method,url:t.url,params:t.params,data:t.data,signal:t.signal,headers:t.headers,onUploadProgress:t.onUploadProgress})).data})}}exports.ApiDetailItem=se;exports.ApiItem=oe;exports.ApiViewItem=le;exports.DefaultLayout=Le;exports.DynamicForm=Ie;exports.DynamicFormProvider=Et;exports.FormItem=Te;exports.MetaItemValue=kt;exports.buildApiViewRequests=Be;exports.buildCacheKey=X;exports.cachedRequest=Y;exports.createAxiosDynamicFormClient=Ct;exports.debounce=Q;exports.defaultI18n=Rt;exports.defaultMessages=ce;exports.defaultOptionResponseParser=$e;exports.defaultParsers=H;exports.defaultRedirectHandler=Ye;exports.defaultSubmitResponseParser=ze;exports.defaultViewResponseParser=He;exports.extractDependencyFields=De;exports.extractViewData=re;exports.fetchApiViewItems=Ge;exports.fillTemplate=q;exports.getByPath=L;exports.getCached=Ee;exports.getMappedLabel=ie;exports.getMappedLink=ae;exports.isEmptyValue=T;exports.mapOptionToSelectItem=Ae;exports.mapOptions=ke;exports.normalizeApiViewConfig=ne;exports.normalizeMetaForForm=ot;exports.parseFormValues=Me;exports.replaceTemplateInObject=V;exports.resolveApiOptionMeta=We;exports.resolveFieldRenderer=Fe;exports.resolveFieldRendererFromMap=je;exports.resolveFieldViewValue=Ke;exports.resolveViewValueConfig=ee;exports.setCache=Ce;exports.useCachedViewRequest=U;exports.useDependencyValues=Pe;exports.useDynamicField=Re;exports.useDynamicFormContext=M;exports.useDynamicFormContextOptional=Ze;exports.useDynamicOptions=Ve;exports.useFieldGroups=Oe;exports.useFieldStates=qe;exports.useProcessedValues=Ue;exports.useViewMode=jt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),S=require("antd"),c=require("react"),te=require("dayjs"),Fe=require("@ant-design/icons"),se=c.createContext(null);function D(){const e=c.useContext(se);if(!e)throw new Error("useDynamicFormContext must be used within DynamicFormProvider");return e}function et(){return c.useContext(se)}function Ae(e,t=[]){for(const r of t){if(typeof r=="function")continue;const{match:i,render:a}=r;if(typeof i=="string"){if(i===e.field?.type?.code||i===e.code)return a}else if(i(e))return a}const n=e.field?.type?.code;for(const r of t);}function je(e,t=[],n={}){return Ae(e,t)??n[e.code]??n[e.field?.type?.code??""]}function ke(e,t){const n=t.option_config?.label_attr,r=t.option_config?.value_attr||"value";let i;if(n?.length){const a=n.join(" - ");e[a]!==void 0?i=String(e[a]):i=n.map(s=>e[s]).filter(s=>s!=null&&s!=="").join(" - ")}else i=String(e[r]??"");return{label:i,value:e[r]}}function Re(e,t){return t.option_config&&t.is_option_api?e?.map(n=>ke(n,t)):t.metas?.map(n=>({label:n.label,value:n.value}))}function Ee(e,t){const n=t.option_config?.value_attr||"value";return e[n]}function tt(e,t){const n=new Set,r=[];return e.forEach(i=>{const a=Ee(i,t),s=String(a);n.has(s)||(n.add(s),r.push(i))}),r}function ne(e,t){let n;return(...r)=>{n&&clearTimeout(n),n=setTimeout(()=>e(...r),t)}}const nt=({onSearchKeyword:e,searchDebounceMs:t=500,...n})=>{const[r,i]=c.useState(""),a=c.useMemo(()=>ne(o=>e?.(o),t),[e,t]),s=o=>{i(o),a(o)};return u.jsx(S.Select,{allowClear:!0,showSearch:!0,searchValue:r,onSearch:s,filterOption:!1,...n})},rt=c.memo(nt),it=({fieldName:e,formInstance:t,...n})=>{const r=S.Form.useWatch(e,t);c.useEffect(()=>{if(r?.fileList?.length&&r.fileList.some(s=>!s.type?.startsWith("image/"))){const s=r.fileList.filter(o=>o.type?.startsWith("image/"));t.setFieldValue(e,s?.length?{file:s[0]?.originFileObj,fileList:s}:null)}},[e,t,r]);const i=u.jsx("button",{style:{border:0,background:"none",cursor:"pointer"},type:"button",children:u.jsx(Fe.FileImageOutlined,{})});return u.jsx(S.Upload,{listType:"picture-card",accept:"image/*",...n,children:i})},at=c.memo(it),st=({fieldName:e,formInstance:t,...n})=>{const r=S.Form.useWatch(e,t);return u.jsx(S.Upload,{fileList:r?.fileList,...n,children:u.jsx(S.Button,{icon:u.jsx(Fe.UploadOutlined,{})})})},ot=c.memo(st),Ce=({formInstance:e,uploadUrl:t,setFieldState:n})=>{const{client:r,upload:i,i18n:a,renderers:s}=D(),{messages:o}=a,m=c.useCallback(()=>{if(i.upload)return i.upload;const l=t??i.uploadUrl;if(l)return async({file:h,signal:y,onProgress:f,fieldCode:_,fieldGroup:w,metadata:v})=>{const g=i.getPayload?i.getPayload({file:h,fieldCode:_,fieldGroup:w,uploadUrl:l,signal:y,onProgress:f,metadata:v}):(()=>{const x=new FormData;return x.append("file",h),v&&Object.entries(v).forEach(([R,k])=>{x.append(R,String(k))}),x})(),F=(await r.request({method:"POST",url:l,data:g,headers:g instanceof FormData?{"Content-Type":"multipart/form-data"}:void 0,signal:y,onUploadProgress:x=>{f?.(Math.round(x.loaded*100/(x.total||1)))}})).data;return{uid:h.uid,...F,path:String(F.path??"")}}},[r,i,t]),d=c.useCallback((l,h)=>y=>{const{file:f,onProgress:_,onError:w,onSuccess:v}=y,g=new AbortController,A=m();return A?(A({file:f,fieldCode:l,fieldGroup:h,uploadUrl:t??i.uploadUrl,signal:g.signal,onProgress:F=>_?.({percent:F})}).then(F=>v?.({...F,uid:F.uid??f.uid,path:F.path,upload_date:te().format("YYYY-MM-DD HH:mm:ss")})).catch(F=>w?.(F)),{abort:()=>g.abort()}):(w?.(new Error(o.uploadError??"Upload not configured")),{abort(){}})},[o.uploadError,m,i.uploadUrl,t]),b=c.useCallback((l,h)=>async y=>{const f=y.response?.path;return f?i.remove({path:f,fieldCode:l,fieldGroup:h}):!0},[i]),p=c.useCallback((l,{state:h,options:y,optionsLoading:f,optionsError:_,onSearchKeyword:w,readOnly:v=!1})=>{const{additional_config:g,field:A}=l,F=A?.type?.code,x=v||l.is_readonly||h?.disabled,R=je(l,s.fields);if(R)return R(l,{state:h,options:y,optionsLoading:f,optionsError:_,onSearchKeyword:w,readOnly:v,formInstance:e,disabled:!!x,setFieldState:n});const k=Re(y,l);switch(F){case"text":return g?.text?.textarea?u.jsx(S.Input.TextArea,{disabled:x,placeholder:o.inputPlaceholder(l.label),rows:g?.text?.rows}):u.jsx(S.Input,{disabled:x,placeholder:o.inputPlaceholder(l.label)});case"number":return u.jsx(S.InputNumber,{style:{width:"100%"},disabled:x,placeholder:o.inputPlaceholder(l.label),min:g?.number?.min,max:g?.number?.max});case"select":{const V={disabled:x,options:k,placeholder:o.selectPlaceholder(l.label),allowClear:!0,loading:f,mode:g?.select?.multiple?"multiple":void 0,notFoundContent:_?o.optionError:f?o.optionLoading:void 0};return w?u.jsx(rt,{...V,onSearchKeyword:w,searchDebounceMs:g?.select?.searchDebounceMs??500}):u.jsx(S.Select,{...V,showSearch:!0,optionFilterProp:"label"})}case"radio":return u.jsx(S.Radio.Group,{disabled:x,options:k});case"checkbox":return u.jsx(S.Checkbox.Group,{disabled:x,options:k});case"datetime":return u.jsx(S.DatePicker,{style:{width:"100%"},disabled:x,showTime:g?.datetime?.showTime,format:g?.datetime?.format});case"file":return u.jsx(ot,{disabled:x,fieldName:l.code,formInstance:e,multiple:g?.file?.multiple||!1,maxCount:g?.file?.max,accept:g?.file?.accept,customRequest:d(l.code,l),onRemove:b(l.code,l)});case"image":return u.jsx(at,{disabled:x,fieldName:l.code,formInstance:e,multiple:g?.image?.multiple||!1,maxCount:g?.image?.max,accept:g?.image?.accept??"image/*",customRequest:d(l.code,l),onRemove:b(l.code,l)});default:return null}},[d,b,e,o,s.fields,n]);return c.useMemo(()=>({getDynamicField:p}),[p])};function K(e){return JSON.stringify(e)}function Me(e,t){const n=e.get(t);if(n){if(Date.now()>n.expiresAt){e.delete(t);return}return n.data}}function De(e,t,n,r){e.set(t,{data:n,expiresAt:Date.now()+r})}async function $(e,t,n,r,i){const a=e[t];if(e.cache.enabled){const d=Me(a,n);if(d!==void 0)return d}const s=new AbortController,o=i?AbortSignal.any([i,s.signal]):s.signal,m=await r(o);return e.cache.enabled&&De(a,n,m,e.cache.ttlMs),m}function U(e,t){return t.split(".").reduce((n,r)=>{if(n&&typeof n=="object")return n[r]},e)}function lt(e,t){if(typeof e!="string")return e;const n=e.match(/^\{\{(.+?)\}\}$/);if(!n)return e;const r=n[1].trim(),i=U(t,r);return i!==void 0?i:e}function Ve(e,t){const n={};for(const r in e)n[r]=lt(e[r],t);return n}function ct(e,t){const n={...e};return t.forEach(r=>{const i=e[r.code];if(i==null)return;switch(r.field?.type?.code){case"datetime":{const s=te(i);s.isValid()&&(n[r.code]=s);break}case"file":case"image":{if(Array.isArray(i)&&i.length>0){const s=i.map((o,m)=>{const d=o;return{uid:String(d.uid??d.path??m),name:d.name??`file-${m}`,status:"done",percent:100,type:d.type,size:d.size,response:o}});n[r.code]={fileList:s}}break}}}),n}function Pe(e){const t=e.option_config?.api_options?.params||{},n=e.option_config?.api_options?.data||{},r=i=>Object.values(i).filter(a=>typeof a=="string"&&a.startsWith("{{")&&a.endsWith("}}")).map(a=>a.slice(2,-2).trim());return Array.from(new Set([...r(t),...r(n)]))}function L(e,t){const n={};for(const r in e){const i=e[r];if(typeof i=="string"&&i.startsWith("{{")&&i.endsWith("}}")){const a=i.slice(2,-2).trim();n[r]=t?.[a]}else n[r]=i}return n}function z(e,t){return e.replace(/\{\{\s*(\w+)\s*\}\}/g,(n,r)=>{const i=t?.[r];return i!=null?String(i):""})}function dt(e,t,n){const i=t.find(a=>a.code===e)?.additional_config?.on_field_change?.clear??[];return i.length===0?[]:i.filter(a=>n?.[a]!==void 0&&n?.[a]!==null)}function Te(e,t){const n=c.useMemo(()=>Pe(e),[e]),r=S.Form.useWatch(n.length>0?n:void 0,t);return c.useMemo(()=>{if(!n.length)return{};const i={};return n.forEach((a,s)=>{Array.isArray(r)?i[a]=r[s]:i[a]=r}),i},[n,r])}function Oe({group:e,formInstance:t,searchKeyword:n="",searchDebounceMs:r=500}){const i=D(),a=Te(e,t),s=S.Form.useWatch(e.code,t),[o,m]=c.useState(),[d,b]=c.useState(!1),[p,l]=c.useState(),h=c.useRef(null),[y,f]=c.useState(n),_=e.additional_config?.select?.search_keyword??!1,w=c.useMemo(()=>ne(A=>f(A),r),[r]);c.useEffect(()=>{_?w(n):f("")},[n,_,w]);const v=c.useMemo(()=>{const A=e.option_config?.api_options?.params,F=e.option_config?.api_options?.data;if(!(!A&&!F))return{params:A?L(A,a):void 0,data:F?L(F,a):void 0}},[a,e]),g=c.useCallback(async()=>{if(!e.option_config||!e.is_option_api||!e.option_config.url)return;h.current?.abort();const A=new AbortController;h.current=A;const F=e.option_config.method?.toUpperCase()==="GET"||!e.option_config.method,x=_?y:"",R=K([e.code,e.option_config.url,e.option_config.method,v,x]);b(!0),l(void 0);try{const k=await $(i,"optionCache",R,async E=>{const M=await i.client.request({method:e.option_config?.method||"GET",url:e.option_config?.url,params:F&&_?{...v?.params,keywords:x}:v?.params,data:!F&&_?{...v?.data,keywords:x}:v?.data,signal:E});return i.parsers.optionResponse(M.data,e)},A.signal),V=Array.isArray(s)?s:s==null?[]:[s],G=new Set(k.map(E=>String(Ee(E,e)))),P=V.filter(E=>E==null||E===""?!1:!G.has(String(E)));let I=[];P.length>0&&(I=(await Promise.all(P.map(async E=>{const M=K([e.code,e.option_config?.url,e.option_config?.method,v,"selected",E]);return $(i,"optionCache",M,async re=>{const T={[e.option_config?.value_attr||"value"]:E},N=await i.client.request({method:e.option_config?.method||"GET",url:e.option_config?.url,params:F?{...v?.params,filter:{...v?.params?.filter,...T}}:v?.params,data:F?v?.data:{...v?.data,filter:{...v?.data?.filter,...T}},signal:re});return i.parsers.optionResponse(N.data,e)},A.signal)}))).flat());const Y=tt([...k,...I],e);A.signal.aborted||m(Y)}catch(k){A.signal.aborted||l(k)}finally{A.signal.aborted||b(!1)}},[v,i,y,e,_,s]);return c.useEffect(()=>(e.option_config&&e.is_option_api&&g(),()=>h.current?.abort()),[g,e]),{options:o,isLoading:d,error:p,refetch:g}}const ut=({group:e,formInstance:t,fieldState:n,setFieldState:r,uploadUrl:i,readOnly:a=!1,size:s="middle",...o})=>{const{getDynamicField:m}=Ce({formInstance:t,uploadUrl:i,setFieldState:r}),d=S.Form.useWatch(e.code,t),[b,p]=c.useState(""),l=e.additional_config?.select?.search_keyword??!1,{options:h,isLoading:y,error:f}=Oe({group:e,formInstance:t,searchKeyword:b,searchDebounceMs:e.additional_config?.select?.searchDebounceMs??500}),_=c.useCallback(v=>{p(v)},[]);c.useEffect(()=>{e.additional_config?.on_field_empty?.disable?.length&&e.additional_config.on_field_empty.disable.forEach(v=>{r(v,{disabled:!d})})},[d,t,e,r]);const w=s==="small"?4:12;return u.jsx(S.Form.Item,{label:e.label,name:e.code,hidden:n?.hidden,rules:[{required:n?.required||!1}],style:{marginBottom:w,...o.style},...o,children:m(e,{state:n,options:h,optionsLoading:y,optionsError:f,onSearchKeyword:l?_:void 0,readOnly:a})})};function mt(e,t){return e.group.id===t.group.id&&e.readOnly===t.readOnly&&e.uploadUrl===t.uploadUrl&&e.size===t.size&&e.fieldState?.disabled===t.fieldState?.disabled&&e.fieldState?.hidden===t.fieldState?.hidden&&e.fieldState?.required===t.fieldState?.required}const Le=c.memo(ut,mt);function qe({fieldGroups:e,fieldStates:t,renderField:n,gutter:r,defaultColSpan:i}){return u.jsx(S.Row,{gutter:r,children:e.map(a=>{const s=t[a.code]?.hidden?0:Number(a.additional_config?.field_col_span)||i;return u.jsx(S.Col,{xs:s,children:n(a)},a.id)})})}function Ue(e){return c.useMemo(()=>{const t=e?.form?.field_groups??[],n=new Map,r={};t.forEach(a=>{n.set(a.code,a),a.additional_config?.default!==void 0&&(r[a.code]=a.additional_config.default)});const i=t.filter(a=>!a.is_hidden);return{fieldGroups:t,fieldByCode:n,visibleFieldGroups:i,initialValues:r}},[e])}function ge(e){const t={};return e.forEach(n=>{t[n.code]={disabled:n.is_readonly,hidden:n.is_hidden,required:n.is_required}}),t}function Ge(e){const[t,n]=c.useState(()=>ge(e));c.useEffect(()=>{n(ge(e))},[e]);const r=c.useCallback((i,a)=>{n(s=>({...s,[i]:{...s[i],...a}}))},[]);return{fieldStates:t,setFieldStates:n,setFieldState:r}}function Ie({formInstance:e,fieldByCode:t,relatedData:n,transformers:r}){return{buildProcessedValues:c.useCallback(async()=>{await e.validateFields();const a=e.getFieldsValue(),s={};for(const d of Object.keys(a)){const b=t.get(d);if(!b)continue;let p;switch(b.field?.type?.code){case"datetime":p=a[d]?te(a[d]).format(b.additional_config?.datetime?.format):null;break;case"image":case"file":a[d]?.fileList?.length&&(p=a[d].fileList.filter(l=>l.percent===100).map(l=>({...l.response,name:l.name,type:l.type,size:l.size})));break;default:p=a[d]}r.transformFieldValue&&(p=r.transformFieldValue(d,p,b)),s[d]=p}let o=s;return r.transformSubmitValues&&(o=r.transformSubmitValues(o,Array.from(t.values()),n)),(r.parseRelatedDataTemplates??Ve)(o,n??{})},[t,e,n,r])}}const Be=c.forwardRef(({formConfig:e,formInstance:t,relatedData:n,uploadUrl:r,uploadResourceUrl:i,submitTrackingUrl:a,onBeforeSubmit:s,onSubmitSuccess:o,onSubmitError:m,isRedirectAfterCreate:d,onRedirect:b,size:p="middle",manualSubmit:l=!1,onValuesChange:h,readOnly:y=!1,submitDebounceMs:f,gutter:_=[8,0],defaultColSpan:w=12,submitButtonLabel:v},g)=>{const{message:A}=S.App.useApp(),F=D(),{i18n:x,client:R,parsers:k,redirectHandler:V,renderers:G,transformers:P}=F,I=r??i,Y=f??F.submitDebounceMs,E=v??x.messages.submit,{fieldGroups:M,fieldByCode:re,initialValues:B}=Ue(e),{fieldStates:T,setFieldState:N}=Ge(M),{buildProcessedValues:J}=Ie({formInstance:t,fieldByCode:re,relatedData:n,transformers:P}),Q=c.useRef(!1),[he,ye]=c.useState(!1),[be,_e]=c.useState(!1);c.useEffect(()=>{if(Object.keys(B).length>0){const j=P.normalizeInitialValues?P.normalizeInitialValues(B,M):B;t.setFieldsValue(j)}},[M,t,B,P]);const X=c.useCallback(async()=>{if(!Q.current){Q.current=!0,ye(!0);try{let j=await J();try{a&&(_e(!0),await R.request({method:"POST",url:a,data:j}));const C=await s?.(j);if(C===!1)return;C&&typeof C=="object"&&(j=C)}catch(C){console.error(C);return}finally{_e(!1)}const O=await R.request({method:e.method,url:e.action,data:j});t.resetFields(M.filter(C=>!C.is_hidden).map(C=>C.code));const W=k.submitResponse(O.data);d&&W.redirectUrl&&(b??V)(W.redirectUrl,"_blank"),o?.({values:j,response:O.data,data:W.data??O.data})}catch(j){const O=j;A.error(O?.response?.data?.message??x.messages.submitError),m?.(j)}finally{Q.current=!1,ye(!1)}}},[J,R,M,e.action,e.method,t,x.messages.submitError,d,A,s,b,m,o,k,V,a]);c.useImperativeHandle(g,()=>({submit:X,getProcessedValues:J,isSubmitting:()=>Q.current}),[J,X]);const ve=c.useMemo(()=>ne(()=>{X()},Y),[X,Y]),Qe=c.useCallback((j,O)=>{Object.keys(j).forEach(W=>{const C=dt(W,M,t.getFieldsValue());C.length>0&&t.resetFields(C)}),h?.(j,O)},[M,t,h]),we=c.useCallback(j=>u.jsx(Le,{group:j,formInstance:t,fieldState:T[j.code],setFieldState:N,uploadUrl:I,readOnly:y,size:p},j.id),[T,t,y,I,N,p]),Xe=G.layout?G.layout({fieldGroups:M,fieldStates:T,renderField:we,gutter:_,defaultColSpan:w,size:p}):u.jsx(qe,{fieldGroups:M,fieldStates:T,renderField:we,gutter:_,defaultColSpan:w,size:p}),Ze=!l&&!y&&(G.submitActions?G.submitActions({onSubmit:ve,loading:he||be,label:E}):u.jsx(S.Flex,{justify:"flex-end",children:u.jsx(S.Button,{type:"primary",onClick:ve,loading:he||be,children:E})}));return u.jsxs(S.Form,{layout:"vertical",form:t,size:p,onValuesChange:Qe,children:[Xe,Ze]})});Be.displayName="DynamicForm";function oe(e){if(!e)return;const{mode:t}=e;if(t==="api"&&e.api?.url)return e.api;if(t==="api_ids"&&e.api_ids?.url){const n=e.api_ids,r=n.method?.toUpperCase()==="POST";return{url:n.url,method:n.method,data_path:n.data_path,mapping_attr:n.mapping_attr,link:n.link,result_type:n.result_type??"array",params:n.params??(!r&&!n.data?{ids:"{{value}}"}:void 0),data:n.data??(r&&!n.params?{ids:"{{value}}"}:void 0)}}if(t==="api_detail"&&e.api_detail?.url){const n=e.api_detail;return{url:n.url,method:n.method,data_path:n.data_path,mapping_attr:n.mapping_attr,link:n.link,result_type:n.result_type??"object",url_template:n.url_template??!0,params:n.params,data:n.data}}}function Se(e){return{value:e,id:e}}function We(e,t){const n=t.method||"GET",r=n.toUpperCase()==="GET";if(t.url_template)return(Array.isArray(e)?e.filter(m=>m!=null&&m!==""):e!=null&&e!==""?[e]:[]).map(m=>{const d=Se(m),b=z(t.url,d),p=t.params?L(t.params,d):void 0,l=t.data?L(t.data,d):void 0;return{method:n,url:b,params:r?p:void 0,data:r?void 0:l}});const i=Se(e),a=t.params?L(t.params,i):void 0,s=t.data?L(t.data,i):void 0;return[{method:n,url:t.url,params:r?a:void 0,data:r?void 0:s}]}function le(e,t){const n=t.data_path?U(e,t.data_path):e;return(t.result_type??(Array.isArray(n)?"array":"object"))==="array"?Array.isArray(n)?n:n!=null?[n]:[]:Array.isArray(n)?n.length?[n[0]]:[]:n&&typeof n=="object"?[n]:[]}function ce(e,t){return _t(e,t.mapping_attr)}function de(e,t){return vt(t.link,e)}async function Ke(e,t,n,r){const i=We(e,t);if(!i.length)return[];const a=await Promise.all(i.map(o=>n({...o,signal:r}))),s=[];for(const o of a)s.push(...le(o.data,t));return s}function q(e){return!!(e==null||e===""||Array.isArray(e)&&e.length===0)}function $e(e,t){const n=e.option_config?.api_options?.params,r=e.option_config?.api_options?.data;if(!n&&!r)return;const i=a=>{const s={};for(const o in a)if(typeof a[o]=="string"&&a[o].startsWith("{{")&&a[o].endsWith("}}")){const m=a[o].slice(2,-2).trim();s[o]=t?.[m]}else s[o]=a[o];return s};return{params:n?i(n):void 0,data:r?i(r):void 0}}function ft(e,t){const n=t.option_config?.label_attr,r=t.option_config?.value_attr||"";if(n?.length){const i=n.join(" - ");return e[i]!==void 0?String(e[i]):n.map(a=>e[a]).filter(a=>a!=null&&a!=="").join(" - ")}return String(e[r]??"")}function pt(e,t){if(!t?.length)return null;const r=(Array.isArray(e)?e:[e]).map(i=>t.find(a=>String(a.value)===String(i))?.label).filter(i=>!!i);return r.length?r.join(", "):null}function ht(e,t,n){if(q(e))return null;const r=t.option_config?.value_attr||"value",i=Array.isArray(e)?e:[e];if(t.is_option_api&&n?.length){const s=i.map(o=>{const m=n.find(d=>String(d[r])===String(o));return m?ft(m,t):String(o)}).filter(Boolean);return s.length?s.join(", "):null}const a=pt(e,t.metas);return a||i.map(String).join(", ")}function yt(e,t){if(q(e))return null;const n=t.additional_config?.datetime?.format,r=te(e);return r.isValid()?n?r.format(n):r.format("YYYY-MM-DD HH:mm:ss"):String(e)}function bt(e){if(q(e))return null;if(Array.isArray(e)){const t=e.map(n=>typeof n=="object"&&n&&"name"in n?String(n.name):String(n)).filter(Boolean);return t.length?t.join(", "):null}return String(e)}function _t(e,t){return t?.length?t.map(n=>{const r=U(e,n)??e[n];return r!=null?String(r):""}).filter(Boolean).join(" - "):JSON.stringify(e)}function vt(e,t){return e?e.replace(/\{\{(.+?)\}\}/g,(n,r)=>{const i=r.trim(),a=U(t,i)??t[i];return a!=null?String(a):""}):null}function ae(e,t,n){if(q(e))return null;switch(t?.mode??"formatted"){case"raw":case"formatted":return Array.isArray(e)?e.map(String).join(", "):String(e);case"api":case"api_ids":case"api_detail":{const i=oe(t);if(!n||!i)return Array.isArray(e)?e.map(String).join(", "):String(e);const a=le(n,i);return a.length?a.map(o=>{const m=ce(o,i),d=de(o,i);return d?`${m} (${d})`:m}).filter(Boolean).join(", ")||null:String(e)}default:return String(e)}}function ze(e,t,n){const r=e.additional_config?.view_value;if(r?.mode==="api"||r?.mode==="api_ids"||r?.mode==="api_detail")return ae(t,r,n.viewValueFetched);switch(e.field?.type?.code){case"text":case"number":return q(t)?null:String(t);case"datetime":return yt(t,e);case"select":case"radio":case"checkbox":return ht(t,e,n.optionList);case"image":case"file":return bt(t);default:return r?ae(t,r,n.viewValueFetched):q(t)?null:String(t)}}const ee=new Map,wt=3e4;function gt(e){const t=ee.get(e);if(t){if(Date.now()>t.expiresAt){ee.delete(e);return}return t.error}}function xe(e,t){ee.set(e,{error:t,expiresAt:Date.now()+wt})}function H(e,t,n=!0){const r=D(),[i,a]=c.useState(),[s,o]=c.useState(!1),[m,d]=c.useState(),b=c.useRef(t),p=c.useRef(r);b.current=t,p.current=r;const l=K(e);return c.useEffect(()=>{if(!n){a(void 0),d(void 0),o(!1);return}const y=gt(l);if(y!==void 0){d(y),o(!1);return}const f=new AbortController;return o(!0),d(void 0),(async()=>{try{const w=await $(p.current,"viewCache",l,v=>b.current(v),f.signal);f.signal.aborted||(a(w),d(void 0))}catch(w){f.signal.aborted||(xe(l,w),d(w))}finally{f.signal.aborted||o(!1)}})(),()=>f.abort()},[n,l]),{data:i,isLoading:s,error:m,refetch:async()=>{if(ee.delete(l),!n)return;const y=new AbortController;o(!0),d(void 0);try{const f=await $(p.current,"viewCache",l,_=>b.current(_),y.signal);return a(f),f}catch(f){throw xe(l,f),d(f),f}finally{o(!1)}}}}const St=({value:e,code:t,modeConfig:n})=>{const{client:r,renderers:i,i18n:a}=D(),s=c.useMemo(()=>(Array.isArray(e)?e:[e]).filter(Boolean),[e]),{data:o,isLoading:m,error:d}=H(["api_detail",t,s,n?.url,n?.method],async l=>(await Promise.all(s.map(async y=>{const f=z(n?.url||"",{id:y});return(await r.request({method:n?.method,url:f,signal:l})).data}))).filter(Boolean),!!(s.length&&n?.url)),b=(l,h,y)=>i.link?i.link({url:l,label:h,data:y}):u.jsx("a",{href:l,target:"_blank",rel:"noreferrer",children:h}),p=l=>{const h=n?.mapping_attr?.map(y=>l?.[y]).join(" - ");if(n?.link){const y=z(n.link,l);return b(y,h,l)}return h};return m?u.jsx(u.Fragment,{children:i.viewLoading?.()??u.jsx(S.Spin,{size:"small"})}):d?u.jsx(u.Fragment,{children:i.viewError?.(d)??a.messages.viewError}):o?.length?u.jsx(u.Fragment,{children:o.map((l,h)=>u.jsx("div",{children:p(l)},h))}):u.jsx(u.Fragment,{children:i.viewEmpty?.()??a.messages.viewEmpty})},ue=c.memo(St),xt=({value:e,code:t,modeConfig:n})=>{const{client:r,renderers:i,i18n:a}=D(),{data:s,isLoading:o,error:m}=H(["api_ids",t,e,n?.url,n?.method],async p=>{const l=n?.method||"GET",h=l.toUpperCase()==="POST",y=Array.isArray(e)?e:[e],_=(await r.request({method:l,url:n?.url||"",data:h?{ids:y}:void 0,params:h?void 0:{ids:y},signal:p})).data,w=n?.data_path?U(_,n.data_path):_;return Array.isArray(w)?w:_},!!(e&&n?.url)),d=(p,l,h)=>i.link?i.link({url:p,label:l,data:h}):u.jsx("a",{href:p,target:"_blank",rel:"noreferrer",children:l}),b=p=>{const l=n?.mapping_attr?.map(h=>p?.[h]).join(" - ");if(n?.link){const h=z(n.link,p);return d(h,l,p)}return l};return o?u.jsx(u.Fragment,{children:i.viewLoading?.()??u.jsx(S.Spin,{size:"small"})}):m?u.jsx(u.Fragment,{children:i.viewError?.(m)??a.messages.viewError}):s?Array.isArray(e)?u.jsx(S.Flex,{vertical:!0,children:(Array.isArray(s)?s:[s]).map((p,l)=>u.jsx("div",{children:b(p)},p.id??l))}):b(Array.isArray(s)?s[0]:s):u.jsx(u.Fragment,{children:i.viewEmpty?.()??a.messages.viewEmpty})},me=c.memo(xt),Ft=({value:e,code:t,modeConfig:n,viewConfig:r})=>{const{client:i,renderers:a,i18n:s}=D(),o=c.useMemo(()=>n??(r?oe(r):void 0),[n,r]),m=c.useMemo(()=>["api_view",t,e,o?.url,o?.method,o?.data_path],[t,e,o?.url,o?.method,o?.data_path]),d=c.useCallback(async f=>o?Ke(e,o,_=>i.request({..._,signal:f})):[],[i,o,e]),{data:b,isLoading:p,error:l}=H(m,d,!!(e&&o?.url)),h=(f,_,w)=>a.link?a.link({url:f,label:_,data:w}):u.jsx("a",{href:f,target:"_blank",rel:"noreferrer",children:_}),y=(f,_)=>{if(!o)return null;const w=ce(f,o),v=de(f,o),g=v?h(v,w,f):w;return u.jsx("div",{children:g},f.id??_)};return p?u.jsx(u.Fragment,{children:a.viewLoading?.()??u.jsx(S.Spin,{size:"small"})}):l?u.jsx(u.Fragment,{children:a.viewError?.(l)??s.messages.viewError}):b?.length?o?.result_type==="object"&&b.length===1?y(b[0],0):u.jsx(S.Flex,{vertical:!0,children:b.map(y)}):u.jsx(u.Fragment,{children:a.viewEmpty?.()??s.messages.viewEmpty})},fe=c.memo(Ft);function At(e){return!!(e.option_config&&e.is_option_api)}function jt(e,t){const n=D(),r=K(["viewModeOptions",e.map(a=>a.code),t]),{data:i}=H([r],async a=>{const s={};return await Promise.all(e.map(async o=>{if(!o.option_config?.url)return;const m=$e(o,t),d=o.option_config.method?.toUpperCase()==="GET"||!o.option_config.method,b=await n.client.request({method:o.option_config.method||"GET",url:o.option_config.url,params:d?m?.params:void 0,data:d?void 0:m?.data,signal:a});s[o.code]={optionList:n.parsers.optionResponse(b.data,o)}})),s},e.length>0);return i??{}}const kt=({formConfig:e,formValues:t})=>{const n=e?.form?.field_groups??[],r=c.useMemo(()=>n.filter(At),[n]),i=jt(r,t);return c.useMemo(()=>n.filter(s=>!s.is_hidden).map(s=>{const o=t?.[s.code],m=s.additional_config?.view_value,d=m?.mode;if(d==="api"&&m)return{key:s.code,label:s.label,rawValue:o,viewValue:u.jsx(fe,{code:s.code,value:o,viewConfig:m}),field_group:s};if(d==="api_ids"&&m?.api_ids)return{key:s.code,label:s.label,rawValue:o,viewValue:u.jsx(me,{code:s.code,value:o,modeConfig:m.api_ids}),field_group:s};if(d==="api_detail"&&m?.api_detail)return{key:s.code,label:s.label,rawValue:o,viewValue:u.jsx(ue,{code:s.code,value:o,modeConfig:m.api_detail}),field_group:s};const b=i[s.code]??{};return{key:s.code,label:s.label,rawValue:o,viewValue:ze(s,o,b),field_group:s}}),[i,n,t])},Rt=({code:e,value:t,fieldGroup:n})=>{const r=n?.additional_config?.view_value;switch(r?.mode){case"raw":return t;case"api":return u.jsx(fe,{code:e,value:t,viewConfig:r});case"api_ids":{const i=r?.api_ids;return u.jsx(me,{code:e,value:t,modeConfig:i})}case"api_detail":{const i=r?.api_detail;return u.jsx(ue,{code:e,value:t,modeConfig:i})}default:return t}},Et=c.memo(Rt),pe={submit:"Save",submitError:"Failed to submit form",inputPlaceholder:e=>`Enter ${e}`,selectPlaceholder:e=>`Select ${e}`,optionLoading:"Loading...",optionError:"Failed to load options",uploadError:"Upload failed",viewLoading:"Loading...",viewEmpty:"-",viewError:"Failed to load"},Ct={messages:pe},He=e=>{if(Array.isArray(e))return e;if(e&&typeof e=="object"&&"items"in e&&Array.isArray(e.items))return e.items;if(e&&typeof e=="object"&&"data"in e&&e.data&&typeof e.data=="object"&&"items"in(e.data??{})){const t=e.data;return Array.isArray(t.items)?t.items:[]}return[]},Ye=e=>({redirectUrl:e?.redirect_after_create,data:e}),Ne=(e,t)=>t?.dataPath?U(e,t.dataPath):e,Z={optionResponse:He,submitResponse:Ye,viewResponse:Ne},Je=(e,t="_blank")=>{window.open(e,t)},ie={upload:async()=>{throw new Error("Upload adapter is not configured")},remove:async()=>!1};function Mt({children:e,client:t,upload:n,i18n:r,parsers:i,renderers:a={},transformers:s={},cache:o,submitDebounceMs:m=200,redirectHandler:d,requestClient:b,uploadAdapter:p,deleteUploadAdapter:l,messages:h,optionResponseParser:y,customFieldRenderers:f}){const _=c.useRef(new Map),w=c.useRef(new Map),v=c.useMemo(()=>{const g=t??{request:b??(()=>{throw new Error("DynamicFormProvider requires client or requestClient")})},A=f?Object.entries(f).map(([R,k])=>({match:R,render:k})):[],F={...pe,...r?.messages,...h},x={...ie,...n,upload:n?.upload??p??ie.upload,remove:n?.remove??(l?R=>l(R.path):ie.remove)};return{client:g,upload:x,i18n:{messages:F},parsers:{optionResponse:i?.optionResponse??y??Z.optionResponse,submitResponse:i?.submitResponse??Z.submitResponse,viewResponse:i?.viewResponse??Z.viewResponse},renderers:{...a,fields:[...a.fields??[],...A]},transformers:s,cache:{enabled:o?.enabled??!0,ttlMs:o?.ttlMs??6e4},submitDebounceMs:m,redirectHandler:d??Je,optionCache:_.current,viewCache:w.current}},[t,b,n,p,l,r?.messages,h,i?.optionResponse,i?.submitResponse,i?.viewResponse,y,a,f,s,o?.enabled,o?.ttlMs,m,d]);return u.jsx(se.Provider,{value:v,children:e})}function Dt(e){return{request:async t=>({data:(await e({method:t.method,url:t.url,params:t.params,data:t.data,signal:t.signal,headers:t.headers,onUploadProgress:t.onUploadProgress})).data})}}exports.ApiDetailItem=ue;exports.ApiItem=me;exports.ApiViewItem=fe;exports.DefaultLayout=qe;exports.DynamicForm=Be;exports.DynamicFormProvider=Mt;exports.FormItem=Le;exports.MetaItemValue=Et;exports.buildApiViewRequests=We;exports.buildCacheKey=K;exports.cachedRequest=$;exports.createAxiosDynamicFormClient=Dt;exports.debounce=ne;exports.defaultI18n=Ct;exports.defaultMessages=pe;exports.defaultOptionResponseParser=He;exports.defaultParsers=Z;exports.defaultRedirectHandler=Je;exports.defaultSubmitResponseParser=Ye;exports.defaultViewResponseParser=Ne;exports.extractDependencyFields=Pe;exports.extractViewData=le;exports.fetchApiViewItems=Ke;exports.fillTemplate=z;exports.getByPath=U;exports.getCached=Me;exports.getMappedLabel=ce;exports.getMappedLink=de;exports.isEmptyValue=q;exports.mapOptionToSelectItem=ke;exports.mapOptions=Re;exports.normalizeApiViewConfig=oe;exports.normalizeMetaForForm=ct;exports.parseFormValues=Ve;exports.replaceTemplateInObject=L;exports.resolveApiOptionMeta=$e;exports.resolveFieldRenderer=Ae;exports.resolveFieldRendererFromMap=je;exports.resolveFieldViewValue=ze;exports.resolveViewValueConfig=ae;exports.setCache=De;exports.useCachedViewRequest=H;exports.useDependencyValues=Te;exports.useDynamicField=Ce;exports.useDynamicFormContext=D;exports.useDynamicFormContextOptional=et;exports.useDynamicOptions=Oe;exports.useFieldGroups=Ue;exports.useFieldStates=Ge;exports.useProcessedValues=Ie;exports.useViewMode=kt;