@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.
- package/dist/chunks/_arrayPush.js +325 -108
- package/dist/chunks/_arrayPush.js.map +1 -1
- package/dist/chunks/_baseRest.js +155 -60
- package/dist/chunks/_baseRest.js.map +1 -1
- package/dist/chunks/_baseUnary.js +463 -0
- package/dist/chunks/_baseUnary.js.map +1 -0
- package/dist/chunks/_getPrototype.js +292 -100
- package/dist/chunks/_getPrototype.js.map +1 -1
- package/dist/chunks/alert-adapter.js +29 -0
- package/dist/chunks/alert-adapter.js.map +1 -0
- package/dist/chunks/alert.js +21 -0
- package/dist/chunks/alert.js.map +1 -0
- package/dist/chunks/arr.js +24 -0
- package/dist/chunks/arr.js.map +1 -0
- package/dist/chunks/button-radio.js +127 -145
- package/dist/chunks/button-radio.js.map +1 -1
- package/dist/chunks/checkboxes-multi-select.js +44 -43
- package/dist/chunks/checkboxes-multi-select.js.map +1 -1
- package/dist/chunks/chunk.js +24 -0
- package/dist/chunks/cloneDeep.js +679 -212
- package/dist/chunks/cloneDeep.js.map +1 -1
- package/dist/chunks/cropper.min.js +6 -5
- package/dist/chunks/cropper.min.js.map +1 -1
- package/dist/chunks/crypto.js +26 -0
- package/dist/chunks/crypto.js.map +1 -0
- package/dist/chunks/data.js +49 -0
- package/dist/chunks/data.js.map +1 -0
- package/dist/chunks/dom.js +128 -0
- package/dist/chunks/dom.js.map +1 -0
- package/dist/chunks/events.js +270 -0
- package/dist/chunks/events.js.map +1 -0
- package/dist/chunks/field-cascade-select.js +207 -250
- package/dist/chunks/field-cascade-select.js.map +1 -1
- package/dist/chunks/field-file-drag.js +175 -209
- package/dist/chunks/field-file-drag.js.map +1 -1
- package/dist/chunks/field-flatpickr.js +94 -898
- package/dist/chunks/field-flatpickr.js.map +1 -1
- package/dist/chunks/field-modal-select.js +728 -467
- package/dist/chunks/field-modal-select.js.map +1 -1
- package/dist/chunks/field-modal-tree.js +771 -766
- package/dist/chunks/field-modal-tree.js.map +1 -1
- package/dist/chunks/field-multi-uploader.js +249 -256
- package/dist/chunks/field-multi-uploader.js.map +1 -1
- package/dist/chunks/field-repeatable.js +111 -127
- package/dist/chunks/field-repeatable.js.map +1 -1
- package/dist/chunks/field-single-image-drag.js +286 -338
- package/dist/chunks/field-single-image-drag.js.map +1 -1
- package/dist/chunks/form.js +146 -159
- package/dist/chunks/form.js.map +1 -1
- package/dist/chunks/grid.js +349 -418
- package/dist/chunks/grid.js.map +1 -1
- package/dist/chunks/helper.js +39 -0
- package/dist/chunks/helper.js.map +1 -0
- package/dist/chunks/http-client.js +221 -211
- package/dist/chunks/http-client.js.map +1 -1
- package/dist/chunks/iframe-modal.js +95 -115
- package/dist/chunks/iframe-modal.js.map +1 -1
- package/dist/chunks/keep-tab.js +92 -101
- package/dist/chunks/keep-tab.js.map +1 -1
- package/dist/chunks/lang.js +250 -0
- package/dist/chunks/lang.js.map +1 -0
- package/dist/chunks/legacy.js +197 -201
- package/dist/chunks/legacy.js.map +1 -1
- package/dist/chunks/list-dependent.js +195 -228
- package/dist/chunks/list-dependent.js.map +1 -1
- package/dist/chunks/loader.js +106 -0
- package/dist/chunks/loader.js.map +1 -0
- package/dist/chunks/monthSelect.js +251 -0
- package/dist/chunks/monthSelect.js.map +1 -0
- package/dist/chunks/router.js +111 -0
- package/dist/chunks/router.js.map +1 -0
- package/dist/chunks/s3-multipart-uploader.js +183 -210
- package/dist/chunks/s3-multipart-uploader.js.map +1 -1
- package/dist/chunks/s3-uploader.js +106 -128
- package/dist/chunks/s3-uploader.js.map +1 -1
- package/dist/chunks/show-on.js +358 -205
- package/dist/chunks/show-on.js.map +1 -1
- package/dist/chunks/timing.js +10 -0
- package/dist/chunks/timing.js.map +1 -0
- package/dist/chunks/tinymce.js +153 -203
- package/dist/chunks/tinymce.js.map +1 -1
- package/dist/chunks/ui-bootstrap5.js +58 -72
- package/dist/chunks/ui-bootstrap5.js.map +1 -1
- package/dist/chunks/ui.js +320 -0
- package/dist/chunks/ui.js.map +1 -0
- package/dist/chunks/unicorn.js.map +1 -1
- package/dist/chunks/useQueue.js +111 -0
- package/dist/chunks/useQueue.js.map +1 -0
- package/dist/chunks/useStack.js +76 -0
- package/dist/chunks/useStack.js.map +1 -0
- package/dist/chunks/validation.js +761 -853
- package/dist/chunks/validation.js.map +1 -1
- package/dist/editor.css +1 -1
- package/dist/index.d.ts +27 -15
- package/dist/multi-level-menu.css +1 -1
- package/dist/switcher.css +1 -1
- package/dist/unicorn.js +805 -130
- package/dist/unicorn.js.map +1 -1
- package/package.json +3 -3
- package/src/composable/useBsModalAlert.ts +92 -12
- package/src/composable/useHttp.ts +13 -1
- package/src/module/s3-uploader.ts +1 -1
- package/src/service/ui.ts +31 -15
- package/vite.config.ts +5 -1
- package/dist/chunks/_commonjsHelpers.js +0 -7
- package/dist/chunks/index.js +0 -314
- package/dist/chunks/isArguments.js +0 -146
- package/dist/chunks/unicorn.js +0 -2580
package/dist/chunks/grid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"grid.js","names":[],"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"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { t as data } from "./data.js";
|
|
2
|
+
//#region src/service/helper.ts
|
|
3
|
+
function forceArray(item) {
|
|
4
|
+
if (Array.isArray(item)) return item;
|
|
5
|
+
else return [item];
|
|
6
|
+
}
|
|
7
|
+
function debounce(handler, wait = 1) {
|
|
8
|
+
let timer, result;
|
|
9
|
+
return function(...args) {
|
|
10
|
+
clearTimeout(timer);
|
|
11
|
+
timer = setTimeout(() => result = handler.call(this, ...args), wait);
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function throttle(handler, wait = 1) {
|
|
16
|
+
let timer, result;
|
|
17
|
+
return function(...args) {
|
|
18
|
+
if (!timer) return result = handler.call(this, ...args);
|
|
19
|
+
clearTimeout(timer);
|
|
20
|
+
timer = setTimeout(() => timer = void 0, wait);
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function isDebug() {
|
|
25
|
+
return Boolean(data("windwalker.debug"));
|
|
26
|
+
}
|
|
27
|
+
function nextTick(callback) {
|
|
28
|
+
return Promise.resolve().then(callback ?? (() => null));
|
|
29
|
+
}
|
|
30
|
+
function wait(...promisee) {
|
|
31
|
+
return Promise.all(promisee);
|
|
32
|
+
}
|
|
33
|
+
function isError(e) {
|
|
34
|
+
return e instanceof Error;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { nextTick as a, isError as i, forceArray as n, throttle as o, isDebug as r, wait as s, debounce as t };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","names":[],"sources":["../../src/service/helper.ts"],"sourcesContent":["import { data } from '../data';\nimport { sleep } from '@lyrasoft/ts-toolkit/generic';\n\nexport { sleep };\n\nexport function forceArray<T>(item: T | T[]): T[] {\n if (Array.isArray(item)) {\n return item;\n } else {\n return [item];\n }\n}\n\nexport function debounce<T extends Function = Function>(handler: T, wait = 1): T {\n let timer: ReturnType<typeof setTimeout> | number, result: any;\n return function (this: any, ...args: any[]) {\n clearTimeout(timer);\n timer = setTimeout(() => result = handler.call(this, ...args), wait);\n return result;\n } as any as T;\n}\n\nexport function throttle<T extends Function = Function>(handler: T, wait: number = 1): T {\n let timer: ReturnType<typeof setTimeout> | number | undefined, result: any;\n return function (this: any, ...args: any[]) {\n if (!timer) {\n return result = handler.call(this, ...args);\n }\n\n clearTimeout(timer);\n timer = setTimeout(() => timer = undefined, wait);\n return result;\n } as any as T;\n}\n\nexport function isDebug() {\n return Boolean(data('windwalker.debug'));\n}\n\nexport function nextTick(callback?: () => any): Promise<any> {\n return Promise.resolve().then(callback ?? (() => null));\n}\n\nexport function wait<T extends readonly unknown[]>(\n ...promisee: { [K in keyof T]: PromiseLike<T[K]> | T[K] }\n): Promise<Awaited<T>> {\n return Promise.all(promisee) as Promise<Awaited<T>>;\n}\n\nexport function isError<E = Error>(e: any): e is E {\n return e instanceof Error;\n}\n"],"mappings":";;AAKA,SAAgB,WAAc,MAAoB;AAChD,KAAI,MAAM,QAAQ,KAAK,CACrB,QAAO;KAEP,QAAO,CAAC,KAAK;;AAIjB,SAAgB,SAAwC,SAAY,OAAO,GAAM;CAC/E,IAAI,OAA+C;AACnD,QAAO,SAAqB,GAAG,MAAa;AAC1C,eAAa,MAAM;AACnB,UAAQ,iBAAiB,SAAS,QAAQ,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK;AACpE,SAAO;;;AAIX,SAAgB,SAAwC,SAAY,OAAe,GAAM;CACvF,IAAI,OAA2D;AAC/D,QAAO,SAAqB,GAAG,MAAa;AAC1C,MAAI,CAAC,MACH,QAAO,SAAS,QAAQ,KAAK,MAAM,GAAG,KAAK;AAG7C,eAAa,MAAM;AACnB,UAAQ,iBAAiB,QAAQ,KAAA,GAAW,KAAK;AACjD,SAAO;;;AAIX,SAAgB,UAAU;AACxB,QAAO,QAAQ,KAAK,mBAAmB,CAAC;;AAG1C,SAAgB,SAAS,UAAoC;AAC3D,QAAO,QAAQ,SAAS,CAAC,KAAK,mBAAmB,MAAM;;AAGzD,SAAgB,KACd,GAAG,UACkB;AACrB,QAAO,QAAQ,IAAI,SAAS;;AAG9B,SAAgB,QAAmB,GAAgB;AACjD,QAAO,aAAa"}
|
|
@@ -1,229 +1,239 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { t as data } from "./data.js";
|
|
2
|
+
import { o as route } from "./router.js";
|
|
3
|
+
import AxiosStatic, { AxiosError, isAxiosError, isCancel } from "axios";
|
|
4
|
+
//#region ../../../../node_modules/url-template/lib/url-template.js
|
|
3
5
|
function encodeReserved(str) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return part;
|
|
9
|
-
}).join("");
|
|
6
|
+
return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {
|
|
7
|
+
if (!/%[0-9A-Fa-f]/.test(part)) part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
|
|
8
|
+
return part;
|
|
9
|
+
}).join("");
|
|
10
10
|
}
|
|
11
11
|
function encodeUnreserved(str) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
|
|
13
|
+
return "%" + c.charCodeAt(0).toString(16).toUpperCase();
|
|
14
|
+
});
|
|
15
15
|
}
|
|
16
16
|
function encodeValue(operator, value, key) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
} else {
|
|
21
|
-
return value;
|
|
22
|
-
}
|
|
17
|
+
value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);
|
|
18
|
+
if (key) return encodeUnreserved(key) + "=" + value;
|
|
19
|
+
else return value;
|
|
23
20
|
}
|
|
24
21
|
function isDefined(value) {
|
|
25
|
-
|
|
22
|
+
return value !== void 0 && value !== null;
|
|
26
23
|
}
|
|
27
24
|
function isKeyOperator(operator) {
|
|
28
|
-
|
|
25
|
+
return operator === ";" || operator === "&" || operator === "?";
|
|
29
26
|
}
|
|
30
27
|
function getValues(context, operator, key, modifier) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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;
|
|
28
|
+
var value = context[key], result = [];
|
|
29
|
+
if (isDefined(value) && value !== "") if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
30
|
+
value = value.toString();
|
|
31
|
+
if (modifier && modifier !== "*") value = value.substring(0, parseInt(modifier, 10));
|
|
32
|
+
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
|
|
33
|
+
} else if (modifier === "*") if (Array.isArray(value)) value.filter(isDefined).forEach(function(value) {
|
|
34
|
+
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
|
|
35
|
+
});
|
|
36
|
+
else Object.keys(value).forEach(function(k) {
|
|
37
|
+
if (isDefined(value[k])) result.push(encodeValue(operator, value[k], k));
|
|
38
|
+
});
|
|
39
|
+
else {
|
|
40
|
+
var tmp = [];
|
|
41
|
+
if (Array.isArray(value)) value.filter(isDefined).forEach(function(value) {
|
|
42
|
+
tmp.push(encodeValue(operator, value));
|
|
43
|
+
});
|
|
44
|
+
else Object.keys(value).forEach(function(k) {
|
|
45
|
+
if (isDefined(value[k])) {
|
|
46
|
+
tmp.push(encodeUnreserved(k));
|
|
47
|
+
tmp.push(encodeValue(operator, value[k].toString()));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
if (isKeyOperator(operator)) result.push(encodeUnreserved(key) + "=" + tmp.join(","));
|
|
51
|
+
else if (tmp.length !== 0) result.push(tmp.join(","));
|
|
52
|
+
}
|
|
53
|
+
else if (operator === ";") {
|
|
54
|
+
if (isDefined(value)) result.push(encodeUnreserved(key));
|
|
55
|
+
} else if (value === "" && (operator === "&" || operator === "?")) result.push(encodeUnreserved(key) + "=");
|
|
56
|
+
else if (value === "") result.push("");
|
|
57
|
+
return result;
|
|
85
58
|
}
|
|
86
59
|
function parseTemplate(template) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
};
|
|
60
|
+
var operators = [
|
|
61
|
+
"+",
|
|
62
|
+
"#",
|
|
63
|
+
".",
|
|
64
|
+
"/",
|
|
65
|
+
";",
|
|
66
|
+
"?",
|
|
67
|
+
"&"
|
|
68
|
+
];
|
|
69
|
+
return { expand: function(context) {
|
|
70
|
+
return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function(_, expression, literal) {
|
|
71
|
+
if (expression) {
|
|
72
|
+
var operator = null, values = [];
|
|
73
|
+
if (operators.indexOf(expression.charAt(0)) !== -1) {
|
|
74
|
+
operator = expression.charAt(0);
|
|
75
|
+
expression = expression.substr(1);
|
|
76
|
+
}
|
|
77
|
+
expression.split(/,/g).forEach(function(variable) {
|
|
78
|
+
var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
|
|
79
|
+
values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
|
|
80
|
+
});
|
|
81
|
+
if (operator && operator !== "+") {
|
|
82
|
+
var separator = ",";
|
|
83
|
+
if (operator === "?") separator = "&";
|
|
84
|
+
else if (operator !== "#") separator = operator;
|
|
85
|
+
return (values.length !== 0 ? operator : "") + values.join(separator);
|
|
86
|
+
} else return values.join(",");
|
|
87
|
+
} else return encodeReserved(literal);
|
|
88
|
+
});
|
|
89
|
+
} };
|
|
118
90
|
}
|
|
91
|
+
//#endregion
|
|
92
|
+
//#region src/module/http-client.ts
|
|
119
93
|
function prepareAxios(axios) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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;
|
|
94
|
+
axios.interceptors.request.use((config) => {
|
|
95
|
+
config.headers["X-CSRF-Token"] = data("csrf-token");
|
|
96
|
+
if (config.url && config.url.startsWith("@")) config.url = route(config.url);
|
|
97
|
+
if (config?.vars && config.url) config.url = parseTemplate(config.url).expand(config.vars || {});
|
|
98
|
+
if (config.methodSimulate) {
|
|
99
|
+
if (config.methodSimulateByHeader) config.headers["X-HTTP-Method-Override"] = config;
|
|
100
|
+
else if (typeof config.data === "object") config.data["_method"] = config.method;
|
|
101
|
+
else if (typeof config.data === "string") if (config.data.includes("?")) config.data += "&_method=" + config.method;
|
|
102
|
+
else config.data += "?_method=" + config.method;
|
|
103
|
+
if (config.method?.toLowerCase() !== "get") config.method = "POST";
|
|
104
|
+
}
|
|
105
|
+
return config;
|
|
106
|
+
});
|
|
107
|
+
return axios;
|
|
148
108
|
}
|
|
149
109
|
function createHttpClient(config) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
110
|
+
const axios = config && "interceptors" in config ? config : AxiosStatic.create(config ?? {});
|
|
111
|
+
prepareAxios(axios);
|
|
112
|
+
function requestMiddleware(callback) {
|
|
113
|
+
return axios.interceptors.request.use(callback);
|
|
114
|
+
}
|
|
115
|
+
function responseMiddleware(callback) {
|
|
116
|
+
return axios.interceptors.response.use(callback);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Send a GET request.
|
|
120
|
+
*/
|
|
121
|
+
async function get(url, options = {}) {
|
|
122
|
+
options.url = url;
|
|
123
|
+
options.method = "GET";
|
|
124
|
+
return request(options);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Send a POST request.
|
|
128
|
+
*/
|
|
129
|
+
async function post(url, data, options = {}) {
|
|
130
|
+
options.url = url;
|
|
131
|
+
options.method = "POST";
|
|
132
|
+
options.data = data;
|
|
133
|
+
return request(options);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Send a PUT request.
|
|
137
|
+
*
|
|
138
|
+
* @param {string} url
|
|
139
|
+
* @param {any} data
|
|
140
|
+
* @param {AxiosRequestConfig} options
|
|
141
|
+
*
|
|
142
|
+
* @returns {Promise<AxiosResponse>}
|
|
143
|
+
*/
|
|
144
|
+
async function put(url, data, options = {}) {
|
|
145
|
+
options.url = url;
|
|
146
|
+
options.method = "PUT";
|
|
147
|
+
options.data = data;
|
|
148
|
+
return request(options);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Send a PATCH request.
|
|
152
|
+
*
|
|
153
|
+
* @param {string} url
|
|
154
|
+
* @param {any} data
|
|
155
|
+
* @param {AxiosRequestConfig} options
|
|
156
|
+
*
|
|
157
|
+
* @returns {Promise<AxiosResponse>}
|
|
158
|
+
*/
|
|
159
|
+
async function patch(url, data, options = {}) {
|
|
160
|
+
options.url = url;
|
|
161
|
+
options.method = "PATCH";
|
|
162
|
+
options.data = data;
|
|
163
|
+
return request(options);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Send a DELETE request.
|
|
167
|
+
*
|
|
168
|
+
* @param {string} url
|
|
169
|
+
* @param {any} data
|
|
170
|
+
* @param {AxiosRequestConfig} options
|
|
171
|
+
*
|
|
172
|
+
* @returns {Promise<AxiosResponse>}
|
|
173
|
+
*/
|
|
174
|
+
async function deletes(url, data, options = {}) {
|
|
175
|
+
options.url = url;
|
|
176
|
+
options.method = "DELETE";
|
|
177
|
+
options.data = data;
|
|
178
|
+
return request(options);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Send a HEAD request.
|
|
182
|
+
*
|
|
183
|
+
* @param {string} url
|
|
184
|
+
* @param {AxiosRequestConfig} options
|
|
185
|
+
*
|
|
186
|
+
* @returns {Promise<AxiosResponse>}
|
|
187
|
+
*/
|
|
188
|
+
async function head(url, options = {}) {
|
|
189
|
+
options.url = url;
|
|
190
|
+
options.method = "HEAD";
|
|
191
|
+
return request(options);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Send a OPTIONS request.
|
|
195
|
+
*
|
|
196
|
+
* @param {string} url
|
|
197
|
+
* @param {AxiosRequestConfig} options
|
|
198
|
+
*
|
|
199
|
+
* @returns {Promise<AxiosResponse>}
|
|
200
|
+
*/
|
|
201
|
+
async function options(url, options = {}) {
|
|
202
|
+
options.url = url;
|
|
203
|
+
options.method = "OPTIONS";
|
|
204
|
+
return request(options);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Send request.
|
|
208
|
+
*/
|
|
209
|
+
async function request(options) {
|
|
210
|
+
try {
|
|
211
|
+
return await axios(options);
|
|
212
|
+
} catch (e) {
|
|
213
|
+
e.originMessage = e.message;
|
|
214
|
+
const err = e;
|
|
215
|
+
if (err.response?.data?.message) err.message = err.response.data.message;
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
axios,
|
|
221
|
+
request,
|
|
222
|
+
get,
|
|
223
|
+
post,
|
|
224
|
+
put,
|
|
225
|
+
patch,
|
|
226
|
+
delete: deletes,
|
|
227
|
+
head,
|
|
228
|
+
options,
|
|
229
|
+
requestMiddleware,
|
|
230
|
+
responseMiddleware,
|
|
231
|
+
isCancel,
|
|
232
|
+
AxiosError,
|
|
233
|
+
isAxiosError
|
|
234
|
+
};
|
|
225
235
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
//# sourceMappingURL=http-client.js.map
|
|
236
|
+
//#endregion
|
|
237
|
+
export { createHttpClient };
|
|
238
|
+
|
|
239
|
+
//# sourceMappingURL=http-client.js.map
|