jingrow/apps/jingrow/frontend/dist/assets/SchemaFormRenderer-f7be2793.js

2 lines
18 KiB
JavaScript

import{r as G,M as we,c as T,aG as ze,aU as Pe,l as o,e as i,f as l,p as $,F as y,C as g,Y as C,g as h,a1 as Ae,a4 as Y,aa as H,y as A,J as Je}from"./index-7b482730.js";import{g as Ue}from"./nodes-1118f3b4.js";import{_ as Ge}from"./_plugin-vue_export-helper-c27b6911.js";const Ye={class:"schema-form-renderer"},He={key:0,class:"error-state"},Qe={key:1},Xe={key:0,class:"schema-with-layout"},Ze={class:"schema-tabs"},Ve={class:"tab-header"},We={class:"tabs"},Ke=["onClick"],Ne={class:"section-header"},Ie={class:"section-title"},et={class:"section-content"},tt={class:"section-columns"},nt={key:0,class:"column-header"},st={class:"column-label"},at={class:"column-fields"},rt=["for"],lt={key:0,class:"required"},ot=["id","value","onChange"],it=["value"],ut={key:1,class:"info-display-field"},ct={class:"info-box"},vt=["id","value","placeholder","maxlength","onInput"],ht=["id","value","rows","placeholder","maxlength","onInput"],mt=["id","value","min","max","step","onInput"],dt={key:5,class:"checkbox-wrapper"},ft=["id","checked","onChange"],_t=["for"],yt={key:6,class:"object-field-container"},gt={class:"object-field-header"},bt=["onClick"],kt={class:"object-field-content"},pt={class:"property-value"},Ct={class:"field-group"},wt=["value","onChange"],At=["value"],Ft={class:"field-group"},Ot={class:"field-input-group"},St=["value","onInput"],xt=["onChange"],jt=["value","title"],$t={class:"property-actions"},Et=["onClick"],Rt={key:0,class:"empty-state"},Lt={key:7,class:"array-field-container"},Tt={class:"array-field-header"},qt={class:"array-field-title"},Dt=["onClick"],Mt={class:"array-field-content"},Bt={class:"item-fields"},zt={class:"field-label-sm"},Pt=["value","onChange"],Jt=["value"],Ut=["value","onInput","placeholder"],Gt={class:"item-actions"},Yt=["onClick"],Ht={key:0,class:"empty-state"},Qt={key:8,class:"unsupported-field"},Xt={class:"text-muted"},Zt={key:9,class:"field-error"},Vt={key:10,class:"field-description"},Wt={key:1,class:"schema-simple"},Kt={for:"fieldName}"},Nt={key:0,class:"required"},It=["id","value","onChange"],en=["value"],tn={key:1,class:"info-display-field"},nn={class:"info-box"},sn=["id","value","placeholder","maxlength","onInput"],an=["id","value","rows","placeholder","maxlength","onInput"],rn=["id","value","min","max","step","onInput"],ln={key:5,class:"checkbox-wrapper"},on=["id","checked","onChange"],un=["for"],cn={key:6,class:"unsupported-field"},vn={class:"text-muted"},hn={key:7,class:"field-error"},mn={key:8,class:"field-description"},dn={__name:"SchemaFormRenderer",props:{schema:{type:Object,required:!0,validator:f=>f&&typeof f=="object"&&f.properties},modelValue:{type:Object,default:()=>({}),validator:f=>f===null||typeof f=="object"},flowStore:{type:Object,required:!0}},emits:["update:modelValue","error"],setup(f,{emit:Fe}){const _=f,E=Fe,u=G({}),q=G(!1),R=G(!1);function D(s,e){if(s===e)return!0;if(s==null||e==null||typeof s!=typeof e)return!1;if(typeof s!="object")return s===e;const r=Object.keys(s),t=Object.keys(e);if(r.length!==t.length)return!1;for(let a of r)if(!t.includes(a)||!D(s[a],e[a]))return!1;return!0}function M(s){if(s===null||typeof s!="object")return s;try{return JSON.parse(JSON.stringify(s))}catch(e){return console.warn("[SchemaFormRenderer] 数据克隆失败,使用浅拷贝:",e),{...s}}}function k(s,e){const r={...u.value,[s]:e};u.value=r}function Oe(s){const e="input_"+Date.now(),t={...u.value[s]||{},[e]:{from:"",field:""}};u.value={...u.value,[s]:t}}function Se(){try{return _.flowStore.nodes.map(s=>{var e;return{id:s.id,label:((e=s.data)==null?void 0:e.label)||s.id,type:s.type}})}catch(s){return console.warn("[SchemaFormRenderer] 获取节点列表失败:",s),[]}}function xe(s,e){const t={...u.value[s]||{}};delete t[e],u.value={...u.value,[s]:t}}function B(s,e,r,t){const a=u.value[s]||{},v=a[e]||{},n={...a,[e]:{...v,[r]:t}};u.value={...u.value,[s]:n}}function Q(s){var r,t,a;const e=c.value[s];return e?(r=e.title)!=null&&r.includes("过滤")||(t=e.title)!=null&&t.includes("条件")?"过滤条件":(a=e.title)!=null&&a.includes("映射")?"映射配置":e.title||"配置项":"配置项"}function X(s){var r,t,a;const e=c.value[s];return e?(r=e.title)!=null&&r.includes("过滤")||(t=e.title)!=null&&t.includes("条件")?"添加条件":(a=e.title)!=null&&a.includes("映射")?"添加映射":"添加项":"添加项"}function je(s){var v;const e=u.value[s]||[],r=c.value[s];let t={};(v=r==null?void 0:r.items)!=null&&v.properties?Object.keys(r.items.properties).forEach(n=>{const w=r.items.properties[n];t[n]=w.default!==void 0?w.default:""}):t={};const a=[...e,t];u.value={...u.value,[s]:a}}function $e(s,e){const t=(u.value[s]||[]).filter((a,v)=>v!==e);u.value={...u.value,[s]:t}}function Z(s,e,r,t){const v=[...u.value[s]||[]];v[e]&&(v[e]={...v[e],[r]:t}),u.value={...u.value,[s]:v}}function L(s){if(!s||typeof s!="object")return console.warn("[SchemaFormRenderer] 无效的属性定义:",s),null;if(s.default!==void 0)return s.default;switch(s.type){case"string":return"";case"number":case"integer":return s.minimum||0;case"boolean":return!1;case"array":return[];case"object":return{};default:return null}}function p(s,e){if(!e)return!0;try{switch(e.type){case"string":if(e.minLength&&s.length<e.minLength||e.maxLength&&s.length>e.maxLength||e.pattern&&!new RegExp(e.pattern).test(s))return!1;break;case"number":case"integer":if(e.minimum!==void 0&&s<e.minimum||e.maximum!==void 0&&s>e.maximum)return!1;break}return!0}catch(r){return console.warn("[SchemaFormRenderer] 字段验证错误:",r),!0}}function Ee(){if(!_.schema){console.warn("[SchemaFormRenderer] Schema无效");return}try{const s=M(_.modelValue||{});_.schema.properties&&Object.entries(_.schema.properties).forEach(([e,r])=>{s[e]===void 0&&(s[e]=L(r))}),Object.entries(J.value).forEach(([e,r])=>{s[e]===void 0&&(s[e]=L(r))}),u.value=s,R.value=!0}catch(s){console.error("[SchemaFormRenderer] 初始化失败:",s),E("error",{type:"initialization",message:s.message})}}const z=we(()=>_.modelValue,(s,e)=>{var r;if(R.value&&!D(s,e))try{q.value=!0,u.value=M(s||{}),(r=_.schema)!=null&&r.properties&&Object.entries(_.schema.properties).forEach(([t,a])=>{u.value[t]===void 0&&(u.value[t]=L(a))}),Object.entries(J.value).forEach(([t,a])=>{u.value[t]===void 0&&(u.value[t]=L(a))}),Je(()=>{q.value=!1})}catch(t){console.error("[SchemaFormRenderer] Props更新失败:",t),E("error",{type:"props-update",message:t.message})}},{deep:!0}),P=we(u,(s,e)=>{if(R.value&&!q.value&&!D(s,e))try{E("update:modelValue",M(s))}catch(r){console.error("[SchemaFormRenderer] 数据更新失败:",r),E("error",{type:"data-update",message:r.message})}},{deep:!0}),J=T(()=>{var e;if(!((e=_.schema)!=null&&e.allOf))return{};const s={};try{_.schema.allOf.forEach(r=>{if(r.if&&r.then){const t=Re(r.if);r.then.properties&&Object.entries(r.then.properties).forEach(([a,v])=>{s[a]={...v,_condition:t}})}})}catch(r){console.warn("[SchemaFormRenderer] allOf 解析错误:",r)}return s});function Re(s){const e={};return s.properties&&Object.entries(s.properties).forEach(([r,t])=>{t.const!==void 0?e[r]=t.const:t.enum&&t.enum.length===1?e[r]=t.enum[0]:Array.isArray(t.enum)&&(e[r]=t.enum)}),e}function Le(s,e){return!s||Object.keys(s).length===0?!0:Object.entries(s).every(([r,t])=>{const a=e[r];return Array.isArray(t)?t.includes(a):a===t})}function Te(s,e){return!s||Object.keys(s).length===0?!0:Object.entries(s).every(([r,t])=>{const a=e[r];return typeof t=="object"&&t!==null&&!Array.isArray(t)?t.$ne!==void 0?Array.isArray(t.$ne)?!t.$ne.includes(a):a!==t.$ne:t.$in!==void 0?Array.isArray(t.$in)&&t.$in.includes(a):t.$nin!==void 0?Array.isArray(t.$nin)&&!t.$nin.includes(a):t.not!==void 0?Array.isArray(t.not)?!t.not.includes(a):a!==t.not:t["!="]!==void 0?Array.isArray(t["!="])?!t["!="].includes(a):a!==t["!="]:t.in!==void 0?Array.isArray(t.in)&&t.in.includes(a):t["!in"]!==void 0?Array.isArray(t["!in"])&&!t["!in"].includes(a):!0:Array.isArray(t)?t.includes(a):a===t})}function qe(s){var e;(e=_.schema)!=null&&e._layout&&(_.schema._layout.activeTab=s)}const c=T(()=>{var r;const s=((r=_.schema)==null?void 0:r.properties)||{},e=J.value;return{...s,...e}}),U=T(()=>(s,e)=>{try{return!(e.condition&&!Te(e.condition,u.value)||e._condition&&!Le(e._condition,u.value))}catch{return!0}}),De=T(()=>{var e,r;const s={};return(r=(e=_.schema)==null?void 0:e._layout)!=null&&r.tabs&&_.schema._layout.tabs.forEach(t=>{var a;(a=t.sections)==null||a.forEach(v=>{var n;s[v.id]=((n=v.columns)==null?void 0:n.some(w=>{var F;return(F=w.fields)==null?void 0:F.some(j=>U.value(j,c.value[j]))}))||!1})}),s});ze(()=>{R.value||Ee()}),Pe(()=>{z==null||z(),P==null||P()});async function Me(s){try{const e=_.flowStore.nodes.find(t=>t.id===s);if(!e)return[];const r=e.type;return await Ue(r)}catch(e){return console.warn("[SchemaFormRenderer] 获取节点字段失败:",e),[]}}return(s,e)=>{var r;return o(),i("div",Ye,[(r=f.schema)!=null&&r.properties?(o(),i("div",Qe,[f.schema._layout&&f.schema._layout.tabs?(o(),i("div",Xe,[l("div",Ze,[l("div",Ve,[l("div",We,[(o(!0),i(y,null,g(f.schema._layout.tabs,t=>(o(),i("div",{key:t.id,class:C(["tab",f.schema._layout.activeTab===t.id?"active":""]),onClick:a=>qe(t.id)},h(t.label),11,Ke))),128))])])]),(o(!0),i(y,null,g(f.schema._layout.tabs,t=>(o(),i("div",{key:t.id,class:C(["tab-content",{active:f.schema._layout.activeTab===t.id}]),style:Ae({display:f.schema._layout.activeTab===t.id?"block":"none"})},[(o(!0),i(y,null,g(t.sections,a=>Y((o(),i("div",{key:a.id,class:"schema-section"},[l("div",Ne,[l("h6",Ie,h(a.label),1)]),l("div",et,[l("div",tt,[(o(!0),i(y,null,g(a.columns,v=>(o(),i("div",{key:v.id,class:"section-column",style:Ae({flex:v.fields.length>0?"1":"auto"})},[v.label?(o(),i("div",nt,[l("span",st,h(v.label),1)])):A("",!0),l("div",at,[(o(!0),i(y,null,g(v.fields,n=>{var w,F,j,V,W,K,N,I,ee,te,ne,se,ae,re,le,oe,ie,ue,ce,ve,he,me,de,fe,_e,ye,ge,be,ke;return Y((o(),i("div",{key:n,class:"form-group"},[l("label",{for:`field-${n}`},[$(h(((w=c.value[n])==null?void 0:w.title)||n)+" ",1),(F=c.value[n])!=null&&F.required||(j=f.schema.required)!=null&&j.includes(n)?(o(),i("span",lt,"*")):A("",!0)],8,rt),((V=c.value[n])==null?void 0:V.type)==="string"&&((W=c.value[n])!=null&&W.enum)?(o(),i("select",{key:0,id:"field-"+n,value:u.value[n],class:C({"is-invalid":!p(u.value[n],c.value[n])}),onChange:m=>k(n,m.target.value)},[e[1]||(e[1]=l("option",{value:""},"请选择...",-1)),(o(!0),i(y,null,g(c.value[n].enum,(m,b)=>{var d;return o(),i("option",{key:m,value:m},h(((d=c.value[n].enumNames)==null?void 0:d[b])||m),9,it)}),128))],42,ot)):((K=c.value[n])==null?void 0:K.type)==="string"&&((N=c.value[n])==null?void 0:N.format)==="info"?(o(),i("div",ut,[l("div",ct,[e[2]||(e[2]=l("i",{class:"fa fa-info-circle"},null,-1)),l("span",null,h(u.value[n]||((I=c.value[n])==null?void 0:I.default)||""),1)])])):((ee=c.value[n])==null?void 0:ee.type)==="string"&&((te=c.value[n])==null?void 0:te.format)!=="textarea"?(o(),i("input",{key:2,id:"field-"+n,value:u.value[n],type:"text",placeholder:((ne=c.value[n])==null?void 0:ne.placeholder)||"",maxlength:(se=c.value[n])==null?void 0:se.maxLength,class:C({"is-invalid":!p(u.value[n],c.value[n])}),onInput:m=>k(n,m.target.value)},null,42,vt)):((ae=c.value[n])==null?void 0:ae.type)==="string"&&((re=c.value[n])==null?void 0:re.format)==="textarea"?(o(),i("textarea",{key:3,id:"field-"+n,value:u.value[n],rows:((le=c.value[n])==null?void 0:le.rows)||3,placeholder:((oe=c.value[n])==null?void 0:oe.placeholder)||"",maxlength:(ie=c.value[n])==null?void 0:ie.maxLength,class:C({"is-invalid":!p(u.value[n],c.value[n])}),onInput:m=>k(n,m.target.value)},null,42,ht)):((ue=c.value[n])==null?void 0:ue.type)==="number"||((ce=c.value[n])==null?void 0:ce.type)==="integer"?(o(),i("input",{key:4,id:"field-"+n,value:u.value[n],type:"number",min:(ve=c.value[n])==null?void 0:ve.minimum,max:(he=c.value[n])==null?void 0:he.maximum,step:((me=c.value[n])==null?void 0:me.type)==="integer"?1:((de=c.value[n])==null?void 0:de.step)||.1,class:C({"is-invalid":!p(u.value[n],c.value[n])}),onInput:m=>k(n,parseFloat(m.target.value)||0)},null,42,mt)):((fe=c.value[n])==null?void 0:fe.type)==="boolean"?(o(),i("div",dt,[l("input",{id:"field-"+n,checked:u.value[n],type:"checkbox",class:"checkbox-input",onChange:m=>k(n,m.target.checked)},null,40,ft),l("label",{for:"field-"+n,class:"checkbox-label"},h(((_e=c.value[n])==null?void 0:_e.checkboxLabel)||"启用"),9,_t)])):((ye=c.value[n])==null?void 0:ye.type)==="object"?(o(),i("div",yt,[l("div",gt,[e[4]||(e[4]=l("span",{class:"object-field-title"},"动态属性配置",-1)),l("button",{type:"button",class:"btn btn-sm btn-outline-primary",onClick:m=>Oe(n)},[...e[3]||(e[3]=[l("i",{class:"fa fa-plus"},null,-1),$(" 添加属性 ",-1)])],8,bt)]),l("div",kt,[(o(!0),i(y,null,g(u.value[n]||{},(m,b)=>(o(),i("div",{key:b,class:"object-property"},[l("div",pt,[l("div",Ct,[e[6]||(e[6]=l("label",{class:"field-label-sm"},"节点ID",-1)),l("select",{class:"form-control form-control-sm",value:m.from||"",onChange:d=>B(n,b,"from",d.target.value)},[e[5]||(e[5]=l("option",{value:""},"请选择节点",-1)),(o(!0),i(y,null,g(Se(),d=>(o(),i("option",{key:d.id,value:d.id},h(d.label),9,At))),128))],40,wt)]),l("div",Ft,[e[8]||(e[8]=l("label",{class:"field-label-sm"},"字段名",-1)),l("div",Ot,[l("input",{type:"text",class:"form-control form-control-sm",value:m.field||"",onInput:d=>B(n,b,"field",d.target.value),placeholder:"输入或选择字段名"},null,40,St),l("select",{class:"form-control form-control-sm field-select",onChange:d=>B(n,b,"field",d.target.value)},[e[7]||(e[7]=l("option",{value:""},"选择字段",-1)),(o(!0),i(y,null,g(Me(m.from),d=>(o(),i("option",{key:d.name,value:d.name,title:d.label},h(d.label),9,jt))),128))],40,xt)])])]),l("div",$t,[l("button",{type:"button",class:"btn btn-sm btn-outline-danger",onClick:d=>xe(n,b)},[...e[9]||(e[9]=[l("i",{class:"fa fa-trash"},null,-1)])],8,Et)])]))),128)),!u.value[n]||Object.keys(u.value[n]).length===0?(o(),i("div",Rt,[...e[10]||(e[10]=[l("i",{class:"fa fa-info-circle"},null,-1),l("span",null,'暂无配置项,点击"添加属性"开始配置',-1)])])):A("",!0)])])):((ge=c.value[n])==null?void 0:ge.type)==="array"?(o(),i("div",Lt,[l("div",Tt,[l("span",qt,h(Q(n)),1),l("button",{type:"button",class:"btn btn-sm btn-outline-primary",onClick:m=>je(n)},[e[11]||(e[11]=l("i",{class:"fa fa-plus"},null,-1)),$(" "+h(X(n)),1)],8,Dt)]),l("div",Mt,[(o(!0),i(y,null,g(u.value[n]||[],(m,b)=>{var d,pe;return o(),i("div",{key:b,class:"array-item"},[l("div",Bt,[(o(!0),i(y,null,g((pe=(d=c.value[n])==null?void 0:d.items)==null?void 0:pe.properties,(O,x)=>(o(),i("div",{key:x,class:"field-group"},[l("label",zt,h(O.title||x),1),O.type==="string"&&O.enum?(o(),i("select",{key:0,class:"form-control form-control-sm",value:m[x]||O.default||"",onChange:S=>Z(n,b,x,S.target.value)},[e[12]||(e[12]=l("option",{value:""},"请选择...",-1)),(o(!0),i(y,null,g(O.enum,(S,Be)=>{var Ce;return o(),i("option",{key:S,value:S},h(((Ce=O.enumNames)==null?void 0:Ce[Be])||S),9,Jt)}),128))],40,Pt)):(o(),i("input",{key:1,type:"text",class:"form-control form-control-sm",value:m[x]||"",onInput:S=>Z(n,b,x,S.target.value),placeholder:O.description||""},null,40,Ut))]))),128))]),l("div",Gt,[l("button",{type:"button",class:"btn btn-sm btn-outline-danger",onClick:O=>$e(n,b)},[...e[13]||(e[13]=[l("i",{class:"fa fa-trash"},null,-1)])],8,Yt)])])}),128)),!u.value[n]||u.value[n].length===0?(o(),i("div",Ht,[e[14]||(e[14]=l("i",{class:"fa fa-info-circle"},null,-1)),l("span",null,"暂无"+h(Q(n))+',点击"'+h(X(n))+'"开始配置',1)])):A("",!0)])])):(o(),i("div",Qt,[l("span",Xt,"不支持的字段类型: "+h((be=c.value[n])==null?void 0:be.type),1)])),p(u.value[n],c.value[n])?A("",!0):(o(),i("div",Zt," 字段值不符合要求 ")),(ke=c.value[n])!=null&&ke.description?(o(),i("div",Vt,h(c.value[n].description),1)):A("",!0)])),[[H,U.value(n,c.value[n])]])}),128))])],4))),128))])])])),[[H,De.value[a.id]]])),128))],6))),128))])):(o(),i("div",Wt,[(o(!0),i(y,null,g(c.value,(t,a)=>{var v;return Y((o(),i("div",{key:a,class:"form-group"},[l("label",Kt,[$(h(t.title||a)+" ",1),t.required||(v=f.schema.required)!=null&&v.includes(a)?(o(),i("span",Nt,"*")):A("",!0)]),t.type==="string"&&t.enum?(o(),i("select",{key:0,id:"field-"+a,value:u.value[a],class:C({"is-invalid":!p(u.value[a],t)}),onChange:n=>k(a,n.target.value)},[e[15]||(e[15]=l("option",{value:""},"请选择...",-1)),(o(!0),i(y,null,g(t.enum,(n,w)=>{var F;return o(),i("option",{key:n,value:n},h(((F=t.enumNames)==null?void 0:F[w])||n),9,en)}),128))],42,It)):t.type==="string"&&t.format==="info"?(o(),i("div",tn,[l("div",nn,[e[16]||(e[16]=l("i",{class:"fa fa-info-circle"},null,-1)),l("span",null,h(u.value[a]||t.default||""),1)])])):t.type==="string"&&t.format!=="textarea"?(o(),i("input",{key:2,id:"field-"+a,value:u.value[a],type:"text",placeholder:t.placeholder||"",maxlength:t.maxLength,class:C({"is-invalid":!p(u.value[a],t)}),onInput:n=>k(a,n.target.value)},null,42,sn)):t.type==="string"&&t.format==="textarea"?(o(),i("textarea",{key:3,id:"field-"+a,value:u.value[a],rows:t.rows||3,placeholder:t.placeholder||"",maxlength:t.maxLength,class:C({"is-invalid":!p(u.value[a],t)}),onInput:n=>k(a,n.target.value)},null,42,an)):t.type==="number"||t.type==="integer"?(o(),i("input",{key:4,id:"field-"+a,value:u.value[a],type:"number",min:t.minimum,max:t.maximum,step:t.type==="integer"?1:t.step||.1,class:C({"is-invalid":!p(u.value[a],t)}),onInput:n=>k(a,parseFloat(n.target.value)||0)},null,42,rn)):t.type==="boolean"?(o(),i("div",ln,[l("input",{id:"field-"+a,checked:u.value[a],type:"checkbox",class:"checkbox-input",onChange:n=>k(a,n.target.checked)},null,40,on),l("label",{for:"field-"+a,class:"checkbox-label"},h(t.checkboxLabel||"启用"),9,un)])):(o(),i("div",cn,[l("span",vn,"不支持的字段类型: "+h(t.type),1)])),p(u.value[a],t)?A("",!0):(o(),i("div",hn," 字段值不符合要求 ")),t.description?(o(),i("div",mn,h(t.description),1)):A("",!0)])),[[H,U.value(a,t)]])}),128))]))])):(o(),i("div",He,[...e[0]||(e[0]=[l("div",{class:"alert alert-warning"},[l("i",{class:"fa fa-exclamation-triangle"}),$(" Schema配置无效或缺少字段定义 ")],-1)])]))])}}},gn=Ge(dn,[["__scopeId","data-v-1325cd28"]]);export{gn as default};