@windwalker-io/unicorn-next 0.1.15 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/grid.js +70 -8
- package/dist/chunks/grid.js.map +1 -1
- package/dist/chunks/unicorn.js +240 -53
- package/dist/chunks/unicorn.js.map +1 -1
- package/dist/chunks/validation.js +5 -2
- package/dist/chunks/validation.js.map +1 -1
- package/dist/index.d.ts +45 -2
- package/dist/unicorn.js +32 -31
- package/package.json +1 -1
- package/src/composable/index.ts +1 -0
- package/src/composable/useBsModalAlert.ts +299 -0
- package/src/composable/useUIBootstrap5.ts +2 -0
- package/src/module/grid.ts +105 -13
- package/src/module/validation.ts +6 -2
- package/src/service/dom.ts +1 -1
- package/src/service/ui.ts +2 -0
package/dist/chunks/grid.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { l as loadAlpine, Q as slideDown, P as slideUp, A as h, _ as __, F as simpleConfirm, ag as deleteConfirm
|
|
1
|
+
import { C as delegate, G as simpleAlert, l as loadAlpine, Q as slideDown, P as slideUp, A as h, _ as __, F as simpleConfirm, ag as deleteConfirm } from "./unicorn.js";
|
|
2
2
|
class UnicornGridElement {
|
|
3
3
|
constructor(selector, element, form, options = {}) {
|
|
4
4
|
this.element = element;
|
|
@@ -12,9 +12,6 @@ class UnicornGridElement {
|
|
|
12
12
|
bindEvents() {
|
|
13
13
|
const inputs = this.element.querySelectorAll("input[data-role=grid-checkbox]");
|
|
14
14
|
for (const ch of inputs) {
|
|
15
|
-
ch.addEventListener("click", () => {
|
|
16
|
-
ch.dispatchEvent(new CustomEvent("change"));
|
|
17
|
-
});
|
|
18
15
|
ch.addEventListener("change", () => {
|
|
19
16
|
const event = new CustomEvent("unicorn:checked", {
|
|
20
17
|
detail: { grid: this }
|
|
@@ -22,6 +19,52 @@ class UnicornGridElement {
|
|
|
22
19
|
this.form.element?.dispatchEvent(event);
|
|
23
20
|
});
|
|
24
21
|
}
|
|
22
|
+
if (this.form.element) {
|
|
23
|
+
this.bindMustCheckedEvent(this.form.element);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
bindMustCheckedEvent(form) {
|
|
27
|
+
delegate(document, "[data-must-checked]", "mousedown", (e) => {
|
|
28
|
+
const target = e.currentTarget;
|
|
29
|
+
const selector = target.dataset.mustChecked;
|
|
30
|
+
if (!selector || !form.matches(selector)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const toggle = target.dataset.bsToggle;
|
|
34
|
+
if (toggle === "modal") {
|
|
35
|
+
const modalTarget = target.dataset.bsTarget;
|
|
36
|
+
if (modalTarget) {
|
|
37
|
+
this.preventBSModal(modalTarget, this.getMustCheckedMessage());
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
preventBSModal(selector, msg) {
|
|
43
|
+
let modalElement = null;
|
|
44
|
+
if (typeof selector === "string") {
|
|
45
|
+
modalElement = document.querySelector(selector);
|
|
46
|
+
} else if (selector instanceof HTMLElement) {
|
|
47
|
+
const modalTarget = selector.dataset.bsTarget;
|
|
48
|
+
if (modalTarget) {
|
|
49
|
+
modalElement = document.querySelector(modalTarget);
|
|
50
|
+
} else {
|
|
51
|
+
modalElement = selector;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (modalElement) {
|
|
55
|
+
modalElement?.addEventListener("show.bs.modal", (e) => {
|
|
56
|
+
if (!this.hasChecked()) {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
e.stopPropagation();
|
|
59
|
+
if (msg) {
|
|
60
|
+
if (msg === true) {
|
|
61
|
+
msg = this.getMustCheckedMessage();
|
|
62
|
+
}
|
|
63
|
+
simpleAlert(msg);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}, { once: true });
|
|
67
|
+
}
|
|
25
68
|
}
|
|
26
69
|
initComponent(store = "grid", custom = {}) {
|
|
27
70
|
this.ordering = this.element?.dataset?.ordering || "";
|
|
@@ -307,15 +350,25 @@ class UnicornGridElement {
|
|
|
307
350
|
/**
|
|
308
351
|
* Validate there has one or more checked boxes.
|
|
309
352
|
*/
|
|
310
|
-
validateChecked(event, callback,
|
|
311
|
-
msg = msg || __("unicorn.message.grid.checked");
|
|
353
|
+
validateChecked(event, callback, errorMsg = true) {
|
|
312
354
|
if (!this.hasChecked()) {
|
|
313
|
-
if (
|
|
314
|
-
|
|
355
|
+
if (errorMsg === true) {
|
|
356
|
+
errorMsg = this.getMustCheckedMessage();
|
|
357
|
+
}
|
|
358
|
+
if (typeof errorMsg === "string" && errorMsg !== "") {
|
|
359
|
+
simpleAlert(errorMsg);
|
|
360
|
+
} else if (typeof errorMsg === "function") {
|
|
361
|
+
errorMsg(this);
|
|
315
362
|
}
|
|
316
363
|
if (event) {
|
|
317
364
|
event.stopPropagation();
|
|
318
365
|
event.preventDefault();
|
|
366
|
+
const target = event.currentTarget;
|
|
367
|
+
if (target.dataset.bsToggle === "modal") {
|
|
368
|
+
if (target.dataset.bsTarget) {
|
|
369
|
+
this.preventBSModal(target.dataset.bsTarget);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
319
372
|
}
|
|
320
373
|
return this;
|
|
321
374
|
}
|
|
@@ -324,6 +377,15 @@ class UnicornGridElement {
|
|
|
324
377
|
}
|
|
325
378
|
return this;
|
|
326
379
|
}
|
|
380
|
+
async validateCheckedPromise() {
|
|
381
|
+
if (!this.hasChecked()) {
|
|
382
|
+
throw new Error("No items checked.");
|
|
383
|
+
}
|
|
384
|
+
return this;
|
|
385
|
+
}
|
|
386
|
+
getMustCheckedMessage() {
|
|
387
|
+
return __("unicorn.message.grid.checked");
|
|
388
|
+
}
|
|
327
389
|
hasChecked() {
|
|
328
390
|
return this.countChecked() > 0;
|
|
329
391
|
}
|
package/dist/chunks/grid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.js","sources":["../../src/module/grid.ts"],"sourcesContent":["import { __, deleteConfirm, h, loadAlpine, simpleAlert, simpleConfirm, slideDown, slideUp } from '../service';\nimport { Nullable } from '../types';\nimport type { UnicornFormElement } from './form';\n\nexport class UnicornGridElement {\n options: Record<string, any>;\n ordering = '';\n state = {};\n\n constructor(\n selector: string,\n public element: HTMLElement,\n public form: UnicornFormElement,\n options: Record<string, any> = {}\n ) {\n this.options = { ...options };\n\n this.bindEvents();\n }\n\n bindEvents() {\n const inputs = this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox]');\n\n for (const ch of inputs) {\n ch.addEventListener('click', () => {\n ch.dispatchEvent(new CustomEvent('change'));\n });\n ch.addEventListener('change', () => {\n const event = new CustomEvent('unicorn:checked', {\n detail: { grid: this }\n });\n\n this.form.element?.dispatchEvent(event);\n });\n }\n }\n\n initComponent(store = 'grid', custom: Record<string, string> = {}) {\n this.ordering = this.element?.dataset?.ordering || '';\n\n if (this.ordering) {\n if (!this.ordering.toLowerCase().endsWith(' asc')\n && !this.ordering.toLowerCase().endsWith(' desc')) {\n this.ordering += ' ASC';\n }\n }\n\n return loadAlpine((Alpine) => {\n Alpine.store(store, this.useState(custom));\n });\n }\n\n useState(this: any, custom: Record<string, any> = {}) {\n const state: Partial<Record<string, any>> = {\n form: this.form.useState(custom),\n };\n\n Object.getOwnPropertyNames(Object.getPrototypeOf(this))\n .map(item => {\n const prop = this[item];\n\n if (typeof prop === 'function') {\n return state[item] = this[item].bind(this);\n }\n\n return item;\n });\n\n return Object.assign(\n state,\n custom\n );\n }\n\n getElement() {\n return this.element;\n }\n\n sendFilter($event?: Event, method?: string) {\n if ($event) {\n $event.preventDefault();\n }\n\n this.form.submit(null, null, method);\n }\n\n clearFilters(element: HTMLElement, method?: Nullable<string>): void {\n element.querySelectorAll('input, textarea, select').forEach((ele) => {\n (ele as HTMLInputElement).value = '';\n });\n\n this.form.submit(null, null, method);\n }\n\n async toggleFilters(open: boolean, filterForm: HTMLElement) {\n if (open) {\n await slideDown(filterForm);\n } else {\n await slideUp(filterForm);\n }\n }\n\n sort($el: HTMLElement): boolean {\n const dir = this.getDirection($el);\n\n const field = $el.dataset.field;\n let asc = $el.dataset.asc;\n let desc = $el.dataset.desc;\n\n if (field) {\n asc = field + ' ASC';\n desc = field + ' DESC';\n }\n\n if (dir === 'ASC') {\n return this.sortBy(desc);\n }\n\n return this.sortBy(asc);\n }\n\n /**\n * Sort two items.\n */\n sortBy(ordering: Nullable<string>): boolean {\n if (!ordering) {\n return false;\n }\n\n let orderingInput = this.element.querySelector<HTMLInputElement>('input[name=list_ordering]');\n\n if (!orderingInput) {\n orderingInput = h('input', { name: 'list_ordering', type: 'hidden', value: '' });\n\n this.element.appendChild(orderingInput);\n }\n\n orderingInput.value = ordering;\n\n return this.form.put();\n }\n\n isSortActive($el: HTMLElement): boolean {\n return this.getDirection($el) != null;\n }\n\n getDirection($el: HTMLElement): \"ASC\" | \"DESC\" | null {\n const field = $el.dataset.field;\n let asc = $el.dataset.asc;\n let desc = $el.dataset.desc;\n\n if (field) {\n asc = field + ' ASC';\n desc = field + ' DESC';\n }\n\n if (this.orderingEquals(asc, this.ordering)) {\n return 'ASC';\n } else if (this.orderingEquals(desc, this.ordering)) {\n return 'DESC';\n }\n\n return null;\n }\n\n orderingEquals(a: Nullable<string>, b: Nullable<string>): boolean {\n a = a || '';\n b = b || '';\n\n a = a.replace(/\\s+/g, ' ').trim().toLowerCase();\n b = b.replace(/\\s+/g, ' ').trim().toLowerCase();\n\n return a === b;\n }\n\n /**\n * Check a row's checkbox.\n */\n checkRow(row: number, value = true): void {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n throw new Error('Checkbox of row: ' + row + ' not found.');\n }\n\n ch.checked = value;\n ch.dispatchEvent(new Event('input'));\n ch.dispatchEvent(new Event('change'));\n }\n\n getCheckboxByRow(row: number): Nullable<HTMLInputElement> {\n return this.form.element?.querySelector<HTMLInputElement>(\n `input[data-role=grid-checkbox][data-row-number=\"${row}\"]`\n );\n }\n\n /**\n * Update a row.\n */\n updateRow(row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>) {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.updateItem(ch.value, url, data);\n }\n\n /**\n * Update an item by id.\n */\n updateItem(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n this.toggleAll(false);\n\n this.disableAllCheckboxes();\n\n this.form.injectInput('id[]', id);\n\n return this.form.patch(url, data);\n }\n\n /**\n * Update a item with batch task.\n */\n updateItemByTask(\n task: string,\n id: string | number,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>\n ): boolean {\n data = data || {};\n data.task = task;\n\n return this.updateItem(id, url, data);\n }\n\n /**\n * @deprecated Use updateItemByTask() instead.\n */\n doTask(task: string, id: number | string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.updateItemByTask(task, id, url, data);\n }\n\n /**\n * Update a row with batch task.\n */\n updateRowByTask(task: string, row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.updateItemByTask(task, ch.value, url, data);\n }\n\n /**\n * Batch update items.\n */\n updateListByTask(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n data = data || {};\n data.task = task;\n\n return this.form.patch(url, data);\n }\n\n /**\n * @deprecated Use updateListByTask() instead.\n */\n batch(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.updateListByTask(task, url, data);\n }\n\n /**\n * @deprecated Use updateListByTask() instead.\n */\n updateByTask(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.updateListByTask(task, url, data);\n }\n\n /**\n * Copy a row.\n */\n copyItem(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n this.toggleAll(false);\n\n this.disableAllCheckboxes();\n\n this.form.injectInput('id[]', id);\n\n return this.form.post(url, data);\n }\n\n /**\n * Copy a row.\n */\n copyRow(row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.copyItem(ch.value, url, data);\n }\n\n /**\n * Delete checked items.\n */\n deleteList(\n message?: Nullable<string> | false,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>\n ): boolean {\n if (!this.validateChecked()) {\n return false;\n }\n\n message = message == null ? __('unicorn.message.delete.confirm') : message;\n\n if (message !== false) {\n simpleConfirm(message).then(isConfirm => {\n if (isConfirm) {\n this.form.delete(url, data);\n }\n });\n } else {\n this.form.delete(url, data);\n }\n\n return true;\n }\n\n /**\n * Delete an item by row.\n */\n async deleteRow(row: number,\n msg?: Nullable<string>,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>): Promise<boolean> {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.deleteItem(ch.value, msg, url, data);\n }\n\n /**\n * Delete an item.\n */\n async deleteItem(id: string,\n msg?: Nullable<string>,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>): Promise<boolean> {\n msg = msg || __('unicorn.message.delete.confirm');\n\n const isConfirm = await deleteConfirm(msg);\n\n if (isConfirm) {\n // this.toggleAll(false);\n // this.checkRow(row);\n data = data || {};\n\n data.id = id;\n\n this.form.delete(url, data);\n }\n\n return isConfirm;\n }\n\n /**\n * Toggle all checkboxes.\n */\n toggleAll(value: boolean) {\n Array.from(\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]')\n )\n .forEach((input) => {\n input.checked = value;\n\n input.dispatchEvent(new CustomEvent('input'));\n input.dispatchEvent(new CustomEvent('change'));\n });\n\n return this;\n }\n\n disableAllCheckboxes() {\n Array.from(\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]')\n )\n .forEach((input) => {\n input.disabled = true;\n });\n }\n\n /**\n * Count checked checkboxes.\n */\n countChecked(): number {\n return this.getChecked().length;\n }\n\n /**\n * Get Checked boxes.\n */\n getChecked(): HTMLInputElement[] {\n return Array.from(\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]:checked')\n );\n }\n\n getCheckedValues(): string[] {\n return this.getChecked().map(input => input.value);\n }\n\n /**\n * Validate there has one or more checked boxes.\n */\n validateChecked(event?: Event, callback?: (grid: UnicornGridElement) => any, msg?: string): this {\n msg = msg || __('unicorn.message.grid.checked');\n\n if (!this.hasChecked()) {\n if (msg !== '') {\n simpleAlert(msg);\n }\n\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n return this;\n }\n\n if (callback) {\n callback(this);\n }\n\n return this;\n }\n\n hasChecked(): boolean {\n return this.countChecked() > 0;\n }\n\n /**\n * Reorder all.\n */\n reorderAll(url?: Nullable<string>, data?: Nullable<Record<string, any>>) {\n return this.updateListByTask('reorder', url, data);\n }\n\n /**\n * Reorder items.\n */\n moveItem(id: number | string, delta: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n data = data || {};\n data.delta = delta;\n\n return this.updateItemByTask('move', id, url, data);\n }\n\n moveUp(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.moveItem(id, -1, url, data);\n }\n\n moveDown(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.moveItem(id, 1, url, data);\n }\n\n getId(suffix = '') {\n return this.form.element?.id + suffix;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grid.js","sources":["../../src/module/grid.ts"],"sourcesContent":["import { __, delegate, deleteConfirm, h, loadAlpine, simpleAlert, simpleConfirm, slideDown, slideUp } from '../service';\nimport { Nullable } from '../types';\nimport type { UnicornFormElement } from './form';\n\nexport class UnicornGridElement {\n options: Record<string, any>;\n ordering = '';\n state = {};\n\n constructor(\n selector: string,\n public element: HTMLElement,\n public form: UnicornFormElement,\n options: Record<string, any> = {}\n ) {\n this.options = { ...options };\n\n this.bindEvents();\n }\n\n bindEvents() {\n const inputs = this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox]');\n\n for (const ch of inputs) {\n // No-longer need this since browsers will trigger change event when checkbox is checked/unchecked\n // ch.addEventListener('click', () => {\n // ch.dispatchEvent(new CustomEvent('change'));\n // });\n\n ch.addEventListener('change', () => {\n const event = new CustomEvent('unicorn:checked', {\n detail: { grid: this }\n });\n\n this.form.element?.dispatchEvent(event);\n });\n }\n\n if (this.form.element) {\n this.bindMustCheckedEvent(this.form.element);\n }\n }\n\n private bindMustCheckedEvent(form: HTMLFormElement) {\n delegate(document, '[data-must-checked]', 'mousedown', (e) => {\n const target = e.currentTarget as HTMLElement;\n\n const selector = target.dataset.mustChecked!;\n\n if (!selector || !form.matches(selector)) {\n return;\n }\n \n // Prevent modal\n const toggle = target.dataset.bsToggle;\n\n if (toggle === 'modal') {\n const modalTarget = target.dataset.bsTarget;\n\n if (modalTarget) {\n this.preventBSModal(modalTarget, this.getMustCheckedMessage());\n }\n }\n });\n }\n\n preventBSModal(selector?: string | HTMLElement, msg?: string | boolean) {\n let modalElement: HTMLElement | null = null;\n\n if (typeof selector === 'string') {\n modalElement = document.querySelector(selector);\n } else if (selector instanceof HTMLElement) {\n const modalTarget = selector.dataset.bsTarget;\n\n if (modalTarget) {\n modalElement = document.querySelector(modalTarget);\n } else {\n modalElement = selector;\n }\n }\n\n if (modalElement) {\n modalElement?.addEventListener('show.bs.modal', (e) => {\n if (!this.hasChecked()) {\n e.preventDefault();\n e.stopPropagation();\n\n if (msg) {\n if (msg === true) {\n msg = this.getMustCheckedMessage();\n }\n\n simpleAlert(msg);\n }\n }\n }, { once: true });\n }\n }\n\n initComponent(store = 'grid', custom: Record<string, string> = {}) {\n this.ordering = this.element?.dataset?.ordering || '';\n\n if (this.ordering) {\n if (!this.ordering.toLowerCase().endsWith(' asc')\n && !this.ordering.toLowerCase().endsWith(' desc')) {\n this.ordering += ' ASC';\n }\n }\n\n return loadAlpine((Alpine) => {\n Alpine.store(store, this.useState(custom));\n });\n }\n\n useState(this: any, custom: Record<string, any> = {}) {\n const state: Partial<Record<string, any>> = {\n form: this.form.useState(custom),\n };\n\n Object.getOwnPropertyNames(Object.getPrototypeOf(this))\n .map(item => {\n const prop = this[item];\n\n if (typeof prop === 'function') {\n return state[item] = this[item].bind(this);\n }\n\n return item;\n });\n\n return Object.assign(\n state,\n custom\n );\n }\n\n getElement() {\n return this.element;\n }\n\n sendFilter($event?: Event, method?: string) {\n if ($event) {\n $event.preventDefault();\n }\n\n this.form.submit(null, null, method);\n }\n\n clearFilters(element: HTMLElement, method?: Nullable<string>): void {\n element.querySelectorAll('input, textarea, select').forEach((ele) => {\n (ele as HTMLInputElement).value = '';\n });\n\n this.form.submit(null, null, method);\n }\n\n async toggleFilters(open: boolean, filterForm: HTMLElement) {\n if (open) {\n await slideDown(filterForm);\n } else {\n await slideUp(filterForm);\n }\n }\n\n sort($el: HTMLElement): boolean {\n const dir = this.getDirection($el);\n\n const field = $el.dataset.field;\n let asc = $el.dataset.asc;\n let desc = $el.dataset.desc;\n\n if (field) {\n asc = field + ' ASC';\n desc = field + ' DESC';\n }\n\n if (dir === 'ASC') {\n return this.sortBy(desc);\n }\n\n return this.sortBy(asc);\n }\n\n /**\n * Sort two items.\n */\n sortBy(ordering: Nullable<string>): boolean {\n if (!ordering) {\n return false;\n }\n\n let orderingInput = this.element.querySelector<HTMLInputElement>('input[name=list_ordering]');\n\n if (!orderingInput) {\n orderingInput = h('input', { name: 'list_ordering', type: 'hidden', value: '' });\n\n this.element.appendChild(orderingInput);\n }\n\n orderingInput.value = ordering;\n\n return this.form.put();\n }\n\n isSortActive($el: HTMLElement): boolean {\n return this.getDirection($el) != null;\n }\n\n getDirection($el: HTMLElement): \"ASC\" | \"DESC\" | null {\n const field = $el.dataset.field;\n let asc = $el.dataset.asc;\n let desc = $el.dataset.desc;\n\n if (field) {\n asc = field + ' ASC';\n desc = field + ' DESC';\n }\n\n if (this.orderingEquals(asc, this.ordering)) {\n return 'ASC';\n } else if (this.orderingEquals(desc, this.ordering)) {\n return 'DESC';\n }\n\n return null;\n }\n\n orderingEquals(a: Nullable<string>, b: Nullable<string>): boolean {\n a = a || '';\n b = b || '';\n\n a = a.replace(/\\s+/g, ' ').trim().toLowerCase();\n b = b.replace(/\\s+/g, ' ').trim().toLowerCase();\n\n return a === b;\n }\n\n /**\n * Check a row's checkbox.\n */\n checkRow(row: number, value = true): void {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n throw new Error('Checkbox of row: ' + row + ' not found.');\n }\n\n ch.checked = value;\n ch.dispatchEvent(new Event('input'));\n ch.dispatchEvent(new Event('change'));\n }\n\n getCheckboxByRow(row: number): Nullable<HTMLInputElement> {\n return this.form.element?.querySelector<HTMLInputElement>(\n `input[data-role=grid-checkbox][data-row-number=\"${row}\"]`\n );\n }\n\n /**\n * Update a row.\n */\n updateRow(row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>) {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.updateItem(ch.value, url, data);\n }\n\n /**\n * Update an item by id.\n */\n updateItem(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n this.toggleAll(false);\n\n this.disableAllCheckboxes();\n\n this.form.injectInput('id[]', id);\n\n return this.form.patch(url, data);\n }\n\n /**\n * Update a item with batch task.\n */\n updateItemByTask(\n task: string,\n id: string | number,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>\n ): boolean {\n data = data || {};\n data.task = task;\n\n return this.updateItem(id, url, data);\n }\n\n /**\n * @deprecated Use updateItemByTask() instead.\n */\n doTask(task: string, id: number | string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.updateItemByTask(task, id, url, data);\n }\n\n /**\n * Update a row with batch task.\n */\n updateRowByTask(task: string, row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.updateItemByTask(task, ch.value, url, data);\n }\n\n /**\n * Batch update items.\n */\n updateListByTask(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n data = data || {};\n data.task = task;\n\n return this.form.patch(url, data);\n }\n\n /**\n * @deprecated Use updateListByTask() instead.\n */\n batch(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.updateListByTask(task, url, data);\n }\n\n /**\n * @deprecated Use updateListByTask() instead.\n */\n updateByTask(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.updateListByTask(task, url, data);\n }\n\n /**\n * Copy a row.\n */\n copyItem(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n this.toggleAll(false);\n\n this.disableAllCheckboxes();\n\n this.form.injectInput('id[]', id);\n\n return this.form.post(url, data);\n }\n\n /**\n * Copy a row.\n */\n copyRow(row: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.copyItem(ch.value, url, data);\n }\n\n /**\n * Delete checked items.\n */\n deleteList(\n message?: Nullable<string> | false,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>\n ): boolean {\n if (!this.validateChecked()) {\n return false;\n }\n\n message = message == null ? __('unicorn.message.delete.confirm') : message;\n\n if (message !== false) {\n simpleConfirm(message).then(isConfirm => {\n if (isConfirm) {\n this.form.delete(url, data);\n }\n });\n } else {\n this.form.delete(url, data);\n }\n\n return true;\n }\n\n /**\n * Delete an item by row.\n */\n async deleteRow(\n row: number,\n msg?: Nullable<string>,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>\n ): Promise<boolean> {\n const ch = this.getCheckboxByRow(row);\n\n if (!ch) {\n return false;\n }\n\n return this.deleteItem(ch.value, msg, url, data);\n }\n\n /**\n * Delete an item.\n */\n async deleteItem(id: string,\n msg?: Nullable<string>,\n url?: Nullable<string>,\n data?: Nullable<Record<string, any>>): Promise<boolean> {\n msg = msg || __('unicorn.message.delete.confirm');\n\n const isConfirm = await deleteConfirm(msg);\n\n if (isConfirm) {\n // this.toggleAll(false);\n // this.checkRow(row);\n data = data || {};\n\n data.id = id;\n\n this.form.delete(url, data);\n }\n\n return isConfirm;\n }\n\n /**\n * Toggle all checkboxes.\n */\n toggleAll(value: boolean) {\n Array.from(\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]')\n )\n .forEach((input) => {\n input.checked = value;\n\n input.dispatchEvent(new CustomEvent('input'));\n input.dispatchEvent(new CustomEvent('change'));\n });\n\n return this;\n }\n\n disableAllCheckboxes() {\n Array.from(\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]')\n )\n .forEach((input) => {\n input.disabled = true;\n });\n }\n\n /**\n * Count checked checkboxes.\n */\n countChecked(): number {\n return this.getChecked().length;\n }\n\n /**\n * Get Checked boxes.\n */\n getChecked(): HTMLInputElement[] {\n return Array.from(\n this.element.querySelectorAll<HTMLInputElement>('input[data-role=grid-checkbox][type=checkbox]:checked')\n );\n }\n\n getCheckedValues(): string[] {\n return this.getChecked().map(input => input.value);\n }\n\n /**\n * Validate there has one or more checked boxes.\n */\n validateChecked(\n event?: Event,\n callback?: (grid: UnicornGridElement) => any,\n errorMsg: string | boolean | null | ((grid: UnicornGridElement) => any) = true\n ): this {\n if (!this.hasChecked()) {\n if (errorMsg === true) {\n errorMsg = this.getMustCheckedMessage();\n }\n\n if (typeof errorMsg === 'string' && errorMsg !== '') {\n simpleAlert(errorMsg);\n } else if (typeof errorMsg === 'function') {\n errorMsg(this);\n }\n\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n\n const target = event.currentTarget as HTMLElement;\n\n if (target.dataset.bsToggle === 'modal') {\n if (target.dataset.bsTarget) {\n this.preventBSModal(target.dataset.bsTarget);\n }\n }\n }\n\n return this;\n }\n\n if (callback) {\n callback(this);\n }\n\n return this;\n }\n\n async validateCheckedPromise() {\n if (!this.hasChecked()) {\n throw new Error('No items checked.');\n }\n\n return this;\n }\n\n getMustCheckedMessage(): string {\n return __('unicorn.message.grid.checked');\n }\n\n hasChecked(): boolean {\n return this.countChecked() > 0;\n }\n\n /**\n * Reorder all.\n */\n reorderAll(url?: Nullable<string>, data?: Nullable<Record<string, any>>) {\n return this.updateListByTask('reorder', url, data);\n }\n\n /**\n * Reorder items.\n */\n moveItem(id: number | string, delta: number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n data = data || {};\n data.delta = delta;\n\n return this.updateItemByTask('move', id, url, data);\n }\n\n moveUp(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.moveItem(id, -1, url, data);\n }\n\n moveDown(id: string | number, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\n return this.moveItem(id, 1, url, data);\n }\n\n getId(suffix = '') {\n return this.form.element?.id + suffix;\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/chunks/unicorn.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Modal } from "bootstrap";
|
|
1
2
|
const copyProps = (dest, src, exclude = []) => {
|
|
2
3
|
const props = Object.getOwnPropertyDescriptors(src);
|
|
3
4
|
for (let prop of exclude)
|
|
@@ -1155,6 +1156,212 @@ async function resolveSource(src) {
|
|
|
1155
1156
|
}
|
|
1156
1157
|
return src;
|
|
1157
1158
|
}
|
|
1159
|
+
async function useUIBootstrap5(install = false, pushToGlobal = false) {
|
|
1160
|
+
const { UIBootstrap5 } = await import("./ui-bootstrap5.js");
|
|
1161
|
+
const theme = UIBootstrap5.get();
|
|
1162
|
+
if (install) {
|
|
1163
|
+
useUITheme(theme);
|
|
1164
|
+
if (pushToGlobal) {
|
|
1165
|
+
theme.pushBootstrapToGlobal();
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
return theme;
|
|
1169
|
+
}
|
|
1170
|
+
async function useBs5Tooltip(selector = '[data-bs-toggle="tooltip"]', config = {}) {
|
|
1171
|
+
const bs5 = await useUIBootstrap5();
|
|
1172
|
+
return bs5.tooltip(selector, config);
|
|
1173
|
+
}
|
|
1174
|
+
const useBs5KeepTab = async (selector, options = {}) => {
|
|
1175
|
+
const bs5 = await useUIBootstrap5();
|
|
1176
|
+
return bs5.keepTab(selector, options);
|
|
1177
|
+
};
|
|
1178
|
+
const useBs5ButtonRadio = async (selector, options = {}) => {
|
|
1179
|
+
const bs5 = await useUIBootstrap5();
|
|
1180
|
+
return bs5.buttonRadio(selector, options);
|
|
1181
|
+
};
|
|
1182
|
+
const defaultOptions = {
|
|
1183
|
+
buttons: [
|
|
1184
|
+
"OK"
|
|
1185
|
+
]
|
|
1186
|
+
};
|
|
1187
|
+
async function useBsModalAlert(id, options) {
|
|
1188
|
+
await useUIBootstrap5();
|
|
1189
|
+
let modalElement = void 0;
|
|
1190
|
+
if (typeof id !== "string" && !(id instanceof HTMLElement)) {
|
|
1191
|
+
options = id;
|
|
1192
|
+
id = "uni-modal-alert";
|
|
1193
|
+
modalElement = document.getElementById(id);
|
|
1194
|
+
} else {
|
|
1195
|
+
modalElement = typeof id === "string" ? document.getElementById(id) : id;
|
|
1196
|
+
}
|
|
1197
|
+
if (!modalElement) {
|
|
1198
|
+
modalElement = html(`<div id="${id}" class="uni-modal-alert modal fade" tabindex="-1" role="dialog">
|
|
1199
|
+
<div class="modal-dialog" role="document">
|
|
1200
|
+
<div class="modal-content">
|
|
1201
|
+
<div class="modal-body text-center p-4"></div>
|
|
1202
|
+
<div class="modal-footer"></div>
|
|
1203
|
+
</div>
|
|
1204
|
+
</div>
|
|
1205
|
+
</div>`);
|
|
1206
|
+
document.body.appendChild(modalElement);
|
|
1207
|
+
}
|
|
1208
|
+
const modal = Modal.getOrCreateInstance(modalElement, options);
|
|
1209
|
+
return {
|
|
1210
|
+
show: (title, text, icon, options2) => {
|
|
1211
|
+
if (typeof title === "string") {
|
|
1212
|
+
options2 = options2 || {};
|
|
1213
|
+
options2.title = title;
|
|
1214
|
+
options2.text = text;
|
|
1215
|
+
options2.icon = icon;
|
|
1216
|
+
} else {
|
|
1217
|
+
options2 = title;
|
|
1218
|
+
}
|
|
1219
|
+
return new Promise((resolve) => {
|
|
1220
|
+
prepareModalElement(modalElement, resolve, options2);
|
|
1221
|
+
modal.show(options2?.relatedTarget);
|
|
1222
|
+
});
|
|
1223
|
+
},
|
|
1224
|
+
hide: () => {
|
|
1225
|
+
modal.hide();
|
|
1226
|
+
},
|
|
1227
|
+
dispose: () => {
|
|
1228
|
+
modal.dispose();
|
|
1229
|
+
},
|
|
1230
|
+
toggle: (relatedTarget) => {
|
|
1231
|
+
modal.toggle(relatedTarget);
|
|
1232
|
+
},
|
|
1233
|
+
destroy: () => {
|
|
1234
|
+
modal.dispose();
|
|
1235
|
+
modalElement.remove();
|
|
1236
|
+
},
|
|
1237
|
+
instance: modal,
|
|
1238
|
+
el: modalElement
|
|
1239
|
+
};
|
|
1240
|
+
}
|
|
1241
|
+
async function prepareModalElement(modalElement, handler, options) {
|
|
1242
|
+
options = Object.assign({}, defaultOptions, options || {});
|
|
1243
|
+
let header = options.header;
|
|
1244
|
+
const content = options.content;
|
|
1245
|
+
modalElement.querySelector(".modal-header")?.remove();
|
|
1246
|
+
modalElement.querySelector(".modal-body").innerHTML = "";
|
|
1247
|
+
modalElement.querySelector(".modal-footer").innerHTML = "";
|
|
1248
|
+
const dialog = modalElement.querySelector(".modal-dialog");
|
|
1249
|
+
dialog?.classList.remove("modal-sm", "modal-lg", "modal-xl", "modal-xxl");
|
|
1250
|
+
if (header) {
|
|
1251
|
+
if (typeof header === "string") {
|
|
1252
|
+
header = `<div class="modal-header">
|
|
1253
|
+
<h5 class="modal-title">${header}</h5>
|
|
1254
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
1255
|
+
</div>`;
|
|
1256
|
+
}
|
|
1257
|
+
header = await anyToElement(header);
|
|
1258
|
+
modalElement.querySelector(".modal-content").insertAdjacentElement("afterbegin", header);
|
|
1259
|
+
}
|
|
1260
|
+
if (content) {
|
|
1261
|
+
let contentElement = await anyToElement(content);
|
|
1262
|
+
modalElement.querySelector(".modal-body").appendChild(contentElement);
|
|
1263
|
+
} else {
|
|
1264
|
+
const title = options.title;
|
|
1265
|
+
const text = options.text;
|
|
1266
|
+
let icon = options.icon;
|
|
1267
|
+
if (icon) {
|
|
1268
|
+
if (typeof icon === "string") {
|
|
1269
|
+
icon = `<div class="uni-modal-alert__icon text-center mb-4"><span class="${icon}" style="font-size: 48px;"></span></div>`;
|
|
1270
|
+
}
|
|
1271
|
+
icon = await anyToElement(icon);
|
|
1272
|
+
modalElement.querySelector(".modal-body").appendChild(icon);
|
|
1273
|
+
}
|
|
1274
|
+
if (title) {
|
|
1275
|
+
const titleEl = html(`<h4 class="uni-modal-alert__title">${title}</h4>`);
|
|
1276
|
+
modalElement.querySelector(".modal-body").appendChild(titleEl);
|
|
1277
|
+
}
|
|
1278
|
+
if (text) {
|
|
1279
|
+
const textEl = html(`<div class="uni-modal-alert__text">${text}</div>`);
|
|
1280
|
+
modalElement.querySelector(".modal-body").appendChild(textEl);
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
const buttons = options.buttons;
|
|
1284
|
+
for (const i in buttons) {
|
|
1285
|
+
const button = buttons[i];
|
|
1286
|
+
const isConfirm = buttons.length === 1 || buttons.length === 2 && Number(i) === 1;
|
|
1287
|
+
const buttonElement = createButton(
|
|
1288
|
+
button,
|
|
1289
|
+
handler,
|
|
1290
|
+
isConfirm
|
|
1291
|
+
);
|
|
1292
|
+
modalElement.querySelector(".modal-footer").appendChild(await buttonElement);
|
|
1293
|
+
}
|
|
1294
|
+
if (options.size) {
|
|
1295
|
+
modalElement.querySelector(".modal-dialog").classList.add(`modal-${options.size}`);
|
|
1296
|
+
}
|
|
1297
|
+
return modalElement;
|
|
1298
|
+
}
|
|
1299
|
+
async function anyToElement(content) {
|
|
1300
|
+
if (typeof content === "function") {
|
|
1301
|
+
return content();
|
|
1302
|
+
}
|
|
1303
|
+
return typeof content === "string" ? html(content) : content;
|
|
1304
|
+
}
|
|
1305
|
+
async function createButton(buttonOption, handler, isConfirm) {
|
|
1306
|
+
if (typeof buttonOption === "function") {
|
|
1307
|
+
return await buttonOption();
|
|
1308
|
+
}
|
|
1309
|
+
if (typeof buttonOption === "string") {
|
|
1310
|
+
buttonOption = {
|
|
1311
|
+
text: buttonOption,
|
|
1312
|
+
value: isConfirm ?? false,
|
|
1313
|
+
class: isConfirm ? "btn btn-primary is-confirm" : "btn btn-outline-secondary",
|
|
1314
|
+
styles: isConfirm ? { width: "150px" } : {},
|
|
1315
|
+
dismiss: true
|
|
1316
|
+
};
|
|
1317
|
+
}
|
|
1318
|
+
let button;
|
|
1319
|
+
if (buttonOption instanceof HTMLElement) {
|
|
1320
|
+
button = buttonOption;
|
|
1321
|
+
} else {
|
|
1322
|
+
const {
|
|
1323
|
+
text,
|
|
1324
|
+
class: className = "btn btn-secondary",
|
|
1325
|
+
attrs = {},
|
|
1326
|
+
styles = {},
|
|
1327
|
+
dismiss = true,
|
|
1328
|
+
value,
|
|
1329
|
+
href,
|
|
1330
|
+
target,
|
|
1331
|
+
onClick
|
|
1332
|
+
} = buttonOption;
|
|
1333
|
+
const tag = href ? "a" : "button";
|
|
1334
|
+
const el = document.createElement(tag);
|
|
1335
|
+
if (el instanceof HTMLAnchorElement) {
|
|
1336
|
+
el.href = href;
|
|
1337
|
+
el.target = target || "_self";
|
|
1338
|
+
}
|
|
1339
|
+
if (el instanceof HTMLButtonElement) {
|
|
1340
|
+
el.type = "button";
|
|
1341
|
+
}
|
|
1342
|
+
el.setAttribute("class", className);
|
|
1343
|
+
for (let attr in attrs) {
|
|
1344
|
+
el.setAttribute(attr, attrs[attr]);
|
|
1345
|
+
}
|
|
1346
|
+
for (let style in styles) {
|
|
1347
|
+
el.style[style] = styles[style];
|
|
1348
|
+
}
|
|
1349
|
+
if (dismiss) {
|
|
1350
|
+
el.setAttribute("data-bs-dismiss", "modal");
|
|
1351
|
+
}
|
|
1352
|
+
if (typeof text === "string") {
|
|
1353
|
+
el.textContent = text;
|
|
1354
|
+
} else if (typeof text === "function") {
|
|
1355
|
+
text(el);
|
|
1356
|
+
}
|
|
1357
|
+
el.addEventListener("click", (e) => {
|
|
1358
|
+
onClick?.(value, e);
|
|
1359
|
+
handler(value);
|
|
1360
|
+
});
|
|
1361
|
+
button = el;
|
|
1362
|
+
}
|
|
1363
|
+
return button;
|
|
1364
|
+
}
|
|
1158
1365
|
async function useCheckboxesMultiSelect(selector, options = {}) {
|
|
1159
1366
|
const m = await import("./checkboxes-multi-select.js");
|
|
1160
1367
|
if (selector) {
|
|
@@ -1372,29 +1579,6 @@ async function useTinymceHook(handler) {
|
|
|
1372
1579
|
const { addHook } = await import("./tinymce.js");
|
|
1373
1580
|
return addHook(handler);
|
|
1374
1581
|
}
|
|
1375
|
-
async function useUIBootstrap5(install = false, pushToGlobal = false) {
|
|
1376
|
-
const { UIBootstrap5 } = await import("./ui-bootstrap5.js");
|
|
1377
|
-
const theme = UIBootstrap5.get();
|
|
1378
|
-
if (install) {
|
|
1379
|
-
useUITheme(theme);
|
|
1380
|
-
if (pushToGlobal) {
|
|
1381
|
-
theme.pushBootstrapToGlobal();
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
return theme;
|
|
1385
|
-
}
|
|
1386
|
-
async function useBs5Tooltip(selector = '[data-bs-toggle="tooltip"]', config = {}) {
|
|
1387
|
-
const bs5 = await useUIBootstrap5();
|
|
1388
|
-
return bs5.tooltip(selector, config);
|
|
1389
|
-
}
|
|
1390
|
-
const useBs5KeepTab = async (selector, options = {}) => {
|
|
1391
|
-
const bs5 = await useUIBootstrap5();
|
|
1392
|
-
return bs5.keepTab(selector, options);
|
|
1393
|
-
};
|
|
1394
|
-
const useBs5ButtonRadio = async (selector, options = {}) => {
|
|
1395
|
-
const bs5 = await useUIBootstrap5();
|
|
1396
|
-
return bs5.buttonRadio(selector, options);
|
|
1397
|
-
};
|
|
1398
1582
|
let instances = {};
|
|
1399
1583
|
async function useWebDirective(name = "unicorn", options = {}) {
|
|
1400
1584
|
if (options === false) {
|
|
@@ -1698,6 +1882,7 @@ function useDisableOnSubmit(formSelector = "#admin-form", buttonSelector = "", o
|
|
|
1698
1882
|
].join(",");
|
|
1699
1883
|
const event = options.event || "submit";
|
|
1700
1884
|
const spinnerClass = options.spinnerClass || "spinner-border spinner-border-sm";
|
|
1885
|
+
const loadingClass = options.loadingCass || "is-loading";
|
|
1701
1886
|
selectAll(buttonSelector, (button) => {
|
|
1702
1887
|
button.addEventListener("click", (e) => {
|
|
1703
1888
|
button.dataset.clicked = "1";
|
|
@@ -1718,6 +1903,7 @@ function useDisableOnSubmit(formSelector = "#admin-form", buttonSelector = "", o
|
|
|
1718
1903
|
button.classList.add("disabled");
|
|
1719
1904
|
if (button.dataset.clicked) {
|
|
1720
1905
|
let icon = button.querySelector(iconSelector);
|
|
1906
|
+
button.classList.add(loadingClass);
|
|
1721
1907
|
if (icon) {
|
|
1722
1908
|
const i = html("<i></i>");
|
|
1723
1909
|
icon.parentNode.replaceChild(i, icon);
|
|
@@ -2238,7 +2424,7 @@ export {
|
|
|
2238
2424
|
useKeepAlive as Z,
|
|
2239
2425
|
__ as _,
|
|
2240
2426
|
useUniDirective as a,
|
|
2241
|
-
|
|
2427
|
+
useS3MultipartUploader as a$,
|
|
2242
2428
|
useBs5ButtonRadio as a0,
|
|
2243
2429
|
useBs5Tooltip as a1,
|
|
2244
2430
|
useFormAsync as a2,
|
|
@@ -2258,24 +2444,24 @@ export {
|
|
|
2258
2444
|
removeBoundedInstance as aG,
|
|
2259
2445
|
removeData as aH,
|
|
2260
2446
|
useAlertAdapter as aI,
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2447
|
+
useBsModalAlert as aJ,
|
|
2448
|
+
useCssIncludes as aK,
|
|
2449
|
+
useFieldCascadeSelect as aL,
|
|
2450
|
+
useFieldFileDrag as aM,
|
|
2451
|
+
useFieldFlatpickr as aN,
|
|
2452
|
+
useFieldModalSelect as aO,
|
|
2453
|
+
useFieldModalTree as aP,
|
|
2454
|
+
useFieldRepeatable as aQ,
|
|
2455
|
+
useFieldSingleImageDrag as aR,
|
|
2456
|
+
useFormComponent as aS,
|
|
2457
|
+
useFormSubmit as aT,
|
|
2458
|
+
useGridComponent as aU,
|
|
2459
|
+
useIframeModal as aV,
|
|
2460
|
+
useInject as aW,
|
|
2461
|
+
useLang as aX,
|
|
2462
|
+
useLegacy as aY,
|
|
2463
|
+
useListDependent as aZ,
|
|
2464
|
+
useMacro as a_,
|
|
2279
2465
|
watchAttributes as aa,
|
|
2280
2466
|
injectCssToDocument as ab,
|
|
2281
2467
|
useImport as ac,
|
|
@@ -2303,17 +2489,18 @@ export {
|
|
|
2303
2489
|
doImport as ay,
|
|
2304
2490
|
hasRoute as az,
|
|
2305
2491
|
animateTo as b,
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2492
|
+
useS3Uploader as b0,
|
|
2493
|
+
useSeriesImport as b1,
|
|
2494
|
+
useShowOn as b2,
|
|
2495
|
+
useTinymce as b3,
|
|
2496
|
+
useTinymceHook as b4,
|
|
2497
|
+
useUI as b5,
|
|
2498
|
+
useUIBootstrap5 as b6,
|
|
2499
|
+
useUnicorn as b7,
|
|
2500
|
+
useUnicornPhpAdapter as b8,
|
|
2501
|
+
useVueComponentField as b9,
|
|
2502
|
+
useWebDirective as ba,
|
|
2503
|
+
wait as bb,
|
|
2317
2504
|
renderMessage as c,
|
|
2318
2505
|
clearMessages as d,
|
|
2319
2506
|
clearNotifies as e,
|