@night-owl-elite/vue-select 0.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 +5 -0
- package/dist/vite.svg +1 -0
- package/dist/vite.svg:Zone.Identifier +0 -0
- package/dist/vue-select.css +1 -0
- package/dist/vue-select.es.js +406 -0
- package/dist/vue-select.umd.js +1 -0
- package/package.json +31 -0
package/README.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Vue 3 + Vite
|
|
2
|
+
|
|
3
|
+
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
|
|
4
|
+
|
|
5
|
+
Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).
|
package/dist/vite.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.list-group-item[data-v-303c37e7]{cursor:pointer;border:0;border-radius:0;padding-top:.5rem;padding-bottom:.5rem}.expander-icon[data-v-303c37e7]{width:1em;transition:transform .2s ease-in-out;color:#6c757d}.expander-placeholder[data-v-303c37e7]{display:inline-block;width:1em}.rotate-90[data-v-303c37e7]{transform:rotate(90deg)}.item-content[data-v-303c37e7]{flex-grow:1}.tree-select-main[data-v-9f38e289]{--bs-form-select-bg-img: none;display:block;width:100%;padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm);font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.tree-select-display-text[data-v-9f38e289]{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.clear-icon[data-v-9f38e289]{cursor:pointer;opacity:.6;transition:opacity .2s ease}.clear-icon[data-v-9f38e289]:hover{opacity:1}.transition-transform[data-v-9f38e289]{transition:transform .2s ease-in-out}.rotate-180[data-v-9f38e289]{transform:rotate(180deg)}.tree-select-dropdown[data-v-9f38e289]{position:absolute;background:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.375rem}.tree-select-body[data-v-9f38e289]::-webkit-scrollbar{width:6px}.tree-select-body[data-v-9f38e289]::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.tree-select-body[data-v-9f38e289]::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.tree-select-body[data-v-9f38e289]::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.is-loading[data-v-9f38e289]{cursor:wait}.loading-icon[data-v-9f38e289]{opacity:.7}@media (max-width: 576px){.tree-select-dropdown[data-v-9f38e289]{max-width:90vw;left:0!important;right:0!important;margin:0 auto}}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { computed as C, resolveComponent as ne, createElementBlock as u, openBlock as d, createElementVNode as S, createCommentVNode as w, normalizeStyle as ie, normalizeClass as T, createBlock as L, unref as I, withModifiers as D, renderSlot as N, Fragment as J, renderList as Q, withCtx as W, ref as A, onMounted as se, onUnmounted as ae, watch as oe, toDisplayString as z, withDirectives as de, vModelText as re, createVNode as U, createTextVNode as G, nextTick as H } from "vue";
|
|
2
|
+
import { createPopper as ce } from "@popperjs/core";
|
|
3
|
+
import { FontAwesomeIcon as V } from "@fortawesome/vue-fontawesome";
|
|
4
|
+
const X = (t, B) => {
|
|
5
|
+
const l = t.__vccOpts || t;
|
|
6
|
+
for (const [m, f] of B)
|
|
7
|
+
l[m] = f;
|
|
8
|
+
return l;
|
|
9
|
+
}, ue = { class: "tree-select-item-wrapper" }, me = {
|
|
10
|
+
key: 1,
|
|
11
|
+
class: "expander-placeholder"
|
|
12
|
+
}, fe = ["checked", ".indeterminate", "disabled"], he = { class: "item-content text-truncate" }, pe = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "children-wrapper"
|
|
15
|
+
}, ve = {
|
|
16
|
+
__name: "TreeSelectItem",
|
|
17
|
+
props: {
|
|
18
|
+
item: { type: Object, required: !0 },
|
|
19
|
+
level: { type: Number, required: !0 },
|
|
20
|
+
selectedItems: { type: Array, required: !0 },
|
|
21
|
+
expandedItems: { type: Set, required: !0 },
|
|
22
|
+
multiple: { type: Boolean, required: !0 },
|
|
23
|
+
selectAll: { type: Boolean, required: !0 },
|
|
24
|
+
selectMode: { type: String, required: !0 },
|
|
25
|
+
optionLabel: { type: String, required: !0 },
|
|
26
|
+
optionValue: { type: String, required: !0 },
|
|
27
|
+
disabledKey: { type: String, default: null }
|
|
28
|
+
},
|
|
29
|
+
emits: ["select", "toggle-expand"],
|
|
30
|
+
setup(t, { emit: B }) {
|
|
31
|
+
const l = t, m = (o) => o[l.optionValue] || o.id || o.value, f = (o) => !l.disabledKey || !o ? !1 : o.hasOwnProperty(l.disabledKey) && o[l.disabledKey] !== null, y = C(() => l.item.children && l.item.children.length > 0), p = C(() => l.expandedItems.has(m(l.item))), v = C(() => l.selectedItems.includes(m(l.item))), b = (o) => {
|
|
32
|
+
let a = [];
|
|
33
|
+
return o.children && o.children.forEach((x) => {
|
|
34
|
+
a.push(m(x)), a.push(...b(x));
|
|
35
|
+
}), a;
|
|
36
|
+
}, $ = C(() => !l.multiple || !l.selectAll || !y.value || v.value ? !1 : b(l.item).some((a) => l.selectedItems.includes(a)));
|
|
37
|
+
return (o, a) => {
|
|
38
|
+
const x = ne("TreeSelectItem", !0);
|
|
39
|
+
return d(), u("div", ue, [
|
|
40
|
+
S("div", {
|
|
41
|
+
class: T(["list-group-item list-group-item-action d-flex align-items-center gap-2", {
|
|
42
|
+
"bg-primary": v.value,
|
|
43
|
+
disabled: f(t.item)
|
|
44
|
+
}]),
|
|
45
|
+
style: ie({ "padding-left": `${t.level * 1.5 + 1}rem` }),
|
|
46
|
+
onClick: a[2] || (a[2] = (c) => o.$emit("select", t.item))
|
|
47
|
+
}, [
|
|
48
|
+
y.value ? (d(), L(I(V), {
|
|
49
|
+
key: 0,
|
|
50
|
+
icon: "chevron-right",
|
|
51
|
+
class: T(["expander-icon", { "rotate-90": p.value }]),
|
|
52
|
+
onClick: a[0] || (a[0] = D((c) => o.$emit("toggle-expand", m(t.item)), ["stop"]))
|
|
53
|
+
}, null, 8, ["class"])) : (d(), u("span", me)),
|
|
54
|
+
t.multiple && t.selectMode === "checkbox" ? (d(), u("input", {
|
|
55
|
+
key: 2,
|
|
56
|
+
type: "checkbox",
|
|
57
|
+
class: "form-check-input",
|
|
58
|
+
checked: v.value,
|
|
59
|
+
".indeterminate": $.value,
|
|
60
|
+
disabled: f(t.item),
|
|
61
|
+
onClick: a[1] || (a[1] = D((c) => o.$emit("select", t.item), ["stop"]))
|
|
62
|
+
}, null, 40, fe)) : w("", !0),
|
|
63
|
+
S("div", he, [
|
|
64
|
+
N(o.$slots, "default", {
|
|
65
|
+
item: t.item,
|
|
66
|
+
level: t.level
|
|
67
|
+
}, void 0, !0)
|
|
68
|
+
])
|
|
69
|
+
], 6),
|
|
70
|
+
y.value && p.value ? (d(), u("div", pe, [
|
|
71
|
+
(d(!0), u(J, null, Q(t.item.children, (c) => (d(), L(x, {
|
|
72
|
+
key: m(c),
|
|
73
|
+
item: c,
|
|
74
|
+
level: t.level + 1,
|
|
75
|
+
"selected-items": t.selectedItems,
|
|
76
|
+
"expanded-items": t.expandedItems,
|
|
77
|
+
multiple: t.multiple,
|
|
78
|
+
"select-all": t.selectAll,
|
|
79
|
+
"select-mode": t.selectMode,
|
|
80
|
+
"option-label": t.optionLabel,
|
|
81
|
+
"option-value": t.optionValue,
|
|
82
|
+
"disabled-key": t.disabledKey,
|
|
83
|
+
onSelect: a[3] || (a[3] = (k) => o.$emit("select", k)),
|
|
84
|
+
onToggleExpand: a[4] || (a[4] = (k) => o.$emit("toggle-expand", k))
|
|
85
|
+
}, {
|
|
86
|
+
default: W(({ item: k, level: E }) => [
|
|
87
|
+
N(o.$slots, "default", {
|
|
88
|
+
item: k,
|
|
89
|
+
level: E
|
|
90
|
+
}, void 0, !0)
|
|
91
|
+
]),
|
|
92
|
+
_: 2
|
|
93
|
+
}, 1032, ["item", "level", "selected-items", "expanded-items", "multiple", "select-all", "select-mode", "option-label", "option-value", "disabled-key"]))), 128))
|
|
94
|
+
])) : w("", !0)
|
|
95
|
+
]);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}, ge = /* @__PURE__ */ X(ve, [["__scopeId", "data-v-303c37e7"]]), ye = { class: "tree-select-wrapper" }, be = ["disabled"], xe = { class: "tree-select-display-text text-truncate me-2 text-start" }, ke = { class: "d-flex align-items-center gap-2" }, Se = {
|
|
99
|
+
key: 0,
|
|
100
|
+
class: "p-2 border-bottom"
|
|
101
|
+
}, we = {
|
|
102
|
+
key: 1,
|
|
103
|
+
class: "p-4 text-muted text-center"
|
|
104
|
+
}, Ie = {
|
|
105
|
+
key: 2,
|
|
106
|
+
class: "tree-select-body",
|
|
107
|
+
style: { "max-height": "300px", "overflow-y": "auto" }
|
|
108
|
+
}, Ve = {
|
|
109
|
+
key: 0,
|
|
110
|
+
class: "list-group list-group-flush"
|
|
111
|
+
}, Le = { class: "d-flex align-items-center gap-2" }, Ce = {
|
|
112
|
+
key: 1,
|
|
113
|
+
class: "p-3 text-muted text-center"
|
|
114
|
+
}, $e = {
|
|
115
|
+
__name: "TreeSelectMain",
|
|
116
|
+
props: {
|
|
117
|
+
modelValue: {
|
|
118
|
+
type: [String, Number, Array],
|
|
119
|
+
default: null
|
|
120
|
+
},
|
|
121
|
+
items: {
|
|
122
|
+
type: Array,
|
|
123
|
+
default: () => []
|
|
124
|
+
},
|
|
125
|
+
multiple: {
|
|
126
|
+
type: Boolean,
|
|
127
|
+
default: !1
|
|
128
|
+
},
|
|
129
|
+
selectMode: {
|
|
130
|
+
type: String,
|
|
131
|
+
default: "checkbox",
|
|
132
|
+
// 'checkbox' or 'highlight'
|
|
133
|
+
validator: (t) => ["checkbox", "highlight"].includes(t)
|
|
134
|
+
},
|
|
135
|
+
placeholder: {
|
|
136
|
+
type: String,
|
|
137
|
+
default: "Select item..."
|
|
138
|
+
},
|
|
139
|
+
isInvalid: {
|
|
140
|
+
type: Boolean,
|
|
141
|
+
default: !1
|
|
142
|
+
},
|
|
143
|
+
disabled: {
|
|
144
|
+
type: Boolean,
|
|
145
|
+
default: !1
|
|
146
|
+
},
|
|
147
|
+
searchable: {
|
|
148
|
+
type: Boolean,
|
|
149
|
+
default: !0
|
|
150
|
+
},
|
|
151
|
+
isLoading: {
|
|
152
|
+
type: Boolean,
|
|
153
|
+
default: !1
|
|
154
|
+
},
|
|
155
|
+
showClearButton: {
|
|
156
|
+
type: Boolean,
|
|
157
|
+
default: !0
|
|
158
|
+
},
|
|
159
|
+
selectAll: {
|
|
160
|
+
type: Boolean,
|
|
161
|
+
default: !1
|
|
162
|
+
},
|
|
163
|
+
optionLabel: {
|
|
164
|
+
type: String,
|
|
165
|
+
default: "value"
|
|
166
|
+
},
|
|
167
|
+
optionValue: {
|
|
168
|
+
type: String,
|
|
169
|
+
default: "code"
|
|
170
|
+
},
|
|
171
|
+
disabledKey: {
|
|
172
|
+
type: String,
|
|
173
|
+
default: null
|
|
174
|
+
},
|
|
175
|
+
excludeFromSelectedListKey: {
|
|
176
|
+
type: String,
|
|
177
|
+
default: null
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
emits: ["update:modelValue", "change"],
|
|
181
|
+
setup(t, { emit: B }) {
|
|
182
|
+
const l = t, m = B, f = A(null), y = A(null), p = A(""), v = A(!1), b = A(/* @__PURE__ */ new Set()), $ = A(null), o = (e) => e[l.optionLabel] || e.label || e.name || "", a = (e) => e[l.optionValue] || e.id || e.value, x = (e) => !l.disabledKey || !e ? !1 : e.hasOwnProperty(l.disabledKey) && e[l.disabledKey] !== null, c = (e) => e.children && e.children.length > 0, k = (e, i = l.items) => {
|
|
183
|
+
for (const n of i) {
|
|
184
|
+
if (a(n) === e) return n;
|
|
185
|
+
if (c(n)) {
|
|
186
|
+
const s = k(e, n.children);
|
|
187
|
+
if (s) return s;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
}, E = (e) => {
|
|
192
|
+
const i = [];
|
|
193
|
+
return c(e) && e.children.forEach((n) => {
|
|
194
|
+
x(n) || (i.push(a(n)), i.push(...E(n)));
|
|
195
|
+
}), i;
|
|
196
|
+
}, O = (e, i = l.items, n = []) => {
|
|
197
|
+
for (const s of i) {
|
|
198
|
+
if (a(s) === e) return n;
|
|
199
|
+
if (c(s)) {
|
|
200
|
+
const r = O(e, s.children, [...n, a(s)]);
|
|
201
|
+
if (r) return r;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}, K = C(() => {
|
|
206
|
+
const e = new Set(Array.isArray(l.modelValue) ? l.modelValue : [l.modelValue].filter(Boolean));
|
|
207
|
+
if (l.multiple && l.selectAll) {
|
|
208
|
+
const i = (n) => {
|
|
209
|
+
n.forEach((s) => {
|
|
210
|
+
if (c(s)) {
|
|
211
|
+
const r = s.children.filter((g) => !x(g));
|
|
212
|
+
r.length > 0 && r.every((g) => e.has(a(g))) && e.add(a(s)), i(s.children);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
i(l.items);
|
|
217
|
+
}
|
|
218
|
+
return Array.from(e);
|
|
219
|
+
}), M = (e, i = l.items, n = []) => {
|
|
220
|
+
for (const s of i) {
|
|
221
|
+
const r = [...n, o(s)];
|
|
222
|
+
if (a(s) === e) return r;
|
|
223
|
+
if (c(s)) {
|
|
224
|
+
const h = M(e, s.children, r);
|
|
225
|
+
if (h) return h;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}, F = (e) => {
|
|
230
|
+
if (!e || e.length === 0) return "";
|
|
231
|
+
const i = e.join(" → ");
|
|
232
|
+
return i.length <= 40 ? i : e.length > 2 ? `${e[0]} → ... → ${e[e.length - 1]}` : i;
|
|
233
|
+
}, Y = C(() => {
|
|
234
|
+
const e = Array.isArray(l.modelValue) ? l.modelValue : [l.modelValue].filter(Boolean);
|
|
235
|
+
if (e.length === 0) return l.placeholder;
|
|
236
|
+
if (l.multiple) {
|
|
237
|
+
if (e.length === 1) {
|
|
238
|
+
const n = M(e[0]);
|
|
239
|
+
return n ? F(n) : e[0];
|
|
240
|
+
}
|
|
241
|
+
return `${e.length} items selected`;
|
|
242
|
+
}
|
|
243
|
+
const i = M(e[0]);
|
|
244
|
+
return i ? F(i) : e[0];
|
|
245
|
+
}), R = (e, i) => e.map((n) => {
|
|
246
|
+
const s = o(n).toLowerCase().includes(i);
|
|
247
|
+
let r = [];
|
|
248
|
+
return c(n) && (r = R(n.children, i)), s || r.length > 0 ? { ...n, children: r } : null;
|
|
249
|
+
}).filter(Boolean), q = C(() => p.value.trim() ? R(l.items, p.value.toLowerCase()) : l.items), Z = (e) => {
|
|
250
|
+
if (x(e)) return;
|
|
251
|
+
const i = a(e);
|
|
252
|
+
let n = new Set(K.value);
|
|
253
|
+
if (l.multiple) {
|
|
254
|
+
const r = n.has(i);
|
|
255
|
+
if (l.selectAll && c(e)) {
|
|
256
|
+
const h = E(e);
|
|
257
|
+
r ? (n.delete(i), h.forEach((g) => n.delete(g))) : (n.add(i), h.forEach((g) => n.add(g)));
|
|
258
|
+
} else
|
|
259
|
+
r ? (n.delete(i), l.selectAll && O(i)?.forEach((g) => n.delete(g))) : n.add(i);
|
|
260
|
+
} else
|
|
261
|
+
n = /* @__PURE__ */ new Set([i]), P();
|
|
262
|
+
let s = Array.from(n);
|
|
263
|
+
l.multiple && l.excludeFromSelectedListKey && (s = s.filter((r) => {
|
|
264
|
+
const h = k(r);
|
|
265
|
+
return !h || !h[l.excludeFromSelectedListKey];
|
|
266
|
+
})), m("update:modelValue", l.multiple ? s : s[0] || null), m("change", l.multiple ? s : s[0] || null);
|
|
267
|
+
}, _ = (e) => {
|
|
268
|
+
b.value.has(e) ? b.value.delete(e) : b.value.add(e);
|
|
269
|
+
}, ee = () => {
|
|
270
|
+
const e = l.multiple ? [] : null;
|
|
271
|
+
m("update:modelValue", e), m("change", e);
|
|
272
|
+
}, te = async () => {
|
|
273
|
+
l.disabled || (v.value = !0, await H(), f.value && y.value && ($.value = ce(y.value, f.value, {
|
|
274
|
+
placement: "bottom-start",
|
|
275
|
+
strategy: "fixed",
|
|
276
|
+
modifiers: [
|
|
277
|
+
{ name: "offset", options: { offset: [0, 4] } },
|
|
278
|
+
{ name: "preventOverflow", options: { padding: 8 } },
|
|
279
|
+
{ name: "flip", options: { fallbackPlacements: ["top-start"] } }
|
|
280
|
+
]
|
|
281
|
+
})), l.searchable && (await H(), f.value?.querySelector(".tree-search-input")?.focus()));
|
|
282
|
+
}, P = () => {
|
|
283
|
+
v.value = !1, p.value = "", $.value?.destroy(), $.value = null;
|
|
284
|
+
}, le = () => v.value ? P() : te(), j = (e) => {
|
|
285
|
+
!y.value?.contains(e.target) && !f.value?.contains(e.target) && P();
|
|
286
|
+
};
|
|
287
|
+
return se(() => document.addEventListener("click", j)), ae(() => {
|
|
288
|
+
document.removeEventListener("click", j), $.value?.destroy();
|
|
289
|
+
}), oe(p, (e) => {
|
|
290
|
+
if (e.trim()) {
|
|
291
|
+
const i = (n) => {
|
|
292
|
+
n.forEach((s) => {
|
|
293
|
+
c(s) && (b.value.add(a(s)), i(s.children));
|
|
294
|
+
});
|
|
295
|
+
};
|
|
296
|
+
i(q.value);
|
|
297
|
+
}
|
|
298
|
+
}), (e, i) => (d(), u("div", ye, [
|
|
299
|
+
S("button", {
|
|
300
|
+
ref_key: "triggerRef",
|
|
301
|
+
ref: y,
|
|
302
|
+
type: "button",
|
|
303
|
+
class: T(["btn tree-select-trigger w-100 d-flex justify-content-between align-items-center tree-select-main sm", {
|
|
304
|
+
"btn-outline-secondary": !t.isInvalid,
|
|
305
|
+
"border-danger": t.isInvalid,
|
|
306
|
+
disabled: t.disabled || t.isLoading,
|
|
307
|
+
"is-loading": t.isLoading
|
|
308
|
+
}]),
|
|
309
|
+
disabled: t.disabled || t.isLoading,
|
|
310
|
+
onClick: le
|
|
311
|
+
}, [
|
|
312
|
+
S("span", xe, z(Y.value), 1),
|
|
313
|
+
S("div", ke, [
|
|
314
|
+
t.isLoading ? (d(), L(I(V), {
|
|
315
|
+
key: 0,
|
|
316
|
+
icon: "spinner",
|
|
317
|
+
spin: "",
|
|
318
|
+
class: "loading-icon"
|
|
319
|
+
})) : w("", !0),
|
|
320
|
+
t.showClearButton && K.value.length > 0 && !t.disabled && !t.isLoading ? (d(), L(I(V), {
|
|
321
|
+
key: 1,
|
|
322
|
+
icon: "times",
|
|
323
|
+
onClick: D(ee, ["stop"]),
|
|
324
|
+
class: "clear-icon"
|
|
325
|
+
})) : w("", !0),
|
|
326
|
+
t.isLoading ? w("", !0) : (d(), L(I(V), {
|
|
327
|
+
key: 2,
|
|
328
|
+
icon: "chevron-down",
|
|
329
|
+
class: T(["transition-transform", { "rotate-180": v.value }])
|
|
330
|
+
}, null, 8, ["class"]))
|
|
331
|
+
])
|
|
332
|
+
], 10, be),
|
|
333
|
+
v.value ? (d(), u("div", {
|
|
334
|
+
key: 0,
|
|
335
|
+
ref_key: "dropdownRef",
|
|
336
|
+
ref: f,
|
|
337
|
+
class: "tree-select-dropdown card shadow-lg border-0",
|
|
338
|
+
style: { "z-index": "1050", "min-width": "200px", "max-width": "400px" }
|
|
339
|
+
}, [
|
|
340
|
+
t.searchable ? (d(), u("div", Se, [
|
|
341
|
+
de(S("input", {
|
|
342
|
+
"onUpdate:modelValue": i[0] || (i[0] = (n) => p.value = n),
|
|
343
|
+
type: "text",
|
|
344
|
+
class: "form-control form-control-sm tree-search-input",
|
|
345
|
+
placeholder: "Search..."
|
|
346
|
+
}, null, 512), [
|
|
347
|
+
[re, p.value]
|
|
348
|
+
])
|
|
349
|
+
])) : w("", !0),
|
|
350
|
+
t.isLoading ? (d(), u("div", we, [
|
|
351
|
+
U(I(V), {
|
|
352
|
+
icon: "spinner",
|
|
353
|
+
spin: "",
|
|
354
|
+
class: "me-2"
|
|
355
|
+
}),
|
|
356
|
+
i[1] || (i[1] = S("span", null, "Loading...", -1))
|
|
357
|
+
])) : (d(), u("div", Ie, [
|
|
358
|
+
q.value.length > 0 ? (d(), u("div", Ve, [
|
|
359
|
+
(d(!0), u(J, null, Q(q.value, (n) => (d(), L(ge, {
|
|
360
|
+
key: a(n),
|
|
361
|
+
item: n,
|
|
362
|
+
level: 0,
|
|
363
|
+
"selected-items": K.value,
|
|
364
|
+
"expanded-items": b.value,
|
|
365
|
+
multiple: t.multiple,
|
|
366
|
+
"select-all": t.selectAll,
|
|
367
|
+
"select-mode": t.selectMode,
|
|
368
|
+
"option-label": t.optionLabel,
|
|
369
|
+
"option-value": t.optionValue,
|
|
370
|
+
"disabled-key": t.disabledKey,
|
|
371
|
+
onSelect: Z,
|
|
372
|
+
onToggleExpand: _
|
|
373
|
+
}, {
|
|
374
|
+
default: W(({ item: s, level: r }) => [
|
|
375
|
+
N(e.$slots, "default", {
|
|
376
|
+
item: s,
|
|
377
|
+
level: r
|
|
378
|
+
}, () => [
|
|
379
|
+
S("div", Le, [
|
|
380
|
+
G(z(o(s)) + " ", 1),
|
|
381
|
+
s.icon ? (d(), L(I(V), {
|
|
382
|
+
key: 0,
|
|
383
|
+
icon: s.icon
|
|
384
|
+
}, null, 8, ["icon"])) : w("", !0)
|
|
385
|
+
])
|
|
386
|
+
], !0)
|
|
387
|
+
]),
|
|
388
|
+
_: 2
|
|
389
|
+
}, 1032, ["item", "selected-items", "expanded-items", "multiple", "select-all", "select-mode", "option-label", "option-value", "disabled-key"]))), 128))
|
|
390
|
+
])) : (d(), u("div", Ce, [
|
|
391
|
+
U(I(V), { icon: "search" }),
|
|
392
|
+
i[2] || (i[2] = G(" No items found ", -1))
|
|
393
|
+
]))
|
|
394
|
+
]))
|
|
395
|
+
], 512)) : w("", !0)
|
|
396
|
+
]));
|
|
397
|
+
}
|
|
398
|
+
}, Ae = /* @__PURE__ */ X($e, [["__scopeId", "data-v-9f38e289"]]), Ke = {
|
|
399
|
+
install(t) {
|
|
400
|
+
t.component("TreeSelectMain", Ae);
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
export {
|
|
404
|
+
Ae as TreeSelectMain,
|
|
405
|
+
Ke as default
|
|
406
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(u,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@popperjs/core"),require("@fortawesome/vue-fontawesome")):typeof define=="function"&&define.amd?define(["exports","vue","@popperjs/core","@fortawesome/vue-fontawesome"],e):(u=typeof globalThis<"u"?globalThis:u||self,e(u.VueSelect={},u.Vue,u.Popper,u.VueFontAwesome))})(this,function(u,e,P,S){"use strict";const N=(l,w)=>{const n=l.__vccOpts||l;for(const[m,f]of w)n[m]=f;return n},D={class:"tree-select-item-wrapper"},O={key:1,class:"expander-placeholder"},j=["checked",".indeterminate","disabled"],F={class:"item-content text-truncate"},z={key:0,class:"children-wrapper"},R=N({__name:"TreeSelectItem",props:{item:{type:Object,required:!0},level:{type:Number,required:!0},selectedItems:{type:Array,required:!0},expandedItems:{type:Set,required:!0},multiple:{type:Boolean,required:!0},selectAll:{type:Boolean,required:!0},selectMode:{type:String,required:!0},optionLabel:{type:String,required:!0},optionValue:{type:String,required:!0},disabledKey:{type:String,default:null}},emits:["select","toggle-expand"],setup(l,{emit:w}){const n=l,m=r=>r[n.optionValue]||r.id||r.value,f=r=>!n.disabledKey||!r?!1:r.hasOwnProperty(n.disabledKey)&&r[n.disabledKey]!==null,k=e.computed(()=>n.item.children&&n.item.children.length>0),h=e.computed(()=>n.expandedItems.has(m(n.item))),g=e.computed(()=>n.selectedItems.includes(m(n.item))),b=r=>{let s=[];return r.children&&r.children.forEach(B=>{s.push(m(B)),s.push(...b(B))}),s},V=e.computed(()=>!n.multiple||!n.selectAll||!k.value||g.value?!1:b(n.item).some(s=>n.selectedItems.includes(s)));return(r,s)=>{const B=e.resolveComponent("TreeSelectItem",!0);return e.openBlock(),e.createElementBlock("div",D,[e.createElementVNode("div",{class:e.normalizeClass(["list-group-item list-group-item-action d-flex align-items-center gap-2",{"bg-primary":g.value,disabled:f(l.item)}]),style:e.normalizeStyle({"padding-left":`${l.level*1.5+1}rem`}),onClick:s[2]||(s[2]=d=>r.$emit("select",l.item))},[k.value?(e.openBlock(),e.createBlock(e.unref(S.FontAwesomeIcon),{key:0,icon:"chevron-right",class:e.normalizeClass(["expander-icon",{"rotate-90":h.value}]),onClick:s[0]||(s[0]=e.withModifiers(d=>r.$emit("toggle-expand",m(l.item)),["stop"]))},null,8,["class"])):(e.openBlock(),e.createElementBlock("span",O)),l.multiple&&l.selectMode==="checkbox"?(e.openBlock(),e.createElementBlock("input",{key:2,type:"checkbox",class:"form-check-input",checked:g.value,".indeterminate":V.value,disabled:f(l.item),onClick:s[1]||(s[1]=e.withModifiers(d=>r.$emit("select",l.item),["stop"]))},null,40,j)):e.createCommentVNode("",!0),e.createElementVNode("div",F,[e.renderSlot(r.$slots,"default",{item:l.item,level:l.level},void 0,!0)])],6),k.value&&h.value?(e.openBlock(),e.createElementBlock("div",z,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.item.children,d=>(e.openBlock(),e.createBlock(B,{key:m(d),item:d,level:l.level+1,"selected-items":l.selectedItems,"expanded-items":l.expandedItems,multiple:l.multiple,"select-all":l.selectAll,"select-mode":l.selectMode,"option-label":l.optionLabel,"option-value":l.optionValue,"disabled-key":l.disabledKey,onSelect:s[3]||(s[3]=x=>r.$emit("select",x)),onToggleExpand:s[4]||(s[4]=x=>r.$emit("toggle-expand",x))},{default:e.withCtx(({item:x,level:E})=>[e.renderSlot(r.$slots,"default",{item:x,level:E},void 0,!0)]),_:2},1032,["item","level","selected-items","expanded-items","multiple","select-all","select-mode","option-label","option-value","disabled-key"]))),128))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-303c37e7"]]),U={class:"tree-select-wrapper"},G=["disabled"],H={class:"tree-select-display-text text-truncate me-2 text-start"},J={class:"d-flex align-items-center gap-2"},Q={key:0,class:"p-2 border-bottom"},W={key:1,class:"p-4 text-muted text-center"},X={key:2,class:"tree-select-body",style:{"max-height":"300px","overflow-y":"auto"}},Y={key:0,class:"list-group list-group-flush"},Z={class:"d-flex align-items-center gap-2"},v={key:1,class:"p-3 text-muted text-center"},$=N({__name:"TreeSelectMain",props:{modelValue:{type:[String,Number,Array],default:null},items:{type:Array,default:()=>[]},multiple:{type:Boolean,default:!1},selectMode:{type:String,default:"checkbox",validator:l=>["checkbox","highlight"].includes(l)},placeholder:{type:String,default:"Select item..."},isInvalid:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},searchable:{type:Boolean,default:!0},isLoading:{type:Boolean,default:!1},showClearButton:{type:Boolean,default:!0},selectAll:{type:Boolean,default:!1},optionLabel:{type:String,default:"value"},optionValue:{type:String,default:"code"},disabledKey:{type:String,default:null},excludeFromSelectedListKey:{type:String,default:null}},emits:["update:modelValue","change"],setup(l,{emit:w}){const n=l,m=w,f=e.ref(null),k=e.ref(null),h=e.ref(""),g=e.ref(!1),b=e.ref(new Set),V=e.ref(null),r=t=>t[n.optionLabel]||t.label||t.name||"",s=t=>t[n.optionValue]||t.id||t.value,B=t=>!n.disabledKey||!t?!1:t.hasOwnProperty(n.disabledKey)&&t[n.disabledKey]!==null,d=t=>t.children&&t.children.length>0,x=(t,i=n.items)=>{for(const o of i){if(s(o)===t)return o;if(d(o)){const a=x(t,o.children);if(a)return a}}return null},E=t=>{const i=[];return d(t)&&t.children.forEach(o=>{B(o)||(i.push(s(o)),i.push(...E(o)))}),i},T=(t,i=n.items,o=[])=>{for(const a of i){if(s(a)===t)return o;if(d(a)){const c=T(t,a.children,[...o,s(a)]);if(c)return c}}return null},I=e.computed(()=>{const t=new Set(Array.isArray(n.modelValue)?n.modelValue:[n.modelValue].filter(Boolean));if(n.multiple&&n.selectAll){const i=o=>{o.forEach(a=>{if(d(a)){const c=a.children.filter(y=>!B(y));c.length>0&&c.every(y=>t.has(s(y)))&&t.add(s(a)),i(a.children)}})};i(n.items)}return Array.from(t)}),C=(t,i=n.items,o=[])=>{for(const a of i){const c=[...o,r(a)];if(s(a)===t)return c;if(d(a)){const p=C(t,a.children,c);if(p)return p}}return null},M=t=>{if(!t||t.length===0)return"";const i=t.join(" → ");return i.length<=40?i:t.length>2?`${t[0]} → ... → ${t[t.length-1]}`:i},ee=e.computed(()=>{const t=Array.isArray(n.modelValue)?n.modelValue:[n.modelValue].filter(Boolean);if(t.length===0)return n.placeholder;if(n.multiple){if(t.length===1){const o=C(t[0]);return o?M(o):t[0]}return`${t.length} items selected`}const i=C(t[0]);return i?M(i):t[0]}),q=(t,i)=>t.map(o=>{const a=r(o).toLowerCase().includes(i);let c=[];return d(o)&&(c=q(o.children,i)),a||c.length>0?{...o,children:c}:null}).filter(Boolean),A=e.computed(()=>h.value.trim()?q(n.items,h.value.toLowerCase()):n.items),te=t=>{if(B(t))return;const i=s(t);let o=new Set(I.value);if(n.multiple){const c=o.has(i);if(n.selectAll&&d(t)){const p=E(t);c?(o.delete(i),p.forEach(y=>o.delete(y))):(o.add(i),p.forEach(y=>o.add(y)))}else c?(o.delete(i),n.selectAll&&T(i)?.forEach(y=>o.delete(y))):o.add(i)}else o=new Set([i]),L();let a=Array.from(o);n.multiple&&n.excludeFromSelectedListKey&&(a=a.filter(c=>{const p=x(c);return!p||!p[n.excludeFromSelectedListKey]})),m("update:modelValue",n.multiple?a:a[0]||null),m("change",n.multiple?a:a[0]||null)},le=t=>{b.value.has(t)?b.value.delete(t):b.value.add(t)},ne=()=>{const t=n.multiple?[]:null;m("update:modelValue",t),m("change",t)},oe=async()=>{n.disabled||(g.value=!0,await e.nextTick(),f.value&&k.value&&(V.value=P.createPopper(k.value,f.value,{placement:"bottom-start",strategy:"fixed",modifiers:[{name:"offset",options:{offset:[0,4]}},{name:"preventOverflow",options:{padding:8}},{name:"flip",options:{fallbackPlacements:["top-start"]}}]})),n.searchable&&(await e.nextTick(),f.value?.querySelector(".tree-search-input")?.focus()))},L=()=>{g.value=!1,h.value="",V.value?.destroy(),V.value=null},ie=()=>g.value?L():oe(),K=t=>{!k.value?.contains(t.target)&&!f.value?.contains(t.target)&&L()};return e.onMounted(()=>document.addEventListener("click",K)),e.onUnmounted(()=>{document.removeEventListener("click",K),V.value?.destroy()}),e.watch(h,t=>{if(t.trim()){const i=o=>{o.forEach(a=>{d(a)&&(b.value.add(s(a)),i(a.children))})};i(A.value)}}),(t,i)=>(e.openBlock(),e.createElementBlock("div",U,[e.createElementVNode("button",{ref_key:"triggerRef",ref:k,type:"button",class:e.normalizeClass(["btn tree-select-trigger w-100 d-flex justify-content-between align-items-center tree-select-main sm",{"btn-outline-secondary":!l.isInvalid,"border-danger":l.isInvalid,disabled:l.disabled||l.isLoading,"is-loading":l.isLoading}]),disabled:l.disabled||l.isLoading,onClick:ie},[e.createElementVNode("span",H,e.toDisplayString(ee.value),1),e.createElementVNode("div",J,[l.isLoading?(e.openBlock(),e.createBlock(e.unref(S.FontAwesomeIcon),{key:0,icon:"spinner",spin:"",class:"loading-icon"})):e.createCommentVNode("",!0),l.showClearButton&&I.value.length>0&&!l.disabled&&!l.isLoading?(e.openBlock(),e.createBlock(e.unref(S.FontAwesomeIcon),{key:1,icon:"times",onClick:e.withModifiers(ne,["stop"]),class:"clear-icon"})):e.createCommentVNode("",!0),l.isLoading?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(S.FontAwesomeIcon),{key:2,icon:"chevron-down",class:e.normalizeClass(["transition-transform",{"rotate-180":g.value}])},null,8,["class"]))])],10,G),g.value?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"dropdownRef",ref:f,class:"tree-select-dropdown card shadow-lg border-0",style:{"z-index":"1050","min-width":"200px","max-width":"400px"}},[l.searchable?(e.openBlock(),e.createElementBlock("div",Q,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":i[0]||(i[0]=o=>h.value=o),type:"text",class:"form-control form-control-sm tree-search-input",placeholder:"Search..."},null,512),[[e.vModelText,h.value]])])):e.createCommentVNode("",!0),l.isLoading?(e.openBlock(),e.createElementBlock("div",W,[e.createVNode(e.unref(S.FontAwesomeIcon),{icon:"spinner",spin:"",class:"me-2"}),i[1]||(i[1]=e.createElementVNode("span",null,"Loading...",-1))])):(e.openBlock(),e.createElementBlock("div",X,[A.value.length>0?(e.openBlock(),e.createElementBlock("div",Y,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(A.value,o=>(e.openBlock(),e.createBlock(R,{key:s(o),item:o,level:0,"selected-items":I.value,"expanded-items":b.value,multiple:l.multiple,"select-all":l.selectAll,"select-mode":l.selectMode,"option-label":l.optionLabel,"option-value":l.optionValue,"disabled-key":l.disabledKey,onSelect:te,onToggleExpand:le},{default:e.withCtx(({item:a,level:c})=>[e.renderSlot(t.$slots,"default",{item:a,level:c},()=>[e.createElementVNode("div",Z,[e.createTextVNode(e.toDisplayString(r(a))+" ",1),a.icon?(e.openBlock(),e.createBlock(e.unref(S.FontAwesomeIcon),{key:0,icon:a.icon},null,8,["icon"])):e.createCommentVNode("",!0)])],!0)]),_:2},1032,["item","selected-items","expanded-items","multiple","select-all","select-mode","option-label","option-value","disabled-key"]))),128))])):(e.openBlock(),e.createElementBlock("div",v,[e.createVNode(e.unref(S.FontAwesomeIcon),{icon:"search"}),i[2]||(i[2]=e.createTextVNode(" No items found ",-1))]))]))],512)):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-9f38e289"]]),_={install(l){l.component("TreeSelectMain",$)}};u.TreeSelectMain=$,u.default=_,Object.defineProperties(u,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@night-owl-elite/vue-select",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "vite build",
|
|
9
|
+
"preview": "vite preview"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"vue": "^3.5.17",
|
|
16
|
+
"@fortawesome/fontawesome-free": "^6.7.2",
|
|
17
|
+
"@fortawesome/fontawesome-svg-core": "^6.7.2",
|
|
18
|
+
"@fortawesome/free-solid-svg-icons": "^6.7.2",
|
|
19
|
+
"@fortawesome/vue-fontawesome": "^3.0.8",
|
|
20
|
+
"@popperjs/core": "^2.11.8",
|
|
21
|
+
"bootstrap": "^5.3.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@vitejs/plugin-vue": "^6.0.0",
|
|
25
|
+
"vite": "^7.0.4"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"vue": "^3.2.0",
|
|
29
|
+
"bootstrap": "^5.3.0"
|
|
30
|
+
}
|
|
31
|
+
}
|