UNPKG

vuux

Version:

Vue3 Nuxt3 Nuxt4 组件库

140 lines (139 loc) 3.98 kB
import { ref as v, computed as N, watch as S, onMounted as B } from "vue"; import { Utils as L } from "@vuux/utils"; const T = (e, D, h) => { const f = v(!1), O = N(() => e.modelValue != "" && e.modelValue != null), k = () => { e.disabled || (f.value = !f.value); }, m = v(!1), c = v([]), C = N(() => ({ "app-cascader": !0, "is-opend": f.value, "is-disabled": e.disabled ? e.disabled : !1, "has-content": O.value })), J = (a) => { let l = 0; if (e.fields) { const d = (t, u) => { for (let n = 0; n < t.length; n++) { const i = t[n]; u > l && (l = u), i[e.fields.children] && i[e.fields.children].length > 0 && d(i[e.fields.children], u + 1); } }; d(a, 1); } return l; }, x = (a, l) => { const d = []; if (e.fields) for (let t = 0; t < a.length; t++) { const u = a[t]; d.push({ value: u[e.fields.value], label: u[e.fields.label], children: u[e.fields.children] ?? !1, orginData: u }); } return d; }, r = v(), g = (a, l, d) => { const t = a[d].data, u = a[d].selectIndex, n = t[u]; n && l.push(n), n && n.children && n.children.length > 0 && g(a, l, d + 1); }, V = (a, l, d, t = null) => { c.value[d].selectIndex = l, a.children && a.children.length > 0 && (c.value[d + 1].selectIndex = null, c.value[d + 1].data = x(a.children)); const u = d + 2; for (let n = u; n < c.value.length; n++) c.value[n].selectIndex = null, c.value[n].data = []; if (!a.children || a.children.length === 0) { const n = []; g(c.value, n, 0); const i = n.map((s) => s.label).join(`${e.decollator}`); if (!e.last) r.value = i; else { const s = n.map((w) => w.label); r.value = s[s.length - 1]; } const o = n.map((s) => s.value).join(e.decollator); if (t === "click" && (e.last ? h("update:modelValue", o.split(e.decollator).at(-1)) : h("update:modelValue", o.split(e.decollator)), f.value = !1), t === "click" && m.value) { const s = { display: r.value, value: o, label: i, currentSelect: JSON.parse(JSON.stringify(a.orginData)) }; h("change", s); } } }, M = (a, l) => { const d = (t, u) => { const n = [...u, t.value]; if (t.value === l) return n; if (t.children) for (const i of t.children) { const o = d(i, n); if (o) return o; } return null; }; for (const t of a) { const u = d(t, []); if (u) return u; } return []; }, b = () => { if (e.modelValue) { let a = e.modelValue; typeof e.modelValue == "string" && (a = M(e.data, e.modelValue)); for (let l = 0; l < a.length; l++) { const d = a[l], t = c.value[l].data.findIndex((u) => u.value === d); if (t == -1) break; V(c.value[l].data[t], t, l); } } }, I = () => { const a = J(e.data); for (let l = 0; l < a; l++) l == 0 ? c.value[0] = { selectIndex: null, data: x(e.data) } : c.value[l] = { selectIndex: null, data: [] }; b(); }, y = () => { r.value = ""; const a = JSON.parse(JSON.stringify(c.value)); for (let l = 0; l < a.length; l++) a[l].selectIndex = null, l !== 0 && (a[l].data = []); c.value = a, h("update:modelValue", void 0); }; return L.useClickOutside(D, () => { e.disabled || (f.value = !1); }), S( () => e.data, () => { I(); } ), S( () => e.modelValue, () => { e.modelValue === null || e.modelValue === "" ? y() : b(); } ), B(() => { I(), m.value = !0; }), { openState: f, treeData: c, classNames: C, displayValue: r, handleOpen: k, handleSelectBar: V, handleClear: y }; }; export { T as useCascader };