configurabletable 1.0.0

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 ADDED
@@ -0,0 +1,37 @@
1
+ # configurabletable
2
+
3
+ 一个可配置的 Vue 3 表格组件。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install configurabletable
9
+ ```
10
+
11
+ ## 使用
12
+
13
+ ```vue
14
+ <template>
15
+ <ProTable :columns="columns" :data="data" />
16
+ </template>
17
+
18
+ <script setup>
19
+ import { ProTable } from 'configurabletable'
20
+ import 'configurabletable/dist/style.css'
21
+
22
+ const columns = [
23
+ { prop: 'name', label: '姓名' },
24
+ { prop: 'age', label: '年龄', sortable: true }
25
+ ]
26
+ const data = [{ name: '张三', age: 20 }]
27
+ </script>
28
+ ```
29
+
30
+ ## Props
31
+
32
+ | 名称 | 类型 | 默认值 | 说明 |
33
+ |---|---|---|---|
34
+ | columns | Array | [] | 列配置 |
35
+ | data | Array | [] | 表格数据 |
36
+ | selection | Boolean | false | 是否显示选择列 |
37
+ | pagination | Boolean | false | 是否分页 |
@@ -0,0 +1 @@
1
+ .pro-table table[data-v-4888b0d6]{width:100%;border-collapse:collapse}.pro-table th[data-v-4888b0d6],.pro-table td[data-v-4888b0d6]{border:1px solid #eee;padding:8px;text-align:left}.pro-table th[data-v-4888b0d6]{background:#fafafa;cursor:pointer}.pagination[data-v-4888b0d6]{margin-top:12px;display:flex;gap:8px;align-items:center}
@@ -0,0 +1,112 @@
1
+ import { ref as m, computed as N, watch as P, openBlock as n, createElementBlock as a, createElementVNode as r, createCommentVNode as g, Fragment as y, renderList as _, normalizeStyle as T, createTextVNode as C, toDisplayString as h, withDirectives as $, vModelCheckbox as w } from "vue";
2
+ const A = (s, x) => {
3
+ const f = s.__vccOpts || s;
4
+ for (const [u, k] of x)
5
+ f[u] = k;
6
+ return f;
7
+ }, D = { class: "pro-table" }, E = {
8
+ key: 0,
9
+ style: { width: "40px" }
10
+ }, O = ["onClick"], F = { key: 0 }, I = { key: 0 }, K = ["value"], L = ["onClick"], M = {
11
+ key: 0,
12
+ class: "pagination"
13
+ }, R = ["disabled"], U = {
14
+ __name: "ProTable",
15
+ props: {
16
+ columns: { type: Array, default: () => [] },
17
+ data: { type: Array, default: () => [] },
18
+ selection: { type: Boolean, default: !1 },
19
+ pagination: { type: Boolean, default: !1 },
20
+ pageSize: { type: Number, default: 10 }
21
+ },
22
+ emits: ["selection-change", "sort-change"],
23
+ setup(s, { expose: x, emit: f }) {
24
+ const u = s, k = f, i = m(1), b = m([]), c = m(""), d = m("asc"), S = N(() => {
25
+ let t = [...u.data];
26
+ if (c.value && t.sort((l, e) => {
27
+ const v = l[c.value], o = e[c.value];
28
+ if (v === o) return 0;
29
+ const p = v > o ? 1 : -1;
30
+ return d.value === "asc" ? p : -p;
31
+ }), u.pagination) {
32
+ const l = (i.value - 1) * u.pageSize;
33
+ t = t.slice(l, l + u.pageSize);
34
+ }
35
+ return t;
36
+ });
37
+ function B(t) {
38
+ c.value === t ? d.value = d.value === "asc" ? "desc" : "asc" : (c.value = t, d.value = "asc"), k("sort-change", { prop: t, order: d.value });
39
+ }
40
+ function V(t, l) {
41
+ return t.buttons ? t.buttons.filter((e) => !e.hide || !e.hide(l)) : [];
42
+ }
43
+ function z(t) {
44
+ b.value = t.target.checked ? [...u.data] : [];
45
+ }
46
+ return P(b, (t) => k("selection-change", t)), x({ currentPage: i }), (t, l) => (n(), a("div", D, [
47
+ r("table", null, [
48
+ r("thead", null, [
49
+ r("tr", null, [
50
+ s.selection ? (n(), a("th", E, [
51
+ r("input", {
52
+ type: "checkbox",
53
+ onChange: z
54
+ }, null, 32)
55
+ ])) : g("", !0),
56
+ (n(!0), a(y, null, _(s.columns, (e) => (n(), a("th", {
57
+ key: e.prop,
58
+ style: T({ width: e.width ? e.width + "px" : "auto" }),
59
+ onClick: (v) => e.sortable && B(e.prop)
60
+ }, [
61
+ C(h(e.label) + " ", 1),
62
+ e.sortable ? (n(), a("span", F, h(c.value === e.prop ? d.value === "asc" ? "↑" : "↓" : "↕"), 1)) : g("", !0)
63
+ ], 12, O))), 128))
64
+ ])
65
+ ]),
66
+ r("tbody", null, [
67
+ (n(!0), a(y, null, _(S.value, (e, v) => (n(), a("tr", { key: v }, [
68
+ s.selection ? (n(), a("td", I, [
69
+ $(r("input", {
70
+ type: "checkbox",
71
+ value: e,
72
+ "onUpdate:modelValue": l[0] || (l[0] = (o) => b.value = o)
73
+ }, null, 8, K), [
74
+ [w, b.value]
75
+ ])
76
+ ])) : g("", !0),
77
+ (n(!0), a(y, null, _(s.columns, (o) => (n(), a("td", {
78
+ key: o.prop
79
+ }, [
80
+ o.type === "action" ? (n(!0), a(y, { key: 0 }, _(V(o, e), (p) => (n(), a("button", {
81
+ key: p.label,
82
+ onClick: (q) => p.handler(e, v)
83
+ }, h(p.label), 9, L))), 128)) : o.formatter ? (n(), a(y, { key: 1 }, [
84
+ C(h(o.formatter(e, o)), 1)
85
+ ], 64)) : (n(), a(y, { key: 2 }, [
86
+ C(h(e[o.prop]), 1)
87
+ ], 64))
88
+ ]))), 128))
89
+ ]))), 128))
90
+ ])
91
+ ]),
92
+ s.pagination ? (n(), a("div", M, [
93
+ r("button", {
94
+ disabled: i.value <= 1,
95
+ onClick: l[1] || (l[1] = (e) => i.value--)
96
+ }, "上一页", 8, R),
97
+ r("span", null, "第 " + h(i.value) + " 页", 1),
98
+ r("button", {
99
+ onClick: l[2] || (l[2] = (e) => i.value++)
100
+ }, "下一页")
101
+ ])) : g("", !0)
102
+ ]));
103
+ }
104
+ }, j = /* @__PURE__ */ A(U, [["__scopeId", "data-v-4888b0d6"]]), H = {
105
+ install(s) {
106
+ s.component("ProTable", j);
107
+ }
108
+ };
109
+ export {
110
+ j as ProTable,
111
+ H as default
112
+ };
@@ -0,0 +1 @@
1
+ (function(r,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(r=typeof globalThis<"u"?globalThis:r||self,e(r.ConfigurableTable={},r.Vue))})(this,(function(r,e){"use strict";const h=(a,B)=>{const k=a.__vccOpts||a;for(const[c,f]of B)k[c]=f;return k},b={class:"pro-table"},u={key:0,style:{width:"40px"}},E=["onClick"],V={key:0},_={key:0},N=["value"],C=["onClick"],S={key:0,class:"pagination"},x=["disabled"],g=h({__name:"ProTable",props:{columns:{type:Array,default:()=>[]},data:{type:Array,default:()=>[]},selection:{type:Boolean,default:!1},pagination:{type:Boolean,default:!1},pageSize:{type:Number,default:10}},emits:["selection-change","sort-change"],setup(a,{expose:B,emit:k}){const c=a,f=k,s=e.ref(1),y=e.ref([]),i=e.ref(""),d=e.ref("asc"),D=e.computed(()=>{let n=[...c.data];if(i.value&&n.sort((o,t)=>{const m=o[i.value],l=t[i.value];if(m===l)return 0;const p=m>l?1:-1;return d.value==="asc"?p:-p}),c.pagination){const o=(s.value-1)*c.pageSize;n=n.slice(o,o+c.pageSize)}return n});function F(n){i.value===n?d.value=d.value==="asc"?"desc":"asc":(i.value=n,d.value="asc"),f("sort-change",{prop:n,order:d.value})}function P(n,o){return n.buttons?n.buttons.filter(t=>!t.hide||!t.hide(o)):[]}function z(n){y.value=n.target.checked?[...c.data]:[]}return e.watch(y,n=>f("selection-change",n)),B({currentPage:s}),(n,o)=>(e.openBlock(),e.createElementBlock("div",b,[e.createElementVNode("table",null,[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[a.selection?(e.openBlock(),e.createElementBlock("th",u,[e.createElementVNode("input",{type:"checkbox",onChange:z},null,32)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.columns,t=>(e.openBlock(),e.createElementBlock("th",{key:t.prop,style:e.normalizeStyle({width:t.width?t.width+"px":"auto"}),onClick:m=>t.sortable&&F(t.prop)},[e.createTextVNode(e.toDisplayString(t.label)+" ",1),t.sortable?(e.openBlock(),e.createElementBlock("span",V,e.toDisplayString(i.value===t.prop?d.value==="asc"?"↑":"↓":"↕"),1)):e.createCommentVNode("",!0)],12,E))),128))])]),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,(t,m)=>(e.openBlock(),e.createElementBlock("tr",{key:m},[a.selection?(e.openBlock(),e.createElementBlock("td",_,[e.withDirectives(e.createElementVNode("input",{type:"checkbox",value:t,"onUpdate:modelValue":o[0]||(o[0]=l=>y.value=l)},null,8,N),[[e.vModelCheckbox,y.value]])])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.columns,l=>(e.openBlock(),e.createElementBlock("td",{key:l.prop},[l.type==="action"?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(P(l,t),p=>(e.openBlock(),e.createElementBlock("button",{key:p.label,onClick:$=>p.handler(t,m)},e.toDisplayString(p.label),9,C))),128)):l.formatter?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(l.formatter(t,l)),1)],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createTextVNode(e.toDisplayString(t[l.prop]),1)],64))]))),128))]))),128))])]),a.pagination?(e.openBlock(),e.createElementBlock("div",S,[e.createElementVNode("button",{disabled:s.value<=1,onClick:o[1]||(o[1]=t=>s.value--)},"上一页",8,x),e.createElementVNode("span",null,"第 "+e.toDisplayString(s.value)+" 页",1),e.createElementVNode("button",{onClick:o[2]||(o[2]=t=>s.value++)},"下一页")])):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-4888b0d6"]]),T={install(a){a.component("ProTable",g)}};r.ProTable=g,r.default=T,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "configurabletable",
3
+ "version": "1.0.0",
4
+ "description": "一个可配置的 Vue 3 表格组件",
5
+ "type": "module",
6
+ "main": "./dist/configurable-table.umd.cjs",
7
+ "module": "./dist/configurable-table.js",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/configurable-table.js",
11
+ "require": "./dist/configurable-table.umd.cjs"
12
+ },
13
+ "./dist/style.css": "./dist/style.css"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "dev": "vite",
21
+ "build": "vite build",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "vue3",
26
+ "table",
27
+ "configurable"
28
+ ],
29
+ "author": "zhu",
30
+ "license": "MIT",
31
+ "peerDependencies": {
32
+ "vue": "^3.0.0"
33
+ },
34
+ "devDependencies": {
35
+ "@vitejs/plugin-vue": "^5.2.4",
36
+ "vite": "^6.4.3",
37
+ "vue": "^3.5.43"
38
+ }
39
+ }