@windwalker-io/unicorn-next 0.1.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.
Files changed (175) hide show
  1. package/.editorconfig +18 -0
  2. package/.gulp.json +7 -0
  3. package/bin/release.mjs +47 -0
  4. package/dist/chunks/_arrayPush.js +168 -0
  5. package/dist/chunks/_arrayPush.js.map +1 -0
  6. package/dist/chunks/_baseRest.js +73 -0
  7. package/dist/chunks/_baseRest.js.map +1 -0
  8. package/dist/chunks/_commonjsHelpers.js +7 -0
  9. package/dist/chunks/_commonjsHelpers.js.map +1 -0
  10. package/dist/chunks/_getPrototype.js +130 -0
  11. package/dist/chunks/_getPrototype.js.map +1 -0
  12. package/dist/chunks/button-radio.js +147 -0
  13. package/dist/chunks/button-radio.js.map +1 -0
  14. package/dist/chunks/checkboxes-multi-select.js +44 -0
  15. package/dist/chunks/checkboxes-multi-select.js.map +1 -0
  16. package/dist/chunks/cloneDeep.js +287 -0
  17. package/dist/chunks/cloneDeep.js.map +1 -0
  18. package/dist/chunks/cropper.min.js +5 -0
  19. package/dist/chunks/cropper.min.js.map +1 -0
  20. package/dist/chunks/field-cascade-select.js +256 -0
  21. package/dist/chunks/field-cascade-select.js.map +1 -0
  22. package/dist/chunks/field-file-drag.js +218 -0
  23. package/dist/chunks/field-file-drag.js.map +1 -0
  24. package/dist/chunks/field-flatpickr.js +893 -0
  25. package/dist/chunks/field-flatpickr.js.map +1 -0
  26. package/dist/chunks/field-modal-select.js +403 -0
  27. package/dist/chunks/field-modal-select.js.map +1 -0
  28. package/dist/chunks/field-modal-tree.js +790 -0
  29. package/dist/chunks/field-modal-tree.js.map +1 -0
  30. package/dist/chunks/field-multi-uploader.js +256 -0
  31. package/dist/chunks/field-multi-uploader.js.map +1 -0
  32. package/dist/chunks/field-repeatable.js +132 -0
  33. package/dist/chunks/field-repeatable.js.map +1 -0
  34. package/dist/chunks/field-single-image-drag.js +338 -0
  35. package/dist/chunks/field-single-image-drag.js.map +1 -0
  36. package/dist/chunks/form.js +154 -0
  37. package/dist/chunks/form.js.map +1 -0
  38. package/dist/chunks/grid.js +345 -0
  39. package/dist/chunks/grid.js.map +1 -0
  40. package/dist/chunks/http-client.js +229 -0
  41. package/dist/chunks/http-client.js.map +1 -0
  42. package/dist/chunks/iframe-modal.js +124 -0
  43. package/dist/chunks/iframe-modal.js.map +1 -0
  44. package/dist/chunks/index.js +309 -0
  45. package/dist/chunks/index.js.map +1 -0
  46. package/dist/chunks/isArguments.js +146 -0
  47. package/dist/chunks/isArguments.js.map +1 -0
  48. package/dist/chunks/keep-tab.js +101 -0
  49. package/dist/chunks/keep-tab.js.map +1 -0
  50. package/dist/chunks/legacy.js +210 -0
  51. package/dist/chunks/legacy.js.map +1 -0
  52. package/dist/chunks/list-dependent.js +231 -0
  53. package/dist/chunks/list-dependent.js.map +1 -0
  54. package/dist/chunks/s3-multipart-uploader.js +172 -0
  55. package/dist/chunks/s3-multipart-uploader.js.map +1 -0
  56. package/dist/chunks/s3-uploader.js +136 -0
  57. package/dist/chunks/s3-uploader.js.map +1 -0
  58. package/dist/chunks/show-on.js +237 -0
  59. package/dist/chunks/show-on.js.map +1 -0
  60. package/dist/chunks/tinymce.js +196 -0
  61. package/dist/chunks/tinymce.js.map +1 -0
  62. package/dist/chunks/ui-bootstrap5.js +71 -0
  63. package/dist/chunks/ui-bootstrap5.js.map +1 -0
  64. package/dist/chunks/unicorn.js +2202 -0
  65. package/dist/chunks/unicorn.js.map +1 -0
  66. package/dist/chunks/validation.js +854 -0
  67. package/dist/chunks/validation.js.map +1 -0
  68. package/dist/editor.css +1 -0
  69. package/dist/index.d.ts +1427 -0
  70. package/dist/multi-level-menu.css +1 -0
  71. package/dist/switcher.css +1 -0
  72. package/dist/unicorn-next.css +12 -0
  73. package/dist/unicorn.js +125 -0
  74. package/dist/unicorn.js.map +1 -0
  75. package/fusionfile.mjs +155 -0
  76. package/images/ajax-loader.gif +0 -0
  77. package/images/placeholder/avatar.png +0 -0
  78. package/images/placeholder/image-16x10.png +0 -0
  79. package/images/placeholder/image-16x9.png +0 -0
  80. package/images/placeholder/image-1x1.png +0 -0
  81. package/images/placeholder/image-4x3.png +0 -0
  82. package/package.json +102 -0
  83. package/scss/bootstrap/multi-level-menu.scss +121 -0
  84. package/scss/editor.scss +116 -0
  85. package/scss/field/file-drag.scss +102 -0
  86. package/scss/field/single-image-drag.scss +88 -0
  87. package/scss/field/vue-drag-uploader.scss +160 -0
  88. package/scss/switcher.scss +156 -0
  89. package/src/app.ts +128 -0
  90. package/src/bootstrap/button-radio.ts +208 -0
  91. package/src/bootstrap/keep-tab.ts +155 -0
  92. package/src/composable/index.ts +21 -0
  93. package/src/composable/useCheckboxesMultiSelect.ts +22 -0
  94. package/src/composable/useFieldCascadeSelect.ts +9 -0
  95. package/src/composable/useFieldFileDrag.ts +9 -0
  96. package/src/composable/useFieldFlatpickr.ts +3 -0
  97. package/src/composable/useFieldModalSelect.ts +6 -0
  98. package/src/composable/useFieldModalTree.ts +3 -0
  99. package/src/composable/useFieldMultiUploader.ts +3 -0
  100. package/src/composable/useFieldRepeatable.ts +9 -0
  101. package/src/composable/useFieldSingleImageDrag.ts +5 -0
  102. package/src/composable/useForm.ts +43 -0
  103. package/src/composable/useGrid.ts +57 -0
  104. package/src/composable/useHttp.ts +8 -0
  105. package/src/composable/useIframeModal.ts +9 -0
  106. package/src/composable/useListDependent.ts +26 -0
  107. package/src/composable/useQueue.ts +13 -0
  108. package/src/composable/useS3Uploader.ts +32 -0
  109. package/src/composable/useShowOn.ts +9 -0
  110. package/src/composable/useStack.ts +13 -0
  111. package/src/composable/useTinymce.ts +29 -0
  112. package/src/composable/useTomSelect.ts +72 -0
  113. package/src/composable/useUIBootstrap5.ts +48 -0
  114. package/src/composable/useUniDirective.ts +32 -0
  115. package/src/composable/useValidation.ts +39 -0
  116. package/src/data.ts +36 -0
  117. package/src/events.ts +73 -0
  118. package/src/legacy/legacy.ts +186 -0
  119. package/src/legacy/loader.ts +125 -0
  120. package/src/module/checkboxes-multi-select.ts +54 -0
  121. package/src/module/field-cascade-select.ts +292 -0
  122. package/src/module/field-file-drag.ts +292 -0
  123. package/src/module/field-flatpickr.ts +127 -0
  124. package/src/module/field-modal-select.ts +174 -0
  125. package/src/module/field-modal-tree.ts +27 -0
  126. package/src/module/field-multi-uploader.ts +361 -0
  127. package/src/module/field-repeatable.ts +202 -0
  128. package/src/module/field-single-image-drag.ts +468 -0
  129. package/src/module/form.ts +223 -0
  130. package/src/module/grid.ts +465 -0
  131. package/src/module/http-client.ts +243 -0
  132. package/src/module/iframe-modal.ts +167 -0
  133. package/src/module/list-dependent.ts +321 -0
  134. package/src/module/s3-multipart-uploader.ts +300 -0
  135. package/src/module/s3-uploader.ts +234 -0
  136. package/src/module/show-on.ts +173 -0
  137. package/src/module/tinymce.ts +263 -0
  138. package/src/module/ui-bootstrap5.ts +107 -0
  139. package/src/module/validation.ts +1019 -0
  140. package/src/plugin/index.ts +1 -0
  141. package/src/plugin/php-adapter.ts +65 -0
  142. package/src/polyfill/form-request-submit.ts +31 -0
  143. package/src/polyfill/index.ts +9 -0
  144. package/src/service/animate.ts +58 -0
  145. package/src/service/crypto.ts +27 -0
  146. package/src/service/dom-watcher.ts +62 -0
  147. package/src/service/dom.ts +265 -0
  148. package/src/service/helper.ts +48 -0
  149. package/src/service/index.ts +10 -0
  150. package/src/service/lang.ts +122 -0
  151. package/src/service/loader.ts +152 -0
  152. package/src/service/router.ts +118 -0
  153. package/src/service/ui.ts +497 -0
  154. package/src/service/uri.ts +106 -0
  155. package/src/types/base.ts +9 -0
  156. package/src/types/index.ts +4 -0
  157. package/src/types/modal-tree.ts +12 -0
  158. package/src/types/plugin.ts +6 -0
  159. package/src/types/shims.d.ts +18 -0
  160. package/src/types/ui.ts +6 -0
  161. package/src/unicorn.ts +63 -0
  162. package/src/utilities/arr.ts +25 -0
  163. package/src/utilities/base.ts +9 -0
  164. package/src/utilities/data.ts +48 -0
  165. package/src/utilities/index.ts +5 -0
  166. package/src/utilities/tree.ts +20 -0
  167. package/src/vue/components/ModalTree/ModalTreeApp.vue +175 -0
  168. package/src/vue/components/ModalTree/TreeItem.vue +262 -0
  169. package/src/vue/components/ModalTree/TreeModal.vue +225 -0
  170. package/tests/test.js +4 -0
  171. package/tsconfig.js.json +25 -0
  172. package/tsconfig.json +17 -0
  173. package/vite.assets.config.ts +61 -0
  174. package/vite.config.test.ts +36 -0
  175. package/vite.config.ts +112 -0
