koishi-plugin-dataview-next 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/lib/index.cjs +10 -0
- package/lib/shared.d.ts +2 -0
- package/package.json +1 -1
- package/src/index.ts +10 -0
- package/src/shared.ts +2 -0
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{send as M,message as h,icons as se}from"@koishijs/client";import{defineComponent as X,ref as _,reactive as Z,computed as j,watch as R,onBeforeUnmount as Pe,resolveComponent as v,resolveDirective as Ye,openBlock as u,createBlock as q,withCtx as o,createElementVNode as i,withDirectives as Ae,createElementBlock as d,toDisplayString as f,createTextVNode as w,createCommentVNode as U,createVNode as l,Fragment as Q,renderList as W,resolveDynamicComponent as ye,mergeProps as _e,normalizeClass as ge,h as C}from"vue";import{useRoute as Ie,useRouter as Ke}from"vue-router";const T={info:"dataview-next/info",query:"dataview-next/query",create:"dataview-next/create",update:"dataview-next/update",remove:"dataview-next/remove",drop:"dataview-next/drop"},Je={class:"header-title"},Le={key:0,class:"muted"},Ze={class:"source-list"},Qe=["onClick"],We={class:"source-name"},Xe={key:0,class:"count"},et={key:0,class:"table-list"},tt=["onClick"],at={class:"table-name"},nt={key:1,class:"table-panel"},ot={class:"table-header"},lt={key:0},st={key:1},rt={class:"table-actions"},ut={class:"query-bar"},it={key:0,class:"change-bar"},ct={class:"column-header"},dt={key:0,class:"cell-editor"},pt=["disabled","onDblclick"],mt={class:"form-grid"},vt={class:"danger-text"},ft=X({__name:"index",setup($){const ee=Ie(),H=Ke(),g=_(),S=_([]),te=_(0),b=_(false),P=_(""),z=Z({}),Y=Z({}),re=_(),we=[30,50,100,150,200,500,1e3],F=_(30),O=_(1),p=Z({}),x=Z({}),N=_(false),G=_(false),A=_("");let E,ae=false;const I=j(()=>{const e=ee.params.name;return Array.isArray(e)?e.join("/"):e||""}),r=j(()=>{var e;return I.value?(e=g.value)==null?void 0:e.tables[I.value]:void 0}),ne=j(()=>{var e;return Object.values(((e=r.value)==null?void 0:e.fields)||{})}),k=j(()=>Object.keys(p).length>0),ke=j(()=>Object.values(p).reduce((e,t)=>e+Object.keys(t).length,0)),ue=j(()=>{var e,t;return((t=(e=g.value)==null?void 0:e.display)==null?void 0:t.showGroupCount)??false}),ie=j(()=>{var e,t;return((t=(e=g.value)==null?void 0:e.display)==null?void 0:t.showGroupSize)??true}),he=j(()=>{var L;const e=new Map;for(const n of Object.values(((L=g.value)==null?void 0:L.tables)||{}))e.has(n.source.id)||e.set(n.source.id,{source:n.source,tables:[]}),e.get(n.source.id).tables.push(n);const t=[...e.values()].map(n=>({...n,size:n.tables.reduce((m,D)=>m+(D.size||0),0),tables:n.tables.sort((m,D)=>m.name.localeCompare(D.name))})),s=t.filter(n=>n.tables.length>1),y=t.filter(n=>n.tables.length===1).flatMap(n=>n.tables).sort((n,m)=>n.name.localeCompare(m.name));return y.length&&s.push({source:{id:"single-table-sources",label:"其他",type:"unknown"},size:y.reduce((n,m)=>n+(m.size||0),0),tables:y}),s.sort((n,m)=>n.source.label.localeCompare(m.source.label))});function ce(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KiB`:`${(e/1048576).toFixed(1)} MiB`}function Ce(e){return e<1048576?`${(e/1024).toFixed(1)} KiB`:`${(e/1048576).toFixed(1)} MiB`}function xe(e){const t=[];return ue.value&&t.push(String(e.tables.length)),ie.value&&t.push(Ce(e.size)),t.join(" · ")}function de(e){return!!e&&typeof e=="object"&&"__dataviewType"in e}function Ve(e){return de(e)?e.value:e}function pe(e,t){return de(e)?e.__dataviewType==="binary"?`<Binary len=${e.value}>`:String(e.value):t.type==="json"||t.type==="list"?e===void 0?"":JSON.stringify(e):e instanceof Date?e.toISOString():e==null?"":String(e)}function K(e){return e.type==="boolean"?{component:"el-switch",props:{}}:e.type==="timestamp"||e.type==="date"?{component:"el-date-picker",props:{type:e.type==="date"?"date":"datetime",valueFormat:"YYYY-MM-DDTHH:mm:ss.SSSZ"}}:e.type==="time"?{component:"el-time-picker",props:{valueFormat:"HH:mm:ss"}}:["integer","unsigned","float","double","decimal"].includes(e.type)?{component:"el-input-number",props:{controls:false}}:{component:"el-input",props:{type:e.type==="json"||e.type==="list"?"textarea":"text"}}}function je(e){Y[e]=!Y[e]}function Se(e){H.replace(`/dataview-next/${e}`)}async function J(){g.value=await M(T.info),await B()}function ze(){return Object.fromEntries(Object.entries(z).filter(([,e])=>e!==""))}async function B(){if(!r.value){S.value=[],te.value=0;return}b.value=true;try{const e=await M(T.query,r.value.name,{keyword:P.value,filters:ze(),offset:(O.value-1)*F.value,limit:F.value,sort:re.value});S.value=e.rows,te.value=e.count??r.value.count??e.rows.length}catch(e){h.error(e.message||"读取数据失败"),S.value=[]}finally{b.value=false}}function me(){k.value||(E&&clearTimeout(E),E=setTimeout(()=>{O.value!==1&&(ae=true,O.value=1),B()},300))}function Oe(e){re.value=e.order?{field:e.prop,order:e.order==="ascending"?"asc":"desc"}:void 0,B()}function Be(e,t){var s;return((s=p[e])==null?void 0:s[t])!==void 0}function De(e,t,s){if(s.type==="binary")return;p[t]||(p[t]={});const y=e[s.name];p[t][s.name]=s.type==="json"||s.type==="list"?pe(y,s):Ve(y)}function Me(e,t){delete p[e][t],Object.keys(p[e]).length||delete p[e]}function oe(){for(const e of Object.keys(p))delete p[Number(e)]}function ve(e){var t;return Object.fromEntries((((t=r.value)==null?void 0:t.primary)||[]).map(s=>[s,e[s]]))}async function Ue(){if(r.value){b.value=true;try{for(const[e,t]of Object.entries(p))await M(T.update,r.value.name,ve(S.value[Number(e)]),t);oe(),await B(),h.success("修改已应用")}catch(e){h.error(e.message||"修改数据失败")}finally{b.value=false}}}async function Te(){if(r.value){b.value=true;try{await M(T.create,r.value.name,x);for(const e of Object.keys(x))x[e]="";N.value=false,await J(),h.success("数据已创建")}catch(e){h.error(e.message||"创建数据失败")}finally{b.value=false}}}async function $e(e){if(r.value){b.value=true;try{await M(T.remove,r.value.name,ve(e)),await J(),h.success("数据已删除")}catch(t){h.error(t.message||"删除数据失败")}finally{b.value=false}}}function Fe(){A.value="",G.value=true}async function Ne(){if(r.value){b.value=true;try{g.value=await M(T.drop,r.value.name),G.value=false,await B(),h.success("数据表已删除")}catch(e){h.error(e.message||"删除数据表失败")}finally{b.value=false}}}return R(I,()=>{oe(),O.value=1,B()}),R([F,O],()=>{if(ae){ae=false;return}B()}),R(P,me),R(z,me,{deep:true}),R(ne,e=>{var t,s;for(const y of e)z[t=y.name]||(z[t]=""),x[s=y.name]||(x[s]="")},{immediate:true}),Pe(()=>{E&&clearTimeout(E)}),J(),(e,t)=>{const s=v("k-icon"),y=v("el-scrollbar"),L=v("k-empty"),n=v("el-button"),m=v("el-input"),D=v("k-button"),fe=v("el-table-column"),Ge=v("el-popconfirm"),Ee=v("el-table"),Re=v("el-pagination"),be=v("el-dialog"),qe=v("k-layout"),He=Ye("loading");return u(),q(qe,{class:"dataview-next"},{header:o(()=>{var a;return[i("span",Je,[l(s,{name:"dataview-database"}),t[9]||(t[9]=w(" 数据库 ",-1))]),(a=g.value)!=null&&a.size?(u(),d("span",Le,"("+f(ce(g.value.size))+")",1)):U("v-if",true)]}),menu:o(()=>[i("span",{class:"menu-item",onClick:J},[l(s,{class:"menu-icon",name:"dataview-refresh"})])]),left:o(()=>[l(y,null,{default:o(()=>[i("div",Ze,[(u(true),d(Q,null,W(he.value,a=>(u(),d("section",{key:a.source.id,class:"source-group"},[i("button",{class:"source-title",onClick:c=>je(a.source.id)},[l(s,{class:ge(["source-chevron",{expanded:!Y[a.source.id]}]),name:"dataview-chevron"},null,8,["class"]),i("span",We,f(a.source.label),1),ue.value||ie.value?(u(),d("span",Xe,f(xe(a)),1)):U("v-if",true)],8,Qe),Y[a.source.id]?U("v-if",true):(u(),d("div",et,[(u(true),d(Q,null,W(a.tables,c=>(u(),d("button",{key:c.name,class:ge(["table-entry",{active:c.name===I.value}]),onClick:V=>Se(c.name)},[i("span",at,f(c.name),1)],10,tt))),128))]))]))),128))])]),_:1})]),default:o(()=>[r.value?Ae((u(),d("main",nt,[i("header",ot,[i("div",null,[i("h2",null,f(r.value.name),1),i("p",null,[w(f(r.value.source.label)+" ",1),r.value.size?(u(),d("span",lt," · "+f(ce(r.value.size)),1)):U("v-if",true),r.value.physical?U("v-if",true):(u(),d("span",st," · 未初始化或无统计信息"))])]),i("div",rt,[l(n,{disabled:k.value,onClick:t[0]||(t[0]=a=>N.value=true)},{default:o(()=>[...t[11]||(t[11]=[w("新增行",-1)])]),_:1},8,["disabled"]),l(n,{type:"danger",disabled:k.value,onClick:Fe},{default:o(()=>[...t[12]||(t[12]=[w("删除表",-1)])]),_:1},8,["disabled"])])]),i("div",ut,[l(m,{modelValue:P.value,"onUpdate:modelValue":t[1]||(t[1]=a=>P.value=a),clearable:"",placeholder:"搜索文本或数字字段",disabled:k.value},{prefix:o(()=>[l(s,{name:"search"})]),_:1},8,["modelValue","disabled"])]),k.value?(u(),d("div",it,[i("span",null,"有 "+f(ke.value)+" 项修改尚未应用",1),i("div",null,[l(n,{type:"primary",onClick:Ue},{default:o(()=>[...t[13]||(t[13]=[w("应用修改",-1)])]),_:1}),l(n,{onClick:oe},{default:o(()=>[...t[14]||(t[14]=[w("取消修改",-1)])]),_:1})])])):U("v-if",true),l(Ee,{class:"data-grid",data:S.value,style:{width:"100%"},height:"100%",flexible:"",border:"",onSortChange:Oe},{default:o(()=>[(u(true),d(Q,null,W(ne.value,a=>(u(),q(fe,{key:a.name,prop:a.name,label:a.name,fixed:r.value.primary.includes(a.name),sortable:k.value?false:"custom","min-width":"100","show-overflow-tooltip":""},{header:o(()=>[i("div",ct,[i("span",null,f(a.name),1),l(m,{modelValue:z[a.name],"onUpdate:modelValue":c=>z[a.name]=c,size:"small",clearable:"",placeholder:a.type,disabled:k.value},null,8,["modelValue","onUpdate:modelValue","placeholder","disabled"])])]),default:o(({row:c,$index:V})=>[Be(V,a.name)?(u(),d("div",dt,[(u(),q(ye(K(a).component),_e({modelValue:p[V][a.name],"onUpdate:modelValue":le=>p[V][a.name]=le},{ref_for:true},K(a).props,{size:"small"}),null,16,["modelValue","onUpdate:modelValue"])),l(D,{frameless:"",type:"danger",onClick:le=>Me(V,a.name)},{default:o(()=>[l(s,{name:"times-full"})]),_:1},8,["onClick"])])):(u(),d("button",{key:1,class:"cell-value",disabled:a.type==="binary",onDblclick:le=>De(c,V,a)},f(pe(c[a.name],a)),41,pt))]),_:2},1032,["prop","label","fixed","sortable"]))),128)),l(fe,{label:"操作",width:"72",fixed:"right",align:"center"},{default:o(({row:a})=>[l(Ge,{title:"真的要删除这条数据吗?","confirm-button-text":"是","cancel-button-text":"否",onConfirm:c=>$e(a)},{reference:o(()=>[l(D,{frameless:"",type:"danger",disabled:k.value},{default:o(()=>[l(s,{name:"times-full"})]),_:1},8,["disabled"])]),_:1},8,["onConfirm"])]),_:1})]),_:1},8,["data"]),l(Re,{layout:"sizes, prev, pager, next, jumper",total:te.value,"page-sizes":we,"page-size":F.value,"onUpdate:pageSize":t[2]||(t[2]=a=>F.value=a),"current-page":O.value,"onUpdate:currentPage":t[3]||(t[3]=a=>O.value=a),disabled:k.value},null,8,["total","page-size","current-page","disabled"])])),[[He,b.value]]):(u(),q(L,{key:0,class:"dataview-empty"},{default:o(()=>[...t[10]||(t[10]=[i("div",null,"在左侧选择要访问的数据表",-1)])]),_:1})),l(be,{modelValue:N.value,"onUpdate:modelValue":t[5]||(t[5]=a=>N.value=a),title:"新增行",width:"640px"},{footer:o(()=>[l(n,{onClick:t[4]||(t[4]=a=>N.value=false)},{default:o(()=>[...t[15]||(t[15]=[w("取消",-1)])]),_:1}),l(n,{type:"primary",onClick:Te},{default:o(()=>[...t[16]||(t[16]=[w("创建",-1)])]),_:1})]),default:o(()=>[i("div",mt,[(u(true),d(Q,null,W(ne.value,a=>(u(),d("label",{key:a.name},[i("span",null,f(a.name),1),(u(),q(ye(K(a).component),_e({modelValue:x[a.name],"onUpdate:modelValue":c=>x[a.name]=c},{ref_for:true},K(a).props),null,16,["modelValue","onUpdate:modelValue"]))]))),128))])]),_:1},8,["modelValue"]),l(be,{modelValue:G.value,"onUpdate:modelValue":t[8]||(t[8]=a=>G.value=a),title:"删除数据表",width:"520px"},{footer:o(()=>{var a;return[l(n,{onClick:t[7]||(t[7]=c=>G.value=false)},{default:o(()=>[...t[17]||(t[17]=[w("取消",-1)])]),_:1}),l(n,{type:"danger",disabled:A.value!==((a=r.value)==null?void 0:a.name),onClick:Ne},{default:o(()=>[...t[18]||(t[18]=[w(" 删除表 ",-1)])]),_:1},8,["disabled"])]}),default:o(()=>{var a,c;return[i("p",vt," 这会物理删除数据表 "+f((a=r.value)==null?void 0:a.name)+"。只要插件仍在运行,模型定义仍会留在列表中。 ",1),l(m,{modelValue:A.value,"onUpdate:modelValue":t[6]||(t[6]=V=>A.value=V),placeholder:(c=r.value)==null?void 0:c.name},null,8,["modelValue","placeholder"])]}),_:1},8,["modelValue"])]),_:1})}}}),bt=($,ee)=>{const H=$.__vccOpts||$;for(const[g,S]of ee)H[g]=S;return H},yt=bt(ft,[["__scopeId","data-v-5a6d905f"]]);se.register("dataview-database",X({render:()=>C("svg",{class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[C("path",{d:"M4 6a8 3 0 1 0 16 0a8 3 0 1 0 -16 0"}),C("path",{d:"M4 6v6a8 3 0 0 0 16 0v-6"}),C("path",{d:"M4 12v6a8 3 0 0 0 16 0v-6"})])}));se.register("dataview-chevron",X({render:()=>C("svg",{class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[C("path",{d:"M9 6l6 6l-6 6"})])}));se.register("dataview-refresh",X({render:()=>C("svg",{class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[C("path",{d:"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4"}),C("path",{d:"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"})])}));const kt=$=>{$.page({path:"/dataview-next/:name*",name:"数据库",icon:"dataview-database",order:410,authority:4,component:yt})};export{kt as default};
|
|
1
|
+
import{send as B,message as w,icons as se}from"@koishijs/client";import{defineComponent as ee,ref as f,reactive as Q,computed as j,watch as I,onBeforeUnmount as Ae,resolveComponent as y,resolveDirective as Le,openBlock as u,createBlock as T,withCtx as o,createElementVNode as i,withDirectives as Ze,createElementBlock as d,toDisplayString as b,createTextVNode as k,createCommentVNode as D,createVNode as l,Fragment as W,renderList as X,resolveDynamicComponent as _e,mergeProps as we,withModifiers as Qe,normalizeClass as ke,h as C}from"vue";import{useRoute as We,useRouter as Xe}from"vue-router";const U={info:"dataview-next/info",query:"dataview-next/query",create:"dataview-next/create",update:"dataview-next/update",remove:"dataview-next/remove",clearColumn:"dataview-next/clear-column",drop:"dataview-next/drop"},et={class:"header-title"},tt={key:0,class:"muted"},at={class:"source-list"},nt=["onClick"],ot={class:"source-name"},lt={key:0,class:"count"},rt={key:0,class:"table-list"},st=["onClick"],ut={class:"table-name"},it={key:1,class:"table-panel"},ct={class:"table-header"},dt={key:0},mt={key:1},pt={class:"table-actions"},vt={class:"query-bar"},ft={key:0,class:"change-bar"},yt={class:"column-header"},bt={key:0,class:"cell-editor"},gt=["disabled","onDblclick"],_t={class:"form-grid"},wt={class:"danger-text"},he="dataview-next:collapsed",kt=ee({__name:"index",setup(N){const te=We(),P=Xe(),h=f(),S=f([]),ae=f(0),p=f(false),Y=f(""),O=Q({}),F=Q(Oe()),ue=f(),Ce=[30,50,100,150,200,500,1e3],G=f(30),z=f(1),m=Q({}),x=Q({}),E=f(false),J=f(false),R=f(false),K=f("");let q,ne=false;const A=j(()=>{const e=te.params.name;return Array.isArray(e)?e.join("/"):e||""}),r=j(()=>{var e;return A.value?(e=h.value)==null?void 0:e.tables[A.value]:void 0}),oe=j(()=>{var e;return Object.values(((e=r.value)==null?void 0:e.fields)||{})}),g=j(()=>Object.keys(m).length>0),xe=j(()=>Object.values(m).reduce((e,t)=>e+Object.keys(t).length,0)),ie=j(()=>{var e,t;return((t=(e=h.value)==null?void 0:e.display)==null?void 0:t.showGroupCount)??false}),ce=j(()=>{var e,t;return((t=(e=h.value)==null?void 0:e.display)==null?void 0:t.showGroupSize)??true}),Ve=j(()=>{var Z;const e=new Map;for(const n of Object.values(((Z=h.value)==null?void 0:Z.tables)||{}))e.has(n.source.id)||e.set(n.source.id,{source:n.source,tables:[]}),e.get(n.source.id).tables.push(n);const t=[...e.values()].map(n=>({...n,size:n.tables.reduce((v,$)=>v+($.size||0),0),tables:n.tables.sort((v,$)=>v.name.localeCompare($.name))})),s=t.filter(n=>n.tables.length>1),_=t.filter(n=>n.tables.length===1).flatMap(n=>n.tables).sort((n,v)=>n.name.localeCompare(v.name));return _.length&&s.push({source:{id:"single-table-sources",label:"其他",type:"unknown"},size:_.reduce((n,v)=>n+(v.size||0),0),tables:_}),s.sort((n,v)=>n.source.label.localeCompare(v.source.label))});function de(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KiB`:`${(e/1048576).toFixed(1)} MiB`}function je(e){return e<1048576?`${(e/1024).toFixed(1)} KiB`:`${(e/1048576).toFixed(1)} MiB`}function Se(e){const t=[];return ie.value&&t.push(String(e.tables.length)),ce.value&&t.push(je(e.size)),t.join(" · ")}function Oe(){try{const e=JSON.parse(localStorage.getItem(he)||"{}");return!e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t=="boolean"))}catch{return{}}}function ze(){try{localStorage.setItem(he,JSON.stringify(F))}catch{}}function me(e){return!!e&&typeof e=="object"&&"__dataviewType"in e}function Me(e){return me(e)?e.value:e}function pe(e,t){return me(e)?e.__dataviewType==="binary"?`<Binary len=${e.value}>`:String(e.value):t.type==="json"||t.type==="list"?e===void 0?"":JSON.stringify(e):e instanceof Date?e.toISOString():e==null?"":String(e)}function L(e){return e.type==="boolean"?{component:"el-switch",props:{}}:e.type==="timestamp"||e.type==="date"?{component:"el-date-picker",props:{type:e.type==="date"?"date":"datetime",valueFormat:"YYYY-MM-DDTHH:mm:ss.SSSZ"}}:e.type==="time"?{component:"el-time-picker",props:{valueFormat:"HH:mm:ss"}}:["integer","unsigned","float","double","decimal"].includes(e.type)?{component:"el-input-number",props:{controls:false}}:{component:"el-input",props:{type:e.type==="json"||e.type==="list"?"textarea":"text"}}}function $e(e){F[e]=!F[e],ze()}function Be(e){P.replace(`/dataview-next/${e}`)}async function H(){h.value=await B(U.info),await M()}function De(){return Object.fromEntries(Object.entries(O).filter(([,e])=>e!==""))}async function M(){if(!r.value){S.value=[],ae.value=0;return}p.value=true;try{const e=await B(U.query,r.value.name,{keyword:Y.value,filters:De(),offset:(z.value-1)*G.value,limit:G.value,sort:ue.value});S.value=e.rows,ae.value=e.count??r.value.count??e.rows.length}catch(e){w.error(e.message||"读取数据失败"),S.value=[]}finally{p.value=false}}function ve(){g.value||(q&&clearTimeout(q),q=setTimeout(()=>{z.value!==1&&(ne=true,z.value=1),M()},300))}function Ue(e){ue.value=e.order?{field:e.prop,order:e.order==="ascending"?"asc":"desc"}:void 0,M()}function Te(e,t){var s;return((s=m[e])==null?void 0:s[t])!==void 0}function Ne(e,t,s){if(s.type==="binary")return;m[t]||(m[t]={});const _=e[s.name];m[t][s.name]=s.type==="json"||s.type==="list"?pe(_,s):Me(_)}function Fe(e,t){delete m[e][t],Object.keys(m[e]).length||delete m[e]}function le(){for(const e of Object.keys(m))delete m[Number(e)]}function fe(e){var t;return Object.fromEntries((((t=r.value)==null?void 0:t.primary)||[]).map(s=>[s,e[s]]))}async function Ge(){if(r.value){p.value=true;try{for(const[e,t]of Object.entries(m))await B(U.update,r.value.name,fe(S.value[Number(e)]),t);le(),await M(),w.success("修改已应用")}catch(e){w.error(e.message||"修改数据失败")}finally{p.value=false}}}async function Ee(){if(r.value){p.value=true;try{await B(U.create,r.value.name,x);for(const e of Object.keys(x))x[e]="";E.value=false,await H(),w.success("数据已创建")}catch(e){w.error(e.message||"创建数据失败")}finally{p.value=false}}}async function Re(e){if(r.value){p.value=true;try{await B(U.remove,r.value.name,fe(e)),await H(),w.success("数据已删除")}catch(t){w.error(t.message||"删除数据失败")}finally{p.value=false}}}async function qe(e){if(r.value){p.value=true;try{await B(U.clearColumn,r.value.name,e.name),await H(),w.success("列数据已清空")}catch(t){w.error(t.message||"清空列数据失败")}finally{p.value=false}}}function He(){K.value="",R.value=true}async function Ie(){if(r.value){p.value=true;try{h.value=await B(U.drop,r.value.name),R.value=false,await M(),w.success("数据表已删除")}catch(e){w.error(e.message||"删除数据表失败")}finally{p.value=false}}}return I(A,()=>{le(),z.value=1,M()}),I([G,z],()=>{if(ne){ne=false;return}M()}),I(Y,ve),I(O,ve,{deep:true}),I(oe,e=>{var t,s;for(const _ of e)O[t=_.name]||(O[t]=""),x[s=_.name]||(x[s]="")},{immediate:true}),Ae(()=>{q&&clearTimeout(q)}),H(),(e,t)=>{const s=y("k-icon"),_=y("el-scrollbar"),Z=y("k-empty"),n=y("el-button"),v=y("el-input"),$=y("k-button"),ye=y("el-popconfirm"),be=y("el-table-column"),Pe=y("el-table"),Ye=y("el-pagination"),ge=y("el-dialog"),Je=y("k-layout"),Ke=Le("loading");return u(),T(Je,{class:"dataview-next"},{header:o(()=>{var a;return[i("span",et,[l(s,{name:"dataview-database"}),t[11]||(t[11]=k(" 数据库 ",-1))]),(a=h.value)!=null&&a.size?(u(),d("span",tt,"("+b(de(h.value.size))+")",1)):D("v-if",true)]}),menu:o(()=>[i("span",{class:"menu-item",onClick:H},[l(s,{class:"menu-icon",name:"dataview-refresh"})])]),left:o(()=>[l(_,null,{default:o(()=>[i("div",at,[(u(true),d(W,null,X(Ve.value,a=>(u(),d("section",{key:a.source.id,class:"source-group"},[i("button",{class:"source-title",onClick:c=>$e(a.source.id)},[l(s,{class:ke(["source-chevron",{expanded:!F[a.source.id]}]),name:"dataview-chevron"},null,8,["class"]),i("span",ot,b(a.source.label),1),ie.value||ce.value?(u(),d("span",lt,b(Se(a)),1)):D("v-if",true)],8,nt),F[a.source.id]?D("v-if",true):(u(),d("div",rt,[(u(true),d(W,null,X(a.tables,c=>(u(),d("button",{key:c.name,class:ke(["table-entry",{active:c.name===A.value}]),onClick:V=>Be(c.name)},[i("span",ut,b(c.name),1)],10,st))),128))]))]))),128))])]),_:1})]),default:o(()=>[r.value?Ze((u(),d("main",it,[i("header",ct,[i("div",null,[i("h2",null,b(r.value.name),1),i("p",null,[k(b(r.value.source.label)+" ",1),r.value.size?(u(),d("span",dt," · "+b(de(r.value.size)),1)):D("v-if",true),r.value.physical?D("v-if",true):(u(),d("span",mt," · 未初始化或无统计信息"))])]),i("div",pt,[l(n,{disabled:g.value,onClick:t[0]||(t[0]=a=>E.value=true)},{default:o(()=>[...t[13]||(t[13]=[k("新增行",-1)])]),_:1},8,["disabled"]),l(n,{type:J.value?"warning":void 0,disabled:g.value,onClick:t[1]||(t[1]=a=>J.value=!J.value)},{default:o(()=>[...t[14]||(t[14]=[k(" 删除列 ",-1)])]),_:1},8,["type","disabled"]),l(n,{type:"danger",disabled:g.value,onClick:He},{default:o(()=>[...t[15]||(t[15]=[k("删除表",-1)])]),_:1},8,["disabled"])])]),i("div",vt,[l(v,{modelValue:Y.value,"onUpdate:modelValue":t[2]||(t[2]=a=>Y.value=a),clearable:"",placeholder:"搜索文本或数字字段",disabled:g.value},{prefix:o(()=>[l(s,{name:"search"})]),_:1},8,["modelValue","disabled"])]),g.value?(u(),d("div",ft,[i("span",null,"有 "+b(xe.value)+" 项修改尚未应用",1),i("div",null,[l(n,{type:"primary",onClick:Ge},{default:o(()=>[...t[16]||(t[16]=[k("应用修改",-1)])]),_:1}),l(n,{onClick:le},{default:o(()=>[...t[17]||(t[17]=[k("取消修改",-1)])]),_:1})])])):D("v-if",true),l(Pe,{class:"data-grid",data:S.value,style:{width:"100%"},height:"100%",flexible:"",border:"",onSortChange:Ue},{default:o(()=>[(u(true),d(W,null,X(oe.value,a=>(u(),T(be,{key:a.name,prop:a.name,label:a.name,fixed:r.value.primary.includes(a.name),sortable:g.value?false:"custom","min-width":"100","show-overflow-tooltip":""},{header:o(()=>[i("div",yt,[i("span",null,b(a.name),1),J.value&&!r.value.primary.includes(a.name)?(u(),T(ye,{key:0,title:`清空 ${a.name} 列的全部数据吗?`,"confirm-button-text":"清空","cancel-button-text":"取消",onConfirm:c=>qe(a)},{reference:o(()=>[l($,{class:"column-delete",frameless:"",type:"danger",disabled:g.value,onClick:t[3]||(t[3]=Qe(()=>{},["stop"]))},{default:o(()=>[l(s,{name:"times-full"})]),_:1},8,["disabled"])]),_:1},8,["title","onConfirm"])):D("v-if",true),l(v,{modelValue:O[a.name],"onUpdate:modelValue":c=>O[a.name]=c,size:"small",clearable:"",placeholder:a.type,disabled:g.value},null,8,["modelValue","onUpdate:modelValue","placeholder","disabled"])])]),default:o(({row:c,$index:V})=>[Te(V,a.name)?(u(),d("div",bt,[(u(),T(_e(L(a).component),we({modelValue:m[V][a.name],"onUpdate:modelValue":re=>m[V][a.name]=re},{ref_for:true},L(a).props,{size:"small"}),null,16,["modelValue","onUpdate:modelValue"])),l($,{frameless:"",type:"danger",onClick:re=>Fe(V,a.name)},{default:o(()=>[l(s,{name:"times-full"})]),_:1},8,["onClick"])])):(u(),d("button",{key:1,class:"cell-value",disabled:a.type==="binary",onDblclick:re=>Ne(c,V,a)},b(pe(c[a.name],a)),41,gt))]),_:2},1032,["prop","label","fixed","sortable"]))),128)),l(be,{label:"操作",width:"72",fixed:"right",align:"center"},{default:o(({row:a})=>[l(ye,{title:"真的要删除这条数据吗?","confirm-button-text":"是","cancel-button-text":"否",onConfirm:c=>Re(a)},{reference:o(()=>[l($,{frameless:"",type:"danger",disabled:g.value},{default:o(()=>[l(s,{name:"times-full"})]),_:1},8,["disabled"])]),_:1},8,["onConfirm"])]),_:1})]),_:1},8,["data"]),l(Ye,{layout:"sizes, prev, pager, next, jumper",total:ae.value,"page-sizes":Ce,"page-size":G.value,"onUpdate:pageSize":t[4]||(t[4]=a=>G.value=a),"current-page":z.value,"onUpdate:currentPage":t[5]||(t[5]=a=>z.value=a),disabled:g.value},null,8,["total","page-size","current-page","disabled"])])),[[Ke,p.value]]):(u(),T(Z,{key:0,class:"dataview-empty"},{default:o(()=>[...t[12]||(t[12]=[i("div",null,"在左侧选择要访问的数据表",-1)])]),_:1})),l(ge,{modelValue:E.value,"onUpdate:modelValue":t[7]||(t[7]=a=>E.value=a),title:"新增行",width:"640px"},{footer:o(()=>[l(n,{onClick:t[6]||(t[6]=a=>E.value=false)},{default:o(()=>[...t[18]||(t[18]=[k("取消",-1)])]),_:1}),l(n,{type:"primary",onClick:Ee},{default:o(()=>[...t[19]||(t[19]=[k("创建",-1)])]),_:1})]),default:o(()=>[i("div",_t,[(u(true),d(W,null,X(oe.value,a=>(u(),d("label",{key:a.name},[i("span",null,b(a.name),1),(u(),T(_e(L(a).component),we({modelValue:x[a.name],"onUpdate:modelValue":c=>x[a.name]=c},{ref_for:true},L(a).props),null,16,["modelValue","onUpdate:modelValue"]))]))),128))])]),_:1},8,["modelValue"]),l(ge,{modelValue:R.value,"onUpdate:modelValue":t[10]||(t[10]=a=>R.value=a),title:"删除数据表",width:"520px"},{footer:o(()=>{var a;return[l(n,{onClick:t[9]||(t[9]=c=>R.value=false)},{default:o(()=>[...t[20]||(t[20]=[k("取消",-1)])]),_:1}),l(n,{type:"danger",disabled:K.value!==((a=r.value)==null?void 0:a.name),onClick:Ie},{default:o(()=>[...t[21]||(t[21]=[k(" 删除表 ",-1)])]),_:1},8,["disabled"])]}),default:o(()=>{var a,c;return[i("p",wt," 这会物理删除数据表 "+b((a=r.value)==null?void 0:a.name)+"。只要插件仍在运行,模型定义仍会留在列表中。 ",1),l(v,{modelValue:K.value,"onUpdate:modelValue":t[8]||(t[8]=V=>K.value=V),placeholder:(c=r.value)==null?void 0:c.name},null,8,["modelValue","placeholder"])]}),_:1},8,["modelValue"])]),_:1})}}}),ht=(N,te)=>{const P=N.__vccOpts||N;for(const[h,S]of te)P[h]=S;return P},Ct=ht(kt,[["__scopeId","data-v-392b00ce"]]);se.register("dataview-database",ee({render:()=>C("svg",{class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[C("path",{d:"M4 6a8 3 0 1 0 16 0a8 3 0 1 0 -16 0"}),C("path",{d:"M4 6v6a8 3 0 0 0 16 0v-6"}),C("path",{d:"M4 12v6a8 3 0 0 0 16 0v-6"})])}));se.register("dataview-chevron",ee({render:()=>C("svg",{class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[C("path",{d:"M9 6l6 6l-6 6"})])}));se.register("dataview-refresh",ee({render:()=>C("svg",{class:"k-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round"},[C("path",{d:"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4"}),C("path",{d:"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"})])}));const St=N=>{N.page({path:"/dataview-next/:name*",name:"数据库",icon:"dataview-database",order:410,authority:4,component:Ct})};export{St as default};
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.dataview-next[data-v-
|
|
1
|
+
.dataview-next[data-v-392b00ce] .layout-header .left{display:flex;gap:4px;align-items:center;margin-left:24px;padding-left:0}.dataview-next .header-title[data-v-392b00ce]{display:inline-flex;gap:6px;align-items:center}.dataview-next .muted[data-v-392b00ce]{color:var(--fg2);font-weight:400}.source-list[data-v-392b00ce]{padding:12px 0}.source-group+.source-group[data-v-392b00ce]{margin-top:8px}.source-title[data-v-392b00ce],.table-entry[data-v-392b00ce],.cell-value[data-v-392b00ce]{border:0;background:transparent;color:inherit;font:inherit}.source-title[data-v-392b00ce]{display:grid;grid-template-columns:20px minmax(0,1fr) max-content;gap:4px;align-items:center;width:100%;min-width:0;padding:6px 16px;font-weight:600;text-align:left;cursor:pointer}.source-name[data-v-392b00ce]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.source-chevron[data-v-392b00ce]{transition:transform .15s ease}.source-chevron.expanded[data-v-392b00ce]{transform:rotate(90deg)}.table-list[data-v-392b00ce]{display:grid;gap:2px}.table-entry[data-v-392b00ce]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;min-width:0;padding:6px 16px 6px 40px;text-align:left;cursor:pointer}.table-entry.active[data-v-392b00ce],.table-entry[data-v-392b00ce]:hover,.source-title[data-v-392b00ce]:hover{background:var(--k-hover-bg)}.table-name[data-v-392b00ce]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.count[data-v-392b00ce]{color:var(--fg2);font-size:12px;white-space:nowrap}.dataview-empty[data-v-392b00ce]{height:100%}.table-panel[data-v-392b00ce]{display:flex;flex-direction:column;gap:12px;height:100%;min-width:0;min-height:0;padding:24px;box-sizing:border-box}.table-header[data-v-392b00ce],.change-bar[data-v-392b00ce],.query-bar[data-v-392b00ce]{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.table-header h2[data-v-392b00ce]{margin:0;font-size:22px}.table-header p[data-v-392b00ce]{margin:4px 0 0;color:var(--fg2)}.table-actions[data-v-392b00ce],.change-bar>div[data-v-392b00ce]{display:flex;gap:8px}.table-actions[data-v-392b00ce] .el-button+.el-button{margin-left:0}.query-bar[data-v-392b00ce]{justify-content:flex-start}.query-bar .el-input[data-v-392b00ce]{max-width:360px}.change-bar[data-v-392b00ce]{justify-content:flex-start;padding:8px 12px;border-radius:6px}.data-grid[data-v-392b00ce]{flex:1 1 0;min-height:0;min-width:0}.data-grid[data-v-392b00ce] .el-table__body .el-table__cell{padding:4px 0}.data-grid[data-v-392b00ce] th.el-table-fixed-column--right,.data-grid[data-v-392b00ce] td.el-table-fixed-column--right{background-color:var(--el-bg-color)}.el-pagination[data-v-392b00ce]{flex:0 0 auto;align-self:center;justify-content:center;min-width:0}.el-pagination[data-v-392b00ce] .el-select{width:112px}.column-header[data-v-392b00ce]{display:grid;grid-template-columns:minmax(0,max-content) max-content minmax(0,1fr);gap:6px 4px;align-items:center}.column-header .el-input[data-v-392b00ce]{grid-column:1/-1}.data-grid[data-v-392b00ce] th.is-sortable .cell{display:grid;grid-template-columns:minmax(0,max-content) 24px max-content minmax(0,1fr);gap:6px 4px;align-items:start}.data-grid[data-v-392b00ce] th.is-sortable .column-header{display:contents}.data-grid[data-v-392b00ce] th.is-sortable .column-header .el-input{grid-column:1/-1}.data-grid[data-v-392b00ce] th.is-sortable .column-header>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.data-grid[data-v-392b00ce] th.is-sortable .caret-wrapper{grid-column:2;grid-row:1;align-self:center}.data-grid[data-v-392b00ce] th.is-sortable .column-delete{grid-column:3;grid-row:1;align-self:center}.cell-editor[data-v-392b00ce]{display:flex;gap:4px;align-items:center}.cell-editor[data-v-392b00ce]>:first-child{flex:1}.cell-value[data-v-392b00ce]{display:block;width:100%;min-height:20px;padding:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text}.cell-value[data-v-392b00ce]:disabled{cursor:not-allowed}.form-grid[data-v-392b00ce]{display:grid;gap:12px}.form-grid label[data-v-392b00ce]{display:grid;gap:6px}.danger-text[data-v-392b00ce]{color:var(--danger)}
|
package/lib/index.cjs
CHANGED
|
@@ -37,6 +37,7 @@ var events = {
|
|
|
37
37
|
create: "dataview-next/create",
|
|
38
38
|
update: "dataview-next/update",
|
|
39
39
|
remove: "dataview-next/remove",
|
|
40
|
+
clearColumn: "dataview-next/clear-column",
|
|
40
41
|
drop: "dataview-next/drop"
|
|
41
42
|
};
|
|
42
43
|
|
|
@@ -320,6 +321,14 @@ async function removeRow(ctx, tableName, primary) {
|
|
|
320
321
|
if (!table) throw new Error(`unknown table: ${tableName}`);
|
|
321
322
|
await getDatabase(ctx).remove(tableName, coercePrimary(table, primary));
|
|
322
323
|
}
|
|
324
|
+
async function clearColumn(ctx, tableName, fieldName) {
|
|
325
|
+
const info = await getInfo(ctx);
|
|
326
|
+
const table = info.tables[tableName];
|
|
327
|
+
if (!table) throw new Error(`unknown table: ${tableName}`);
|
|
328
|
+
if (!table.fields[fieldName]) throw new Error(`unknown field: ${fieldName}`);
|
|
329
|
+
if (table.primary.includes(fieldName)) throw new Error("cannot clear primary field");
|
|
330
|
+
await getDatabase(ctx).set(tableName, {}, coerceUpdateRecord(table, { [fieldName]: null }));
|
|
331
|
+
}
|
|
323
332
|
function addListener(ctx, name2, callback) {
|
|
324
333
|
const console = ctx.console;
|
|
325
334
|
console.addListener(name2, async (...args) => encodeValue(await callback(...args)), { authority: 4 });
|
|
@@ -335,6 +344,7 @@ function apply(ctx, config) {
|
|
|
335
344
|
addListener(ctx2, events.create, (table, data) => createRow(ctx2, table, data));
|
|
336
345
|
addListener(ctx2, events.update, (table, primary, data) => updateRow(ctx2, table, primary, data));
|
|
337
346
|
addListener(ctx2, events.remove, (table, primary) => removeRow(ctx2, table, primary));
|
|
347
|
+
addListener(ctx2, events.clearColumn, (table, field) => clearColumn(ctx2, table, field));
|
|
338
348
|
addListener(ctx2, events.drop, async (table) => {
|
|
339
349
|
getTable(ctx2, table);
|
|
340
350
|
await getDatabase(ctx2).drop(table);
|
package/lib/shared.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare const events: {
|
|
|
4
4
|
readonly create: "dataview-next/create";
|
|
5
5
|
readonly update: "dataview-next/update";
|
|
6
6
|
readonly remove: "dataview-next/remove";
|
|
7
|
+
readonly clearColumn: "dataview-next/clear-column";
|
|
7
8
|
readonly drop: "dataview-next/drop";
|
|
8
9
|
};
|
|
9
10
|
export type FieldType = 'primary' | 'integer' | 'unsigned' | 'float' | 'double' | 'decimal' | 'char' | 'string' | 'text' | 'boolean' | 'timestamp' | 'date' | 'time' | 'binary' | 'bigint' | 'list' | 'json' | 'expr' | string;
|
|
@@ -61,6 +62,7 @@ declare module '@koishijs/plugin-console' {
|
|
|
61
62
|
'dataview-next/create'(table: string, data: Record<string, unknown>): Promise<void>;
|
|
62
63
|
'dataview-next/update'(table: string, primary: Record<string, unknown>, data: Record<string, unknown>): Promise<void>;
|
|
63
64
|
'dataview-next/remove'(table: string, primary: Record<string, unknown>): Promise<void>;
|
|
65
|
+
'dataview-next/clear-column'(table: string, field: string): Promise<void>;
|
|
64
66
|
'dataview-next/drop'(table: string): Promise<DatabaseInfo>;
|
|
65
67
|
}
|
|
66
68
|
}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -397,6 +397,15 @@ async function removeRow(ctx: Context, tableName: string, primary: Dict) {
|
|
|
397
397
|
await getDatabase(ctx).remove(tableName, coercePrimary(table, primary))
|
|
398
398
|
}
|
|
399
399
|
|
|
400
|
+
async function clearColumn(ctx: Context, tableName: string, fieldName: string) {
|
|
401
|
+
const info = await getInfo(ctx)
|
|
402
|
+
const table = info.tables[tableName]
|
|
403
|
+
if (!table) throw new Error(`unknown table: ${tableName}`)
|
|
404
|
+
if (!table.fields[fieldName]) throw new Error(`unknown field: ${fieldName}`)
|
|
405
|
+
if (table.primary.includes(fieldName)) throw new Error('cannot clear primary field')
|
|
406
|
+
await getDatabase(ctx).set(tableName, {}, coerceUpdateRecord(table, { [fieldName]: null }))
|
|
407
|
+
}
|
|
408
|
+
|
|
400
409
|
type EventName = typeof events[keyof typeof events]
|
|
401
410
|
|
|
402
411
|
interface ConsoleEventTarget {
|
|
@@ -420,6 +429,7 @@ export function apply(ctx: Context, config: Config) {
|
|
|
420
429
|
addListener(ctx, events.create, (table: string, data: Dict) => createRow(ctx, table, data))
|
|
421
430
|
addListener(ctx, events.update, (table: string, primary: Dict, data: Dict) => updateRow(ctx, table, primary, data))
|
|
422
431
|
addListener(ctx, events.remove, (table: string, primary: Dict) => removeRow(ctx, table, primary))
|
|
432
|
+
addListener(ctx, events.clearColumn, (table: string, field: string) => clearColumn(ctx, table, field))
|
|
423
433
|
addListener(ctx, events.drop, async (table: string) => {
|
|
424
434
|
getTable(ctx, table)
|
|
425
435
|
await getDatabase(ctx).drop(table)
|
package/src/shared.ts
CHANGED
|
@@ -4,6 +4,7 @@ export const events = {
|
|
|
4
4
|
create: 'dataview-next/create',
|
|
5
5
|
update: 'dataview-next/update',
|
|
6
6
|
remove: 'dataview-next/remove',
|
|
7
|
+
clearColumn: 'dataview-next/clear-column',
|
|
7
8
|
drop: 'dataview-next/drop',
|
|
8
9
|
} as const
|
|
9
10
|
|
|
@@ -90,6 +91,7 @@ declare module '@koishijs/plugin-console' {
|
|
|
90
91
|
'dataview-next/create'(table: string, data: Record<string, unknown>): Promise<void>
|
|
91
92
|
'dataview-next/update'(table: string, primary: Record<string, unknown>, data: Record<string, unknown>): Promise<void>
|
|
92
93
|
'dataview-next/remove'(table: string, primary: Record<string, unknown>): Promise<void>
|
|
94
|
+
'dataview-next/clear-column'(table: string, field: string): Promise<void>
|
|
93
95
|
'dataview-next/drop'(table: string): Promise<DatabaseInfo>
|
|
94
96
|
}
|
|
95
97
|
}
|