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 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-5a6d905f] .layout-header .left{display:flex;gap:4px;align-items:center;margin-left:24px;padding-left:0}.dataview-next .header-title[data-v-5a6d905f]{display:inline-flex;gap:6px;align-items:center}.dataview-next .muted[data-v-5a6d905f]{color:var(--fg2);font-weight:400}.source-list[data-v-5a6d905f]{padding:12px 0}.source-group+.source-group[data-v-5a6d905f]{margin-top:8px}.source-title[data-v-5a6d905f],.table-entry[data-v-5a6d905f],.cell-value[data-v-5a6d905f]{border:0;background:transparent;color:inherit;font:inherit}.source-title[data-v-5a6d905f]{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-5a6d905f]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.source-chevron[data-v-5a6d905f]{transition:transform .15s ease}.source-chevron.expanded[data-v-5a6d905f]{transform:rotate(90deg)}.table-list[data-v-5a6d905f]{display:grid;gap:2px}.table-entry[data-v-5a6d905f]{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-5a6d905f],.table-entry[data-v-5a6d905f]:hover,.source-title[data-v-5a6d905f]:hover{background:var(--k-hover-bg)}.table-name[data-v-5a6d905f]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.count[data-v-5a6d905f]{color:var(--fg2);font-size:12px;white-space:nowrap}.dataview-empty[data-v-5a6d905f]{height:100%}.table-panel[data-v-5a6d905f]{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-5a6d905f],.change-bar[data-v-5a6d905f],.query-bar[data-v-5a6d905f]{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.table-header h2[data-v-5a6d905f]{margin:0;font-size:22px}.table-header p[data-v-5a6d905f]{margin:4px 0 0;color:var(--fg2)}.table-actions[data-v-5a6d905f],.change-bar>div[data-v-5a6d905f]{display:flex;gap:8px}.table-actions[data-v-5a6d905f] .el-button+.el-button{margin-left:0}.query-bar[data-v-5a6d905f]{justify-content:flex-start}.query-bar .el-input[data-v-5a6d905f]{max-width:360px}.change-bar[data-v-5a6d905f]{justify-content:flex-start;padding:8px 12px;border-radius:6px}.data-grid[data-v-5a6d905f]{flex:1 1 0;min-height:0;min-width:0}.data-grid[data-v-5a6d905f] .el-table__body .el-table__cell{padding:4px 0}.data-grid[data-v-5a6d905f] th.el-table-fixed-column--right,.data-grid[data-v-5a6d905f] td.el-table-fixed-column--right{background-color:var(--el-bg-color)}.el-pagination[data-v-5a6d905f]{flex:0 0 auto;align-self:center;justify-content:center;min-width:0}.el-pagination[data-v-5a6d905f] .el-select{width:112px}.column-header[data-v-5a6d905f]{display:grid;gap:6px}.data-grid[data-v-5a6d905f] th.is-sortable .cell{display:grid;grid-template-columns:minmax(0,max-content) 24px minmax(0,1fr);gap:6px 4px;align-items:start}.data-grid[data-v-5a6d905f] th.is-sortable .column-header{display:contents}.data-grid[data-v-5a6d905f] th.is-sortable .column-header .el-input{grid-column:1/-1}.data-grid[data-v-5a6d905f] th.is-sortable .column-header>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.data-grid[data-v-5a6d905f] th.is-sortable .caret-wrapper{grid-column:2;grid-row:1;align-self:center}.cell-editor[data-v-5a6d905f]{display:flex;gap:4px;align-items:center}.cell-editor[data-v-5a6d905f]>:first-child{flex:1}.cell-value[data-v-5a6d905f]{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-5a6d905f]:disabled{cursor:not-allowed}.form-grid[data-v-5a6d905f]{display:grid;gap:12px}.form-grid label[data-v-5a6d905f]{display:grid;gap:6px}.danger-text[data-v-5a6d905f]{color:var(--danger)}
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-dataview-next",
3
3
  "description": "在网页控制台中分类管理数据库表,支持删除表",
4
- "version": "0.0.3",
4
+ "version": "0.0.4",
5
5
  "main": "lib/index.cjs",
6
6
  "types": "lib/index.d.ts",
7
7
  "exports": {
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
  }