@finema/core 1.4.192 → 1.4.193

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +60 -60
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +1 -1
  4. package/dist/runtime/components/Alert.vue +48 -48
  5. package/dist/runtime/components/Avatar.vue +27 -27
  6. package/dist/runtime/components/Badge.vue +11 -11
  7. package/dist/runtime/components/Breadcrumb.vue +44 -44
  8. package/dist/runtime/components/Button/Group.vue +37 -37
  9. package/dist/runtime/components/Button/index.vue +75 -75
  10. package/dist/runtime/components/Card.vue +38 -38
  11. package/dist/runtime/components/Core.vue +45 -45
  12. package/dist/runtime/components/Dialog/index.vue +108 -108
  13. package/dist/runtime/components/Dropdown/index.vue +70 -70
  14. package/dist/runtime/components/FlexDeck/Base.vue +153 -153
  15. package/dist/runtime/components/FlexDeck/index.vue +68 -68
  16. package/dist/runtime/components/Form/FieldWrapper.vue +23 -23
  17. package/dist/runtime/components/Form/Fields.vue +230 -230
  18. package/dist/runtime/components/Form/InputCheckbox/index.vue +28 -28
  19. package/dist/runtime/components/Form/InputDateTime/index.vue +61 -61
  20. package/dist/runtime/components/Form/InputDateTimeRange/index.vue +83 -83
  21. package/dist/runtime/components/Form/InputNumber/index.vue +27 -27
  22. package/dist/runtime/components/Form/InputRadio/index.vue +27 -27
  23. package/dist/runtime/components/Form/InputSelect/index.vue +45 -45
  24. package/dist/runtime/components/Form/InputSelectMultiple/index.vue +54 -54
  25. package/dist/runtime/components/Form/InputStatic/index.vue +16 -16
  26. package/dist/runtime/components/Form/InputTags/index.vue +141 -141
  27. package/dist/runtime/components/Form/InputText/index.vue +68 -68
  28. package/dist/runtime/components/Form/InputTextarea/index.vue +25 -25
  29. package/dist/runtime/components/Form/InputToggle/index.vue +27 -27
  30. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +206 -206
  31. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +342 -342
  32. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/ItemUpload.vue +241 -241
  33. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/ItemView.vue +89 -89
  34. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +170 -170
  35. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/ItemUpload.vue +161 -161
  36. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/ItemView.vue +64 -64
  37. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/index.vue +178 -178
  38. package/dist/runtime/components/Form/InputUploadFileClassic/index.vue +95 -95
  39. package/dist/runtime/components/Form/InputUploadFileClassicAuto/index.vue +151 -151
  40. package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +219 -219
  41. package/dist/runtime/components/Form/InputWYSIWYG/UploadImageForm.vue +55 -0
  42. package/dist/runtime/components/Form/InputWYSIWYG/index.vue +228 -214
  43. package/dist/runtime/components/Form/InputWYSIWYG/types.d.ts +13 -0
  44. package/dist/runtime/components/Form/index.vue +6 -6
  45. package/dist/runtime/components/Icon.vue +23 -23
  46. package/dist/runtime/components/Image.vue +36 -36
  47. package/dist/runtime/components/Loader.vue +27 -27
  48. package/dist/runtime/components/Modal/index.vue +146 -146
  49. package/dist/runtime/components/QRCode.vue +22 -22
  50. package/dist/runtime/components/SimplePagination.vue +96 -96
  51. package/dist/runtime/components/Slideover/index.vue +110 -110
  52. package/dist/runtime/components/Table/Base.vue +160 -160
  53. package/dist/runtime/components/Table/ColumnDate.vue +16 -16
  54. package/dist/runtime/components/Table/ColumnDateTime.vue +18 -18
  55. package/dist/runtime/components/Table/ColumnImage.vue +15 -15
  56. package/dist/runtime/components/Table/ColumnNumber.vue +14 -14
  57. package/dist/runtime/components/Table/ColumnText.vue +29 -29
  58. package/dist/runtime/components/Table/Simple.vue +69 -69
  59. package/dist/runtime/components/Table/index.vue +65 -65
  60. package/dist/runtime/components/Tabs/index.vue +64 -64
  61. package/dist/runtime/components/TeleportSafe.vue +40 -40
  62. package/package.json +101 -101
