UNPKG

@farris/ui-vue

Version:

Farris Vue, a Farris Design based Vue3 component library.

792 lines (791 loc) 24.5 kB
import { ref as v, computed as P, createVNode as t, Fragment as G, watch as Z, withModifiers as pe, withDirectives as ye, vModelText as we, defineComponent as ee, createTextVNode as Y } from "vue"; import { getCustomClass as N, getCustomStyle as $ } from "../common/index.esm.js"; import { useFilter as Ie, useIdentify as Se, useHierarchy as ke, useGroupData as be, useDataView as Ve, useSelection as Fe, usePagination as De, useRow as Me, useEdit as Oe, useVisualDataBound as Te, useVisualDataCell as Re, useVisualDataRow as Be, useVisualGroupRow as He, useVisualSummaryRow as xe, useVisualData as Pe, useSidebar as je, useColumn as Le, useVirtualScroll as _e, getPagination as Ae } from "../data-view/index.esm.js"; import { useI18n as Ge } from "vue-i18n"; import { FCheckbox as W } from "../checkbox/index.esm.js"; const te = { /** 列集合 */ columns: { type: Array, default: [ { field: "name", title: "", dataType: "string" } ] }, customClass: { type: String, default: "" }, data: { type: Array, default: [] }, draggable: { type: Boolean, default: !1 }, multiSelect: { type: Boolean, default: !1 }, multiSelectMode: { type: String, default: "OnCheck" }, idField: { type: String, default: "id" }, valueField: { type: String, default: "id" }, textField: { type: String, default: "name" }, titleField: { type: String, default: "name" }, view: { type: String, default: "ContentView" }, size: { type: String, default: "default" }, placeholder: { type: String, default: "" }, header: { type: String, default: "ContentHeader" }, headerClass: { type: String, default: "" }, /** 可能根据数据每各项的样式不同 */ itemClass: { type: [String, Function], default: "", validator: (e) => typeof e == "string" || typeof e == "function" }, itemStyle: { type: [String, Function], default: "", validator: (e) => typeof e == "string" || typeof e == "function" }, itemContentClass: { type: String, default: "" }, selectionValues: { type: Array, default: [] }, /** 分组配置 */ group: { type: Object }, /** 选择配置 */ selection: { type: Object, default: { enableSelectRow: !0, multiSelect: !1, multiSelectMode: "DependOnCheck", showCheckbox: !1, showSelectAll: !1, showSelection: !0 } }, keepOrder: { type: Boolean, default: !1 }, disableField: { type: String, default: "disabled" }, // 搜索启用高亮 enableHighlightSearch: { type: Boolean, default: !0 }, /** 虚拟化渲染数据 */ virtualized: { type: Boolean, default: !0 }, /** 删除数据前的检查方法,返回值为true时可以删除当前数据 */ checkBeforeRemoveItem: { type: Function, default: null }, /** 头部模板 */ headerTemplate: { type: Object }, /** 内容模板 */ contentTemplate: { type: Object }, /** 底部模板 */ footerTemplate: { type: Object }, /** 空数据模板 */ emptyTemplate: { type: Object }, /** 分页 */ pagination: { type: Object, default: { enable: !1, size: 20 } } }; function Ee(e, l) { function p(a) { const i = []; let m = a.nextNode(); for (; m; ) i.push(m), m = a.nextNode(); return i; } function I(a, i) { const m = document.createTreeWalker(a, NodeFilter.SHOW_TEXT); return p(m).map((C) => ({ textNode: C, text: (C.textContent || "").toLocaleLowerCase() })).map(({ textNode: C, text: u }) => { const c = []; let F = 0; for (; F < u.length; ) { const S = u.indexOf(i, F); if (S === -1) break; c.push(S), F = S + i.length; } return c.map((S) => { const y = new Range(); return y.setStart(C, S), y.setEnd(C, S + i.length), y; }); }).flat(); } function h(a) { if (!CSS.highlights || (CSS.highlights.clear(), !a || !l)) return; const i = I(l.value, a.toLocaleLowerCase()), m = new Highlight(...i); CSS.highlights.set("search-result", m); } return { search: h }; } function q(e, l, p, I, h, a, i, m, B, g) { const O = v(e.size), C = v(e.textField), u = v(e.titleField), c = v(e.disableField), F = P(() => { var n, s; return ((n = e.selection) == null ? void 0 : n.multiSelect) && ((s = e.selection) == null ? void 0 : s.showCheckbox); }), { onMouseenterItem: S, onMouseoverItem: y, onMouseoutItem: D } = a, { getKey: k, listViewItemClass: T, onCheckItem: H, onClickItem: j } = i, r = P(() => { const n = { "text-overflow": "ellipsis", overflow: "hidden", "white-space": "nowrap" }; return e.itemClass ? n : { margin: O.value === "small" ? "0.25rem 0" : "8px 0", ...n }; }); function o(n, s, R) { return n.checked = m.findIndexInSelectedItems(n) > -1, t("li", { class: T(n, s), id: k(n, s), key: k(n, s), onClick: (M) => j(n, s, M), onMouseenter: (M) => S(M, n, s), onMouseover: (M) => y(M, n, s), onMouseout: (M) => D(M, n, s) }, [F.value && t("div", { class: "f-list-select", onClick: (M) => M.stopPropagation() }, [t(W, { id: "list-" + k(n, s), customClass: "listview-checkbox float-left", disabled: n[c.value], checked: n.checked, "onUpdate:checked": (M) => n.checked = M, onChange: (M) => { H(n, s, !M.checked); } }, null)]), t("div", { class: "f-list-content" }, [t("div", { class: e.itemContentClass, style: r.value, title: n.raw[u.value] || n.raw[C.value] }, [n.raw[C.value]])])]); } return { renderItem: o }; } function ze(e, l, p, I, h, a, i, m, B, g) { const O = v(e.multiSelect), C = v(e.disableField), u = v(e.textField), { onMouseenterItem: c, onMouseoverItem: F, onMouseoutItem: S } = a, { getKey: y, listViewItemClass: D, listViewItemStyle: k, onCheckItem: T, onClickItem: H } = i; function j(o, n, s) { return e.contentTemplate ? t(G, null, [e.contentTemplate({ item: o.raw, index: n, selectedItem: s })]) : l.slots.content ? t(G, null, [l.slots.content && l.slots.content({ item: o.raw, index: n, selectedItem: s })]) : t("div", { style: "margin: 10px 0;" }, [o.raw[u.value || "name"]]); } function r(o, n, s) { return t("li", { class: D(o, n), id: y(o, n), key: y(o, n), style: k(o, n), onClick: (R) => H(o, n, R), onMouseenter: (R) => c(R, o, n), onMouseover: (R) => F(R, o, n), onMouseout: (R) => S(R, o, n) }, [O.value && t("div", { class: "f-list-select", onClick: (R) => R.stopPropagation() }, [t(W, { id: "list-" + y(o, n), customClass: "listview-checkbox", disabled: o[C.value] || !o.checked, checked: o.checked, "onUpdate:checked": (R) => o.checked = R, onChange: (R) => T(o, n, !R.checked) }, null)]), t("div", { class: "f-list-content" }, [j(o, n, s)])]); } return { renderItem: r }; } function Ne(e, l, p, I, h, a, i, m, B, g) { const O = v(e.multiSelect), C = v(e.disableField), u = v(e.textField), { onMouseenterItem: c, onMouseoverItem: F, onMouseoutItem: S } = a, { getKey: y, listViewItemClass: D, onCheckItem: k, onClickItem: T } = i, { dragstart: H, dragenter: j, dragover: r, dragend: o } = I, { removeItem: n } = B, s = P(() => ({ margin: O.value ? "10px 0" : "10px 0px 10px 14px" })); function R(d, f = "") { const x = d.target; x.title = x.scrollWidth > x.clientWidth ? f : ""; } function M(d) { return t("div", { style: s.value, onMouseenter: (f) => R(f, d.raw[u.value || "name"]) }, [d.raw[u.value || "name"]]); } function L() { return l.slots.itemContent ? l.slots.itemContent : M; } const A = L(); function w(d, f, x) { return t("li", { class: D(d, f), id: y(d, f), key: y(d, f), onClick: (b) => T(d, f, b), onMouseenter: (b) => c(b, d, f), onMouseover: (b) => F(b, d, f), onMouseout: (b) => S(b, d, f), draggable: "true", onDragstart: (b) => H(b, d, f), onDragenter: (b) => j(b, f), onDragend: (b) => o(b, d), onDragover: (b) => r(b) }, [O.value && t("div", { class: "f-list-select", onClick: (b) => b.stopPropagation() }, [t(W, { id: "list-" + y(d, f), customClass: "listview-checkbox", disabled: d[C.value] || !d.checked, checked: d.checked, "onUpdate:checked": (b) => d.checked = b, onChange: (b) => k(d, f, !b.checked) }, null)]), t("div", { class: "f-list-content" }, [A(d)]), t("div", { class: "f-list-remove", onClick: (b) => n(f) }, [t("div", { class: "f-list-remove-icon" }, [t("i", { class: "f-icon f-icon-remove_face" }, null)])]), t("div", { class: "f-list-handle" }, [t("div", null, [t("i", { class: "f-icon f-icon-drag-vertical" }, null)])])]); } return { renderItem: w }; } function We(e, l, p, I, h, a, i, m, B, g) { var y; const O = v(((y = e.group) == null ? void 0 : y.groupFields) || []), { collpaseGroupIconClass: C } = h, { toggleGroupRow: u } = g; function c(D, k) { k.collapse = !k.collapse, p.value = u(k.collapse ? "collapse" : "expand", k, p.value); } function F(D, k, T) { return l.slots.group ? t(G, null, [l.slots.content && l.slots.group({ item: D.raw, index: k, selectedItem: T })]) : t("div", { class: "f-navlookup-recentHeader", onClick: (H) => c(H, D) }, [t("div", { class: "fv-grid-group-row-icon" }, [t("span", { class: C(D) }, null)]), t("div", { class: "f-navlookup-recommandLabel" }, [D.raw[O.value[D.layer]]])]); } function S(D, k, T) { return D.layer > -1 && F(D, k, T); } return { renderItem: S }; } function Ke(e, l, p, I) { const { dataView: h } = p, { updateSelectedItems: a } = I; function i(m) { if (m > -1 && m < h.value.length) { if (e != null && e.checkBeforeRemoveItem && !e.checkBeforeRemoveItem(h.value[m])) return; const B = h.value.splice(m, 1); a(), l.emit("removeItem", B[0]); } } return { removeItem: i }; } function Ue(e, l, p, I, h, a, i, m, B, g) { const { t: O } = Ge(), C = v(e.view), u = v(e.view === "CardView"), c = v({}), F = v(O("listView.emptyMessage")), S = Ke(e, l, I, B), y = P(() => ({ "f-list-view-group": !0, "f-list-view-group-multiselect": e.multiSelect, "d-flex": u.value, "flex-wrap": u.value })), D = P(() => !!p.value && p.value.length > 0), k = P(() => p.value.length === 0); P(() => k.value && !l.slots.empty); function T() { return C.value === "SingleView" ? q : C.value === "DraggableView" ? Ne : (C.value === "ContentView" || C.value === "CardView") && (e.contentTemplate || l.slots.content) ? ze : q; } const H = T(), { renderItem: j } = H(e, l, p, g, h, a, B, i, S, m), { renderItem: r } = We(e, l, p, g, h, a, B, i, S, m), o = [j, r]; function n() { return p.value.filter((M) => M.visible !== !1).map((M, L) => o[M.type](M, L, c)); } function s() { return t("div", { class: "f-list-view-emptydata", style: "margin: 0 auto;" }, [t("p", { class: "f-empty-title" }, [e.emptyTemplate ? e.emptyTemplate() : l.slots.empty ? l.slots.empty() : F.value])]); } function R() { return t("ul", { class: y.value, style: "list-style: none;" }, [D.value && n(), k.value && s()]); } return { renderListArea: R }; } function Xe(e, l, p) { function I() { return l.slots.header && t("div", { class: "f-list-view-header" }, [l.slots.header()]); } return { renderHeader: I }; } function J(e, l, p) { const I = v(e.headerClass), h = v(e.placeholder), a = v(""), i = P(() => !a.value), m = P(() => !!a.value); function B(u) { a.value = ""; } Z(a, (u) => { e.enableHighlightSearch && p.search(u), l.emit("afterSearch", u); }); const g = P(() => { const u = { "form-group": !0, "farris-form-group": !0 }; return I.value && I.value.split(" ").reduce((F, S) => (F[S] = !0, F), u), u; }); function O(u) { } function C() { return t("div", { class: "f-list-view-header", onClick: pe(() => O, ["prevent", "stop"]) }, [t("div", { class: g.value }, [t("div", { class: "farris-input-wrap" }, [t("div", { class: "f-cmp-inputgroup" }, [t("div", { class: "input-group f-state-editable" }, [ye(t("input", { class: "form-control f-utils-fill text-left", "onUpdate:modelValue": (u) => a.value = u, name: "input-group-value", type: "text", placeholder: h.value, autocomplete: "off" }, null), [[we, a.value]]), t("div", { class: "input-group-append" }, [m.value && t("span", { class: "input-group-text input-group-clear", onClick: (u) => B() }, [t("i", { class: "f-icon f-icon-close-circle" }, null)]), i.value && t("span", { class: "input-group-text" }, [t("span", { class: "f-icon f-icon-search" }, null)])])])])])])]); } return { renderHeader: C }; } function Ye() { const e = v(""), l = v(-1), p = v(""), I = v(-1), h = v(!1); function a(C, u, c) { I.value = c; } function i(C, u, c) { h.value || (I.value = c); } function m(C, u, c) { I.value = -1; } function B() { h.value = !0; } function g() { h.value = !1; } function O() { l.value = -1, e.value = ""; } return { activeIndex: l, focusedItemId: p, hoverIndex: I, clearActiveItem: O, onMouseenterItem: a, onMouseoverItem: i, onMouseoutItem: m, resumeHover: g, suspendHover: B }; } function $e(e, l, p, I) { const h = v(e.idField), { dataView: a } = p, i = v(-1), m = v(!1), { activeIndex: B, focusedItemId: g, hoverIndex: O, resumeHover: C, suspendHover: u } = I; let c, F = 0, S = 0; function y(r, o) { const n = r - F, s = o - S; c.style.left = parseInt(c.style.left) + n + "px", c.style.top = parseInt(c.style.top) + s + "px", F = r, S = o; } function D(r) { const { left: o, top: n } = r.getBoundingClientRect(), s = r.cloneNode(!0); return s.style.cssText = ` position:absolute; left:${o}px; top:${document.documentElement.scrollTop ? n + document.documentElement.scrollTop : n}px; z-index: 999999; border: 1px solid #e2e3e5; pointer-events: none; background-color: #edf5ff; border-radius: 10px; margin: 4px 2px; display: flex; align-items: center; float: none; text-align: initial; width:${getComputedStyle(r).width}; height:${getComputedStyle(r).height}; `, s.children[0].style.cssText = "overflow: hidden;flex: 1 1 auto;width: 100%;", s.children[0].children[0].style.cssText = ` margin: 10px 0px 10px 14px; overflow: hidden;text-overflow: ellipsis;white-space: nowrap; `, s.children[1].style.cssText = "width: 30px;color: #f4625f;padding: 0 14px 0 0", s.children[2].style.cssText = "padding: 0 14px 0 0;", document.body.appendChild(s), s; } function k(r, o, n) { if (r.stopPropagation(), u(), o) { if (c = D(r.target), r.dataTransfer) { const s = new Image(); s.src = "", r.dataTransfer.setDragImage(s, 0, 0); } F = r.pageX, S = r.pageY, setTimeout(() => { i.value = n, m.value = !0, o.moving = !0; }); } } function T(r, o) { if (r.preventDefault(), i.value !== o) { const n = a.value[i.value], s = a.value; s.splice(i.value, 1), s.splice(o, 0, n), i.value = o, y(r.pageX, r.pageY); } } function H(r) { r.preventDefault(), r.dataTransfer && (r.dataTransfer.dropEffect = "move"), y(r.pageX, r.pageY); } function j(r, o) { o && (o.moving = !1, c && (document.body.removeChild(c), c = null)), a.value.forEach((n, s) => { n.__fv_index__ = s; }), m.value = !1, C(), O.value = o.raw.__fv_index__, B.value = o.raw.__fv_index__, g.value = o.raw[h.value], l.emit("change", a.value), l.emit("activeChange", [o.raw]); } return { dragstart: k, dragenter: T, dragover: H, dragend: j, isDragging: m }; } function qe(e, l, p, I, h, a) { const i = v(e.idField), m = v(e.disableField), B = v(e.draggable); v(e.itemClass); const g = v(e.selection.multiSelect ?? !1), O = v(e.selection.multiSelectMode), { isDragging: C } = I, { activeIndex: u, focusedItemId: c, hoverIndex: F } = h, { clearSelection: S, getSelectedItems: y, toggleSelectItem: D, currentSelectedDataId: k } = a, T = v(y()), H = (w) => T.value.length === 0 ? !1 : T.value.some((d) => { let f = ""; return d.data ? f = d.data[i.value] : f = d[i.value], f === w; }); function j() { T.value = y(); } function r(w, d) { return w.raw[i.value] != null ? w.raw[i.value] : ""; } function o(w, d) { const f = { "f-list-view-group-item": !0, "f-list-view-draggable-item": B.value, "f-un-click": !w.checked, "f-un-select": !!w.raw[m.value], "f-listview-active": ( // 多选 g.value && H(r(w)) || // 单选 !g.value && w.raw[i.value] === k.value ), "f-listview-hover": !C.value && d === F.value, moving: !!w.moving }; if (typeof e.itemClass == "string") return N(f, e.itemClass); if (typeof e.itemClass == "function") { const x = e.itemClass(w); return N(f, x); } return f; } function n(w, d) { const f = ( // 多选 g.value && H(r(w)) || // 单选 !g.value && w.raw[i.value] === k.value ), x = {}; if (f && (x.backgroundColor = "#dae9ff"), typeof e.itemStyle == "string") return $(x, e.itemStyle); if (typeof e.itemStyle == "function") { const b = e.itemStyle(w); return $(x, b); } return x; } const s = P(() => !g.value); function R(w, d, f) { w.checked = f, !w.raw[m.value] && (s.value && (c.value = w.raw[i.value]), D(w)); } const M = P(() => g.value && O.value === "OnCheckClearByClick"), L = P(() => !g.value || g.value && (O.value === "OnCheckAndClick" || O.value === "OnClick")); function A(w, d, f) { if (w.raw[m.value]) { f == null || f.preventDefault(), f == null || f.stopPropagation(); return; } c.value = w.raw[i.value], u.value = d, M.value && S(), L.value && (D(w), j()), l.emit("clickItem", { data: T.value, index: d, dataItem: w.raw }), l.emit("activeChange", T.value); } return { getKey: r, selectedItems: T, listViewItemClass: o, listViewItemStyle: n, updateSelectedItems: j, onCheckItem: R, onClickItem: A }; } const z = /* @__PURE__ */ ee({ name: "FListView", props: te, emits: ["afterSearch", "checkValuesChange", "clickItem", "selectItem", "unSelectItem", "selectionChange", "removeItem", "change", "activeChange", "pageIndexChanged", "pageSizeChanged", "changed"], setup(e, l) { const p = v(), I = v(!0), h = v(!1), a = v([]), i = 0, m = v(e.columns), B = Ie(e, l), g = Se(e), O = ke(e), C = be(e, g), u = Ve(e, /* @__PURE__ */ new Map(), B, O, g), c = Fe(e, u, g, a, l), F = Ee(e, p), S = De(e, u), y = P(() => u.dataView.value.length), D = Me(e, l, c, g), k = Oe(e, l, g, D, a), T = Te(e), H = Re(e, {}, T), j = Be(e, u, k, O, g, T, H), r = He(e, g, H, j), o = xe(e, g, H, j), n = Pe(e, m, u, y, i, j, r, o), { getVisualData: s } = n; a.value = s(0, y.value + i - 1); const R = P(() => { const V = { "f-list-view": !0, "f-list-view-multiple": e.multiSelect }; return e.size !== "default" && (V[`${e.size}-item`] = !0), N(V, e.customClass); }), M = P(() => !!l.slots.footer || I.value); function L() { return e.header === "SearchBar" ? J : e.header === "ContentHeader" ? Xe : J; } const A = L(), { renderHeader: w } = A(e, l, F), d = Ye(), f = $e(e, l, u, d), x = qe(e, l, a, f, d, c), { renderListArea: b } = Ue(e, l, a, u, C, d, c, n, x, f); function ne(V) { F.search(V); } function le(V) { V && (u.load(V), a.value = s(0, y.value + i - 1)); } function ae() { c.clearSelection(), d.clearActiveItem(); } function oe() { return x.selectedItems.value; } function se() { return x.selectedItems.value.map((V) => V[g.idField.value]); } function K(V) { c.selectedValues.value = V, x.updateSelectedItems(); } function ie() { return c.currentSelectedDataId.value; } function ue(V) { D.activeRowById(V); } function ce(V) { const _ = g.idField.value, U = a.value.find((E) => E.raw[_] === V), X = a.value.findIndex((E) => E.raw[_] === V); U && X > -1 && x.onClickItem(U, X); } function re(V) { S.updatePagination(V); } function de(V) { return a.value.filter((_) => V.includes(_.raw[e.idField])); } l.expose({ search: ne, updateDataSource: le, clearSelection: ae, getSelections: oe, updateSelectionByIds: K, getSelectionIds: se, activeRowById: ue, getCurrentRowId: ie, clickRowItemById: ce, updatePagination: re, getVisibleDataByIds: de }); function fe(V) { e.multiSelect && (V.preventDefault(), V.stopPropagation()); } Z(() => e.selectionValues, (V, _) => { V !== _ && K(V); }); const ve = je(e, c), { sidebarWidth: me, showSidebarCheckBox: Je } = ve, ge = Le(e, l), { applyColumnSorter: Qe, columnContext: he, updateColumnRenderContext: Ze } = ge, Ce = _e(e, u, a, he, n, y, i, me, k); return Ae(e, l, u, Ce, S, c), () => t("div", { class: R.value, onClick: fe }, [w(), t("div", { ref: p, class: "f-list-view-content", onMouseover: () => { h.value = !0; }, onMouseleave: () => { h.value = !1; } }, [b()]), M.value && t("div", { class: "f-list-view-footer" }, [e.footerTemplate ? e.footerTemplate() : l.slots.footer && l.slots.footer()])]); } }), Q = /* @__PURE__ */ ee({ name: "FListViewTable", props: te, emits: ["outputValue", "currentEvent", "selectionChanged"], setup(e, l) { const p = [{ name: "任芳", code: "1.PO20198989001", date: "2024-02-19", desc: "导游1", amount: 63.85, avatar: "./assets/avatar1.png" }, { name: "戴秀兰", code: "2.PO20198989002", date: "2024-03-17", desc: "导游2", amount: 60.13, avatar: "./assets/avatar2.png" }, { name: "尹磊", code: "3.PO20198989003", date: "2024-04-09", desc: "导游3", amount: 36.54, avatar: "./assets/avatar3.png" }, { name: "赵明", code: "4.PO20198989004", date: "2024-03-27", desc: "导游4", amount: 52.76, avatar: "./assets/avatar4.png" }, { name: "吕洋", code: "5.PO20198989005", date: "2024-11-17", desc: "导游5", amount: 84.13, avatar: "./assets/avatar5.png" }], I = P(() => e.data.length > 0 ? e.data : p); return () => { var h; return t(G, null, [(h = I.value) == null ? void 0 : h.map((a) => t("div", { class: "f-template-listview-row" }, [t("div", { class: "list-view-item-title" }, [t("div", { class: "item-title-img" }, [t("img", { src: a.avatar, alt: "", style: "width: 44px;" }, null)]), t("div", { class: "item-title" }, [t("p", { class: "item-title-heading" }, [a.code]), t("p", { class: "item-title-text" }, [a.desc])])]), t("div", { class: "list-view-item-content" }, [t("div", { class: "content-message" }, [t("div", { class: "ower" }, [t("p", null, [Y("创建人")]), t("p", { class: "con" }, [a.name])]), t("div", { class: "date" }, [t("p", null, [Y("创建时间")]), t("p", { class: "con" }, [a.date])])])])]))]); }; } }); z.install = (e) => { e.component(z.name, z), e.component(Q.name, Q); }; export { z as FListView, Q as FListViewTable, z as default, te as listViewProps };