@windwalker-io/unicorn-next 0.1.5 → 0.1.7
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/bin/generate-docs.js +33 -0
- package/dist/chunks/field-single-image-drag.js +2 -1
- package/dist/chunks/field-single-image-drag.js.map +1 -1
- package/dist/chunks/grid.js +12 -0
- package/dist/chunks/grid.js.map +1 -1
- package/dist/chunks/tinymce.js +1 -1
- package/dist/chunks/unicorn.js +24 -14
- package/dist/chunks/unicorn.js.map +1 -1
- package/dist/chunks/validation.js +1 -1
- package/dist/index.d.ts +26 -14
- package/dist/unicorn.js +10 -8
- package/docs/functions.md +3855 -0
- package/package.json +3 -2
- package/src/composable/index.ts +1 -0
- package/src/composable/useUniDirective.ts +19 -8
- package/src/module/field-single-image-drag.ts +3 -1
- package/src/module/grid.ts +14 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { readFileSync, writeFileSync, globSync } from 'node:fs';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { generateDocumentation } from 'tsdoc-markdown';
|
|
6
|
+
|
|
7
|
+
// Generate documentation for a list of files
|
|
8
|
+
const nnsInputFiles = globSync([
|
|
9
|
+
'./src/service/*.ts',
|
|
10
|
+
'./src/module/*.ts',
|
|
11
|
+
'./src/plugin/*.ts',
|
|
12
|
+
'./src/*.ts',
|
|
13
|
+
], {
|
|
14
|
+
windowsPathsNoEscape: true
|
|
15
|
+
}).map((path) => path.replace(/\\/g, '/'));
|
|
16
|
+
|
|
17
|
+
generateDocumentation({
|
|
18
|
+
inputFiles: nnsInputFiles,
|
|
19
|
+
outputFile: './docs/functions.md',
|
|
20
|
+
buildOptions: {
|
|
21
|
+
explore: true,
|
|
22
|
+
// repo: {
|
|
23
|
+
// url: 'https://github.com/windwalker-io/unicorn/tree/main/assets'
|
|
24
|
+
// }
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// const readme = readFileSync(resolve(__dirname, 'docs/_README.md'), 'utf-8');
|
|
29
|
+
// const functions = readFileSync(resolve(__dirname, 'docs/_functions.md'), 'utf-8');
|
|
30
|
+
//
|
|
31
|
+
// const content = readme.replace('<!-- Functions -->', functions);
|
|
32
|
+
//
|
|
33
|
+
// writeFileSync('./README.md', content);
|
|
@@ -328,7 +328,8 @@ async function loadCropper() {
|
|
|
328
328
|
injectCssToDocument(css2);
|
|
329
329
|
})
|
|
330
330
|
]);
|
|
331
|
-
|
|
331
|
+
const module = (await loadingCropper)[0];
|
|
332
|
+
return module.default;
|
|
332
333
|
}
|
|
333
334
|
async function init() {
|
|
334
335
|
injectCssToDocument(css);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-single-image-drag.js","sources":["../../src/module/field-single-image-drag.ts"],"sourcesContent":["\r\nimport { useHttpClient } from '../composable';\r\nimport { __, injectCssToDocument, selectAll, simpleAlert } from '../service';\r\nimport { mergeDeep } from '../utilities';\r\nimport css from '../../scss/field/single-image-drag.scss?inline';\r\nimport { Modal } from 'bootstrap';\r\nimport type Cropper from 'cropperjs';\r\nimport { ApiReturn } from './http-client';\r\n\r\nexport interface SingleImageDragOptions {\r\n accept: string | string[];\r\n ajax_url?: string;\r\n crop: boolean;\r\n width: number;\r\n height: number;\r\n max_width?: number;\r\n min_width?: number;\r\n max_height?: number;\r\n min_height?: number;\r\n modalTarget: string;\r\n}\r\n\r\nconst defaultOptions: Partial<SingleImageDragOptions> = {\r\n accept: [\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/webp',\r\n 'image/avif',\r\n 'image/gif',\r\n ],\r\n crop: false,\r\n width: 800,\r\n height: 800,\r\n};\r\n\r\nexport class SingleImageDragElement extends HTMLElement {\r\n static is = 'uni-sid';\r\n\r\n currentImage = '';\r\n currentFile: File | undefined = undefined;\r\n lastZoom = 0;\r\n valueBackup = '';\r\n\r\n private options!: SingleImageDragOptions;\r\n private valueInput!: HTMLInputElement;\r\n private fileInput!: HTMLInputElement;\r\n private selectButton!: HTMLButtonElement;\r\n private pasteButton!: HTMLButtonElement;\r\n private dragarea!: HTMLDivElement;\r\n private previewImage!: HTMLImageElement;\r\n private removeCheckbox!: HTMLInputElement;\r\n private modalElement!: HTMLDivElement;\r\n private modal!: Modal;\r\n private cropContainer!: HTMLDivElement;\r\n private savebutton!: HTMLButtonElement;\r\n private modalToolbarButtons!: NodeListOf<HTMLButtonElement>;\r\n private cropper!: Cropper;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n this.options = mergeDeep(\r\n {},\r\n defaultOptions,\r\n JSON.parse(this.getAttribute('options') || '{}')\r\n );\r\n\r\n this.valueInput = this.querySelector<HTMLInputElement>('[data-field-input]')!;\r\n this.fileInput = this.querySelector<HTMLInputElement>('[data-sid=file]')!;\r\n this.selectButton = this.querySelector<HTMLButtonElement>('[data-sid=select]')!;\r\n this.pasteButton = this.querySelector<HTMLButtonElement>('[data-sid=paste]')!;\r\n this.dragarea = this.querySelector<HTMLDivElement>('[data-sid=dragarea]')!;\r\n this.previewImage = this.querySelector<HTMLImageElement>('[data-sid=preview]')!;\r\n this.removeCheckbox = this.querySelector<HTMLInputElement>('[data-sid=remove]')!;\r\n\r\n this.modalElement = document.querySelector<HTMLDivElement>(this.options.modalTarget)!;\r\n this.modal = Modal.getOrCreateInstance(this.modalElement);\r\n this.cropContainer = this.modalElement.querySelector<HTMLDivElement>('[data-sid=\"crop-container\"]')!;\r\n this.savebutton = this.modalElement.querySelector<HTMLButtonElement>('[data-sid=save-button]')!;\r\n this.modalToolbarButtons = this.modalElement.querySelectorAll<HTMLButtonElement>('[data-sid-toolbar]');\r\n\r\n const modalShown = async () => {\r\n const cropper = await this.getCropper();\r\n cropper.replace(this.currentImage);\r\n this.cropContainer.style.visibility = '';\r\n this.currentImage = '';\r\n };\r\n\r\n this.modalElement.addEventListener('shown.bs.modal', modalShown.bind(this));\r\n\r\n this.savebutton.addEventListener('click', () => {\r\n this.saveCropped();\r\n this.modal.hide();\r\n });\r\n\r\n this.bindEvents();\r\n\r\n this.style.visibility = '';\r\n }\r\n\r\n bindEvents() {\r\n this.dragarea.addEventListener('dragover', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.dragarea.classList.add('hover');\r\n });\r\n\r\n this.dragarea.addEventListener('dragleave', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.dragarea.classList.remove('hover');\r\n });\r\n\r\n this.dragarea.addEventListener('drop', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.dragarea.classList.remove('hover');\r\n\r\n const files = (event.target as HTMLInputElement).files || event.dataTransfer?.files || [];\r\n this.handleFileSelect(files[0]);\r\n });\r\n\r\n // Select button\r\n this.selectButton.addEventListener('click', () => {\r\n const input = document.createElement('input');\r\n input.setAttribute('type', 'file');\r\n input.setAttribute('accept', this.getInputAccept());\r\n input.style.display = 'none';\r\n input.addEventListener('change', (e) => {\r\n this.handleFileSelect(input.files![0]!);\r\n\r\n input.remove();\r\n });\r\n\r\n document.body.appendChild(input);\r\n input.click();\r\n });\r\n\r\n this.pasteButton.addEventListener('click', () => {\r\n navigator.clipboard.read().then((items) => {\r\n let types = items[0].types;\r\n\r\n if (types.length === 0) {\r\n this.alert('This browser unable to get clipboard data.');\r\n return;\r\n }\r\n\r\n types = types.slice().sort();\r\n\r\n const type = types[0];\r\n\r\n items[0].getType(type).then((blob) => {\r\n this.handleFileSelect(new File([ blob ], 'image.png', { type }));\r\n });\r\n });\r\n });\r\n\r\n // Delete\r\n this.removeCheckbox?.addEventListener('click', () => {\r\n if (this.removeCheckbox.checked) {\r\n this.valueBackup = this.valueInput.value;\r\n this.valueInput.value = '';\r\n } else {\r\n this.valueInput.value = this.valueBackup;\r\n this.valueBackup = '';\r\n }\r\n });\r\n\r\n // Zoom slider\r\n selectAll(this.modalToolbarButtons, (button) => {\r\n button.addEventListener('click', (event) => {\r\n this.toolbarClicked(button, event);\r\n });\r\n });\r\n }\r\n\r\n getInputAccept() {\r\n let accept = this.options.accept;\r\n\r\n if (Array.isArray(accept)) {\r\n accept = accept.join(',');\r\n }\r\n\r\n return accept;\r\n }\r\n\r\n handleFileSelect(file: File) {\r\n if (!this.checkFile(file)) {\r\n return;\r\n }\r\n\r\n if (this.options.crop) {\r\n const reader = new FileReader();\r\n\r\n reader.addEventListener('load', (event) => {\r\n this.cropContainer.style.visibility = 'hidden';\r\n this.currentImage = event.target!.result as string;\r\n this.currentFile = file;\r\n\r\n // After modal shown, cropper will auto load.\r\n this.modal.show();\r\n });\r\n\r\n reader.readAsDataURL(file);\r\n return;\r\n }\r\n\r\n this.saveImage(file);\r\n }\r\n\r\n async saveCropped() {\r\n const Cropper = await this.getCropper();\r\n\r\n Cropper.getCroppedCanvas({\r\n width: this.options.width,\r\n height: this.options.height,\r\n imageSmoothingEnabled: true\r\n })\r\n .toBlob((blob) => {\r\n const file = new File([ blob! ], this.currentFile!.name, { type: 'image/png' });\r\n this.saveImage(file);\r\n }, 'image/png');\r\n }\r\n\r\n async getCropper() {\r\n if (this.cropper) {\r\n return this.cropper;\r\n }\r\n\r\n const Cropper = await loadCropper();\r\n\r\n return this.cropper = new Cropper(this.cropContainer.querySelector('img')!, {\r\n aspectRatio: this.options.width / this.options.height,\r\n autoCropArea: 1,\r\n viewMode: 1,\r\n dragMode: 'move',\r\n cropBoxMovable: false,\r\n cropBoxResizable: false,\r\n ready: (e) => {\r\n //\r\n },\r\n });\r\n }\r\n\r\n async toolbarClicked(button: HTMLButtonElement, event: MouseEvent) {\r\n const cropper = await this.getCropper();\r\n\r\n const data = cropper.getData();\r\n\r\n switch (button.dataset.sidToolbar) {\r\n case 'zoom-in':\r\n cropper.zoom(0.1);\r\n break;\r\n\r\n case 'zoom-out':\r\n cropper.zoom(-0.1);\r\n break;\r\n\r\n case 'rotate-left':\r\n cropper.rotate(-90);\r\n break;\r\n\r\n case 'rotate-right':\r\n cropper.rotate(90);\r\n break;\r\n\r\n case 'scale-x':\r\n cropper.scaleX(-data.scaleX);\r\n break;\r\n\r\n case 'scale-y':\r\n cropper.scaleY(-data.scaleY);\r\n break;\r\n }\r\n }\r\n\r\n checkFile(file: File): boolean {\r\n let accept = this.options.accept;\r\n\r\n if (typeof accept === 'string') {\r\n accept = accept.split(',').map(v => v.trim());\r\n }\r\n\r\n if (!accept.length) {\r\n return true;\r\n }\r\n\r\n let allow = false;\r\n\r\n for (const type of accept) {\r\n if (type.indexOf('/') !== -1) {\r\n allow = allow || this.compareMimeType(type, file.type);\r\n } else {\r\n allow = allow || type.toLowerCase() === getFileExtension(file)?.toLowerCase();\r\n }\r\n }\r\n\r\n if (allow) {\r\n return true;\r\n }\r\n\r\n this.alert(\r\n __('unicorn.field.sid.message.invalid.image.title'),\r\n __('unicorn.field.sid.message.invalid.image.desc'),\r\n 'error'\r\n );\r\n\r\n return false;\r\n }\r\n\r\n compareMimeType(accept: string, mime: string) {\r\n const accept2 = accept.split('/');\r\n const mime2 = mime.split('/');\r\n\r\n if (accept2[1] === '*') {\r\n return accept2[0] === mime2[0];\r\n }\r\n\r\n return accept === mime;\r\n }\r\n\r\n checkSize(image: HTMLImageElement): boolean {\r\n try {\r\n if (this.options.max_width && this.options.max_width < image.width) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.max.width', this.options.max_width));\r\n }\r\n\r\n if (this.options.min_width && this.options.min_width > image.width) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.min.width', this.options.min_width));\r\n }\r\n\r\n if (this.options.max_height && this.options.max_height < image.height) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.max.height', this.options.max_height));\r\n }\r\n\r\n if (this.options.min_height && this.options.min_height > image.height) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.min.height', this.options.min_height));\r\n }\r\n } catch (e) {\r\n this.alert(\r\n __('unicorn.field.sid.message.invalid.size.title'),\r\n (e as Error).message,\r\n 'error'\r\n );\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n alert(title: string, text = '', type = 'info') {\r\n return simpleAlert(title, text, type);\r\n }\r\n\r\n async saveImage(file: File) {\r\n if (this.options.ajax_url) {\r\n const loading = this.querySelector<HTMLImageElement>('[data-sid=file-uploading]')!;\r\n\r\n this.previewImage.src = '';\r\n this.previewImage.style.display = 'none';\r\n loading.style.display = 'flex';\r\n\r\n try {\r\n const res = await this.uploadImage(file);\r\n\r\n this.storeValue(res.data.data.url, res.data.data.url);\r\n } catch (e) {\r\n console.error(e);\r\n simpleAlert((e as Error).message);\r\n return;\r\n } finally {\r\n loading.style.display = 'none';\r\n }\r\n\r\n return;\r\n }\r\n\r\n // @see https://stackoverflow.com/a/47172409\r\n // @see https://stackoverflow.com/a/47522812\r\n const dt = new DataTransfer();\r\n dt.items.add(file);\r\n\r\n // No required for value input to remove validation message\r\n this.valueInput.required = false;\r\n\r\n this.fileInput.files = dt.files;\r\n this.fileInput.dispatchEvent(new CustomEvent('change', { bubbles: true }));\r\n this.fileInput.dispatchEvent(new CustomEvent('input', { bubbles: true }));\r\n\r\n this.storeValue('', URL.createObjectURL(file));\r\n }\r\n\r\n async uploadImage(file: File) {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n const { post } = await useHttpClient();\r\n\r\n return post<ApiReturn<{ url: string; }>>(this.options.ajax_url!, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data'\r\n }\r\n });\r\n }\r\n\r\n storeValue(url: string, preview: string) {\r\n this.previewImage.src = preview;\r\n this.previewImage.style.display = 'inline-block';\r\n\r\n // Make delete box unchecked\r\n if (this.removeCheckbox) {\r\n this.removeCheckbox.checked = false;\r\n }\r\n\r\n if (url) {\r\n this.valueInput.value = url;\r\n }\r\n\r\n // Trigger change\r\n this.previewImage.dispatchEvent(new CustomEvent('change', { bubbles: true }));\r\n this.valueInput.dispatchEvent(new CustomEvent('change', { bubbles: true }));\r\n this.valueInput.dispatchEvent(new CustomEvent('input', { bubbles: true }));\r\n }\r\n}\r\n\r\n// Promise.all([\r\n// import('@cropperjs/cropper.min.js'),\r\n// import('@cropperjs/cropper.css'),\r\n// ])\r\n// .then((service) => {\r\n// const styleSheet = service[1].default;\r\n// document.adoptedStyleSheets = [...document.adoptedStyleSheets, styleSheet];\r\n// });\r\n\r\nfunction getFileExtension(file: File): string | undefined {\r\n const parts = file.name.split('.');\r\n if (parts.length > 1) {\r\n return parts.pop();\r\n }\r\n return undefined;\r\n}\r\n\r\nlet loadingCropper: Promise<any>;\r\n\r\nasync function loadCropper(): Promise<typeof Cropper> {\r\n loadingCropper ??= Promise.all([\r\n import('cropperjs'),\r\n import('cropperjs/dist/cropper.min.css?inline').then(({ default: css }) => {\r\n injectCssToDocument(css);\r\n })\r\n ]);\r\n\r\n return (await loadingCropper)[0];\r\n}\r\n\r\nasync function init() {\r\n injectCssToDocument(css);\r\n\r\n customElements.define(SingleImageDragElement.is, SingleImageDragElement);\r\n\r\n await loadCropper();\r\n}\r\n\r\nexport const ready = init();\r\n\r\nexport interface SingleImageDragModule {\r\n SingleImageDragElement: typeof SingleImageDragElement;\r\n ready: typeof ready;\r\n}\r\n"],"names":["css"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"field-single-image-drag.js","sources":["../../src/module/field-single-image-drag.ts"],"sourcesContent":["\r\nimport { useHttpClient } from '../composable';\r\nimport { __, injectCssToDocument, selectAll, simpleAlert } from '../service';\r\nimport { mergeDeep } from '../utilities';\r\nimport css from '../../scss/field/single-image-drag.scss?inline';\r\nimport { Modal } from 'bootstrap';\r\nimport type Cropper from 'cropperjs';\r\nimport { ApiReturn } from './http-client';\r\n\r\nexport interface SingleImageDragOptions {\r\n accept: string | string[];\r\n ajax_url?: string;\r\n crop: boolean;\r\n width: number;\r\n height: number;\r\n max_width?: number;\r\n min_width?: number;\r\n max_height?: number;\r\n min_height?: number;\r\n modalTarget: string;\r\n}\r\n\r\nconst defaultOptions: Partial<SingleImageDragOptions> = {\r\n accept: [\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/webp',\r\n 'image/avif',\r\n 'image/gif',\r\n ],\r\n crop: false,\r\n width: 800,\r\n height: 800,\r\n};\r\n\r\nexport class SingleImageDragElement extends HTMLElement {\r\n static is = 'uni-sid';\r\n\r\n currentImage = '';\r\n currentFile: File | undefined = undefined;\r\n lastZoom = 0;\r\n valueBackup = '';\r\n\r\n private options!: SingleImageDragOptions;\r\n private valueInput!: HTMLInputElement;\r\n private fileInput!: HTMLInputElement;\r\n private selectButton!: HTMLButtonElement;\r\n private pasteButton!: HTMLButtonElement;\r\n private dragarea!: HTMLDivElement;\r\n private previewImage!: HTMLImageElement;\r\n private removeCheckbox!: HTMLInputElement;\r\n private modalElement!: HTMLDivElement;\r\n private modal!: Modal;\r\n private cropContainer!: HTMLDivElement;\r\n private savebutton!: HTMLButtonElement;\r\n private modalToolbarButtons!: NodeListOf<HTMLButtonElement>;\r\n private cropper!: Cropper;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n this.options = mergeDeep(\r\n {},\r\n defaultOptions,\r\n JSON.parse(this.getAttribute('options') || '{}')\r\n );\r\n\r\n this.valueInput = this.querySelector<HTMLInputElement>('[data-field-input]')!;\r\n this.fileInput = this.querySelector<HTMLInputElement>('[data-sid=file]')!;\r\n this.selectButton = this.querySelector<HTMLButtonElement>('[data-sid=select]')!;\r\n this.pasteButton = this.querySelector<HTMLButtonElement>('[data-sid=paste]')!;\r\n this.dragarea = this.querySelector<HTMLDivElement>('[data-sid=dragarea]')!;\r\n this.previewImage = this.querySelector<HTMLImageElement>('[data-sid=preview]')!;\r\n this.removeCheckbox = this.querySelector<HTMLInputElement>('[data-sid=remove]')!;\r\n\r\n this.modalElement = document.querySelector<HTMLDivElement>(this.options.modalTarget)!;\r\n this.modal = Modal.getOrCreateInstance(this.modalElement);\r\n this.cropContainer = this.modalElement.querySelector<HTMLDivElement>('[data-sid=\"crop-container\"]')!;\r\n this.savebutton = this.modalElement.querySelector<HTMLButtonElement>('[data-sid=save-button]')!;\r\n this.modalToolbarButtons = this.modalElement.querySelectorAll<HTMLButtonElement>('[data-sid-toolbar]');\r\n\r\n const modalShown = async () => {\r\n const cropper = await this.getCropper();\r\n cropper.replace(this.currentImage);\r\n this.cropContainer.style.visibility = '';\r\n this.currentImage = '';\r\n };\r\n\r\n this.modalElement.addEventListener('shown.bs.modal', modalShown.bind(this));\r\n\r\n this.savebutton.addEventListener('click', () => {\r\n this.saveCropped();\r\n this.modal.hide();\r\n });\r\n\r\n this.bindEvents();\r\n\r\n this.style.visibility = '';\r\n }\r\n\r\n bindEvents() {\r\n this.dragarea.addEventListener('dragover', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.dragarea.classList.add('hover');\r\n });\r\n\r\n this.dragarea.addEventListener('dragleave', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.dragarea.classList.remove('hover');\r\n });\r\n\r\n this.dragarea.addEventListener('drop', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.dragarea.classList.remove('hover');\r\n\r\n const files = (event.target as HTMLInputElement).files || event.dataTransfer?.files || [];\r\n this.handleFileSelect(files[0]);\r\n });\r\n\r\n // Select button\r\n this.selectButton.addEventListener('click', () => {\r\n const input = document.createElement('input');\r\n input.setAttribute('type', 'file');\r\n input.setAttribute('accept', this.getInputAccept());\r\n input.style.display = 'none';\r\n input.addEventListener('change', (e) => {\r\n this.handleFileSelect(input.files![0]!);\r\n\r\n input.remove();\r\n });\r\n\r\n document.body.appendChild(input);\r\n input.click();\r\n });\r\n\r\n this.pasteButton.addEventListener('click', () => {\r\n navigator.clipboard.read().then((items) => {\r\n let types = items[0].types;\r\n\r\n if (types.length === 0) {\r\n this.alert('This browser unable to get clipboard data.');\r\n return;\r\n }\r\n\r\n types = types.slice().sort();\r\n\r\n const type = types[0];\r\n\r\n items[0].getType(type).then((blob) => {\r\n this.handleFileSelect(new File([ blob ], 'image.png', { type }));\r\n });\r\n });\r\n });\r\n\r\n // Delete\r\n this.removeCheckbox?.addEventListener('click', () => {\r\n if (this.removeCheckbox.checked) {\r\n this.valueBackup = this.valueInput.value;\r\n this.valueInput.value = '';\r\n } else {\r\n this.valueInput.value = this.valueBackup;\r\n this.valueBackup = '';\r\n }\r\n });\r\n\r\n // Zoom slider\r\n selectAll(this.modalToolbarButtons, (button) => {\r\n button.addEventListener('click', (event) => {\r\n this.toolbarClicked(button, event);\r\n });\r\n });\r\n }\r\n\r\n getInputAccept() {\r\n let accept = this.options.accept;\r\n\r\n if (Array.isArray(accept)) {\r\n accept = accept.join(',');\r\n }\r\n\r\n return accept;\r\n }\r\n\r\n handleFileSelect(file: File) {\r\n if (!this.checkFile(file)) {\r\n return;\r\n }\r\n\r\n if (this.options.crop) {\r\n const reader = new FileReader();\r\n\r\n reader.addEventListener('load', (event) => {\r\n this.cropContainer.style.visibility = 'hidden';\r\n this.currentImage = event.target!.result as string;\r\n this.currentFile = file;\r\n\r\n // After modal shown, cropper will auto load.\r\n this.modal.show();\r\n });\r\n\r\n reader.readAsDataURL(file);\r\n return;\r\n }\r\n\r\n this.saveImage(file);\r\n }\r\n\r\n async saveCropped() {\r\n const Cropper = await this.getCropper();\r\n\r\n Cropper.getCroppedCanvas({\r\n width: this.options.width,\r\n height: this.options.height,\r\n imageSmoothingEnabled: true\r\n })\r\n .toBlob((blob) => {\r\n const file = new File([ blob! ], this.currentFile!.name, { type: 'image/png' });\r\n this.saveImage(file);\r\n }, 'image/png');\r\n }\r\n\r\n async getCropper() {\r\n if (this.cropper) {\r\n return this.cropper;\r\n }\r\n\r\n const Cropper = await loadCropper();\r\n\r\n return this.cropper = new Cropper(this.cropContainer.querySelector('img')!, {\r\n aspectRatio: this.options.width / this.options.height,\r\n autoCropArea: 1,\r\n viewMode: 1,\r\n dragMode: 'move',\r\n cropBoxMovable: false,\r\n cropBoxResizable: false,\r\n ready: (e) => {\r\n //\r\n },\r\n });\r\n }\r\n\r\n async toolbarClicked(button: HTMLButtonElement, event: MouseEvent) {\r\n const cropper = await this.getCropper();\r\n\r\n const data = cropper.getData();\r\n\r\n switch (button.dataset.sidToolbar) {\r\n case 'zoom-in':\r\n cropper.zoom(0.1);\r\n break;\r\n\r\n case 'zoom-out':\r\n cropper.zoom(-0.1);\r\n break;\r\n\r\n case 'rotate-left':\r\n cropper.rotate(-90);\r\n break;\r\n\r\n case 'rotate-right':\r\n cropper.rotate(90);\r\n break;\r\n\r\n case 'scale-x':\r\n cropper.scaleX(-data.scaleX);\r\n break;\r\n\r\n case 'scale-y':\r\n cropper.scaleY(-data.scaleY);\r\n break;\r\n }\r\n }\r\n\r\n checkFile(file: File): boolean {\r\n let accept = this.options.accept;\r\n\r\n if (typeof accept === 'string') {\r\n accept = accept.split(',').map(v => v.trim());\r\n }\r\n\r\n if (!accept.length) {\r\n return true;\r\n }\r\n\r\n let allow = false;\r\n\r\n for (const type of accept) {\r\n if (type.indexOf('/') !== -1) {\r\n allow = allow || this.compareMimeType(type, file.type);\r\n } else {\r\n allow = allow || type.toLowerCase() === getFileExtension(file)?.toLowerCase();\r\n }\r\n }\r\n\r\n if (allow) {\r\n return true;\r\n }\r\n\r\n this.alert(\r\n __('unicorn.field.sid.message.invalid.image.title'),\r\n __('unicorn.field.sid.message.invalid.image.desc'),\r\n 'error'\r\n );\r\n\r\n return false;\r\n }\r\n\r\n compareMimeType(accept: string, mime: string) {\r\n const accept2 = accept.split('/');\r\n const mime2 = mime.split('/');\r\n\r\n if (accept2[1] === '*') {\r\n return accept2[0] === mime2[0];\r\n }\r\n\r\n return accept === mime;\r\n }\r\n\r\n checkSize(image: HTMLImageElement): boolean {\r\n try {\r\n if (this.options.max_width && this.options.max_width < image.width) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.max.width', this.options.max_width));\r\n }\r\n\r\n if (this.options.min_width && this.options.min_width > image.width) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.min.width', this.options.min_width));\r\n }\r\n\r\n if (this.options.max_height && this.options.max_height < image.height) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.max.height', this.options.max_height));\r\n }\r\n\r\n if (this.options.min_height && this.options.min_height > image.height) {\r\n throw new Error(__('unicorn.field.sid.message.invalid.size.min.height', this.options.min_height));\r\n }\r\n } catch (e) {\r\n this.alert(\r\n __('unicorn.field.sid.message.invalid.size.title'),\r\n (e as Error).message,\r\n 'error'\r\n );\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n alert(title: string, text = '', type = 'info') {\r\n return simpleAlert(title, text, type);\r\n }\r\n\r\n async saveImage(file: File) {\r\n if (this.options.ajax_url) {\r\n const loading = this.querySelector<HTMLImageElement>('[data-sid=file-uploading]')!;\r\n\r\n this.previewImage.src = '';\r\n this.previewImage.style.display = 'none';\r\n loading.style.display = 'flex';\r\n\r\n try {\r\n const res = await this.uploadImage(file);\r\n\r\n this.storeValue(res.data.data.url, res.data.data.url);\r\n } catch (e) {\r\n console.error(e);\r\n simpleAlert((e as Error).message);\r\n return;\r\n } finally {\r\n loading.style.display = 'none';\r\n }\r\n\r\n return;\r\n }\r\n\r\n // @see https://stackoverflow.com/a/47172409\r\n // @see https://stackoverflow.com/a/47522812\r\n const dt = new DataTransfer();\r\n dt.items.add(file);\r\n\r\n // No required for value input to remove validation message\r\n this.valueInput.required = false;\r\n\r\n this.fileInput.files = dt.files;\r\n this.fileInput.dispatchEvent(new CustomEvent('change', { bubbles: true }));\r\n this.fileInput.dispatchEvent(new CustomEvent('input', { bubbles: true }));\r\n\r\n this.storeValue('', URL.createObjectURL(file));\r\n }\r\n\r\n async uploadImage(file: File) {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n const { post } = await useHttpClient();\r\n\r\n return post<ApiReturn<{ url: string; }>>(this.options.ajax_url!, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data'\r\n }\r\n });\r\n }\r\n\r\n storeValue(url: string, preview: string) {\r\n this.previewImage.src = preview;\r\n this.previewImage.style.display = 'inline-block';\r\n\r\n // Make delete box unchecked\r\n if (this.removeCheckbox) {\r\n this.removeCheckbox.checked = false;\r\n }\r\n\r\n if (url) {\r\n this.valueInput.value = url;\r\n }\r\n\r\n // Trigger change\r\n this.previewImage.dispatchEvent(new CustomEvent('change', { bubbles: true }));\r\n this.valueInput.dispatchEvent(new CustomEvent('change', { bubbles: true }));\r\n this.valueInput.dispatchEvent(new CustomEvent('input', { bubbles: true }));\r\n }\r\n}\r\n\r\n// Promise.all([\r\n// import('@cropperjs/cropper.min.js'),\r\n// import('@cropperjs/cropper.css'),\r\n// ])\r\n// .then((service) => {\r\n// const styleSheet = service[1].default;\r\n// document.adoptedStyleSheets = [...document.adoptedStyleSheets, styleSheet];\r\n// });\r\n\r\nfunction getFileExtension(file: File): string | undefined {\r\n const parts = file.name.split('.');\r\n if (parts.length > 1) {\r\n return parts.pop();\r\n }\r\n return undefined;\r\n}\r\n\r\nlet loadingCropper: Promise<any>;\r\n\r\nasync function loadCropper(): Promise<typeof Cropper> {\r\n loadingCropper ??= Promise.all([\r\n import('cropperjs'),\r\n import('cropperjs/dist/cropper.min.css?inline').then(({ default: css }) => {\r\n injectCssToDocument(css);\r\n })\r\n ]);\r\n\r\n const module = (await loadingCropper)[0];\r\n\r\n return module.default;\r\n}\r\n\r\nasync function init() {\r\n injectCssToDocument(css);\r\n\r\n customElements.define(SingleImageDragElement.is, SingleImageDragElement);\r\n\r\n await loadCropper();\r\n}\r\n\r\nexport const ready = init();\r\n\r\nexport interface SingleImageDragModule {\r\n SingleImageDragElement: typeof SingleImageDragElement;\r\n ready: typeof ready;\r\n}\r\n"],"names":["css"],"mappings":"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"}
|
package/dist/chunks/grid.js
CHANGED
|
@@ -194,6 +194,18 @@ class UnicornGridElement {
|
|
|
194
194
|
data.task = task;
|
|
195
195
|
return this.form.patch(url, data);
|
|
196
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* @deprecated Use updateListByTask() instead.
|
|
199
|
+
*/
|
|
200
|
+
batch(task, url, data) {
|
|
201
|
+
return this.updateListByTask(task, url, data);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* @deprecated Use updateListByTask() instead.
|
|
205
|
+
*/
|
|
206
|
+
updateByTask(task, url, data) {
|
|
207
|
+
return this.updateListByTask(task, url, data);
|
|
208
|
+
}
|
|
197
209
|
/**
|
|
198
210
|
* Copy a row.
|
|
199
211
|
*/
|
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';\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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"}
|
|
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 * @deprecated Use updateListByTask() instead.\r\n */\r\n batch(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n return this.updateListByTask(task, url, data);\r\n }\r\n\r\n /**\r\n * @deprecated Use updateListByTask() instead.\r\n */\r\n updateByTask(task: string, url?: Nullable<string>, data?: Nullable<Record<string, any>>): boolean {\r\n return this.updateListByTask(task, 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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"}
|
package/dist/chunks/tinymce.js
CHANGED
package/dist/chunks/unicorn.js
CHANGED
|
@@ -1293,6 +1293,17 @@ async function useTomSelect(selector, options = {}, theme = "bootstrap5") {
|
|
|
1293
1293
|
}
|
|
1294
1294
|
return m;
|
|
1295
1295
|
}
|
|
1296
|
+
async function useTinymce(selector, options = {}) {
|
|
1297
|
+
const module2 = await import("./tinymce.js");
|
|
1298
|
+
if (selector) {
|
|
1299
|
+
return module2.get(selector, options);
|
|
1300
|
+
}
|
|
1301
|
+
return module2;
|
|
1302
|
+
}
|
|
1303
|
+
async function useTinymceHook(handler) {
|
|
1304
|
+
const { addHook } = await import("./tinymce.js");
|
|
1305
|
+
return addHook(handler);
|
|
1306
|
+
}
|
|
1296
1307
|
async function useUIBootstrap5(install = false, pushToGlobal = false) {
|
|
1297
1308
|
const { UIBootstrap5 } = await import("./ui-bootstrap5.js");
|
|
1298
1309
|
const theme = UIBootstrap5.get();
|
|
@@ -1318,6 +1329,10 @@ const useBs5ButtonRadio = async (selector, options = {}) => {
|
|
|
1318
1329
|
};
|
|
1319
1330
|
let instances = {};
|
|
1320
1331
|
async function useWebDirective(name = "unicorn", options = {}) {
|
|
1332
|
+
if (options === false) {
|
|
1333
|
+
delete instances[name];
|
|
1334
|
+
return;
|
|
1335
|
+
}
|
|
1321
1336
|
return instances[name] ??= await createWebDirective(Object.assign({}, options, { prefix: "uni-" }));
|
|
1322
1337
|
}
|
|
1323
1338
|
async function useUniDirective(name, handler, wdInstance = "unicorn") {
|
|
@@ -2047,13 +2062,6 @@ async function useFieldMultiUploader() {
|
|
|
2047
2062
|
await module2.ready;
|
|
2048
2063
|
return module2;
|
|
2049
2064
|
}
|
|
2050
|
-
async function useTinymce(selector, options = {}) {
|
|
2051
|
-
const module2 = await import("./tinymce.js");
|
|
2052
|
-
if (selector) {
|
|
2053
|
-
return module2.get(selector, options);
|
|
2054
|
-
}
|
|
2055
|
-
return module2;
|
|
2056
|
-
}
|
|
2057
2065
|
function useUnicornPhpAdapter(app2) {
|
|
2058
2066
|
app2 ??= useUnicorn();
|
|
2059
2067
|
app2.use(UnicornPhpAdapter);
|
|
@@ -2206,9 +2214,9 @@ export {
|
|
|
2206
2214
|
Mixin as af,
|
|
2207
2215
|
EventMixin as ag,
|
|
2208
2216
|
createQueue as ah,
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2217
|
+
useScriptImport as ai,
|
|
2218
|
+
trans as aj,
|
|
2219
|
+
useUITheme as ak,
|
|
2212
2220
|
sleep as al,
|
|
2213
2221
|
createUnicorn as am,
|
|
2214
2222
|
createUnicornWithPlugins as an,
|
|
@@ -2227,10 +2235,12 @@ export {
|
|
|
2227
2235
|
animateTo as b,
|
|
2228
2236
|
useShowOn as b0,
|
|
2229
2237
|
createStack as b1,
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2238
|
+
useTinymce as b2,
|
|
2239
|
+
useTinymceHook as b3,
|
|
2240
|
+
useUIBootstrap5 as b4,
|
|
2241
|
+
useWebDirective as b5,
|
|
2242
|
+
useUnicornPhpAdapter as b6,
|
|
2243
|
+
UnicornPhpAdapter as b7,
|
|
2234
2244
|
renderMessage as c,
|
|
2235
2245
|
clearMessages as d,
|
|
2236
2246
|
clearNotifies as e,
|