@@ -0,0 +1,790 @@
1
+ import { ab as forceArray, u as useHttpClient, a9 as useCssImport, aa as data } from "./unicorn.js";
2
+ import { defineComponent, ref, computed, h, Transition, withDirectives, mergeProps, vShow, unref, inject, watch, onBeforeUpdate, nextTick, onMounted, createElementBlock, openBlock, normalizeClass, createElementVNode, createBlock, createCommentVNode, normalizeStyle, vModelDynamic, withModifiers, createTextVNode, toDisplayString, withCtx, Fragment, renderList, useTemplateRef, onUnmounted, provide, vModelText, createVNode, TransitionGroup, createApp } from "vue";
3
+ import { Modal } from "bootstrap";
4
+ import { c as cloneDeep } from "./cloneDeep.js";
5
+ function flattenChildren(children) {
6
+ const flat = [];
7
+ function loopChildren(children2) {
8
+ for (const child of children2) {
9
+ if (child.children.length === 0) {
10
+ flat.push(child);
11
+ continue;
12
+ }
13
+ loopChildren(child.children);
14
+ }
15
+ }
16
+ loopChildren(children);
17
+ return flat;
18
+ }
19
+ function y(t) {
20
+ return {
21
+ height: t.style.height,
22
+ width: t.style.width,
23
+ position: t.style.position,
24
+ visibility: t.style.visibility,
25
+ overflow: t.style.overflow,
26
+ paddingTop: t.style.paddingTop,
27
+ paddingBottom: t.style.paddingBottom,
28
+ borderTopWidth: t.style.borderTopWidth,
29
+ borderBottomWidth: t.style.borderBottomWidth,
30
+ marginTop: t.style.marginTop,
31
+ marginBottom: t.style.marginBottom
32
+ };
33
+ }
34
+ function V(t, o, i) {
35
+ const e = unref(t), { width: n } = getComputedStyle(o);
36
+ o.style.width = n, o.style.position = "absolute", o.style.visibility = "hidden", o.style.height = "";
37
+ const { height: s } = getComputedStyle(o);
38
+ return o.style.width = i.width, o.style.position = i.position, o.style.visibility = i.visibility, o.style.height = e, o.style.overflow = "hidden", i.height && i.height != e ? i.height : s;
39
+ }
40
+ function f(t, o, i, e, n) {
41
+ const s = t.animate(e, n);
42
+ t.style.height = o.height, s.onfinish = () => {
43
+ t.style.overflow = o.overflow, i();
44
+ };
45
+ }
46
+ function m(t, o, i, e) {
47
+ const n = unref(o);
48
+ return [
49
+ {
50
+ height: n,
51
+ opacity: t.opacityClosed,
52
+ paddingTop: n,
53
+ paddingBottom: n,
54
+ borderTopWidth: n,
55
+ borderBottomWidth: n,
56
+ marginTop: n,
57
+ marginBottom: n
58
+ },
59
+ {
60
+ height: i,
61
+ opacity: t.opacityOpen,
62
+ paddingTop: e.paddingTop || 0,
63
+ paddingBottom: e.paddingBottom || 0,
64
+ borderTopWidth: e.borderTopWidth || 0,
65
+ borderBottomWidth: e.borderBottomWidth || 0,
66
+ marginTop: e.marginTop || 0,
67
+ marginBottom: e.marginBottom || 0
68
+ }
69
+ ];
70
+ }
71
+ const x = /* @__PURE__ */ defineComponent({
72
+ props: {
73
+ modelValue: {
74
+ type: Boolean,
75
+ default: false
76
+ },
77
+ /**
78
+ * Time in milliseconds for the slide duration
79
+ */
80
+ duration: {
81
+ type: Number,
82
+ default: 500
83
+ },
84
+ /**
85
+ * Timing function for the animation
86
+ */
87
+ timingFunction: {
88
+ type: String,
89
+ default: "ease-in-out"
90
+ },
91
+ /**
92
+ * Independent timing function for the animation when entering
93
+ */
94
+ timingFunctionEnter: {
95
+ type: String,
96
+ default: null
97
+ },
98
+ /**
99
+ * Independent timing function for the animation when leaving
100
+ */
101
+ timingFunctionLeave: {
102
+ type: String,
103
+ default: null
104
+ },
105
+ /**
106
+ * Opacity value from 0 - 1 of the element when open
107
+ */
108
+ opacityOpen: {
109
+ type: Number,
110
+ default: 1
111
+ },
112
+ /**
113
+ * Opacity value from 0 - 1 of the element when closed
114
+ */
115
+ opacityClosed: {
116
+ type: Number,
117
+ default: 0
118
+ },
119
+ /**
120
+ * HTML tag to use for the outer container
121
+ */
122
+ tag: {
123
+ type: String,
124
+ default: "div"
125
+ },
126
+ /**
127
+ * Always render the element inside the slide container
128
+ */
129
+ eager: {
130
+ type: Boolean,
131
+ default: false
132
+ }
133
+ },
134
+ emits: ["update:modelValue", "open-start", "open-end", "close-start", "close-end"],
135
+ setup(t, { slots: o, attrs: i, emit: e }) {
136
+ const n = ref("0px"), s = computed(() => t.timingFunctionEnter || t.timingFunction), v = computed(() => t.timingFunctionLeave || t.timingFunction);
137
+ function T(g, l) {
138
+ const d = g, a = y(d), r = V(n, d, a), u = m(t, n, r, a), c = { duration: t.duration, easing: s.value };
139
+ f(d, a, () => {
140
+ l(), e("open-end");
141
+ }, u, c);
142
+ }
143
+ function B(g, l) {
144
+ const d = g, a = y(d), { height: r } = getComputedStyle(d);
145
+ d.style.height = r, d.style.overflow = "hidden";
146
+ const u = m(t, n, r, a).reverse(), c = { duration: t.duration, easing: v.value };
147
+ f(d, a, () => {
148
+ l(), e("close-end");
149
+ }, u, c);
150
+ }
151
+ return () => h(
152
+ Transition,
153
+ {
154
+ css: false,
155
+ persisted: t.eager,
156
+ onBeforeEnter: () => e("open-start"),
157
+ onEnter: T,
158
+ onBeforeLeave: () => e("close-start"),
159
+ onLeave: B
160
+ },
161
+ {
162
+ default: () => t.modelValue || t.eager ? withDirectives(
163
+ h(
164
+ t.tag,
165
+ mergeProps(i, {
166
+ class: "slide-up-down__container"
167
+ }),
168
+ o
169
+ ),
170
+ [t.eager ? [vShow, t.modelValue === true] : [null]]
171
+ ) : null
172
+ }
173
+ );
174
+ }
175
+ });
176
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
177
+ __name: "TreeItem",
178
+ props: {
179
+ node: {},
180
+ level: { default: 1 },
181
+ branchSelectable: { type: Boolean, default: false }
182
+ },
183
+ emits: ["change", "input"],
184
+ setup(__props, { expose: __expose, emit: __emit }) {
185
+ const props = __props;
186
+ const emit = __emit;
187
+ const node = ref(props.node);
188
+ const selectedValues = inject("selectedValues");
189
+ const id = inject("id");
190
+ const multiple = inject("multiple");
191
+ const valueGetter = inject("valueGetter");
192
+ const titleGetter = inject("titleGetter");
193
+ const selected = ref(false);
194
+ const indeterminate = computed(() => !!props.node.indeterminate);
195
+ const stopWatch = ref(false);
196
+ const open = ref(false);
197
+ const childrenComponents = ref([]);
198
+ watch(() => props.node, () => {
199
+ selected.value = !!props.node.selected;
200
+ }, { deep: true });
201
+ function setChildrenComponent(child) {
202
+ childrenComponents.value.push(child);
203
+ }
204
+ onBeforeUpdate(() => {
205
+ childrenComponents.value = [];
206
+ });
207
+ const indentPx = computed(() => {
208
+ return (props.level - 1) * 15;
209
+ });
210
+ const isBranch = computed(() => {
211
+ return props.node.children.length > 0;
212
+ });
213
+ const isLeaf = computed(() => {
214
+ return !isBranch.value;
215
+ });
216
+ function updateSelected() {
217
+ if (isBranch.value) {
218
+ return;
219
+ }
220
+ node.value.selected = selectedValues.value.includes(valueGetter(props.node.value));
221
+ }
222
+ function select(select2) {
223
+ if (selected.value === select2) {
224
+ return;
225
+ }
226
+ node.value.selected = select2;
227
+ checkboxChanged(select2);
228
+ }
229
+ function checkboxChanged(v) {
230
+ if (isBranch.value) {
231
+ node.value.selected = v;
232
+ if (multiple) {
233
+ stopWatchThen(() => {
234
+ const flatChildren = flattenChildren(node.value.children);
235
+ for (const child of flatChildren) {
236
+ child.selected = v;
237
+ child.indeterminate = false;
238
+ }
239
+ });
240
+ }
241
+ } else {
242
+ nextTick(() => {
243
+ node.value.selected = v;
244
+ });
245
+ }
246
+ emit("change", v);
247
+ emit("input", v);
248
+ }
249
+ function childChanged(v) {
250
+ if (isLeaf.value || stopWatch.value) {
251
+ return;
252
+ }
253
+ if (!childrenComponents.value) {
254
+ return;
255
+ }
256
+ if (childrenComponents.value.length === 0) {
257
+ return;
258
+ }
259
+ syncChildrenStatus();
260
+ }
261
+ function syncChildrenStatus() {
262
+ if (isLeaf.value) {
263
+ return;
264
+ }
265
+ let selectedCount = 0;
266
+ let unselectCount = 0;
267
+ let indeterminateInner = 0;
268
+ const oldIndeterminate = indeterminate.value;
269
+ const oldSelected = selected.value;
270
+ for (const child of flattenChildren(props.node.children)) {
271
+ if (child.selected) {
272
+ selectedCount++;
273
+ } else {
274
+ unselectCount++;
275
+ }
276
+ if (child.indeterminate) {
277
+ indeterminateInner++;
278
+ }
279
+ }
280
+ if (selectedCount !== 0 && unselectCount !== 0 || indeterminateInner > 0) {
281
+ node.value.indeterminate = true;
282
+ } else {
283
+ node.value.selected = unselectCount === 0;
284
+ node.value.indeterminate = false;
285
+ }
286
+ if (selected.value !== oldSelected || indeterminate.value !== oldIndeterminate) {
287
+ emit("change", selected.value);
288
+ emit("input", selected.value);
289
+ }
290
+ }
291
+ function stopWatchThen(callback) {
292
+ stopWatch.value = true;
293
+ callback();
294
+ stopWatch.value = false;
295
+ }
296
+ watch(() => selectedValues, async () => {
297
+ if (!isBranch.value) {
298
+ updateSelected();
299
+ }
300
+ await nextTick();
301
+ syncChildrenStatus();
302
+ }, { deep: true });
303
+ watch(selected, (v) => {
304
+ });
305
+ updateSelected();
306
+ onMounted(() => {
307
+ syncChildrenStatus();
308
+ });
309
+ __expose({
310
+ select,
311
+ selected,
312
+ indeterminate
313
+ });
314
+ const __returned__ = { props, emit, node, selectedValues, id, multiple, valueGetter, titleGetter, selected, indeterminate, stopWatch, open, childrenComponents, setChildrenComponent, indentPx, isBranch, isLeaf, updateSelected, select, checkboxChanged, childChanged, syncChildrenStatus, stopWatchThen, get Vue3SlideUpDown() {
315
+ return x;
316
+ }, TreeItem };
317
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
318
+ return __returned__;
319
+ }
320
+ });
321
+ const _export_sfc = (sfc, props) => {
322
+ const target = sfc.__vccOpts || sfc;
323
+ for (const [key, val] of props) {
324
+ target[key] = val;
325
+ }
326
+ return target;
327
+ };
328
+ const _hoisted_1$2 = { class: "p-2 ms-2" };
329
+ const _hoisted_2$2 = ["type", "id", "indeterminate"];
330
+ const _hoisted_3$2 = ["type", "checked", "indeterminate"];
331
+ const _hoisted_4$2 = ["data-level"];
332
+ const _hoisted_5$2 = {
333
+ key: 0,
334
+ class: "ms-auto me-3"
335
+ };
336
+ function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
337
+ return openBlock(), createElementBlock("div", {
338
+ class: normalizeClass(["c-tree-item", [$setup.isBranch ? "c-tree-item--branch" : "c-tree-item--leaf"]])
339
+ }, [
340
+ createElementVNode("div", {
341
+ class: normalizeClass(["d-flex c-tree-item__title", [$setup.isBranch ? "bg-light " : ""]]),
342
+ style: normalizeStyle({ "padding-left": $setup.indentPx + "px" })
343
+ }, [
344
+ createElementVNode("div", _hoisted_1$2, [
345
+ $setup.isLeaf || $props.branchSelectable && $setup.multiple ? withDirectives((openBlock(), createElementBlock("input", {
346
+ key: 0,
347
+ type: $setup.multiple ? "checkbox" : "radio",
348
+ class: "form-check-input",
349
+ id: $setup.id + "__item-" + $setup.valueGetter($setup.node.value),
350
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.selected = $event),
351
+ value: true,
352
+ "unchecked-value": false,
353
+ indeterminate: $setup.indeterminate,
354
+ onChange: _cache[1] || (_cache[1] = ($event) => $setup.checkboxChanged($event.target.checked))
355
+ }, null, 40, _hoisted_2$2)), [
356
+ [vModelDynamic, $setup.selected]
357
+ ]) : (openBlock(), createElementBlock("input", {
358
+ key: 1,
359
+ type: $setup.multiple ? "checkbox" : "radio",
360
+ class: "form-check-input",
361
+ disabled: "",
362
+ checked: $setup.indeterminate,
363
+ indeterminate: $setup.indeterminate
364
+ }, null, 8, _hoisted_3$2))
365
+ ]),
366
+ createElementVNode("a", {
367
+ class: "c-tree-item__text d-flex align-items-center flex-grow-1 py-2 text-decoration-none",
368
+ style: { "cursor": "pointer" },
369
+ "data-level": $props.level,
370
+ "data-bs-toggle": "collapse",
371
+ onClick: _cache[2] || (_cache[2] = withModifiers(($event) => $setup.isLeaf ? $setup.select(!$setup.selected) : $setup.open = !$setup.open, ["prevent"]))
372
+ }, [
373
+ createElementVNode("span", {
374
+ class: normalizeClass(["me-2 fa", [$setup.isLeaf ? "fa-tag" : "fa-folder"]])
375
+ }, null, 2),
376
+ createTextVNode(" " + toDisplayString($setup.node.value.title) + " ", 1),
377
+ $setup.isBranch ? (openBlock(), createElementBlock("span", _hoisted_5$2, [
378
+ createElementVNode("span", {
379
+ class: normalizeClass([$setup.open ? "fa fa-chevron-up" : "fa fa-chevron-down"])
380
+ }, null, 2)
381
+ ])) : createCommentVNode("", true)
382
+ ], 8, _hoisted_4$2)
383
+ ], 6),
384
+ $setup.node.children.length > 0 ? (openBlock(), createBlock($setup["Vue3SlideUpDown"], {
385
+ key: 0,
386
+ modelValue: $setup.open,
387
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => $setup.open = $event),
388
+ duration: 300,
389
+ class: "c-tree-item__children"
390
+ }, {
391
+ default: withCtx(() => [
392
+ (openBlock(true), createElementBlock(Fragment, null, renderList($setup.node.children, (child, i) => {
393
+ return openBlock(), createBlock($setup["TreeItem"], {
394
+ node: child,
395
+ key: $setup.valueGetter(child.value),
396
+ level: $props.level + 1,
397
+ "branch-selectable": $props.branchSelectable,
398
+ ref_for: true,
399
+ ref: $setup.setChildrenComponent,
400
+ onChange: $setup.childChanged
401
+ }, null, 8, ["node", "level", "branch-selectable"]);
402
+ }), 128))
403
+ ]),
404
+ _: 1
405
+ }, 8, ["modelValue"])) : createCommentVNode("", true)
406
+ ], 2);
407
+ }
408
+ const TreeItem = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$2], ["__scopeId", "data-v-8a4ae0be"], ["__file", "TreeItem.vue"]]);
409
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
410
+ __name: "TreeModal",
411
+ props: {
412
+ open: { type: Boolean },
413
+ id: {},
414
+ name: {},
415
+ types: {},
416
+ title: {},
417
+ disabled: { type: Boolean },
418
+ readonly: { type: Boolean },
419
+ value: {},
420
+ branchSelectable: { type: Boolean, default: false },
421
+ source: {},
422
+ searchText: {}
423
+ },
424
+ emits: ["change", "input", "selected", "hide"],
425
+ setup(__props, { expose: __expose, emit: __emit }) {
426
+ __expose();
427
+ const props = __props;
428
+ const emits = __emit;
429
+ const valueGetter = inject("valueGetter");
430
+ const titleGetter = inject("titleGetter");
431
+ const searchMatcher = inject("searchMatcher");
432
+ const loading = ref(false);
433
+ const multiple = inject("multiple", false);
434
+ const modalElement = useTemplateRef("modal");
435
+ let $modal;
436
+ onMounted(() => {
437
+ $modal = Modal.getOrCreateInstance(modalElement.value);
438
+ modalElement.value.addEventListener("show.bs.modal", onShow);
439
+ modalElement.value.addEventListener("hide.bs.modal", onHide);
440
+ });
441
+ onUnmounted(() => {
442
+ modalElement.value.removeEventListener("show.bs.modal", onShow);
443
+ modalElement.value.removeEventListener("hide.bs.modal", onHide);
444
+ });
445
+ const nodes = ref([]);
446
+ const selectedNodes = ref([]);
447
+ const displayNodes = computed(() => {
448
+ if (searchEnabled.value) {
449
+ return searchedItems.value;
450
+ }
451
+ return nodes.value;
452
+ });
453
+ const flatNodes = computed(() => flattenChildren(nodes.value));
454
+ const selectedValues = computed(() => {
455
+ return flatNodes.value.filter((node) => node.selected).map((node) => valueGetter(node.value));
456
+ });
457
+ provide("selectedValues", selectedValues);
458
+ watch(() => selectedValues, () => {
459
+ emits("change", selectedValues.value);
460
+ emits("input", selectedValues.value);
461
+ emits("selected", selectedNodes.value);
462
+ });
463
+ const canModify = computed(() => {
464
+ return !props.readonly && !props.disabled;
465
+ });
466
+ const q = ref("");
467
+ const searchEnabled = computed(() => q.value !== "");
468
+ const searchedItems = computed(() => {
469
+ if (q.value === "") {
470
+ return [];
471
+ }
472
+ return flatNodes.value.filter((item) => {
473
+ return searchMatcher(item.value, q.value);
474
+ });
475
+ });
476
+ async function loadItems() {
477
+ loading.value = true;
478
+ const http = await useHttpClient();
479
+ try {
480
+ let src = props.source;
481
+ if (typeof src === "string") {
482
+ const res = await http.get(src);
483
+ nodes.value = res.data.data;
484
+ } else if (typeof src === "function") {
485
+ nodes.value = await src();
486
+ } else {
487
+ if (!Array.isArray(src)) {
488
+ src = src.children;
489
+ }
490
+ nodes.value = src;
491
+ }
492
+ } finally {
493
+ loading.value = false;
494
+ }
495
+ }
496
+ watch(() => props.open, (v) => {
497
+ if (v) {
498
+ $modal.show();
499
+ } else {
500
+ $modal.hide();
501
+ }
502
+ });
503
+ async function onShow() {
504
+ await loadItems();
505
+ updateSelectedItemsByValue();
506
+ }
507
+ function onHide() {
508
+ nodes.value = [];
509
+ q.value = "";
510
+ emits("hide");
511
+ }
512
+ function updateSelectedItemsByValue() {
513
+ const values = forceArray(props.value);
514
+ selectedNodes.value = flatNodes.value.filter((item) => {
515
+ return values.includes(valueGetter(item.value));
516
+ });
517
+ }
518
+ watch(
519
+ () => props.value,
520
+ () => updateSelectedItemsByValue(),
521
+ { immediate: true, deep: true }
522
+ );
523
+ const __returned__ = { props, emits, valueGetter, titleGetter, searchMatcher, loading, multiple, modalElement, get $modal() {
524
+ return $modal;
525
+ }, set $modal(v) {
526
+ $modal = v;
527
+ }, nodes, selectedNodes, displayNodes, flatNodes, selectedValues, canModify, q, searchEnabled, searchedItems, loadItems, onShow, onHide, updateSelectedItemsByValue, TreeItem };
528
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
529
+ return __returned__;
530
+ }
531
+ });
532
+ const _hoisted_1$1 = ["id"];
533
+ const _hoisted_2$1 = {
534
+ class: "modal-dialog",
535
+ role: "document"
536
+ };
537
+ const _hoisted_3$1 = { class: "modal-content" };
538
+ const _hoisted_4$1 = { class: "modal-header" };
539
+ const _hoisted_5$1 = ["id"];
540
+ const _hoisted_6$1 = { class: "modal-body p-0" };
541
+ const _hoisted_7$1 = { class: "std-form box-list m-3" };
542
+ const _hoisted_8 = { class: "form-group" };
543
+ const _hoisted_9 = ["placeholder"];
544
+ const _hoisted_10 = {
545
+ key: 0,
546
+ class: "box-list__items"
547
+ };
548
+ const _hoisted_11 = { key: 1 };
549
+ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
550
+ return openBlock(), createElementBlock("div", {
551
+ ref: "modal",
552
+ class: "modal fade",
553
+ id: `${$props.id}__modal`,
554
+ tabindex: "-1",
555
+ role: "dialog",
556
+ "aria-labelledby": "-modal-label",
557
+ "aria-hidden": "true"
558
+ }, [
559
+ createElementVNode("div", _hoisted_2$1, [
560
+ createElementVNode("div", _hoisted_3$1, [
561
+ createElementVNode("div", _hoisted_4$1, [
562
+ createElementVNode("h4", {
563
+ class: "modal-title",
564
+ id: `${$props.id}__modal-label`
565
+ }, toDisplayString($props.title), 9, _hoisted_5$1),
566
+ _cache[1] || (_cache[1] = createElementVNode("button", {
567
+ type: "button",
568
+ class: "close btn-close",
569
+ "data-bs-dismiss": "modal",
570
+ "data-dismiss": "modal",
571
+ "aria-label": "Close"
572
+ }, [
573
+ createElementVNode("span", {
574
+ "aria-hidden": "true",
575
+ class: "visually-hidden"
576
+ }, "×")
577
+ ], -1))
578
+ ]),
579
+ createElementVNode("div", _hoisted_6$1, [
580
+ createElementVNode("div", _hoisted_7$1, [
581
+ createElementVNode("div", _hoisted_8, [
582
+ withDirectives(createElementVNode("input", {
583
+ type: "search",
584
+ class: "form-control",
585
+ placeholder: $props.searchText,
586
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.q = $event)
587
+ }, null, 8, _hoisted_9), [
588
+ [vModelText, $setup.q]
589
+ ])
590
+ ])
591
+ ]),
592
+ !$setup.loading ? (openBlock(), createElementBlock("div", _hoisted_10, [
593
+ (openBlock(true), createElementBlock(Fragment, null, renderList($setup.displayNodes, (node) => {
594
+ return openBlock(), createBlock($setup["TreeItem"], {
595
+ node,
596
+ key: $setup.valueGetter(node.value),
597
+ level: 1,
598
+ branchSelectable: $props.branchSelectable
599
+ }, null, 8, ["node", "branchSelectable"]);
600
+ }), 128))
601
+ ])) : (openBlock(), createElementBlock("div", _hoisted_11, [..._cache[2] || (_cache[2] = [
602
+ createElementVNode("div", { class: "d-flex justify-content-center" }, [
603
+ createElementVNode("div", { class: "spinner-border spinner-border-sm my-3" })
604
+ ], -1)
605
+ ])]))
606
+ ])
607
+ ])
608
+ ])
609
+ ], 8, _hoisted_1$1);
610
+ }
611
+ const TreeModal = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__file", "TreeModal.vue"]]);
612
+ const _sfc_main = /* @__PURE__ */ defineComponent({
613
+ __name: "ModalTreeApp",
614
+ props: {
615
+ id: {},
616
+ name: {},
617
+ title: {},
618
+ disabled: { type: Boolean },
619
+ readonly: { type: Boolean },
620
+ value: {},
621
+ source: {},
622
+ items: {},
623
+ valueGetter: { type: Function, default: (item) => item.id },
624
+ titleGetter: { type: Function, default: (item) => item.title },
625
+ searchMatcher: {},
626
+ modalTitle: {},
627
+ vertical: { type: Boolean },
628
+ branchSelectable: { type: Boolean, default: false },
629
+ selectAllChildren: { type: Boolean, default: false },
630
+ placeholder: { default: "- No selected -" },
631
+ multiple: { type: Boolean, default: false },
632
+ buttonText: { default: "Select" },
633
+ itemClass: { default: "badge bg-primary badge-pill" },
634
+ searchText: { default: "Search" }
635
+ },
636
+ setup(__props, { expose: __expose }) {
637
+ __expose();
638
+ const props = __props;
639
+ provide("id", props.id);
640
+ provide("name", props.name);
641
+ provide("multiple", props.multiple);
642
+ provide("valueGetter", props.valueGetter);
643
+ provide("titleGetter", props.titleGetter);
644
+ provide("searchMatcher", props.searchMatcher ?? defaultSearchMatcher);
645
+ function defaultSearchMatcher(item, q) {
646
+ return props.titleGetter(item).toLowerCase().includes(q.toLowerCase());
647
+ }
648
+ const selected = ref([]);
649
+ const value = ref(forceArray(props.value));
650
+ const treeModalOpen = ref(false);
651
+ function openSelector() {
652
+ treeModalOpen.value = true;
653
+ }
654
+ function deleteItem(i, node) {
655
+ selected.value = selected.value.filter((it) => props.valueGetter(it.value) !== props.valueGetter(node.value));
656
+ }
657
+ function handleSelected(items) {
658
+ selected.value = cloneDeep(items);
659
+ }
660
+ watch(() => props.items, async (v) => {
661
+ if (typeof v === "function") {
662
+ v = await v();
663
+ }
664
+ selected.value = forceArray(v).filter((node) => {
665
+ return value.value.includes(props.valueGetter(node.value));
666
+ });
667
+ }, { immediate: true });
668
+ const selectedValues = computed(() => {
669
+ return selected.value.map((node) => props.valueGetter(node.value));
670
+ });
671
+ const canModify = computed(() => {
672
+ return !props.readonly && !props.disabled;
673
+ });
674
+ const __returned__ = { props, defaultSearchMatcher, selected, value, treeModalOpen, openSelector, deleteItem, handleSelected, selectedValues, canModify, TreeModal };
675
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
676
+ return __returned__;
677
+ }
678
+ });
679
+ const _hoisted_1 = { class: "c-modal-tree" };
680
+ const _hoisted_2 = { class: "btn-group" };
681
+ const _hoisted_3 = { key: 1 };
682
+ const _hoisted_4 = ["onClick"];
683
+ const _hoisted_5 = {
684
+ key: 2,
685
+ class: "text-muted"
686
+ };
687
+ const _hoisted_6 = ["id", "name", "disabled", "readonly"];
688
+ const _hoisted_7 = ["value"];
689
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
690
+ return openBlock(), createElementBlock("div", _hoisted_1, [
691
+ createElementVNode("div", {
692
+ class: normalizeClass(["c-modal-tree__container p-2 d-flex flex-column", [$props.vertical ? "" : "flex-md-row"]])
693
+ }, [
694
+ $setup.canModify ? (openBlock(), createElementBlock("div", {
695
+ key: 0,
696
+ class: normalizeClass(["me-2 mb-2", { "mb-md-0": !$props.vertical }])
697
+ }, [
698
+ createElementVNode("div", _hoisted_2, [
699
+ createElementVNode("button", {
700
+ class: "btn btn-secondary btn-sm btn-rounded text-nowrap",
701
+ type: "button",
702
+ onClick: $setup.openSelector
703
+ }, toDisplayString($props.buttonText), 1),
704
+ createElementVNode("button", {
705
+ class: "btn btn-secondary btn-sm btn-rounded",
706
+ type: "button",
707
+ onClick: _cache[0] || (_cache[0] = ($event) => $setup.selected = [])
708
+ }, [..._cache[2] || (_cache[2] = [
709
+ createElementVNode("span", { class: "fa fa-times" }, null, -1)
710
+ ])])
711
+ ])
712
+ ], 2)) : createCommentVNode("", true),
713
+ $setup.selected.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_3, [
714
+ createVNode(TransitionGroup, { name: "fade" }, {
715
+ default: withCtx(() => [
716
+ (openBlock(true), createElementBlock(Fragment, null, renderList($setup.selected, (node, i) => {
717
+ return openBlock(), createElementBlock("span", {
718
+ class: normalizeClass(["me-2 mb-2 c-item", $props.itemClass]),
719
+ key: $props.valueGetter(node.value),
720
+ style: { "animation-duration": ".3s" }
721
+ }, [
722
+ createElementVNode("span", null, toDisplayString($props.titleGetter(node.value)), 1),
723
+ $setup.canModify ? (openBlock(), createElementBlock("span", {
724
+ key: 0,
725
+ type: "button",
726
+ onClick: withModifiers(($event) => $setup.deleteItem(i, node), ["prevent"]),
727
+ class: "ms-2",
728
+ style: { "cursor": "pointer" }
729
+ }, [..._cache[3] || (_cache[3] = [
730
+ createElementVNode("span", { class: "fa fa-times" }, null, -1)
731
+ ])], 8, _hoisted_4)) : createCommentVNode("", true)
732
+ ], 2);
733
+ }), 128))
734
+ ]),
735
+ _: 1
736
+ })
737
+ ])) : (openBlock(), createElementBlock("div", _hoisted_5, toDisplayString($props.placeholder), 1))
738
+ ], 2),
739
+ createElementVNode("select", mergeProps({
740
+ multiple: "",
741
+ style: { "display": "none" },
742
+ ref: "input",
743
+ id: $props.id,
744
+ name: $props.name,
745
+ disabled: $props.disabled,
746
+ readonly: $props.readonly
747
+ }, _ctx.$attrs), [
748
+ (openBlock(true), createElementBlock(Fragment, null, renderList($setup.selectedValues, (id) => {
749
+ return openBlock(), createElementBlock("option", {
750
+ value: id,
751
+ selected: true
752
+ }, toDisplayString(id), 9, _hoisted_7);
753
+ }), 256))
754
+ ], 16, _hoisted_6),
755
+ createVNode($setup["TreeModal"], mergeProps({
756
+ open: $setup.treeModalOpen,
757
+ onHide: _cache[1] || (_cache[1] = ($event) => $setup.treeModalOpen = false),
758
+ id: $props.id,
759
+ title: $props.modalTitle,
760
+ source: $props.source,
761
+ value: $setup.selectedValues,
762
+ branchSelectable: $props.branchSelectable
763
+ }, _ctx.$attrs, {
764
+ disabled: $props.disabled,
765
+ readonly: $props.readonly,
766
+ "search-text": $props.searchText,
767
+ onSelected: $setup.handleSelected
768
+ }), null, 16, ["open", "id", "title", "source", "value", "branchSelectable", "disabled", "readonly", "search-text"])
769
+ ]);
770
+ }
771
+ const ModalTreeApp = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-22fa7050"], ["__file", "ModalTreeApp.vue"]]);
772
+ /* @__PURE__ */ useCssImport("@vue-animate");
773
+ const app = /* @__PURE__ */ createApp({
774
+ name: "modal-tree",
775
+ components: {
776
+ ModalTreeApp
777
+ }
778
+ });
779
+ app.config.globalProperties.$getData = data;
780
+ class ModalTreeElement extends HTMLElement {
781
+ static is = "modal-tree";
782
+ vm;
783
+ connectedCallback() {
784
+ if (!this.vm) {
785
+ this.vm = app.mount(this);
786
+ }
787
+ }
788
+ }
789
+ /* @__PURE__ */ customElements.define(/* @__PURE__ */ (() => ModalTreeElement.is)(), ModalTreeElement);
790
+ //# sourceMappingURL=field-modal-tree.js.map