vue3-smart-table 2.0.0 → 2.0.1

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/README.md CHANGED
@@ -49,7 +49,7 @@ import 'element-plus/dist/index.css'
49
49
 
50
50
  // 引入 SmartTable
51
51
  import SmartTable from 'vue3-smart-table'
52
- import 'vue3-smart-table/dist/style.css'
52
+ import 'vue3-smart-table/style.css'
53
53
 
54
54
  const app = createApp(App)
55
55
  app.use(ElementPlus)
@@ -38,7 +38,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
38
38
  cellChange: (...args: any[]) => void;
39
39
  cellBlur: (...args: any[]) => void;
40
40
  cellEnter: (...args: any[]) => void;
41
- "cell-click": (...args: any[]) => void;
41
+ cellClick: (...args: any[]) => void;
42
42
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
43
43
  data: {
44
44
  type: ArrayConstructor;
@@ -70,7 +70,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
70
70
  onCellChange?: ((...args: any[]) => any) | undefined;
71
71
  onCellBlur?: ((...args: any[]) => any) | undefined;
72
72
  onCellEnter?: ((...args: any[]) => any) | undefined;
73
- "onCell-click"?: ((...args: any[]) => any) | undefined;
73
+ onCellClick?: ((...args: any[]) => any) | undefined;
74
74
  }>, {
75
75
  data: unknown[];
76
76
  loading: boolean;
@@ -3,6 +3,7 @@ interface Props {
3
3
  readonly row: any;
4
4
  readonly col: ColumnConfig;
5
5
  readonly index: number;
6
+ onCellChange?: (row: any, col: ColumnConfig) => void;
6
7
  onCellBlur?: (row: any, col: ColumnConfig) => void;
7
8
  onCellEnter?: (row: any, col: ColumnConfig) => void;
8
9
  }
@@ -1,2 +1,2 @@
1
- "use strict";var Y=Object.defineProperty;var G=(n,e,r)=>e in n?Y(n,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[e]=r;var A=(n,e,r)=>G(n,typeof e!="symbol"?e+"":e,r);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("vue"),b=require("element-plus"),z=require("@element-plus/icons-vue");function I(n,e){if(!(e!=null&&e.length))return n;const r=new Map(e.map(l=>[l.key,l]));return n.map(l=>{const s=r.get(l.key);return s?{...l,visible:typeof s.visible=="boolean"?s.visible:l.visible}:l})}function Q(n,e){const{cacheKey:r,storage:l=localStorage}=e||{},s=r?l.getItem(r):null,o=t.ref(I(n,s?JSON.parse(s):[]));return t.watch(o,a=>{if(!r)return;const m=a.map(p=>({key:p.key,visible:p.visible,columnOpts:p.columnOpts}));l.setItem(r,JSON.stringify(m))},{deep:!0}),{columns:o,setColumns(a){o.value=I(n,a),r&&l.setItem(r,JSON.stringify(a))},resetColumns(){o.value=n,r&&l.removeItem(r)}}}function X(n,e=10,r=[]){const s="*:*:*",o=d=>{if(!d)return!0;const g=Array.isArray(d)?d:[d];return r.some(h=>h===s||g.includes(h))},a=t.computed(()=>n.some(d=>o(d.permission))),m=t.computed(()=>n.filter(g=>o(g.permission)).slice(0,e).reduce((g,h)=>g+(h.width??55),0)),p=(d,g)=>o(d.permission)&&(d.visible?d.visible(g):!0),y=d=>n.filter(h=>p(h,d)).slice(0,e).reduce((h,M)=>h+(M.width??55),0);return{hasAnyButton:a,optWidth:m,hasAnyVisibleButton:d=>d!=null&&d.length?d.some(g=>n.some(h=>p(h,g))):!1,getMaxOptWidth:d=>d!=null&&d.length?d.reduce((g,h)=>Math.max(g,y(h)),0):m.value,getVisibleButtons:d=>n.filter(g=>p(g,d)).slice(0,e)}}class Z{constructor(){A(this,"renderers",new Map)}register(e,r){this.renderers.has(e)&&process.env.NODE_ENV==="development"&&console.debug(`[SmartTable] Renderer "${e}" already registered, skipping.`),this.renderers.set(e,r)}registerMultiple(e){Object.entries(e).forEach(([r,l])=>{this.renderers.has(r)||this.renderers.set(r,l)})}get(e){return this.renderers.get(e)}has(e){return this.renderers.has(e)}unregister(e){return this.renderers.delete(e)}clear(){this.renderers.clear()}names(){return Array.from(this.renderers.keys())}}let F=null;function S(){return F||(F=new Z),F}function T(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>t.h(n,e)}})}function w(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>n(e)}})}function ee(n,e){if(process.env.NODE_ENV!=="production"&&e)switch(n){case"dict":(!e.options||!Array.isArray(e.options))&&console.warn("[SmartTable] 'dict' renderer requires 'options' array, received:",e.options);break;case"select":!e.options||!Array.isArray(e.options)?console.warn("[SmartTable] 'select' renderer requires 'options' array, received:",e.options):e.options.length===0&&console.warn("[SmartTable] 'select' renderer 'options' array is empty");break;case"map":(!e.options||typeof e.options!="object")&&console.warn("[SmartTable] 'map' renderer requires 'options' object, received:",e.options);break;case"link":(!e.href||typeof e.href!="string")&&console.warn("[SmartTable] 'link' renderer requires 'href' string, received:",e.href);break;case"input-number":e.min!==void 0&&e.max!==void 0&&e.min>e.max&&console.warn(`[SmartTable] 'input-number' renderer: min (${e.min}) should not be greater than max (${e.max})`);break}}function k(n,e){if(!(!n||!e))return e.split(".").reduce((r,l)=>r==null?void 0:r[l],n)}function P(n,e,r){if(!n||!e)return;const l=e.split("."),s=l.pop(),o=l.reduce((a,m)=>(a[m]||(a[m]={}),a[m]),n);o[s]=r}const te=t.defineComponent({__name:"input",props:{row:{},col:{},index:{},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(k(e.row,e.col.key));t.watch(r,o=>{P(e.row,e.col.key,o)});const l=()=>{var o;return(o=e.onCellBlur)==null?void 0:o.call(e,e.row,e.col)},s=()=>{var o;return(o=e.onCellEnter)==null?void 0:o.call(e,e.row,e.col)};return(o,a)=>{const m=t.resolveComponent("el-input");return t.openBlock(),t.createBlock(m,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=p=>r.value=p)},{placeholder:"",size:"small",clearable:!0,...n.col.renderProps},{onBlur:l,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),ne=t.defineComponent({__name:"inputNumber",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(k(e.row,e.col.key));t.watch(r,o=>{var a;P(e.row,e.col.key,o),(a=e.onCellChange)==null||a.call(e,e.row,e.col)});const l=()=>{var o;return(o=e.onCellBlur)==null?void 0:o.call(e,e.row,e.col)},s=()=>{var o;return(o=e.onCellEnter)==null?void 0:o.call(e,e.row,e.col)};return(o,a)=>{const m=t.resolveComponent("el-input-number");return t.openBlock(),t.createBlock(m,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=p=>r.value=p)},{min:0,max:99999,controls:!1,size:"small",...n.col.renderProps},{onBlur:l,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),re=t.defineComponent({__name:"select",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(k(e.row,e.col.key));t.watch(r,a=>{P(e.row,e.col.key,a)});const l=()=>{var a;return(a=e.onCellChange)==null?void 0:a.call(e,e.row,e.col)},s=()=>{var a;return(a=e.onCellBlur)==null?void 0:a.call(e,e.row,e.col)},o=()=>{var a;return(a=e.onCellEnter)==null?void 0:a.call(e,e.row,e.col)};return(a,m)=>{const p=t.resolveComponent("el-option"),y=t.resolveComponent("el-select");return t.openBlock(),t.createBlock(y,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":m[0]||(m[0]=C=>r.value=C)},{placeholder:"请选择",size:"small",clearable:!0,...n.col.renderProps},{onChange:l,onBlur:s,onKeyup:t.withKeys(o,["enter"])}),{default:t.withCtx(()=>{var C;return[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(((C=n.col.renderProps)==null?void 0:C.options)||[],_=>(t.openBlock(),t.createBlock(p,{key:_.value,label:_.label,value:_.value},null,8,["label","value"]))),128))]}),_:1},16,["modelValue"])}}}),oe=T(te),le=T(ne),ie=T(re),se=w(n=>{const e=n.col.renderProps||{},r=k(n.row,n.col.key);return t.h(b.ElButton,{type:e.type||"primary",...e,onClick:()=>{var l;return(l=n.onClick)==null?void 0:l.call(n,n.row,n.col)}},()=>e.label||r)}),ae=w(n=>{const e=n.col.renderProps||{},r=k(n.row,n.col.key);return t.h("a",{href:e.href||"#",target:e.blank?"_blank":"_self",style:e.style||"color:#409EFF;cursor:pointer;"},e.label||r)}),ce=w(n=>{var r;const e=k(n.row,n.col.key);return t.h("div",{class:"line-clamp-2",innerHTML:e??"",...((r=n.col)==null?void 0:r.renderProps)||{}})}),ue=w(n=>{const e=k(n.row,n.col.key)??"",r=n.col.renderProps??{},l={position:"absolute",right:"-5px",top:"50%",transform:"translateY(-50%)",cursor:"pointer",display:"none","font-size":"12px",color:r.iconColor||"#409EFF","user-select":"none"},s={"padding-right":"10px",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":r.lineClamp??2,overflow:"hidden",...r.textStyles};return t.h("div",{class:"st_copy_wrapper",style:"width: 100%; position: relative; display: inline-block;"},[t.h("span",{class:`st_copy_text ${r.textClass??""}`,style:s,title:e},e),e&&t.h("span",{class:"st_copy_btn",style:l,title:r.copyTitle||"复制",onClick:()=>{if(e)try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(e).then(()=>{b.ElMessage.success(r.successText??"复制成功")}).catch(()=>{b.ElMessage.error(r.errorText??"复制失败")});else{const o=document.createElement("textarea");o.value=e,o.style.position="fixed",o.style.opacity="0",document.body.appendChild(o),o.select();const a=document.execCommand("copy");document.body.removeChild(o),a?b.ElMessage.success(r.successText??"复制成功"):b.ElMessage.error(r.errorText??"复制失败")}}catch{b.ElMessage.error(r.errorText??"复制失败")}}},[t.h(z.DocumentCopy,{style:"width: 1em; height: 1em;"})])].filter(Boolean))}),de=w(n=>{var a;const e=k(n.row,n.col.key)??"",r=((a=n.col)==null?void 0:a.renderProps)||{},s=e?Array.isArray(e)?e.filter(m=>m&&typeof m=="string"):[e]:[];if(s.length===0)return r.placeholder||"";const o={width:r.width||"80px",height:r.height||"80px",marginRight:s.length>1?"4px":"0",...r.style||{}};return s.length===1?t.h(b.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:o,...r}):t.h("div",{class:"st_img_wrapper",style:"display: flex; align-items: center; position: relative"},[t.h(b.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:o,...r}),s.length>1&&t.h("span",{class:"st_img_total",style:"position: absolute; top: 0; right: 0; ",title:`${s.length}`},[t.h(z.CopyDocument,{style:"width: 1em; height: 1em; "})])])}),me=w(n=>{const e=k(n.row,n.col.key)??"",r=n.col.renderProps||{},l=r.options??[],s=r.showValue??!1;if(e==null||e==="")return"";const o=Array.isArray(e)?e.map(String):[String(e)],a=l.filter(y=>o.includes(String(y.value))),m=o.filter(y=>!l.some(C=>String(C.value)===y)),p=a.map((y,C)=>t.h(b.ElTag,{key:y.value,type:y.listClass,class:y.cssClass,disableTransitions:!0},{default:()=>y.label+" "}));return s&&m.length>0&&p.push(t.h("span",{},m.join(" "))),t.h("div",{},p)}),pe=w(n=>{var l;const e=k(n.row,n.col.key)??"",r=((l=n.col.renderProps)==null?void 0:l.options)??{};return e!=null?r[e]??"":""});function fe(n){return typeof n.formatter=="function"}const ge=w(n=>{var o;const{col:e,row:r,index:l}=n,s=k(n.row,n.col.key)??"";return fe(e)?(o=e.formatter)==null?void 0:o.call(e,s,r,l):s??""}),ye=w(n=>{const e=k(n.row,n.col.key)??"",r=n.col.renderProps||{};return e?/^https?:\/\//.test(e)?t.h(b.ElImage,{src:e,previewSrcList:[e],previewTeleported:!0,fit:"contain",style:"width:40px;height:40px",...r}):/^\s*<svg[\s\S]*<\/svg>\s*$/.test(e)?t.h("div",{innerHTML:e,style:`width:40px;height:40px;display:inline-block;${r.style||""}`,...r}):t.h("i",{class:e,style:`font-size:20px;${r.style||""}`,...r}):""}),O={input:oe,"input-number":le,select:ie,button:se,link:ae,html:ce,copy:ue,img:de,dict:me,map:pe,formatter:ge,icon:ye};function N(n){n.registerMultiple(O)}function he(){return O}const ke=["title"],D=t.defineComponent({__name:"index",props:{data:{type:Array,default:()=>[]},columns:{type:Array,default:()=>[]},rowKey:{type:String,default:"id"},loading:{type:Boolean,default:!1},permissions:{type:Array,default:()=>[]},cacheKey:String,pagination:{type:Object,default:()=>({})}},emits:["update:columns","cellChange","cellBlur","cellEnter","cell-click"],setup(n,{expose:e,emit:r}){const l=n,s=r,{columns:o}=Q(l.columns,{cacheKey:l.cacheKey??""});t.watch(o,i=>s("update:columns",i),{deep:!0,immediate:!0}),t.watch(()=>l.data,i=>{i&&o.value.forEach(c=>{c.type==="operation"&&(c.__rows=i)})},{deep:!0,immediate:!0});const a=t.computed(()=>o.value.filter(i=>i.type==="selection")),m=t.computed(()=>o.value.filter(i=>i.type==="index")),p=t.computed(()=>o.value.filter(i=>i.type==="operation")),y=t.computed(()=>o.value.filter(i=>!(i.type==="selection"||i.type==="index"||i.type==="operation"||i.visible===!1))),C=i=>{var B,E;const c=(B=l.pagination)==null?void 0:B.page,f=(E=l.pagination)==null?void 0:E.size;return c&&f?(c-1)*f+i+1:i+1};N(S());const _=t.computed(()=>{const i=S(),c={};return i.names().forEach(f=>{const B=i.get(f);B&&(c[f]=B)}),c}),L=t.computed(()=>{const i=new Map;return p.value.forEach(c=>{const f=X(c.buttons||[],c.maxbtn??10,l.permissions||[]);i.set(c.key,f)}),i}),d=i=>L.value.get(i.key),g=i=>{const c=d(i);return c?i.__rows?c.getMaxOptWidth(i.__rows):c.optWidth.value:0},h=(i,c)=>{const f=d(i);return f?(i.buttons||[]).length?((i.__rows||[]).length,f.getVisibleButtons(c)):[]:[]},M=()=>p.value.filter(i=>{const c=d(i);return!c||!(i.buttons||[]).length?!1:(i.__rows||[]).length?c.hasAnyVisibleButton(i.__rows||[]):c.hasAnyButton.value}),q=(i,c)=>{s("cellChange",i,c)},j=(i,c)=>{s("cellBlur",i,c)},H=(i,c)=>{s("cellEnter",i,c)},J=(i,c)=>{c&&s("cell-click",i,c)},$=t.ref();return e({tableRef:$}),(i,c)=>{const f=t.resolveComponent("el-table-column"),B=t.resolveComponent("el-button"),E=t.resolveComponent("el-table"),U=t.resolveDirective("loading");return t.withDirectives((t.openBlock(),t.createBlock(E,t.mergeProps({ref_key:"tableRef",ref:$},i.$attrs,{data:n.data,"row-key":n.rowKey,class:"smart_table"}),t.createSlots({default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(a.value,u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:"selection",type:"selection"},{ref_for:!0},u.columnProps),null,16))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(m.value,u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:"index",type:"index",label:u.label||"#",align:"center"},{ref_for:!0},u.columnProps),{default:t.withCtx(({$index:v})=>[t.createTextVNode(t.toDisplayString(C(v)),1)]),_:1},16,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(M(),u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:u.key,label:u.label||"操作",align:"center"},{ref_for:!0},{...u.columnProps,width:g(u)}),{default:t.withCtx(({row:v})=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(h(u,v),x=>(t.openBlock(),t.createBlock(B,{key:x.label,type:x.type||"primary",link:"",onClick:V=>x.action(v)},{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(x.label),1)]),_:2},1032,["type","onClick"]))),128))]),_:2},1040,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(y.value,u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:u.key,label:u.label,align:"center"},{ref_for:!0},u.columnProps||{}),{default:t.withCtx(v=>{var x,V;return[u.render==="slot"?t.renderSlot(i.$slots,(u==null?void 0:u.slot)||u.key,t.mergeProps({key:0,ref_for:!0},v)):u.render&&_.value[u.render]?(t.openBlock(),t.createBlock(t.resolveDynamicComponent(_.value[u.render]),{key:1,row:v.row,col:u,index:v.$index,onCellChange:q,onCellBlur:j,onCellEnter:H,onClick:J},null,40,["row","col","index"])):(t.openBlock(),t.createElementBlock("span",{key:2,style:t.normalizeStyle(((x=u.renderProps)==null?void 0:x.style)||""),class:t.normalizeClass(((V=u.renderProps)==null?void 0:V.class)||""),title:t.unref(k)(v.row,u.key)},t.toDisplayString(t.unref(k)(v.row,u.key)),15,ke))]}),_:2},1040,["label"]))),128))]),_:2},[t.renderList(y.value,u=>({name:u.key,fn:t.withCtx(v=>[t.renderSlot(i.$slots,u.key,t.normalizeProps(t.guardReactiveProps(v)))])}))]),1040,["data","row-key"])),[[U,n.loading]])}}}),K={defaultPagination:{page:1,size:10,total:0},defaultTableProps:{},defaultColumnProps:{}};class ve{constructor(){A(this,"config",{...K})}getConfig(){return{...this.config}}setConfig(e){this.config=this.mergeConfig(this.config,e),e.renderers&&S().registerMultiple(e.renderers)}get(e){return this.config[e]}reset(){this.config={...K}}mergeConfig(e,r){const l={...e};for(const s in r)r[s]&&typeof r[s]=="object"&&!Array.isArray(r[s])?l[s]=this.mergeConfig(e[s]||{},r[s]):l[s]=r[s];return l}}let R=null;function W(){return R||(R=new ve),R}function Ce(n){W().setConfig(n)}function be(){return W().getConfig()}function we(n,e){return{key:n,...e}}exports.SmartTable=D;exports.builtInRenderers=O;exports.createFunctionalRenderer=w;exports.createRenderer=he;exports.default=D;exports.defineColumn=we;exports.getRendererManager=S;exports.getSmartTableConfig=be;exports.registerBuiltInRenderers=N;exports.setSmartTableConfig=Ce;exports.validateRendererProps=ee;exports.wrapSFCComponent=T;
1
+ "use strict";var Y=Object.defineProperty;var G=(n,e,r)=>e in n?Y(n,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[e]=r;var F=(n,e,r)=>G(n,typeof e!="symbol"?e+"":e,r);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("vue"),b=require("element-plus"),z=require("@element-plus/icons-vue");function I(n,e){if(!(e!=null&&e.length))return n;const r=new Map(e.map(l=>[l.key,l]));return n.map(l=>{const s=r.get(l.key);return s?{...l,visible:typeof s.visible=="boolean"?s.visible:l.visible}:l})}function Q(n,e){const{cacheKey:r,storage:l=localStorage}=e||{},s=r?l.getItem(r):null,o=t.ref(I(n,s?JSON.parse(s):[]));return t.watch(o,a=>{if(!r)return;const m=a.map(p=>({key:p.key,visible:p.visible,columnOpts:p.columnOpts}));l.setItem(r,JSON.stringify(m))},{deep:!0}),{columns:o,setColumns(a){o.value=I(n,a),r&&l.setItem(r,JSON.stringify(a))},resetColumns(){o.value=n,r&&l.removeItem(r)}}}function X(n,e=10,r=[]){const s="*:*:*",o=d=>{if(!d)return!0;const g=Array.isArray(d)?d:[d];return r.some(h=>h===s||g.includes(h))},a=t.computed(()=>n.some(d=>o(d.permission))),m=t.computed(()=>n.filter(g=>o(g.permission)).slice(0,e).reduce((g,h)=>g+(h.width??55),0)),p=(d,g)=>o(d.permission)&&(d.visible?d.visible(g):!0),y=d=>n.filter(h=>p(h,d)).slice(0,e).reduce((h,M)=>h+(M.width??55),0);return{hasAnyButton:a,optWidth:m,hasAnyVisibleButton:d=>d!=null&&d.length?d.some(g=>n.some(h=>p(h,g))):!1,getMaxOptWidth:d=>d!=null&&d.length?d.reduce((g,h)=>Math.max(g,y(h)),0):m.value,getVisibleButtons:d=>n.filter(g=>p(g,d)).slice(0,e)}}class Z{constructor(){F(this,"renderers",new Map)}register(e,r){this.renderers.has(e)&&process.env.NODE_ENV==="development"&&console.debug(`[SmartTable] Renderer "${e}" already registered, skipping.`),this.renderers.set(e,r)}registerMultiple(e){Object.entries(e).forEach(([r,l])=>{this.renderers.has(r)||this.renderers.set(r,l)})}get(e){return this.renderers.get(e)}has(e){return this.renderers.has(e)}unregister(e){return this.renderers.delete(e)}clear(){this.renderers.clear()}names(){return Array.from(this.renderers.keys())}}let A=null;function S(){return A||(A=new Z),A}function T(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>t.h(n,e)}})}function w(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>n(e)}})}function ee(n,e){if(process.env.NODE_ENV!=="production"&&e)switch(n){case"dict":(!e.options||!Array.isArray(e.options))&&console.warn("[SmartTable] 'dict' renderer requires 'options' array, received:",e.options);break;case"select":!e.options||!Array.isArray(e.options)?console.warn("[SmartTable] 'select' renderer requires 'options' array, received:",e.options):e.options.length===0&&console.warn("[SmartTable] 'select' renderer 'options' array is empty");break;case"map":(!e.options||typeof e.options!="object")&&console.warn("[SmartTable] 'map' renderer requires 'options' object, received:",e.options);break;case"link":(!e.href||typeof e.href!="string")&&console.warn("[SmartTable] 'link' renderer requires 'href' string, received:",e.href);break;case"input-number":e.min!==void 0&&e.max!==void 0&&e.min>e.max&&console.warn(`[SmartTable] 'input-number' renderer: min (${e.min}) should not be greater than max (${e.max})`);break}}function C(n,e){if(!(!n||!e))return e.split(".").reduce((r,l)=>r==null?void 0:r[l],n)}function P(n,e,r){if(!n||!e)return;const l=e.split("."),s=l.pop(),o=l.reduce((a,m)=>(a[m]||(a[m]={}),a[m]),n);o[s]=r}const te=t.defineComponent({__name:"input",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,o=>{var a;P(e.row,e.col.key,o),(a=e.onCellChange)==null||a.call(e,e.row,e.col)});const l=()=>{var o;return(o=e.onCellBlur)==null?void 0:o.call(e,e.row,e.col)},s=()=>{var o;return(o=e.onCellEnter)==null?void 0:o.call(e,e.row,e.col)};return(o,a)=>{const m=t.resolveComponent("el-input");return t.openBlock(),t.createBlock(m,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=p=>r.value=p)},{placeholder:"",size:"small",clearable:!0,...n.col.renderProps},{onBlur:l,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),ne=t.defineComponent({__name:"inputNumber",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,o=>{var a;P(e.row,e.col.key,o),(a=e.onCellChange)==null||a.call(e,e.row,e.col)});const l=()=>{var o;return(o=e.onCellBlur)==null?void 0:o.call(e,e.row,e.col)},s=()=>{var o;return(o=e.onCellEnter)==null?void 0:o.call(e,e.row,e.col)};return(o,a)=>{const m=t.resolveComponent("el-input-number");return t.openBlock(),t.createBlock(m,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=p=>r.value=p)},{min:0,max:99999,controls:!1,size:"small",...n.col.renderProps},{onBlur:l,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),re=t.defineComponent({__name:"select",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,a=>{P(e.row,e.col.key,a)});const l=()=>{var a;return(a=e.onCellChange)==null?void 0:a.call(e,e.row,e.col)},s=()=>{var a;return(a=e.onCellBlur)==null?void 0:a.call(e,e.row,e.col)},o=()=>{var a;return(a=e.onCellEnter)==null?void 0:a.call(e,e.row,e.col)};return(a,m)=>{const p=t.resolveComponent("el-option"),y=t.resolveComponent("el-select");return t.openBlock(),t.createBlock(y,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":m[0]||(m[0]=v=>r.value=v)},{placeholder:"请选择",size:"small",clearable:!0,...n.col.renderProps},{onChange:l,onBlur:s,onKeyup:t.withKeys(o,["enter"])}),{default:t.withCtx(()=>{var v;return[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(((v=n.col.renderProps)==null?void 0:v.options)||[],_=>(t.openBlock(),t.createBlock(p,{key:_.value,label:_.label,value:_.value},null,8,["label","value"]))),128))]}),_:1},16,["modelValue"])}}}),oe=T(te),le=T(ne),ie=T(re),se=w(n=>{const e=n.col.renderProps||{},r=C(n.row,n.col.key);return t.h(b.ElButton,{type:e.type||"primary",...e,onClick:()=>{var l;return(l=n.onClick)==null?void 0:l.call(n,n.row,n.col)}},()=>e.label||r)}),ae=w(n=>{const e=n.col.renderProps||{},r=C(n.row,n.col.key);return t.h("a",{href:e.href||"#",target:e.blank?"_blank":"_self",style:e.style||"color:#409EFF;cursor:pointer;"},e.label||r)}),ce=w(n=>{var r;const e=C(n.row,n.col.key);return t.h("div",{class:"line-clamp-2",innerHTML:e??"",...((r=n.col)==null?void 0:r.renderProps)||{}})}),ue=w(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps??{},l={position:"absolute",right:"-5px",top:"50%",transform:"translateY(-50%)",cursor:"pointer",display:"none","font-size":"12px",color:r.iconColor||"#409EFF","user-select":"none"},s={"padding-right":"10px",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":r.lineClamp??2,overflow:"hidden",...r.textStyles};return t.h("div",{class:"st_copy_wrapper",style:"width: 100%; position: relative; display: inline-block;"},[t.h("span",{class:`st_copy_text ${r.textClass??""}`,style:s,title:e},e),e&&t.h("span",{class:"st_copy_btn",style:l,title:r.copyTitle||"复制",onClick:()=>{if(e)try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(e).then(()=>{b.ElMessage.success(r.successText??"复制成功")}).catch(()=>{b.ElMessage.error(r.errorText??"复制失败")});else{const o=document.createElement("textarea");o.value=e,o.style.position="fixed",o.style.opacity="0",document.body.appendChild(o),o.select();const a=document.execCommand("copy");document.body.removeChild(o),a?b.ElMessage.success(r.successText??"复制成功"):b.ElMessage.error(r.errorText??"复制失败")}}catch{b.ElMessage.error(r.errorText??"复制失败")}}},[t.h(z.DocumentCopy,{style:"width: 1em; height: 1em;"})])].filter(Boolean))}),de=w(n=>{var a;const e=C(n.row,n.col.key)??"",r=((a=n.col)==null?void 0:a.renderProps)||{},s=e?Array.isArray(e)?e.filter(m=>m&&typeof m=="string"):[e]:[];if(s.length===0)return r.placeholder||"";const o={width:r.width||"80px",height:r.height||"80px",marginRight:s.length>1?"4px":"0",...r.style||{}};return s.length===1?t.h(b.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:o,...r}):t.h("div",{class:"st_img_wrapper",style:"display: flex; align-items: center; position: relative"},[t.h(b.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:o,...r}),s.length>1&&t.h("span",{class:"st_img_total",style:"position: absolute; top: 0; right: 0; ",title:`${s.length}`},[t.h(z.CopyDocument,{style:"width: 1em; height: 1em; "})])])}),me=w(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps||{},l=r.options??[],s=r.showValue??!1;if(e==null||e==="")return"";const o=Array.isArray(e)?e.map(String):[String(e)],a=l.filter(y=>o.includes(String(y.value))),m=o.filter(y=>!l.some(v=>String(v.value)===y)),p=a.map((y,v)=>t.h(b.ElTag,{key:y.value,type:y.listClass,class:y.cssClass,disableTransitions:!0},{default:()=>y.label+" "}));return s&&m.length>0&&p.push(t.h("span",{},m.join(" "))),t.h("div",{},p)}),pe=w(n=>{var l;const e=C(n.row,n.col.key)??"",r=((l=n.col.renderProps)==null?void 0:l.options)??{};return e!=null?r[e]??"":""});function fe(n){return typeof n.formatter=="function"}const ge=w(n=>{var o;const{col:e,row:r,index:l}=n,s=C(n.row,n.col.key)??"";return fe(e)?(o=e.formatter)==null?void 0:o.call(e,s,r,l):s??""}),ye=w(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps||{};return e?/^https?:\/\//.test(e)?t.h(b.ElImage,{src:e,previewSrcList:[e],previewTeleported:!0,fit:"contain",style:"width:40px;height:40px",...r}):/^\s*<svg[\s\S]*<\/svg>\s*$/.test(e)?t.h("div",{innerHTML:e,style:`width:40px;height:40px;display:inline-block;${r.style||""}`,...r}):t.h("i",{class:e,style:`font-size:20px;${r.style||""}`,...r}):""}),O={input:oe,"input-number":le,select:ie,button:se,link:ae,html:ce,copy:ue,img:de,dict:me,map:pe,formatter:ge,icon:ye};function N(n){n.registerMultiple(O)}function he(){return O}const Ce=["title"],D=t.defineComponent({__name:"index",props:{data:{type:Array,default:()=>[]},columns:{type:Array,default:()=>[]},rowKey:{type:String,default:"id"},loading:{type:Boolean,default:!1},permissions:{type:Array,default:()=>[]},cacheKey:String,pagination:{type:Object,default:()=>({})}},emits:["update:columns","cellChange","cellBlur","cellEnter","cellClick"],setup(n,{expose:e,emit:r}){const l=n,s=r,{columns:o}=Q(l.columns,{cacheKey:l.cacheKey??""});t.watch(o,i=>s("update:columns",i),{deep:!0,immediate:!0}),t.watch(()=>l.data,i=>{i&&o.value.forEach(c=>{c.type==="operation"&&(c.__rows=i)})},{deep:!0,immediate:!0});const a=t.computed(()=>o.value.filter(i=>i.type==="selection")),m=t.computed(()=>o.value.filter(i=>i.type==="index")),p=t.computed(()=>o.value.filter(i=>i.type==="operation")),y=t.computed(()=>o.value.filter(i=>!(i.type==="selection"||i.type==="index"||i.type==="operation"||i.visible===!1))),v=i=>{var B,E;const c=(B=l.pagination)==null?void 0:B.page,f=(E=l.pagination)==null?void 0:E.size;return c&&f?(c-1)*f+i+1:i+1};N(S());const _=t.computed(()=>{const i=S(),c={};return i.names().forEach(f=>{const B=i.get(f);B&&(c[f]=B)}),c}),L=t.computed(()=>{const i=new Map;return p.value.forEach(c=>{const f=X(c.buttons||[],c.maxbtn??10,l.permissions||[]);i.set(c.key,f)}),i}),d=i=>L.value.get(i.key),g=i=>{const c=d(i);return c?i.__rows?c.getMaxOptWidth(i.__rows):c.optWidth.value:0},h=(i,c)=>{const f=d(i);return f?(i.buttons||[]).length?((i.__rows||[]).length,f.getVisibleButtons(c)):[]:[]},M=()=>p.value.filter(i=>{const c=d(i);return!c||!(i.buttons||[]).length?!1:(i.__rows||[]).length?c.hasAnyVisibleButton(i.__rows||[]):c.hasAnyButton.value}),q=(i,c)=>{s("cellChange",i,c)},j=(i,c)=>{s("cellBlur",i,c)},H=(i,c)=>{s("cellEnter",i,c)},J=(i,c)=>{c&&s("cellClick",i,c)},$=t.ref();return e({tableRef:$}),(i,c)=>{const f=t.resolveComponent("el-table-column"),B=t.resolveComponent("el-button"),E=t.resolveComponent("el-table"),U=t.resolveDirective("loading");return t.withDirectives((t.openBlock(),t.createBlock(E,t.mergeProps({ref_key:"tableRef",ref:$},i.$attrs,{data:n.data,"row-key":n.rowKey,class:"smart_table"}),t.createSlots({default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(a.value,u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:"selection",type:"selection"},{ref_for:!0},u.columnProps),null,16))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(m.value,u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:"index",type:"index",label:u.label||"#",align:"center"},{ref_for:!0},u.columnProps),{default:t.withCtx(({$index:k})=>[t.createTextVNode(t.toDisplayString(v(k)),1)]),_:1},16,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(M(),u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:u.key,label:u.label||"操作",align:"center"},{ref_for:!0},{...u.columnProps,width:g(u)}),{default:t.withCtx(({row:k})=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(h(u,k),x=>(t.openBlock(),t.createBlock(B,{key:x.label,type:x.type||"primary",link:"",onClick:V=>x.action(k)},{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(x.label),1)]),_:2},1032,["type","onClick"]))),128))]),_:2},1040,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(y.value,u=>(t.openBlock(),t.createBlock(f,t.mergeProps({key:u.key,label:u.label,align:"center"},{ref_for:!0},u.columnProps||{}),{default:t.withCtx(k=>{var x,V;return[u.render==="slot"?t.renderSlot(i.$slots,(u==null?void 0:u.slot)||u.key,t.mergeProps({key:0,ref_for:!0},k)):u.render&&_.value[u.render]?(t.openBlock(),t.createBlock(t.resolveDynamicComponent(_.value[u.render]),{key:1,row:k.row,col:u,index:k.$index,onCellChange:q,onCellBlur:j,onCellEnter:H,onClick:J},null,40,["row","col","index"])):(t.openBlock(),t.createElementBlock("span",{key:2,style:t.normalizeStyle(((x=u.renderProps)==null?void 0:x.style)||""),class:t.normalizeClass(((V=u.renderProps)==null?void 0:V.class)||""),title:t.unref(C)(k.row,u.key)},t.toDisplayString(t.unref(C)(k.row,u.key)),15,Ce))]}),_:2},1040,["label"]))),128))]),_:2},[t.renderList(y.value,u=>({name:u.key,fn:t.withCtx(k=>[t.renderSlot(i.$slots,u.key,t.normalizeProps(t.guardReactiveProps(k)))])}))]),1040,["data","row-key"])),[[U,n.loading]])}}}),K={defaultPagination:{page:1,size:10,total:0},defaultTableProps:{},defaultColumnProps:{}};class ke{constructor(){F(this,"config",{...K})}getConfig(){return{...this.config}}setConfig(e){this.config=this.mergeConfig(this.config,e),e.renderers&&S().registerMultiple(e.renderers)}get(e){return this.config[e]}reset(){this.config={...K}}mergeConfig(e,r){const l={...e};for(const s in r)r[s]&&typeof r[s]=="object"&&!Array.isArray(r[s])?l[s]=this.mergeConfig(e[s]||{},r[s]):l[s]=r[s];return l}}let R=null;function W(){return R||(R=new ke),R}function ve(n){W().setConfig(n)}function be(){return W().getConfig()}function we(n,e){return{key:n,...e}}exports.SmartTable=D;exports.builtInRenderers=O;exports.createFunctionalRenderer=w;exports.createRenderer=he;exports.default=D;exports.defineColumn=we;exports.getRendererManager=S;exports.getSmartTableConfig=be;exports.registerBuiltInRenderers=N;exports.setSmartTableConfig=ve;exports.validateRendererProps=ee;exports.wrapSFCComponent=T;
2
2
  //# sourceMappingURL=vue3-smart-table.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue3-smart-table.cjs.js","sources":["../src/components/SmartTable/hooks/useTableColumns.ts","../src/components/SmartTable/hooks/useOperationColumn.ts","../src/components/SmartTable/renderer.ts","../src/components/SmartTable/utils/path.ts","../src/components/SmartTable/renderers/input.vue","../src/components/SmartTable/renderers/inputNumber.vue","../src/components/SmartTable/renderers/select.vue","../src/components/SmartTable/renderers/index.ts","../src/components/SmartTable/index.vue","../src/components/SmartTable/config.ts","../src/types/enhanced.ts"],"sourcesContent":["import { ref, watch } from 'vue'\r\n\r\n\r\n/**\r\n * 合并默认列配置和缓存配置\r\n *\r\n * 设计原则:\r\n * 1️⃣ 列顺序:以 defaultColumns 为准\r\n * 2️⃣ 列增减:以 defaultColumns 为准\r\n * 3️⃣ 缓存只覆盖用户可配置字段(如 visible)\r\n */\r\nfunction mergeColumns(\r\n defaultColumns: any[],\r\n cacheColumns: Array<{ key: string; visible?: boolean }>\r\n) {\r\n if (!cacheColumns?.length) return defaultColumns\r\n\r\n // 建立 key => cache 映射表,提升查找效率\r\n const cacheMap = new Map(\r\n cacheColumns.map(c => [c.key, c])\r\n )\r\n\r\n return defaultColumns.map(col => {\r\n const cacheCol = cacheMap.get(col.key)\r\n\r\n // 只允许缓存覆盖「可配置字段」\r\n if (!cacheCol) return col\r\n\r\n return {\r\n ...col,\r\n visible:\r\n typeof cacheCol.visible === 'boolean'\r\n ? cacheCol.visible\r\n : col.visible\r\n }\r\n })\r\n}\r\n\r\n\r\n/**\r\n * useTableColumns\r\n *\r\n * 表格列管理 Hook\r\n *\r\n * 职责:\r\n * - 管理表格列顺序\r\n * - 管理列显示 / 隐藏\r\n * - 持久化用户配置\r\n */\r\nexport function useTableColumns(\r\n defaultColumns: any[],\r\n options?: {\r\n /** 缓存唯一标识 */\r\n cacheKey?: string\r\n /** 存储介质,默认 localStorage */\r\n storage?: Storage\r\n }\r\n) {\r\n\r\n /** 解构参数并设置默认值 */\r\n const { cacheKey, storage = localStorage } = options || {}\r\n\r\n /**\r\n * 如果没有 cacheKey,则不启用缓存\r\n * (例如公共页面、未登录页面)\r\n * 从缓存中读取列配置\r\n */\r\n const cache = cacheKey ? storage.getItem(cacheKey) : null\r\n\r\n /**\r\n * 响应式列配置\r\n * 初始化时合并默认列和缓存列\r\n */\r\n const columns = ref(\r\n mergeColumns(\r\n defaultColumns,\r\n cache ? JSON.parse(cache) : []\r\n )\r\n )\r\n\r\n /**\r\n * 监听列变化,自动写入缓存\r\n */\r\n watch(\r\n columns,\r\n (newVal: any) => {\r\n if (!cacheKey) return\r\n\r\n /**\r\n * ⚠️ 只保存“轻量配置”\r\n * 避免把 render / action / 函数序列化进 localStorage\r\n */\r\n const lightColumns = newVal.map((col: any) => ({\r\n key: col.key,\r\n visible: col.visible,\r\n columnOpts: col.columnOpts\r\n }))\r\n\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(lightColumns)\r\n )\r\n },\r\n { deep: true }\r\n )\r\n\r\n /**\r\n * 对外暴露的 API\r\n */\r\n return {\r\n /** 当前列配置(响应式) */\r\n columns,\r\n\r\n /**\r\n * 主动设置列配置\r\n * 常用于:列设置弹窗 / 拖拽排序完成\r\n */\r\n setColumns(newColumns: any[]) {\r\n columns.value = mergeColumns(\r\n defaultColumns,\r\n newColumns\r\n )\r\n\r\n if (cacheKey) {\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(newColumns)\r\n )\r\n }\r\n },\r\n\r\n /**\r\n * 重置为默认列配置\r\n */\r\n resetColumns() {\r\n columns.value = defaultColumns\r\n\r\n if (cacheKey) {\r\n storage.removeItem(cacheKey)\r\n }\r\n }\r\n }\r\n}\r\n","import { computed } from 'vue'\r\n\r\nimport { ButtonConfig } from \"../types\"\r\n\r\n/**\r\n * useOperationColumn\r\n *\r\n * 操作列专用逻辑 Hook,负责:\r\n * 1. 根据权限判断操作列是否需要显示\r\n * 2. 计算操作列宽度(支持按钮自定义宽度)\r\n * 3. 支持行级 visible 配置\r\n * @param buttonConfigs 操作列按钮配置\r\n * @param maxbtn 操作列最多显示按钮数量(超过的不参与宽度计算)\r\n * @param userPermissions 当前用户权限列表\r\n */\r\nexport function useOperationColumn(\r\n buttonConfigs: ButtonConfig[],\r\n maxbtn = 10,\r\n userPermissions: string[] = []\r\n) {\r\n /** 默认按钮宽度 */\r\n const defaultWidth = 55\r\n\r\n /** 超级权限标识 */\r\n const all_permission = '*:*:*'\r\n\r\n /** --------------------------\r\n * 权限判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断是否具备按钮权限\r\n *\r\n * 规则:\r\n * - permission 未配置 ⇒ 永远有权限\r\n * - permission 为 string | string[] ⇒ 与用户权限匹配\r\n */\r\n const hasPermi = (value?: string | string[]) => {\r\n if (!value) return true\r\n\r\n const permArray = Array.isArray(value) ? value : [value]\r\n return userPermissions.some(\r\n p => p === all_permission || permArray.includes(p)\r\n )\r\n }\r\n\r\n /** --------------------------\r\n * 仅基于权限(不考虑行级 visible)\r\n * 适用于:表格未加载数据时的判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 是否至少存在一个有权限的按钮\r\n * 用于判断操作列是否需要渲染\r\n */\r\n const hasAnyButton = computed(() => {\r\n return buttonConfigs.some(btn => hasPermi(btn.permission))\r\n })\r\n\r\n /**\r\n * 操作列宽度(仅基于权限)\r\n * 用于无行数据时的兜底宽度计算\r\n *\r\n * 注意:这里不考虑 visible,因为没有 row 数据无法执行 visible 函数\r\n * 实际使用时会根据行数据重新计算\r\n */\r\n const optWidth = computed(() => {\r\n const permittedBtns = buttonConfigs\r\n .filter(btn => hasPermi(btn.permission))\r\n .slice(0, maxbtn)\r\n\r\n return permittedBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n })\r\n\r\n /** --------------------------\r\n * 权限 + 行级 visible\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断某个按钮在某一行是否可见\r\n */\r\n const isButtonVisible = (btn: ButtonConfig, row: any) => {\r\n return (\r\n hasPermi(btn.permission) &&\r\n (btn.visible ? btn.visible(row) : true)\r\n )\r\n }\r\n\r\n /**\r\n * 单行操作列宽度\r\n */\r\n const optRowWidth = (row: any) => {\r\n const visibleBtns = buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n\r\n return visibleBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 遍历所有行,获取最大操作列宽度\r\n */\r\n const getMaxOptWidth = (rows: any[]) => {\r\n if (!rows?.length) return optWidth.value\r\n return rows.reduce(\r\n (max, row) => Math.max(max, optRowWidth(row)),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 判断是否至少有一行存在可见按钮\r\n */\r\n const hasAnyVisibleButton = (rows: any[]) => {\r\n if (!rows?.length) return false\r\n return rows.some(row =>\r\n buttonConfigs.some(btn => isButtonVisible(btn, row))\r\n )\r\n }\r\n\r\n const getVisibleButtons = (row: any) => {\r\n return buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n }\r\n\r\n return {\r\n hasAnyButton,\r\n optWidth,\r\n hasAnyVisibleButton,\r\n getMaxOptWidth,\r\n getVisibleButtons\r\n }\r\n}\r\n","/**\r\n * SmartTable 内部渲染器管理系统\r\n * 移动到组件内部,保证组件的自包含性\r\n */\r\nimport { defineComponent, h, Component } from 'vue'\r\nimport type { Renderer } from './types'\r\n\r\n/**\r\n * 渲染器注册表接口\r\n */\r\nexport interface RendererRegistry {\r\n register(name: string, renderer: Renderer): void\r\n registerMultiple(renderers: Record<string, Renderer>): void\r\n get(name: string): Renderer | undefined\r\n has(name: string): boolean\r\n unregister(name: string): boolean\r\n clear(): void\r\n names(): string[]\r\n}\r\n\r\n/**\r\n * 渲染器管理器类\r\n */\r\nclass RendererManager implements RendererRegistry {\r\n private renderers: Map<string, Renderer> = new Map()\r\n\r\n register(name: string, renderer: Renderer): void {\r\n if (this.renderers.has(name)) {\r\n // 批量注册时不警告,只在单独注册时警告\r\n if (process.env.NODE_ENV === 'development') {\r\n console.debug(`[SmartTable] Renderer \"${name}\" already registered, skipping.`)\r\n }\r\n }\r\n this.renderers.set(name, renderer)\r\n }\r\n\r\n registerMultiple(renderers: Record<string, Renderer>): void {\r\n Object.entries(renderers).forEach(([name, renderer]) => {\r\n if (!this.renderers.has(name)) {\r\n this.renderers.set(name, renderer)\r\n }\r\n })\r\n }\r\n\r\n get(name: string): Renderer | undefined {\r\n return this.renderers.get(name)\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.renderers.has(name)\r\n }\r\n\r\n unregister(name: string): boolean {\r\n return this.renderers.delete(name)\r\n }\r\n\r\n clear(): void {\r\n this.renderers.clear()\r\n }\r\n\r\n names(): string[] {\r\n return Array.from(this.renderers.keys())\r\n }\r\n}\r\n\r\n/**\r\n * 全局渲染器管理器单例\r\n */\r\nlet globalRendererManager: RendererManager | null = null\r\n\r\n/**\r\n * 获取渲染器管理器\r\n */\r\nexport function getRendererManager(): RendererManager {\r\n if (!globalRendererManager) {\r\n globalRendererManager = new RendererManager()\r\n }\r\n return globalRendererManager\r\n}\r\n\r\n/**\r\n * 包装 SFC 组件为渲染器\r\n */\r\nexport function wrapSFCComponent(comp: Component): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'index', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => h(comp, props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 创建函数式渲染器\r\n */\r\nexport function createFunctionalRenderer(\r\n render: (props: {\r\n row: any\r\n col: any\r\n index: number\r\n onCellChange?: (row: any, col: any) => void\r\n onCellBlur?: (row: any, col: any) => void\r\n onCellEnter?: (row: any, col: any) => void\r\n onClick?: (row: any, col: any) => void\r\n }) => any\r\n): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'index', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => render(props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 验证渲染器配置\r\n * 在开发环境下验证 renderProps 的正确性\r\n */\r\nexport function validateRendererProps(\r\n rendererName: string,\r\n renderProps: Record<string, any> | undefined\r\n): void {\r\n if (process.env.NODE_ENV !== 'production' && renderProps) {\r\n switch (rendererName) {\r\n case 'dict':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'dict' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'select':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'select' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n } else if (renderProps.options.length === 0) {\r\n console.warn(`[SmartTable] 'select' renderer 'options' array is empty`)\r\n }\r\n break\r\n\r\n case 'map':\r\n if (!renderProps.options || typeof renderProps.options !== 'object') {\r\n console.warn(\r\n `[SmartTable] 'map' renderer requires 'options' object, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'link':\r\n if (!renderProps.href || typeof renderProps.href !== 'string') {\r\n console.warn(\r\n `[SmartTable] 'link' renderer requires 'href' string, received:`,\r\n renderProps.href\r\n )\r\n }\r\n break\r\n\r\n case 'input-number':\r\n if (renderProps.min !== undefined && renderProps.max !== undefined) {\r\n if (renderProps.min > renderProps.max) {\r\n console.warn(\r\n `[SmartTable] 'input-number' renderer: min (${renderProps.min}) should not be greater than max (${renderProps.max})`\r\n )\r\n }\r\n }\r\n break\r\n }\r\n }\r\n}\r\n","/**\r\n * 安全获取对象深层属性\r\n * 支持 a.b.c / a.0.b\r\n */\r\nexport function getValueByPath(obj: any, path?: string) {\r\n if (!obj || !path) return undefined\r\n return path.split('.').reduce((acc, key) => acc?.[key], obj)\r\n }\r\n \r\n /**\r\n * 安全设置对象深层属性(用于可编辑表格)\r\n */\r\n export function setValueByPath(\r\n obj: any,\r\n path: string,\r\n value: any\r\n ) {\r\n if (!obj || !path) return\r\n const keys = path.split('.')\r\n const lastKey = keys.pop()!\r\n \r\n const target = keys.reduce((acc, key) => {\r\n if (!acc[key]) acc[key] = {}\r\n return acc[key]\r\n }, obj)\r\n \r\n target[lastKey] = value\r\n }\r\n ","<template>\n <el-input\n v-model=\"value\"\n v-bind=\"{ placeholder: '', size: 'small', clearable: true, ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-input-number\n v-model=\"value\"\n v-bind=\"{ min: 0, max: 99999, controls: false, size: 'small', ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n props.onCellChange?.(props.row, props.col)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-select\n v-model=\"value\"\n v-bind=\"{ placeholder: '请选择', size: 'small', clearable: true, ...col.renderProps }\"\n @change=\"onChange\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n >\n <el-option\n v-for=\"opt in col.renderProps?.options || []\"\n :key=\"opt.value\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onChange = () => props.onCellChange?.(props.row, props.col)\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","/**\r\n * 内置渲染器集合\r\n * 可以按需引入或批量注册\r\n */\r\nimport { h } from 'vue'\r\nimport { ElButton, ElTag, ElImage, ElMessage } from 'element-plus'\r\nimport { DocumentCopy, CopyDocument } from '@element-plus/icons-vue'\r\nimport type { ColumnConfig } from '../types'\r\nimport { getValueByPath } from '../utils/path'\r\nimport { wrapSFCComponent, createFunctionalRenderer } from '../renderer'\r\nimport EditableInput from './input.vue'\r\nimport EditableNumber from './inputNumber.vue'\r\nimport EditableSelect from './select.vue'\r\n\r\n/**\r\n * 包装 SFC 组件\r\n */\r\nconst input = wrapSFCComponent(EditableInput)\r\nconst inputNumber = wrapSFCComponent(EditableNumber)\r\nconst select = wrapSFCComponent(EditableSelect)\r\n\r\n/**\r\n * button 渲染器\r\n */\r\nconst button = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h(ElButton as any, {\r\n type: rp.type || 'primary',\r\n ...rp,\r\n onClick: () => props.onClick?.(props.row, props.col)\r\n }, () => rp.label || val)\r\n})\r\n\r\n/**\r\n * link 渲染器\r\n */\r\nconst link = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('a', {\r\n href: rp.href || '#',\r\n target: rp.blank ? '_blank' : '_self',\r\n style: rp.style || 'color:#409EFF;cursor:pointer;',\r\n }, rp.label || val)\r\n})\r\n\r\n/**\r\n * html 渲染器\r\n */\r\nconst html = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('div', {\r\n class: 'line-clamp-2',\r\n innerHTML: val ?? '',\r\n ...(props.col?.renderProps || {})\r\n })\r\n})\r\n\r\n/**\r\n * copy 渲染器\r\n */\r\nconst copy = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps ?? {}\r\n const butStyle = {\r\n 'position': 'absolute',\r\n 'right': '-5px',\r\n 'top': '50%',\r\n 'transform': 'translateY(-50%)',\r\n 'cursor': 'pointer',\r\n 'display': 'none',\r\n 'font-size': '12px',\r\n 'color': rp.iconColor || '#409EFF',\r\n 'user-select': 'none'\r\n }\r\n const testStyle = {\r\n 'padding-right': '10px',\r\n 'display': '-webkit-box',\r\n '-webkit-box-orient': 'vertical',\r\n '-webkit-line-clamp': rp.lineClamp ?? 2,\r\n 'overflow': 'hidden',\r\n ...rp.textStyles\r\n }\r\n return h('div', {\r\n class: 'st_copy_wrapper',\r\n style: 'width: 100%; position: relative; display: inline-block;'\r\n },\r\n [\r\n h('span', {\r\n class: `st_copy_text ${rp.textClass ?? ''}`,\r\n style: testStyle,\r\n title: val\r\n }, val),\r\n val && h('span', {\r\n class: 'st_copy_btn',\r\n style: butStyle,\r\n title: rp.copyTitle || '复制',\r\n onClick: () => {\r\n if (!val) return\r\n try {\r\n if (navigator.clipboard && navigator.clipboard.writeText) {\r\n navigator.clipboard.writeText(val).then(() => {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n }).catch(() => {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n })\r\n } else {\r\n const textarea = document.createElement('textarea')\r\n textarea.value = val\r\n textarea.style.position = 'fixed'\r\n textarea.style.opacity = '0'\r\n document.body.appendChild(textarea)\r\n textarea.select()\r\n const successful = document.execCommand('copy')\r\n document.body.removeChild(textarea)\r\n\r\n if (successful) {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n } else {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n } catch (err) {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n }, [h(DocumentCopy, {\r\n style: 'width: 1em; height: 1em;'\r\n })])\r\n ].filter(Boolean)\r\n )\r\n})\r\n\r\n/**\r\n * img 渲染器\r\n */\r\nconst img = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col?.renderProps || {}\r\n\r\n const getImageList = () => {\r\n if (!val) return []\r\n if (Array.isArray(val)) {\r\n return val.filter(item => item && typeof item === 'string')\r\n }\r\n return [val]\r\n }\r\n\r\n const imageList = getImageList()\r\n\r\n if (imageList.length === 0) {\r\n return rp.placeholder || ''\r\n }\r\n\r\n const defaultStyle = {\r\n width: rp.width || '80px',\r\n height: rp.height || '80px',\r\n marginRight: imageList.length > 1 ? '4px' : '0',\r\n ...(rp.style || {})\r\n }\r\n\r\n if (imageList.length === 1) {\r\n return h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n })\r\n }\r\n\r\n return h('div',\r\n {\r\n class: 'st_img_wrapper',\r\n style: 'display: flex; align-items: center; position: relative'\r\n },\r\n [\r\n h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n }),\r\n imageList.length > 1 && h('span', {\r\n class: 'st_img_total',\r\n style: `position: absolute; top: 0; right: 0; `,\r\n title: `${imageList.length}`\r\n }, [h(CopyDocument, { style: `width: 1em; height: 1em; ` })])\r\n ]\r\n )\r\n})\r\n\r\n/**\r\n * dict 渲染器\r\n */\r\nconst dict = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n const options = rp.options ?? []\r\n const showValue = rp.showValue ?? false\r\n\r\n if (val === null || val === undefined || val === '') return ''\r\n\r\n const values = Array.isArray(val) ? val.map(String) : [String(val)]\r\n const matchedOptions = options.filter((opt: any) => values.includes(String(opt.value)))\r\n const unmatched = values.filter(v => !options.some((opt: any) => String(opt.value) === v))\r\n\r\n const children = matchedOptions.map((item: any, _index: number) => {\r\n return h(\r\n ElTag,\r\n { key: item.value, type: item.listClass, class: item.cssClass, disableTransitions: true },\r\n { default: () => item.label + ' ' }\r\n )\r\n })\r\n\r\n if (showValue && unmatched.length > 0) {\r\n children.push(h('span', {}, unmatched.join(' ')))\r\n }\r\n\r\n return h('div', {}, children)\r\n})\r\n\r\n/**\r\n * map 渲染器\r\n */\r\nconst map = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const options = (props.col.renderProps?.options ?? {}) as Record<string, any>\r\n return val != null ? options[val] ?? '' : ''\r\n})\r\n\r\n/**\r\n * formatter 渲染器\r\n */\r\nexport function isDataColumn(\r\n col: ColumnConfig\r\n): col is any {\r\n return typeof (col as any).formatter === 'function'\r\n}\r\n\r\nconst formatter = createFunctionalRenderer((props) => {\r\n const { col, row, index } = props\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n if (isDataColumn(col)) {\r\n // formatter 函数签名: (value, row, index) => string\r\n return col.formatter?.(val, row, index)\r\n }\r\n return val ?? ''\r\n})\r\n\r\n/**\r\n * icon 渲染器\r\n */\r\nconst icon = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n if (!val) return ''\r\n // 判断网络图片\r\n if (/^https?:\\/\\//.test(val)) {\r\n return h(ElImage, {\r\n src: val,\r\n previewSrcList: [val],\r\n previewTeleported: true, \r\n fit: 'contain',\r\n style: 'width:40px;height:40px',\r\n ...rp\r\n })\r\n }\r\n // 判断 svg 源码\r\n if (/^\\s*<svg[\\s\\S]*<\\/svg>\\s*$/.test(val)) {\r\n return h('div', {\r\n innerHTML: val,\r\n style: `width:40px;height:40px;display:inline-block;${rp.style || ''}`,\r\n ...rp\r\n })\r\n }\r\n // 默认当作 iconfont\r\n return h('i', {\r\n class: val,\r\n style: `font-size:20px;${rp.style || ''}`,\r\n ...rp\r\n })\r\n})\r\n\r\n/**\r\n * 所有内置渲染器\r\n */\r\nexport const builtInRenderers = {\r\n input,\r\n 'input-number': inputNumber,\r\n select,\r\n button,\r\n link,\r\n html,\r\n copy,\r\n img,\r\n dict,\r\n map,\r\n formatter,\r\n icon,\r\n}\r\n\r\n/**\r\n * 安装所有内置渲染器\r\n */\r\nexport function registerBuiltInRenderers(registry: { registerMultiple: (renderers: Record<string, any>) => void }) {\r\n registry.registerMultiple(builtInRenderers)\r\n}\r\n\r\n/**\r\n * 创建默认渲染器集合(兼容旧 API)\r\n * @deprecated 建议使用插件化架构\r\n */\r\nexport function createRenderer() {\r\n return builtInRenderers\r\n}\r\n","<template>\r\n <el-table ref=\"tableRef\"\r\n v-bind=\"$attrs\"\r\n :data=\"data\"\r\n :row-key=\"rowKey\"\r\n class=\"smart_table\"\r\n v-loading=\"loading\">\r\n\r\n <!-- ========== selection 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in selectionColumns\"\r\n key=\"selection\"\r\n type=\"selection\"\r\n v-bind=\"col.columnProps\"\r\n />\r\n\r\n <!-- ========== index 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in indexColumns\"\r\n key=\"index\"\r\n type=\"index\"\r\n :label=\"col.label || '#'\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps\"\r\n >\r\n <template #default=\"{ $index }\">\r\n {{ computeIndex($index) }}\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== operation 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in getOperationColumns()\"\r\n :key=\"col.key\"\r\n :label=\"col.label || '操作'\"\r\n align=\"center\"\r\n v-bind=\"{\r\n ...col.columnProps,\r\n width: getOperationWidth(col)\r\n }\"\r\n >\r\n <template #default=\"{ row }\">\r\n <el-button\r\n v-for=\"btn in getVisibleButtons(col, row)\"\r\n :key=\"btn.label\"\r\n :type=\"btn.type || 'primary'\"\r\n link\r\n @click=\"btn.action(row)\"\r\n >\r\n {{ btn.label }}\r\n </el-button>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== 普通数据列 ========== -->\r\n <el-table-column\r\n v-for=\"col in dataColumns\"\r\n :key=\"col.key\"\r\n :label=\"col.label\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps || {}\"\r\n >\r\n <template #default=\"scope\">\r\n <!-- 父组件插槽优先 -->\r\n <template v-if=\"col.render === 'slot'\">\r\n <slot :name=\"col?.slot || col.key\" v-bind=\"scope\" />\r\n </template>\r\n\r\n <!-- renderer -->\r\n <component\r\n v-else-if=\"col.render && renderer[col.render]\"\r\n :is=\"renderer[col.render]\"\r\n :row=\"scope.row\"\r\n :col=\"col\"\r\n :index=\"scope.$index\"\r\n :onCellChange=\"handleCellChange\"\r\n :onCellBlur=\"handleCellBlur\"\r\n :onCellEnter=\"handleCellEnter\"\r\n :onClick=\"handleCellClick\"\r\n />\r\n <!-- 默认文本 -->\r\n <span v-else\r\n :style=\"col.renderProps?.style || ''\"\r\n :class=\"col.renderProps?.class || ''\"\r\n :title=\"getValueByPath(scope.row, col.key)\">\r\n {{ getValueByPath(scope.row, col.key) }}\r\n </span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 动态插槽 -->\r\n <template v-for=\"col in dataColumns\" #[col.key]=\"slotProps\">\r\n <slot :name=\"col.key\" v-bind=\"slotProps\" />\r\n </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup lang=\"ts\" name=\"SmartTable\">\r\n import { PropType, ref, watch, computed } from 'vue'\r\n import type { BaseColumn, ColumnConfig } from './types'\r\n import { useTableColumns } from \"./hooks/useTableColumns\"\r\n import { useOperationColumn } from './hooks/useOperationColumn'\r\n import { getRendererManager } from './renderer'\r\n import { registerBuiltInRenderers } from './renderers'\r\n import { getValueByPath } from './utils/path'\r\n\r\n const props = defineProps({\r\n data: { type: Array, default: () => [] },\r\n columns: { type: Array, default: () => [] },\r\n rowKey: { type: String, default: 'id' },\r\n loading: { type: Boolean, default: false },\r\n permissions: {\r\n type: Array as PropType<string[]>,\r\n default: () => []\r\n },\r\n cacheKey: String,\r\n pagination: { type: Object, default: () => ({}) },\r\n })\r\n\r\n const emit = defineEmits([\r\n 'update:columns',\r\n 'cellChange',\r\n 'cellBlur',\r\n 'cellEnter',\r\n 'cell-click',\r\n ])\r\n\r\n // ------------------ columns 处理 ------------------\r\n const { columns: cachedColumns } = useTableColumns(props.columns, {\r\n cacheKey: props.cacheKey ?? '',\r\n })\r\n watch(\r\n cachedColumns,\r\n (val: ColumnConfig[]) => emit(\"update:columns\", val),\r\n { deep: true, immediate: true },\r\n )\r\n\r\n // ------------------ 将行数据传递给 operation 列 ------------------\r\n watch(\r\n () => props.data,\r\n (newData) => {\r\n if (!newData) return\r\n\r\n // 为 operation 列注入 __rows,用于计算宽度\r\n cachedColumns.value.forEach((col: ColumnConfig) => {\r\n if (col.type === 'operation') {\r\n col.__rows = newData\r\n }\r\n })\r\n },\r\n { deep: true, immediate: true }\r\n )\r\n\r\n // ------------------ 列分类 ------------------\r\n const selectionColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'selection')\r\n )\r\n\r\n const indexColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'index')\r\n )\r\n\r\n const operationColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'operation')\r\n )\r\n\r\n const dataColumns = computed(() =>\r\n cachedColumns.value.filter(col => {\r\n if (col.type === 'selection' || col.type === 'index') return false\r\n if (col.type === 'operation') return false\r\n if (col.visible === false) return false\r\n return true\r\n })\r\n )\r\n\r\n // ------------------ index 列序号计算 ------------------\r\n const computeIndex = (index: number) => {\r\n const page = props.pagination?.page\r\n const size = props.pagination?.size\r\n return page && size ? (page - 1) * size + index + 1 : index + 1\r\n }\r\n\r\n // ------------------ renderer 注册 ------------------\r\n registerBuiltInRenderers(getRendererManager())\r\n\r\n const renderer = computed(() => {\r\n const manager = getRendererManager()\r\n const allRenderers: Record<string, any> = {}\r\n\r\n manager.names().forEach((name: string) => {\r\n const r = manager.get(name)\r\n if (r) allRenderers[name] = r\r\n })\r\n\r\n return allRenderers\r\n })\r\n\r\n // ------------------ operation 列逻辑 ------------------\r\n // 为每个 operation 列创建 useOperationColumn 实例\r\n const operationColumnMap = computed(() => {\r\n const map = new Map<string, ReturnType<typeof useOperationColumn>>()\r\n\r\n operationColumns.value.forEach(col => {\r\n const hook = useOperationColumn(\r\n col.buttons || [],\r\n col.maxbtn ?? 10,\r\n props.permissions || []\r\n )\r\n map.set(col.key, hook)\r\n })\r\n\r\n return map\r\n })\r\n\r\n const getOperationColumnHook = (col: ColumnConfig) => {\r\n return operationColumnMap.value.get(col.key)\r\n }\r\n\r\n const getOperationWidth = (col: ColumnConfig) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return 0\r\n\r\n // 无行数据,用静态宽度\r\n if (!col.__rows) return hook.optWidth.value\r\n // 有行数据,取最大宽度\r\n return hook.getMaxOptWidth(col.__rows)\r\n }\r\n\r\n const getVisibleButtons = (col: ColumnConfig, row: any) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return []\r\n\r\n // 检查 operation 列是否应该显示\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return []\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) {\r\n // 无行数据,基于权限判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n // 有行数据,基于权限 + visible 判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n const getOperationColumns = () => {\r\n return operationColumns.value.filter(col => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return false\r\n\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return false\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) return hook.hasAnyButton.value\r\n\r\n return hook.hasAnyVisibleButton(col.__rows || [])\r\n })\r\n }\r\n\r\n // ----------------事件封装 ------------------\r\n const handleCellChange = (row: any, key: string) => {\r\n emit('cellChange', row, key)\r\n }\r\n const handleCellBlur = (row: any, key: string) => {\r\n emit('cellBlur', row, key)\r\n }\r\n const handleCellEnter = (row: any, key: string) => {\r\n emit('cellEnter', row, key)\r\n }\r\n const handleCellClick = (row: any, col: any) => {\r\n if(!col) return\r\n emit('cell-click', row, col)\r\n }\r\n\r\n // el-table\r\n const tableRef = ref();\r\n defineExpose({\r\n tableRef,\r\n });\r\n\r\n</script>\r\n\r\n<style>\r\n .smart_table {\r\n width: 100%;\r\n }\r\n \r\n .st_copy_wrapper:hover .st_copy_btn {\r\n display: inline-block !important;\r\n }\r\n\r\n .st_copy_btn:hover {\r\n transform: translateY(-50%) scale(1.1);\r\n }\r\n</style>\r\n","/**\r\n * 全局配置管理\r\n */\r\nimport type { SmartTableConfig } from './types'\r\nimport { getRendererManager } from './renderer'\r\n\r\n/**\r\n * 默认配置\r\n */\r\nconst defaultConfig: SmartTableConfig = {\r\n defaultPagination: {\r\n page: 1,\r\n size: 10,\r\n total: 0\r\n },\r\n defaultTableProps: {},\r\n defaultColumnProps: {}\r\n}\r\n\r\n/**\r\n * 全局配置类\r\n */\r\nclass ConfigManager {\r\n private config: SmartTableConfig = { ...defaultConfig }\r\n\r\n /**\r\n * 获取所有配置\r\n */\r\n getConfig(): SmartTableConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置配置\r\n */\r\n setConfig(config: Partial<SmartTableConfig>): void {\r\n this.config = this.mergeConfig(this.config, config)\r\n\r\n // 如果有自定义渲染器,自动注册\r\n if (config.renderers) {\r\n const manager = getRendererManager()\r\n manager.registerMultiple(config.renderers)\r\n }\r\n }\r\n\r\n /**\r\n * 获取特定配置项\r\n */\r\n get<K extends keyof SmartTableConfig>(key: K): SmartTableConfig[K] {\r\n return this.config[key]\r\n }\r\n\r\n /**\r\n * 重置为默认配置\r\n */\r\n reset(): void {\r\n this.config = { ...defaultConfig }\r\n }\r\n\r\n /**\r\n * 深度合并配置\r\n */\r\n private mergeConfig(target: any, source: any): any {\r\n const result = { ...target }\r\n\r\n for (const key in source) {\r\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\r\n result[key] = this.mergeConfig(target[key] || {}, source[key])\r\n } else {\r\n result[key] = source[key]\r\n }\r\n }\r\n\r\n return result\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置管理器单例\r\n */\r\nlet globalConfigManager: ConfigManager | null = null\r\n\r\n/**\r\n * 获取全局配置管理器\r\n */\r\nexport function getConfigManager(): ConfigManager {\r\n if (!globalConfigManager) {\r\n globalConfigManager = new ConfigManager()\r\n }\r\n return globalConfigManager\r\n}\r\n\r\n/**\r\n * 安装插件(用于 Vue.use())\r\n */\r\nexport interface SmartTablePlugin {\r\n install: (options?: SmartTableConfig) => void\r\n}\r\n\r\n/**\r\n * 创建插件实例\r\n */\r\nexport function createSmartTablePlugin(defaultOptions?: SmartTableConfig): SmartTablePlugin {\r\n return {\r\n install(options?: SmartTableConfig) {\r\n const manager = getConfigManager()\r\n const config = { ...defaultOptions, ...options }\r\n if (config) {\r\n manager.setConfig(config)\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置快捷方法\r\n */\r\nexport function setSmartTableConfig(config: Partial<SmartTableConfig>): void {\r\n getConfigManager().setConfig(config)\r\n}\r\n\r\nexport function getSmartTableConfig(): SmartTableConfig {\r\n return getConfigManager().getConfig()\r\n}\r\n","/**\r\n * 增强类型系统 - 提供更好的类型推断\r\n */\r\nimport type { ColumnConfig, RendererName } from '../components/SmartTable/types'\r\n\r\n/**\r\n * 提取行数据的类型\r\n */\r\nexport type ExtractRowType<T> = T extends ColumnConfig<infer R> ? R : never\r\n\r\n/**\r\n * 根据列配置提取表格数据类型\r\n */\r\nexport type TableDataFromColumns<T extends ColumnConfig[]> = T extends (infer C)[]\r\n ? C extends ColumnConfig<infer R>\r\n ? R\r\n : any\r\n : any\r\n\r\n/**\r\n * 渲染器 Props 类型推断\r\n */\r\nexport type InferRendererProps<T extends RendererName> =\r\n T extends 'html'\r\n ? { style?: string; class?: string; [key: string]: any }\r\n : T extends 'copy'\r\n ? { successText?: string; errorText?: string; iconColor?: string; [key: string]: any }\r\n : T extends 'img'\r\n ? { width?: string | number; height?: string | number; fit?: string; previewSrcList?: string[]; [key: string]: any }\r\n : T extends 'dict'\r\n ? { options: Array<{ label: string; value: string | number; listClass?: string; cssClass?: string }>; showValue?: boolean }\r\n : T extends 'map'\r\n ? { options: Record<string | number, any> }\r\n : T extends 'input'\r\n ? { placeholder?: string; size?: 'small' | 'default' | 'large'; clearable?: boolean }\r\n : T extends 'select'\r\n ? { options: Array<{ label: string; value: string | number }>; placeholder?: string; clearable?: boolean }\r\n : { [key: string]: any }\r\n\r\n/**\r\n * 快捷创建列的辅助函数(类型安全简化版)\r\n */\r\nexport function defineColumn(\r\n key: string,\r\n config?: Partial<Omit<ColumnConfig, 'key'>>\r\n): ColumnConfig {\r\n return {\r\n key,\r\n ...config\r\n } as ColumnConfig\r\n}\r\n"],"names":["mergeColumns","defaultColumns","cacheColumns","cacheMap","c","col","cacheCol","useTableColumns","options","cacheKey","storage","cache","columns","ref","watch","newVal","lightColumns","newColumns","useOperationColumn","buttonConfigs","maxbtn","userPermissions","all_permission","hasPermi","value","permArray","p","hasAnyButton","computed","btn","optWidth","sum","isButtonVisible","row","optRowWidth","rows","max","RendererManager","__publicField","name","renderer","renderers","globalRendererManager","getRendererManager","wrapSFCComponent","comp","defineComponent","props","h","createFunctionalRenderer","render","validateRendererProps","rendererName","renderProps","getValueByPath","obj","path","acc","key","setValueByPath","keys","lastKey","target","__props","v","onBlur","_a","onEnter","_openBlock","_createBlock","_component_el_input","_mergeProps","$event","_component_el_input_number","onChange","_component_el_select","_createElementBlock","_Fragment","opt","_component_el_option","input","EditableInput","inputNumber","EditableNumber","select","EditableSelect","button","rp","val","ElButton","link","html","copy","butStyle","testStyle","ElMessage","textarea","successful","DocumentCopy","img","imageList","item","defaultStyle","ElImage","CopyDocument","dict","showValue","values","matchedOptions","unmatched","children","_index","ElTag","map","isDataColumn","formatter","index","icon","builtInRenderers","registerBuiltInRenderers","registry","createRenderer","emit","__emit","cachedColumns","newData","selectionColumns","indexColumns","operationColumns","dataColumns","computeIndex","page","size","_b","manager","allRenderers","r","operationColumnMap","hook","getOperationColumnHook","getOperationWidth","getVisibleButtons","getOperationColumns","handleCellChange","handleCellBlur","handleCellEnter","handleCellClick","tableRef","__expose","_withDirectives","_component_el_table","$attrs","_renderList","_component_el_table_column","_withCtx","$index","_createTextVNode","_toDisplayString","_component_el_button","scope","_renderSlot","_ctx","_resolveDynamicComponent","_normalizeStyle","_normalizeClass","_unref","_hoisted_1","slotProps","defaultConfig","ConfigManager","config","source","result","globalConfigManager","getConfigManager","setSmartTableConfig","getSmartTableConfig","defineColumn"],"mappings":"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"}
1
+ {"version":3,"file":"vue3-smart-table.cjs.js","sources":["../src/components/SmartTable/hooks/useTableColumns.ts","../src/components/SmartTable/hooks/useOperationColumn.ts","../src/components/SmartTable/renderer.ts","../src/components/SmartTable/utils/path.ts","../src/components/SmartTable/renderers/input.vue","../src/components/SmartTable/renderers/inputNumber.vue","../src/components/SmartTable/renderers/select.vue","../src/components/SmartTable/renderers/index.ts","../src/components/SmartTable/index.vue","../src/components/SmartTable/config.ts","../src/types/enhanced.ts"],"sourcesContent":["import { ref, watch } from 'vue'\r\n\r\n\r\n/**\r\n * 合并默认列配置和缓存配置\r\n *\r\n * 设计原则:\r\n * 1️⃣ 列顺序:以 defaultColumns 为准\r\n * 2️⃣ 列增减:以 defaultColumns 为准\r\n * 3️⃣ 缓存只覆盖用户可配置字段(如 visible)\r\n */\r\nfunction mergeColumns(\r\n defaultColumns: any[],\r\n cacheColumns: Array<{ key: string; visible?: boolean }>\r\n) {\r\n if (!cacheColumns?.length) return defaultColumns\r\n\r\n // 建立 key => cache 映射表,提升查找效率\r\n const cacheMap = new Map(\r\n cacheColumns.map(c => [c.key, c])\r\n )\r\n\r\n return defaultColumns.map(col => {\r\n const cacheCol = cacheMap.get(col.key)\r\n\r\n // 只允许缓存覆盖「可配置字段」\r\n if (!cacheCol) return col\r\n\r\n return {\r\n ...col,\r\n visible:\r\n typeof cacheCol.visible === 'boolean'\r\n ? cacheCol.visible\r\n : col.visible\r\n }\r\n })\r\n}\r\n\r\n\r\n/**\r\n * useTableColumns\r\n *\r\n * 表格列管理 Hook\r\n *\r\n * 职责:\r\n * - 管理表格列顺序\r\n * - 管理列显示 / 隐藏\r\n * - 持久化用户配置\r\n */\r\nexport function useTableColumns(\r\n defaultColumns: any[],\r\n options?: {\r\n /** 缓存唯一标识 */\r\n cacheKey?: string\r\n /** 存储介质,默认 localStorage */\r\n storage?: Storage\r\n }\r\n) {\r\n\r\n /** 解构参数并设置默认值 */\r\n const { cacheKey, storage = localStorage } = options || {}\r\n\r\n /**\r\n * 如果没有 cacheKey,则不启用缓存\r\n * (例如公共页面、未登录页面)\r\n * 从缓存中读取列配置\r\n */\r\n const cache = cacheKey ? storage.getItem(cacheKey) : null\r\n\r\n /**\r\n * 响应式列配置\r\n * 初始化时合并默认列和缓存列\r\n */\r\n const columns = ref(\r\n mergeColumns(\r\n defaultColumns,\r\n cache ? JSON.parse(cache) : []\r\n )\r\n )\r\n\r\n /**\r\n * 监听列变化,自动写入缓存\r\n */\r\n watch(\r\n columns,\r\n (newVal: any) => {\r\n if (!cacheKey) return\r\n\r\n /**\r\n * ⚠️ 只保存“轻量配置”\r\n * 避免把 render / action / 函数序列化进 localStorage\r\n */\r\n const lightColumns = newVal.map((col: any) => ({\r\n key: col.key,\r\n visible: col.visible,\r\n columnOpts: col.columnOpts\r\n }))\r\n\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(lightColumns)\r\n )\r\n },\r\n { deep: true }\r\n )\r\n\r\n /**\r\n * 对外暴露的 API\r\n */\r\n return {\r\n /** 当前列配置(响应式) */\r\n columns,\r\n\r\n /**\r\n * 主动设置列配置\r\n * 常用于:列设置弹窗 / 拖拽排序完成\r\n */\r\n setColumns(newColumns: any[]) {\r\n columns.value = mergeColumns(\r\n defaultColumns,\r\n newColumns\r\n )\r\n\r\n if (cacheKey) {\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(newColumns)\r\n )\r\n }\r\n },\r\n\r\n /**\r\n * 重置为默认列配置\r\n */\r\n resetColumns() {\r\n columns.value = defaultColumns\r\n\r\n if (cacheKey) {\r\n storage.removeItem(cacheKey)\r\n }\r\n }\r\n }\r\n}\r\n","import { computed } from 'vue'\r\n\r\nimport { ButtonConfig } from \"../types\"\r\n\r\n/**\r\n * useOperationColumn\r\n *\r\n * 操作列专用逻辑 Hook,负责:\r\n * 1. 根据权限判断操作列是否需要显示\r\n * 2. 计算操作列宽度(支持按钮自定义宽度)\r\n * 3. 支持行级 visible 配置\r\n * @param buttonConfigs 操作列按钮配置\r\n * @param maxbtn 操作列最多显示按钮数量(超过的不参与宽度计算)\r\n * @param userPermissions 当前用户权限列表\r\n */\r\nexport function useOperationColumn(\r\n buttonConfigs: ButtonConfig[],\r\n maxbtn = 10,\r\n userPermissions: string[] = []\r\n) {\r\n /** 默认按钮宽度 */\r\n const defaultWidth = 55\r\n\r\n /** 超级权限标识 */\r\n const all_permission = '*:*:*'\r\n\r\n /** --------------------------\r\n * 权限判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断是否具备按钮权限\r\n *\r\n * 规则:\r\n * - permission 未配置 ⇒ 永远有权限\r\n * - permission 为 string | string[] ⇒ 与用户权限匹配\r\n */\r\n const hasPermi = (value?: string | string[]) => {\r\n if (!value) return true\r\n\r\n const permArray = Array.isArray(value) ? value : [value]\r\n return userPermissions.some(\r\n p => p === all_permission || permArray.includes(p)\r\n )\r\n }\r\n\r\n /** --------------------------\r\n * 仅基于权限(不考虑行级 visible)\r\n * 适用于:表格未加载数据时的判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 是否至少存在一个有权限的按钮\r\n * 用于判断操作列是否需要渲染\r\n */\r\n const hasAnyButton = computed(() => {\r\n return buttonConfigs.some(btn => hasPermi(btn.permission))\r\n })\r\n\r\n /**\r\n * 操作列宽度(仅基于权限)\r\n * 用于无行数据时的兜底宽度计算\r\n *\r\n * 注意:这里不考虑 visible,因为没有 row 数据无法执行 visible 函数\r\n * 实际使用时会根据行数据重新计算\r\n */\r\n const optWidth = computed(() => {\r\n const permittedBtns = buttonConfigs\r\n .filter(btn => hasPermi(btn.permission))\r\n .slice(0, maxbtn)\r\n\r\n return permittedBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n })\r\n\r\n /** --------------------------\r\n * 权限 + 行级 visible\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断某个按钮在某一行是否可见\r\n */\r\n const isButtonVisible = (btn: ButtonConfig, row: any) => {\r\n return (\r\n hasPermi(btn.permission) &&\r\n (btn.visible ? btn.visible(row) : true)\r\n )\r\n }\r\n\r\n /**\r\n * 单行操作列宽度\r\n */\r\n const optRowWidth = (row: any) => {\r\n const visibleBtns = buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n\r\n return visibleBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 遍历所有行,获取最大操作列宽度\r\n */\r\n const getMaxOptWidth = (rows: any[]) => {\r\n if (!rows?.length) return optWidth.value\r\n return rows.reduce(\r\n (max, row) => Math.max(max, optRowWidth(row)),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 判断是否至少有一行存在可见按钮\r\n */\r\n const hasAnyVisibleButton = (rows: any[]) => {\r\n if (!rows?.length) return false\r\n return rows.some(row =>\r\n buttonConfigs.some(btn => isButtonVisible(btn, row))\r\n )\r\n }\r\n\r\n const getVisibleButtons = (row: any) => {\r\n return buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n }\r\n\r\n return {\r\n hasAnyButton,\r\n optWidth,\r\n hasAnyVisibleButton,\r\n getMaxOptWidth,\r\n getVisibleButtons\r\n }\r\n}\r\n","/**\r\n * SmartTable 内部渲染器管理系统\r\n * 移动到组件内部,保证组件的自包含性\r\n */\r\nimport { defineComponent, h, Component } from 'vue'\r\nimport type { Renderer } from './types'\r\n\r\n/**\r\n * 渲染器注册表接口\r\n */\r\nexport interface RendererRegistry {\r\n register(name: string, renderer: Renderer): void\r\n registerMultiple(renderers: Record<string, Renderer>): void\r\n get(name: string): Renderer | undefined\r\n has(name: string): boolean\r\n unregister(name: string): boolean\r\n clear(): void\r\n names(): string[]\r\n}\r\n\r\n/**\r\n * 渲染器管理器类\r\n */\r\nclass RendererManager implements RendererRegistry {\r\n private renderers: Map<string, Renderer> = new Map()\r\n\r\n register(name: string, renderer: Renderer): void {\r\n if (this.renderers.has(name)) {\r\n // 批量注册时不警告,只在单独注册时警告\r\n if (process.env.NODE_ENV === 'development') {\r\n console.debug(`[SmartTable] Renderer \"${name}\" already registered, skipping.`)\r\n }\r\n }\r\n this.renderers.set(name, renderer)\r\n }\r\n\r\n registerMultiple(renderers: Record<string, Renderer>): void {\r\n Object.entries(renderers).forEach(([name, renderer]) => {\r\n if (!this.renderers.has(name)) {\r\n this.renderers.set(name, renderer)\r\n }\r\n })\r\n }\r\n\r\n get(name: string): Renderer | undefined {\r\n return this.renderers.get(name)\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.renderers.has(name)\r\n }\r\n\r\n unregister(name: string): boolean {\r\n return this.renderers.delete(name)\r\n }\r\n\r\n clear(): void {\r\n this.renderers.clear()\r\n }\r\n\r\n names(): string[] {\r\n return Array.from(this.renderers.keys())\r\n }\r\n}\r\n\r\n/**\r\n * 全局渲染器管理器单例\r\n */\r\nlet globalRendererManager: RendererManager | null = null\r\n\r\n/**\r\n * 获取渲染器管理器\r\n */\r\nexport function getRendererManager(): RendererManager {\r\n if (!globalRendererManager) {\r\n globalRendererManager = new RendererManager()\r\n }\r\n return globalRendererManager\r\n}\r\n\r\n/**\r\n * 包装 SFC 组件为渲染器\r\n */\r\nexport function wrapSFCComponent(comp: Component): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'index', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => h(comp, props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 创建函数式渲染器\r\n */\r\nexport function createFunctionalRenderer(\r\n render: (props: {\r\n row: any\r\n col: any\r\n index: number\r\n onCellChange?: (row: any, col: any) => void\r\n onCellBlur?: (row: any, col: any) => void\r\n onCellEnter?: (row: any, col: any) => void\r\n onClick?: (row: any, col: any) => void\r\n }) => any\r\n): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'index', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => render(props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 验证渲染器配置\r\n * 在开发环境下验证 renderProps 的正确性\r\n */\r\nexport function validateRendererProps(\r\n rendererName: string,\r\n renderProps: Record<string, any> | undefined\r\n): void {\r\n if (process.env.NODE_ENV !== 'production' && renderProps) {\r\n switch (rendererName) {\r\n case 'dict':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'dict' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'select':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'select' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n } else if (renderProps.options.length === 0) {\r\n console.warn(`[SmartTable] 'select' renderer 'options' array is empty`)\r\n }\r\n break\r\n\r\n case 'map':\r\n if (!renderProps.options || typeof renderProps.options !== 'object') {\r\n console.warn(\r\n `[SmartTable] 'map' renderer requires 'options' object, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'link':\r\n if (!renderProps.href || typeof renderProps.href !== 'string') {\r\n console.warn(\r\n `[SmartTable] 'link' renderer requires 'href' string, received:`,\r\n renderProps.href\r\n )\r\n }\r\n break\r\n\r\n case 'input-number':\r\n if (renderProps.min !== undefined && renderProps.max !== undefined) {\r\n if (renderProps.min > renderProps.max) {\r\n console.warn(\r\n `[SmartTable] 'input-number' renderer: min (${renderProps.min}) should not be greater than max (${renderProps.max})`\r\n )\r\n }\r\n }\r\n break\r\n }\r\n }\r\n}\r\n","/**\r\n * 安全获取对象深层属性\r\n * 支持 a.b.c / a.0.b\r\n */\r\nexport function getValueByPath(obj: any, path?: string) {\r\n if (!obj || !path) return undefined\r\n return path.split('.').reduce((acc, key) => acc?.[key], obj)\r\n }\r\n \r\n /**\r\n * 安全设置对象深层属性(用于可编辑表格)\r\n */\r\n export function setValueByPath(\r\n obj: any,\r\n path: string,\r\n value: any\r\n ) {\r\n if (!obj || !path) return\r\n const keys = path.split('.')\r\n const lastKey = keys.pop()!\r\n \r\n const target = keys.reduce((acc, key) => {\r\n if (!acc[key]) acc[key] = {}\r\n return acc[key]\r\n }, obj)\r\n \r\n target[lastKey] = value\r\n }\r\n ","<template>\n <el-input\n v-model=\"value\"\n v-bind=\"{ placeholder: '', size: 'small', clearable: true, ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n props.onCellChange?.(props.row, props.col)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-input-number\n v-model=\"value\"\n v-bind=\"{ min: 0, max: 99999, controls: false, size: 'small', ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n props.onCellChange?.(props.row, props.col)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-select\n v-model=\"value\"\n v-bind=\"{ placeholder: '请选择', size: 'small', clearable: true, ...col.renderProps }\"\n @change=\"onChange\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n >\n <el-option\n v-for=\"opt in col.renderProps?.options || []\"\n :key=\"opt.value\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onChange = () => props.onCellChange?.(props.row, props.col)\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","/**\r\n * 内置渲染器集合\r\n * 可以按需引入或批量注册\r\n */\r\nimport { h } from 'vue'\r\nimport { ElButton, ElTag, ElImage, ElMessage } from 'element-plus'\r\nimport { DocumentCopy, CopyDocument } from '@element-plus/icons-vue'\r\nimport type { ColumnConfig } from '../types'\r\nimport { getValueByPath } from '../utils/path'\r\nimport { wrapSFCComponent, createFunctionalRenderer } from '../renderer'\r\nimport EditableInput from './input.vue'\r\nimport EditableNumber from './inputNumber.vue'\r\nimport EditableSelect from './select.vue'\r\n\r\n/**\r\n * 包装 SFC 组件\r\n */\r\nconst input = wrapSFCComponent(EditableInput)\r\nconst inputNumber = wrapSFCComponent(EditableNumber)\r\nconst select = wrapSFCComponent(EditableSelect)\r\n\r\n/**\r\n * button 渲染器\r\n */\r\nconst button = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h(ElButton as any, {\r\n type: rp.type || 'primary',\r\n ...rp,\r\n onClick: () => props.onClick?.(props.row, props.col)\r\n }, () => rp.label || val)\r\n})\r\n\r\n/**\r\n * link 渲染器\r\n */\r\nconst link = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('a', {\r\n href: rp.href || '#',\r\n target: rp.blank ? '_blank' : '_self',\r\n style: rp.style || 'color:#409EFF;cursor:pointer;',\r\n }, rp.label || val)\r\n})\r\n\r\n/**\r\n * html 渲染器\r\n */\r\nconst html = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('div', {\r\n class: 'line-clamp-2',\r\n innerHTML: val ?? '',\r\n ...(props.col?.renderProps || {})\r\n })\r\n})\r\n\r\n/**\r\n * copy 渲染器\r\n */\r\nconst copy = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps ?? {}\r\n const butStyle = {\r\n 'position': 'absolute',\r\n 'right': '-5px',\r\n 'top': '50%',\r\n 'transform': 'translateY(-50%)',\r\n 'cursor': 'pointer',\r\n 'display': 'none',\r\n 'font-size': '12px',\r\n 'color': rp.iconColor || '#409EFF',\r\n 'user-select': 'none'\r\n }\r\n const testStyle = {\r\n 'padding-right': '10px',\r\n 'display': '-webkit-box',\r\n '-webkit-box-orient': 'vertical',\r\n '-webkit-line-clamp': rp.lineClamp ?? 2,\r\n 'overflow': 'hidden',\r\n ...rp.textStyles\r\n }\r\n return h('div', {\r\n class: 'st_copy_wrapper',\r\n style: 'width: 100%; position: relative; display: inline-block;'\r\n },\r\n [\r\n h('span', {\r\n class: `st_copy_text ${rp.textClass ?? ''}`,\r\n style: testStyle,\r\n title: val\r\n }, val),\r\n val && h('span', {\r\n class: 'st_copy_btn',\r\n style: butStyle,\r\n title: rp.copyTitle || '复制',\r\n onClick: () => {\r\n if (!val) return\r\n try {\r\n if (navigator.clipboard && navigator.clipboard.writeText) {\r\n navigator.clipboard.writeText(val).then(() => {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n }).catch(() => {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n })\r\n } else {\r\n const textarea = document.createElement('textarea')\r\n textarea.value = val\r\n textarea.style.position = 'fixed'\r\n textarea.style.opacity = '0'\r\n document.body.appendChild(textarea)\r\n textarea.select()\r\n const successful = document.execCommand('copy')\r\n document.body.removeChild(textarea)\r\n\r\n if (successful) {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n } else {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n } catch (err) {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n }, [h(DocumentCopy, {\r\n style: 'width: 1em; height: 1em;'\r\n })])\r\n ].filter(Boolean)\r\n )\r\n})\r\n\r\n/**\r\n * img 渲染器\r\n */\r\nconst img = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col?.renderProps || {}\r\n\r\n const getImageList = () => {\r\n if (!val) return []\r\n if (Array.isArray(val)) {\r\n return val.filter(item => item && typeof item === 'string')\r\n }\r\n return [val]\r\n }\r\n\r\n const imageList = getImageList()\r\n\r\n if (imageList.length === 0) {\r\n return rp.placeholder || ''\r\n }\r\n\r\n const defaultStyle = {\r\n width: rp.width || '80px',\r\n height: rp.height || '80px',\r\n marginRight: imageList.length > 1 ? '4px' : '0',\r\n ...(rp.style || {})\r\n }\r\n\r\n if (imageList.length === 1) {\r\n return h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n })\r\n }\r\n\r\n return h('div',\r\n {\r\n class: 'st_img_wrapper',\r\n style: 'display: flex; align-items: center; position: relative'\r\n },\r\n [\r\n h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n }),\r\n imageList.length > 1 && h('span', {\r\n class: 'st_img_total',\r\n style: `position: absolute; top: 0; right: 0; `,\r\n title: `${imageList.length}`\r\n }, [h(CopyDocument, { style: `width: 1em; height: 1em; ` })])\r\n ]\r\n )\r\n})\r\n\r\n/**\r\n * dict 渲染器\r\n */\r\nconst dict = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n const options = rp.options ?? []\r\n const showValue = rp.showValue ?? false\r\n\r\n if (val === null || val === undefined || val === '') return ''\r\n\r\n const values = Array.isArray(val) ? val.map(String) : [String(val)]\r\n const matchedOptions = options.filter((opt: any) => values.includes(String(opt.value)))\r\n const unmatched = values.filter(v => !options.some((opt: any) => String(opt.value) === v))\r\n\r\n const children = matchedOptions.map((item: any, _index: number) => {\r\n return h(\r\n ElTag,\r\n { key: item.value, type: item.listClass, class: item.cssClass, disableTransitions: true },\r\n { default: () => item.label + ' ' }\r\n )\r\n })\r\n\r\n if (showValue && unmatched.length > 0) {\r\n children.push(h('span', {}, unmatched.join(' ')))\r\n }\r\n\r\n return h('div', {}, children)\r\n})\r\n\r\n/**\r\n * map 渲染器\r\n */\r\nconst map = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const options = (props.col.renderProps?.options ?? {}) as Record<string, any>\r\n return val != null ? options[val] ?? '' : ''\r\n})\r\n\r\n/**\r\n * formatter 渲染器\r\n */\r\nexport function isDataColumn(\r\n col: ColumnConfig\r\n): col is any {\r\n return typeof (col as any).formatter === 'function'\r\n}\r\n\r\nconst formatter = createFunctionalRenderer((props) => {\r\n const { col, row, index } = props\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n if (isDataColumn(col)) {\r\n // formatter 函数签名: (value, row, index) => string\r\n return col.formatter?.(val, row, index)\r\n }\r\n return val ?? ''\r\n})\r\n\r\n/**\r\n * icon 渲染器\r\n */\r\nconst icon = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n if (!val) return ''\r\n // 判断网络图片\r\n if (/^https?:\\/\\//.test(val)) {\r\n return h(ElImage, {\r\n src: val,\r\n previewSrcList: [val],\r\n previewTeleported: true, \r\n fit: 'contain',\r\n style: 'width:40px;height:40px',\r\n ...rp\r\n })\r\n }\r\n // 判断 svg 源码\r\n if (/^\\s*<svg[\\s\\S]*<\\/svg>\\s*$/.test(val)) {\r\n return h('div', {\r\n innerHTML: val,\r\n style: `width:40px;height:40px;display:inline-block;${rp.style || ''}`,\r\n ...rp\r\n })\r\n }\r\n // 默认当作 iconfont\r\n return h('i', {\r\n class: val,\r\n style: `font-size:20px;${rp.style || ''}`,\r\n ...rp\r\n })\r\n})\r\n\r\n/**\r\n * 所有内置渲染器\r\n */\r\nexport const builtInRenderers = {\r\n input,\r\n 'input-number': inputNumber,\r\n select,\r\n button,\r\n link,\r\n html,\r\n copy,\r\n img,\r\n dict,\r\n map,\r\n formatter,\r\n icon,\r\n}\r\n\r\n/**\r\n * 安装所有内置渲染器\r\n */\r\nexport function registerBuiltInRenderers(registry: { registerMultiple: (renderers: Record<string, any>) => void }) {\r\n registry.registerMultiple(builtInRenderers)\r\n}\r\n\r\n/**\r\n * 创建默认渲染器集合(兼容旧 API)\r\n * @deprecated 建议使用插件化架构\r\n */\r\nexport function createRenderer() {\r\n return builtInRenderers\r\n}\r\n","<template>\r\n <el-table ref=\"tableRef\"\r\n v-bind=\"$attrs\"\r\n :data=\"data\"\r\n :row-key=\"rowKey\"\r\n class=\"smart_table\"\r\n v-loading=\"loading\">\r\n\r\n <!-- ========== selection 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in selectionColumns\"\r\n key=\"selection\"\r\n type=\"selection\"\r\n v-bind=\"col.columnProps\"\r\n />\r\n\r\n <!-- ========== index 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in indexColumns\"\r\n key=\"index\"\r\n type=\"index\"\r\n :label=\"col.label || '#'\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps\"\r\n >\r\n <template #default=\"{ $index }\">\r\n {{ computeIndex($index) }}\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== operation 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in getOperationColumns()\"\r\n :key=\"col.key\"\r\n :label=\"col.label || '操作'\"\r\n align=\"center\"\r\n v-bind=\"{\r\n ...col.columnProps,\r\n width: getOperationWidth(col)\r\n }\"\r\n >\r\n <template #default=\"{ row }\">\r\n <el-button\r\n v-for=\"btn in getVisibleButtons(col, row)\"\r\n :key=\"btn.label\"\r\n :type=\"btn.type || 'primary'\"\r\n link\r\n @click=\"btn.action(row)\"\r\n >\r\n {{ btn.label }}\r\n </el-button>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== 普通数据列 ========== -->\r\n <el-table-column\r\n v-for=\"col in dataColumns\"\r\n :key=\"col.key\"\r\n :label=\"col.label\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps || {}\"\r\n >\r\n <template #default=\"scope\">\r\n <!-- 父组件插槽优先 -->\r\n <template v-if=\"col.render === 'slot'\">\r\n <slot :name=\"col?.slot || col.key\" v-bind=\"scope\" />\r\n </template>\r\n\r\n <!-- renderer -->\r\n <component\r\n v-else-if=\"col.render && renderer[col.render]\"\r\n :is=\"renderer[col.render]\"\r\n :row=\"scope.row\"\r\n :col=\"col\"\r\n :index=\"scope.$index\"\r\n :onCellChange=\"handleCellChange\"\r\n :onCellBlur=\"handleCellBlur\"\r\n :onCellEnter=\"handleCellEnter\"\r\n :onClick=\"handleCellClick\"\r\n />\r\n <!-- 默认文本 -->\r\n <span v-else\r\n :style=\"col.renderProps?.style || ''\"\r\n :class=\"col.renderProps?.class || ''\"\r\n :title=\"getValueByPath(scope.row, col.key)\">\r\n {{ getValueByPath(scope.row, col.key) }}\r\n </span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 动态插槽 -->\r\n <template v-for=\"col in dataColumns\" #[col.key]=\"slotProps\">\r\n <slot :name=\"col.key\" v-bind=\"slotProps\" />\r\n </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup lang=\"ts\" name=\"SmartTable\">\r\n import { PropType, ref, watch, computed } from 'vue'\r\n import type { BaseColumn, ColumnConfig } from './types'\r\n import { useTableColumns } from \"./hooks/useTableColumns\"\r\n import { useOperationColumn } from './hooks/useOperationColumn'\r\n import { getRendererManager } from './renderer'\r\n import { registerBuiltInRenderers } from './renderers'\r\n import { getValueByPath } from './utils/path'\r\n\r\n const props = defineProps({\r\n data: { type: Array, default: () => [] },\r\n columns: { type: Array, default: () => [] },\r\n rowKey: { type: String, default: 'id' },\r\n loading: { type: Boolean, default: false },\r\n permissions: {\r\n type: Array as PropType<string[]>,\r\n default: () => []\r\n },\r\n cacheKey: String,\r\n pagination: { type: Object, default: () => ({}) },\r\n })\r\n\r\n const emit = defineEmits([\r\n 'update:columns',\r\n 'cellChange',\r\n 'cellBlur',\r\n 'cellEnter',\r\n 'cellClick',\r\n ])\r\n\r\n // ------------------ columns 处理 ------------------\r\n const { columns: cachedColumns } = useTableColumns(props.columns, {\r\n cacheKey: props.cacheKey ?? '',\r\n })\r\n watch(\r\n cachedColumns,\r\n (val: ColumnConfig[]) => emit(\"update:columns\", val),\r\n { deep: true, immediate: true },\r\n )\r\n\r\n // ------------------ 将行数据传递给 operation 列 ------------------\r\n watch(\r\n () => props.data,\r\n (newData) => {\r\n if (!newData) return\r\n\r\n // 为 operation 列注入 __rows,用于计算宽度\r\n cachedColumns.value.forEach((col: ColumnConfig) => {\r\n if (col.type === 'operation') {\r\n col.__rows = newData\r\n }\r\n })\r\n },\r\n { deep: true, immediate: true }\r\n )\r\n\r\n // ------------------ 列分类 ------------------\r\n const selectionColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'selection')\r\n )\r\n\r\n const indexColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'index')\r\n )\r\n\r\n const operationColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'operation')\r\n )\r\n\r\n const dataColumns = computed(() =>\r\n cachedColumns.value.filter(col => {\r\n if (col.type === 'selection' || col.type === 'index') return false\r\n if (col.type === 'operation') return false\r\n if (col.visible === false) return false\r\n return true\r\n })\r\n )\r\n\r\n // ------------------ index 列序号计算 ------------------\r\n const computeIndex = (index: number) => {\r\n const page = props.pagination?.page\r\n const size = props.pagination?.size\r\n return page && size ? (page - 1) * size + index + 1 : index + 1\r\n }\r\n\r\n // ------------------ renderer 注册 ------------------\r\n registerBuiltInRenderers(getRendererManager())\r\n\r\n const renderer = computed(() => {\r\n const manager = getRendererManager()\r\n const allRenderers: Record<string, any> = {}\r\n\r\n manager.names().forEach((name: string) => {\r\n const r = manager.get(name)\r\n if (r) allRenderers[name] = r\r\n })\r\n\r\n return allRenderers\r\n })\r\n\r\n // ------------------ operation 列逻辑 ------------------\r\n // 为每个 operation 列创建 useOperationColumn 实例\r\n const operationColumnMap = computed(() => {\r\n const map = new Map<string, ReturnType<typeof useOperationColumn>>()\r\n\r\n operationColumns.value.forEach(col => {\r\n const hook = useOperationColumn(\r\n col.buttons || [],\r\n col.maxbtn ?? 10,\r\n props.permissions || []\r\n )\r\n map.set(col.key, hook)\r\n })\r\n\r\n return map\r\n })\r\n\r\n const getOperationColumnHook = (col: ColumnConfig) => {\r\n return operationColumnMap.value.get(col.key)\r\n }\r\n\r\n const getOperationWidth = (col: ColumnConfig) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return 0\r\n\r\n // 无行数据,用静态宽度\r\n if (!col.__rows) return hook.optWidth.value\r\n // 有行数据,取最大宽度\r\n return hook.getMaxOptWidth(col.__rows)\r\n }\r\n\r\n const getVisibleButtons = (col: ColumnConfig, row: any) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return []\r\n\r\n // 检查 operation 列是否应该显示\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return []\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) {\r\n // 无行数据,基于权限判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n // 有行数据,基于权限 + visible 判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n const getOperationColumns = () => {\r\n return operationColumns.value.filter(col => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return false\r\n\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return false\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) return hook.hasAnyButton.value\r\n\r\n return hook.hasAnyVisibleButton(col.__rows || [])\r\n })\r\n }\r\n\r\n // ----------------事件封装 ------------------\r\n const handleCellChange = (row: any, key: string) => {\r\n emit('cellChange', row, key)\r\n }\r\n const handleCellBlur = (row: any, key: string) => {\r\n emit('cellBlur', row, key)\r\n }\r\n const handleCellEnter = (row: any, key: string) => {\r\n emit('cellEnter', row, key)\r\n }\r\n const handleCellClick = (row: any, col: any) => {\r\n if(!col) return\r\n emit('cellClick', row, col)\r\n }\r\n\r\n // el-table\r\n const tableRef = ref();\r\n defineExpose({\r\n tableRef,\r\n });\r\n\r\n</script>\r\n\r\n<style>\r\n .smart_table {\r\n width: 100%;\r\n }\r\n \r\n .st_copy_wrapper:hover .st_copy_btn {\r\n display: inline-block !important;\r\n }\r\n\r\n .st_copy_btn:hover {\r\n transform: translateY(-50%) scale(1.1);\r\n }\r\n</style>\r\n","/**\r\n * 全局配置管理\r\n */\r\nimport type { SmartTableConfig } from './types'\r\nimport { getRendererManager } from './renderer'\r\n\r\n/**\r\n * 默认配置\r\n */\r\nconst defaultConfig: SmartTableConfig = {\r\n defaultPagination: {\r\n page: 1,\r\n size: 10,\r\n total: 0\r\n },\r\n defaultTableProps: {},\r\n defaultColumnProps: {}\r\n}\r\n\r\n/**\r\n * 全局配置类\r\n */\r\nclass ConfigManager {\r\n private config: SmartTableConfig = { ...defaultConfig }\r\n\r\n /**\r\n * 获取所有配置\r\n */\r\n getConfig(): SmartTableConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置配置\r\n */\r\n setConfig(config: Partial<SmartTableConfig>): void {\r\n this.config = this.mergeConfig(this.config, config)\r\n\r\n // 如果有自定义渲染器,自动注册\r\n if (config.renderers) {\r\n const manager = getRendererManager()\r\n manager.registerMultiple(config.renderers)\r\n }\r\n }\r\n\r\n /**\r\n * 获取特定配置项\r\n */\r\n get<K extends keyof SmartTableConfig>(key: K): SmartTableConfig[K] {\r\n return this.config[key]\r\n }\r\n\r\n /**\r\n * 重置为默认配置\r\n */\r\n reset(): void {\r\n this.config = { ...defaultConfig }\r\n }\r\n\r\n /**\r\n * 深度合并配置\r\n */\r\n private mergeConfig(target: any, source: any): any {\r\n const result = { ...target }\r\n\r\n for (const key in source) {\r\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\r\n result[key] = this.mergeConfig(target[key] || {}, source[key])\r\n } else {\r\n result[key] = source[key]\r\n }\r\n }\r\n\r\n return result\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置管理器单例\r\n */\r\nlet globalConfigManager: ConfigManager | null = null\r\n\r\n/**\r\n * 获取全局配置管理器\r\n */\r\nexport function getConfigManager(): ConfigManager {\r\n if (!globalConfigManager) {\r\n globalConfigManager = new ConfigManager()\r\n }\r\n return globalConfigManager\r\n}\r\n\r\n/**\r\n * 安装插件(用于 Vue.use())\r\n */\r\nexport interface SmartTablePlugin {\r\n install: (options?: SmartTableConfig) => void\r\n}\r\n\r\n/**\r\n * 创建插件实例\r\n */\r\nexport function createSmartTablePlugin(defaultOptions?: SmartTableConfig): SmartTablePlugin {\r\n return {\r\n install(options?: SmartTableConfig) {\r\n const manager = getConfigManager()\r\n const config = { ...defaultOptions, ...options }\r\n if (config) {\r\n manager.setConfig(config)\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置快捷方法\r\n */\r\nexport function setSmartTableConfig(config: Partial<SmartTableConfig>): void {\r\n getConfigManager().setConfig(config)\r\n}\r\n\r\nexport function getSmartTableConfig(): SmartTableConfig {\r\n return getConfigManager().getConfig()\r\n}\r\n","/**\r\n * 增强类型系统 - 提供更好的类型推断\r\n */\r\nimport type { ColumnConfig, RendererName } from '../components/SmartTable/types'\r\n\r\n/**\r\n * 提取行数据的类型\r\n */\r\nexport type ExtractRowType<T> = T extends ColumnConfig<infer R> ? R : never\r\n\r\n/**\r\n * 根据列配置提取表格数据类型\r\n */\r\nexport type TableDataFromColumns<T extends ColumnConfig[]> = T extends (infer C)[]\r\n ? C extends ColumnConfig<infer R>\r\n ? R\r\n : any\r\n : any\r\n\r\n/**\r\n * 渲染器 Props 类型推断\r\n */\r\nexport type InferRendererProps<T extends RendererName> =\r\n T extends 'html'\r\n ? { style?: string; class?: string; [key: string]: any }\r\n : T extends 'copy'\r\n ? { successText?: string; errorText?: string; iconColor?: string; [key: string]: any }\r\n : T extends 'img'\r\n ? { width?: string | number; height?: string | number; fit?: string; previewSrcList?: string[]; [key: string]: any }\r\n : T extends 'dict'\r\n ? { options: Array<{ label: string; value: string | number; listClass?: string; cssClass?: string }>; showValue?: boolean }\r\n : T extends 'map'\r\n ? { options: Record<string | number, any> }\r\n : T extends 'input'\r\n ? { placeholder?: string; size?: 'small' | 'default' | 'large'; clearable?: boolean }\r\n : T extends 'select'\r\n ? { options: Array<{ label: string; value: string | number }>; placeholder?: string; clearable?: boolean }\r\n : { [key: string]: any }\r\n\r\n/**\r\n * 快捷创建列的辅助函数(类型安全简化版)\r\n */\r\nexport function defineColumn(\r\n key: string,\r\n config?: Partial<Omit<ColumnConfig, 'key'>>\r\n): ColumnConfig {\r\n return {\r\n key,\r\n ...config\r\n } as ColumnConfig\r\n}\r\n"],"names":["mergeColumns","defaultColumns","cacheColumns","cacheMap","c","col","cacheCol","useTableColumns","options","cacheKey","storage","cache","columns","ref","watch","newVal","lightColumns","newColumns","useOperationColumn","buttonConfigs","maxbtn","userPermissions","all_permission","hasPermi","value","permArray","p","hasAnyButton","computed","btn","optWidth","sum","isButtonVisible","row","optRowWidth","rows","max","RendererManager","__publicField","name","renderer","renderers","globalRendererManager","getRendererManager","wrapSFCComponent","comp","defineComponent","props","h","createFunctionalRenderer","render","validateRendererProps","rendererName","renderProps","getValueByPath","obj","path","acc","key","setValueByPath","keys","lastKey","target","__props","v","_a","onBlur","onEnter","_openBlock","_createBlock","_component_el_input","_mergeProps","$event","_component_el_input_number","onChange","_component_el_select","_createElementBlock","_Fragment","opt","_component_el_option","input","EditableInput","inputNumber","EditableNumber","select","EditableSelect","button","rp","val","ElButton","link","html","copy","butStyle","testStyle","ElMessage","textarea","successful","DocumentCopy","img","imageList","item","defaultStyle","ElImage","CopyDocument","dict","showValue","values","matchedOptions","unmatched","children","_index","ElTag","map","isDataColumn","formatter","index","icon","builtInRenderers","registerBuiltInRenderers","registry","createRenderer","emit","__emit","cachedColumns","newData","selectionColumns","indexColumns","operationColumns","dataColumns","computeIndex","page","size","_b","manager","allRenderers","r","operationColumnMap","hook","getOperationColumnHook","getOperationWidth","getVisibleButtons","getOperationColumns","handleCellChange","handleCellBlur","handleCellEnter","handleCellClick","tableRef","__expose","_withDirectives","_component_el_table","$attrs","_renderList","_component_el_table_column","_withCtx","$index","_createTextVNode","_toDisplayString","_component_el_button","scope","_renderSlot","_ctx","_resolveDynamicComponent","_normalizeStyle","_normalizeClass","_unref","_hoisted_1","slotProps","defaultConfig","ConfigManager","config","source","result","globalConfigManager","getConfigManager","setSmartTableConfig","getSmartTableConfig","defineColumn"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  var ce = Object.defineProperty;
2
2
  var de = (t, e, n) => e in t ? ce(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n;
3
3
  var W = (t, e, n) => de(t, typeof e != "symbol" ? e + "" : e, n);
4
- import { ref as L, watch as F, computed as S, defineComponent as R, h as m, resolveComponent as O, createBlock as w, openBlock as y, mergeProps as x, withKeys as J, withCtx as V, createElementBlock as A, Fragment as $, renderList as M, resolveDirective as fe, withDirectives as me, createSlots as ye, createTextVNode as X, toDisplayString as P, renderSlot as Z, resolveDynamicComponent as pe, unref as ee, normalizeClass as ge, normalizeStyle as he, normalizeProps as be, guardReactiveProps as ve } from "vue";
4
+ import { ref as L, watch as $, computed as S, defineComponent as R, h as m, resolveComponent as O, createBlock as w, openBlock as y, mergeProps as x, withKeys as J, withCtx as V, createElementBlock as A, Fragment as F, renderList as M, resolveDirective as fe, withDirectives as me, createSlots as ye, createTextVNode as X, toDisplayString as P, renderSlot as Z, resolveDynamicComponent as pe, unref as ee, normalizeClass as ge, normalizeStyle as he, normalizeProps as be, guardReactiveProps as ve } from "vue";
5
5
  import { ElImage as q, ElTag as Ce, ElMessage as K, ElButton as we } from "element-plus";
6
6
  import { CopyDocument as ke, DocumentCopy as _e } from "@element-plus/icons-vue";
7
7
  function te(t, e) {
@@ -24,7 +24,7 @@ function xe(t, e) {
24
24
  i ? JSON.parse(i) : []
25
25
  )
26
26
  );
27
- return F(
27
+ return $(
28
28
  r,
29
29
  (s) => {
30
30
  if (!n) return;
@@ -187,13 +187,15 @@ const Ee = /* @__PURE__ */ R({
187
187
  row: {},
188
188
  col: {},
189
189
  index: {},
190
+ onCellChange: { type: Function },
190
191
  onCellBlur: { type: Function },
191
192
  onCellEnter: { type: Function }
192
193
  },
193
194
  setup(t) {
194
195
  const e = t, n = L(v(e.row, e.col.key));
195
- F(n, (r) => {
196
- Y(e.row, e.col.key, r);
196
+ $(n, (r) => {
197
+ var s;
198
+ Y(e.row, e.col.key, r), (s = e.onCellChange) == null || s.call(e, e.row, e.col);
197
199
  });
198
200
  const l = () => {
199
201
  var r;
@@ -225,7 +227,7 @@ const Ee = /* @__PURE__ */ R({
225
227
  },
226
228
  setup(t) {
227
229
  const e = t, n = L(v(e.row, e.col.key));
228
- F(n, (r) => {
230
+ $(n, (r) => {
229
231
  var s;
230
232
  Y(e.row, e.col.key, r), (s = e.onCellChange) == null || s.call(e, e.row, e.col);
231
233
  });
@@ -259,7 +261,7 @@ const Ee = /* @__PURE__ */ R({
259
261
  },
260
262
  setup(t) {
261
263
  const e = t, n = L(v(e.row, e.col.key));
262
- F(n, (s) => {
264
+ $(n, (s) => {
263
265
  Y(e.row, e.col.key, s);
264
266
  });
265
267
  const l = () => {
@@ -285,7 +287,7 @@ const Ee = /* @__PURE__ */ R({
285
287
  default: V(() => {
286
288
  var k;
287
289
  return [
288
- (y(!0), A($, null, M(((k = t.col.renderProps) == null ? void 0 : k.options) || [], (E) => (y(), w(f, {
290
+ (y(!0), A(F, null, M(((k = t.col.renderProps) == null ? void 0 : k.options) || [], (E) => (y(), w(f, {
289
291
  key: E.value,
290
292
  label: E.label,
291
293
  value: E.value
@@ -296,7 +298,7 @@ const Ee = /* @__PURE__ */ R({
296
298
  }, 16, ["modelValue"]);
297
299
  };
298
300
  }
299
- }), Ae = U(Ee), Me = U(Te), Oe = U(Ve), $e = B((t) => {
301
+ }), Ae = U(Ee), Me = U(Te), Oe = U(Ve), Fe = B((t) => {
300
302
  const e = t.col.renderProps || {}, n = v(t.row, t.col.key);
301
303
  return m(we, {
302
304
  type: e.type || "primary",
@@ -306,7 +308,7 @@ const Ee = /* @__PURE__ */ R({
306
308
  return (l = t.onClick) == null ? void 0 : l.call(t, t.row, t.col);
307
309
  }
308
310
  }, () => e.label || n);
309
- }), Fe = B((t) => {
311
+ }), $e = B((t) => {
310
312
  const e = t.col.renderProps || {}, n = v(t.row, t.col.key);
311
313
  return m("a", {
312
314
  href: e.href || "#",
@@ -463,8 +465,8 @@ const We = B((t) => {
463
465
  input: Ae,
464
466
  "input-number": Me,
465
467
  select: Oe,
466
- button: $e,
467
- link: Fe,
468
+ button: Fe,
469
+ link: $e,
468
470
  html: Re,
469
471
  copy: ze,
470
472
  img: Ke,
@@ -498,17 +500,17 @@ const je = ["title"], Xe = /* @__PURE__ */ R({
498
500
  "cellChange",
499
501
  "cellBlur",
500
502
  "cellEnter",
501
- "cell-click"
503
+ "cellClick"
502
504
  ],
503
505
  setup(t, { expose: e, emit: n }) {
504
506
  const l = t, i = n, { columns: r } = xe(l.columns, {
505
507
  cacheKey: l.cacheKey ?? ""
506
508
  });
507
- F(
509
+ $(
508
510
  r,
509
511
  (o) => i("update:columns", o),
510
512
  { deep: !0, immediate: !0 }
511
- ), F(
513
+ ), $(
512
514
  () => l.data,
513
515
  (o) => {
514
516
  o && r.value.forEach((a) => {
@@ -563,7 +565,7 @@ const je = ["title"], Xe = /* @__PURE__ */ R({
563
565
  }, se = (o, a) => {
564
566
  i("cellEnter", o, a);
565
567
  }, ae = (o, a) => {
566
- a && i("cell-click", o, a);
568
+ a && i("cellClick", o, a);
567
569
  }, Q = L();
568
570
  return e({
569
571
  tableRef: Q
@@ -578,11 +580,11 @@ const je = ["title"], Xe = /* @__PURE__ */ R({
578
580
  class: "smart_table"
579
581
  }), ye({
580
582
  default: V(() => [
581
- (y(!0), A($, null, M(s.value, (u) => (y(), w(p, x({
583
+ (y(!0), A(F, null, M(s.value, (u) => (y(), w(p, x({
582
584
  key: "selection",
583
585
  type: "selection"
584
586
  }, { ref_for: !0 }, u.columnProps), null, 16))), 128)),
585
- (y(!0), A($, null, M(d.value, (u) => (y(), w(p, x({
587
+ (y(!0), A(F, null, M(d.value, (u) => (y(), w(p, x({
586
588
  key: "index",
587
589
  type: "index",
588
590
  label: u.label || "#",
@@ -593,7 +595,7 @@ const je = ["title"], Xe = /* @__PURE__ */ R({
593
595
  ]),
594
596
  _: 1
595
597
  }, 16, ["label"]))), 128)),
596
- (y(!0), A($, null, M(I(), (u) => (y(), w(p, x({
598
+ (y(!0), A(F, null, M(I(), (u) => (y(), w(p, x({
597
599
  key: u.key,
598
600
  label: u.label || "操作",
599
601
  align: "center"
@@ -602,7 +604,7 @@ const je = ["title"], Xe = /* @__PURE__ */ R({
602
604
  width: g(u)
603
605
  }), {
604
606
  default: V(({ row: C }) => [
605
- (y(!0), A($, null, M(b(u, C), (T) => (y(), w(_, {
607
+ (y(!0), A(F, null, M(b(u, C), (T) => (y(), w(_, {
606
608
  key: T.label,
607
609
  type: T.type || "primary",
608
610
  link: "",
@@ -616,7 +618,7 @@ const je = ["title"], Xe = /* @__PURE__ */ R({
616
618
  ]),
617
619
  _: 2
618
620
  }, 1040, ["label"]))), 128)),
619
- (y(!0), A($, null, M(h.value, (u) => (y(), w(p, x({
621
+ (y(!0), A(F, null, M(h.value, (u) => (y(), w(p, x({
620
622
  key: u.key,
621
623
  label: u.label,
622
624
  align: "center"