@night-owl-elite/vue-select 1.3.0 → 1.3.2

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 CHANGED
@@ -1,5 +1,102 @@
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).
1
+ # Vue 3 Tree Select Component
2
+
3
+ [![npm](https://img.shields.io/npm/v/@night-owl-elite/vue-select.svg)](https://www.npmjs.com/package/@night-owl-elite/vue-select)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ A feature-rich, accessible, and customizable tree-select component for Vue 3.
7
+
8
+ This component provides a powerful and flexible way to select single or multiple items from a hierarchical (tree) data structure. It includes searching, custom item rendering, "select all" functionality, and is styled with Bootstrap 5 and uses Font Awesome for icons.
9
+
10
+ ---
11
+
12
+ ### Features
13
+
14
+ ✅ **Single & Multiple Selection**: Easily switch between modes with the `multiple` prop.
15
+
16
+ ✅ **Two Selection UIs**: Choose between `checkbox` or `highlight` styles for selection.
17
+
18
+ ✅ **Search & Filtering**: A built-in search bar to filter tree nodes in real-time.
19
+
20
+ ✅ **"Select All" Children**: In `multiple` mode, click a parent to select/deselect all its descendants.
21
+
22
+ ✅ **Customizable Data Keys**: Specify which properties in your data objects to use for labels, values, and disabled states.
23
+
24
+ ✅ **Customizable Items**: Use scoped slots to take full control over how each tree item is rendered.
25
+
26
+ ✅ **Built with Bootstrap 5**: Seamlessly integrates with projects using the Bootstrap 5 framework.
27
+
28
+ ---
29
+
30
+ ### Installation
31
+
32
+ 1. **Install the package from npm:**
33
+ ```bash
34
+ npm install @night-owl-elite/vue-select
35
+ ```
36
+
37
+ 2. **Install Peer Dependencies:**
38
+ This component relies on Bootstrap for styling and dropdown functionality.
39
+ ```bash
40
+ npm install bootstrap @popperjs/core
41
+ ```
42
+
43
+ 3. **Import CSS & JS:**
44
+ Make sure to import Bootstrap's CSS and JS in your main entry file (e.g., `main.js` or `main.ts`):
45
+ ```javascript
46
+ // main.js or main.ts
47
+ import 'bootstrap/dist/css/bootstrap.min.css';
48
+ import 'bootstrap/dist/js/bootstrap.bundle.min.js';
49
+ ```
50
+
51
+ ---
52
+
53
+ ### Usage
54
+
55
+ Here is a basic example of how to use the `TreeSelect` component.
56
+
57
+ ```vue
58
+ <template>
59
+ <div class="container mt-5">
60
+ <TreeSelect
61
+ v-model="selectedValue"
62
+ :items="treeData"
63
+ :multiple="true"
64
+ :select-all="true"
65
+ :searchable="true"
66
+ placeholder="Select categories..."
67
+ option-label="value"
68
+ option-value="code"
69
+ disabled-key="isDisabled"
70
+ exclude-from-selected-list-key="excludeFromSelectedList"
71
+ />
72
+ <p class="mt-3"><strong>Selected:</strong> {{ selectedValue }}</p>
73
+ </div>
74
+ </template>
75
+
76
+ <script setup>
77
+ import { ref } from 'vue';
78
+ import TreeSelect from '@night-owl-elite/vue-select';
79
+
80
+ const selectedValue = ref([]);
81
+
82
+ const treeData = [
83
+ {
84
+ code: 'electronics',
85
+ value: 'Electronics',
86
+ // This node won't be added to the modelValue, useful for grouping
87
+ excludeFromSelectedList: true,
88
+ children: [
89
+ { code: 'smartphones', value: 'Smartphones' },
90
+ { code: 'laptops', value: 'Laptops' },
91
+ ],
92
+ },
93
+ {
94
+ code: 'furniture',
95
+ value: 'Furniture',
96
+ children: [
97
+ { code: 'tables', value: 'Tables' },
98
+ { code: 'chairs', value: 'Chairs', isDisabled: true },
99
+ ],
100
+ },
101
+ ];
102
+ </script>
@@ -1 +1 @@
1
- .list-group-item[data-v-fe4eda8b]{cursor:pointer;border:0;border-radius:0;padding-top:.5rem;padding-bottom:.5rem}.expander-icon[data-v-fe4eda8b]{width:1em;transition:transform .2s ease-in-out;color:#6c757d}.expander-placeholder[data-v-fe4eda8b]{display:inline-block;width:1em}.rotate-90[data-v-fe4eda8b]{transform:rotate(90deg)}.item-content[data-v-fe4eda8b]{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}}
1
+ @keyframes spin-8c020fb3{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.svg-icon-spin[data-v-8c020fb3]{animation:spin-8c020fb3 1s linear infinite}.list-group-item[data-v-e65b066f]{cursor:pointer;border:0;border-radius:0;padding-top:.5rem;padding-bottom:.5rem}.expander-icon[data-v-e65b066f]{width:1em;transition:transform .2s ease-in-out;color:#6c757d}.expander-placeholder[data-v-e65b066f]{display:inline-block;width:1em}.rotate-90[data-v-e65b066f]{transform:rotate(90deg)}.item-content[data-v-e65b066f]{flex-grow:1}.tree-select-main[data-v-2de82d20]{--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-2de82d20]{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.clear-icon[data-v-2de82d20]{cursor:pointer;opacity:.6;transition:opacity .2s ease}.clear-icon[data-v-2de82d20]:hover{opacity:1}.transition-transform[data-v-2de82d20]{transition:transform .2s ease-in-out}.rotate-180[data-v-2de82d20]{transform:rotate(180deg)}.tree-select-dropdown[data-v-2de82d20]{position:absolute;background:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.375rem}.tree-select-body[data-v-2de82d20]::-webkit-scrollbar{width:6px}.tree-select-body[data-v-2de82d20]::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.tree-select-body[data-v-2de82d20]::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.tree-select-body[data-v-2de82d20]::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.is-loading[data-v-2de82d20]{cursor:wait}.loading-icon[data-v-2de82d20]{opacity:.7}@media (max-width: 576px){.tree-select-dropdown[data-v-2de82d20]{max-width:90vw;left:0!important;right:0!important;margin:0 auto}}
@@ -1,18 +1,58 @@
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 K, createBlock as L, unref as V, 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 I } from "@fortawesome/vue-fontawesome";
4
- const X = (t, B) => {
1
+ import { computed as I, createElementBlock as u, openBlock as o, normalizeClass as B, createCommentVNode as g, createElementVNode as f, resolveComponent as le, normalizeStyle as ne, createBlock as C, withModifiers as P, renderSlot as Z, Fragment as H, renderList as J, withCtx as Q, ref as A, onMounted as se, onUnmounted as ae, watch as ie, toDisplayString as j, withDirectives as oe, vModelText as de, createVNode as z, createTextVNode as U, nextTick as G } from "vue";
2
+ import { createPopper as re } from "@popperjs/core";
3
+ const D = (t, V) => {
5
4
  const l = t.__vccOpts || t;
6
- for (const [m, f] of B)
7
- l[m] = f;
5
+ for (const [h, r] of V)
6
+ l[h] = r;
8
7
  return l;
9
- }, ue = { class: "tree-select-item-wrapper" }, me = {
8
+ }, ue = { key: 0 }, ce = { key: 1 }, me = { key: 2 }, fe = { key: 3 }, he = { key: 4 }, ge = {
9
+ __name: "SvgIcon",
10
+ props: {
11
+ name: {
12
+ type: String,
13
+ required: !0
14
+ }
15
+ },
16
+ setup(t) {
17
+ const V = t, l = I(() => ({
18
+ "svg-icon-spin": V.name === "spinner"
19
+ }));
20
+ return (h, r) => (o(), u("svg", {
21
+ xmlns: "http://www.w3.org/2000/svg",
22
+ viewBox: "0 0 24 24",
23
+ fill: "currentColor",
24
+ width: "1em",
25
+ height: "1em",
26
+ class: B(l.value)
27
+ }, [
28
+ t.name === "spinner" ? (o(), u("g", ue, r[0] || (r[0] = [
29
+ f("path", {
30
+ d: "M12,2A10,10,0,1,0,22,12,10,10,0,0,0,12,2Zm0,18A8,8,0,1,1,20,12,8,8,0,0,1,12,20Z",
31
+ opacity: ".25"
32
+ }, null, -1),
33
+ f("path", { d: "M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,10,10,0,1,0-9.8,11.5A1.5,1.5,0,0,0,13.5,20h0A1.5,1.5,0,0,0,12,21.5a10,10,0,0,0,0-20Z" }, null, -1)
34
+ ]))) : g("", !0),
35
+ t.name === "times" ? (o(), u("g", ce, r[1] || (r[1] = [
36
+ f("path", { d: "M13.41,12l4.3-4.29a1,1,0,1,0-1.42-1.42L12,10.59,7.71,6.29A1,1,0,0,0,6.29,7.71L10.59,12l-4.3,4.29a1,1,0,0,0,0,1.42,1,1,0,0,0,1.42,0L12,13.41l4.29,4.3a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42Z" }, null, -1)
37
+ ]))) : g("", !0),
38
+ t.name === "chevron-down" ? (o(), u("g", me, r[2] || (r[2] = [
39
+ f("path", { d: "M17,9.17a1,1,0,0,0-1.41,0L12,12.71,8.46,9.17a1,1,0,0,0-1.41,0,1,1,0,0,0,0,1.42l4.24,4.24a1,1,0,0,0,1.42,0L17,10.59A1,1,0,0,0,17,9.17Z" }, null, -1)
40
+ ]))) : g("", !0),
41
+ t.name === "chevron-right" ? (o(), u("g", fe, r[3] || (r[3] = [
42
+ f("path", { d: "M10.83,12l-4.24,4.24a1,1,0,0,0,1.41,1.41L13.66,12,8,6.34A1,1,0,0,0,6.59,7.76Z" }, null, -1)
43
+ ]))) : g("", !0),
44
+ t.name === "search" ? (o(), u("g", he, r[4] || (r[4] = [
45
+ f("path", { d: "M21.71,20.29,18,16.61A9,9,0,1,0,16.61,18l3.68,3.68a1,1,0,0,0,1.42,0A1,1,0,0,0,21.71,20.29ZM11,18a7,7,0,1,1,7-7A7,7,0,0,1,11,18Z" }, null, -1)
46
+ ]))) : g("", !0)
47
+ ], 2));
48
+ }
49
+ }, $ = /* @__PURE__ */ D(ge, [["__scopeId", "data-v-8c020fb3"]]), ve = { class: "tree-select-item-wrapper" }, pe = {
10
50
  key: 1,
11
51
  class: "expander-placeholder"
12
- }, fe = ["checked", ".indeterminate", "disabled"], he = { class: "item-content text-truncate" }, ve = {
52
+ }, ye = ["checked", ".indeterminate", "disabled"], be = { class: "item-content text-truncate" }, xe = {
13
53
  key: 0,
14
54
  class: "children-wrapper"
15
- }, pe = {
55
+ }, ke = {
16
56
  __name: "TreeSelectItem",
17
57
  props: {
18
58
  item: { type: Object, required: !0 },
@@ -27,50 +67,50 @@ const X = (t, B) => {
27
67
  disabledKey: { type: String, default: null }
28
68
  },
29
69
  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), v = C(() => l.expandedItems.has(m(l.item))), p = 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 || p.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: K(["list-group-item list-group-item-action d-flex align-items-center gap-2", {
42
- "bg-primary": p.value && t.selectMode === "highlight",
43
- disabled: f(t.item)
70
+ setup(t, { emit: V }) {
71
+ const l = t, h = (d) => d[l.optionValue] || d.id || d.value, r = (d) => !l.disabledKey || !d ? !1 : d.hasOwnProperty(l.disabledKey) && d[l.disabledKey] !== null, x = I(() => l.item.children && l.item.children.length > 0), y = I(() => l.expandedItems.has(h(l.item))), v = I(() => l.selectedItems.includes(h(l.item))), k = (d) => {
72
+ let i = [];
73
+ return d.children && d.children.forEach((w) => {
74
+ i.push(h(w)), i.push(...k(w));
75
+ }), i;
76
+ }, L = I(() => !l.multiple || !l.selectAll || !x.value || v.value ? !1 : k(l.item).some((i) => l.selectedItems.includes(i)));
77
+ return (d, i) => {
78
+ const w = le("TreeSelectItem", !0);
79
+ return o(), u("div", ve, [
80
+ f("div", {
81
+ class: B(["list-group-item list-group-item-action d-flex align-items-center gap-2", {
82
+ "bg-primary text-white": v.value && t.selectMode === "highlight",
83
+ disabled: r(t.item)
44
84
  }]),
45
- style: ie({ "padding-left": `${t.level * 1.5 + 1}rem` }),
46
- onClick: a[2] || (a[2] = (c) => o.$emit("select", t.item))
85
+ style: ne({ "padding-left": `${t.level * 1.5 + 1}rem` }),
86
+ onClick: i[2] || (i[2] = (m) => d.$emit("select", t.item))
47
87
  }, [
48
- y.value ? (d(), L(V(I), {
88
+ x.value ? (o(), C($, {
49
89
  key: 0,
50
- icon: "chevron-right",
51
- class: K(["expander-icon", { "rotate-90": v.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", {
90
+ name: "chevron-right",
91
+ class: B(["expander-icon", { "rotate-90": y.value, "text-white": v.value && t.selectMode === "highlight" }]),
92
+ onClick: i[0] || (i[0] = P((m) => d.$emit("toggle-expand", h(t.item)), ["stop"]))
93
+ }, null, 8, ["class"])) : (o(), u("span", pe)),
94
+ t.multiple && t.selectMode === "checkbox" ? (o(), u("input", {
55
95
  key: 2,
56
96
  type: "checkbox",
57
97
  class: "form-check-input",
58
- checked: p.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", {
98
+ checked: v.value,
99
+ ".indeterminate": L.value,
100
+ disabled: r(t.item),
101
+ onClick: i[1] || (i[1] = P((m) => d.$emit("select", t.item), ["stop"]))
102
+ }, null, 40, ye)) : g("", !0),
103
+ f("div", be, [
104
+ Z(d.$slots, "default", {
65
105
  item: t.item,
66
106
  level: t.level
67
107
  }, void 0, !0)
68
108
  ])
69
109
  ], 6),
70
- y.value && v.value ? (d(), u("div", ve, [
71
- (d(!0), u(J, null, Q(t.item.children, (c) => (d(), L(x, {
72
- key: m(c),
73
- item: c,
110
+ x.value && y.value ? (o(), u("div", xe, [
111
+ (o(!0), u(H, null, J(t.item.children, (m) => (o(), C(w, {
112
+ key: h(m),
113
+ item: m,
74
114
  level: t.level + 1,
75
115
  "selected-items": t.selectedItems,
76
116
  "expanded-items": t.expandedItems,
@@ -80,38 +120,38 @@ const X = (t, B) => {
80
120
  "option-label": t.optionLabel,
81
121
  "option-value": t.optionValue,
82
122
  "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))
123
+ onSelect: i[3] || (i[3] = (S) => d.$emit("select", S)),
124
+ onToggleExpand: i[4] || (i[4] = (S) => d.$emit("toggle-expand", S))
85
125
  }, {
86
- default: W(({ item: k, level: E }) => [
87
- N(o.$slots, "default", {
88
- item: k,
89
- level: E
126
+ default: Q(({ item: S, level: M }) => [
127
+ Z(d.$slots, "default", {
128
+ item: S,
129
+ level: M
90
130
  }, void 0, !0)
91
131
  ]),
92
132
  _: 2
93
133
  }, 1032, ["item", "level", "selected-items", "expanded-items", "multiple", "select-all", "select-mode", "option-label", "option-value", "disabled-key"]))), 128))
94
- ])) : w("", !0)
134
+ ])) : g("", !0)
95
135
  ]);
96
136
  };
97
137
  }
98
- }, ge = /* @__PURE__ */ X(pe, [["__scopeId", "data-v-fe4eda8b"]]), 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 = {
138
+ }, we = /* @__PURE__ */ D(ke, [["__scopeId", "data-v-e65b066f"]]), Se = { class: "tree-select-wrapper" }, Ie = ["disabled"], Ve = { class: "tree-select-display-text text-truncate me-2 text-start" }, Le = { class: "d-flex align-items-center gap-2" }, Ae = {
99
139
  key: 0,
100
140
  class: "p-2 border-bottom"
101
- }, we = {
141
+ }, $e = {
102
142
  key: 1,
103
143
  class: "p-4 text-muted text-center"
104
- }, Ve = {
144
+ }, Ce = {
105
145
  key: 2,
106
146
  class: "tree-select-body",
107
147
  style: { "max-height": "300px", "overflow-y": "auto" }
108
- }, Ie = {
148
+ }, Be = {
109
149
  key: 0,
110
- class: "list-group list-group-flush"
111
- }, Le = { class: "d-flex align-items-center gap-2" }, Ce = {
150
+ class: "list-group list-group-flush bg-primary"
151
+ }, Me = { class: "d-flex align-items-center gap-2" }, Ee = {
112
152
  key: 1,
113
153
  class: "p-3 text-muted text-center"
114
- }, $e = {
154
+ }, Ke = {
115
155
  __name: "TreeSelectMain",
116
156
  props: {
117
157
  modelValue: {
@@ -178,99 +218,99 @@ const X = (t, B) => {
178
218
  }
179
219
  },
180
220
  emits: ["update:modelValue", "change"],
181
- setup(t, { emit: B }) {
182
- const l = t, m = B, f = A(null), y = A(null), v = A(""), p = 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;
221
+ setup(t, { emit: V }) {
222
+ const l = t, h = V, r = A(null), x = A(null), y = A(""), v = A(!1), k = A(/* @__PURE__ */ new Set()), L = A(null), d = (e) => e[l.optionLabel] || e.label || e.name || "", i = (e) => e[l.optionValue] || e.id || e.value, w = (e) => !l.disabledKey || !e ? !1 : e.hasOwnProperty(l.disabledKey) && e[l.disabledKey] !== null, m = (e) => e.children && e.children.length > 0, S = (e, s = l.items) => {
223
+ for (const n of s) {
224
+ if (i(n) === e) return n;
225
+ if (m(n)) {
226
+ const a = S(e, n.children);
227
+ if (a) return a;
188
228
  }
189
229
  }
190
230
  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;
231
+ }, M = (e) => {
232
+ const s = [];
233
+ return m(e) && e.children.forEach((n) => {
234
+ w(n) || (s.push(i(n)), s.push(...M(n)));
235
+ }), s;
236
+ }, N = (e, s = l.items, n = []) => {
237
+ for (const a of s) {
238
+ if (i(a) === e) return n;
239
+ if (m(a)) {
240
+ const c = N(e, a.children, [...n, i(a)]);
241
+ if (c) return c;
202
242
  }
203
243
  }
204
244
  return null;
205
- }, T = C(() => {
245
+ }, E = I(() => {
206
246
  const e = new Set(Array.isArray(l.modelValue) ? l.modelValue : [l.modelValue].filter(Boolean));
207
247
  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);
248
+ const s = (n) => {
249
+ n.forEach((a) => {
250
+ if (m(a)) {
251
+ const c = a.children.filter((b) => !w(b));
252
+ c.length > 0 && c.every((b) => e.has(i(b))) && e.add(i(a)), s(a.children);
213
253
  }
214
254
  });
215
255
  };
216
- i(l.items);
256
+ s(l.items);
217
257
  }
218
258
  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;
259
+ }), K = (e, s = l.items, n = []) => {
260
+ for (const a of s) {
261
+ const c = [...n, d(a)];
262
+ if (i(a) === e) return c;
263
+ if (m(a)) {
264
+ const p = K(e, a.children, c);
265
+ if (p) return p;
226
266
  }
227
267
  }
228
268
  return null;
229
- }, F = (e) => {
269
+ }, O = (e) => {
230
270
  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(() => {
271
+ const s = e.join(" → ");
272
+ return s.length <= 40 ? s : e.length > 2 ? `${e[0]} → ... → ${e[e.length - 1]}` : s;
273
+ }, W = I(() => {
234
274
  const e = Array.isArray(l.modelValue) ? l.modelValue : [l.modelValue].filter(Boolean);
235
275
  if (e.length === 0) return l.placeholder;
236
276
  if (l.multiple) {
237
277
  if (e.length === 1) {
238
- const n = M(e[0]);
239
- return n ? F(n) : e[0];
278
+ const n = K(e[0]);
279
+ return n ? O(n) : e[0];
240
280
  }
241
281
  return `${e.length} items selected`;
242
282
  }
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(() => v.value.trim() ? R(l.items, v.value.toLowerCase()) : l.items), Z = (e) => {
250
- if (x(e)) return;
251
- const i = a(e);
252
- let n = new Set(T.value);
283
+ const s = K(e[0]);
284
+ return s ? O(s) : e[0];
285
+ }), F = (e, s) => e.map((n) => {
286
+ const a = d(n).toLowerCase().includes(s);
287
+ let c = [];
288
+ return m(n) && (c = F(n.children, s)), a || c.length > 0 ? { ...n, children: c } : null;
289
+ }).filter(Boolean), T = I(() => y.value.trim() ? F(l.items, y.value.toLowerCase()) : l.items), X = (e) => {
290
+ if (w(e)) return;
291
+ const s = i(e);
292
+ let n = new Set(E.value);
253
293
  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)));
294
+ const c = n.has(s);
295
+ if (l.selectAll && m(e)) {
296
+ const p = M(e);
297
+ c ? (n.delete(s), p.forEach((b) => n.delete(b))) : (n.add(s), p.forEach((b) => n.add(b)));
258
298
  } else
259
- r ? (n.delete(i), l.selectAll && O(i)?.forEach((g) => n.delete(g))) : n.add(i);
299
+ c ? (n.delete(s), l.selectAll && N(s)?.forEach((b) => n.delete(b))) : n.add(s);
260
300
  } 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 = () => {
301
+ n = /* @__PURE__ */ new Set([s]), q();
302
+ let a = Array.from(n);
303
+ l.multiple && l.excludeFromSelectedListKey && (a = a.filter((c) => {
304
+ const p = S(c);
305
+ return !p || !p[l.excludeFromSelectedListKey];
306
+ })), h("update:modelValue", l.multiple ? a : a[0] || null), h("change", l.multiple ? a : a[0] || null);
307
+ }, Y = (e) => {
308
+ k.value.has(e) ? k.value.delete(e) : k.value.add(e);
309
+ }, _ = () => {
270
310
  const e = l.multiple ? [] : null;
271
- m("update:modelValue", e), m("change", e);
272
- }, te = async () => {
273
- l.disabled || (p.value = !0, await H(), f.value && y.value && ($.value = ce(y.value, f.value, {
311
+ h("update:modelValue", e), h("change", e);
312
+ }, ee = async () => {
313
+ l.disabled || (v.value = !0, await G(), r.value && x.value && (L.value = re(x.value, r.value, {
274
314
  placement: "bottom-start",
275
315
  strategy: "fixed",
276
316
  modifiers: [
@@ -278,129 +318,130 @@ const X = (t, B) => {
278
318
  { name: "preventOverflow", options: { padding: 8 } },
279
319
  { name: "flip", options: { fallbackPlacements: ["top-start"] } }
280
320
  ]
281
- })), l.searchable && (await H(), f.value?.querySelector(".tree-search-input")?.focus()));
282
- }, P = () => {
283
- p.value = !1, v.value = "", $.value?.destroy(), $.value = null;
284
- }, le = () => p.value ? P() : te(), j = (e) => {
285
- !y.value?.contains(e.target) && !f.value?.contains(e.target) && P();
321
+ })), l.searchable && (await G(), r.value?.querySelector(".tree-search-input")?.focus()));
322
+ }, q = () => {
323
+ v.value = !1, y.value = "", L.value?.destroy(), L.value = null;
324
+ }, te = () => v.value ? q() : ee(), R = (e) => {
325
+ !x.value?.contains(e.target) && !r.value?.contains(e.target) && q();
286
326
  };
287
- return se(() => document.addEventListener("click", j)), ae(() => {
288
- document.removeEventListener("click", j), $.value?.destroy();
289
- }), oe(v, (e) => {
327
+ return se(() => document.addEventListener("click", R)), ae(() => {
328
+ document.removeEventListener("click", R), L.value?.destroy();
329
+ }), ie(y, (e) => {
290
330
  if (e.trim()) {
291
- const i = (n) => {
292
- n.forEach((s) => {
293
- c(s) && (b.value.add(a(s)), i(s.children));
331
+ const s = (n) => {
332
+ n.forEach((a) => {
333
+ m(a) && (k.value.add(i(a)), s(a.children));
294
334
  });
295
335
  };
296
- i(q.value);
336
+ s(T.value);
297
337
  }
298
- }), (e, i) => (d(), u("div", ye, [
299
- S("button", {
338
+ }), (e, s) => (o(), u("div", Se, [
339
+ f("button", {
300
340
  ref_key: "triggerRef",
301
- ref: y,
341
+ ref: x,
302
342
  type: "button",
303
- class: K(["btn tree-select-trigger w-100 d-flex justify-content-between align-items-center tree-select-main sm", {
343
+ class: B(["btn tree-select-trigger w-100 d-flex justify-content-between align-items-center tree-select-main sm", {
304
344
  "btn-outline-secondary": !t.isInvalid,
305
345
  "border-danger": t.isInvalid,
306
346
  disabled: t.disabled || t.isLoading,
307
347
  "is-loading": t.isLoading
308
348
  }]),
309
349
  disabled: t.disabled || t.isLoading,
310
- onClick: le
350
+ onClick: te
311
351
  }, [
312
- S("span", xe, z(Y.value), 1),
313
- S("div", ke, [
314
- t.isLoading ? (d(), L(V(I), {
352
+ f("span", Ve, j(W.value), 1),
353
+ f("div", Le, [
354
+ t.isLoading ? (o(), C($, {
315
355
  key: 0,
316
- icon: "spinner",
317
- spin: "",
356
+ name: "spinner",
318
357
  class: "loading-icon"
319
- })) : w("", !0),
320
- t.showClearButton && T.value.length > 0 && !t.disabled && !t.isLoading ? (d(), L(V(I), {
358
+ })) : g("", !0),
359
+ t.showClearButton && E.value.length > 0 && !t.disabled && !t.isLoading ? (o(), C($, {
321
360
  key: 1,
322
- icon: "times",
323
- onClick: D(ee, ["stop"]),
361
+ name: "times",
362
+ onClick: P(_, ["stop"]),
324
363
  class: "clear-icon"
325
- })) : w("", !0),
326
- t.isLoading ? w("", !0) : (d(), L(V(I), {
364
+ })) : g("", !0),
365
+ t.isLoading ? g("", !0) : (o(), C($, {
327
366
  key: 2,
328
- icon: "chevron-down",
329
- class: K(["transition-transform", { "rotate-180": p.value }])
367
+ name: "chevron-down",
368
+ class: B(["transition-transform", { "rotate-180": v.value }])
330
369
  }, null, 8, ["class"]))
331
370
  ])
332
- ], 10, be),
333
- p.value ? (d(), u("div", {
371
+ ], 10, Ie),
372
+ v.value ? (o(), u("div", {
334
373
  key: 0,
335
374
  ref_key: "dropdownRef",
336
- ref: f,
375
+ ref: r,
337
376
  class: "tree-select-dropdown card shadow-lg border-0",
338
377
  style: { "z-index": "1050", "min-width": "200px", "max-width": "400px" }
339
378
  }, [
340
- t.searchable ? (d(), u("div", Se, [
341
- de(S("input", {
342
- "onUpdate:modelValue": i[0] || (i[0] = (n) => v.value = n),
379
+ t.searchable ? (o(), u("div", Ae, [
380
+ oe(f("input", {
381
+ "onUpdate:modelValue": s[0] || (s[0] = (n) => y.value = n),
343
382
  type: "text",
344
383
  class: "form-control form-control-sm tree-search-input",
345
384
  placeholder: "Search..."
346
385
  }, null, 512), [
347
- [re, v.value]
386
+ [de, y.value]
348
387
  ])
349
- ])) : w("", !0),
350
- t.isLoading ? (d(), u("div", we, [
351
- U(V(I), {
352
- icon: "spinner",
353
- spin: "",
388
+ ])) : g("", !0),
389
+ t.isLoading ? (o(), u("div", $e, [
390
+ z($, {
391
+ name: "spinner",
354
392
  class: "me-2"
355
393
  }),
356
- i[1] || (i[1] = S("span", null, "Loading...", -1))
357
- ])) : (d(), u("div", Ve, [
358
- q.value.length > 0 ? (d(), u("div", Ie, [
359
- (d(!0), u(J, null, Q(q.value, (n) => (d(), L(ge, {
360
- key: a(n),
394
+ s[1] || (s[1] = f("span", null, "Loading...", -1))
395
+ ])) : (o(), u("div", Ce, [
396
+ T.value.length > 0 ? (o(), u("div", Be, [
397
+ (o(!0), u(H, null, J(T.value, (n) => (o(), C(we, {
398
+ key: i(n),
361
399
  item: n,
362
400
  level: 0,
363
- "selected-items": T.value,
364
- "expanded-items": b.value,
401
+ "selected-items": E.value,
402
+ "expanded-items": k.value,
365
403
  multiple: t.multiple,
366
404
  "select-all": t.selectAll,
367
405
  "select-mode": t.selectMode,
368
406
  "option-label": t.optionLabel,
369
407
  "option-value": t.optionValue,
370
408
  "disabled-key": t.disabledKey,
371
- onSelect: Z,
372
- onToggleExpand: _
409
+ onSelect: X,
410
+ onToggleExpand: Y
373
411
  }, {
374
- default: W(({ item: s, level: r }) => [
375
- N(e.$slots, "default", {
376
- item: s,
377
- level: r
412
+ default: Q(({ item: a, level: c }) => [
413
+ Z(e.$slots, "default", {
414
+ item: a,
415
+ level: c
378
416
  }, () => [
379
- S("div", Le, [
380
- G(z(o(s)) + " ", 1),
381
- s.icon ? (d(), L(V(I), {
417
+ f("div", Me, [
418
+ U(j(d(a)) + " ", 1),
419
+ a.icon ? (o(), u("i", {
382
420
  key: 0,
383
- icon: s.icon
384
- }, null, 8, ["icon"])) : w("", !0)
421
+ class: B(a.icon)
422
+ }, null, 2)) : g("", !0)
385
423
  ])
386
424
  ], !0)
387
425
  ]),
388
426
  _: 2
389
427
  }, 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(V(I), { icon: "search" }),
392
- i[2] || (i[2] = G(" No items found ", -1))
428
+ ])) : (o(), u("div", Ee, [
429
+ z($, {
430
+ name: "search",
431
+ class: "me-1"
432
+ }),
433
+ s[2] || (s[2] = U(" No items found ", -1))
393
434
  ]))
394
435
  ]))
395
- ], 512)) : w("", !0)
436
+ ], 512)) : g("", !0)
396
437
  ]));
397
438
  }
398
- }, Ae = /* @__PURE__ */ X($e, [["__scopeId", "data-v-9f38e289"]]), Te = {
439
+ }, Te = /* @__PURE__ */ D(Ke, [["__scopeId", "data-v-2de82d20"]]), Ze = {
399
440
  install(t) {
400
- t.component("VSelect", Ae);
441
+ t.component("VSelect", Te);
401
442
  }
402
443
  };
403
444
  export {
404
- Ae as VSelect,
405
- Te as default
445
+ Te as VSelect,
446
+ Ze as default
406
447
  };
@@ -1 +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,x){"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},S=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&&l.selectMode==="highlight",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(x.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":S.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]=V=>r.$emit("select",V)),onToggleExpand:s[4]||(s[4]=V=>r.$emit("toggle-expand",V))},{default:e.withCtx(({item:V,level:E})=>[e.renderSlot(r.$slots,"default",{item:V,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-fe4eda8b"]]),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),S=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,V=(t,i=n.items)=>{for(const o of i){if(s(o)===t)return o;if(d(o)){const a=V(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=V(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&&(S.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="",S.value?.destroy(),S.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),S.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(x.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(x.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(x.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(x.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(x.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(x.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("VSelect",$)}};u.VSelect=$,u.default=_,Object.defineProperties(u,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(h,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@popperjs/core")):typeof define=="function"&&define.amd?define(["exports","vue","@popperjs/core"],e):(h=typeof globalThis<"u"?globalThis:h||self,e(h.VueSelect={},h.Vue,h.Popper))})(this,function(h,e,P){"use strict";const C=(l,S)=>{const n=l.__vccOpts||l;for(const[u,c]of S)n[u]=c;return n},z={key:0},D={key:1},O={key:2},Z={key:3},j={key:4},x=C({__name:"SvgIcon",props:{name:{type:String,required:!0}},setup(l){const S=l,n=e.computed(()=>({"svg-icon-spin":S.name==="spinner"}));return(u,c)=>(e.openBlock(),e.createElementBlock("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",width:"1em",height:"1em",class:e.normalizeClass(n.value)},[l.name==="spinner"?(e.openBlock(),e.createElementBlock("g",z,c[0]||(c[0]=[e.createElementVNode("path",{d:"M12,2A10,10,0,1,0,22,12,10,10,0,0,0,12,2Zm0,18A8,8,0,1,1,20,12,8,8,0,0,1,12,20Z",opacity:".25"},null,-1),e.createElementVNode("path",{d:"M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,10,10,0,1,0-9.8,11.5A1.5,1.5,0,0,0,13.5,20h0A1.5,1.5,0,0,0,12,21.5a10,10,0,0,0,0-20Z"},null,-1)]))):e.createCommentVNode("",!0),l.name==="times"?(e.openBlock(),e.createElementBlock("g",D,c[1]||(c[1]=[e.createElementVNode("path",{d:"M13.41,12l4.3-4.29a1,1,0,1,0-1.42-1.42L12,10.59,7.71,6.29A1,1,0,0,0,6.29,7.71L10.59,12l-4.3,4.29a1,1,0,0,0,0,1.42,1,1,0,0,0,1.42,0L12,13.41l4.29,4.3a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42Z"},null,-1)]))):e.createCommentVNode("",!0),l.name==="chevron-down"?(e.openBlock(),e.createElementBlock("g",O,c[2]||(c[2]=[e.createElementVNode("path",{d:"M17,9.17a1,1,0,0,0-1.41,0L12,12.71,8.46,9.17a1,1,0,0,0-1.41,0,1,1,0,0,0,0,1.42l4.24,4.24a1,1,0,0,0,1.42,0L17,10.59A1,1,0,0,0,17,9.17Z"},null,-1)]))):e.createCommentVNode("",!0),l.name==="chevron-right"?(e.openBlock(),e.createElementBlock("g",Z,c[3]||(c[3]=[e.createElementVNode("path",{d:"M10.83,12l-4.24,4.24a1,1,0,0,0,1.41,1.41L13.66,12,8,6.34A1,1,0,0,0,6.59,7.76Z"},null,-1)]))):e.createCommentVNode("",!0),l.name==="search"?(e.openBlock(),e.createElementBlock("g",j,c[4]||(c[4]=[e.createElementVNode("path",{d:"M21.71,20.29,18,16.61A9,9,0,1,0,16.61,18l3.68,3.68a1,1,0,0,0,1.42,0A1,1,0,0,0,21.71,20.29ZM11,18a7,7,0,1,1,7-7A7,7,0,0,1,11,18Z"},null,-1)]))):e.createCommentVNode("",!0)],2))}},[["__scopeId","data-v-8c020fb3"]]),F={class:"tree-select-item-wrapper"},R={key:1,class:"expander-placeholder"},U=["checked",".indeterminate","disabled"],G={class:"item-content text-truncate"},H={key:0,class:"children-wrapper"},J=C({__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:S}){const n=l,u=r=>r[n.optionValue]||r.id||r.value,c=r=>!n.disabledKey||!r?!1:r.hasOwnProperty(n.disabledKey)&&r[n.disabledKey]!==null,k=e.computed(()=>n.item.children&&n.item.children.length>0),g=e.computed(()=>n.expandedItems.has(u(n.item))),f=e.computed(()=>n.selectedItems.includes(u(n.item))),b=r=>{let s=[];return r.children&&r.children.forEach(B=>{s.push(u(B)),s.push(...b(B))}),s},E=e.computed(()=>!n.multiple||!n.selectAll||!k.value||f.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",F,[e.createElementVNode("div",{class:e.normalizeClass(["list-group-item list-group-item-action d-flex align-items-center gap-2",{"bg-primary text-white":f.value&&l.selectMode==="highlight",disabled:c(l.item)}]),style:e.normalizeStyle({"padding-left":`${l.level*1.5+1}rem`}),onClick:s[2]||(s[2]=m=>r.$emit("select",l.item))},[k.value?(e.openBlock(),e.createBlock(x,{key:0,name:"chevron-right",class:e.normalizeClass(["expander-icon",{"rotate-90":g.value,"text-white":f.value&&l.selectMode==="highlight"}]),onClick:s[0]||(s[0]=e.withModifiers(m=>r.$emit("toggle-expand",u(l.item)),["stop"]))},null,8,["class"])):(e.openBlock(),e.createElementBlock("span",R)),l.multiple&&l.selectMode==="checkbox"?(e.openBlock(),e.createElementBlock("input",{key:2,type:"checkbox",class:"form-check-input",checked:f.value,".indeterminate":E.value,disabled:c(l.item),onClick:s[1]||(s[1]=e.withModifiers(m=>r.$emit("select",l.item),["stop"]))},null,40,U)):e.createCommentVNode("",!0),e.createElementVNode("div",G,[e.renderSlot(r.$slots,"default",{item:l.item,level:l.level},void 0,!0)])],6),k.value&&g.value?(e.openBlock(),e.createElementBlock("div",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.item.children,m=>(e.openBlock(),e.createBlock(B,{key:u(m),item:m,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]=V=>r.$emit("select",V)),onToggleExpand:s[4]||(s[4]=V=>r.$emit("toggle-expand",V))},{default:e.withCtx(({item:V,level:w})=>[e.renderSlot(r.$slots,"default",{item:V,level:w},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-e65b066f"]]),Q={class:"tree-select-wrapper"},W=["disabled"],X={class:"tree-select-display-text text-truncate me-2 text-start"},Y={class:"d-flex align-items-center gap-2"},v={key:0,class:"p-2 border-bottom"},_={key:1,class:"p-4 text-muted text-center"},ee={key:2,class:"tree-select-body",style:{"max-height":"300px","overflow-y":"auto"}},te={key:0,class:"list-group list-group-flush bg-primary"},le={class:"d-flex align-items-center gap-2"},ne={key:1,class:"p-3 text-muted text-center"},A=C({__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:S}){const n=l,u=S,c=e.ref(null),k=e.ref(null),g=e.ref(""),f=e.ref(!1),b=e.ref(new Set),E=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,m=t=>t.children&&t.children.length>0,V=(t,a=n.items)=>{for(const o of a){if(s(o)===t)return o;if(m(o)){const i=V(t,o.children);if(i)return i}}return null},w=t=>{const a=[];return m(t)&&t.children.forEach(o=>{B(o)||(a.push(s(o)),a.push(...w(o)))}),a},M=(t,a=n.items,o=[])=>{for(const i of a){if(s(i)===t)return o;if(m(i)){const d=M(t,i.children,[...o,s(i)]);if(d)return d}}return null},N=e.computed(()=>{const t=new Set(Array.isArray(n.modelValue)?n.modelValue:[n.modelValue].filter(Boolean));if(n.multiple&&n.selectAll){const a=o=>{o.forEach(i=>{if(m(i)){const d=i.children.filter(y=>!B(y));d.length>0&&d.every(y=>t.has(s(y)))&&t.add(s(i)),a(i.children)}})};a(n.items)}return Array.from(t)}),I=(t,a=n.items,o=[])=>{for(const i of a){const d=[...o,r(i)];if(s(i)===t)return d;if(m(i)){const p=I(t,i.children,d);if(p)return p}}return null},T=t=>{if(!t||t.length===0)return"";const a=t.join(" → ");return a.length<=40?a:t.length>2?`${t[0]} → ... → ${t[t.length-1]}`:a},ae=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=I(t[0]);return o?T(o):t[0]}return`${t.length} items selected`}const a=I(t[0]);return a?T(a):t[0]}),q=(t,a)=>t.map(o=>{const i=r(o).toLowerCase().includes(a);let d=[];return m(o)&&(d=q(o.children,a)),i||d.length>0?{...o,children:d}:null}).filter(Boolean),L=e.computed(()=>g.value.trim()?q(n.items,g.value.toLowerCase()):n.items),ie=t=>{if(B(t))return;const a=s(t);let o=new Set(N.value);if(n.multiple){const d=o.has(a);if(n.selectAll&&m(t)){const p=w(t);d?(o.delete(a),p.forEach(y=>o.delete(y))):(o.add(a),p.forEach(y=>o.add(y)))}else d?(o.delete(a),n.selectAll&&M(a)?.forEach(y=>o.delete(y))):o.add(a)}else o=new Set([a]),$();let i=Array.from(o);n.multiple&&n.excludeFromSelectedListKey&&(i=i.filter(d=>{const p=V(d);return!p||!p[n.excludeFromSelectedListKey]})),u("update:modelValue",n.multiple?i:i[0]||null),u("change",n.multiple?i:i[0]||null)},se=t=>{b.value.has(t)?b.value.delete(t):b.value.add(t)},re=()=>{const t=n.multiple?[]:null;u("update:modelValue",t),u("change",t)},ce=async()=>{n.disabled||(f.value=!0,await e.nextTick(),c.value&&k.value&&(E.value=P.createPopper(k.value,c.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(),c.value?.querySelector(".tree-search-input")?.focus()))},$=()=>{f.value=!1,g.value="",E.value?.destroy(),E.value=null},de=()=>f.value?$():ce(),K=t=>{!k.value?.contains(t.target)&&!c.value?.contains(t.target)&&$()};return e.onMounted(()=>document.addEventListener("click",K)),e.onUnmounted(()=>{document.removeEventListener("click",K),E.value?.destroy()}),e.watch(g,t=>{if(t.trim()){const a=o=>{o.forEach(i=>{m(i)&&(b.value.add(s(i)),a(i.children))})};a(L.value)}}),(t,a)=>(e.openBlock(),e.createElementBlock("div",Q,[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:de},[e.createElementVNode("span",X,e.toDisplayString(ae.value),1),e.createElementVNode("div",Y,[l.isLoading?(e.openBlock(),e.createBlock(x,{key:0,name:"spinner",class:"loading-icon"})):e.createCommentVNode("",!0),l.showClearButton&&N.value.length>0&&!l.disabled&&!l.isLoading?(e.openBlock(),e.createBlock(x,{key:1,name:"times",onClick:e.withModifiers(re,["stop"]),class:"clear-icon"})):e.createCommentVNode("",!0),l.isLoading?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:2,name:"chevron-down",class:e.normalizeClass(["transition-transform",{"rotate-180":f.value}])},null,8,["class"]))])],10,W),f.value?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"dropdownRef",ref:c,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",v,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":a[0]||(a[0]=o=>g.value=o),type:"text",class:"form-control form-control-sm tree-search-input",placeholder:"Search..."},null,512),[[e.vModelText,g.value]])])):e.createCommentVNode("",!0),l.isLoading?(e.openBlock(),e.createElementBlock("div",_,[e.createVNode(x,{name:"spinner",class:"me-2"}),a[1]||(a[1]=e.createElementVNode("span",null,"Loading...",-1))])):(e.openBlock(),e.createElementBlock("div",ee,[L.value.length>0?(e.openBlock(),e.createElementBlock("div",te,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(L.value,o=>(e.openBlock(),e.createBlock(J,{key:s(o),item:o,level:0,"selected-items":N.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:ie,onToggleExpand:se},{default:e.withCtx(({item:i,level:d})=>[e.renderSlot(t.$slots,"default",{item:i,level:d},()=>[e.createElementVNode("div",le,[e.createTextVNode(e.toDisplayString(r(i))+" ",1),i.icon?(e.openBlock(),e.createElementBlock("i",{key:0,class:e.normalizeClass(i.icon)},null,2)):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",ne,[e.createVNode(x,{name:"search",class:"me-1"}),a[2]||(a[2]=e.createTextVNode(" No items found ",-1))]))]))],512)):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-2de82d20"]]),oe={install(l){l.component("VSelect",A)}};h.VSelect=A,h.default=oe,Object.defineProperties(h,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@night-owl-elite/vue-select",
3
3
  "private": false,
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "type": "module",
6
6
  "main": "./dist/vue-select.umd.js",
7
7
  "module": "./dist/vue-select.es.js",
@@ -22,10 +22,6 @@
22
22
  ],
23
23
  "dependencies": {
24
24
  "vue": "^3.5.17",
25
- "@fortawesome/fontawesome-free": "^6.7.2",
26
- "@fortawesome/fontawesome-svg-core": "^6.7.2",
27
- "@fortawesome/free-solid-svg-icons": "^6.7.2",
28
- "@fortawesome/vue-fontawesome": "^3.0.8",
29
25
  "@popperjs/core": "^2.11.8",
30
26
  "bootstrap": "^5.3.0"
31
27
  },