mokelay-editor 0.0.5 → 0.0.9
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/assets/ApiBuilderShell-12U53yIi.js +1 -0
- package/assets/ApiBuilderShell-DGgsHv3d.css +1 -0
- package/assets/EditorPanel-Bq5-FMQg.css +1 -0
- package/assets/EditorPanel-DPLmzEPA.js +1 -0
- package/assets/MPage-KIfv29YD.js +1 -0
- package/assets/{MPage.vue_vue_type_script_setup_true_lang-D5yGdSyf.js → MPage.vue_vue_type_script_setup_true_lang-Cv6Zw1sY.js} +1 -1
- package/assets/{PreviewPanel-DUteH-hK.js → PreviewPanel-1QkMBWJz.js} +1 -1
- package/assets/block-advanced-EJNdvNM4.js +1 -0
- package/assets/{block-chart-0eTcp5HJ.js → block-chart-CQQxcr05.js} +1 -1
- package/assets/{block-datasource-_a7GVdwT.js → block-datasource-C6tZoarT.js} +1 -1
- package/assets/{block-editor-selector-niI9qUPh.js → block-editor-selector-N7oIwjwP.js} +1 -1
- package/assets/block-form-BYJCe8vQ.css +1 -0
- package/assets/block-form-fUFBuZp1.js +51 -0
- package/assets/{element-plus-CD8wJz6b.js → element-plus-Bo3B6ZwD.js} +1 -1
- package/assets/index-BQa--JUZ.js +10 -0
- package/assets/index-BzVcY3kf.css +1 -0
- package/assets/vue-vendor-CGusfGYN.js +17 -0
- package/index.html +9 -9
- package/package.json +1 -1
- package/assets/EditorPanel-CF3kVQ21.css +0 -1
- package/assets/EditorPanel-CIQRB85C.js +0 -1
- package/assets/MPage-CMw0gXU4.js +0 -1
- package/assets/block-advanced-BuKEuWQ4.js +0 -1
- package/assets/block-form-0t-EPu3N.css +0 -1
- package/assets/block-form-BEDK0U9Z.js +0 -51
- package/assets/index-CTUsYCbZ.css +0 -1
- package/assets/index-DaLT-qTF.js +0 -10
- package/assets/vue-vendor-Dh3tbb7h.js +0 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as ss,r as K,F as Oe,o as c,j as p,l as s,t as C,G as h,H as q,C as g,n as D,S as T,U as te,u as P,W as B,p as fe,D as be,L as rs,e as G,A as as}from"./vue-vendor-CGusfGYN.js";import{_ as ns}from"./block-advanced-EJNdvNM4.js";import"./element-plus-Bo3B6ZwD.js";const Ke=[{value:"header",title:"Header"},{value:"query",title:"Query"},{value:"body",title:"Body"}],os=[{value:"EQ",title:"等于"},{value:"NEQ",title:"不等于"},{value:"GT",title:"大于"},{value:"GE",title:"大于等于"},{value:"LT",title:"小于"},{value:"LE",title:"小于等于"},{value:"IN",title:"包含在"},{value:"NOTIN",title:"不包含在"}],rt=[{name:"trim",title:"去空格",description:"去除字符串前后空格。",needsParam:!1},{name:"is_not_null",title:"必填",description:"不能为空。",needsParam:!1},{name:"is_null",title:"必须为空",description:"值必须为空。",needsParam:!1},{name:"not_null",title:"是否有值",description:"返回布尔值。",needsParam:!1},{name:"email_check",title:"邮箱格式",description:"校验邮箱。",needsParam:!1},{name:"number_check",title:"数字格式",description:"校验数字。",needsParam:!1},{name:"eq",title:"必须等于",description:"值必须等于参数。",needsParam:!0,defaultParam:["expected"]},{name:"min",title:"最小长度",description:"字符串或数组长度下限。",needsParam:!0,defaultParam:[1]},{name:"max",title:"最大长度",description:"字符串或数组长度上限。",needsParam:!0,defaultParam:[255]},{name:"regex",title:"正则匹配",description:"用正则校验字符串。",needsParam:!0,defaultParam:["^[a-zA-Z0-9_-]+$"]},{name:"hash_make",title:"生成密码哈希",description:"把明文密码转成 hash。",needsParam:!1},{name:"hash_check",title:"校验密码",description:"校验 hash 与明文密码。",needsParam:!0,defaultParam:[{template:"{{request.body.password}}"}]}],ve=[{functionName:"list",title:"列表查询",shortTitle:"列表",group:"query",description:"查询多行数据,不分页。",outputs:["datas"],defaultInputs:()=>({datasource:"Mokelay",table:"users",fields:["id","name","created_at"],conditions:[],orderBy:[]})},{functionName:"page",title:"分页查询",shortTitle:"分页",group:"query",description:"查询当前页数据和分页信息。",outputs:["datas","total","totalPages","page","pageSize","hasPreviousPage","hasNextPage"],defaultInputs:()=>({datasource:"Mokelay",table:"pages",fields:["uuid","name","updated_at"],page:{template:"{{request.query.page}}"},pageSize:{template:"{{request.query.pageSize}}"},conditions:[],orderBy:[{fieldName:"updated_at",direction:"DESC"}]})},{functionName:"count",title:"统计数量",shortTitle:"统计",group:"query",description:"统计满足条件的记录数。",outputs:["total"],defaultInputs:()=>({datasource:"Mokelay",table:"users",conditions:[]})},{functionName:"read",title:"读取单条",shortTitle:"读取",group:"query",description:"读取第一条匹配记录。",outputs:["data"],defaultInputs:()=>({datasource:"Mokelay",table:"users",fields:["id","name","email"],conditions:[E("id",{template:"{{request.query.id}}"})]})},{functionName:"create",title:"创建数据",shortTitle:"创建",group:"write",description:"插入一条数据,并返回唯一 ID。",outputs:["uuid"],defaultInputs:()=>({datasource:"Mokelay",table:"users",idField:"id",fields:{name:{template:"{{request.body.name}}"}}})},{functionName:"update",title:"更新数据",shortTitle:"更新",group:"write",description:"更新符合条件的数据。",outputs:["affected"],defaultInputs:()=>({datasource:"Mokelay",table:"users",fields:{name:{template:"{{request.body.name}}"}},conditions:[E("id",{template:"{{request.query.id}}"})]})},{functionName:"delete",title:"删除数据",shortTitle:"删除",group:"write",description:"删除符合条件的数据。",outputs:["affected"],defaultInputs:()=>({datasource:"Mokelay",table:"users",conditions:[E("id",{template:"{{request.body.id}}"})]})},{functionName:"addSession",title:"写入 Session",shortTitle:"写入会话",group:"session",description:"把值写入编排 Session。",outputs:[],defaultInputs:()=>({key:"user",value:{template:"{{blocks['read_user'].outputs.data}}"}})},{functionName:"readSession",title:"读取 Session",shortTitle:"读取会话",group:"session",description:"读取 Session key。",outputs:["value"],defaultInputs:()=>({key:"user"})},{functionName:"removeSession",title:"清除 Session",shortTitle:"清除会话",group:"session",description:"删除 Session key。",outputs:[],defaultInputs:()=>({key:"user"})}],Je=[{id:"register",title:"注册接口",description:"校验邮箱重复,创建用户,读取用户,写入 Session。",build:e=>is(e)},{id:"login",title:"登录接口",description:"读取用户,校验密码,写入 Session。",build:e=>ls(e)},{id:"me",title:"当前用户",description:"读取 Session 并返回登录状态。",build:()=>({uuid:"me",alias:"当前用户接口",method:"GET",blocks:[I("readSession","read_user_session","读取用户 Session")],response:{user:_("blocks['read_user_session'].outputs.value"),loggedIn:{template:"{{blocks['read_user_session'].outputs.value}}",processors:["not_null"]}}})},{id:"logout",title:"退出登录",description:"清除 Session 并返回成功标记。",build:()=>({uuid:"logout",alias:"退出登录接口",method:"POST",blocks:[I("removeSession","clear_user_session","清除用户 Session")],response:{success:!0}})},{id:"page",title:"分页列表",description:"读取 page/pageSize,返回数据和分页信息。",build:e=>us(e)},{id:"detail",title:"详情查询",description:"按主键读取单条数据。",build:e=>ds(e)},{id:"create-read",title:"创建后读取",description:"创建记录后读取完整数据返回。",build:e=>cs(e)},{id:"update-read",title:"更新后读取",description:"更新记录后读取最新数据返回。",build:e=>ps(e)},{id:"delete",title:"删除接口",description:"按主键删除并返回影响行数。",build:e=>({uuid:`delete_${e.table}_by_${e.idField}`,alias:`删除 ${e.table}`,method:"POST",request:{body:[R(e.idField)]},blocks:[{...I("delete","delete_record","删除记录"),inputs:{datasource:e.datasource,table:e.table,conditions:[E(e.idField,_(`request.body.${e.idField}`))]}}],response:{affected:_("blocks['delete_record'].outputs.affected")}})},{id:"count",title:"统计接口",description:"统计表数据总数。",build:e=>({uuid:`count_${e.table}`,alias:`统计 ${e.table}`,method:"GET",blocks:[{...I("count","count_records","统计数量"),inputs:{datasource:e.datasource,table:e.table,conditions:[]}}],response:{total:_("blocks['count_records'].outputs.total")}})}];function se(e){return ve.find(n=>n.functionName===e)}function He(e){return rt.find(n=>n.name===e)}function Ue(e){var n;return((n=se(e))==null?void 0:n.outputs)??[]}function F(e){return typeof e=="string"?e:e.key}function X(e){return typeof e=="string"?e:e.processor}function I(e,n,o){const l=se(e);return{uuid:n||`${e}_${at()}`,alias:o||(l==null?void 0:l.title),functionName:e,inputs:M((l==null?void 0:l.defaultInputs())??{}),outputs:((l==null?void 0:l.outputs)??[]).map(d=>d)}}function je(){return{uuid:`api_${at()}`,alias:"未命名 API",method:"GET",request:{header:[],query:[],body:[]},blocks:[],response:null}}function _(e){return{template:`{{${e}}}`}}function R(e,n=["is_not_null"]){return{key:e,processors:n}}function E(e="id",n=""){return{group:!1,fieldName:e,fieldValue:n,conditionType:"EQ"}}function we(e={}){var n,o,l;return{datasource:((n=e.datasource)==null?void 0:n.trim())||"Mokelay",table:((o=e.table)==null?void 0:o.trim())||"users",idField:((l=e.idField)==null?void 0:l.trim())||"id",requestFields:Xe(e.requestFields,["name","email"]),returnFields:Xe(e.returnFields,["id","name","email"])}}function M(e){return JSON.parse(JSON.stringify(e))}function Xe(e,n){if(!Array.isArray(e))return n;const o=e.filter(l=>typeof l=="string").map(l=>l.trim()).filter(Boolean);return o.length?Array.from(new Set(o)):n}function at(){return Math.random().toString(36).slice(2,8)}function is(e){const n=Ve(e.returnFields,"blocks['read_record'].outputs.data");return{uuid:`register_${e.table}`,alias:`${e.table} 注册接口`,method:"POST",request:{body:[R("name",["trim","is_not_null",{processor:"max",param:[128]}]),R("email",["trim","is_not_null","email_check",{processor:"max",param:[255]}]),R("password",["is_not_null",{processor:"min",param:[8]},{processor:"max",param:[128]}])]},blocks:[{...I("count","check_duplicate","校验邮箱重复"),inputs:{datasource:e.datasource,table:e.table,conditions:[E("email",_("request.body.email"))]},outputs:[{key:"total",processors:[{processor:"eq",param:[0]}]}]},{...I("create","create_record","创建用户"),inputs:{datasource:e.datasource,table:e.table,idField:e.idField,fields:{name:_("request.body.name"),email:_("request.body.email"),password_hash:{template:"{{request.body.password}}",processors:["hash_make"]}}}},{...I("read","read_record","读取新用户"),inputs:{datasource:e.datasource,table:e.table,fields:e.returnFields,conditions:[E(e.idField,_("blocks['create_record'].outputs.uuid"))]}},{...I("addSession","set_user_session","写入用户 Session"),inputs:{key:"user",value:_("blocks['read_record'].outputs.data")}}],response:{user:n}}}function ls(e){return{uuid:`login_${e.table}`,alias:`${e.table} 登录接口`,method:"POST",request:{body:[R("email",["trim","is_not_null","email_check",{processor:"max",param:[255]}]),R("password",["is_not_null"])]},blocks:[{...I("read","read_user","按邮箱读取用户"),inputs:{datasource:e.datasource,table:e.table,fields:Array.from(new Set([...e.returnFields,"password_hash"])),conditions:[E("email",_("request.body.email"))]},outputs:[{key:"data",processors:["is_not_null"]}]},{...I("addSession","set_user_session","校验密码并写入 Session"),inputs:{key:"user",password_check:{template:"{{blocks['read_user'].outputs.data.password_hash}}",processors:[{processor:"hash_check",param:[_("request.body.password")]}]},value:Ve(e.returnFields,"blocks['read_user'].outputs.data")}}],response:{user:Ve(e.returnFields,"blocks['read_user'].outputs.data")}}}function us(e){return{uuid:`page_${e.table}`,alias:`${e.table} 分页列表`,method:"GET",request:{query:["page","pageSize"]},blocks:[{...I("page","page_records","分页查询"),inputs:{datasource:e.datasource,table:e.table,fields:e.returnFields,page:_("request.query.page"),pageSize:_("request.query.pageSize"),orderBy:[{fieldName:e.idField,direction:"DESC"}]}}],response:{datas:_("blocks['page_records'].outputs.datas"),pagination:{page:_("blocks['page_records'].outputs.page"),pageSize:_("blocks['page_records'].outputs.pageSize"),total:_("blocks['page_records'].outputs.total"),totalPages:_("blocks['page_records'].outputs.totalPages"),hasPreviousPage:_("blocks['page_records'].outputs.hasPreviousPage"),hasNextPage:_("blocks['page_records'].outputs.hasNextPage")}}}}function ds(e){return{uuid:`read_${e.table}_by_${e.idField}`,alias:`${e.table} 详情查询`,method:"GET",request:{query:[R(e.idField)]},blocks:[{...I("read","read_record","读取详情"),inputs:{datasource:e.datasource,table:e.table,fields:e.returnFields,conditions:[E(e.idField,_(`request.query.${e.idField}`))]}}],response:{data:_("blocks['read_record'].outputs.data")}}}function cs(e){return{uuid:`create_${e.table}`,alias:`创建 ${e.table}`,method:"POST",request:{body:e.requestFields.map(n=>R(n))},blocks:[{...I("create","create_record","创建记录"),inputs:{datasource:e.datasource,table:e.table,idField:e.idField,fields:Object.fromEntries(e.requestFields.map(n=>[n,_(`request.body.${n}`)]))}},{...I("read","read_record","读取新记录"),inputs:{datasource:e.datasource,table:e.table,fields:e.returnFields,conditions:[E(e.idField,_("blocks['create_record'].outputs.uuid"))]}}],response:{uuid:_("blocks['create_record'].outputs.uuid"),data:_("blocks['read_record'].outputs.data")}}}function ps(e){return{uuid:`update_${e.table}_by_${e.idField}`,alias:`更新 ${e.table}`,method:"POST",request:{query:[R(e.idField)],body:e.requestFields.map(n=>R(n))},blocks:[{...I("update","update_record","更新记录"),inputs:{datasource:e.datasource,table:e.table,fields:Object.fromEntries(e.requestFields.map(n=>[n,_(`request.body.${n}`)])),conditions:[E(e.idField,_(`request.query.${e.idField}`))]}},{...I("read","read_record","读取最新记录"),inputs:{datasource:e.datasource,table:e.table,fields:e.returnFields,conditions:[E(e.idField,_(`request.query.${e.idField}`))]}}],response:{affected:_("blocks['update_record'].outputs.affected"),data:_("blocks['read_record'].outputs.data")}}}function Ve(e,n){return Object.fromEntries(e.map(o=>[o,_(`${n}.${o}`)]))}const fs=/^[A-Za-z0-9_-]{1,128}$/,bs=/^[A-Za-z_][A-Za-z0-9_]*$/,ms=new Set(["GET","POST"]),gs=new Set(["GE","GT","LE","LT","NEQ","EQ","NOTIN","IN"]),ys=new Set(["trim","is_not_null","is_null","not_null","email_check","number_check","eq","min","max","regex","hash_make","hash_check"]);function nt(e){var i,d,y;const n=[],o=(b,f,x)=>{n.push({id:`${b}_${n.length}_${x}`,severity:b,message:f,target:x})};(i=e.uuid)!=null&&i.trim()?fs.test(e.uuid)||o("error","API 标识只能包含字母、数字、下划线和连字符,长度 1-128。","api"):o("error","API 标识不能为空。","api"),ms.has(String(e.method).toUpperCase())||o("error","请求方法必须是 GET 或 POST。","api");for(const b of["header","query","body"]){const f=((d=e.request)==null?void 0:d[b])??[],x=new Set;f.forEach((u,A)=>{const N=F(u);N.trim()||o("error",`${b} 第 ${A+1} 个参数名不能为空。`,"request"),x.has(N)&&o("warning",`${b}.${N} 重复声明,建议只保留一个。`,"request"),x.add(N),ot(typeof u=="string"?[]:u.processors??[],o,"request")})}const l=new Set;for(const b of e.blocks??[]){const f=`block:${b.uuid}`;if((y=b.uuid)!=null&&y.trim()||o("error","Block UUID 不能为空。",f),l.has(b.uuid)&&o("error",`Block UUID ${b.uuid} 重复。`,f),l.add(b.uuid),!se(b.functionName)){o("error",`不支持的 Block 类型:${b.functionName}。`,f);continue}xs(b.outputs,b.functionName,o,f);const u=b.inputs??{};if(["list","page","count","read","delete","create","update"].includes(b.functionName)){const A=u.datasource;typeof A!="string"||!A.trim()?o("error","数据库 Block 必须选择数据源。",f):bs.test(A)||o("error","数据源只能包含字母、数字、下划线,且不能以数字开头。",f),(typeof u.table!="string"||!u.table.trim())&&o("error","数据库 Block 必须填写表名。",f)}["list","page","read"].includes(b.functionName)&&(!Array.isArray(u.fields)||!u.fields.length)&&o("error","查询字段不能为空。",f),b.functionName==="create"&&((typeof u.idField!="string"||!u.idField.trim())&&o("error","创建数据必须配置返回 ID 字段。",f),Ye(u.fields)||o("error","创建字段不能为空。",f)),b.functionName==="update"&&(Ye(u.fields)||o("error","更新字段不能为空。",f),(!Array.isArray(u.conditions)||!u.conditions.length)&&o("warning","更新没有条件,会更新整张表,本地发布前需要二次确认。",f)),b.functionName==="delete"&&(!Array.isArray(u.conditions)||!u.conditions.length)&&o("warning","删除没有条件,会删除整张表数据,本地发布前需要二次确认。",f),["list","page","count","read","delete","update"].includes(b.functionName)&&hs(u.conditions,o,f),["list","page"].includes(b.functionName)&&_s(u.orderBy,o,f),["addSession","removeSession","readSession"].includes(b.functionName)&&(typeof u.key!="string"||!u.key.trim())&&o("error","Session key 不能为空。",f),b.functionName==="addSession"&&!Object.prototype.hasOwnProperty.call(u,"value")&&o("error","写入 Session 必须配置 value。",f)}return ws(e,o),n}function ks(e){return e.some(n=>n.severity==="error")}function vs(e){return e.some(n=>n.severity==="warning"&&/整张表/.test(n.message))}function xs(e,n,o,l){if(!e)return;const i=Ue(n);for(const d of e){const y=F(d);i.includes(y)||o("error",`${n} 不支持输出 ${y}。`,l),typeof d!="string"&&ot(d.processors??[],o,l)}}function ot(e,n,o){for(const l of e){const i=X(l);ys.has(i)||n("error",`不支持的处理规则:${i}。`,o)}}function hs(e,n,o){if(e!==void 0){if(!Array.isArray(e)){n("error","conditions 必须是数组。",o);return}for(const l of e)it(l,n,o)}}function it(e,n,o){if(!re(e)){n("error","条件必须是对象。",o);return}if(e.group===!0){if(e.groupType!=="AND"&&e.groupType!=="OR"&&n("error","条件组必须选择 AND 或 OR。",o),!Array.isArray(e.groups)||!e.groups.length){n("error","条件组不能为空。",o);return}e.groups.forEach(l=>it(l,n,o));return}e.group!==!1&&n("error","普通条件 group 必须为 false。",o),(typeof e.fieldName!="string"||!e.fieldName.trim())&&n("error","条件字段不能为空。",o),gs.has(String(e.conditionType))||n("error","条件类型无效。",o),Object.prototype.hasOwnProperty.call(e,"fieldValue")||n("error","条件值不能为空。",o),(e.conditionType==="IN"||e.conditionType==="NOTIN")&&(!Array.isArray(e.fieldValue)||!e.fieldValue.length)&&n("error","IN / NOTIN 的条件值必须是非空数组。",o)}function _s(e,n,o){if(e!==void 0){if(!Array.isArray(e)){n("error","orderBy 必须是数组。",o);return}for(const l of e){if(!re(l)||typeof l.fieldName!="string"||!l.fieldName.trim()){n("error","排序字段不能为空。",o);continue}l.direction!==void 0&&l.direction!=="ASC"&&l.direction!=="DESC"&&n("error","排序方向只能是 ASC 或 DESC。",o)}}}function ws(e,n){var d,y,b;const o={header:new Set((((d=e.request)==null?void 0:d.header)??[]).map(F)),query:new Set((((y=e.request)==null?void 0:y.query)??[]).map(F)),body:new Set((((b=e.request)==null?void 0:b.body)??[]).map(F))},l=new Map;for(const f of e.blocks??[])l.set(f.uuid,new Set((f.outputs??Ue(f.functionName)).map(F)));const i=Ss(e);for(const f of i)for(const x of qs(f.value)){const u=x.match(/^(request\.)?(header|query|body)\.([A-Za-z0-9_.$[\]'-]+)/);if(u){const N=u[2],$=u[3].split(/[.[\]]/)[0];o[N].has($)||n("warning",`变量 ${x} 未在 request 中声明。`,f.target)}const A=x.match(/^blocks\['([^']+)'\]\.outputs\.([A-Za-z0-9_]+)/);if(A){const[,N,$]=A,j=l.get(N);j?j.has($)||n("warning",`步骤 ${N} 不声明输出 ${$}。`,f.target):n("warning",`变量引用了不存在的步骤:${N}。`,f.target)}}}function Ss(e,n="response"){const o=[],l=(i,d)=>{if(re(i)&&typeof i.template=="string"){o.push({value:i.template,target:d});return}if(Array.isArray(i)){i.forEach(y=>l(y,d));return}if(re(i))for(const y of Object.values(i))l(y,d)};return l(e,n),o}function qs(e){return Array.from(e.matchAll(/\{\{\s*([^}]+?)\s*\}\}/g),n=>n[1].trim())}function Ye(e){return re(e)&&Object.keys(e).length>0}function re(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}const $s=/^\s*\{\{\s*([^}]+?)\s*\}\}\s*$/,As=/\{\{\s*([^}]+?)\s*\}\}/g;function Re(e,n){return{header:De(e,"header",n),query:De(e,"query",n),body:De(e,"body",n)}}function Is(e,n){const o=[],l=nt(e);for(const f of l)f.severity==="error"&&o.push(f.message);const i=Re(e,n),d={request:i,header:i.header,query:i.query,body:i.body,now:new Date().toISOString(),blocks:{}},y=[];try{Ns(e,d)}catch(f){o.push(Be(f))}for(const f of e.blocks??[]){if(o.length){y.push({uuid:f.uuid,alias:f.alias||f.uuid,functionName:f.functionName,inputs:f.inputs??{},outputs:{},status:"skipped",message:"前置校验失败,已跳过。"});continue}try{const x=ae(f.inputs??{},d),u=Cs(f,x);d.blocks[f.uuid]={inputs:x,outputs:u},y.push({uuid:f.uuid,alias:f.alias||f.uuid,functionName:f.functionName,inputs:x,outputs:u,status:"success",message:"已模拟执行。"})}catch(x){const u=Be(x);o.push(u),d.blocks[f.uuid]={inputs:f.inputs??{},outputs:{}},y.push({uuid:f.uuid,alias:f.alias||f.uuid,functionName:f.functionName,inputs:f.inputs??{},outputs:{},status:"error",message:u})}}let b=null;if(!o.length)try{b=e.response==null?null:ae(e.response,d)}catch(f){o.push(Be(f))}return{ok:o.length===0,data:b,errors:o,request:i,logs:y,apiJson:e}}function De(e,n,o){var i,d;const l={};for(const y of((i=e.request)==null?void 0:i[n])??[]){const b=F(y);l[b]=((d=o==null?void 0:o[n])==null?void 0:d[b])??Fs(b)}return l}function Ns(e,n){var o;for(const l of["header","query","body"])for(const i of((o=e.request)==null?void 0:o[l])??[]){const d=F(i),y=n.request[l][d];if(typeof i=="string"){if(xe(y))throw new Error(`请填写 ${l}.${d}`);continue}n.request[l][d]=lt(y,i.processors??[],`${l}.${d}`,n)}}function Cs(e,n){const o=Array.isArray(n.fields)?n.fields.filter(i=>typeof i=="string"):["id","name"],l=Object.fromEntries(o.map(i=>[i,Ps(i)]));return e.functionName==="list"?{datas:[l,{...l,id:"mock_2"}]}:e.functionName==="page"?{datas:[l],total:1,totalPages:1,page:Number(n.page||1),pageSize:Number(n.pageSize||20),hasPreviousPage:!1,hasNextPage:!1}:e.functionName==="count"?{total:1}:e.functionName==="read"?{data:l}:e.functionName==="create"?{uuid:"mock_created_id"}:e.functionName==="update"||e.functionName==="delete"?{affected:1}:e.functionName==="readSession"?{value:{id:"mock_user",name:"Mock User",email:"mock@example.com"}}:{}}function ae(e,n){if(Array.isArray(e))return e.map(o=>ae(o,n));if(Ds(e)){const o=e.template.match($s),l=o?et(n,o[1].trim()):e.template.replace(As,(i,d)=>Os(et(n,String(d).trim())));return lt(l,e.processors??[],e.template,n)}return ze(e)?Object.fromEntries(Object.entries(e).map(([o,l])=>[o,ae(l,n)])):e}function et(e,n){const o=n.replace(/^request\./,"request.").replace(/^header\./,"request.header.").replace(/^query\./,"request.query.").replace(/^body\./,"request.body."),l=Ts(o);let i=e;for(const d of l){if(ze(i)&&d in i){i=i[d];continue}if(Array.isArray(i)&&/^\d+$/.test(d)){i=i[Number(d)];continue}throw new Error(`变量不存在:${n}`)}return i}function Ts(e){const n=[];let o="";for(let l=0;l<e.length;l+=1){const i=e[l];if(i==="."){o&&n.push(o),o="";continue}if(i==="["){o&&n.push(o),o="";const d=e.indexOf("]",l);if(d===-1)throw new Error(`变量路径无效:${e}`);const y=e.slice(l+1,d).trim();n.push(y.replace(/^['"]|['"]$/g,"")),l=d;continue}o+=i}return o&&n.push(o),n}function lt(e,n,o,l){let i=e;for(const d of n){const y=X(d);if(y==="trim"&&typeof i=="string")i=i.trim();else if(y==="is_not_null"){if(xe(i))throw new Error(`请填写 ${o}`)}else if(y==="is_null"){if(!xe(i))throw new Error(`${o} 必须为空`)}else if(y==="not_null")i=!xe(i);else if(y==="email_check"){if(typeof i!="string"||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i))throw new Error(`${o} 需要是邮箱格式`)}else if(y==="number_check"){if(!Number.isFinite(Number(i)))throw new Error(`${o} 需要是数字`)}else if(y==="min"){const b=Number(me(d,l)[0]);if((typeof i=="string"||Array.isArray(i))&&i.length<b)throw new Error(`${o} 长度不能小于 ${b}`)}else if(y==="max"){const b=Number(me(d,l)[0]);if((typeof i=="string"||Array.isArray(i))&&i.length>b)throw new Error(`${o} 长度不能大于 ${b}`)}else if(y==="eq"){const b=me(d,l)[0];if(JSON.stringify(i)!==JSON.stringify(b))throw new Error(`${o} 必须等于 ${JSON.stringify(b)}`)}else if(y==="regex"){const b=String(me(d,l)[0]??"");if(typeof i!="string"||!new RegExp(b.replace(/^\/|\/[a-z]*$/g,"")).test(i))throw new Error(`${o} 不符合正则规则`)}else y==="hash_make"?i=`mock_hash(${String(i)})`:y==="hash_check"&&(i=!0)}return i}function me(e,n){if(typeof e=="string"||e.param===void 0)return[];const o=ae(e.param,n);return Array.isArray(o)?o:[o]}function Fs(e){const n=e.toLowerCase();return n.includes("email")?"mock@example.com":n.includes("password")?"password123":n.includes("pageSize".toLowerCase())?"20":n==="page"?"1":n.endsWith("id")||n.includes("uuid")?"mock_id":n.includes("blocks")?[]:`mock_${e}`}function Ps(e){const n=e.toLowerCase();return n.includes("email")?"mock@example.com":n.includes("created")||n.includes("updated")?new Date().toISOString():n.endsWith("id")||n==="uuid"?"mock_id":n.includes("blocks")?[]:n.includes("total")?1:`mock_${e}`}function Os(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}function Ds(e){return ze(e)&&typeof e.template=="string"}function xe(e){return e==null||e===""}function Be(e){return e instanceof Error?e.message:"测试执行失败"}function ze(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}const Bs=we({datasource:"Mokelay",table:"users",idField:"id",requestFields:["name","email"],returnFields:["id","name","email","plan"]}),ge=we({datasource:"Mokelay",table:"pages",idField:"uuid",requestFields:["name","blocks"],returnFields:["uuid","name","blocks","created_at","updated_at"]}),tt=we({datasource:"BingX",table:"wallets",idField:"id",requestFields:["chain_id","address","label","wallet_type"],returnFields:["id","chain_id","address","label","wallet_type","created_at","updated_at"]});function V(e,n=Bs){const o=Je.find(l=>l.id===e);if(!o)throw new Error(`Missing template: ${e}`);return o.build(n)}const Es=[{id:"login",title:"登录接口",description:"读取用户、校验密码、写入 Session。",apiJson:V("login")},{id:"register",title:"注册接口",description:"校验重复邮箱、创建用户、写入 Session。",apiJson:V("register")},{id:"me",title:"当前用户",description:"读取 Session 并返回 loggedIn。",apiJson:V("me")},{id:"logout",title:"退出登录",description:"清除 Session 并返回 success。",apiJson:V("logout")},{id:"list-pages",title:"页面分页",description:"分页查询 pages 并返回 pagination。",apiJson:V("page",ge)},{id:"read-page",title:"页面详情",description:"按 uuid 查询单个页面。",apiJson:V("detail",ge)},{id:"create-page",title:"创建页面",description:"创建记录后读取完整数据。",apiJson:V("create-read",ge)},{id:"update-page",title:"更新页面",description:"更新 blocks 后读取最新页面。",apiJson:V("update-read",ge)},{id:"delete-wallet",title:"删除钱包",description:"按 id 删除钱包并返回 affected。",apiJson:V("delete",tt)},{id:"count-wallets",title:"统计钱包",description:"统计 BingX wallets 记录数量。",apiJson:V("count",tt)}],ut="mokelay-api-builder-drafts",dt="mokelay-api-builder-active-draft";function ne(e=je()){const n=new Date().toISOString(),o=Se(e);return{id:o.uuid||`api_${Q()}`,apiJson:o,status:"draft",disabledBlockIds:[],versions:[],testCases:[],createdAt:n,updatedAt:n}}function Js(e){const n=M(e.apiJson),o=Q();n.uuid=`${n.uuid||"api"}_copy_${o}`,n.alias=`${n.alias||"未命名 API"} 副本`;const l=ne(n);return l.disabledBlockIds=[...e.disabledBlockIds],l}function Se(e){return U(e)?{uuid:O(e.uuid)||`api_${Q()}`,alias:O(e.alias)||"未命名 API",method:O(e.method).toUpperCase()==="POST"?"POST":"GET",request:Gs(e.request),blocks:Array.isArray(e.blocks)?e.blocks.map(n=>Ws(n)):[],response:U(e.response)?M(e.response):(e.response===null,null)}:je()}function he(e){const n=M(Se(e.apiJson)),o=new Set(e.disabledBlockIds);return n.blocks=(n.blocks??[]).filter(l=>!o.has(l.uuid)),n}function Vs(){if(typeof localStorage>"u")return[];try{const e=localStorage.getItem(ut),n=e?JSON.parse(e):[];return Array.isArray(n)?n.map(o=>Ms(o)):[]}catch{return[]}}function Rs(e){typeof localStorage>"u"||localStorage.setItem(ut,JSON.stringify(e))}function Us(){return typeof localStorage>"u"?"":localStorage.getItem(dt)||""}function Ee(e){typeof localStorage>"u"||localStorage.setItem(dt,e)}function ye(e,n){const o={...n,updatedAt:new Date().toISOString()},l=e.findIndex(d=>d.id===n.id);if(l===-1)return[o,...e];const i=[...e];return i[l]=o,i}function ct(e,n="本地版本"){return{id:`version_${Q()}`,label:n,apiJson:he(e),disabledBlockIds:[...e.disabledBlockIds],createdAt:new Date().toISOString()}}function st(e,n){e.versions=[ct(e,n),...e.versions].slice(0,20),e.updatedAt=new Date().toISOString()}function js(e,n){e.testCases=[n,...e.testCases].slice(0,20),e.updatedAt=new Date().toISOString()}function zs(e,n){e.apiJson=M(n.apiJson),e.disabledBlockIds=[...n.disabledBlockIds],e.status="draft",e.updatedAt=new Date().toISOString()}function Ms(e){if(!U(e))return ne();const n=Se(e.apiJson),o=new Date().toISOString();return{id:O(e.id)||n.uuid||`api_${Q()}`,apiJson:n,status:e.status==="published"?"published":"draft",disabledBlockIds:pt(e.disabledBlockIds),versions:Array.isArray(e.versions)?e.versions.map(l=>Ls(l)):[],testCases:Array.isArray(e.testCases)?e.testCases.filter(U):[],createdAt:O(e.createdAt)||o,updatedAt:O(e.updatedAt)||o}}function Ls(e){return U(e)?{id:O(e.id)||`version_${Q()}`,label:O(e.label)||"本地版本",apiJson:Se(e.apiJson),disabledBlockIds:pt(e.disabledBlockIds),createdAt:O(e.createdAt)||new Date().toISOString()}:ct(ne(),"空版本")}function Gs(e){return U(e)?{header:_e(e.header),query:_e(e.query),body:_e(e.body)}:{header:[],query:[],body:[]}}function _e(e){return Array.isArray(e)?e.map(n=>{if(typeof n=="string")return n;if(!U(n))return;const o=O(n.key);if(o)return{key:o,processors:Qs(n.processors)}}).filter(n=>!!n):[]}function Qs(e){return Array.isArray(e)?e.map(n=>{if(typeof n=="string"&&n.trim())return n.trim();if(!U(n))return;const o=O(n.processor);if(o)return{processor:o,...Object.prototype.hasOwnProperty.call(n,"param")?{param:Zs(n.param)}:{}}}).filter(n=>!!n):[]}function Ws(e){return U(e)?{uuid:O(e.uuid)||`block_${Q()}`,alias:O(e.alias)||void 0,functionName:O(e.functionName)||"read",inputs:U(e.inputs)?M(e.inputs):{},outputs:Array.isArray(e.outputs)?_e(e.outputs):e.outputs===null?null:void 0}:{uuid:`block_${Q()}`,functionName:"read",inputs:{},outputs:[]}}function pt(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}function O(e){return typeof e=="string"?e:""}function Zs(e){return e===void 0?e:M(e)}function U(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Q(){return Math.random().toString(36).slice(2,10)}function Ks(e,n){var l,i;const o=[];for(const d of["header","query","body"])for(const y of((l=e.request)==null?void 0:l[d])??[]){const b=F(y);o.push({id:`request-${d}-${b}`,label:`请求 ${d}.${b}`,path:`request.${d}.${b}`,source:"request"})}for(const d of e.blocks??[]){if(n&&d.uuid===n)break;const y=(i=d.outputs)!=null&&i.length?d.outputs.map(F):Ue(d.functionName);for(const b of y)o.push({id:`block-${d.uuid}-${b}`,label:`${d.alias||d.uuid}.${b}`,path:`blocks['${d.uuid}'].outputs.${b}`,source:"block"}),b==="data"&&o.push({id:`block-${d.uuid}-${b}-field`,label:`${d.alias||d.uuid}.data.字段`,path:`blocks['${d.uuid}'].outputs.data.id`,source:"block"})}return o.push({id:"system-now",label:"系统时间 now",path:"now",source:"system"}),o}function ke(e){return{template:`{{${e}}}`}}const Hs={"data-testid":"api-builder-shell",class:"flex min-h-[calc(100vh-112px)] flex-1 flex-col gap-4"},Xs={key:0,class:"grid gap-4 xl:grid-cols-[minmax(0,1fr)_360px]"},Ys={class:"rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},er={class:"mt-6 overflow-hidden rounded-lg border border-slate-200 dark:border-slate-700"},tr={class:"min-w-full divide-y divide-slate-200 text-sm dark:divide-slate-700"},sr={class:"divide-y divide-slate-200 dark:divide-slate-700"},rr={key:0},ar={class:"px-4 py-3 font-medium text-slate-900 dark:text-white"},nr={class:"px-4 py-3 font-mono text-xs text-slate-500 dark:text-slate-400"},or={class:"px-4 py-3"},ir={class:"rounded-md bg-sky-100 px-2 py-1 text-xs font-semibold text-sky-800 dark:bg-sky-500/20 dark:text-sky-100"},lr={class:"px-4 py-3"},ur={class:"px-4 py-3 text-slate-500 dark:text-slate-400"},dr={class:"px-4 py-3 text-right"},cr=["onClick"],pr=["onClick"],fr={class:"space-y-4"},br={class:"rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},mr={class:"mt-3 space-y-3"},gr=["value"],yr={class:"grid grid-cols-2 gap-2"},kr={class:"rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},vr={class:"mt-3 grid gap-2"},xr=["onClick"],hr={class:"block text-sm font-semibold text-slate-900 dark:text-white"},_r={class:"mt-1 block text-xs leading-5 text-slate-500 dark:text-slate-400"},wr={key:1,class:"flex flex-1 flex-col gap-4"},Sr={class:"rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},qr={class:"flex flex-wrap items-center justify-between gap-3"},$r={class:"flex flex-wrap items-center gap-3"},Ar={class:"text-xl font-semibold text-slate-950 dark:text-white"},Ir={class:"rounded-md bg-sky-100 px-2 py-1 text-xs font-semibold text-sky-800 dark:bg-sky-500/20 dark:text-sky-100"},Nr={class:"rounded bg-slate-100 px-2 py-1 text-xs text-slate-600 dark:bg-slate-800 dark:text-slate-300"},Cr={class:"grid min-h-[660px] flex-1 gap-4 xl:grid-cols-[280px_minmax(0,1fr)_380px]"},Tr={class:"space-y-4 rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},Fr={class:"grid grid-cols-3 gap-2"},Pr={class:"mt-2 grid gap-2"},Or=["onClick"],Dr={class:"mt-2 grid gap-2"},Br=["onClick"],Er={class:"mt-2 grid gap-2"},Jr=["onClick"],Vr={class:"rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},Rr={class:"flex items-center justify-between gap-3"},Ur={class:"flex items-center gap-2 text-xs"},jr={class:"rounded-md bg-rose-100 px-2 py-1 font-semibold text-rose-700 dark:bg-rose-500/20 dark:text-rose-100"},zr={class:"rounded-md bg-amber-100 px-2 py-1 font-semibold text-amber-700 dark:bg-amber-500/20 dark:text-amber-100"},Mr={class:"mt-4 space-y-3"},Lr=["data-block-uuid","onClick","onDragstart","onDrop"],Gr={class:"flex flex-wrap items-start justify-between gap-3"},Qr={class:"min-w-0"},Wr={class:"flex flex-wrap items-center gap-2"},Zr={class:"flex h-7 w-7 items-center justify-center rounded-full bg-slate-900 text-xs font-bold text-white dark:bg-white dark:text-slate-950"},Kr={class:"font-semibold text-slate-950 dark:text-white"},Hr={class:"rounded-md bg-white px-2 py-1 text-xs font-semibold text-slate-600 ring-1 ring-slate-200 dark:bg-slate-900 dark:text-slate-300 dark:ring-slate-700"},Xr={key:0,class:"rounded-md bg-slate-200 px-2 py-1 text-xs font-semibold text-slate-600 dark:bg-slate-700 dark:text-slate-300"},Yr={class:"mt-2 text-sm text-slate-500 dark:text-slate-400"},ea={class:"flex flex-wrap gap-1"},ta=["onClick"],sa=["onClick"],ra=["onClick"],aa={class:"mt-3 grid gap-2 text-xs sm:grid-cols-3"},na={class:"rounded-lg bg-white p-2 text-slate-600 dark:bg-slate-900 dark:text-slate-300"},oa={class:"rounded-lg bg-white p-2 text-slate-600 dark:bg-slate-900 dark:text-slate-300"},ia={class:"rounded-lg bg-white p-2 text-slate-600 dark:bg-slate-900 dark:text-slate-300"},la={class:"rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},ua={class:"mt-4 space-y-3"},da={class:"builder-field"},ca={class:"builder-field"},pa={class:"builder-field"},fa={class:"rounded-lg bg-slate-50 p-3 text-sm text-slate-600 dark:bg-slate-800 dark:text-slate-300"},ba={class:"mt-4 space-y-5"},ma={class:"mb-2 flex items-center justify-between"},ga={class:"text-sm font-semibold text-slate-900 dark:text-white"},ya=["onClick"],ka={class:"space-y-2"},va={class:"grid gap-2 sm:grid-cols-[minmax(0,1fr)_auto]"},xa=["value","onInput"],ha={class:"flex items-center gap-2 text-sm text-slate-600 dark:text-slate-300"},_a=["checked","onChange"],wa={class:"mt-2 flex flex-wrap gap-2"},Sa=["onClick"],qa=["onChange"],$a=["value"],Aa=["onClick"],Ia={class:"mt-4 space-y-3"},Na=["value","onInput"],Ca={class:"mt-2 grid gap-2"},Ta=["value","onInput"],Fa=["onChange"],Pa=["value"],Oa=["onClick"],Da={class:"mt-4 space-y-3"},Ba={class:"builder-field"},Ea={class:"builder-field"},Ja={class:"builder-field"},Va=["value"],Ra={class:"builder-field"},Ua=["value"],ja={class:"builder-field"},za=["value"],Ma={key:1,class:"builder-field"},La=["value"],Ga={key:2,class:"grid grid-cols-2 gap-2"},Qa={class:"builder-field"},Wa=["value"],Za={class:"builder-field"},Ka=["value"],Ha={key:3,class:"builder-field"},Xa=["value"],Ya={key:4},en={class:"space-y-2"},tn=["value","onInput"],sn=["value","onInput"],rn=["onChange"],an=["value"],nn=["onClick"],on={key:5},ln={class:"space-y-2"},un={class:"grid gap-2 sm:grid-cols-2"},dn=["onUpdate:modelValue"],cn=["onUpdate:modelValue"],pn=["value"],fn=["value","onInput"],bn=["onChange"],mn=["value"],gn={class:"flex items-center justify-between gap-2"},yn=["onUpdate:modelValue"],kn={class:"text-xs text-slate-500"},vn=["value","onInput"],xn=["onClick"],hn={key:6},_n={class:"space-y-2"},wn=["onUpdate:modelValue"],Sn=["onUpdate:modelValue"],qn=["onClick"],$n={key:7,class:"builder-field"},An=["value"],In={class:"builder-field"},Nn=["value"],Cn=["value"],Tn={class:"rounded-xl border border-slate-200 bg-white shadow-sm dark:border-slate-700 dark:bg-slate-900"},Fn={class:"flex flex-wrap gap-2 border-b border-slate-200 p-3 dark:border-slate-700"},Pn={class:"p-4"},On={key:0},Dn={"data-testid":"api-builder-json",class:"max-h-[420px] overflow-auto rounded-lg bg-slate-950 p-4 text-xs leading-5 text-slate-100"},Bn={key:1,class:"space-y-2"},En={key:0,class:"rounded-lg bg-emerald-50 p-3 text-sm text-emerald-800 dark:bg-emerald-500/10 dark:text-emerald-100"},Jn=["onClick"],Vn={key:2,class:"grid gap-4 xl:grid-cols-[360px_minmax(0,1fr)]"},Rn={class:"space-y-4"},Un={class:"mb-2 text-sm font-semibold text-slate-900 dark:text-white"},jn={class:"space-y-2"},zn=["value","onInput"],Mn={key:0,class:"text-xs text-slate-500 dark:text-slate-400"},Ln={key:0,class:"rounded-lg bg-slate-50 p-4 text-sm text-slate-500 dark:bg-slate-800 dark:text-slate-400"},Gn={key:1,class:"space-y-3"},Qn={class:"grid gap-3 lg:grid-cols-2"},Wn={class:"max-h-72 overflow-auto rounded-lg bg-slate-950 p-3 text-xs text-slate-100"},Zn={class:"space-y-2"},Kn={class:"flex items-center justify-between gap-2"},Hn={class:"text-slate-900 dark:text-white"},Xn={class:"mt-1 text-xs text-slate-500"},Yn={key:3,class:"space-y-2"},eo={key:0,class:"rounded-lg bg-slate-50 p-3 text-sm text-slate-500 dark:bg-slate-800 dark:text-slate-400"},to={class:"text-sm font-semibold text-slate-900 dark:text-white"},so={class:"text-xs text-slate-500"},ro=["onClick"],ao={key:2,class:"rounded-xl border border-slate-200 bg-white p-8 text-center shadow-sm dark:border-slate-700 dark:bg-slate-900"},no=ss({__name:"ApiBuilderShell",props:{routeUuid:{default:null}},setup(e){const n=e,o=K(Vs()),l=K(n.routeUuid||Us()),i=K({type:"api"}),d=K("json"),y=K(""),b=K({header:{},query:{},body:{}}),f=K(null),x=rs({selectedTemplateId:"page",datasource:"Mokelay",table:"users",idField:"id",requestFields:"name,email",returnFields:"id,name,email,created_at"}),u=G(()=>o.value.find(r=>r.id===l.value)??null),A=G(()=>u.value?he(u.value):null),N=G(()=>A.value?nt(A.value):[]),$=G(()=>{var t;const r=i.value;return!u.value||r.type!=="block"?null:((t=u.value.apiJson.blocks)==null?void 0:t.find(k=>k.uuid===r.uuid))??null}),j=G(()=>{if(!u.value)return[];const r=i.value.type==="block"?i.value.uuid:void 0;return Ks(u.value.apiJson,r)}),Me=G(()=>[...o.value].sort((r,t)=>t.updatedAt.localeCompare(r.updatedAt))),ft=G(()=>!!n.routeUuid),qe=G(()=>({query:ve.filter(r=>r.group==="query"),write:ve.filter(r=>r.group==="write"),session:ve.filter(r=>r.group==="session")}));Oe(()=>n.routeUuid,r=>{r&&(l.value=r,Ee(r),i.value={type:"api"})},{immediate:!0}),Oe(o,r=>{Rs(r)},{deep:!0}),Oe(u,r=>{if(!r){f.value=null;return}b.value=Re(he(r),b.value),Ee(r.id)},{immediate:!0});function $e(){window.location.hash="/apis"}function oe(r){l.value=r.id,Ee(r.id),window.location.hash=`/apis/${encodeURIComponent(r.id)}`}function bt(){const r=ne(je());o.value=ye(o.value,r),oe(r)}function Le(r){const t=ne(r);o.value=ye(o.value,t),oe(t)}function mt(r=x.selectedTemplateId){const t=Je.find(w=>w.id===r);if(!t)return;const k=we({datasource:x.datasource,table:x.table,idField:x.idField,requestFields:Pe(x.requestFields),returnFields:Pe(x.returnFields)});Le(t.build(k))}function gt(){if(!u.value)return;const r=Js(u.value);o.value=ye(o.value,r),oe(r)}function yt(r){window.confirm(`删除本地草稿「${r.apiJson.alias||r.apiJson.uuid}」?`)&&(o.value=o.value.filter(t=>t.id!==r.id),l.value===r.id&&(l.value="",$e()))}function Ge(){u.value&&(o.value=ye(o.value,u.value))}function kt(){if(!u.value)return;const r=N.value;if(ks(r)){d.value="validation";return}vs(r)&&!window.confirm("存在会影响整张表的高风险操作,仍然本地发布?")||(st(u.value,"本地发布快照"),u.value.status="published",Ge())}function ie(r){if(!u.value)return;const t=I(r);u.value.apiJson.blocks=[...u.value.apiJson.blocks??[],t],i.value={type:"block",uuid:t.uuid},as(()=>{var k;(k=document.querySelector(`[data-block-uuid="${t.uuid}"]`))==null||k.scrollIntoView({block:"center",behavior:"smooth"})})}function vt(r){if(!u.value)return;const t=M(r);t.uuid=`${r.uuid}_copy`,t.alias=`${r.alias||r.uuid} 副本`;const k=u.value.apiJson.blocks??[],w=k.findIndex(a=>a.uuid===r.uuid);k.splice(w+1,0,t),i.value={type:"block",uuid:t.uuid}}function xt(r){u.value&&(u.value.apiJson.blocks=(u.value.apiJson.blocks??[]).filter(t=>t.uuid!==r.uuid),u.value.disabledBlockIds=u.value.disabledBlockIds.filter(t=>t!==r.uuid),i.value={type:"api"})}function ht(r){if(!u.value)return;const t=new Set(u.value.disabledBlockIds);t.has(r.uuid)?t.delete(r.uuid):t.add(r.uuid),u.value.disabledBlockIds=Array.from(t)}function Ae(r){var t;return((t=u.value)==null?void 0:t.disabledBlockIds.includes(r.uuid))??!1}function _t(r){y.value=r.uuid}function wt(r){if(!u.value||!y.value||y.value===r.uuid)return;const t=u.value.apiJson.blocks??[],k=t.findIndex(v=>v.uuid===y.value),w=t.findIndex(v=>v.uuid===r.uuid);if(k===-1||w===-1)return;const[a]=t.splice(k,1);t.splice(w,0,a),y.value=""}function St(r){i.value={type:"block",uuid:r.uuid}}function Qe(r){return N.value.filter(t=>t.severity===r).length}function qt(r){if(r.target==="api"||r.target==="request"||r.target==="response"){i.value={type:r.target};return}i.value={type:"block",uuid:r.target.replace(/^block:/,"")}}function L(r){if(!u.value)return[];const t=Ot();return t[r]??(t[r]=[]),t[r]}function $t(r){L(r).push({key:r==="query"?"id":"name",processors:r==="body"?["is_not_null"]:[]})}function At(r,t){L(r).splice(t,1)}function It(r,t,k){const w=L(r),a=w[t];if(typeof a=="string"){w[t]=k;return}a.key=k}function Ie(r,t,k){const w=L(r),a=w[t];if(typeof a=="string"){w[t]={key:a,processors:k};return}a.processors=k}function Nt(r,t){const k=Y(L(r)[t]),a=k.map(X).includes("is_not_null")?k.filter(v=>X(v)!=="is_not_null"):["is_not_null",...k];Ie(r,t,a)}function Ct(r,t,k){if(!k)return;const w=He(k),a=w!=null&&w.needsParam?{processor:k,param:M(w.defaultParam??[])}:k;Ie(r,t,[...Y(L(r)[t]),a])}function Tt(r,t,k){const w=Y(L(r)[t]);w.splice(k,1),Ie(r,t,w)}function Ft(r){return typeof r=="string"?r:r.key}function Y(r){return typeof r=="string"?[]:[...r.processors??[]]}function Pt(r){return typeof r=="string"||Y(r).some(t=>X(t)==="is_not_null")}function Ot(){var r;if(!u.value)throw new Error("No active draft");return(r=u.value.apiJson).request??(r.request={}),u.value.apiJson.request}function J(r=$.value){return r?(r.inputs??(r.inputs={}),r.inputs):{}}function z(r,t){$.value&&(J()[r]=t)}function le(r){const t=J()[r];return typeof t=="string"?t:""}function Dt(r){const t=J()[r];return Array.isArray(t)?t.filter(k=>typeof k=="string").join(", "):""}function Bt(r,t){z(r,Pe(t))}function Et(){const r=J().fields;return H(r)?Object.entries(r):[]}function Jt(){const r=Ce("fields");r.name=ke("request.body.name")}function Ne(r,t,k){const w=Ce("fields");delete w[r],w[t||r]=k}function Vt(r){const t=Ce("fields");delete t[r]}function Ce(r){const t=J();return H(t[r])||(t[r]={}),t[r]}function ue(){const r=J();return Array.isArray(r.conditions)||(r.conditions=[]),r.conditions}function Rt(){ue().push({group:!1,fieldName:"id",conditionType:"EQ",fieldValue:ke("request.query.id")})}function Ut(){ue().push({group:!0,groupType:"OR",groups:[{group:!1,fieldName:"plan",conditionType:"EQ",fieldValue:"free"},{group:!1,fieldName:"plan",conditionType:"EQ",fieldValue:"pro"}]})}function jt(r){ue().splice(r,1)}function zt(r,t){try{const k=JSON.parse(t);Array.isArray(k)&&(r.groups=k)}catch{}}function Te(){const r=J();return Array.isArray(r.orderBy)||(r.orderBy=[]),r.orderBy}function Mt(){Te().push({fieldName:"created_at",direction:"DESC"})}function Lt(r){Te().splice(r,1)}function Gt(){const r=de();return Object.entries(r)}function de(){return u.value?(H(u.value.apiJson.response)||(u.value.apiJson.response={}),u.value.apiJson.response):{}}function Qt(){const r=de();r.data=j.value[0]?ke(j.value[0].path):null}function Fe(r,t,k){const w=de();delete w[r],w[t||r]=k}function Wt(r){const t=de();delete t[r]}function ce(r,t){t&&r(ke(t))}function W(r){return r===void 0?"":H(r)&&typeof r.template=="string"?r.template:typeof r=="string"?r:JSON.stringify(r)}function Z(r){const t=r.trim();if(!t)return"";if(t.startsWith("{{")&&t.endsWith("}}"))return{template:t};try{return JSON.parse(t)}catch{return r}}function Zt(r){var k;const t=X(r);return((k=He(t))==null?void 0:k.title)??t}function pe(r){return JSON.stringify(r,null,2)}function Kt(){var r;A.value&&((r=navigator.clipboard)==null||r.writeText(pe(A.value)))}function Ht(){u.value&&(st(u.value,"手动快照"),d.value="versions")}function Xt(r){u.value&&window.confirm(`回滚到「${r.label}」?当前草稿会变为未发布。`)&&(zs(u.value,r),i.value={type:"api"})}function Yt(r,t,k){b.value={...b.value,[r]:{...b.value[r],[t]:Z(k)}}}function es(){if(!u.value)return;const r=he(u.value),t=Is(r,b.value);f.value=t,js(u.value,{id:`test_${Date.now()}`,name:t.ok?"Dry-run 通过":"Dry-run 失败",request:t.request,result:t,createdAt:new Date().toISOString()}),d.value="test"}function ts(){A.value&&(b.value=Re(A.value))}function Pe(r){return Array.isArray(r)?r.map(t=>t.trim()).filter(Boolean):r.split(",").map(t=>t.trim()).filter(Boolean)}function We(r){return r?new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(new Date(r)):""}function H(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}return(r,t)=>{var k,w;return c(),p("section",Hs,[ft.value?u.value&&A.value?(c(),p("div",wr,[s("section",Sr,[s("div",qr,[s("div",null,[s("button",{class:"mb-2 text-sm font-medium text-teal-700 hover:text-teal-500 dark:text-teal-300",onClick:$e},"返回 API 列表"),s("div",$r,[s("h2",Ar,g(u.value.apiJson.alias||"未命名 API"),1),s("span",Ir,g(u.value.apiJson.method),1),s("span",{class:D(["rounded-md px-2 py-1 text-xs font-semibold",u.value.status==="published"?"bg-emerald-100 text-emerald-800 dark:bg-emerald-500/20 dark:text-emerald-100":"bg-amber-100 text-amber-800 dark:bg-amber-500/20 dark:text-amber-100"])},g(u.value.status==="published"?"本地已发布":"草稿"),3),s("code",Nr,"/api/mokelay/"+g(u.value.apiJson.uuid),1)])]),s("div",{class:"flex flex-wrap gap-2"},[s("button",{class:"builder-secondary-button",onClick:gt},"复制 API"),s("button",{class:"builder-secondary-button",onClick:Ht},"保存快照"),s("button",{class:"builder-secondary-button",onClick:Ge},"保存本地"),s("button",{class:"rounded-lg bg-teal-600 px-3 py-2 text-sm font-semibold text-white hover:bg-teal-500",onClick:kt},"本地发布")])])]),s("div",Cr,[s("aside",Tr,[s("div",Fr,[s("button",{class:D(["builder-nav-button",{"builder-nav-button-active":i.value.type==="api"}]),onClick:t[7]||(t[7]=a=>i.value={type:"api"})},"入口",2),s("button",{class:D(["builder-nav-button",{"builder-nav-button-active":i.value.type==="request"}]),onClick:t[8]||(t[8]=a=>i.value={type:"request"})},"请求",2),s("button",{class:D(["builder-nav-button",{"builder-nav-button-active":i.value.type==="response"}]),onClick:t[9]||(t[9]=a=>i.value={type:"response"})},"响应",2)]),s("div",null,[t[35]||(t[35]=s("h3",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"查询数据",-1)),s("div",Pr,[(c(!0),p(h,null,q(qe.value.query,a=>(c(),p("button",{key:a.functionName,class:"builder-palette-button",onClick:v=>ie(a.functionName)},[s("span",null,g(a.title),1),s("small",null,g(a.description),1)],8,Or))),128))])]),s("div",null,[t[36]||(t[36]=s("h3",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"写入数据",-1)),s("div",Dr,[(c(!0),p(h,null,q(qe.value.write,a=>(c(),p("button",{key:a.functionName,class:"builder-palette-button",onClick:v=>ie(a.functionName)},[s("span",null,g(a.title),1),s("small",null,g(a.description),1)],8,Br))),128))])]),s("div",null,[t[37]||(t[37]=s("h3",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"登录态",-1)),s("div",Er,[(c(!0),p(h,null,q(qe.value.session,a=>(c(),p("button",{key:a.functionName,class:"builder-palette-button",onClick:v=>ie(a.functionName)},[s("span",null,g(a.title),1),s("small",null,g(a.description),1)],8,Jr))),128))])])]),s("main",Vr,[s("div",Rr,[t[38]||(t[38]=s("div",null,[s("h3",{class:"text-base font-semibold text-slate-950 dark:text-white"},"编排步骤"),s("p",{class:"mt-1 text-sm text-slate-500 dark:text-slate-400"},"按顺序执行。拖动步骤卡片可以排序。")],-1)),s("div",Ur,[s("span",jr,g(Qe("error"))+" 错误",1),s("span",zr,g(Qe("warning"))+" 提醒",1)])]),s("div",Mr,[(k=u.value.apiJson.blocks)!=null&&k.length?C("",!0):(c(),p("button",{key:0,class:"w-full rounded-lg border border-dashed border-slate-300 px-4 py-5 text-sm font-medium text-slate-500 hover:border-teal-400 hover:bg-teal-50 dark:border-slate-700 dark:text-slate-400 dark:hover:border-teal-500 dark:hover:bg-teal-500/10",onClick:t[10]||(t[10]=a=>ie("read"))}," 添加第一个步骤 ")),(c(!0),p(h,null,q(u.value.apiJson.blocks,(a,v)=>{var m;return c(),p("article",{key:a.uuid,"data-block-uuid":a.uuid,draggable:"true",class:D(["rounded-xl border p-4 transition",[i.value.type==="block"&&i.value.uuid===a.uuid?"border-teal-400 bg-teal-50/70 dark:border-teal-400 dark:bg-teal-500/10":"border-slate-200 bg-slate-50 dark:border-slate-700 dark:bg-slate-800/50",Ae(a)?"opacity-55":""]]),onClick:S=>St(a),onDragstart:S=>_t(a),onDragover:t[11]||(t[11]=fe(()=>{},["prevent"])),onDrop:S=>wt(a)},[s("div",Gr,[s("div",Qr,[s("div",Wr,[s("span",Zr,g(v+1),1),s("h4",Kr,g(a.alias||((m=P(se)(a.functionName))==null?void 0:m.title)||a.functionName),1),s("span",Hr,g(a.functionName),1),Ae(a)?(c(),p("span",Xr,"已禁用")):C("",!0)]),s("p",Yr,g(a.uuid)+" · "+g((a.outputs||[]).map(P(F)).join(", ")||"无输出"),1)]),s("div",ea,[s("button",{class:"builder-icon-button",onClick:fe(S=>ht(a),["stop"])},g(Ae(a)?"启用":"禁用"),9,ta),s("button",{class:"builder-icon-button",onClick:fe(S=>vt(a),["stop"])},"复制",8,sa),s("button",{class:"builder-icon-button text-rose-700 dark:text-rose-200",onClick:fe(S=>xt(a),["stop"])},"删除",8,ra)])]),s("div",aa,[s("div",na,"数据源:"+g(H(a.inputs)&&a.inputs.datasource||"-"),1),s("div",oa,"表:"+g(H(a.inputs)&&a.inputs.table||"-"),1),s("div",ia,"输出:"+g((a.outputs||[]).map(P(F)).join(", ")||"-"),1)])],42,Lr)}),128))])]),s("aside",la,[i.value.type==="api"?(c(),p(h,{key:0},[t[44]||(t[44]=s("h3",{class:"text-base font-semibold text-slate-950 dark:text-white"},"接口入口",-1)),s("div",ua,[s("label",da,[t[39]||(t[39]=s("span",null,"接口名称",-1)),T(s("input",{"onUpdate:modelValue":t[12]||(t[12]=a=>u.value.apiJson.alias=a),class:"builder-input"},null,512),[[B,u.value.apiJson.alias]])]),s("label",ca,[t[40]||(t[40]=s("span",null,"API 标识",-1)),T(s("input",{"onUpdate:modelValue":t[13]||(t[13]=a=>u.value.apiJson.uuid=a),class:"builder-input font-mono"},null,512),[[B,u.value.apiJson.uuid]])]),s("label",pa,[t[42]||(t[42]=s("span",null,"请求方法",-1)),T(s("select",{"onUpdate:modelValue":t[14]||(t[14]=a=>u.value.apiJson.method=a),class:"builder-input"},[...t[41]||(t[41]=[s("option",{value:"GET"},"GET",-1),s("option",{value:"POST"},"POST",-1)])],512),[[te,u.value.apiJson.method]])]),s("div",fa,[t[43]||(t[43]=be(" 路径预览:",-1)),s("code",null,"/api/mokelay/"+g(u.value.apiJson.uuid),1)])])],64)):i.value.type==="request"?(c(),p(h,{key:1},[t[47]||(t[47]=s("h3",{class:"text-base font-semibold text-slate-950 dark:text-white"},"请求参数",-1)),s("div",ba,[(c(!0),p(h,null,q(P(Ke),a=>(c(),p("section",{key:a.value},[s("div",ma,[s("h4",ga,g(a.title),1),s("button",{class:"builder-small-button",onClick:v=>$t(a.value)},"添加参数",8,ya)]),s("div",ka,[(c(!0),p(h,null,q(L(a.value),(v,m)=>(c(),p("div",{key:`${a.value}-${m}`,class:"rounded-lg border border-slate-200 p-3 dark:border-slate-700"},[s("div",va,[s("input",{class:"builder-input",value:Ft(v),placeholder:"参数名",onInput:S=>It(a.value,m,S.target.value)},null,40,xa),s("label",ha,[s("input",{type:"checkbox",checked:Pt(v),onChange:S=>Nt(a.value,m)},null,40,_a),t[45]||(t[45]=be(" 必填 ",-1))])]),s("div",wa,[(c(!0),p(h,null,q(Y(v),(S,ee)=>(c(),p("span",{key:ee,class:"rounded-full bg-teal-100 px-2 py-1 text-xs font-semibold text-teal-800 dark:bg-teal-500/20 dark:text-teal-100"},[be(g(Zt(S))+" ",1),s("button",{class:"ml-1",onClick:Ze=>Tt(a.value,m,ee)},"×",8,Sa)]))),128)),s("select",{class:"rounded-md border border-slate-300 bg-white px-2 py-1 text-xs dark:border-slate-700 dark:bg-slate-950",onChange:S=>{Ct(a.value,m,S.target.value),S.target.value=""}},[t[46]||(t[46]=s("option",{value:""},"添加规则",-1)),(c(!0),p(h,null,q(P(rt),S=>(c(),p("option",{key:S.name,value:S.name},g(S.title),9,$a))),128))],40,qa),s("button",{class:"ml-auto text-xs text-rose-600",onClick:S=>At(a.value,m)},"删除",8,Aa)])]))),128))])]))),128))])],64)):i.value.type==="response"?(c(),p(h,{key:2},[t[49]||(t[49]=s("h3",{class:"text-base font-semibold text-slate-950 dark:text-white"},"响应组装",-1)),t[50]||(t[50]=s("p",{class:"mt-1 text-sm text-slate-500 dark:text-slate-400"},"把变量映射到响应 data 的字段。",-1)),s("div",Ia,[(c(!0),p(h,null,q(Gt(),([a,v])=>(c(),p("div",{key:a,class:"rounded-lg border border-slate-200 p-3 dark:border-slate-700"},[s("input",{class:"builder-input",value:a,onInput:m=>Fe(a,m.target.value,v)},null,40,Na),s("div",Ca,[s("input",{class:"builder-input font-mono text-xs",value:W(v),onInput:m=>Fe(a,a,Z(m.target.value))},null,40,Ta),s("select",{class:"builder-input",onChange:m=>{ce(S=>Fe(a,a,S),m.target.value),m.target.value=""}},[t[48]||(t[48]=s("option",{value:""},"从变量选择器填入",-1)),(c(!0),p(h,null,q(j.value,m=>(c(),p("option",{key:m.id,value:m.path},g(m.label)+" · "+g(m.path),9,Pa))),128))],40,Fa)]),s("button",{class:"mt-2 text-xs text-rose-600",onClick:m=>Wt(a)},"删除字段",8,Oa)]))),128)),s("button",{class:"builder-secondary-button w-full",onClick:Qt},"添加响应字段")])],64)):$.value?(c(),p(h,{key:3},[t[70]||(t[70]=s("h3",{class:"text-base font-semibold text-slate-950 dark:text-white"},"步骤配置",-1)),s("div",Da,[s("label",Ba,[t[51]||(t[51]=s("span",null,"业务名称",-1)),T(s("input",{"onUpdate:modelValue":t[15]||(t[15]=a=>$.value.alias=a),class:"builder-input"},null,512),[[B,$.value.alias]])]),s("label",Ea,[t[52]||(t[52]=s("span",null,"Block UUID",-1)),T(s("input",{"onUpdate:modelValue":t[16]||(t[16]=a=>$.value.uuid=a),class:"builder-input font-mono"},null,512),[[B,$.value.uuid]])]),s("label",Ja,[t[53]||(t[53]=s("span",null,"类型",-1)),s("input",{value:((w=P(se)($.value.functionName))==null?void 0:w.title)||$.value.functionName,class:"builder-input",disabled:""},null,8,Va)]),["list","page","count","read","delete","create","update"].includes($.value.functionName)?(c(),p(h,{key:0},[s("label",Ra,[t[54]||(t[54]=s("span",null,"数据源",-1)),s("input",{class:"builder-input",value:le("datasource"),onInput:t[17]||(t[17]=a=>z("datasource",a.target.value))},null,40,Ua)]),s("label",ja,[t[55]||(t[55]=s("span",null,"表名",-1)),s("input",{class:"builder-input",value:le("table"),onInput:t[18]||(t[18]=a=>z("table",a.target.value))},null,40,za)])],64)):C("",!0),["list","page","read"].includes($.value.functionName)?(c(),p("label",Ma,[t[56]||(t[56]=s("span",null,"查询字段",-1)),s("input",{class:"builder-input",value:Dt("fields"),placeholder:"id, name, email",onInput:t[19]||(t[19]=a=>Bt("fields",a.target.value))},null,40,La)])):C("",!0),$.value.functionName==="page"?(c(),p("div",Ga,[s("label",Qa,[t[57]||(t[57]=s("span",null,"页码",-1)),s("input",{class:"builder-input font-mono text-xs",value:W(J().page),onInput:t[20]||(t[20]=a=>z("page",Z(a.target.value)))},null,40,Wa)]),s("label",Za,[t[58]||(t[58]=s("span",null,"每页数量",-1)),s("input",{class:"builder-input font-mono text-xs",value:W(J().pageSize),onInput:t[21]||(t[21]=a=>z("pageSize",Z(a.target.value)))},null,40,Ka)])])):C("",!0),$.value.functionName==="create"?(c(),p("label",Ha,[t[59]||(t[59]=s("span",null,"返回 ID 字段",-1)),s("input",{class:"builder-input",value:le("idField"),onInput:t[22]||(t[22]=a=>z("idField",a.target.value))},null,40,Xa)])):C("",!0),["create","update"].includes($.value.functionName)?(c(),p("div",Ya,[s("div",{class:"mb-2 flex items-center justify-between"},[t[60]||(t[60]=s("h4",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"写入字段",-1)),s("button",{class:"builder-small-button",onClick:Jt},"添加字段")]),s("div",en,[(c(!0),p(h,null,q(Et(),([a,v])=>(c(),p("div",{key:a,class:"rounded-lg border border-slate-200 p-3 dark:border-slate-700"},[s("input",{class:"builder-input",value:a,onInput:m=>Ne(a,m.target.value,v)},null,40,tn),s("input",{class:"builder-input mt-2 font-mono text-xs",value:W(v),onInput:m=>Ne(a,a,Z(m.target.value))},null,40,sn),s("select",{class:"builder-input mt-2",onChange:m=>{ce(S=>Ne(a,a,S),m.target.value),m.target.value=""}},[t[61]||(t[61]=s("option",{value:""},"选择变量",-1)),(c(!0),p(h,null,q(j.value,m=>(c(),p("option",{key:m.id,value:m.path},g(m.label),9,an))),128))],40,rn),s("button",{class:"mt-2 text-xs text-rose-600",onClick:m=>Vt(a)},"删除字段",8,nn)]))),128))])])):C("",!0),["list","page","count","read","delete","update"].includes($.value.functionName)?(c(),p("div",on,[s("div",{class:"mb-2 flex items-center justify-between"},[t[62]||(t[62]=s("h4",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"条件",-1)),s("div",{class:"flex gap-1"},[s("button",{class:"builder-small-button",onClick:Rt},"添加条件"),s("button",{class:"builder-small-button",onClick:Ut},"添加 OR 组")])]),s("div",ln,[(c(!0),p(h,null,q(ue(),(a,v)=>(c(),p("div",{key:v,class:"rounded-lg border border-slate-200 p-3 dark:border-slate-700"},[a.group?(c(),p(h,{key:1},[s("div",gn,[T(s("select",{"onUpdate:modelValue":m=>a.groupType=m,class:"builder-input"},[...t[64]||(t[64]=[s("option",{value:"AND"},"AND",-1),s("option",{value:"OR"},"OR",-1)])],8,yn),[[te,a.groupType]]),s("span",kn,"条件组包含 "+g(a.groups.length)+" 条,JSON 预览会保留嵌套结构。",1)]),s("textarea",{class:"builder-input mt-2 min-h-28 font-mono text-xs",value:pe(a.groups),onInput:m=>zt(a,m.target.value)},null,40,vn)],64)):(c(),p(h,{key:0},[s("div",un,[T(s("input",{"onUpdate:modelValue":m=>a.fieldName=m,class:"builder-input",placeholder:"字段"},null,8,dn),[[B,a.fieldName]]),T(s("select",{"onUpdate:modelValue":m=>a.conditionType=m,class:"builder-input"},[(c(!0),p(h,null,q(P(os),m=>(c(),p("option",{key:m.value,value:m.value},g(m.title),9,pn))),128))],8,cn),[[te,a.conditionType]])]),s("input",{class:"builder-input mt-2 font-mono text-xs",value:W(a.fieldValue),onInput:m=>a.fieldValue=Z(m.target.value)},null,40,fn),s("select",{class:"builder-input mt-2",onChange:m=>{ce(S=>a.fieldValue=S,m.target.value),m.target.value=""}},[t[63]||(t[63]=s("option",{value:""},"选择变量",-1)),(c(!0),p(h,null,q(j.value,m=>(c(),p("option",{key:m.id,value:m.path},g(m.label),9,mn))),128))],40,bn)],64)),s("button",{class:"mt-2 text-xs text-rose-600",onClick:m=>jt(v)},"删除条件",8,xn)]))),128))])])):C("",!0),["list","page"].includes($.value.functionName)?(c(),p("div",hn,[s("div",{class:"mb-2 flex items-center justify-between"},[t[65]||(t[65]=s("h4",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"排序",-1)),s("button",{class:"builder-small-button",onClick:Mt},"添加排序")]),s("div",_n,[(c(!0),p(h,null,q(Te(),(a,v)=>(c(),p("div",{key:v,class:"grid grid-cols-[minmax(0,1fr)_96px_auto] gap-2"},[T(s("input",{"onUpdate:modelValue":m=>a.fieldName=m,class:"builder-input",placeholder:"字段"},null,8,wn),[[B,a.fieldName]]),T(s("select",{"onUpdate:modelValue":m=>a.direction=m,class:"builder-input"},[...t[66]||(t[66]=[s("option",{value:"ASC"},"ASC",-1),s("option",{value:"DESC"},"DESC",-1)])],8,Sn),[[te,a.direction]]),s("button",{class:"text-xs text-rose-600",onClick:m=>Lt(v)},"删除",8,qn)]))),128))])])):C("",!0),["addSession","removeSession","readSession"].includes($.value.functionName)?(c(),p("label",$n,[t[67]||(t[67]=s("span",null,"Session key",-1)),s("input",{class:"builder-input",value:le("key"),onInput:t[23]||(t[23]=a=>z("key",a.target.value))},null,40,An)])):C("",!0),$.value.functionName==="addSession"?(c(),p(h,{key:8},[s("label",In,[t[68]||(t[68]=s("span",null,"Session value",-1)),s("input",{class:"builder-input font-mono text-xs",value:W(J().value),onInput:t[24]||(t[24]=a=>z("value",Z(a.target.value)))},null,40,Nn)]),s("select",{class:"builder-input",onChange:t[25]||(t[25]=a=>{ce(v=>z("value",v),a.target.value),a.target.value=""})},[t[69]||(t[69]=s("option",{value:""},"选择变量",-1)),(c(!0),p(h,null,q(j.value,a=>(c(),p("option",{key:a.id,value:a.path},g(a.label),9,Cn))),128))],32)],64)):C("",!0)])],64)):C("",!0)])]),s("section",Tn,[s("div",Fn,[s("button",{class:D(["builder-tab-button",{"builder-tab-button-active":d.value==="json"}]),onClick:t[26]||(t[26]=a=>d.value="json")},"JSON 预览",2),s("button",{class:D(["builder-tab-button",{"builder-tab-button-active":d.value==="validation"}]),onClick:t[27]||(t[27]=a=>d.value="validation")},"校验 "+g(N.value.length),3),s("button",{class:D(["builder-tab-button",{"builder-tab-button-active":d.value==="test"}]),onClick:t[28]||(t[28]=a=>d.value="test")},"测试",2),s("button",{class:D(["builder-tab-button",{"builder-tab-button-active":d.value==="versions"}]),onClick:t[29]||(t[29]=a=>d.value="versions")},"版本 "+g(u.value.versions.length),3)]),s("div",Pn,[d.value==="json"?(c(),p("div",On,[s("div",{class:"mb-3 flex justify-end"},[s("button",{class:"builder-secondary-button",onClick:Kt},"复制 JSON")]),s("pre",Dn,g(pe(A.value)),1)])):d.value==="validation"?(c(),p("div",Bn,[N.value.length?C("",!0):(c(),p("p",En,"校验通过,可以本地发布或复制 JSON。")),(c(!0),p(h,null,q(N.value,a=>(c(),p("button",{key:a.id,class:D(["block w-full rounded-lg border p-3 text-left text-sm",a.severity==="error"?"border-rose-200 bg-rose-50 text-rose-800 dark:border-rose-500/30 dark:bg-rose-500/10 dark:text-rose-100":"border-amber-200 bg-amber-50 text-amber-800 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100"]),onClick:v=>qt(a)},[s("strong",null,g(a.severity==="error"?"错误":"提醒"),1),be(" · "+g(a.message),1)],10,Jn))),128))])):d.value==="test"?(c(),p("div",Vn,[s("div",Rn,[(c(!0),p(h,null,q(P(Ke),a=>{var v,m;return c(),p("section",{key:a.value},[s("h4",Un,g(a.title),1),s("div",jn,[(c(!0),p(h,null,q(((v=A.value.request)==null?void 0:v[a.value])||[],S=>{var ee;return c(),p("label",{key:`${a.value}-${P(F)(S)}`,class:"builder-field"},[s("span",null,g(P(F)(S)),1),s("input",{class:"builder-input",value:W((ee=b.value[a.value])==null?void 0:ee[P(F)(S)]),onInput:Ze=>Yt(a.value,P(F)(S),Ze.target.value)},null,40,zn)])}),128)),(((m=A.value.request)==null?void 0:m[a.value])||[]).length?C("",!0):(c(),p("p",Mn,"没有 "+g(a.title)+" 参数。",1))])])}),128)),s("div",{class:"flex gap-2"},[s("button",{class:"rounded-lg bg-teal-600 px-3 py-2 text-sm font-semibold text-white hover:bg-teal-500",onClick:es},"运行 Dry-run"),s("button",{class:"builder-secondary-button",onClick:ts},"重置表单")])]),s("div",null,[f.value?(c(),p("div",Gn,[s("p",{class:D(["rounded-lg p-3 text-sm font-semibold",f.value.ok?"bg-emerald-50 text-emerald-800 dark:bg-emerald-500/10 dark:text-emerald-100":"bg-rose-50 text-rose-800 dark:bg-rose-500/10 dark:text-rose-100"])},g(f.value.ok?"Dry-run 通过":f.value.errors.join(";")),3),s("div",Qn,[s("pre",Wn,g(pe({ok:f.value.ok,data:f.value.data})),1),s("div",Zn,[(c(!0),p(h,null,q(f.value.logs,a=>(c(),p("div",{key:a.uuid,class:"rounded-lg border border-slate-200 p-3 text-sm dark:border-slate-700"},[s("div",Kn,[s("strong",Hn,g(a.alias),1),s("span",{class:D(["rounded px-2 py-0.5 text-xs",a.status==="success"?"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100":"bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-300"])},g(a.status),3)]),s("p",Xn,g(a.message),1)]))),128))])])])):(c(),p("p",Ln,"填写测试表单后运行 dry-run。它不会访问数据库,只验证当前草稿的 JSON、模板路径和模拟链路。"))])])):(c(),p("div",Yn,[u.value.versions.length?C("",!0):(c(),p("p",eo,"还没有本地版本。点击“保存快照”或“本地发布”会生成版本。")),(c(!0),p(h,null,q(u.value.versions,a=>{var v;return c(),p("div",{key:a.id,class:"flex flex-wrap items-center justify-between gap-3 rounded-lg border border-slate-200 p-3 dark:border-slate-700"},[s("div",null,[s("p",to,g(a.label),1),s("p",so,g(We(a.createdAt))+" · "+g(((v=a.apiJson.blocks)==null?void 0:v.length)||0)+" steps",1)]),s("button",{class:"builder-secondary-button",onClick:m=>Xt(a)},"回滚",8,ro)])}),128))]))])])])):(c(),p("section",ao,[t[71]||(t[71]=s("h2",{class:"text-xl font-semibold text-slate-950 dark:text-white"},"找不到这个本地 API 草稿",-1)),t[72]||(t[72]=s("p",{class:"mt-2 text-sm text-slate-500 dark:text-slate-400"},"草稿只保存在当前浏览器。可以返回列表重新创建。",-1)),s("button",{class:"mt-4 rounded-lg bg-teal-600 px-4 py-2 text-sm font-semibold text-white hover:bg-teal-500",onClick:$e},"返回 API 列表")])):(c(),p("div",Xs,[s("section",Ys,[s("div",{class:"flex flex-wrap items-start justify-between gap-3"},[t[30]||(t[30]=s("div",null,[s("p",{class:"text-sm font-medium text-teal-700 dark:text-teal-300"},"API Builder"),s("h2",{class:"mt-1 text-2xl font-semibold text-slate-950 dark:text-white"},"可视化搭建内部数据 API"),s("p",{class:"mt-2 max-w-3xl text-sm leading-6 text-slate-600 dark:text-slate-300"}," 纯客户端草稿工作台。先把接口入口、请求参数、编排步骤和响应结构搭顺,再导出符合 Mokelay Orchestration 的 API JSON。 ")],-1)),s("button",{"data-testid":"api-builder-new",class:"rounded-lg bg-teal-600 px-4 py-2 text-sm font-semibold text-white hover:bg-teal-500",onClick:bt}," 新建 API ")]),s("div",er,[s("table",tr,[t[32]||(t[32]=s("thead",{class:"bg-slate-50 text-left text-xs uppercase tracking-wide text-slate-500 dark:bg-slate-800/70 dark:text-slate-400"},[s("tr",null,[s("th",{class:"px-4 py-3"},"名称"),s("th",{class:"px-4 py-3"},"UUID"),s("th",{class:"px-4 py-3"},"方法"),s("th",{class:"px-4 py-3"},"状态"),s("th",{class:"px-4 py-3"},"最近编辑"),s("th",{class:"px-4 py-3 text-right"},"操作")])],-1)),s("tbody",sr,[Me.value.length?C("",!0):(c(),p("tr",rr,[...t[31]||(t[31]=[s("td",{colspan:"6",class:"px-4 py-8 text-center text-slate-500 dark:text-slate-400"},"暂无本地草稿,可以从右侧模板或样例开始。",-1)])])),(c(!0),p(h,null,q(Me.value,a=>(c(),p("tr",{key:a.id,class:"bg-white dark:bg-slate-900"},[s("td",ar,g(a.apiJson.alias||"未命名 API"),1),s("td",nr,g(a.apiJson.uuid),1),s("td",or,[s("span",ir,g(a.apiJson.method),1)]),s("td",lr,[s("span",{class:D(["rounded-md px-2 py-1 text-xs font-semibold",a.status==="published"?"bg-emerald-100 text-emerald-800 dark:bg-emerald-500/20 dark:text-emerald-100":"bg-amber-100 text-amber-800 dark:bg-amber-500/20 dark:text-amber-100"])},g(a.status==="published"?"本地已发布":"草稿"),3)]),s("td",ur,g(We(a.updatedAt)),1),s("td",dr,[s("button",{class:"rounded-md px-2 py-1 text-teal-700 hover:bg-teal-50 dark:text-teal-200 dark:hover:bg-teal-500/10",onClick:v=>oe(a)},"打开",8,cr),s("button",{class:"rounded-md px-2 py-1 text-rose-700 hover:bg-rose-50 dark:text-rose-200 dark:hover:bg-rose-500/10",onClick:v=>yt(a)},"删除",8,pr)])]))),128))])])])]),s("aside",fr,[s("section",br,[t[33]||(t[33]=s("h3",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"从模板创建",-1)),s("div",mr,[T(s("select",{"onUpdate:modelValue":t[0]||(t[0]=a=>x.selectedTemplateId=a),class:"builder-input"},[(c(!0),p(h,null,q(P(Je),a=>(c(),p("option",{key:a.id,value:a.id},g(a.title),9,gr))),128))],512),[[te,x.selectedTemplateId]]),s("div",yr,[T(s("input",{"onUpdate:modelValue":t[1]||(t[1]=a=>x.datasource=a),class:"builder-input",placeholder:"数据源,如 Mokelay"},null,512),[[B,x.datasource]]),T(s("input",{"onUpdate:modelValue":t[2]||(t[2]=a=>x.table=a),class:"builder-input",placeholder:"表名,如 users"},null,512),[[B,x.table]]),T(s("input",{"onUpdate:modelValue":t[3]||(t[3]=a=>x.idField=a),class:"builder-input",placeholder:"主键,如 id"},null,512),[[B,x.idField]]),T(s("input",{"onUpdate:modelValue":t[4]||(t[4]=a=>x.requestFields=a),class:"builder-input",placeholder:"请求字段,逗号分隔"},null,512),[[B,x.requestFields]])]),T(s("input",{"onUpdate:modelValue":t[5]||(t[5]=a=>x.returnFields=a),class:"builder-input",placeholder:"返回字段,逗号分隔"},null,512),[[B,x.returnFields]]),s("button",{class:"w-full rounded-lg bg-slate-900 px-3 py-2 text-sm font-semibold text-white hover:bg-slate-700 dark:bg-white dark:text-slate-950",onClick:t[6]||(t[6]=a=>mt())}," 使用模板 ")])]),s("section",kr,[t[34]||(t[34]=s("h3",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"内置样例",-1)),s("div",vr,[(c(!0),p(h,null,q(P(Es),a=>(c(),p("button",{key:a.id,class:"rounded-lg border border-slate-200 p-3 text-left hover:border-teal-300 hover:bg-teal-50 dark:border-slate-700 dark:hover:border-teal-500/60 dark:hover:bg-teal-500/10",onClick:v=>Le(a.apiJson)},[s("span",hr,g(a.title),1),s("span",_r,g(a.description),1)],8,xr))),128))])])])]))])}}}),uo=ns(no,[["__scopeId","data-v-1d9d7b69"]]);export{uo as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.builder-input[data-v-1d9d7b69]{width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1));outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.builder-input[data-v-1d9d7b69]:focus{--tw-border-opacity: 1;border-color:rgb(20 184 166 / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(20 184 166 / .2) }.builder-input[data-v-1d9d7b69]:disabled{cursor:not-allowed;--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.builder-input[data-v-1d9d7b69]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.builder-input[data-v-1d9d7b69]:disabled:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.builder-field[data-v-1d9d7b69]{display:flex;flex-direction:column;gap:.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.builder-field[data-v-1d9d7b69]:is(.dark *){--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.builder-secondary-button[data-v-1d9d7b69]{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.builder-secondary-button[data-v-1d9d7b69]:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.builder-secondary-button[data-v-1d9d7b69]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.builder-secondary-button[data-v-1d9d7b69]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.builder-small-button[data-v-1d9d7b69]{border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:600;--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.builder-small-button[data-v-1d9d7b69]:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.builder-small-button[data-v-1d9d7b69]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.builder-small-button[data-v-1d9d7b69]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.builder-icon-button[data-v-1d9d7b69]{border-radius:.375rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:600;--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.builder-icon-button[data-v-1d9d7b69]:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.builder-icon-button[data-v-1d9d7b69]:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.builder-icon-button[data-v-1d9d7b69]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.builder-nav-button[data-v-1d9d7b69]{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.builder-nav-button[data-v-1d9d7b69]:hover{--tw-border-opacity: 1;border-color:rgb(94 234 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(240 253 250 / var(--tw-bg-opacity, 1))}.builder-nav-button[data-v-1d9d7b69]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1));--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.builder-nav-button[data-v-1d9d7b69]:hover:is(.dark *){background-color:#14b8a61a}.builder-nav-button-active[data-v-1d9d7b69]{--tw-border-opacity: 1;border-color:rgb(45 212 191 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(240 253 250 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 94 89 / var(--tw-text-opacity, 1))}.builder-nav-button-active[data-v-1d9d7b69]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(20 184 166 / var(--tw-border-opacity, 1));background-color:#14b8a633;--tw-text-opacity: 1;color:rgb(204 251 241 / var(--tw-text-opacity, 1))}.builder-palette-button[data-v-1d9d7b69]{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1));padding:.75rem;text-align:left}.builder-palette-button[data-v-1d9d7b69]:hover{--tw-border-opacity: 1;border-color:rgb(94 234 212 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(240 253 250 / var(--tw-bg-opacity, 1))}.builder-palette-button[data-v-1d9d7b69]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.builder-palette-button[data-v-1d9d7b69]:hover:is(.dark *){border-color:#14b8a699;background-color:#14b8a61a}.builder-palette-button span[data-v-1d9d7b69]{display:block;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.builder-palette-button span[data-v-1d9d7b69]:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.builder-palette-button small[data-v-1d9d7b69]{margin-top:.25rem;display:block;font-size:.75rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.builder-palette-button small[data-v-1d9d7b69]:is(.dark *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.builder-tab-button[data-v-1d9d7b69]{border-radius:.5rem;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.builder-tab-button[data-v-1d9d7b69]:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.builder-tab-button[data-v-1d9d7b69]:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.builder-tab-button[data-v-1d9d7b69]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.builder-tab-button-active[data-v-1d9d7b69]{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.builder-tab-button-active[data-v-1d9d7b69]:hover{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.builder-tab-button-active[data-v-1d9d7b69]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(2 6 23 / var(--tw-text-opacity, 1))}.builder-tab-button-active[data-v-1d9d7b69]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[data-v-a2d090c3] .mokelay-editor-tool{position:relative}[data-v-a2d090c3] .mokelay-editor-tool__property-dialog{width:min(100%,480px);border:0;border-radius:16px;padding:0;box-shadow:0 24px 80px #0f172a52}[data-v-a2d090c3] .mokelay-editor-tool__property-dialog::backdrop{background:#0f172a73}[data-v-a2d090c3] .mokelay-editor-tool__property-panel{margin:0;padding:20px;background:#fff}[data-v-a2d090c3] .mokelay-editor-tool__property-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}[data-v-a2d090c3] .mokelay-editor-tool__property-title{margin:0;color:#0f172a;font-size:18px;font-weight:600}[data-v-a2d090c3] .mokelay-editor-tool__property-close{border:0;border-radius:10px;padding:8px 12px;background:#e2e8f0;color:#334155;cursor:pointer}[data-v-a2d090c3] .mokelay-editor-tool__property-body{display:flex;flex-direction:column;gap:14px}[data-v-a2d090c3] .mokelay-editor-tool__property-field{display:flex;flex-direction:column;gap:6px}[data-v-a2d090c3] .mokelay-editor-tool__property-field--checkbox{flex-direction:row;align-items:center;gap:10px}[data-v-a2d090c3] .mokelay-editor-tool__property-label{color:#334155;font-size:13px;font-weight:600}[data-v-a2d090c3] .mokelay-editor-tool__property-checkbox{width:16px;height:16px;margin:0}[data-v-a2d090c3] .mokelay-editor-tool__property-input{width:100%;border:1px solid rgb(148 163 184 / .65);border-radius:10px;padding:10px 12px;background:#fff;color:#0f172a;font-size:14px;line-height:20px}[data-v-a2d090c3] .mokelay-editor-tool__property-input:focus{outline:none;border-color:#6366f1;box-shadow:0 0 0 2px #6366f126}[data-v-a2d090c3] .mokelay-editor-tool__property-textarea{min-height:128px;resize:vertical;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}[data-v-a2d090c3] .mokelay-editor-tool__property-input[aria-invalid=true]{border-color:#dc2626;box-shadow:0 0 0 2px #dc26261f}[data-v-a2d090c3] .mokelay-editor-tool__property-error{color:#dc2626;font-size:12px;line-height:18px}.dark{background:#0f172a}.dark{color:#f1f5f9}.dark{background:#334155;color:#f1f5f9}.dark{color:#cbd5e1}.dark{background:#0f172a;color:#e2e8f0;border-color:#475569e6}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as b}from"./MPage.vue_vue_type_script_setup_true_lang-Cv6Zw1sY.js";import{u as x,_ as h}from"./block-advanced-EJNdvNM4.js";import{f as y,o as r,j as o,C as l,u as v,t as d,l as i,x as _,r as B}from"./vue-vendor-CGusfGYN.js";import"./editorjs-CrGo22NX.js";import"./block-editor-selector-N7oIwjwP.js";import"./block-form-fUFBuZp1.js";import"./block-chart-CQQxcr05.js";import"./echarts-BN_iJMI5.js";import"./zrender-CyMoNtco.js";import"./block-datasource-C6tZoarT.js";import"./element-plus-Bo3B6ZwD.js";const C={"data-testid":"editor-panel",class:"flex min-h-[520px] flex-1 flex-col rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},w={key:0,"data-testid":"editor-loading-state",class:"mb-3 rounded border border-sky-300 bg-sky-50 p-3 text-sm text-sky-800 dark:border-sky-500/60 dark:bg-sky-900/30 dark:text-sky-100"},E={key:1,"data-testid":"editor-error-state",class:"mb-3 rounded border border-red-300 bg-red-50 p-3 text-sm text-red-800 dark:border-red-500/60 dark:bg-red-900/30 dark:text-red-100"},N={key:2,class:"mb-4 flex flex-col gap-1.5 text-sm"},I=["value"],P=y({__name:"EditorPanel",props:{blocks:{default:()=>[]},pageName:{default:""},loading:{type:Boolean,default:!1},error:{default:""}},emits:["change","name-change"],setup(e,{expose:c,emit:u}){const m=e,s=u,n=B(null),{t:g}=x();async function p(){var t;const a=await((t=n.value)==null?void 0:t.saveEditor())??{blocks:m.blocks};return s("change",a.blocks),a}function f(a){s("change",a)}return c({save:p}),(a,t)=>(r(),o("section",C,[e.loading?(r(),o("p",w,l(v(g)("page.loading")),1)):e.error?(r(),o("p",E,l(e.error),1)):d("",!0),e.loading?d("",!0):(r(),o("label",N,[t[1]||(t[1]=i("span",{class:"font-medium text-slate-700 dark:text-slate-200"},"页面标题",-1)),i("input",{"data-testid":"page-name-input",class:"rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-100",value:e.pageName,placeholder:"请输入页面标题",onInput:t[0]||(t[0]=k=>s("name-change",k.target.value))},null,40,I)])),e.loading?d("",!0):(r(),_(b,{key:3,ref_key:"pageRef",ref:n,edit:!0,value:e.blocks,onChange:f},null,8,["value"]))]))}}),H=h(P,[["__scopeId","data-v-a2d090c3"]]);export{H as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o}from"./MPage.vue_vue_type_script_setup_true_lang-Cv6Zw1sY.js";import"./editorjs-CrGo22NX.js";import"./block-advanced-EJNdvNM4.js";import"./vue-vendor-CGusfGYN.js";import"./element-plus-Bo3B6ZwD.js";import"./block-editor-selector-N7oIwjwP.js";import"./block-form-fUFBuZp1.js";import"./block-chart-CQQxcr05.js";import"./echarts-BN_iJMI5.js";import"./zrender-CyMoNtco.js";import"./block-datasource-C6tZoarT.js";export{o as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A,F as L,E as q}from"./editorjs-CrGo22NX.js";import{u as z,k as D}from"./block-advanced-
|
|
1
|
+
import{A,F as L,E as q}from"./editorjs-CrGo22NX.js";import{u as z,k as D}from"./block-advanced-EJNdvNM4.js";import{c as G}from"./block-editor-selector-N7oIwjwP.js";import{_ as E}from"./block-form-fUFBuZp1.js";import{f as H,z as U,F as v,A as B,B as I,o,j as i,G as k,H as g,x as K,q as Q,t as W,e as C,r as X}from"./vue-vendor-CGusfGYN.js";const Y={key:1,"data-testid":"preview-blocks",class:"space-y-1"},Z=["data-testid"],ee={key:1,"data-testid":"preview-columns",class:"grid gap-3 md:grid-cols-2"},te=["data-testid"],ae=["data-testid"],le=H({__name:"MPage",props:{edit:{type:Boolean,default:!1},value:{default:()=>[]},onToolChange:{}},emits:["change"],setup($,{expose:T,emit:J}){const s=$,N=J,l=C(()=>s.edit);let r=null,c=!1,u=!1,n={blocks:s.value};const{t:S,localeValue:h}=z(),d=X(null),x=C(()=>Array.isArray(s.value)?s.value:[]);function F(e){const t=e.data.cols;return Array.isArray(t)?t.filter(a=>typeof a=="object"&&a!==null):[]}function M(e){return Array.isArray(e.blocks)?e.blocks:[]}function w(e){return{blocks:e}}function O(e,t){return JSON.stringify(e)===JSON.stringify(t)}function P(e){var a;const t={edit:s.edit,value:e};(a=s.onToolChange)==null||a.call(s,t),u=!0,N("change",e)}async function f(){if(!d.value||!l.value||r)return;const e={...G({edit:!0}),table:{class:L,inlineToolbar:!0}};r=new A({holder:d.value,placeholder:S("editor.placeholder"),tools:{...e,columns:{class:q,config:{EditorJsLibrary:A,tools:e}}},data:n,i18n:{messages:D(h.value)},onChange:async()=>{if(!r)return;const t=await r.save();n=t,!c&&P(t.blocks)}})}async function y(){const e=r;if(e){r=null;try{n=await e.save()}catch{n=w(s.value)}e.destroy()}}async function _(){await y(),await B(),await f()}async function R(){if(!r)return n;const e=await r.save();return n=e,e}return T({saveEditor:R}),U(async()=>{await f()}),v(()=>s.value,async e=>{if(u){u=!1;return}const t=Array.isArray(e)?e:[],a=Array.isArray(n.blocks)?n.blocks:[];O(t,a)||(c=!0,n=w(t),r&&await _(),c=!1)},{deep:!0}),v(h,async()=>{r&&await _()}),v(l,async e=>{if(e){await B(),await f();return}await y()}),I(async()=>{await y()}),(e,t)=>l.value?(o(),i("div",{key:0,ref_key:"holderRef",ref:d,"data-testid":"editor-surface",class:"min-h-0 flex-1 rounded-lg border border-slate-300 bg-slate-50 py-3 pr-3 pl-11 dark:border-slate-700 dark:bg-slate-950"},null,512)):(o(),i("div",Y,[(o(!0),i(k,null,g(x.value,(a,p)=>(o(),i("div",{key:p,"data-testid":`preview-block-${a.type}`,class:"p-0"},[a.type!=="columns"?(o(),K(E,{key:0,block:a},null,8,["block"])):a.type==="columns"?(o(),i("div",ee,[(o(!0),i(k,null,g(F(a),(V,m)=>(o(),i("div",{key:`columns-${p}-${m}`,"data-testid":`preview-column-${m}`,class:"space-y-2 p-2"},[(o(!0),i(k,null,g(M(V),(b,j)=>(o(),i("div",{key:`columns-${p}-${m}-${j}`,"data-testid":`preview-column-block-${b.type}`,class:"p-2"},[Q(E,{block:b,"compact-table":""},null,8,["block"])],8,ae))),128))],8,te))),128))])):W("",!0)],8,Z))),128))]))}});export{le as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as s}from"./block-advanced-
|
|
1
|
+
import{u as s}from"./block-advanced-EJNdvNM4.js";import{_ as l}from"./MPage.vue_vue_type_script_setup_true_lang-Cv6Zw1sY.js";import{f as i,o as r,j as t,l as n,C as a,u as d,x as b}from"./vue-vendor-CGusfGYN.js";import"./element-plus-Bo3B6ZwD.js";import"./editorjs-CrGo22NX.js";import"./block-editor-selector-N7oIwjwP.js";import"./block-form-fUFBuZp1.js";import"./block-chart-CQQxcr05.js";import"./echarts-BN_iJMI5.js";import"./zrender-CyMoNtco.js";import"./block-datasource-C6tZoarT.js";const m={"data-testid":"preview-panel",class:"flex min-h-[520px] flex-1 flex-col rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-900"},c={class:"flex-1 overflow-auto"},p={key:0,"data-testid":"preview-loading-state",class:"rounded border border-sky-300 bg-sky-50 p-3 text-sky-800 dark:border-sky-500/60 dark:bg-sky-900/30 dark:text-sky-100"},k={key:1,"data-testid":"preview-error-state",class:"rounded border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-500/60 dark:bg-red-900/30 dark:text-red-100"},f={key:2,"data-testid":"preview-empty-state",class:"rounded border border-amber-300 bg-amber-50 p-3 text-amber-800 dark:border-amber-500/60 dark:bg-amber-900/30 dark:text-amber-100"},D=i({__name:"PreviewPanel",props:{blocks:{default:()=>[]},loading:{type:Boolean,default:!1},error:{default:""}},setup(e){const{t:o}=s();return(u,g)=>(r(),t("section",m,[n("div",c,[e.loading?(r(),t("p",p,a(d(o)("page.loading")),1)):e.error?(r(),t("p",k,a(e.error),1)):e.blocks.length?(r(),b(l,{key:3,edit:!1,value:e.blocks},null,8,["value"])):(r(),t("p",f,a(d(o)("preview.emptyState")),1))])]))}});export{D as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as F,e as D,y as Be,f as ae,o as f,j as g,l as S,z as xe,A as ue,B as Te,C as z,q as Fe,s as De,D as Ie,u as Y,E as he,F as we,v as q,G as A,H as U,p as Ne,t as K,x as Ee,m as Re,I as Oe,n as ce,J as Pe}from"./vue-vendor-CGusfGYN.js";import{E as Ue}from"./element-plus-Bo3B6ZwD.js";const je={app:{title:"Mokelay Editor",subtitle:"Mokelay page configurator",darkMode:"Dark mode",dark:"Dark",light:"Light",language:"Language",home:"Home",chinese:"中文",english:"English"},editor:{placeholder:"Start typing your content...",defaultParagraph:"Welcome to the Mokelay editor starter template.",fullscreenEdit:"Fullscreen",saveContent:"Save",saving:"Saving...",saveSuccess:"Saved",saveFailed:"Save failed. Please try again.",previewPage:"Preview",properties:"Properties",propertyDialogTitle:"Property Settings",configJson:"Config JSON",close:"Close",invalidJson:"Enter valid JSON."},preview:{title:"Config Preview",backToEditor:"Back",emptyState:"No page content yet."},globalCalls:{ok:"OK",cancel:"Cancel",alertRoleLabel:"Alert",confirmRoleLabel:"Confirm",messageRoleLabel:"Message"},input:{toolboxTitle:"Input",defaultPlaceholder:"Please enter...",propertyPanelTitle:"Input Properties",properties:{placeholder:"Placeholder",value:"Default value",valuePlaceholder:"Please enter a default value"}},link:{toolboxTitle:"Link",defaultText:"Link",defaultUrl:"https://mokelay.com",propertyPanelTitle:"Link Properties",properties:{text:"Link text",url:"Link URL",open:"Open in new page"}},advanceInput:{toolboxTitle:"Advanced Input"},dividerLine:{toolboxTitle:"Divider"},chart:{toolboxTitle:"Chart",propertyPanelTitle:"Chart Properties",defaultSeriesName:"Data",types:{line:"Line chart",bar:"Bar chart",pie:"Pie chart"},properties:{type:"Chart type",xAxis:"X-axis data",series:"Series data"},validation:{invalidJson:"Enter valid JSON."}},editorSelector:{toolboxTitle:"Component Selector",placeholder:"Select a component"},form:{toolboxTitle:"Form",placeholder:"Add a form item"},advanceTable:{toolboxTitle:"Advanced Table",propertyPanelTitle:"Advanced Table Properties",defaultColumnName:"Column",empty:"No data",selectAll:"Select all",selectRow:"Select row",properties:{index:"Show index column",selection:"Show selection column"},defaultColumns:{name:"Name",status:"Status",tag:"Tag",owner:"Owner",link:"Link"},defaultRows:{first:{name:"Mokelay Page",status:"Designing",tag:"Design",owner:"Product Team",linkText:"Website",linkUrl:"https://mokelay.com"},second:{name:"Advanced Table",status:"Previewable",tag:"Preview",owner:"Editor Team",linkText:"Docs",linkUrl:"https://editor.mokelay.com"}}},datasource:{toolboxTitle:"Datasource Editor",title:"Datasource",empty:"No items",emptySchema:'No field config yet. Click "Generate field config" first.',noListRecord:"This schema does not contain an array field for list data.",noFormFields:"This schema does not contain simple fields for a form.",fields:{type:"Datasource type",rawData:"JSON data",domain:"API domain",path:"API path",method:"Method",key:"Key",mock:"Mock data",jsonSchema:"JSON Schema",generatedFields:"Fields",searchFields:"Search fields or paths",recordPath:"List data path",rootRecordPath:"Root data",selectedFields:"Selected fields",required:"Required"},sections:{headers:"Header",queries:"Query",body:"Body",generateFields:"Generate field config",fieldSelection:"Field selection"},actions:{add:"Add",remove:"Remove",parseJsonSchema:"Parse JSON Schema",parsingJsonSchema:"Parsing...",generateFields:"Generate field config",generatingFields:"Generating..."},tabs:{list:"List fields",form:"Form fields",advanced:"Advanced Schema"},help:{generateFields:"Detect fields from JSON data or an API response, then prepare them for list and form components.",fieldSelection:"Choose the fields components should use, and rename them with business-friendly labels."},schemaTypes:{object:"Object",array:"List",string:"Text",number:"Number",boolean:"Switch",null:"Empty",union:"Union"},componentHints:{text:"Text",number:"Number",switch:"Switch",object:"Object",array:"List"},validation:{invalidJson:"Enter valid JSON.",invalidJsonSchema:"Enter a JSON Schema that matches the supported format.",invalidNumber:"Enter a valid number.",invalidObject:"Enter a valid JSON object.",invalidArray:"Enter a valid JSON array.",fixJsonBeforeSchema:"Fix JSON data before parsing JSON Schema.",fixBodyBeforeSchema:"Fix Body mock data before parsing JSON Schema.",nonJsonResponse:"The API response is not JSON.",invalidJsonResponse:"The API response is not valid JSON.",apiRequestFailed:"API request failed:",emptyArraySchema:"Cannot infer JSON Schema from an empty array.",mixedArraySchema:"The array contains incompatible types, so JSON Schema cannot be inferred."}},formItem:{toolboxTitle:"Form Item",defaultLabelName:"Field",propertyPanelTitle:"Form Item Properties",emptyEditor:"No editor selected",properties:{labelName:"Field label",variableName:"Variable name",editor:"Editor",layout:"Layout"},placeholders:{labelName:"Enter field label",variableName:"Enter variable name"},layouts:{vertical:"Vertical",horizontal:"Horizontal"}},tag:{toolboxTitle:"Tag",defaultTagName:"Tag",propertyPanelTitle:"Tag Properties",properties:{tagName:"Tag name",type:"Type",size:"Size",color:"Custom color",colorPlaceholder:"e.g. #409EFF",closable:"Closable"},types:{default:"Default",primary:"Primary",success:"Success",info:"Info",warning:"Warning",danger:"Danger"},sizes:{default:"Default",large:"Large",medium:"Medium",small:"Small"}},page:{toolboxTitle:"Page",loading:"Loading page...",loadFailed:"Failed to load page. Please try again."}},Ve={},He={app:{title:"Mokelay Editor",subtitle:"Mokelay页面配置器",darkMode:"深色模式",dark:"深色",light:"浅色",language:"语言",home:"首页",chinese:"中文",english:"English"},editor:{placeholder:"开始输入你的内容...",defaultParagraph:"欢迎使用 Mokelay 编辑器初始化模板。",fullscreenEdit:"全屏编辑",saveContent:"保存",saving:"保存中...",saveSuccess:"保存成功",saveFailed:"保存失败,请稍后重试",previewPage:"预览",properties:"属性",propertyDialogTitle:"属性设置",configJson:"配置 JSON",close:"关闭",invalidJson:"请输入有效 JSON。"},preview:{title:"配置预览",backToEditor:"返回",emptyState:"暂无页面内容。"},globalCalls:{ok:"确定",cancel:"取消",alertRoleLabel:"提示",confirmRoleLabel:"确认",messageRoleLabel:"消息"},input:{toolboxTitle:"输入框",defaultPlaceholder:"请输入.....",propertyPanelTitle:"输入框属性",properties:{placeholder:"占位提示",value:"默认值",valuePlaceholder:"请输入默认值"}},link:{toolboxTitle:"链接",defaultText:"链接",defaultUrl:"https://mokelay.com",propertyPanelTitle:"链接属性",properties:{text:"链接文本",url:"链接地址",open:"新页面打开"}},advanceInput:{toolboxTitle:"高级输入框"},dividerLine:{toolboxTitle:"分割线"},chart:{toolboxTitle:"图表",propertyPanelTitle:"图表属性",defaultSeriesName:"数据",types:{line:"折线图",bar:"柱状图",pie:"饼图"},properties:{type:"图表类型",xAxis:"横坐标数据",series:"图表数据"},validation:{invalidJson:"请输入有效 JSON。"}},editorSelector:{toolboxTitle:"组件选择器",placeholder:"选择组件"},form:{toolboxTitle:"表单",placeholder:"添加表单项"},advanceTable:{toolboxTitle:"高级表格",propertyPanelTitle:"高级表格属性",defaultColumnName:"列",empty:"暂无数据",selectAll:"全选",selectRow:"选择行",properties:{index:"显示序号列",selection:"显示多选列"},defaultColumns:{name:"名称",status:"状态",tag:"标签",owner:"负责人",link:"链接"},defaultRows:{first:{name:"Mokelay 页面",status:"设计中",tag:"设计",owner:"产品团队",linkText:"官网",linkUrl:"https://mokelay.com"},second:{name:"高级表格",status:"可预览",tag:"预览",owner:"编辑器团队",linkText:"文档",linkUrl:"https://editor.mokelay.com"}}},datasource:{toolboxTitle:"数据源编辑器",title:"数据源",empty:"暂无配置项",emptySchema:"还没有字段配置,请先点击“生成字段配置”。",noListRecord:"当前 Schema 中没有可作为列表数据的数组字段。",noFormFields:"当前 Schema 中没有可用于表单的普通字段。",fields:{type:"数据源类型",rawData:"JSON 数据",domain:"API 域名",path:"API Path",method:"调用方法",key:"Key",mock:"Mock 数据",jsonSchema:"JSON Schema",generatedFields:"字段数",searchFields:"搜索字段名称或路径",recordPath:"列表数据位置",rootRecordPath:"根数据",selectedFields:"已选择字段",required:"必填"},sections:{headers:"Header",queries:"Query",body:"Body",generateFields:"生成字段配置",fieldSelection:"字段选择"},actions:{add:"添加",remove:"删除",parseJsonSchema:"解析JSON Schema",parsingJsonSchema:"解析中...",generateFields:"生成字段配置",generatingFields:"生成中..."},tabs:{list:"列表字段",form:"表单字段",advanced:"高级 Schema"},help:{generateFields:"从 JSON 数据或 API 响应中识别字段,生成给列表和表单使用的配置。",fieldSelection:"勾选需要给组件使用的字段,可以直接改成业务同学看得懂的名称。"},schemaTypes:{object:"对象",array:"列表",string:"文本",number:"数字",boolean:"开关",null:"空值",union:"联合"},componentHints:{text:"文本",number:"数字",switch:"开关",object:"对象",array:"列表"},validation:{invalidJson:"请输入标准 JSON 结构。",invalidJsonSchema:"请输入符合数据格式的 JSON Schema。",invalidNumber:"请输入有效数字。",invalidObject:"请输入标准 JSON 对象。",invalidArray:"请输入标准 JSON 数组。",fixJsonBeforeSchema:"请先修正 JSON 数据。",fixBodyBeforeSchema:"请先修正 Body 中的 Mock 数据。",nonJsonResponse:"API 响应不是 JSON 数据。",invalidJsonResponse:"API 响应不是有效 JSON 数据。",apiRequestFailed:"API 请求失败:",emptyArraySchema:"空数组无法推断 JSON Schema。",mixedArraySchema:"数组中包含无法合并的类型,无法推断 JSON Schema。"}},formItem:{toolboxTitle:"表单项",defaultLabelName:"字段",propertyPanelTitle:"表单项属性",emptyEditor:"未选择编辑器",properties:{labelName:"字段文本",variableName:"变量名",editor:"编辑器",layout:"布局方式"},placeholders:{labelName:"请输入字段文本",variableName:"请输入变量名"},layouts:{vertical:"垂直",horizontal:"水平"}},tag:{toolboxTitle:"标签",defaultTagName:"标签",propertyPanelTitle:"标签属性",properties:{tagName:"标签内容",type:"标签类型",size:"标签尺寸",color:"自定义颜色",colorPlaceholder:"例如:#409EFF",closable:"可关闭"},types:{default:"默认",primary:"主要",success:"成功",info:"信息",warning:"警告",danger:"危险"},sizes:{default:"默认",large:"大",medium:"中",small:"小"}},page:{toolboxTitle:"页面",loading:"正在读取页面...",loadFailed:"页面读取失败,请稍后重试。"}},We={ui:{blockTunes:{toggler:{"Click to tune":"点击设置","or drag to move":"或拖拽移动"}},inlineToolbar:{converter:{"Convert to":"转换为"}},toolbar:{toolbox:{Add:"添加"}},popover:{Filter:"筛选","Nothing found":"未找到结果"}},blockTunes:{delete:{Delete:"删除"},moveUp:{"Move up":"上移"},moveDown:{"Move down":"下移"}},toolNames:{Text:"文本",Heading:"标题",List:"列表",Warning:"提示",Checklist:"清单",Quote:"引用",Delimiter:"分割线",Table:"表格",Link:"链接",Columns:"分栏"}},qe={zh:He,en:je},Ke={zh:We,en:Ve},Me="mokelay-editor-locale";function Xe(e){const s=(document.cookie?document.cookie.split("; "):[]).find(c=>c.startsWith(`${e}=`));return s?decodeURIComponent(s.slice(e.length+1)):null}function Ge(e,t){document.cookie=`${e}=${encodeURIComponent(t)}; path=/; max-age=31536000; samesite=lax`}function Qe(){return navigator.language.toLowerCase().startsWith("zh")?"zh":"en"}function Ye(){const e=Xe(Me);return e==="zh"||e==="en"?e:Qe()}const te=F(Ye());function ze(e){const t=e.split(".");let s=qe[te.value];for(const c of t){if(typeof s=="object"&&s!==null&&c in s){s=s[c];continue}s=void 0;break}return typeof s=="string"?s:e}function Ae(e){te.value=e,Ge(Me,e)}function Ce(){return{locale:Be(te),t:ze,setLocale:Ae,localeValue:D(()=>te.value)}}function Yt(e){return Ke[e]}const r={t:ze,get locale(){return te.value},setLocale:Ae};function Zt(e){return e}const Ze={class:"ce-input-tool","data-testid":"editor-input-tool"},et=["placeholder","value"],tt={toolbox:{get title(){return r.t("input.toolboxTitle")},icon:'<svg width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="6" width="18" height="12" rx="2" ry="2" fill="none" stroke="currentColor" stroke-width="2"/><path d="M8 12h8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>'},propertyPanel:{get title(){return r.t("input.propertyPanelTitle")},get fields(){return[{key:"placeholder",label:r.t("input.properties.placeholder"),placeholder:r.t("input.defaultPlaceholder")},{key:"value",label:r.t("input.properties.value"),placeholder:r.t("input.properties.valuePlaceholder")}]}},createInitialProps:()=>({placeholder:r.t("input.defaultPlaceholder"),value:""}),normalizeProps:e=>({edit:e.edit??!1,placeholder:e.placeholder??"",value:e.value??""}),serialize:e=>({placeholder:e.placeholder??"",value:e.value??""})},at=ae({__name:"MInput",props:{edit:{type:Boolean},placeholder:{},value:{},onChange:{type:Function},onToolChange:{type:Function}},setup(e){const t=e;function s(c){var T,M;const h={edit:t.edit,placeholder:t.placeholder??"",value:t.value??"",...c};(T=t.onToolChange)==null||T.call(t,h),(M=t.onChange)==null||M.call(t,h)}return(c,h)=>(f(),g("div",Ze,[S("input",{"data-testid":"editor-input-control",class:"ce-input-tool__control",type:"text",placeholder:e.placeholder,value:e.value,onInput:h[0]||(h[0]=T=>s({value:T.target.value}))},null,40,et)]))}}),oe=(e,t)=>{const s=e.__vccOpts||e;for(const[c,h]of t)s[c]=h;return s},ot=oe(at,[["__scopeId","data-v-38751236"]]),nt=["href","target","rel"],lt={toolbox:{get title(){return r.t("link.toolboxTitle")},icon:'<svg width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M10.6 13.4a4 4 0 0 0 5.7 0l2.1-2.1a4 4 0 0 0-5.7-5.7l-1.2 1.2" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/><path d="M13.4 10.6a4 4 0 0 0-5.7 0l-2.1 2.1a4 4 0 0 0 5.7 5.7l1.2-1.2" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>'},propertyPanel:{get title(){return r.t("link.propertyPanelTitle")},get fields(){return[{key:"text",label:r.t("link.properties.text"),placeholder:r.t("link.defaultText")},{key:"url",label:r.t("link.properties.url"),placeholder:r.t("link.defaultUrl")},{key:"open",label:r.t("link.properties.open"),type:"checkbox"}]}},createInitialProps:()=>({text:r.t("link.defaultText"),url:r.t("link.defaultUrl"),open:!1}),normalizeProps:e=>{var t,s;return{edit:e.edit??!1,text:((t=e.text)==null?void 0:t.trim())||r.t("link.defaultText"),url:((s=e.url)==null?void 0:s.trim())||r.t("link.defaultUrl"),open:e.open===!0}},serialize:e=>{var t,s;return{text:((t=e.text)==null?void 0:t.trim())||r.t("link.defaultText"),url:((s=e.url)==null?void 0:s.trim())||r.t("link.defaultUrl"),open:e.open===!0}}},rt=ae({__name:"MLink",props:{edit:{type:Boolean},text:{},url:{},open:{type:Boolean},onChange:{type:Function},onToolChange:{type:Function}},setup(e){const t=e,{t:s}=Ce(),c=F(null),h=D(()=>{var b;return((b=t.text)==null?void 0:b.trim())||s("link.defaultText")}),T=D(()=>O(t.url??"")),M=D(()=>t.open?"_blank":void 0),E=D(()=>t.open?"noopener noreferrer":void 0);let k=null;function x(){k!==null&&(window.clearTimeout(k),k=null)}function C(){var B;const b=c.value;if(!b)return;const y=b.closest(".ce-block"),N=(B=b.closest(".codex-editor"))==null?void 0:B.querySelector(".ce-toolbar"),L=N==null?void 0:N.querySelector(".ce-toolbar__plus");if(!y||!N||!L)return;const $=y.getBoundingClientRect(),H=b.getBoundingClientRect(),ee=L.getBoundingClientRect().height||26,W=y.offsetTop+(H.top-$.top)+(H.height-ee)/2;N.style.top=`${Math.round(W)}px`}function w(){x(),k=window.setTimeout(()=>{C()},0)}function O(b){const y=b.trim();if(!y)return"#";if(y.startsWith("//"))return`https:${y}`;const N=y.match(/^([a-z][a-z\d+.-]*):/i);if(!N)return y;const L=N[1].toLowerCase();return["http","https","mailto","tel"].includes(L)?y:"#"}function V(b){var N,L;const y={edit:t.edit,text:t.text??"",url:t.url??"",open:t.open??!1,...b};(N=t.onToolChange)==null||N.call(t,y),(L=t.onChange)==null||L.call(t,y)}function J(b){(t.edit||T.value==="#")&&b.preventDefault(),V({text:h.value,url:t.url??"",open:t.open??!1})}return xe(()=>{ue(()=>{var b,y;(b=c.value)==null||b.addEventListener("mouseenter",w),(y=c.value)==null||y.addEventListener("mousemove",w)})}),Te(()=>{var b,y;x(),(b=c.value)==null||b.removeEventListener("mouseenter",w),(y=c.value)==null||y.removeEventListener("mousemove",w)}),(b,y)=>(f(),g("span",{ref_key:"rootRef",ref:c,class:"ce-link-tool","data-testid":"editor-link-tool"},[S("a",{class:"ce-link-tool__anchor","data-testid":"editor-link-value",href:T.value,target:M.value,rel:E.value,onClick:J},z(h.value),9,nt)],512))}}),it=oe(rt,[["__scopeId","data-v-e56db1bc"]]),st={toolbox:{get title(){return r.t("tag.toolboxTitle")},icon:'<svg width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><rect x="4" y="7" width="16" height="10" rx="5" ry="5" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="8" cy="12" r="1.4" fill="currentColor"/></svg>'},propertyPanel:{get title(){return r.t("tag.propertyPanelTitle")},get fields(){return[{key:"tagName",label:r.t("tag.properties.tagName"),placeholder:r.t("tag.defaultTagName")},{key:"type",label:r.t("tag.properties.type"),type:"select",options:[{label:r.t("tag.types.default"),value:""},{label:r.t("tag.types.primary"),value:"primary"},{label:r.t("tag.types.success"),value:"success"},{label:r.t("tag.types.info"),value:"info"},{label:r.t("tag.types.warning"),value:"warning"},{label:r.t("tag.types.danger"),value:"danger"}]},{key:"size",label:r.t("tag.properties.size"),type:"select",options:[{label:r.t("tag.sizes.default"),value:""},{label:r.t("tag.sizes.large"),value:"large"},{label:r.t("tag.sizes.medium"),value:"default"},{label:r.t("tag.sizes.small"),value:"small"}]},{key:"color",label:r.t("tag.properties.color"),placeholder:r.t("tag.properties.colorPlaceholder")},{key:"closable",label:r.t("tag.properties.closable"),type:"checkbox"}]}},createInitialProps:()=>({tagName:r.t("tag.defaultTagName"),closable:!1,size:"",color:"",type:"success"}),normalizeProps:e=>{var t;return{edit:e.edit??!1,tagName:((t=e.tagName)==null?void 0:t.trim())||r.t("tag.defaultTagName"),closable:e.closable===!0,size:e.size??"",color:e.color??"",type:e.type??"success"}},serialize:e=>{var t;return{tagName:((t=e.tagName)==null?void 0:t.trim())||r.t("tag.defaultTagName"),closable:e.closable??!1,size:e.size??"",color:e.color??"",type:e.type??""}}},ct=ae({__name:"MTag",props:{edit:{type:Boolean},tagName:{},closable:{type:Boolean},size:{},color:{},type:{},onChange:{type:Function},onToolChange:{type:Function}},setup(e){const t=e,s=F(null);let c=null;function h(x){var w,O;const C={edit:t.edit,tagName:t.tagName??"",closable:t.closable??!1,size:t.size??"",color:t.color??"",type:t.type??"",...x};(w=t.onToolChange)==null||w.call(t,C),(O=t.onChange)==null||O.call(t,C)}function T(){h({closable:t.closable??!1})}function M(){c!==null&&(window.clearTimeout(c),c=null)}function E(){var N;const x=s.value;if(!x)return;const C=x.closest(".ce-block"),w=(N=x.closest(".codex-editor"))==null?void 0:N.querySelector(".ce-toolbar"),O=w==null?void 0:w.querySelector(".ce-toolbar__plus");if(!C||!w||!O)return;const V=C.getBoundingClientRect(),J=x.getBoundingClientRect(),b=O.getBoundingClientRect().height||26,y=C.offsetTop+(J.top-V.top)+(J.height-b)/2;w.style.top=`${Math.round(y)}px`}function k(){M(),c=window.setTimeout(()=>{E()},0)}return xe(()=>{ue(()=>{var x,C;(x=s.value)==null||x.addEventListener("mouseenter",k),(C=s.value)==null||C.addEventListener("mousemove",k)})}),Te(()=>{var x,C;M(),(x=s.value)==null||x.removeEventListener("mouseenter",k),(C=s.value)==null||C.removeEventListener("mousemove",k)}),(x,C)=>(f(),g("div",{ref_key:"rootRef",ref:s,class:"ce-tag-tool","data-testid":"editor-tag-tool"},[Fe(Y(Ue),{"data-testid":"editor-tag-value",closable:e.closable,size:e.size||void 0,color:e.color||void 0,type:e.type||void 0,onClose:T},{default:De(()=>[Ie(z(e.tagName),1)]),_:1},8,["closable","size","color","type"])],512))}}),dt=oe(ct,[["__scopeId","data-v-ee7d9d5d"]]),Je={MInput:{component:he(ot),...tt},MLink:{component:he(it),...lt},MTag:{component:he(dt),...st}};function ut(){return Object.entries(Je)}function I(e){return Je[e]}function Le(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().slice(0,10):Math.random().toString(36).slice(2,12)}function Z(e,t=Le()){return{id:t,type:"paragraph",data:{text:e}}}function j(e){return typeof e.data.text=="string"?e.data.text:""}function fe(){return[Z("")]}function pt(e){return JSON.parse(JSON.stringify(e))}function pe(e){return typeof e!="object"||e===null||Array.isArray(e)?{}:pt(e)}function de(e){return{id:e.id,type:e.type,data:pe(e.data)}}function ye(e){const t=[];for(const s of e){if(s.type==="paragraph"){const c=t[t.length-1];(c==null?void 0:c.type)==="paragraph"?c.data.text=j(c)+j(s):t.push(Z(j(s),s.id));continue}t.push(de(s))}return t.length?t:fe()}function X(e){if(!Array.isArray(e))return fe();const t=[];return e.forEach(s=>{if(typeof s!="object"||s===null)return;const c=s;if(typeof c.id!="string"||typeof c.type!="string"||typeof c.data!="object"||c.data===null||Array.isArray(c.data))return;const h={id:c.id,type:c.type,data:pe(c.data)};t.push(h.type==="paragraph"?Z(j(h),h.id):h)}),ye(t)}const ft={class:"ce-advance-input-tool","data-testid":"editor-advance-input-tool"},mt={key:0,class:"ce-advance-input-tool__editor-shell"},gt=["data-testid","onMousedown"],ht={key:1,class:"ce-advance-input-tool__preview","data-testid":"preview-advance-input-value"},vt={key:0,class:"ce-advance-input-tool__preview-text"},yt={key:1,class:"ce-advance-input-tool__preview-token"},bt={class:"ce-advance-input-tool__dialog-header"},kt={class:"ce-advance-input-tool__dialog-title","data-testid":"advance-input-embedded-property-title"},_t={type:"submit",class:"ce-advance-input-tool__dialog-close","data-testid":"advance-input-embedded-property-close"},xt={key:0,class:"ce-advance-input-tool__dialog-body"},Tt=["checked","data-testid","onChange"],Ct={class:"ce-advance-input-tool__dialog-label"},St={class:"ce-advance-input-tool__dialog-label"},wt=["value","data-testid","onChange"],Nt=["value"],Pt={class:"ce-advance-input-tool__dialog-label"},Et=["value","placeholder","data-testid","onInput"],ea={toolbox:{get title(){return r.t("advanceInput.toolboxTitle")},icon:'<svg width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="5" width="18" height="14" rx="3" ry="3" fill="none" stroke="currentColor" stroke-width="2"/><path d="M7 10h5M7 14h3M14 10h3M14 14h3" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>'},createInitialProps:()=>({value:fe()}),normalizeProps:e=>({edit:e.edit??!1,value:X(e.value)}),serialize:e=>({value:X(e.value)})},Rt=ae({__name:"MAdvanceInput",props:{edit:{type:Boolean},value:{},onChange:{type:Function},onToolChange:{type:Function}},setup(e){const t=e,{t:s}=Ce(),c=F(null),h=F(null),T=F(!1),M=F({left:0,top:0}),E=F(null),k=new Map;let x=!1,C="";function w(l){return ye(l)}function O(l){return JSON.stringify(w(l))}function V(l){var a;const o=I(l);if(!o)throw new Error(`Unknown inline component "${l}".`);const n=o.normalizeProps({...((a=o.createInitialProps)==null?void 0:a.call(o))??{},edit:!1});return{id:Le(),type:l,data:pe(o.serialize(n))}}function J(){k.forEach(l=>{l.app.unmount()}),k.clear()}function b(l){var P;const o=de(l),n=I(o.type);if(!n){const R=document.createElement("span");return R.className="ce-advance-input-tool__token ce-advance-input-tool__token--unknown",R.dataset.segmentType="component",R.dataset.blockId=o.id,R.dataset.block=JSON.stringify(o),R.textContent=o.type,R}const a=document.createElement("span");a.className="ce-advance-input-tool__token",a.dataset.segmentType="component",a.dataset.blockId=o.id,a.dataset.block=JSON.stringify(o),a.contentEditable="false",a.setAttribute("data-testid",`editor-advance-input-token-${o.type}`);const d=document.createElement("span");d.className="ce-advance-input-tool__token-mount",a.appendChild(d);const _=n.normalizeProps({...((P=n.createInitialProps)==null?void 0:P.call(n))??{},...o.data,edit:!1}),v=Pe(n.component,_);return v.mount(d),a.addEventListener("click",R=>{R.preventDefault(),R.stopPropagation(),ge(o.id)}),k.set(o.id,{app:v,block:de(o),mountPoint:d,wrapper:a}),a}function y(l,o=!1){const n=c.value;if(!n)return;x=!0,J(),n.innerHTML="";const a=X(l);for(const d of a){if(d.type==="paragraph"){n.appendChild(document.createTextNode(j(d)));continue}n.appendChild(b(d)),n.appendChild(document.createTextNode(""))}n.childNodes.length||n.appendChild(document.createTextNode("")),C=O(a),x=!1,o&&ue(()=>{H(n)})}function N(){const l=c.value;if(!l)return fe();const o=[];return l.childNodes.forEach(n=>{if(n.nodeType===Node.TEXT_NODE){const a=(n.textContent??"").replace(/\u200B/g,"");o.push(Z(a));return}if(n instanceof HTMLElement){if(n.dataset.segmentType==="component"){const a=n.dataset.blockId??"",d=k.get(a),_=n.dataset.block?JSON.parse(n.dataset.block):null,v=(d==null?void 0:d.block)??_;v&&o.push(de(v));return}o.push(Z((n.textContent??"").replace(/\u200B/g,"")))}}),ye(o)}function L(l){var n,a;C=O(l);const o={edit:t.edit,value:l};(n=t.onToolChange)==null||n.call(t,o),(a=t.onChange)==null||a.call(t,o)}function $(){if(x)return;const l=w(N());O(l)!==C&&L(l)}function H(l){const o=window.getSelection();if(!o)return;const n=document.createRange();n.selectNodeContents(l),n.collapse(!1),o.removeAllRanges(),o.addRange(n)}function ee(){const l=c.value;l&&l.focus()}function W(){const l=c.value,o=window.getSelection();if(!l||!o||o.rangeCount===0)return null;const n=o.getRangeAt(0);return l.contains(n.startContainer)?{root:l,selection:o,range:n}:null}function B(){const l=W();if(!l||!l.selection.isCollapsed){T.value=!1;return}const{range:o,root:n}=l;let a="";if(o.startContainer.nodeType===Node.TEXT_NODE){const v=o.startContainer.textContent??"";o.startOffset>0&&(a=v[o.startOffset-1]??"")}else if(o.startContainer instanceof HTMLElement&&o.startOffset>0){const v=o.startContainer.childNodes[o.startOffset-1];if((v==null?void 0:v.nodeType)===Node.TEXT_NODE){const P=v.textContent??"";a=P[P.length-1]??""}}if(a!=="/"){T.value=!1;return}const d=o.getBoundingClientRect(),_=n.getBoundingClientRect();M.value={left:Math.max(0,d.left-_.left),top:Math.max(_.height+8,d.bottom-_.top+8)},T.value=!0}function ne(){$(),B()}function le(){B()}function re(){window.setTimeout(()=>{T.value=!1},120)}function ie(l){var a,d;if(l.key==="Enter"){l.preventDefault();return}if(l.key!=="Backspace")return;const o=W();if(!o||!o.selection.isCollapsed)return;const{range:n}=o;if(n.startContainer.nodeType===Node.TEXT_NODE){const _=n.startContainer;if(n.startOffset<=0||_.data[n.startOffset-1]!=="")return;const v=_.previousSibling;if(!(v instanceof HTMLElement)||v.dataset.segmentType!=="component")return;l.preventDefault();const P=v.dataset.blockId??"";(a=k.get(P))==null||a.app.unmount(),k.delete(P),v.remove(),_.deleteData(n.startOffset-1,1),$();return}if(n.startContainer instanceof HTMLElement&&n.startOffset>0){const _=n.startContainer.childNodes[n.startOffset-1];if(!(_ instanceof HTMLElement)||_.dataset.segmentType!=="component")return;l.preventDefault();const v=_.dataset.blockId??"";(d=k.get(v))==null||d.app.unmount(),k.delete(v),_.remove(),$()}}function me(l){var n;l.preventDefault();const o=((n=l.clipboardData)==null?void 0:n.getData("text/plain"))??"";document.execCommand("insertText",!1,o.replace(/\n/g," "))}function se(l){const o=W();if(!o)return;const{selection:n,range:a}=o,d=V(l);if(a.startContainer.nodeType===Node.TEXT_NODE){const R=a.startContainer;a.startOffset>0&&R.data[a.startOffset-1]==="/"&&(R.deleteData(a.startOffset-1,1),a.setStart(R,a.startOffset-1),a.collapse(!0))}const _=b(d),v=document.createTextNode("");a.insertNode(v),a.insertNode(_);const P=document.createRange();P.setStart(v,1),P.collapse(!0),n.removeAllRanges(),n.addRange(P),T.value=!1,$(),ee()}function ge(l){var _,v,P,R;const o=k.get(l);if(!o)return;const n=I(o.block.type),a=((_=n==null?void 0:n.propertyPanel)==null?void 0:_.fields)??[];if(!n||!a.length)return;const d=n.normalizeProps({...((v=n.createInitialProps)==null?void 0:v.call(n))??{},...o.block.data,edit:!1});E.value={blockId:l,title:((P=n.propertyPanel)==null?void 0:P.title)||s("editor.propertyDialogTitle"),type:o.block.type,fields:a,values:Object.fromEntries(a.map(Se=>[Se.key,d[Se.key]??""]))},(R=h.value)==null||R.showModal()}function i(){var l;(l=h.value)==null||l.close(),E.value=null}function u(l,o){var P;const n=E.value;if(!n)return;n.values[l]=o,E.value={...n,values:{...n.values}};const a=k.get(n.blockId),d=I(n.type);if(!a||!d)return;const _=d.normalizeProps({...((P=d.createInitialProps)==null?void 0:P.call(d))??{},...n.values,edit:!1});a.block={...a.block,data:pe(d.serialize(_))},a.wrapper.dataset.block=JSON.stringify(a.block),a.app.unmount();const v=Pe(d.component,_);v.mount(a.mountPoint),a.app=v,$()}function m(){return X(t.value)}function p(l){var o;return((o=I(l))==null?void 0:o.component)??null}function G(l){return j(l)}function Q(l){var n;const o=I(l.type);return o?o.normalizeProps({...((n=o.createInitialProps)==null?void 0:n.call(o))??{},...l.data,edit:!1}):{edit:!1}}return xe(()=>{t.edit&&y(t.value)}),Te(()=>{J()}),we(()=>t.edit,l=>{if(!l){T.value=!1;return}ue(()=>{y(t.value)})}),we(()=>t.value,l=>{if(!t.edit)return;const o=X(l);O(o)!==C&&y(o)}),(l,o)=>{var n;return f(),g("div",ft,[e.edit?(f(),g("div",mt,[S("div",{ref_key:"editableRef",ref:c,class:"ce-advance-input-tool__editor","data-testid":"editor-advance-input-content",contenteditable:"true",spellcheck:"false",onInput:ne,onClick:le,onKeyup:B,onKeydown:ie,onPaste:me,onBlur:re},null,544),T.value?(f(),g("div",{key:0,class:"ce-advance-input-tool__menu","data-testid":"editor-advance-input-menu",style:q({left:`${M.value.left}px`,top:`${M.value.top}px`})},[(f(!0),g(A,null,U(Y(ut)(),([a,d])=>(f(),g("button",{key:a,type:"button",class:"ce-advance-input-tool__menu-item","data-testid":`editor-advance-input-menu-item-${a}`,onMousedown:Ne(_=>se(a),["prevent"])},z(d.toolbox.title),41,gt))),128))],4)):K("",!0)])):(f(),g("div",ht,[(f(!0),g(A,null,U(m(),(a,d)=>(f(),g(A,{key:`${a.id}-${a.type}-${d}`},[a.type==="paragraph"?(f(),g("span",vt,z(G(a)),1)):(f(),g("span",yt,[(f(),Ee(Oe(p(a.type)),Re({ref_for:!0},Q(a)),null,16))]))],64))),128))])),S("dialog",{ref_key:"embeddedDialogRef",ref:h,class:"ce-advance-input-tool__dialog","data-testid":"advance-input-embedded-property-dialog",onClose:o[0]||(o[0]=a=>E.value=null)},[S("form",{method:"dialog",class:"ce-advance-input-tool__dialog-panel",onSubmit:Ne(i,["prevent"])},[S("div",bt,[S("h3",kt,z((n=E.value)==null?void 0:n.title),1),S("button",_t,z(Y(s)("editor.close")),1)]),E.value?(f(),g("div",xt,[(f(!0),g(A,null,U(E.value.fields,a=>(f(),g("label",{key:a.key,class:ce(["ce-advance-input-tool__dialog-field",{"ce-advance-input-tool__dialog-field--checkbox":a.type==="checkbox"}])},[a.type==="checkbox"?(f(),g(A,{key:0},[S("input",{class:"ce-advance-input-tool__dialog-checkbox",type:"checkbox",checked:E.value.values[a.key]===!0,"data-testid":`advance-input-embedded-property-input-${a.key}`,onChange:d=>u(a.key,d.target.checked)},null,40,Tt),S("span",Ct,z(a.label),1)],64)):a.type==="select"?(f(),g(A,{key:1},[S("span",St,z(a.label),1),S("select",{class:"ce-advance-input-tool__dialog-input",value:String(E.value.values[a.key]??""),"data-testid":`advance-input-embedded-property-input-${a.key}`,onChange:d=>u(a.key,d.target.value)},[(f(!0),g(A,null,U(a.options??[],d=>(f(),g("option",{key:d.value,value:d.value},z(d.label),9,Nt))),128))],40,wt)],64)):(f(),g(A,{key:2},[S("span",Pt,z(a.label),1),S("input",{class:"ce-advance-input-tool__dialog-input",type:"text",value:String(E.value.values[a.key]??""),placeholder:a.placeholder,"data-testid":`advance-input-embedded-property-input-${a.key}`,onInput:d=>u(a.key,d.target.value)},null,40,Et)],64))],2))),128))])):K("",!0)],32)],544)])}}}),ta=oe(Rt,[["__scopeId","data-v-5ab6cc48"]]),Ot={class:"ce-advance-table-tool","data-testid":"editor-advance-table-tool"},Mt={class:"ce-advance-table-tool__scroller"},zt={class:"ce-advance-table-tool__table","data-testid":"advance-table"},At=["checked","aria-label"],Jt=["data-testid"],Lt=["data-testid"],$t=["data-testid"],Bt=["checked","aria-label","onChange"],Ft=["data-testid"],Dt=["data-testid"],It={key:0,class:"ce-advance-table-tool__cell-text"},Ut={key:1,class:"ce-advance-table-tool__cell-token"},jt={key:0},Vt=["colspan"];function ve(e,t){return[Z(e,t)]}function Ht(){return[{id:"advance-table-default-tag",type:"MTag",data:{tagName:"{{tag}}",type:"{{tagType}}",size:"small",color:"",closable:!1}}]}function Wt(){return[{id:"advance-table-default-link",type:"MLink",data:{text:"{{linkText}}",url:"{{linkUrl}}",open:!1}}]}function be(){return[{columnName:r.t("advanceTable.defaultColumns.name"),columnContent:ve("{{name}}","advance-table-default-name"),width:180,fixed:"left"},{columnName:r.t("advanceTable.defaultColumns.status"),columnContent:ve("{{status}}","advance-table-default-status"),width:140,fixed:null},{columnName:r.t("advanceTable.defaultColumns.tag"),columnContent:Ht(),width:120,fixed:null},{columnName:r.t("advanceTable.defaultColumns.owner"),columnContent:ve("{{owner}}","advance-table-default-owner"),width:160,fixed:null},{columnName:r.t("advanceTable.defaultColumns.link"),columnContent:Wt(),width:180,fixed:null}]}function $e(){return[{name:r.t("advanceTable.defaultRows.first.name"),status:r.t("advanceTable.defaultRows.first.status"),tag:r.t("advanceTable.defaultRows.first.tag"),tagType:"warning",owner:r.t("advanceTable.defaultRows.first.owner"),linkText:r.t("advanceTable.defaultRows.first.linkText"),linkUrl:r.t("advanceTable.defaultRows.first.linkUrl")},{name:r.t("advanceTable.defaultRows.second.name"),status:r.t("advanceTable.defaultRows.second.status"),tag:r.t("advanceTable.defaultRows.second.tag"),tagType:"success",owner:r.t("advanceTable.defaultRows.second.owner"),linkText:r.t("advanceTable.defaultRows.second.linkText"),linkUrl:r.t("advanceTable.defaultRows.second.linkUrl")}]}const aa={toolbox:{get title(){return r.t("advanceTable.toolboxTitle")},icon:'<svg width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="5" width="18" height="14" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path d="M3 10h18M8 5v14M16 5v14" stroke="currentColor" stroke-width="2"/></svg>'},propertyPanel:{get title(){return r.t("advanceTable.propertyPanelTitle")},get fields(){return[{key:"index",label:r.t("advanceTable.properties.index"),type:"checkbox"},{key:"selection",label:r.t("advanceTable.properties.selection"),type:"checkbox"}]}},createInitialProps:()=>({index:!1,selection:!1,columns:be(),data:$e()}),normalizeProps:e=>({edit:e.edit??!1,index:e.index===!0,selection:e.selection===!0,columns:ke(e.columns),data:_e(e.data)}),serialize:e=>({index:e.index===!0,selection:e.selection===!0,columns:ke(e.columns),data:_e(e.data)})};function ke(e){if(!Array.isArray(e)||!e.length)return be();const t=e.filter(s=>typeof s=="object"&&s!==null).map((s,c)=>{var h;return{columnName:((h=s.columnName)==null?void 0:h.trim())||`${r.t("advanceTable.defaultColumnName")}${c+1}`,columnContent:X(s.columnContent),width:qt(s.width),fixed:Kt(s.fixed)}});return t.length?t:be()}function _e(e){return Array.isArray(e)?e.filter(t=>typeof t=="object"&&t!==null&&!Array.isArray(t)):$e()}function qt(e){return typeof e!="number"||!Number.isFinite(e)||e<=0?null:Math.round(e)}function Kt(e){return e==="left"||e==="right"?e:null}const Xt=ae({__name:"MAdvanceTable",props:{edit:{type:Boolean},index:{type:Boolean},selection:{type:Boolean},columns:{},data:{},onChange:{type:Function},onToolChange:{type:Function}},setup(e){const t=e,{t:s}=Ce(),c=F(new Set),h=D(()=>ke(t.columns)),T=D(()=>_e(t.data)),M=D(()=>t.selection===!0),E=D(()=>t.index===!0),k=44,x=56,C=160;function w(i){if(i==null)return"";if(typeof i=="string")return i;if(typeof i=="number"||typeof i=="boolean")return String(i);try{return JSON.stringify(i)}catch{return String(i)}}function O(i,u){return i.replace(/\{\{\s*([\w.-]+)\s*\}\}/g,(m,p)=>w(V(u,p)))}function V(i,u){return u.split(".").reduce((m,p)=>typeof m!="object"||m===null||!(p in m)?"":m[p],i)}function J(i,u){return typeof i=="string"?O(i,u):Array.isArray(i)?i.map(m=>J(m,u)):typeof i=="object"&&i!==null?Object.fromEntries(Object.entries(i).map(([m,p])=>[m,J(p,u)])):i}function b(i,u){return X(u.columnContent).map(m=>m.type==="paragraph"?{...m,data:{text:O(j(m),i)}}:{...m,data:J(m.data,i)})}function y(i){var u;return((u=I(i))==null?void 0:u.component)??null}function N(i){var m;const u=I(i.type);return u?u.normalizeProps({...((m=u.createInitialProps)==null?void 0:m.call(u))??{},...i.data,edit:!1}):{edit:!1}}function L(i){return j(i)}function $(i){return i.width??null}function H(i){return $(i)??C}function ee(i){let u=0;M.value&&(u+=k),E.value&&(u+=x);for(let m=0;m<i;m+=1){const p=h.value[m];(p==null?void 0:p.fixed)==="left"&&(u+=H(p))}return u}function W(i){let u=0;for(let m=h.value.length-1;m>i;m-=1){const p=h.value[m];(p==null?void 0:p.fixed)==="right"&&(u+=H(p))}return u}function B(i,u){const m=$(i),p={};return m&&(p.width=`${m}px`,p.minWidth=`${m}px`),i.fixed==="left"&&(p.position="sticky",p.left=`${ee(u)}px`),i.fixed==="right"&&(p.position="sticky",p.right=`${W(u)}px`),p}function ne(i){return{"ce-advance-table-tool__cell--fixed-left":i.fixed==="left","ce-advance-table-tool__cell--fixed-right":i.fixed==="right"}}function le(){return{width:`${k}px`,minWidth:`${k}px`,left:"0px"}}function re(){return{width:`${x}px`,minWidth:`${x}px`,left:`${M.value?k:0}px`}}function ie(i){return c.value.has(i)}function me(i){const u=new Set(c.value);u.has(i)?u.delete(i):u.add(i),c.value=u}function se(){return T.value.length>0&&T.value.every((i,u)=>c.value.has(u))}function ge(){if(se()){c.value=new Set;return}c.value=new Set(T.value.map((i,u)=>u))}return(i,u)=>(f(),g("div",Ot,[S("div",Mt,[S("table",zt,[S("thead",null,[S("tr",null,[e.selection?(f(),g("th",{key:0,class:"ce-advance-table-tool__cell ce-advance-table-tool__cell--header ce-advance-table-tool__cell--control ce-advance-table-tool__cell--fixed-left",style:q(le()),"data-testid":"advance-table-selection-header"},[S("input",{class:"ce-advance-table-tool__checkbox",type:"checkbox",checked:se(),"aria-label":Y(s)("advanceTable.selectAll"),onChange:ge},null,40,At)],4)):K("",!0),e.index?(f(),g("th",{key:1,class:"ce-advance-table-tool__cell ce-advance-table-tool__cell--header ce-advance-table-tool__cell--control ce-advance-table-tool__cell--fixed-left",style:q(re()),"data-testid":"advance-table-index-header"}," # ",4)):K("",!0),(f(!0),g(A,null,U(h.value,(m,p)=>(f(),g("th",{key:`header-${p}`,class:ce(["ce-advance-table-tool__cell ce-advance-table-tool__cell--header",ne(m)]),style:q(B(m,p)),"data-testid":`advance-table-header-${p}`},z(m.columnName),15,Jt))),128))])]),S("tbody",null,[(f(!0),g(A,null,U(T.value,(m,p)=>(f(),g("tr",{key:`row-${p}`,class:ce(["ce-advance-table-tool__row",{"ce-advance-table-tool__row--selected":ie(p)}]),"data-testid":`advance-table-row-${p}`},[e.selection?(f(),g("td",{key:0,class:"ce-advance-table-tool__cell ce-advance-table-tool__cell--control ce-advance-table-tool__cell--fixed-left",style:q(le()),"data-testid":`advance-table-selection-cell-${p}`},[S("input",{class:"ce-advance-table-tool__checkbox",type:"checkbox",checked:ie(p),"aria-label":Y(s)("advanceTable.selectRow"),onChange:G=>me(p)},null,40,Bt)],12,$t)):K("",!0),e.index?(f(),g("td",{key:1,class:"ce-advance-table-tool__cell ce-advance-table-tool__cell--control ce-advance-table-tool__cell--fixed-left",style:q(re()),"data-testid":`advance-table-index-cell-${p}`},z(p+1),13,Ft)):K("",!0),(f(!0),g(A,null,U(h.value,(G,Q)=>(f(),g("td",{key:`cell-${p}-${Q}`,class:ce(["ce-advance-table-tool__cell",ne(G)]),style:q(B(G,Q)),"data-testid":`advance-table-cell-${p}-${Q}`},[(f(!0),g(A,null,U(b(m,G),(l,o)=>(f(),g(A,{key:`${p}-${Q}-${l.id}-${l.type}-${o}`},[l.type==="paragraph"?(f(),g("span",It,z(L(l)),1)):(f(),g("span",Ut,[(f(),Ee(Oe(y(l.type)),Re({ref_for:!0},N(l)),null,16))]))],64))),128))],14,Dt))),128))],10,Lt))),128)),T.value.length?K("",!0):(f(),g("tr",jt,[S("td",{class:"ce-advance-table-tool__cell ce-advance-table-tool__empty",colspan:h.value.length+(e.selection?1:0)+(e.index?1:0)},z(Y(s)("advanceTable.empty")),9,Vt)]))])])])]))}}),oa=oe(Xt,[["__scopeId","data-v-6eb0809a"]]);export{dt as M,oe as _,aa as a,ea as b,lt as c,Zt as d,tt as e,oa as f,ta as g,it as h,r as i,ot as j,Yt as k,I as l,st as m,X as n,j as o,Ce as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as j,i as a,_ as O}from"./block-advanced-
|
|
1
|
+
import{d as j,i as a,_ as O}from"./block-advanced-EJNdvNM4.js";import{u as V,i as q,a as I,b as J,c as W,d as X,e as H,f as U,g as G}from"./echarts-BN_iJMI5.js";import{f as K,z as Q,F as Y,B as Z,o as P,j as ee,l as te,r as A,e as z,A as ne}from"./vue-vendor-CGusfGYN.js";function v(){return a.locale==="en"?["Mon","Tue","Wed","Thu","Fri"]:["周一","周二","周三","周四","周五"]}function C(){return[{name:a.t("chart.defaultSeriesName"),data:[120,200,150,80,70]}]}function re(e){return e.map(r=>({name:r.name,data:[...r.data]}))}function oe(e){return e==="bar"||e==="pie"?e:"line"}function ie(e){if(!Array.isArray(e))return v();const r=e.filter(n=>typeof n=="string").map(n=>n.trim()).filter(Boolean);return r.length?r:v()}function ae(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()){const r=Number(e);return Number.isFinite(r)?r:0}return 0}function se(e){if(!Array.isArray(e))return C();const r=e.filter(n=>typeof n=="object"&&n!==null&&!Array.isArray(n)).map((n,u)=>{const x=Array.isArray(n.data)?n.data.map(h=>ae(h)):[];return{name:typeof n.name=="string"&&n.name.trim()?n.name.trim():`${a.t("chart.defaultSeriesName")}${u+1}`,data:x}}).filter(n=>n.data.length>0);return r.length?r:C()}function T(e){return{edit:e.edit??!1,type:oe(e.type),xAxis:ie(e.xAxis),series:re(se(e.series))}}const pe=j({toolbox:{get title(){return a.t("chart.toolboxTitle")},icon:'<svg width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><rect x="4" y="4" width="16" height="16" rx="2" fill="none" stroke="currentColor" stroke-width="2"/><path d="M8 16V11M12 16V8M16 16v-6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>'},propertyPanel:{get title(){return a.t("chart.propertyPanelTitle")},get fields(){return[{key:"type",label:a.t("chart.properties.type"),type:"select",options:[{label:a.t("chart.types.line"),value:"line"},{label:a.t("chart.types.bar"),value:"bar"},{label:a.t("chart.types.pie"),value:"pie"}]},{key:"xAxis",label:a.t("chart.properties.xAxis"),type:"textarea",valueType:"json",validationMessage:a.t("chart.validation.invalidJson")},{key:"series",label:a.t("chart.properties.series"),type:"textarea",valueType:"json",validationMessage:a.t("chart.validation.invalidJson")}]}},createInitialProps:()=>({type:"line",xAxis:v(),series:C()}),normalizeProps:T,serialize:e=>{const r=T(e);return{type:r.type,xAxis:r.xAxis,series:r.series}}}),le=K({__name:"MChart",props:{edit:{type:Boolean},type:{},xAxis:{},series:{},onChange:{type:Function},onToolChange:{type:Function}},setup(e){V([I,J,W,X,H,U,G]);const r=e,n=A(null),u=A(null),x=A(!1),h=z(()=>T(r)),M=z(()=>N(h.value,x.value));let s=null,d=null,p=null,m=null;function B(t,i){return Array.from({length:i},(o,c)=>t[c]??0)}function S(t){return t?"#cbd5e1":"#475569"}function L(t){return t?"#475569":"#cbd5e1"}function $(t){return t?"rgba(71, 85, 105, 0.55)":"rgba(203, 213, 225, 0.72)"}function F(t,i){if(i<=1)return["0%","68%"];const o=18,f=(72-o)/i,l=o+t*f,y=l+f*.78;return[`${Math.round(l)}%`,`${Math.round(y)}%`]}function N(t,i){const o=S(i),c=L(i),f=$(i);return t.type==="pie"?{color:["#2563eb","#16a34a","#f59e0b","#dc2626","#7c3aed","#0891b2"],tooltip:{trigger:"item"},legend:{top:0,textStyle:{color:o}},series:t.series.map((l,y)=>({name:l.name,type:"pie",radius:F(y,t.series.length),center:["50%","56%"],data:t.xAxis.map((b,g)=>({name:b,value:l.data[g]??0})),emphasis:{focus:"self"}}))}:{color:["#2563eb","#16a34a","#f59e0b","#dc2626","#7c3aed","#0891b2"],tooltip:{trigger:"axis"},legend:{top:0,textStyle:{color:o}},grid:{top:44,right:24,bottom:32,left:44,containLabel:!0},xAxis:{type:"category",data:t.xAxis,axisLabel:{color:o},axisLine:{lineStyle:{color:c}}},yAxis:{type:"value",axisLabel:{color:o},axisLine:{lineStyle:{color:c}},splitLine:{lineStyle:{color:f}}},series:t.series.map(l=>({name:l.name,type:t.type,data:B(l.data,t.xAxis.length),smooth:t.type==="line",emphasis:{focus:"series"}}))}}function w(){x.value=document.documentElement.classList.contains("dark")}function D(){u.value&&(s||(s=q(u.value,void 0,{renderer:"canvas"})),s.setOption(M.value,!0),s.resize())}async function R(){await ne(),D()}function _(){m!==null&&(window.clearTimeout(m),m=null)}function E(){var g;m=null;const t=n.value;if(!t)return;const i=t.closest(".ce-block"),o=(g=t.closest(".codex-editor"))==null?void 0:g.querySelector(".ce-toolbar"),c=o==null?void 0:o.querySelector(".ce-toolbar__plus");if(!i||!o||!c)return;const f=i.getBoundingClientRect(),l=t.getBoundingClientRect(),y=c.getBoundingClientRect().height||26,b=i.offsetTop+(l.top-f.top)+(l.height-y)/2;o.style.top=`${Math.max(0,Math.round(b))}px`}function k(){_(),m=window.setTimeout(()=>{E()},0)}return Q(async()=>{w(),await R(),u.value&&typeof ResizeObserver<"u"&&(d=new ResizeObserver(()=>{s==null||s.resize()}),d.observe(u.value)),p=new MutationObserver(()=>{w()}),p.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]})}),Y(M,()=>{R()}),Z(()=>{_(),d==null||d.disconnect(),d=null,p==null||p.disconnect(),p=null,s==null||s.dispose(),s=null}),(t,i)=>(P(),ee("div",{ref_key:"rootRef",ref:n,class:"ce-chart-tool","data-testid":"editor-chart-tool",onMouseenter:k,onMousemove:k},[te("div",{ref_key:"chartRef",ref:u,class:"ce-chart-tool__canvas","data-testid":"editor-chart-canvas"},null,512)],544))}}),fe=O(le,[["__scopeId","data-v-c412345a"]]);export{fe as M,pe as m};
|