UNPKG

@2h-lin/components

Version:

Vue3组件库,基于Element Plus的增强组件

729 lines (728 loc) 28.4 kB
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('.pagination-container[data-v-fe4dfe25]{background:#fff;text-align:right;margin-top:24px}.pagination-container.hidden[data-v-fe4dfe25]{display:none}.time-select[data-v-63f750f1]{margin:0!important;display:flex;align-items:center}.el-config-table[data-v-e3583b51]{text-align:left}.el-config-table-statistical[data-v-e3583b51]{margin-bottom:20px;display:flex;align-items:center}.el-config-table-statistical .el-card+.el-card[data-v-e3583b51]{margin-left:20px;margin-top:0}.el-config-table-statistical[data-v-e3583b51] .el-card__body{padding:15px 20px;box-sizing:border-box;min-height:73px}.el-config-table-statistical .value[data-v-e3583b51]{font-size:22px;line-height:43px}.el-config-table .card-title[data-v-e3583b51]{font-weight:700;font-size:15px}.el-config-table-header[data-v-e3583b51]{margin-bottom:20px}.el-config-table-header[data-v-e3583b51] .el-form-item[style*="display: block"] .el-form-item__label{display:inline-block;vertical-align:top;margin-right:10px}.el-config-table-header[data-v-e3583b51] .el-form-item[style*="display: block"] .el-form-item__content{display:inline-block;vertical-align:top}.el-config-table-content .header-button[data-v-e3583b51]{margin-bottom:0;border:1px solid #ededed;border-bottom:none;background-color:#fafafa;padding:10px 15px;box-sizing:border-box;position:relative;display:flex;align-items:center}.el-config-table-content .has-gap[data-v-e3583b51]{margin-top:20px}.el-config-table-content .el-form[data-v-e3583b51]{margin-bottom:-20px}.el-config-table-content .fixed-header-button[data-v-e3583b51]{margin-left:auto}.el-config-table-content .fixed-header-button .el-button+.el-button[data-v-e3583b51]{margin-left:10px}.el-config-table-footer[data-v-e3583b51]{display:flex;justify-content:center;align-items:center}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})(); import { computed as U, resolveComponent as C, openBlock as n, createElementBlock as d, normalizeClass as he, createVNode as A, mergeProps as H, inject as _e, ref as _, watch as ye, Fragment as w, renderList as M, createBlock as p, withCtx as c, createTextVNode as Y, toDisplayString as $, unref as b, createCommentVNode as h, useSlots as Oe, onMounted as Pe, resolveDirective as Me, createSlots as Ye, withDirectives as ne, normalizeStyle as G, toHandlers as oe, resolveDynamicComponent as Ae, renderSlot as P, vShow as Re, createElementVNode as j, nextTick as Fe } from "vue"; import { Search as Le, Refresh as je, ArrowDown as He, ArrowUp as Ke } from "@element-plus/icons-vue"; import ve from "dayjs"; import { ElMessage as Qe } from "element-plus"; import { useRoute as Je } from "vue-router"; const ge = (l, y) => Object.keys(l).filter((o) => o.indexOf(y) > -1); const se = (l, y) => { const v = l.__vccOpts || l; for (const [o, g] of y) v[o] = g; return v; }, qe = { __name: "index", props: { total: { required: !0, type: Number }, page: { type: Number, default: 1 }, limit: { type: Number, default: 20 }, pageSizes: { type: Array, default() { return [10, 20, 30, 50]; } }, layout: { type: String, default: "total, sizes, prev, pager, next, jumper" }, background: { type: Boolean, default: !0 }, autoScroll: { type: Boolean, default: !0 }, hidden: { type: Boolean, default: !1 } }, emits: ["update:page", "update:limit", "pagination"], setup(l, { emit: y }) { const v = l, o = y, g = U({ get() { return v.page; }, set(S) { o("update:page", S); } }), T = U({ get() { return v.limit; }, set(S) { o("update:limit", S); } }), s = () => { v.autoScroll && window.scrollTo({ top: 0, behavior: "smooth" }); }, D = (S) => { o("pagination", { page: g.value, limit: S }), s(); }, F = (S) => { o("pagination", { page: S, limit: T.value }), s(); }; return (S, E) => { const f = C("el-pagination"); return n(), d("div", { class: he([{ hidden: l.hidden }, "pagination-container"]) }, [ A(f, H({ background: l.background, "current-page": g.value, "onUpdate:currentPage": E[0] || (E[0] = (V) => g.value = V), "page-size": T.value, "onUpdate:pageSize": E[1] || (E[1] = (V) => T.value = V), layout: l.layout, "page-sizes": l.pageSizes, total: l.total }, S.$attrs, { onSizeChange: D, onCurrentChange: F }), null, 16, ["background", "current-page", "page-size", "layout", "page-sizes", "total"]) ], 2); }; } }, Be = /* @__PURE__ */ se(qe, [["__scopeId", "data-v-fe4dfe25"]]), Z = 6, Xe = (l) => [ { label: l("timeSelect.all") || "全部", value: 0 }, { label: l("timeSelect.today") || "今天", value: 1 }, { label: l("timeSelect.yesterday") || "昨天", value: 2 }, { label: l("timeSelect.last7Days") || "最近7天", value: 3 }, { label: l("timeSelect.thisMonth") || "本月", value: 4 }, { label: l("timeSelect.thisYear") || "今年", value: 5 }, { label: l("timeSelect.custom") || "自定义", value: 6 } ], We = (l) => [ { text: l("timeSelect.last7Days") || "最近7天", onClick(y) { const v = /* @__PURE__ */ new Date(), o = /* @__PURE__ */ new Date(); o.setTime(o.getTime() - 3600 * 1e3 * 24 * 7), y.$emit("pick", [o, v]); } }, { text: l("timeSelect.last30Days") || "最近30天", onClick(y) { const v = /* @__PURE__ */ new Date(), o = /* @__PURE__ */ new Date(); o.setTime(o.getTime() - 3600 * 1e3 * 24 * 30), y.$emit("pick", [o, v]); } }, { text: l("timeSelect.last3Months") || "最近3个月", onClick(y) { const v = /* @__PURE__ */ new Date(), o = /* @__PURE__ */ new Date(); o.setTime(o.getTime() - 3600 * 1e3 * 24 * 90), y.$emit("pick", [o, v]); } } ]; const Ge = { class: "time-select" }, Ze = /* @__PURE__ */ Object.assign({ name: "TimeSelect" }, { __name: "index", props: { value: { type: Number, default: 1 } }, emits: ["update:value", "change"], setup(l, { emit: y }) { const v = l, o = y, g = _e("$t", (f) => ({ "timeSelect.all": "全部", "timeSelect.today": "今天", "timeSelect.yesterday": "昨天", "timeSelect.last7Days": "最近7天", "timeSelect.thisMonth": "本月", "timeSelect.thisYear": "今年", "timeSelect.custom": "自定义", "timeSelect.startTime": "开始时间", "timeSelect.endTime": "结束时间", "timeSelect.last30Days": "最近30天", "timeSelect.last3Months": "最近3个月" })[f] || f), T = _(!1), s = _({}), D = _(""), F = U(() => Xe(g)), S = U(() => ({ shortcuts: We(g) })); ye(() => v.value, (f) => { f !== Z && (D.value = "", T.value = !1); }), ye(D, (f) => { f ? (s.value.startTime = ve(f[0]).format("YYYY-MM-DD 00:00:00"), s.value.endTime = ve(f[1]).format("YYYY-MM-DD 23:59:59")) : (delete s.value.startTime, delete s.value.endTime), o("change", { ...s.value }); }); const E = (f) => { o("update:value", f), f === Z ? T.value = !0 : T.value = !1, s.value.value = f, o("change", { ...s.value }); }; return (f, V) => { const B = C("el-tag"), N = C("el-date-picker"); return n(), d("div", Ge, [ (n(!0), d(w, null, M(F.value, (i) => (n(), p(B, { style: { cursor: "pointer", "margin-right": "12px" }, key: i.value, type: l.value == i.value ? "primary" : "info", onClick: (I) => E(i.value) }, { default: c(() => [ Y($(i.label), 1) ]), _: 2 }, 1032, ["type", "onClick"]))), 128)), T.value ? (n(), p(N, { key: 0, style: { "margin-left": "10px" }, modelValue: D.value, "onUpdate:modelValue": V[0] || (V[0] = (i) => D.value = i), shortcuts: S.value.shortcuts, align: "left", "start-placeholder": b(g)("timeSelect.startTime"), "end-placeholder": b(g)("timeSelect.endTime"), type: "daterange", "unlink-panels": "" }, null, 8, ["modelValue", "shortcuts", "start-placeholder", "end-placeholder"])) : h("", !0) ]); }; } }), ke = /* @__PURE__ */ se(Ze, [["__scopeId", "data-v-63f750f1"]]); function Ie() { const l = new URL(window.location.href), [y, v] = l.hash.split("?"), o = `${l.origin}${l.pathname}${y}`; window.history.replaceState({}, "", o); } const me = { primary: "#409eff", success: "#67c23a", warning: "#e6a23c", danger: "#f56c6c", info: "#909399" }; const et = { class: "el-config-table" }, tt = { key: 0, class: "card-title" }, lt = { key: 0, class: "el-config-table-header" }, at = { key: 1, class: "el-config-table-statistical" }, nt = { class: "clearfix" }, ot = { class: "el-config-table-content" }, st = { key: 0, class: /* @__PURE__ */ he(["header-button"]) }, it = { key: 0, class: "fixed-header-button" }, ut = { class: "el-config-table-footer" }, rt = /* @__PURE__ */ Object.assign({ name: "ElConfigTable" }, { __name: "index", props: { // api请求 api: { type: Function, default() { } }, // 统计api请求 statisticalApi: { type: Function, default() { } }, // searchForm 额外参数 extraQuery: { type: Object, default: void 0 }, // 显示多选按钮 showSelection: { type: Boolean, default: !1 }, // 是否可折叠 canSearchCollapse: { type: Boolean, default: !1 }, // 头部按钮 headerButtons: { type: Array, default: () => [] }, // 操作列配置 actionConfig: { type: Object, default: () => ({}) }, // 操作按钮配置 actionButtons: { type: Array, default: () => [] }, // 点击查询按钮, 查询前执行的函数,需要返回Promise beforeSearch: { type: Function, default() { } }, // 统计配置数据 statisticalConfig: { type: Array, default: () => [] }, // 查询项 searchForm: { type: Array, default: () => [] }, // 表格选项 columns: { type: Array, default: () => [] }, // 当前页数 page: { type: Number, default: 1 }, // 当前条数 limit: { type: Number, default: 10 }, // 卡片标题 title: { type: String, default: "" } }, emits: ["selectionChange", "search", "reset", "update:extraQuery"], setup(l, { expose: y, emit: v }) { const o = Oe(), g = _e("$t", (t) => ({ "el.search": "搜索", "el.reset": "重置", "el.collapse": "收起", "el.expand": "展开", "el.loading": "加载中...", "el.operation": "操作", "el.selectTimeRange": "请选择时间范围" })[t] || t); let T = { query: {} }; try { T = Je(), console.log("当前路由参数:", T); } catch { console.warn("Vue Router not configured, using default route object"); } const s = l, D = v, F = _({}), S = _([]), E = _({}), f = _(!1), V = _(!1), B = _(0), N = _([]), i = _({}), I = _({}), Se = _(JSON.stringify(s.extraQuery || {})), K = _(!1), Q = _(s.page), ee = _(s.limit), be = U(() => { let t = []; return typeof o.header == "function" && (t = o.header()), t.length || s.headerButtons.length; }), ie = U(() => s.searchForm.length || o.search), X = U(() => { const a = ge(o, "search:").map((r) => r.slice(7)); return s.searchForm.reduce((r, k) => (s.canSearchCollapse && typeof k.collapsible != "boolean" && (k.collapsible = !0), a.forEach((R) => { if (k.id === R) { const z = { type: "slot" }; r.push(z); return; } }), r.push(k), r), []); }), ue = U(() => { const a = ge(o, "column:").map((r) => r.slice(7)); return s.columns.reduce((r, k) => (a.forEach((R) => { if (k.key === R) { const z = { type: "slot" }; r.push(z); return; } }), r.push(k), r), []); }), Ce = U(() => s.headerButtons.filter((t) => t.align !== "right")), re = U(() => s.headerButtons.filter((t) => t.align === "right").reverse()); Pe(() => { $e(), L(); }); const L = async (t) => { var k; const { value: a, startTime: O, endTime: r } = E.value; if (a === Z && !O && !r && t !== "reset") { Qe.warning(g("el.selectTimeRange")); return; } f.value = !0, t !== "pagination" && (V.value = !0); try { const R = xe(), z = { page: Q.value, limit: ee.value, ...R, ...s.extraQuery }; let x = {}; if (t === "pagination") x = await s.api(z); else { const [J, q] = await Promise.allSettled([s.api(z), s.statisticalApi(z)]); F.value = q.status === "fulfilled" ? (k = q.value) == null ? void 0 : k.data : {}, x = J.status === "fulfilled" ? J.value : {}; } S.value = x.data || [], B.value = x.count; } finally { f.value = !1, V.value = !1; } }, Te = (t) => { E.value = { value: t.value, startTime: t.startTime, endTime: t.endTime }, t.startTime && (i.value.start_time = t.startTime), t.endTime && (i.value.end_time = t.endTime), t.value !== Z && L(); }, we = (t) => !["tag", "select", "date-picker", "slot", "time-select"].includes(t), xe = () => { var t = JSON.parse(JSON.stringify(i.value)); return X.value.forEach((a) => { var O, r; a.type === "date-picker" && a.attrs.start && a.attrs.end && (t[a.attrs.start] = ((O = t == null ? void 0 : t[a.id]) == null ? void 0 : O[0]) || "", t[a.attrs.end] = ((r = t == null ? void 0 : t[a.id]) == null ? void 0 : r[1]) || "", delete t[a.id]); }), t; }, $e = () => { const t = {}; X.value.forEach((a) => { (a.default || a.default === 0 || a.default === "") && (i.value[a.id] = a.default, t[a.id] = a.default), T.query[a.id] && (i.value[a.id] = T.query[a.id]); }), I.value = JSON.stringify(t) || {}; }, W = (t) => { const { ...a } = (t == null ? void 0 : t.attrs) || {}; return a; }, te = (t) => { const { ...a } = (t == null ? void 0 : t.on) || {}; return Object.keys(a).reduce((r, k) => (r[k] = a[k], r), {}); }, De = (t, a) => { i.value[t.id] = a.value, le(); }, Ee = (t) => { N.value = t, D("selectionChange", t); }, le = async () => { await s.beforeSearch(), Q.value = 1, L(), D("search"); }, Ve = () => { Q.value = 1, D("update:extraQuery", JSON.parse(Se.value)), i.value = JSON.parse(I.value), D("reset"), Ie(), Fe(() => { E.value = {}, L("reset"); }); }, ze = (t) => { Q.value = t.page, ee.value = t.limit, L("pagination"); }, ce = (t, a) => t.show ? t.show(a) : !0, de = (t, a) => t.show ? t.show(a) : !0; return y({ getList: L, resetSearch: le, timeSelectObj: E, searchValue: i, loading: f }), (t, a) => { const O = C("el-option"), r = C("el-select"), k = C("el-tag"), R = C("el-date-picker"), z = C("el-form-item"), x = C("el-button"), J = C("el-form"), q = C("el-card"), ae = C("el-table-column"), Ne = C("el-popconfirm"), Ue = C("el-table"), fe = Me("loading"); return n(), d("div", et, [ A(q, null, Ye({ default: c(() => [ be.value || ie.value || o.beforeTable ? (n(), d("div", lt, [ ie.value ? (n(), p(J, { key: 0, ref: "searchForm", inline: "" }, { default: c(() => [ (n(!0), d(w, null, M(X.value, (e, u) => ne((n(), p(z, { style: G({ display: e.block ? "flex" : "" }), key: u, label: e.label ? e.label + ":" : "" }, { default: c(() => [ e.type === "select" ? (n(), p(r, H({ key: 0, modelValue: i.value[e.id], "onUpdate:modelValue": (m) => i.value[e.id] = m }, { ref_for: !0 }, W(e), { style: { width: e.width + "px" || "100%" } }, oe(te(e))), { default: c(() => [ (n(!0), d(w, null, M(e.options, (m) => (n(), p(O, { key: m.value, label: m.label, value: m.value }, null, 8, ["label", "value"]))), 128)) ]), _: 2 }, 1040, ["modelValue", "onUpdate:modelValue", "style"])) : h("", !0), e.type === "tag" ? (n(!0), d(w, { key: 1 }, M(e.options, (m) => (n(), p(k, H({ style: { cursor: "pointer" }, key: m.value, type: i.value[e.id] === m.value ? "" : "info" }, { ref_for: !0 }, W(e), { onClick: (pe) => De(e, m) }), { default: c(() => [ Y($(m.label), 1) ]), _: 2 }, 1040, ["type", "onClick"]))), 128)) : h("", !0), e.type === "date-picker" ? (n(), p(R, H({ key: 2, modelValue: i.value[e.id], "onUpdate:modelValue": (m) => i.value[e.id] = m }, { ref_for: !0 }, W(e), { style: { width: e.width + "px" || "100%" } }, oe(te(e))), null, 16, ["modelValue", "onUpdate:modelValue", "style"])) : h("", !0), we(e.type) ? (n(), p(Ae("el-" + e.type), H({ key: 3, modelValue: i.value[e.id], "onUpdate:modelValue": (m) => i.value[e.id] = m }, { ref_for: !0 }, W(e), { style: { width: e.width + "px" || "100%" } }, oe(te(e))), null, 16, ["modelValue", "onUpdate:modelValue", "style"])) : h("", !0), e.type === "time-select" ? (n(), p(ke, { key: 4, value: i.value[e.id], "onUpdate:value": (m) => i.value[e.id] = m, onChange: Te }, null, 8, ["value", "onUpdate:value"])) : h("", !0), e.type === "slot" ? P(t.$slots, `search:${X.value[u + 1].id}`, { key: 5 }, void 0, !0) : h("", !0) ]), _: 2 }, 1032, ["style", "label"])), [ [Re, !e.collapsible || K.value] ])), 128)), A(z, null, { default: c(() => [ P(t.$slots, "search", {}, void 0, !0) ]), _: 3 }), A(z, null, { default: c(() => [ A(x, { type: "primary", class: "search-btn", icon: b(Le), onClick: le }, { default: c(() => [ Y($(b(g)("el.search")), 1) ]), _: 1 }, 8, ["icon"]), A(x, { type: "default", class: "reset-btn", icon: b(je), onClick: Ve }, { default: c(() => [ Y($(b(g)("el.reset")), 1) ]), _: 1 }, 8, ["icon"]), l.canSearchCollapse ? (n(), p(x, { key: 0, type: "text", icon: K.value ? b(Ke) : b(He), onClick: a[0] || (a[0] = (e) => K.value = !K.value) }, { default: c(() => [ Y($(K.value ? b(g)("el.collapse") : b(g)("el.expand")), 1) ]), _: 1 }, 8, ["icon"])) : h("", !0) ]), _: 1 }) ]), _: 3 }, 512)) : h("", !0), P(t.$slots, "beforeTable", {}, void 0, !0) ])) : h("", !0), l.statisticalConfig.length ? ne((n(), d("div", at, [ (n(!0), d(w, null, M(l.statisticalConfig, (e) => (n(), p(q, { key: e.label, style: { flex: "1" } }, { header: c(() => [ j("div", nt, [ j("span", null, $(e.label), 1) ]) ]), default: c(() => [ j("div", { class: "value", style: G({ color: e.color || "#409eff" }) }, $(F.value[e.key] || "-"), 5) ]), _: 2 }, 1024))), 128)) ])), [ [fe, V.value] ]) : h("", !0), j("div", ot, [ l.headerButtons.length ? (n(), d("div", st, [ (n(!0), d(w, null, M(Ce.value, (e) => (n(), d(w, { key: e.text }, [ de(e, N.value) ? (n(), p(x, { key: 0, icon: e.icon, type: e.type || "primary", size: e.size || "default", disabled: "disabled" in e ? e.disabled(N.value) : !1, onClick: (u) => "atClick" in e ? e.atClick(N.value) : "" }, { default: c(() => [ Y($(e.text), 1) ]), _: 2 }, 1032, ["icon", "type", "size", "disabled", "onClick"])) : h("", !0) ], 64))), 128)), re.value.length ? (n(), d("div", it, [ (n(!0), d(w, null, M(re.value, (e) => (n(), d(w, { key: e.text }, [ de(e, N.value) ? (n(), p(x, { key: 0, class: "fixed-header-button", icon: e.icon, type: e.type || "primary", size: e.size || "default", disabled: "disabled" in e ? e.disabled(N.value) : !1, onClick: (u) => "atClick" in e ? e.atClick(N.value) : "" }, { default: c(() => [ Y($(e.text), 1) ]), _: 2 }, 1032, ["icon", "type", "size", "disabled", "onClick"])) : h("", !0) ], 64))), 128)) ])) : h("", !0), P(t.$slots, "header", { selected: N.value }, void 0, !0) ])) : h("", !0), ne((n(), p(Ue, { ref: "tableList", height: "550px", border: "", "element-loading-text": b(g)("el.loading"), data: S.value, "header-cell-style": { color: "#000", fontWeight: "500" }, onSelectionChange: Ee }, { default: c(() => [ l.showSelection ? (n(), p(ae, { key: 0, type: "selection", width: "50" })) : h("", !0), (n(!0), d(w, null, M(ue.value, (e, u) => (n(), d(w, { key: e.key }, [ e.type === "slot" ? P(t.$slots, `column:${ue.value[u + 1].key}`, { key: 0 }, void 0, !0) : (n(), p(ae, H({ key: 1, prop: e.key, "show-overflow-tooltip": e.showTooltip }, { ref_for: !0 }, { ...e }), null, 16, ["prop", "show-overflow-tooltip"])) ], 64))), 128)), P(t.$slots, "column", {}, void 0, !0), l.actionButtons.length ? (n(), p(ae, { key: 1, align: "center", width: l.actionConfig.width || "200", label: l.actionConfig.title || b(g)("el.operation"), fixed: "right" }, { default: c((e) => [ (n(!0), d(w, null, M(l.actionButtons, (u, m) => (n(), d(w, { key: m }, [ u.isDelete && ce(u, e.row) ? (n(), p(Ne, { key: 0, class: "ele-action", title: u.deleteConfirmText, onConfirm: (pe) => "atClick" in u ? u.atClick(e.row) : "" }, { reference: c(() => [ A(x, { type: "text", style: G({ color: b(me)[u.type || "primary"] }), disabled: "disabled" in u ? u.disabled(e.row) : !1 }, { default: c(() => [ Y($(u.text), 1) ]), _: 2 }, 1032, ["style", "disabled"]) ]), _: 2 }, 1032, ["title", "onConfirm"])) : ce(u, e.row) ? (n(), p(x, { key: 1, type: "text", style: G({ color: b(me)[u.type || "primary"] }), disabled: "disabled" in u ? u.disabled(e.row) : !1, onClick: (pe) => "atClick" in u ? u.atClick(e.row) : "" }, { default: c(() => [ Y($(u.text), 1) ]), _: 2 }, 1032, ["style", "disabled", "onClick"])) : h("", !0) ], 64))), 128)) ]), _: 1 }, 8, ["width", "label"])) : h("", !0), P(t.$slots, "action", {}, void 0, !0) ]), _: 3 }, 8, ["element-loading-text", "data"])), [ [fe, f.value] ]) ]), P(t.$slots, "afterTable", {}, void 0, !0), j("div", ut, [ A(Be, { autoScroll: !1, total: B.value, page: Q.value, limit: ee.value, onPagination: ze }, null, 8, ["total", "page", "limit"]) ]) ]), _: 2 }, [ o.cardHeader || l.title ? { name: "header", fn: c(() => [ j("div", null, [ l.title ? (n(), d("span", tt, $(l.title), 1)) : P(t.$slots, "cardHeader", { key: 1 }, void 0, !0) ]) ]), key: "0" } : void 0 ]), 1024) ]); }; } }), ct = /* @__PURE__ */ se(rt, [["__scopeId", "data-v-e3583b51"]]), gt = { install(l, y = {}) { l.component("ElConfigTable", ct), l.component("TimeSelect", ke); } }; export { ct as ElConfigTable, ke as TimeSelect, gt as default };