@@ -1,64 +1,64 @@
1
- <template>
2
- <div :class="[ui.imageItem.wrapper]">
3
- <div class="w-full">
4
- <div :class="[ui.imageItem.onPreview.wrapper]">
5
- <img :class="[ui.imageItem.onPreview.previewImgClass]" :src="selectedFile.url" alt="img" />
6
- <div :class="[ui.imageItem.onPreview.previewActionWrapper]">
7
- <Icon
8
- title="ดูตัวอย่าง"
9
- :name="ui.action.previewIcon"
10
- :class="[ui.imageItem.onPreview.actionBtnClass]"
11
- @click="() => (isPreviewOpen = true)"
12
- />
13
- <Icon
14
- title="ลบไฟล์"
15
- :name="ui.action.deleteIcon"
16
- :class="[ui.imageItem.onPreview.actionBtnClass]"
17
- @click="handleDeleteFile"
18
- />
19
- <Modal v-model="isPreviewOpen" size="xl">
20
- <div class="absolute -top-8 left-0 flex w-full justify-between text-gray-600">
21
- <p v-if="selectedFile?.name">{{ selectedFile?.name }}</p>
22
- <Icon
23
- name="i-heroicons-x-mark"
24
- class="size-6 cursor-pointer hover:text-gray-400"
25
- @click="() => (isPreviewOpen = false)"
26
- />
27
- </div>
28
- <img
29
- :src="selectedFile.url"
30
- alt="image-preview"
31
- class="mx-auto max-w-full rounded-lg"
32
- />
33
- </Modal>
34
- </div>
35
- </div>
36
-
37
- <div :class="[ui.imageItem.onPreview.previewTextWrapper]">
38
- <p :class="[ui.imageItem.onPreview.previewText]">{{ selectedFile.name }}</p>
39
- </div>
40
- </div>
41
- </div>
42
- </template>
43
-
44
- <script lang="ts" setup>
45
- import { type uploadFileDropzoneImage } from '#core/ui.config'
46
- import type { IUploadDropzoneImageAutoMultipleProps } from '#core/components/Form/InputUploadDropzoneImageAutoMultiple/types'
47
- import { ref } from '#imports'
48
- import type { IFileValue } from '#core/components/Form/types'
49
-
50
- const emits = defineEmits(['delete'])
51
-
52
- defineProps<
53
- {
54
- ui: typeof uploadFileDropzoneImage
55
- selectedFile: IFileValue
56
- } & IUploadDropzoneImageAutoMultipleProps
57
- >()
58
-
59
- const isPreviewOpen = ref<boolean>(false)
60
-
61
- const handleDeleteFile = () => {
62
- emits('delete')
63
- }
64
- </script>
1
+ <template>
2
+ <div :class="[ui.imageItem.wrapper]">
3
+ <div class="w-full">
4
+ <div :class="[ui.imageItem.onPreview.wrapper]">
5
+ <img :class="[ui.imageItem.onPreview.previewImgClass]" :src="selectedFile.url" alt="img" />
6
+ <div :class="[ui.imageItem.onPreview.previewActionWrapper]">
7
+ <Icon
8
+ title="ดูตัวอย่าง"
9
+ :name="ui.action.previewIcon"
10
+ :class="[ui.imageItem.onPreview.actionBtnClass]"
11
+ @click="() => (isPreviewOpen = true)"
12
+ />
13
+ <Icon
14
+ title="ลบไฟล์"
15
+ :name="ui.action.deleteIcon"
16
+ :class="[ui.imageItem.onPreview.actionBtnClass]"
17
+ @click="handleDeleteFile"
18
+ />
19
+ <Modal v-model="isPreviewOpen" size="xl">
20
+ <div class="absolute -top-8 left-0 flex w-full justify-between text-gray-600">
21
+ <p v-if="selectedFile?.name">{{ selectedFile?.name }}</p>
22
+ <Icon
23
+ name="i-heroicons-x-mark"
24
+ class="size-6 cursor-pointer hover:text-gray-400"
25
+ @click="() => (isPreviewOpen = false)"
26
+ />
27
+ </div>
28
+ <img
29
+ :src="selectedFile.url"
30
+ alt="image-preview"
31
+ class="mx-auto max-w-full rounded-lg"
32
+ />
33
+ </Modal>
34
+ </div>
35
+ </div>
36
+
37
+ <div :class="[ui.imageItem.onPreview.previewTextWrapper]">
38
+ <p :class="[ui.imageItem.onPreview.previewText]">{{ selectedFile.name }}</p>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </template>
43
+
44
+ <script lang="ts" setup>
45
+ import { type uploadFileDropzoneImage } from '#core/ui.config'
46
+ import type { IUploadDropzoneImageAutoMultipleProps } from '#core/components/Form/InputUploadDropzoneImageAutoMultiple/types'
47
+ import { ref } from '#imports'
48
+ import type { IFileValue } from '#core/components/Form/types'
49
+
50
+ const emits = defineEmits(['delete'])
51
+
52
+ defineProps<
53
+ {
54
+ ui: typeof uploadFileDropzoneImage
55
+ selectedFile: IFileValue
56
+ } & IUploadDropzoneImageAutoMultipleProps
57
+ >()
58
+
59
+ const isPreviewOpen = ref<boolean>(false)
60
+
61
+ const handleDeleteFile = () => {
62
+ emits('delete')
63
+ }
64
+ </script>
@@ -1,178 +1,178 @@
1
- <template>
2
- <FieldWrapper v-bind="wrapperProps">
3
- <div class="space-y-3">
4
- <div
5
- ref="dropzoneRef"
6
- :class="[
7
- ui.base,
8
- {
9
- [ui.disabled]: isDisabled,
10
- [ui.background.default]: !isOverDropZone && !isDisabled,
11
- [ui.background.dragover]: isOverDropZone && !isDisabled,
12
- },
13
- ]"
14
- >
15
- <input
16
- ref="fileInputRef"
17
- type="file"
18
- class="hidden"
19
- :name="name"
20
- :accept="acceptFile"
21
- :disabled="isDisabled"
22
- multiple
23
- @change="handleChange"
24
- />
25
- <div :class="[ui.wrapper]">
26
- <div v-if="value && value.length === 0" :class="[ui.placeholderWrapper]">
27
- <Icon :name="ui.default.uploadIcon" :class="[ui.labelIcon]" />
28
- <div :class="[ui.labelWrapper]">
29
- <p class="text-primary cursor-pointer" @click="handleOpenFile">
30
- {{ selectFileLabel }}
31
- </p>
32
- <p>{{ selectFileSubLabel }}</p>
33
- </div>
34
- <p v-if="placeholder" :class="[ui.placeholder]">{{ placeholder }}</p>
35
- </div>
36
-
37
- <div v-else :class="ui.imageItemWrapper">
38
- <ItemView
39
- v-for="(file, index) in value"
40
- :key="file.url"
41
- v-bind="$props"
42
- :ui="ui"
43
- :selected-file="file"
44
- @delete="handleDeleteFileView(index)"
45
- />
46
- <ItemUpload
47
- v-for="(file, index) in selectedFiles"
48
- :key="file.key"
49
- v-bind="$props"
50
- :ui="ui"
51
- :selected-file="file.file"
52
- @success="handleSuccess(index, $event)"
53
- @delete="handleDeleteFile(index)"
54
- @error="handleError(index, $event)"
55
- />
56
- <itemUpload v-bind="$props" is-adding-btn :ui="ui" @add="handleOpenFile" />
57
- </div>
58
- </div>
59
- </div>
60
- </div>
61
- </FieldWrapper>
62
- </template>
63
-
64
- <script lang="ts" setup>
65
- import { useDropZone } from '@vueuse/core'
66
- import { type IUploadDropzoneImageAutoMultipleProps } from './types'
67
- import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
68
- import { useFieldHOC } from '#core/composables/useForm'
69
- import { _get, computed, ref, toRef, StringHelper, useUI, useUiConfig, ArrayHelper } from '#imports'
70
- import { uploadFileDropzoneImage } from '#core/ui.config'
71
- import ItemUpload from './ItemUpload.vue'
72
- import ItemView from './ItemView.vue'
73
- import type { IFileValue } from '#core/components/Form/types'
74
-
75
- const config = useUiConfig<typeof uploadFileDropzoneImage>(
76
- uploadFileDropzoneImage,
77
- 'uploadFileDropzoneImage'
78
- )
79
-
80
- const props = withDefaults(defineProps<IUploadDropzoneImageAutoMultipleProps>(), {
81
- accept: 'image/*',
82
- bodyKey: 'file',
83
- responseURL: 'url',
84
- responsePath: 'path',
85
- selectFileLabel: 'คลิกเพื่อเลือกไฟล์',
86
- selectFileSubLabel: 'หรือ ลากและวางที่นี่',
87
- uploadAddLabel: 'อัพโหลด',
88
- })
89
-
90
- const emits = defineEmits(['change', 'success', 'delete'])
91
- const selectedFiles = ref<Array<{ file: File; key: string }>>([])
92
-
93
- const { wrapperProps, handleChange: onChange, value } = useFieldHOC<IFileValue[]>(props)
94
-
95
- const { ui } = useUI('uploadFileDropzoneImage', toRef(props, 'ui'), config)
96
-
97
- const fileInputRef = ref<HTMLInputElement | null>()
98
- const dropzoneRef = ref<HTMLDivElement>()
99
-
100
- const acceptFile = computed(() =>
101
- typeof props.accept === 'string' ? props.accept : props.accept?.join(',')
102
- )
103
-
104
- const onDrop = (files: File[] | null) => {
105
- if (props.isDisabled || files?.length === 0 || !files) return
106
-
107
- for (const file of files) {
108
- selectedFiles.value = [
109
- ...selectedFiles.value,
110
- {
111
- file,
112
- key: StringHelper.genString(),
113
- },
114
- ]
115
-
116
- emits('change', value.value)
117
- }
118
- }
119
-
120
- const { isOverDropZone } = useDropZone(dropzoneRef as unknown as HTMLElement, {
121
- onDrop,
122
- })
123
-
124
- const handleChange = (e: Event) => {
125
- if (props.isDisabled) return
126
-
127
- for (const file of (e.target as HTMLInputElement).files ?? []) {
128
- selectedFiles.value = [
129
- ...selectedFiles.value,
130
- {
131
- file,
132
- key: StringHelper.genString(),
133
- },
134
- ]
135
-
136
- emits('change', value.value)
137
- }
138
-
139
- fileInputRef.value?.value && (fileInputRef.value.value = '')
140
- }
141
-
142
- const handleOpenFile = () => {
143
- fileInputRef.value?.click()
144
- }
145
-
146
- const handleDeleteFile = (index: number) => {
147
- const updatedValue = [...selectedFiles.value]
148
-
149
- updatedValue.splice(index, 1)
150
- selectedFiles.value = updatedValue
151
- }
152
-
153
- const handleDeleteFileView = (index: number) => {
154
- const updatedValue = [...value.value]
155
-
156
- updatedValue.splice(index, 1)
157
- value.value = updatedValue
158
- emits('delete')
159
- }
160
-
161
- const handleError = (index: number, error: any) => {}
162
-
163
- const handleSuccess = (index: number, res: any) => {
164
- value.value = [
165
- {
166
- url: _get(res, props.responseURL),
167
- path: _get(res, props.responsePath),
168
- name: res.name,
169
- size: res.size,
170
- },
171
- ...ArrayHelper.toArray(value.value),
172
- ]
173
-
174
- selectedFiles.value.splice(index, 1)
175
- emits('change', value.value)
176
- emits('success', value.value)
177
- }
178
- </script>
1
+ <template>
2
+ <FieldWrapper v-bind="wrapperProps">
3
+ <div class="space-y-3">
4
+ <div
5
+ ref="dropzoneRef"
6
+ :class="[
7
+ ui.base,
8
+ {
9
+ [ui.disabled]: isDisabled,
10
+ [ui.background.default]: !isOverDropZone && !isDisabled,
11
+ [ui.background.dragover]: isOverDropZone && !isDisabled,
12
+ },
13
+ ]"
14
+ >
15
+ <input
16
+ ref="fileInputRef"
17
+ type="file"
18
+ class="hidden"
19
+ :name="name"
20
+ :accept="acceptFile"
21
+ :disabled="isDisabled"
22
+ multiple
23
+ @change="handleChange"
24
+ />
25
+ <div :class="[ui.wrapper]">
26
+ <div v-if="value && value.length === 0" :class="[ui.placeholderWrapper]">
27
+ <Icon :name="ui.default.uploadIcon" :class="[ui.labelIcon]" />
28
+ <div :class="[ui.labelWrapper]">
29
+ <p class="text-primary cursor-pointer" @click="handleOpenFile">
30
+ {{ selectFileLabel }}
31
+ </p>
32
+ <p>{{ selectFileSubLabel }}</p>
33
+ </div>
34
+ <p v-if="placeholder" :class="[ui.placeholder]">{{ placeholder }}</p>
35
+ </div>
36
+
37
+ <div v-else :class="ui.imageItemWrapper">
38
+ <ItemView
39
+ v-for="(file, index) in value"
40
+ :key="file.url"
41
+ v-bind="$props"
42
+ :ui="ui"
43
+ :selected-file="file"
44
+ @delete="handleDeleteFileView(index)"
45
+ />
46
+ <ItemUpload
47
+ v-for="(file, index) in selectedFiles"
48
+ :key="file.key"
49
+ v-bind="$props"
50
+ :ui="ui"
51
+ :selected-file="file.file"
52
+ @success="handleSuccess(index, $event)"
53
+ @delete="handleDeleteFile(index)"
54
+ @error="handleError(index, $event)"
55
+ />
56
+ <itemUpload v-bind="$props" is-adding-btn :ui="ui" @add="handleOpenFile" />
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </FieldWrapper>
62
+ </template>
63
+
64
+ <script lang="ts" setup>
65
+ import { useDropZone } from '@vueuse/core'
66
+ import { type IUploadDropzoneImageAutoMultipleProps } from './types'
67
+ import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
68
+ import { useFieldHOC } from '#core/composables/useForm'
69
+ import { _get, computed, ref, toRef, StringHelper, useUI, useUiConfig, ArrayHelper } from '#imports'
70
+ import { uploadFileDropzoneImage } from '#core/ui.config'
71
+ import ItemUpload from './ItemUpload.vue'
72
+ import ItemView from './ItemView.vue'
73
+ import type { IFileValue } from '#core/components/Form/types'
74
+
75
+ const config = useUiConfig<typeof uploadFileDropzoneImage>(
76
+ uploadFileDropzoneImage,
77
+ 'uploadFileDropzoneImage'
78
+ )
79
+
80
+ const props = withDefaults(defineProps<IUploadDropzoneImageAutoMultipleProps>(), {
81
+ accept: 'image/*',
82
+ bodyKey: 'file',
83
+ responseURL: 'url',
84
+ responsePath: 'path',
85
+ selectFileLabel: 'คลิกเพื่อเลือกไฟล์',
86
+ selectFileSubLabel: 'หรือ ลากและวางที่นี่',
87
+ uploadAddLabel: 'อัพโหลด',
88
+ })
89
+
90
+ const emits = defineEmits(['change', 'success', 'delete'])
91
+ const selectedFiles = ref<Array<{ file: File; key: string }>>([])
92
+
93
+ const { wrapperProps, handleChange: onChange, value } = useFieldHOC<IFileValue[]>(props)
94
+
95
+ const { ui } = useUI('uploadFileDropzoneImage', toRef(props, 'ui'), config)
96
+
97
+ const fileInputRef = ref<HTMLInputElement | null>()
98
+ const dropzoneRef = ref<HTMLDivElement>()
99
+
100
+ const acceptFile = computed(() =>
101
+ typeof props.accept === 'string' ? props.accept : props.accept?.join(',')
102
+ )
103
+
104
+ const onDrop = (files: File[] | null) => {
105
+ if (props.isDisabled || files?.length === 0 || !files) return
106
+
107
+ for (const file of files) {
108
+ selectedFiles.value = [
109
+ ...selectedFiles.value,
110
+ {
111
+ file,
112
+ key: StringHelper.genString(),
113
+ },
114
+ ]
115
+
116
+ emits('change', value.value)
117
+ }
118
+ }
119
+
120
+ const { isOverDropZone } = useDropZone(dropzoneRef as unknown as HTMLElement, {
121
+ onDrop,
122
+ })
123
+
124
+ const handleChange = (e: Event) => {
125
+ if (props.isDisabled) return
126
+
127
+ for (const file of (e.target as HTMLInputElement).files ?? []) {
128
+ selectedFiles.value = [
129
+ ...selectedFiles.value,
130
+ {
131
+ file,
132
+ key: StringHelper.genString(),
133
+ },
134
+ ]
135
+
136
+ emits('change', value.value)
137
+ }
138
+
139
+ fileInputRef.value?.value && (fileInputRef.value.value = '')
140
+ }
141
+
142
+ const handleOpenFile = () => {
143
+ fileInputRef.value?.click()
144
+ }
145
+
146
+ const handleDeleteFile = (index: number) => {
147
+ const updatedValue = [...selectedFiles.value]
148
+
149
+ updatedValue.splice(index, 1)
150
+ selectedFiles.value = updatedValue
151
+ }
152
+
153
+ const handleDeleteFileView = (index: number) => {
154
+ const updatedValue = [...value.value]
155
+
156
+ updatedValue.splice(index, 1)
157
+ value.value = updatedValue
158
+ emits('delete')
159
+ }
160
+
161
+ const handleError = (index: number, error: any) => {}
162
+
163
+ const handleSuccess = (index: number, res: any) => {
164
+ value.value = [
165
+ {
166
+ url: _get(res, props.responseURL),
167
+ path: _get(res, props.responsePath),
168
+ name: res.name,
169
+ size: res.size,
170
+ },
171
+ ...ArrayHelper.toArray(value.value),
172
+ ]
173
+
174
+ selectedFiles.value.splice(index, 1)
175
+ emits('change', value.value)
176
+ emits('success', value.value)
177
+ }
178
+ </script>