@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,345 @@
1
+ import { l as loadAlpine, Q as slideDown, P as slideUp, A as h, _ as __, F as simpleConfirm, ac as deleteConfirm, G as simpleAlert } from "./unicorn.js";
2
+ class UnicornGridElement {
3
+ constructor(selector, element, form, options = {}) {
4
+ this.element = element;
5
+ this.form = form;
6
+ this.options = { ...options };
7
+ this.bindEvents();
8
+ }
9
+ options;
10
+ ordering = "";
11
+ state = {};
12
+ bindEvents() {
13
+ const inputs = this.element.querySelectorAll("input[data-role=grid-checkbox]");
14
+ for (const ch of inputs) {
15
+ ch.addEventListener("click", () => {
16
+ ch.dispatchEvent(new CustomEvent("change"));
17
+ });
18
+ ch.addEventListener("change", () => {
19
+ const event = new CustomEvent("unicorn:checked", {
20
+ detail: { grid: this }
21
+ });
22
+ this.form.element?.dispatchEvent(event);
23
+ });
24
+ }
25
+ }
26
+ initComponent(store = "grid", custom = {}) {
27
+ this.ordering = this.element?.dataset?.ordering || "";
28
+ if (this.ordering) {
29
+ if (!this.ordering.toLowerCase().endsWith(" asc") && !this.ordering.toLowerCase().endsWith(" desc")) {
30
+ this.ordering += " ASC";
31
+ }
32
+ }
33
+ return loadAlpine((Alpine) => {
34
+ Alpine.store(store, this.useState(custom));
35
+ });
36
+ }
37
+ useState(custom = {}) {
38
+ const state = {
39
+ form: this.form.useState(custom)
40
+ };
41
+ Object.getOwnPropertyNames(Object.getPrototypeOf(this)).map((item) => {
42
+ const prop = this[item];
43
+ if (typeof prop === "function") {
44
+ return state[item] = this[item].bind(this);
45
+ }
46
+ return item;
47
+ });
48
+ return Object.assign(
49
+ state,
50
+ custom
51
+ );
52
+ }
53
+ getElement() {
54
+ return this.element;
55
+ }
56
+ sendFilter($event, method) {
57
+ if ($event) {
58
+ $event.preventDefault();
59
+ }
60
+ this.form.submit(null, null, method);
61
+ }
62
+ clearFilters(element, method) {
63
+ element.querySelectorAll("input, textarea, select").forEach((ele) => {
64
+ ele.value = "";
65
+ });
66
+ this.form.submit(null, null, method);
67
+ }
68
+ async toggleFilters(open, filterForm) {
69
+ if (open) {
70
+ await slideDown(filterForm);
71
+ } else {
72
+ await slideUp(filterForm);
73
+ }
74
+ }
75
+ sort($el) {
76
+ const dir = this.getDirection($el);
77
+ const field = $el.dataset.field;
78
+ let asc = $el.dataset.asc;
79
+ let desc = $el.dataset.desc;
80
+ if (field) {
81
+ asc = field + " ASC";
82
+ desc = field + " DESC";
83
+ }
84
+ if (dir === "ASC") {
85
+ return this.sortBy(desc);
86
+ }
87
+ return this.sortBy(asc);
88
+ }
89
+ /**
90
+ * Sort two items.
91
+ */
92
+ sortBy(ordering) {
93
+ if (!ordering) {
94
+ return false;
95
+ }
96
+ let orderingInput = this.element.querySelector("input[name=list_ordering]");
97
+ if (!orderingInput) {
98
+ orderingInput = h("input", { name: "list_ordering", type: "hidden", value: "" });
99
+ this.element.appendChild(orderingInput);
100
+ }
101
+ orderingInput.value = ordering;
102
+ return this.form.put();
103
+ }
104
+ isSortActive($el) {
105
+ return this.getDirection($el) != null;
106
+ }
107
+ getDirection($el) {
108
+ const field = $el.dataset.field;
109
+ let asc = $el.dataset.asc;
110
+ let desc = $el.dataset.desc;
111
+ if (field) {
112
+ asc = field + " ASC";
113
+ desc = field + " DESC";
114
+ }
115
+ if (this.orderingEquals(asc, this.ordering)) {
116
+ return "ASC";
117
+ } else if (this.orderingEquals(desc, this.ordering)) {
118
+ return "DESC";
119
+ }
120
+ return null;
121
+ }
122
+ orderingEquals(a, b) {
123
+ a = a || "";
124
+ b = b || "";
125
+ a = a.replace(/\s+/g, " ").trim().toLowerCase();
126
+ b = b.replace(/\s+/g, " ").trim().toLowerCase();
127
+ return a === b;
128
+ }
129
+ /**
130
+ * Check a row's checkbox.
131
+ */
132
+ checkRow(row, value = true) {
133
+ const ch = this.getCheckboxByRow(row);
134
+ if (!ch) {
135
+ throw new Error("Checkbox of row: " + row + " not found.");
136
+ }
137
+ ch.checked = value;
138
+ ch.dispatchEvent(new Event("input"));
139
+ ch.dispatchEvent(new Event("change"));
140
+ }
141
+ getCheckboxByRow(row) {
142
+ return this.form.element?.querySelector(
143
+ `input[data-role=grid-checkbox][data-row-number="${row}"]`
144
+ );
145
+ }
146
+ /**
147
+ * Update a row.
148
+ */
149
+ updateRow(row, url, data) {
150
+ const ch = this.getCheckboxByRow(row);
151
+ if (!ch) {
152
+ return false;
153
+ }
154
+ return this.updateItem(ch.value, url, data);
155
+ }
156
+ /**
157
+ * Update an item by id.
158
+ */
159
+ updateItem(id, url, data) {
160
+ this.toggleAll(false);
161
+ this.disableAllCheckboxes();
162
+ this.form.injectInput("id[]", id);
163
+ return this.form.patch(url, data);
164
+ }
165
+ /**
166
+ * Update a item with batch task.
167
+ */
168
+ updateItemByTask(task, id, url, data) {
169
+ data = data || {};
170
+ data.task = task;
171
+ return this.updateItem(id, url, data);
172
+ }
173
+ /**
174
+ * @deprecated Use updateItemByTask() instead.
175
+ */
176
+ doTask(task, id, url, data) {
177
+ return this.updateItemByTask(task, id, url, data);
178
+ }
179
+ /**
180
+ * Update a row with batch task.
181
+ */
182
+ updateRowByTask(task, row, url, data) {
183
+ const ch = this.getCheckboxByRow(row);
184
+ if (!ch) {
185
+ return false;
186
+ }
187
+ return this.updateItemByTask(task, ch.value, url, data);
188
+ }
189
+ /**
190
+ * Batch update items.
191
+ */
192
+ updateListByTask(task, url, data) {
193
+ data = data || {};
194
+ data.task = task;
195
+ return this.form.patch(url, data);
196
+ }
197
+ /**
198
+ * Copy a row.
199
+ */
200
+ copyItem(id, url, data) {
201
+ this.toggleAll(false);
202
+ this.disableAllCheckboxes();
203
+ this.form.injectInput("id[]", id);
204
+ return this.form.post(url, data);
205
+ }
206
+ /**
207
+ * Copy a row.
208
+ */
209
+ copyRow(row, url, data) {
210
+ const ch = this.getCheckboxByRow(row);
211
+ if (!ch) {
212
+ return false;
213
+ }
214
+ return this.copyItem(ch.value, url, data);
215
+ }
216
+ /**
217
+ * Delete checked items.
218
+ */
219
+ deleteList(message, url, data) {
220
+ if (!this.validateChecked()) {
221
+ return false;
222
+ }
223
+ message = message == null ? __("unicorn.message.delete.confirm") : message;
224
+ if (message !== false) {
225
+ simpleConfirm(message).then((isConfirm) => {
226
+ if (isConfirm) {
227
+ this.form.delete(url, data);
228
+ }
229
+ });
230
+ } else {
231
+ this.form.delete(url, data);
232
+ }
233
+ return true;
234
+ }
235
+ /**
236
+ * Delete an item by row.
237
+ */
238
+ async deleteRow(row, msg, url, data) {
239
+ const ch = this.getCheckboxByRow(row);
240
+ if (!ch) {
241
+ return false;
242
+ }
243
+ return this.deleteItem(ch.value, msg, url, data);
244
+ }
245
+ /**
246
+ * Delete an item.
247
+ */
248
+ async deleteItem(id, msg, url, data) {
249
+ msg = msg || __("unicorn.message.delete.confirm");
250
+ const isConfirm = await deleteConfirm(msg);
251
+ if (isConfirm) {
252
+ data = data || {};
253
+ data.id = id;
254
+ this.form.delete(url, data);
255
+ }
256
+ return isConfirm;
257
+ }
258
+ /**
259
+ * Toggle all checkboxes.
260
+ */
261
+ toggleAll(value) {
262
+ Array.from(
263
+ this.element.querySelectorAll("input[data-role=grid-checkbox][type=checkbox]")
264
+ ).forEach((input) => {
265
+ input.checked = value;
266
+ input.dispatchEvent(new CustomEvent("input"));
267
+ input.dispatchEvent(new CustomEvent("change"));
268
+ });
269
+ return this;
270
+ }
271
+ disableAllCheckboxes() {
272
+ Array.from(
273
+ this.element.querySelectorAll("input[data-role=grid-checkbox][type=checkbox]")
274
+ ).forEach((input) => {
275
+ input.disabled = true;
276
+ });
277
+ }
278
+ /**
279
+ * Count checked checkboxes.
280
+ */
281
+ countChecked() {
282
+ return this.getChecked().length;
283
+ }
284
+ /**
285
+ * Get Checked boxes.
286
+ */
287
+ getChecked() {
288
+ return Array.from(
289
+ this.element.querySelectorAll("input[data-role=grid-checkbox][type=checkbox]:checked")
290
+ );
291
+ }
292
+ getCheckedValues() {
293
+ return this.getChecked().map((input) => input.value);
294
+ }
295
+ /**
296
+ * Validate there has one or more checked boxes.
297
+ */
298
+ validateChecked(event, callback, msg) {
299
+ msg = msg || __("unicorn.message.grid.checked");
300
+ if (!this.hasChecked()) {
301
+ if (msg !== "") {
302
+ simpleAlert(msg);
303
+ }
304
+ if (event) {
305
+ event.stopPropagation();
306
+ event.preventDefault();
307
+ }
308
+ return this;
309
+ }
310
+ if (callback) {
311
+ callback(this);
312
+ }
313
+ return this;
314
+ }
315
+ hasChecked() {
316
+ return this.countChecked() > 0;
317
+ }
318
+ /**
319
+ * Reorder all.
320
+ */
321
+ reorderAll(url, data) {
322
+ return this.updateListByTask("reorder", url, data);
323
+ }
324
+ /**
325
+ * Reorder items.
326
+ */
327
+ moveItem(id, delta, url, data) {
328
+ data = data || {};
329
+ data.delta = delta;
330
+ return this.updateItemByTask("move", id, url, data);
331
+ }
332
+ moveUp(id, url, data) {
333
+ return this.moveItem(id, -1, url, data);
334
+ }
335
+ moveDown(id, url, data) {
336
+ return this.moveItem(id, 1, url, data);
337
+ }
338
+ getId(suffix = "") {
339
+ return this.form.element?.id + suffix;
340
+ }
341
+ }
342
+ export {
343
+ UnicornGridElement
344
+ };
345
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sources":["../../src/module/grid.ts"],"sourcesContent":["import { __, deleteConfirm, h, loadAlpine, simpleAlert, simpleConfirm, slideDown, slideUp } from '../service';\r\nimport { Nullable } from '../types';\r\nimport type { UnicornFormElement } from './form';\r\n\r\nexport class UnicornGridElement {\r\n options: Record<string, any>;\r\n ordering = '';\r\n state = {};\r\n\r\n constructor(\r\n selector: string,\r\n public element: HTMLElement,\r\n public form: UnicornFormElement,\r\n options: Record<string, any> = {}\r\n ) {\r\n this.options = { ...options };\r\n\r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n const inputs = this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox]');\r\n\r\n for (const ch of inputs) {\r\n ch.addEventListener('click', () => {\r\n ch.dispatchEvent(new CustomEvent('change'));\r\n });\r\n ch.addEventListener('change', () => {\r\n const event = new CustomEvent('unicorn:checked', {\r\n detail: { grid: this }\r\n });\r\n\r\n this.form.element?.dispatchEvent(event);\r\n });\r\n }\r\n }\r\n\r\n initComponent(store = 'grid', custom: Record<string, string> = {}) {\r\n this.ordering = this.element?.dataset?.ordering || '';\r\n\r\n if (this.ordering) {\r\n if (!this.ordering.toLowerCase().endsWith(' asc')\r\n && !this.ordering.toLowerCase().endsWith(' desc')) {\r\n this.ordering += ' ASC';\r\n }\r\n }\r\n\r\n return loadAlpine((Alpine) => {\r\n Alpine.store(store, this.useState(custom));\r\n });\r\n }\r\n\r\n useState(this: any, custom: Record<string, any> = {}) {\r\n const state: Partial<Record<string, any>> = {\r\n form: this.form.useState(custom),\r\n };\r\n\r\n Object.getOwnPropertyNames(Object.getPrototypeOf(this))\r\n .map(item => {\r\n const prop = this[item];\r\n\r\n if (typeof prop === 'function') {\r\n return state[item] = this[item].bind(this);\r\n }\r\n\r\n return item;\r\n });\r\n\r\n return Object.assign(\r\n state,\r\n custom\r\n );\r\n }\r\n\r\n getElement() {\r\n return this.element;\r\n }\r\n\r\n sendFilter($event?: Event, method?: string) {\r\n if ($event) {\r\n $event.preventDefault();\r\n }\r\n\r\n this.form.submit(null, null, method);\r\n }\r\n\r\n clearFilters(element: HTMLElement, method?: Nullable<string>): void {\r\n element.querySelectorAll('input, textarea, select').forEach((ele) => {\r\n (ele as HTMLInputElement).value = '';\r\n });\r\n\r\n this.form.submit(null, null, method);\r\n }\r\n\r\n async toggleFilters(open: boolean, filterForm: HTMLElement) {\r\n if (open) {\r\n await slideDown(filterForm);\r\n } else {\r\n await slideUp(filterForm);\r\n }\r\n }\r\n\r\n sort($el: HTMLElement): boolean {\r\n const dir = this.getDirection($el);\r\n\r\n const field = $el.dataset.field;\r\n let asc = $el.dataset.asc;\r\n let desc = $el.dataset.desc;\r\n\r\n if (field) {\r\n asc = field + ' ASC';\r\n desc = field + ' DESC';\r\n }\r\n\r\n if (dir === 'ASC') {\r\n return this.sortBy(desc);\r\n }\r\n\r\n return this.sortBy(asc);\r\n }\r\n\r\n /**\r\n * Sort two items.\r\n */\r\n sortBy(ordering: Nullable<string>): boolean {\r\n if (!ordering) {\r\n return false;\r\n }\r\n\r\n let orderingInput = this.element.querySelector<HTMLInputElement>('input[name=list_ordering]');\r\n\r\n if (!orderingInput) {\r\n orderingInput = h('input', { name: 'list_ordering', type: 'hidden', value: '' });\r\n\r\n this.element.appendChild(orderingInput);\r\n }\r\n\r\n orderingInput.value = ordering;\r\n\r\n return this.form.put();\r\n }\r\n\r\n isSortActive($el: HTMLElement): boolean {\r\n return this.getDirection($el) != null;\r\n }\r\n\r\n getDirection($el: HTMLElement): \"ASC\" | \"DESC\" | null {\r\n const field = $el.dataset.field;\r\n let asc = $el.dataset.asc;\r\n let desc = $el.dataset.desc;\r\n\r\n if (field) {\r\n asc = field + ' ASC';\r\n desc = field + ' DESC';\r\n }\r\n\r\n if (this.orderingEquals(asc, this.ordering)) {\r\n return 'ASC';\r\n } else if (this.orderingEquals(desc, this.ordering)) {\r\n return 'DESC';\r\n }\r\n\r\n return null;\r\n }\r\n\r\n orderingEquals(a: Nullable<string>, b: Nullable<string>): boolean {\r\n a = a || '';\r\n b = b || '';\r\n\r\n a = a.replace(/\\s+/g, ' ').trim().toLowerCase();\r\n b = b.replace(/\\s+/g, ' ').trim().toLowerCase();\r\n\r\n return a === b;\r\n }\r\n\r\n /**\r\n * Check a row's checkbox.\r\n */\r\n checkRow(row: number, value = true): void {\r\n const ch = this.getCheckboxByRow(row);\r\n\r\n if (!ch) {\r\n throw new Error('Checkbox of row: ' + row + ' not found.');\r\n }\r\n\r\n ch.checked = value;\r\n ch.dispatchEvent(new Event('input'));\r\n ch.dispatchEvent(new Event('change'));\r\n }\r\n\r\n getCheckboxByRow(row: number): Nullable<HTMLInputElement> {\r\n return this.form.element?.querySelector<HTMLInputElement>(\r\n `input[data-role=grid-checkbox][data-row-number=\"${row}\"]`\r\n );\r\n }\r\n\r\n /**\r\n * Update a row.\r\n */\r\n updateRow(row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>) {\r\n const ch = this.getCheckboxByRow(row);\r\n\r\n if (!ch) {\r\n return false;\r\n }\r\n\r\n return this.updateItem(ch.value, url, data);\r\n }\r\n\r\n /**\r\n * Update an item by id.\r\n */\r\n updateItem(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n this.toggleAll(false);\r\n\r\n this.disableAllCheckboxes();\r\n\r\n this.form.injectInput('id[]', id);\r\n\r\n return this.form.patch(url, data);\r\n }\r\n\r\n /**\r\n * Update a item with batch task.\r\n */\r\n updateItemByTask(\r\n task: string,\r\n id: string | number,\r\n url?: Nullable<string>,\r\n data?: Nullable<Record<string, any>>\r\n ): boolean {\r\n data = data || {};\r\n data.task = task;\r\n\r\n return this.updateItem(id, url, data);\r\n }\r\n\r\n /**\r\n * @deprecated Use updateItemByTask() instead.\r\n */\r\n doTask(task: string, id: number | string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n return this.updateItemByTask(task, id, url, data);\r\n }\r\n\r\n /**\r\n * Update a row with batch task.\r\n */\r\n updateRowByTask(task: string, row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n const ch = this.getCheckboxByRow(row);\r\n\r\n if (!ch) {\r\n return false;\r\n }\r\n\r\n return this.updateItemByTask(task, ch.value, url, data);\r\n }\r\n\r\n /**\r\n * Batch update items.\r\n */\r\n updateListByTask(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n data = data || {};\r\n data.task = task;\r\n\r\n return this.form.patch(url, data);\r\n }\r\n\r\n /**\r\n * Copy a row.\r\n */\r\n copyItem(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n this.toggleAll(false);\r\n\r\n this.disableAllCheckboxes();\r\n\r\n this.form.injectInput('id[]', id);\r\n\r\n return this.form.post(url, data);\r\n }\r\n\r\n /**\r\n * Copy a row.\r\n */\r\n copyRow(row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n const ch = this.getCheckboxByRow(row);\r\n\r\n if (!ch) {\r\n return false;\r\n }\r\n\r\n return this.copyItem(ch.value, url, data);\r\n }\r\n\r\n /**\r\n * Delete checked items.\r\n */\r\n deleteList(\r\n message?: Nullable<string> | false,\r\n url?: Nullable<string>,\r\n data?: Nullable<Record<string, any>>\r\n ): boolean {\r\n if (!this.validateChecked()) {\r\n return false;\r\n }\r\n\r\n message = message == null ? __('unicorn.message.delete.confirm') : message;\r\n\r\n if (message !== false) {\r\n simpleConfirm(message).then(isConfirm => {\r\n if (isConfirm) {\r\n this.form.delete(url, data);\r\n }\r\n });\r\n } else {\r\n this.form.delete(url, data);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Delete an item by row.\r\n */\r\n async deleteRow(row: number,\r\n msg?: Nullable<string>,\r\n url?: Nullable<string>,\r\n data?: Nullable<Record<string, any>>): Promise<boolean> {\r\n const ch = this.getCheckboxByRow(row);\r\n\r\n if (!ch) {\r\n return false;\r\n }\r\n\r\n return this.deleteItem(ch.value, msg, url, data);\r\n }\r\n\r\n /**\r\n * Delete an item.\r\n */\r\n async deleteItem(id: string,\r\n msg?: Nullable<string>,\r\n url?: Nullable<string>,\r\n data?: Nullable<Record<string, any>>): Promise<boolean> {\r\n msg = msg || __('unicorn.message.delete.confirm');\r\n\r\n const isConfirm = await deleteConfirm(msg);\r\n\r\n if (isConfirm) {\r\n // this.toggleAll(false);\r\n // this.checkRow(row);\r\n data = data || {};\r\n\r\n data.id = id;\r\n\r\n this.form.delete(url, data);\r\n }\r\n\r\n return isConfirm;\r\n }\r\n\r\n /**\r\n * Toggle all checkboxes.\r\n */\r\n toggleAll(value: boolean) {\r\n Array.from(\r\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]')\r\n )\r\n .forEach((input) => {\r\n input.checked = value;\r\n\r\n input.dispatchEvent(new CustomEvent('input'));\r\n input.dispatchEvent(new CustomEvent('change'));\r\n });\r\n\r\n return this;\r\n }\r\n\r\n disableAllCheckboxes() {\r\n Array.from(\r\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]')\r\n )\r\n .forEach((input) => {\r\n input.disabled = true;\r\n });\r\n }\r\n\r\n /**\r\n * Count checked checkboxes.\r\n */\r\n countChecked(): number {\r\n return this.getChecked().length;\r\n }\r\n\r\n /**\r\n * Get Checked boxes.\r\n */\r\n getChecked(): HTMLInputElement[] {\r\n return Array.from(\r\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]:checked')\r\n );\r\n }\r\n\r\n getCheckedValues(): string[] {\r\n return this.getChecked().map(input => input.value);\r\n }\r\n\r\n /**\r\n * Validate there has one or more checked boxes.\r\n */\r\n validateChecked(event?: Event, callback?: (grid: UnicornGridElement) => any, msg?: string): this {\r\n msg = msg || __('unicorn.message.grid.checked');\r\n\r\n if (!this.hasChecked()) {\r\n if (msg !== '') {\r\n simpleAlert(msg);\r\n }\r\n\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n if (callback) {\r\n callback(this);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n hasChecked(): boolean {\r\n return this.countChecked() > 0;\r\n }\r\n\r\n /**\r\n * Reorder all.\r\n */\r\n reorderAll(url?: Nullable<string>, data?: Nullable<Record<string, any>>) {\r\n return this.updateListByTask('reorder', url, data);\r\n }\r\n\r\n /**\r\n * Reorder items.\r\n */\r\n moveItem(id: number | string, delta: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n data = data || {};\r\n data.delta = delta;\r\n\r\n return this.updateItemByTask('move', id, url, data);\r\n }\r\n\r\n moveUp(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n return this.moveItem(id, -1, url, data);\r\n }\r\n\r\n moveDown(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n return this.moveItem(id, 1, url, data);\r\n }\r\n\r\n getId(suffix = '') {\r\n return this.form.element?.id + suffix;\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ import AxiosStatic, { isAxiosError, AxiosError, isCancel } from "axios";
2
+ import { aa as data, r as route } from "./unicorn.js";
3
+ function encodeReserved(str) {
4
+ return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {
5
+ if (!/%[0-9A-Fa-f]/.test(part)) {
6
+ part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
7
+ }
8
+ return part;
9
+ }).join("");
10
+ }
11
+ function encodeUnreserved(str) {
12
+ return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
13
+ return "%" + c.charCodeAt(0).toString(16).toUpperCase();
14
+ });
15
+ }
16
+ function encodeValue(operator, value, key) {
17
+ value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);
18
+ if (key) {
19
+ return encodeUnreserved(key) + "=" + value;
20
+ } else {
21
+ return value;
22
+ }
23
+ }
24
+ function isDefined(value) {
25
+ return value !== void 0 && value !== null;
26
+ }
27
+ function isKeyOperator(operator) {
28
+ return operator === ";" || operator === "&" || operator === "?";
29
+ }
30
+ function getValues(context, operator, key, modifier) {
31
+ var value = context[key], result = [];
32
+ if (isDefined(value) && value !== "") {
33
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
34
+ value = value.toString();
35
+ if (modifier && modifier !== "*") {
36
+ value = value.substring(0, parseInt(modifier, 10));
37
+ }
38
+ result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
39
+ } else {
40
+ if (modifier === "*") {
41
+ if (Array.isArray(value)) {
42
+ value.filter(isDefined).forEach(function(value2) {
43
+ result.push(encodeValue(operator, value2, isKeyOperator(operator) ? key : null));
44
+ });
45
+ } else {
46
+ Object.keys(value).forEach(function(k) {
47
+ if (isDefined(value[k])) {
48
+ result.push(encodeValue(operator, value[k], k));
49
+ }
50
+ });
51
+ }
52
+ } else {
53
+ var tmp = [];
54
+ if (Array.isArray(value)) {
55
+ value.filter(isDefined).forEach(function(value2) {
56
+ tmp.push(encodeValue(operator, value2));
57
+ });
58
+ } else {
59
+ Object.keys(value).forEach(function(k) {
60
+ if (isDefined(value[k])) {
61
+ tmp.push(encodeUnreserved(k));
62
+ tmp.push(encodeValue(operator, value[k].toString()));
63
+ }
64
+ });
65
+ }
66
+ if (isKeyOperator(operator)) {
67
+ result.push(encodeUnreserved(key) + "=" + tmp.join(","));
68
+ } else if (tmp.length !== 0) {
69
+ result.push(tmp.join(","));
70
+ }
71
+ }
72
+ }
73
+ } else {
74
+ if (operator === ";") {
75
+ if (isDefined(value)) {
76
+ result.push(encodeUnreserved(key));
77
+ }
78
+ } else if (value === "" && (operator === "&" || operator === "?")) {
79
+ result.push(encodeUnreserved(key) + "=");
80
+ } else if (value === "") {
81
+ result.push("");
82
+ }
83
+ }
84
+ return result;
85
+ }
86
+ function parseTemplate(template) {
87
+ var operators = ["+", "#", ".", "/", ";", "?", "&"];
88
+ return {
89
+ expand: function(context) {
90
+ return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function(_, expression, literal) {
91
+ if (expression) {
92
+ var operator = null, values = [];
93
+ if (operators.indexOf(expression.charAt(0)) !== -1) {
94
+ operator = expression.charAt(0);
95
+ expression = expression.substr(1);
96
+ }
97
+ expression.split(/,/g).forEach(function(variable) {
98
+ var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
99
+ values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
100
+ });
101
+ if (operator && operator !== "+") {
102
+ var separator = ",";
103
+ if (operator === "?") {
104
+ separator = "&";
105
+ } else if (operator !== "#") {
106
+ separator = operator;
107
+ }
108
+ return (values.length !== 0 ? operator : "") + values.join(separator);
109
+ } else {
110
+ return values.join(",");
111
+ }
112
+ } else {
113
+ return encodeReserved(literal);
114
+ }
115
+ });
116
+ }
117
+ };
118
+ }
119
+ function prepareAxios(axios) {
120
+ axios.interceptors.request.use((config) => {
121
+ config.headers["X-CSRF-Token"] = data("csrf-token");
122
+ if (config.url && config.url.startsWith("@")) {
123
+ config.url = route(config.url);
124
+ }
125
+ if (config?.vars && config.url) {
126
+ const tmpl = parseTemplate(config.url);
127
+ config.url = tmpl.expand(config.vars || {});
128
+ }
129
+ if (config.methodSimulate) {
130
+ if (config.methodSimulateByHeader) {
131
+ config.headers["X-HTTP-Method-Override"] = config;
132
+ } else if (typeof config.data === "object") {
133
+ config.data["_method"] = config.method;
134
+ } else if (typeof config.data === "string") {
135
+ if (config.data.includes("?")) {
136
+ config.data += "&_method=" + config.method;
137
+ } else {
138
+ config.data += "?_method=" + config.method;
139
+ }
140
+ }
141
+ if (config.method?.toLowerCase() !== "get") {
142
+ config.method = "POST";
143
+ }
144
+ }
145
+ return config;
146
+ });
147
+ return axios;
148
+ }
149
+ function createHttpClient(config) {
150
+ const axios = config && "interceptors" in config ? config : AxiosStatic.create(config ?? {});
151
+ prepareAxios(axios);
152
+ function requestMiddleware(callback) {
153
+ return axios.interceptors.request.use(callback);
154
+ }
155
+ function responseMiddleware(callback) {
156
+ return axios.interceptors.response.use(callback);
157
+ }
158
+ async function get(url, options2 = {}) {
159
+ options2.url = url;
160
+ options2.method = "GET";
161
+ return request(options2);
162
+ }
163
+ async function post(url, data2, options2 = {}) {
164
+ options2.url = url;
165
+ options2.method = "POST";
166
+ options2.data = data2;
167
+ return request(options2);
168
+ }
169
+ async function put(url, data2, options2 = {}) {
170
+ options2.url = url;
171
+ options2.method = "PUT";
172
+ options2.data = data2;
173
+ return request(options2);
174
+ }
175
+ async function patch(url, data2, options2 = {}) {
176
+ options2.url = url;
177
+ options2.method = "PATCH";
178
+ options2.data = data2;
179
+ return request(options2);
180
+ }
181
+ async function deletes(url, data2, options2 = {}) {
182
+ options2.url = url;
183
+ options2.method = "DELETE";
184
+ options2.data = data2;
185
+ return request(options2);
186
+ }
187
+ async function head(url, options2 = {}) {
188
+ options2.url = url;
189
+ options2.method = "HEAD";
190
+ return request(options2);
191
+ }
192
+ async function options(url, options2 = {}) {
193
+ options2.url = url;
194
+ options2.method = "OPTIONS";
195
+ return request(options2);
196
+ }
197
+ async function request(options2) {
198
+ try {
199
+ return await axios(options2);
200
+ } catch (e) {
201
+ e.originMessage = e.message;
202
+ const err = e;
203
+ if (err.response?.data?.message) {
204
+ err.message = err.response.data.message;
205
+ }
206
+ throw err;
207
+ }
208
+ }
209
+ return {
210
+ axios,
211
+ request,
212
+ get,
213
+ post,
214
+ put,
215
+ patch,
216
+ delete: deletes,
217
+ head,
218
+ options,
219
+ requestMiddleware,
220
+ responseMiddleware,
221
+ isCancel,
222
+ AxiosError,
223
+ isAxiosError
224
+ };
225
+ }
226
+ export {
227
+ createHttpClient
228
+ };
229
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sources":["../../../../../../node_modules/url-template/lib/url-template.js","../../src/module/http-client.ts"],"sourcesContent":["function encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, '[').replace(/%5D/g, ']');\n }\n return part;\n }).join('');\n}\n\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\nfunction encodeValue(operator, value, key) {\n value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeUnreserved(value);\n\n if (key) {\n return encodeUnreserved(key) + '=' + value;\n } else {\n return value;\n }\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null;\n}\n\nfunction isKeyOperator(operator) {\n return operator === ';' || operator === '&' || operator === '?';\n}\n\nfunction getValues(context, operator, key, modifier) {\n var value = context[key],\n result = [];\n\n if (isDefined(value) && value !== '') {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n value = value.toString();\n\n if (modifier && modifier !== '*') {\n value = value.substring(0, parseInt(modifier, 10));\n }\n\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n } else {\n if (modifier === '*') {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n });\n } else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n var tmp = [];\n\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n tmp.push(encodeValue(operator, value));\n });\n } else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + '=' + tmp.join(','));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(','));\n }\n }\n }\n } else {\n if (operator === ';') {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === '' && (operator === '&' || operator === '?')) {\n result.push(encodeUnreserved(key) + '=');\n } else if (value === '') {\n result.push('');\n }\n }\n return result;\n}\n\nexport function parseTemplate(template) {\n var operators = ['+', '#', '.', '/', ';', '?', '&'];\n\n return {\n expand: function (context) {\n return template.replace(/\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g, function (_, expression, literal) {\n if (expression) {\n var operator = null,\n values = [];\n\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n\n expression.split(/,/g).forEach(function (variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n\n if (operator && operator !== '+') {\n var separator = ',';\n\n if (operator === '?') {\n separator = '&';\n } else if (operator !== '#') {\n separator = operator;\n }\n return (values.length !== 0 ? operator : '') + values.join(separator);\n } else {\n return values.join(',');\n }\n } else {\n return encodeReserved(literal);\n }\n });\n }\n };\n}\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, CreateAxiosDefaults } from 'axios';\r\nimport AxiosStatic, { AxiosError, isAxiosError, isCancel } from 'axios';\r\nimport { parseTemplate } from 'url-template';\r\nimport { data } from '../data';\r\nimport { route } from '../service';\r\n\r\nexport interface ApiReturn<T = any> {\r\n success: boolean;\r\n message?: string;\r\n code: number;\r\n status: number;\r\n data: T;\r\n}\r\n\r\ndeclare module 'axios' {\r\n export interface AxiosRequestConfig {\r\n vars?: Record<string, any>;\r\n methodSimulate?: string;\r\n methodSimulateByHeader?: boolean;\r\n }\r\n\r\n export interface CreateAxiosDefaults {\r\n }\r\n}\r\n\r\nfunction prepareAxios(axios: AxiosInstance): AxiosInstance {\r\n axios.interceptors.request.use((config) => {\r\n config.headers['X-CSRF-Token'] = data('csrf-token');\r\n\r\n if (config.url && config.url.startsWith('@')) {\r\n config.url = route(config.url);\r\n }\r\n\r\n if (config?.vars && config.url) {\r\n const tmpl = parseTemplate(config.url);\r\n config.url = tmpl.expand(config.vars || {});\r\n }\r\n\r\n // Simulate methods\r\n if (config.methodSimulate) {\r\n if (config.methodSimulateByHeader) {\r\n config.headers['X-HTTP-Method-Override'] = config;\r\n } else if (typeof config.data === 'object') {\r\n config.data['_method'] = config.method;\r\n } else if (typeof config.data === 'string') {\r\n if (config.data.includes('?')) {\r\n config.data += '&_method=' + config.method;\r\n } else {\r\n config.data += '?_method=' + config.method;\r\n }\r\n }\r\n\r\n if (config.method?.toLowerCase() !== 'get') {\r\n config.method = 'POST';\r\n }\r\n }\r\n\r\n return config;\r\n });\r\n\r\n return axios;\r\n}\r\n\r\nexport type UnicornHttpClient = ReturnType<typeof createHttpClient>;\r\n\r\nexport function createHttpClient(config?: CreateAxiosDefaults | AxiosInstance) {\r\n const axios = config && 'interceptors' in config\r\n ? config\r\n : AxiosStatic.create(config ?? {});\r\n\r\n prepareAxios(axios);\r\n\r\n function requestMiddleware(callback: Parameters<AxiosInstance['interceptors']['request']['use']>[0]) {\r\n return axios.interceptors.request.use(callback);\r\n }\r\n\r\n function responseMiddleware(callback: Parameters<AxiosInstance['interceptors']['response']['use']>[0]) {\r\n return axios.interceptors.response.use(callback);\r\n }\r\n\r\n /**\r\n * Send a GET request.\r\n */\r\n async function get<T = any, D = any>(\r\n url: string,\r\n options: Partial<AxiosRequestConfig> = {}\r\n ): Promise<AxiosResponse<T, D>> {\r\n options.url = url;\r\n options.method = 'GET';\r\n\r\n return request(options);\r\n }\r\n\r\n /**\r\n * Send a POST request.\r\n */\r\n async function post<T = any, D = any>(\r\n url: string,\r\n data?: any,\r\n options: Partial<AxiosRequestConfig> = {}\r\n ): Promise<AxiosResponse<T, D>> {\r\n options.url = url;\r\n options.method = 'POST';\r\n options.data = data;\r\n\r\n return request(options);\r\n }\r\n\r\n /**\r\n * Send a PUT request.\r\n *\r\n * @param {string} url\r\n * @param {any} data\r\n * @param {AxiosRequestConfig} options\r\n *\r\n * @returns {Promise<AxiosResponse>}\r\n */\r\n async function put<T = any, D = any>(\r\n url: string,\r\n data?: any,\r\n options: Partial<AxiosRequestConfig> = {}\r\n ): Promise<AxiosResponse<T, D>> {\r\n options.url = url;\r\n options.method = 'PUT';\r\n options.data = data;\r\n\r\n return request(options);\r\n }\r\n\r\n /**\r\n * Send a PATCH request.\r\n *\r\n * @param {string} url\r\n * @param {any} data\r\n * @param {AxiosRequestConfig} options\r\n *\r\n * @returns {Promise<AxiosResponse>}\r\n */\r\n async function patch<T = any, D = any>(\r\n url: string,\r\n data?: any,\r\n options: Partial<AxiosRequestConfig> = {}\r\n ): Promise<AxiosResponse<T, D>> {\r\n options.url = url;\r\n options.method = 'PATCH';\r\n options.data = data;\r\n\r\n return request(options);\r\n }\r\n\r\n /**\r\n * Send a DELETE request.\r\n *\r\n * @param {string} url\r\n * @param {any} data\r\n * @param {AxiosRequestConfig} options\r\n *\r\n * @returns {Promise<AxiosResponse>}\r\n */\r\n async function deletes<T = any, D = any>(\r\n url: string,\r\n data?: any,\r\n options: Partial<AxiosRequestConfig> = {}\r\n ): Promise<AxiosResponse<T, D>> {\r\n options.url = url;\r\n options.method = 'DELETE';\r\n options.data = data;\r\n\r\n return request(options);\r\n }\r\n\r\n /**\r\n * Send a HEAD request.\r\n *\r\n * @param {string} url\r\n * @param {AxiosRequestConfig} options\r\n *\r\n * @returns {Promise<AxiosResponse>}\r\n */\r\n async function head<T = any, D = any>(\r\n url: string,\r\n options: Partial<AxiosRequestConfig> = {}\r\n ): Promise<AxiosResponse<T, D>> {\r\n options.url = url;\r\n options.method = 'HEAD';\r\n\r\n return request(options);\r\n }\r\n\r\n /**\r\n * Send a OPTIONS request.\r\n *\r\n * @param {string} url\r\n * @param {AxiosRequestConfig} options\r\n *\r\n * @returns {Promise<AxiosResponse>}\r\n */\r\n async function options<T = any, D = any>(\r\n url: string,\r\n options: Partial<AxiosRequestConfig> = {}\r\n ): Promise<AxiosResponse<T, D>> {\r\n options.url = url;\r\n options.method = 'OPTIONS';\r\n\r\n return request(options);\r\n }\r\n\r\n /**\r\n * Send request.\r\n */\r\n async function request<T = any, D = any>(options: AxiosRequestConfig): Promise<AxiosResponse<T, D>> {\r\n try {\r\n return await axios(options);\r\n } catch (e) {\r\n (e as any).originMessage = (e as Error).message;\r\n\r\n const err = e as AxiosError<any>;\r\n\r\n if (err.response?.data?.message) {\r\n err.message = err.response.data.message;\r\n }\r\n\r\n throw err;\r\n }\r\n }\r\n\r\n return {\r\n axios,\r\n request,\r\n get,\r\n post,\r\n put,\r\n patch,\r\n delete: deletes,\r\n head,\r\n options,\r\n requestMiddleware,\r\n responseMiddleware,\r\n isCancel,\r\n AxiosError,\r\n isAxiosError,\r\n };\r\n}\r\n"],"names":["value","options","data"],"mappings":"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","x_google_ignoreList":[0]}