@windwalker-io/unicorn-next 0.1.18 → 0.1.21

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 (108) hide show
  1. package/dist/chunks/_arrayPush.js +325 -108
  2. package/dist/chunks/_arrayPush.js.map +1 -1
  3. package/dist/chunks/_baseRest.js +155 -60
  4. package/dist/chunks/_baseRest.js.map +1 -1
  5. package/dist/chunks/_baseUnary.js +463 -0
  6. package/dist/chunks/_baseUnary.js.map +1 -0
  7. package/dist/chunks/_getPrototype.js +292 -100
  8. package/dist/chunks/_getPrototype.js.map +1 -1
  9. package/dist/chunks/alert-adapter.js +29 -0
  10. package/dist/chunks/alert-adapter.js.map +1 -0
  11. package/dist/chunks/alert.js +21 -0
  12. package/dist/chunks/alert.js.map +1 -0
  13. package/dist/chunks/arr.js +24 -0
  14. package/dist/chunks/arr.js.map +1 -0
  15. package/dist/chunks/button-radio.js +127 -145
  16. package/dist/chunks/button-radio.js.map +1 -1
  17. package/dist/chunks/checkboxes-multi-select.js +44 -43
  18. package/dist/chunks/checkboxes-multi-select.js.map +1 -1
  19. package/dist/chunks/chunk.js +24 -0
  20. package/dist/chunks/cloneDeep.js +679 -212
  21. package/dist/chunks/cloneDeep.js.map +1 -1
  22. package/dist/chunks/cropper.min.js +6 -5
  23. package/dist/chunks/cropper.min.js.map +1 -1
  24. package/dist/chunks/crypto.js +26 -0
  25. package/dist/chunks/crypto.js.map +1 -0
  26. package/dist/chunks/data.js +49 -0
  27. package/dist/chunks/data.js.map +1 -0
  28. package/dist/chunks/dom.js +128 -0
  29. package/dist/chunks/dom.js.map +1 -0
  30. package/dist/chunks/events.js +270 -0
  31. package/dist/chunks/events.js.map +1 -0
  32. package/dist/chunks/field-cascade-select.js +207 -250
  33. package/dist/chunks/field-cascade-select.js.map +1 -1
  34. package/dist/chunks/field-file-drag.js +175 -209
  35. package/dist/chunks/field-file-drag.js.map +1 -1
  36. package/dist/chunks/field-flatpickr.js +94 -898
  37. package/dist/chunks/field-flatpickr.js.map +1 -1
  38. package/dist/chunks/field-modal-select.js +728 -467
  39. package/dist/chunks/field-modal-select.js.map +1 -1
  40. package/dist/chunks/field-modal-tree.js +771 -766
  41. package/dist/chunks/field-modal-tree.js.map +1 -1
  42. package/dist/chunks/field-multi-uploader.js +249 -256
  43. package/dist/chunks/field-multi-uploader.js.map +1 -1
  44. package/dist/chunks/field-repeatable.js +111 -127
  45. package/dist/chunks/field-repeatable.js.map +1 -1
  46. package/dist/chunks/field-single-image-drag.js +286 -338
  47. package/dist/chunks/field-single-image-drag.js.map +1 -1
  48. package/dist/chunks/form.js +146 -159
  49. package/dist/chunks/form.js.map +1 -1
  50. package/dist/chunks/grid.js +349 -418
  51. package/dist/chunks/grid.js.map +1 -1
  52. package/dist/chunks/helper.js +39 -0
  53. package/dist/chunks/helper.js.map +1 -0
  54. package/dist/chunks/http-client.js +221 -211
  55. package/dist/chunks/http-client.js.map +1 -1
  56. package/dist/chunks/iframe-modal.js +95 -115
  57. package/dist/chunks/iframe-modal.js.map +1 -1
  58. package/dist/chunks/keep-tab.js +92 -101
  59. package/dist/chunks/keep-tab.js.map +1 -1
  60. package/dist/chunks/lang.js +250 -0
  61. package/dist/chunks/lang.js.map +1 -0
  62. package/dist/chunks/legacy.js +197 -201
  63. package/dist/chunks/legacy.js.map +1 -1
  64. package/dist/chunks/list-dependent.js +195 -228
  65. package/dist/chunks/list-dependent.js.map +1 -1
  66. package/dist/chunks/loader.js +106 -0
  67. package/dist/chunks/loader.js.map +1 -0
  68. package/dist/chunks/monthSelect.js +251 -0
  69. package/dist/chunks/monthSelect.js.map +1 -0
  70. package/dist/chunks/router.js +111 -0
  71. package/dist/chunks/router.js.map +1 -0
  72. package/dist/chunks/s3-multipart-uploader.js +183 -210
  73. package/dist/chunks/s3-multipart-uploader.js.map +1 -1
  74. package/dist/chunks/s3-uploader.js +106 -128
  75. package/dist/chunks/s3-uploader.js.map +1 -1
  76. package/dist/chunks/show-on.js +358 -205
  77. package/dist/chunks/show-on.js.map +1 -1
  78. package/dist/chunks/timing.js +10 -0
  79. package/dist/chunks/timing.js.map +1 -0
  80. package/dist/chunks/tinymce.js +153 -203
  81. package/dist/chunks/tinymce.js.map +1 -1
  82. package/dist/chunks/ui-bootstrap5.js +58 -72
  83. package/dist/chunks/ui-bootstrap5.js.map +1 -1
  84. package/dist/chunks/ui.js +320 -0
  85. package/dist/chunks/ui.js.map +1 -0
  86. package/dist/chunks/unicorn.js.map +1 -1
  87. package/dist/chunks/useQueue.js +111 -0
  88. package/dist/chunks/useQueue.js.map +1 -0
  89. package/dist/chunks/useStack.js +76 -0
  90. package/dist/chunks/useStack.js.map +1 -0
  91. package/dist/chunks/validation.js +761 -853
  92. package/dist/chunks/validation.js.map +1 -1
  93. package/dist/editor.css +1 -1
  94. package/dist/index.d.ts +27 -15
  95. package/dist/multi-level-menu.css +1 -1
  96. package/dist/switcher.css +1 -1
  97. package/dist/unicorn.js +805 -130
  98. package/dist/unicorn.js.map +1 -1
  99. package/package.json +3 -3
  100. package/src/composable/useBsModalAlert.ts +92 -12
  101. package/src/composable/useHttp.ts +13 -1
  102. package/src/module/s3-uploader.ts +1 -1
  103. package/src/service/ui.ts +31 -15
  104. package/vite.config.ts +5 -1
  105. package/dist/chunks/_commonjsHelpers.js +0 -7
  106. package/dist/chunks/index.js +0 -314
  107. package/dist/chunks/isArguments.js +0 -146
  108. package/dist/chunks/unicorn.js +0 -2580
@@ -1,231 +1,198 @@
1
- import { a as useUniDirective, x as getBoundedInstance, v as selectOne, u as useHttpClient, B as html, a6 as mergeDeep } from "./unicorn.js";
2
- const nope = () => {
1
+ import { t as mergeDeep } from "./arr.js";
2
+ import { d as selectOne, o as html, r as getBoundedInstance } from "./dom.js";
3
+ import { useHttpClient, useUniDirective } from "../unicorn.js";
4
+ //#region src/module/list-dependent.ts
5
+ var nope = () => {};
6
+ var defaultOptions = {
7
+ ajax: {
8
+ url: null,
9
+ value_field: "value",
10
+ data: {}
11
+ },
12
+ source: void 0,
13
+ text_field: "title",
14
+ value_field: "id",
15
+ first_option: void 0,
16
+ default_value: null,
17
+ initial_load: true,
18
+ empty_mark: "__EMPTY__",
19
+ hooks: {
20
+ before_request: nope,
21
+ after_request: nope
22
+ }
3
23
  };
4
- const defaultOptions = {
5
- ajax: {
6
- url: null,
7
- value_field: "value",
8
- data: {}
9
- },
10
- source: void 0,
11
- text_field: "title",
12
- value_field: "id",
13
- first_option: void 0,
14
- default_value: null,
15
- initial_load: true,
16
- empty_mark: "__EMPTY__",
17
- hooks: {
18
- before_request: nope,
19
- after_request: nope
20
- }
24
+ var ListDependent = class {
25
+ element;
26
+ dependent;
27
+ options;
28
+ abortController = null;
29
+ static handle(el, dependent, options = {}) {
30
+ return getBoundedInstance(el, "list-dependent", () => {
31
+ return new this(el, dependent, options);
32
+ });
33
+ }
34
+ constructor(element, dependent, options = {}) {
35
+ this.options = this.mergeOptions(options);
36
+ this.element = selectOne(element);
37
+ if (!dependent) dependent = this.element.dataset.dependent || "";
38
+ this.dependent = selectOne(dependent);
39
+ this.bindEvents();
40
+ if (this.options.initial_load) this.changeList(this.dependent.value, true);
41
+ }
42
+ /**
43
+ * Bind events.
44
+ */
45
+ bindEvents() {
46
+ this.dependent.addEventListener("change", (event) => {
47
+ this.changeList(event.currentTarget?.value);
48
+ });
49
+ }
50
+ /**
51
+ * Update the list elements.
52
+ *
53
+ * @param {*} value
54
+ * @param {bool} initial
55
+ */
56
+ changeList(value, initial = false) {
57
+ value = value || this.dependent.value;
58
+ if (value === "") value = this.options.empty_mark;
59
+ if (this.options.ajax.url) this.ajaxUpdate(value);
60
+ else if (this.options.source) this.sourceUpdate(value, initial);
61
+ }
62
+ /**
63
+ * Update list by source.
64
+ */
65
+ sourceUpdate(value, initial = false) {
66
+ const source = this.options.source;
67
+ if (!source) return;
68
+ this.beforeHook(value, this.element, this.dependent);
69
+ if (source[value]) this.updateListElements(source[value]);
70
+ else {
71
+ this.updateListElements([]);
72
+ if (!initial && value !== "" && parseInt(value) !== 0) console.log("List for value: " + value + " not found.");
73
+ }
74
+ this.afterHook(value, this.element, this.dependent);
75
+ }
76
+ /**
77
+ * Do ajax.
78
+ *
79
+ * @param {string} value
80
+ */
81
+ async ajaxUpdate(value) {
82
+ let data = {};
83
+ data[this.options.ajax.value_field] = value;
84
+ if (typeof this.options.ajax.data === "object") data = {
85
+ ...data,
86
+ ...this.options.ajax.data
87
+ };
88
+ else if (typeof this.options.ajax.data === "function") data = this.options.ajax.data(data, this) || data;
89
+ this.beforeHook(value, this.element, this.dependent);
90
+ this.abort();
91
+ let url = this.options.ajax.url;
92
+ if (typeof url === "function") url = url(this);
93
+ if (!url) throw new Error("Ajax URL is not set.");
94
+ const http = await useHttpClient();
95
+ this.abortController = new AbortController();
96
+ try {
97
+ const { success, data: returnData } = (await http.get(url, {
98
+ params: data,
99
+ signal: this.abortController.signal
100
+ })).data;
101
+ if (success) this.updateListElements(returnData);
102
+ else console.error(returnData);
103
+ } catch (e) {
104
+ console.error(e);
105
+ } finally {
106
+ this.afterHook(value, this.element, this.dependent);
107
+ this.abortController = null;
108
+ }
109
+ }
110
+ abort() {
111
+ if (this.abortController) {
112
+ this.abortController.abort();
113
+ this.abortController = null;
114
+ }
115
+ }
116
+ updateListElements(items) {
117
+ const textField = this.options.text_field;
118
+ const valueField = this.options.value_field;
119
+ this.element.innerHTML = "";
120
+ if (this.options.first_option && Array.isArray(items)) {
121
+ items.unshift({});
122
+ items[0][textField] = this.options.first_option[textField];
123
+ items[0][valueField] = this.options.first_option[valueField];
124
+ }
125
+ for (const i in items) {
126
+ const item = items[i];
127
+ if (Array.isArray(item)) {
128
+ const group = html(`<optgroup label="${i}"></optgroup>`);
129
+ for (const k in item) {
130
+ const child = item[k];
131
+ this.appendOptionTo({
132
+ value: child[valueField],
133
+ text: child[textField],
134
+ attributes: child.attributes
135
+ }, group);
136
+ }
137
+ this.element.appendChild(group);
138
+ continue;
139
+ }
140
+ this.appendOptionTo({
141
+ value: item[valueField],
142
+ text: item[textField],
143
+ attributes: item.attributes
144
+ }, this.element);
145
+ }
146
+ this.element.dispatchEvent(new CustomEvent("change"));
147
+ this.element.dispatchEvent(new CustomEvent("list:updated"));
148
+ }
149
+ appendOptionTo(item, parent) {
150
+ const value = item.value;
151
+ const option = html("<option>" + item.text + "</option>");
152
+ option.setAttribute("value", value);
153
+ if (item.attributes) for (const index in item.attributes) {
154
+ const val = item.attributes[index];
155
+ option.setAttribute(index, val);
156
+ }
157
+ if (this.isSelected(value)) option.setAttribute("selected", "selected");
158
+ parent.appendChild(option);
159
+ }
160
+ isSelected(value) {
161
+ let defaultValues = [];
162
+ let defValue = this.element.dataset.selected ?? this.options.default_value;
163
+ if (typeof defValue === "function") defValue = defValue(value, this);
164
+ if (Array.isArray(defValue)) defaultValues = defValue;
165
+ else if (defValue && typeof defValue === "object") defaultValues = Object.keys(defValue);
166
+ else defaultValues = [defValue];
167
+ return defaultValues.indexOf(value) !== -1;
168
+ }
169
+ /**
170
+ * Before hook.
171
+ */
172
+ beforeHook(value, element, dependent) {
173
+ return this.options.hooks.before_request.call(this, value, element, dependent);
174
+ }
175
+ /**
176
+ * After hook.
177
+ */
178
+ afterHook(value, element, dependent) {
179
+ return this.options.hooks.after_request.call(this, value, element, dependent);
180
+ }
181
+ mergeOptions(options) {
182
+ return mergeDeep({}, defaultOptions, options);
183
+ }
21
184
  };
22
- class ListDependent {
23
- element;
24
- dependent;
25
- options;
26
- abortController = null;
27
- static handle(el, dependent, options = {}) {
28
- return getBoundedInstance(el, "list-dependent", () => {
29
- return new this(el, dependent, options);
30
- });
31
- }
32
- constructor(element, dependent, options = {}) {
33
- this.options = this.mergeOptions(options);
34
- this.element = selectOne(element);
35
- if (!dependent) {
36
- dependent = this.element.dataset.dependent || "";
37
- }
38
- this.dependent = selectOne(dependent);
39
- this.bindEvents();
40
- if (this.options.initial_load) {
41
- this.changeList(this.dependent.value, true);
42
- }
43
- }
44
- /**
45
- * Bind events.
46
- */
47
- bindEvents() {
48
- this.dependent.addEventListener("change", (event) => {
49
- this.changeList(event.currentTarget?.value);
50
- });
51
- }
52
- /**
53
- * Update the list elements.
54
- *
55
- * @param {*} value
56
- * @param {bool} initial
57
- */
58
- changeList(value, initial = false) {
59
- value = value || this.dependent.value;
60
- if (value === "") {
61
- value = this.options.empty_mark;
62
- }
63
- if (this.options.ajax.url) {
64
- this.ajaxUpdate(value);
65
- } else if (this.options.source) {
66
- this.sourceUpdate(value, initial);
67
- }
68
- }
69
- /**
70
- * Update list by source.
71
- */
72
- sourceUpdate(value, initial = false) {
73
- const source = this.options.source;
74
- if (!source) {
75
- return;
76
- }
77
- this.beforeHook(value, this.element, this.dependent);
78
- if (source[value]) {
79
- this.updateListElements(source[value]);
80
- } else {
81
- this.updateListElements([]);
82
- if (!initial && value !== "" && parseInt(value) !== 0) {
83
- console.log("List for value: " + value + " not found.");
84
- }
85
- }
86
- this.afterHook(value, this.element, this.dependent);
87
- }
88
- /**
89
- * Do ajax.
90
- *
91
- * @param {string} value
92
- */
93
- async ajaxUpdate(value) {
94
- let data = {};
95
- data[this.options.ajax.value_field] = value;
96
- if (typeof this.options.ajax.data === "object") {
97
- data = { ...data, ...this.options.ajax.data };
98
- } else if (typeof this.options.ajax.data === "function") {
99
- data = this.options.ajax.data(data, this) || data;
100
- }
101
- this.beforeHook(value, this.element, this.dependent);
102
- this.abort();
103
- let url = this.options.ajax.url;
104
- if (typeof url === "function") {
105
- url = url(this);
106
- }
107
- if (!url) {
108
- throw new Error("Ajax URL is not set.");
109
- }
110
- const http = await useHttpClient();
111
- this.abortController = new AbortController();
112
- try {
113
- const res = await http.get(url, {
114
- params: data,
115
- signal: this.abortController.signal
116
- });
117
- const { success, data: returnData } = res.data;
118
- if (success) {
119
- this.updateListElements(returnData);
120
- } else {
121
- console.error(returnData);
122
- }
123
- } catch (e) {
124
- console.error(e);
125
- } finally {
126
- this.afterHook(value, this.element, this.dependent);
127
- this.abortController = null;
128
- }
129
- }
130
- abort() {
131
- if (this.abortController) {
132
- this.abortController.abort();
133
- this.abortController = null;
134
- }
135
- }
136
- updateListElements(items) {
137
- const textField = this.options.text_field;
138
- const valueField = this.options.value_field;
139
- this.element.innerHTML = "";
140
- if (this.options.first_option && Array.isArray(items)) {
141
- items.unshift({});
142
- items[0][textField] = this.options.first_option[textField];
143
- items[0][valueField] = this.options.first_option[valueField];
144
- }
145
- for (const i in items) {
146
- const item = items[i];
147
- if (Array.isArray(item)) {
148
- const group = html(`<optgroup label="${i}"></optgroup>`);
149
- for (const k in item) {
150
- const child = item[k];
151
- this.appendOptionTo({
152
- value: child[valueField],
153
- text: child[textField],
154
- attributes: child.attributes
155
- }, group);
156
- }
157
- this.element.appendChild(group);
158
- continue;
159
- }
160
- this.appendOptionTo({
161
- value: item[valueField],
162
- text: item[textField],
163
- attributes: item.attributes
164
- }, this.element);
165
- }
166
- this.element.dispatchEvent(new CustomEvent("change"));
167
- this.element.dispatchEvent(new CustomEvent("list:updated"));
168
- }
169
- appendOptionTo(item, parent) {
170
- const value = item.value;
171
- const option = html("<option>" + item.text + "</option>");
172
- option.setAttribute("value", value);
173
- if (item.attributes) {
174
- for (const index in item.attributes) {
175
- const val = item.attributes[index];
176
- option.setAttribute(index, val);
177
- }
178
- }
179
- if (this.isSelected(value)) {
180
- option.setAttribute("selected", "selected");
181
- }
182
- parent.appendChild(option);
183
- }
184
- isSelected(value) {
185
- let defaultValues = [];
186
- let defValue = this.element.dataset.selected ?? this.options.default_value;
187
- if (typeof defValue === "function") {
188
- defValue = defValue(value, this);
189
- }
190
- if (Array.isArray(defValue)) {
191
- defaultValues = defValue;
192
- } else if (defValue && typeof defValue === "object") {
193
- defaultValues = Object.keys(defValue);
194
- } else {
195
- defaultValues = [defValue];
196
- }
197
- return defaultValues.indexOf(value) !== -1;
198
- }
199
- /**
200
- * Before hook.
201
- */
202
- beforeHook(value, element, dependent) {
203
- const before = this.options.hooks.before_request;
204
- return before.call(this, value, element, dependent);
205
- }
206
- /**
207
- * After hook.
208
- */
209
- afterHook(value, element, dependent) {
210
- const after = this.options.hooks.after_request;
211
- return after.call(this, value, element, dependent);
212
- }
213
- mergeOptions(options) {
214
- return mergeDeep({}, defaultOptions, options);
215
- }
216
- }
217
- const ready = /* @__PURE__ */ useUniDirective("list-dependent", {
218
- mounted(el, binding) {
219
- const options = JSON.parse(binding.value);
220
- ListDependent.handle(el, options.dependent, options);
221
- },
222
- updated(el, binding) {
223
- const options = JSON.parse(binding.value);
224
- ListDependent.handle(el).mergeOptions(options);
225
- }
185
+ var ready = /* @__PURE__ */ useUniDirective("list-dependent", {
186
+ mounted(el, binding) {
187
+ const options = JSON.parse(binding.value);
188
+ ListDependent.handle(el, options.dependent, options);
189
+ },
190
+ updated(el, binding) {
191
+ const options = JSON.parse(binding.value);
192
+ ListDependent.handle(el).mergeOptions(options);
193
+ }
226
194
  });
227
- export {
228
- ListDependent,
229
- ready
230
- };
231
- //# sourceMappingURL=list-dependent.js.map
195
+ //#endregion
196
+ export { ListDependent, ready };
197
+
198
+ //# sourceMappingURL=list-dependent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-dependent.js","sources":["../../src/module/list-dependent.ts"],"sourcesContent":["\nimport type { CancelTokenSource } from 'axios';\nimport { useHttpClient, useUniDirective } from '../composable';\nimport { getBoundedInstance, html, selectOne } from '../service';\nimport { mergeDeep } from '../utilities';\n\nconst nope = () => {};\n\nexport interface ListDependentOptions {\n ajax: {\n url: string | null | ((self: ListDependent) => string);\n value_field: string;\n data: Record<string, any> | ((data: Record<string, any>, self: ListDependent) => Record<string, any>);\n };\n source?: Record<string, any>;\n text_field: string;\n value_field: string;\n first_option?: Record<string, any>;\n default_value: any;\n initial_load: boolean;\n empty_mark: string;\n hooks: {\n before_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n after_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n };\n}\n\nconst defaultOptions: ListDependentOptions = {\n ajax: {\n url: null,\n value_field: 'value',\n data: {},\n },\n source: undefined,\n text_field: 'title',\n value_field: 'id',\n first_option: undefined,\n default_value: null,\n initial_load: true,\n empty_mark: '__EMPTY__',\n hooks: {\n before_request: nope,\n after_request: nope\n }\n};\n\ntype ListItems = Record<string, any>[];\ntype MaybeGroupedListItems = Record<string, ListItems> | ListItems;\n\nexport class ListDependent {\n element: HTMLSelectElement;\n dependent: HTMLSelectElement;\n options: ListDependentOptions;\n abortController: AbortController | null = null;\n\n static handle(el: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}): ListDependent {\n return getBoundedInstance(el, 'list-dependent', () => {\n return new this(el, dependent, options);\n });\n }\n\n constructor(element: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}) {\n this.options = this.mergeOptions(options);\n\n this.element = selectOne<HTMLSelectElement>(element)!;\n\n if (!dependent) {\n dependent = this.element.dataset.dependent || '';\n }\n\n this.dependent = selectOne<HTMLSelectElement>(dependent)!;\n\n this.bindEvents();\n\n if (this.options.initial_load) {\n this.changeList(this.dependent.value, true);\n }\n }\n\n /**\n * Bind events.\n */\n bindEvents() {\n this.dependent.addEventListener('change', (event) => {\n this.changeList((event.currentTarget as HTMLSelectElement)?.value);\n });\n }\n\n /**\n * Update the list elements.\n *\n * @param {*} value\n * @param {bool} initial\n */\n changeList(value: string, initial = false) {\n value = value || this.dependent.value;\n\n // Empty mark\n if (value === '') {\n value = this.options.empty_mark;\n }\n\n if (this.options.ajax.url) {\n this.ajaxUpdate(value);\n } else if (this.options.source) {\n this.sourceUpdate(value, initial);\n }\n }\n\n /**\n * Update list by source.\n */\n sourceUpdate(value: string, initial = false) {\n const source = this.options.source;\n\n if (!source) {\n return;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n if (source[value]) {\n this.updateListElements(source[value]);\n } else {\n this.updateListElements([]);\n\n if (!initial && value !== '' && parseInt(value) !== 0) {\n console.log('List for value: ' + value + ' not found.');\n }\n }\n\n this.afterHook(value, this.element, this.dependent);\n }\n\n /**\n * Do ajax.\n *\n * @param {string} value\n */\n async ajaxUpdate(value: string) {\n let data: Record<string, any> = {};\n\n data[this.options.ajax.value_field] = value;\n\n if (typeof this.options.ajax.data === 'object') {\n data = { ...data, ...this.options.ajax.data };\n } else if (typeof this.options.ajax.data === 'function') {\n data = this.options.ajax.data(data, this) || data;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n this.abort();\n\n let url = this.options.ajax.url;\n\n if (typeof url === 'function') {\n url = url(this);\n }\n\n if (!url) {\n throw new Error('Ajax URL is not set.');\n }\n\n const http = await useHttpClient();\n\n this.abortController = new AbortController();\n\n try {\n const res = await http.get<{\n success: boolean;\n data: any;\n }>(url, {\n params: data,\n signal: this.abortController.signal\n });\n\n const { success, data: returnData } = res.data;\n\n if (success) {\n this.updateListElements(returnData);\n } else {\n console.error(returnData);\n }\n\n } catch (e) {\n console.error(e);\n } finally {\n this.afterHook(value, this.element, this.dependent);\n this.abortController = null;\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n }\n\n updateListElements(items: MaybeGroupedListItems) {\n const textField = this.options.text_field;\n const valueField = this.options.value_field;\n this.element.innerHTML = '';\n\n if (this.options.first_option && Array.isArray(items)) {\n items.unshift({});\n items[0][textField] = this.options.first_option[textField];\n items[0][valueField] = this.options.first_option[valueField];\n }\n\n for (const i in items) {\n const item = items[i as keyof typeof items] as Record<string, any> | ListItems;\n\n if (Array.isArray(item)) {\n const group = html(`<optgroup label=\"${i}\"></optgroup>`);\n\n for (const k in item) {\n const child = item[k];\n this.appendOptionTo({\n value: child[valueField],\n text: child[textField],\n attributes: child.attributes,\n }, group);\n }\n\n this.element.appendChild(group);\n continue;\n }\n\n this.appendOptionTo({\n value: item[valueField],\n text: item[textField],\n attributes: item.attributes,\n }, this.element);\n }\n\n this.element.dispatchEvent(new CustomEvent('change'));\n this.element.dispatchEvent(new CustomEvent('list:updated'));\n }\n\n appendOptionTo(item: any, parent: any) {\n const value = item.value;\n const option = html('<option>' + item.text + '</option>');\n option.setAttribute('value', value);\n\n if (item.attributes) {\n for (const index in item.attributes) {\n const val = item.attributes[index];\n option.setAttribute(index, val);\n }\n }\n\n if (this.isSelected(value)) {\n option.setAttribute('selected', 'selected');\n }\n\n parent.appendChild(option);\n }\n\n isSelected(value: string) {\n let defaultValues: any[] = [];\n\n // Convert all types to array\n let defValue = this.element.dataset.selected ?? this.options.default_value;\n\n if (typeof defValue === 'function') {\n defValue = defValue(value, this);\n }\n\n if (Array.isArray(defValue)) {\n defaultValues = defValue;\n } else if (defValue && typeof defValue === 'object') {\n defaultValues = Object.keys(defValue);\n } else {\n defaultValues = [defValue];\n }\n\n return defaultValues.indexOf(value) !== -1;\n }\n\n /**\n * Before hook.\n */\n beforeHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const before = this.options.hooks.before_request;\n\n return before.call(this, value, element, dependent);\n }\n\n /**\n * After hook.\n */\n afterHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const after = this.options.hooks.after_request;\n\n return after.call(this, value, element, dependent);\n }\n\n mergeOptions(options: Partial<ListDependentOptions>): ListDependentOptions {\n return mergeDeep<ListDependentOptions>({}, defaultOptions, options);\n }\n}\n\nexport const ready = useUniDirective<HTMLSelectElement>('list-dependent', {\n mounted(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el, options.dependent, options);\n },\n updated(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el).mergeOptions(options);\n }\n});\n\nexport type ListDependentModule = {\n ListDependent: typeof ListDependent;\n ready: typeof ready;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list-dependent.js","names":[],"sources":["../../src/module/list-dependent.ts"],"sourcesContent":["\nimport type { CancelTokenSource } from 'axios';\nimport { useHttpClient, useUniDirective } from '../composable';\nimport { getBoundedInstance, html, selectOne } from '../service';\nimport { mergeDeep } from '../utilities';\n\nconst nope = () => {};\n\nexport interface ListDependentOptions {\n ajax: {\n url: string | null | ((self: ListDependent) => string);\n value_field: string;\n data: Record<string, any> | ((data: Record<string, any>, self: ListDependent) => Record<string, any>);\n };\n source?: Record<string, any>;\n text_field: string;\n value_field: string;\n first_option?: Record<string, any>;\n default_value: any;\n initial_load: boolean;\n empty_mark: string;\n hooks: {\n before_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n after_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n };\n}\n\nconst defaultOptions: ListDependentOptions = {\n ajax: {\n url: null,\n value_field: 'value',\n data: {},\n },\n source: undefined,\n text_field: 'title',\n value_field: 'id',\n first_option: undefined,\n default_value: null,\n initial_load: true,\n empty_mark: '__EMPTY__',\n hooks: {\n before_request: nope,\n after_request: nope\n }\n};\n\ntype ListItems = Record<string, any>[];\ntype MaybeGroupedListItems = Record<string, ListItems> | ListItems;\n\nexport class ListDependent {\n element: HTMLSelectElement;\n dependent: HTMLSelectElement;\n options: ListDependentOptions;\n abortController: AbortController | null = null;\n\n static handle(el: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}): ListDependent {\n return getBoundedInstance(el, 'list-dependent', () => {\n return new this(el, dependent, options);\n });\n }\n\n constructor(element: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}) {\n this.options = this.mergeOptions(options);\n\n this.element = selectOne<HTMLSelectElement>(element)!;\n\n if (!dependent) {\n dependent = this.element.dataset.dependent || '';\n }\n\n this.dependent = selectOne<HTMLSelectElement>(dependent)!;\n\n this.bindEvents();\n\n if (this.options.initial_load) {\n this.changeList(this.dependent.value, true);\n }\n }\n\n /**\n * Bind events.\n */\n bindEvents() {\n this.dependent.addEventListener('change', (event) => {\n this.changeList((event.currentTarget as HTMLSelectElement)?.value);\n });\n }\n\n /**\n * Update the list elements.\n *\n * @param {*} value\n * @param {bool} initial\n */\n changeList(value: string, initial = false) {\n value = value || this.dependent.value;\n\n // Empty mark\n if (value === '') {\n value = this.options.empty_mark;\n }\n\n if (this.options.ajax.url) {\n this.ajaxUpdate(value);\n } else if (this.options.source) {\n this.sourceUpdate(value, initial);\n }\n }\n\n /**\n * Update list by source.\n */\n sourceUpdate(value: string, initial = false) {\n const source = this.options.source;\n\n if (!source) {\n return;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n if (source[value]) {\n this.updateListElements(source[value]);\n } else {\n this.updateListElements([]);\n\n if (!initial && value !== '' && parseInt(value) !== 0) {\n console.log('List for value: ' + value + ' not found.');\n }\n }\n\n this.afterHook(value, this.element, this.dependent);\n }\n\n /**\n * Do ajax.\n *\n * @param {string} value\n */\n async ajaxUpdate(value: string) {\n let data: Record<string, any> = {};\n\n data[this.options.ajax.value_field] = value;\n\n if (typeof this.options.ajax.data === 'object') {\n data = { ...data, ...this.options.ajax.data };\n } else if (typeof this.options.ajax.data === 'function') {\n data = this.options.ajax.data(data, this) || data;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n this.abort();\n\n let url = this.options.ajax.url;\n\n if (typeof url === 'function') {\n url = url(this);\n }\n\n if (!url) {\n throw new Error('Ajax URL is not set.');\n }\n\n const http = await useHttpClient();\n\n this.abortController = new AbortController();\n\n try {\n const res = await http.get<{\n success: boolean;\n data: any;\n }>(url, {\n params: data,\n signal: this.abortController.signal\n });\n\n const { success, data: returnData } = res.data;\n\n if (success) {\n this.updateListElements(returnData);\n } else {\n console.error(returnData);\n }\n\n } catch (e) {\n console.error(e);\n } finally {\n this.afterHook(value, this.element, this.dependent);\n this.abortController = null;\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n }\n\n updateListElements(items: MaybeGroupedListItems) {\n const textField = this.options.text_field;\n const valueField = this.options.value_field;\n this.element.innerHTML = '';\n\n if (this.options.first_option && Array.isArray(items)) {\n items.unshift({});\n items[0][textField] = this.options.first_option[textField];\n items[0][valueField] = this.options.first_option[valueField];\n }\n\n for (const i in items) {\n const item = items[i as keyof typeof items] as Record<string, any> | ListItems;\n\n if (Array.isArray(item)) {\n const group = html(`<optgroup label=\"${i}\"></optgroup>`);\n\n for (const k in item) {\n const child = item[k];\n this.appendOptionTo({\n value: child[valueField],\n text: child[textField],\n attributes: child.attributes,\n }, group);\n }\n\n this.element.appendChild(group);\n continue;\n }\n\n this.appendOptionTo({\n value: item[valueField],\n text: item[textField],\n attributes: item.attributes,\n }, this.element);\n }\n\n this.element.dispatchEvent(new CustomEvent('change'));\n this.element.dispatchEvent(new CustomEvent('list:updated'));\n }\n\n appendOptionTo(item: any, parent: any) {\n const value = item.value;\n const option = html('<option>' + item.text + '</option>');\n option.setAttribute('value', value);\n\n if (item.attributes) {\n for (const index in item.attributes) {\n const val = item.attributes[index];\n option.setAttribute(index, val);\n }\n }\n\n if (this.isSelected(value)) {\n option.setAttribute('selected', 'selected');\n }\n\n parent.appendChild(option);\n }\n\n isSelected(value: string) {\n let defaultValues: any[] = [];\n\n // Convert all types to array\n let defValue = this.element.dataset.selected ?? this.options.default_value;\n\n if (typeof defValue === 'function') {\n defValue = defValue(value, this);\n }\n\n if (Array.isArray(defValue)) {\n defaultValues = defValue;\n } else if (defValue && typeof defValue === 'object') {\n defaultValues = Object.keys(defValue);\n } else {\n defaultValues = [defValue];\n }\n\n return defaultValues.indexOf(value) !== -1;\n }\n\n /**\n * Before hook.\n */\n beforeHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const before = this.options.hooks.before_request;\n\n return before.call(this, value, element, dependent);\n }\n\n /**\n * After hook.\n */\n afterHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const after = this.options.hooks.after_request;\n\n return after.call(this, value, element, dependent);\n }\n\n mergeOptions(options: Partial<ListDependentOptions>): ListDependentOptions {\n return mergeDeep<ListDependentOptions>({}, defaultOptions, options);\n }\n}\n\nexport const ready = useUniDirective<HTMLSelectElement>('list-dependent', {\n mounted(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el, options.dependent, options);\n },\n updated(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el).mergeOptions(options);\n }\n});\n\nexport type ListDependentModule = {\n ListDependent: typeof ListDependent;\n ready: typeof ready;\n};\n"],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { s as injectCssToDocument } from "./dom.js";
2
+ //#region src/service/loader.ts
3
+ async function useScriptImport(src, attrs = {}) {
4
+ if (typeof src === "function") src = (await src()).default;
5
+ const script = document.createElement("script");
6
+ script.src = resolveUrl(src);
7
+ for (const key in attrs) script.setAttribute(key, attrs[key]);
8
+ return new Promise((resolve, reject) => {
9
+ script.onload = () => {
10
+ resolve();
11
+ document.body.removeChild(script);
12
+ };
13
+ script.onerror = (e) => {
14
+ reject(e);
15
+ document.body.removeChild(script);
16
+ };
17
+ document.body.appendChild(script);
18
+ });
19
+ }
20
+ function doImport(src) {
21
+ return import(
22
+ /* @vite-ignore */
23
+ src
24
+ );
25
+ }
26
+ async function useImport(...src) {
27
+ if (src.length === 1) return doImport(src[0]);
28
+ const promises = [];
29
+ src.forEach((link) => {
30
+ promises.push(link instanceof Promise ? link : doImport(link));
31
+ });
32
+ return Promise.all(promises);
33
+ }
34
+ async function useSeriesImport(...src) {
35
+ const modules = [];
36
+ for (const source of src) {
37
+ if (Array.isArray(source)) {
38
+ const m = await useImport(...source);
39
+ modules.push(m);
40
+ continue;
41
+ }
42
+ const m = await useImport(source);
43
+ modules.push(m);
44
+ }
45
+ return modules;
46
+ }
47
+ async function useCssIncludes(...hrefs) {
48
+ const promises = hrefs.map((href) => {
49
+ return new Promise((resolve, reject) => {
50
+ resolveSource(href).then((href) => {
51
+ href = resolveUrl(href);
52
+ const link = document.createElement("link");
53
+ link.rel = "stylesheet";
54
+ link.href = href;
55
+ link.onload = () => resolve();
56
+ link.onerror = (e) => reject(e);
57
+ document.head.appendChild(link);
58
+ });
59
+ });
60
+ });
61
+ return Promise.all(promises);
62
+ }
63
+ var importedSheets = {};
64
+ async function useCssImport(...hrefs) {
65
+ return injectCssToDocument(...(await Promise.all(hrefs.map((href) => {
66
+ return new Promise((resolve) => {
67
+ resolveSource(href).then((href) => {
68
+ href = resolveUrl(href);
69
+ if (!importedSheets[href]) importedSheets[href] = simulateCssImport(href);
70
+ resolve(importedSheets[href]);
71
+ });
72
+ });
73
+ }))).map((module) => module.default));
74
+ }
75
+ async function simulateCssImport(href) {
76
+ const response = await fetch(href);
77
+ if (!response.ok) throw new Error(`Failed to load CSS: ${href}`);
78
+ const cssText = await response.text();
79
+ const sheet = new CSSStyleSheet();
80
+ await sheet.replace(cssText);
81
+ return { default: sheet };
82
+ }
83
+ var importMap;
84
+ function parseImportMap() {
85
+ const importMapScript = document.querySelector("script[type=\"importmap\"]");
86
+ if (importMapScript) try {
87
+ return JSON.parse(importMapScript.textContent || "{}").imports || {};
88
+ } catch (e) {
89
+ console.error("Failed to parse import map:", e);
90
+ }
91
+ return {};
92
+ }
93
+ function resolveUrl(specifier) {
94
+ importMap ??= parseImportMap();
95
+ for (const [prefix, target] of Object.entries(importMap)) if (specifier === prefix) return target;
96
+ for (const [prefix, target] of Object.entries(importMap)) if (specifier.startsWith(prefix)) return specifier.replace(prefix, target);
97
+ return specifier;
98
+ }
99
+ async function resolveSource(src) {
100
+ if (typeof src === "function") return (await src()).default;
101
+ return src;
102
+ }
103
+ //#endregion
104
+ export { useScriptImport as a, useImport as i, useCssImport as n, useSeriesImport as o, useCssIncludes as r, doImport as t };
105
+
106
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","names":[],"sources":["../../src/service/loader.ts"],"sourcesContent":["import { Dictionary } from '../types';\nimport { injectCssToDocument } from './';\n\ntype Source = string | (() => Promise<{ default: string }>);\n\nexport async function useScriptImport(src: Source, attrs: Record<string, string> = {}): Promise<void> {\n if (typeof src === 'function') {\n src = (await src()).default;\n }\n\n const script = document.createElement('script');\n script.src = resolveUrl(src);\n\n for (const key in attrs) {\n script.setAttribute(key, attrs[key]);\n }\n\n return new Promise((resolve, reject) => {\n script.onload = () => {\n resolve();\n document.body.removeChild(script);\n };\n script.onerror = (e) => {\n reject(e);\n document.body.removeChild(script);\n };\n\n document.body.appendChild(script);\n });\n}\n\nexport function doImport<T = any>(src: string): Promise<T> {\n return import(/* @vite-ignore */src);\n}\n\nexport async function useImport(...src: any[]): Promise<any>;\nexport async function useImport<T extends any[]>(...src: string[]): Promise<T>;\nexport async function useImport<T = any>(src: string): Promise<{ default: T }>;\nexport async function useImport<D = any, C = any>(src: string): Promise<{ default: D } & Dictionary<C>>;\nexport async function useImport(...src: any[]): Promise<any> {\n if (src.length === 1) {\n return doImport(src[0]);\n }\n\n const promises: Promise<any>[] = [];\n\n src.forEach((link) => {\n promises.push(\n link instanceof Promise ? link : doImport(link)\n );\n });\n\n return Promise.all(promises);\n}\n\nexport async function useSeriesImport(...src: any[]): Promise<any>;\nexport async function useSeriesImport<T extends any[]>(...src: string[]): Promise<T>;\nexport async function useSeriesImport<T = any>(src: string): Promise<{ default: T }>;\nexport async function useSeriesImport<D = any, C = any>(src: string): Promise<{ default: D } & Dictionary<C>>;\nexport async function useSeriesImport(...src: any[]): Promise<any> {\n const modules: any[] = [];\n\n for (const source of src) {\n if (Array.isArray(source)) {\n const m = await useImport(...source);\n modules.push(m);\n\n continue;\n }\n\n const m = await useImport(source);\n\n modules.push(m);\n }\n\n return modules;\n}\n\nexport async function useCssIncludes(...hrefs: Source[]): Promise<void[]> {\n const promises = hrefs.map((href) => {\n return new Promise<void>((resolve, reject) => {\n resolveSource(href).then((href) => {\n href = resolveUrl(href);\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.onload = () => resolve();\n link.onerror = (e) => reject(e);\n\n document.head.appendChild(link);\n });\n });\n });\n\n return Promise.all(promises);\n}\n\nconst importedSheets: Record<string, Promise<{ default: CSSStyleSheet }>> = {};\n\nexport async function useCssImport(...hrefs: Source[]): Promise<CSSStyleSheet[]> {\n // Todo: Use `{ assert: { type: \"css\" }` after all browsers support it.\n const modules = await Promise.all(\n hrefs.map((href) => {\n return new Promise<{ default: CSSStyleSheet }>((resolve) => {\n resolveSource(href).then((href) => {\n href = resolveUrl(href);\n\n if (!importedSheets[href]) {\n importedSheets[href] = simulateCssImport(href);\n }\n\n resolve(importedSheets[href]);\n });\n });\n })\n );\n const styles = modules.map(module => module.default);\n\n return injectCssToDocument(...styles);\n}\n\nasync function simulateCssImport(href: string) {\n const response = await fetch(href);\n if (!response.ok) {\n throw new Error(`Failed to load CSS: ${href}`);\n }\n const cssText = await response.text();\n\n const sheet = new CSSStyleSheet();\n await sheet.replace(cssText);\n return { default: sheet };\n}\n\nlet importMap: Record<string, string>;\n\nfunction parseImportMap() {\n const importMapScript = document.querySelector('script[type=\"importmap\"]');\n if (importMapScript) {\n try {\n return JSON.parse(importMapScript.textContent || '{}').imports || {};\n } catch (e) {\n console.error('Failed to parse import map:', e);\n }\n }\n return {};\n}\n\nfunction resolveUrl(specifier: string) {\n importMap ??= parseImportMap();\n\n for (const [prefix, target] of Object.entries(importMap)) {\n if (specifier === prefix) {\n return target;\n }\n }\n\n for (const [prefix, target] of Object.entries(importMap)) {\n if (specifier.startsWith(prefix)) {\n return specifier.replace(prefix, target);\n }\n }\n return specifier;\n}\n\nasync function resolveSource(src: Source): Promise<string> {\n if (typeof src === 'function') {\n return (await src()).default;\n }\n\n return src;\n}\n"],"mappings":"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"}