@finema/core 1.4.152 → 1.4.154

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 (168) hide show
  1. package/README.md +60 -60
  2. package/dist/module.json +1 -5
  3. package/dist/module.mjs +10 -2
  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 +37 -37
  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 +143 -143
  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 +60 -60
  20. package/dist/runtime/components/Form/InputDateTimeRange/date_range_time_field.types.d.ts +1 -1
  21. package/dist/runtime/components/Form/InputDateTimeRange/index.vue +83 -83
  22. package/dist/runtime/components/Form/InputNumber/index.vue +27 -27
  23. package/dist/runtime/components/Form/InputRadio/index.vue +27 -27
  24. package/dist/runtime/components/Form/InputSelect/index.vue +45 -45
  25. package/dist/runtime/components/Form/InputSelectMultiple/index.vue +54 -54
  26. package/dist/runtime/components/Form/InputStatic/index.vue +16 -16
  27. package/dist/runtime/components/Form/InputTags/index.vue +145 -145
  28. package/dist/runtime/components/Form/InputText/index.vue +67 -67
  29. package/dist/runtime/components/Form/InputTextarea/index.vue +25 -25
  30. package/dist/runtime/components/Form/InputToggle/index.vue +14 -14
  31. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +206 -206
  32. package/dist/runtime/components/Form/InputUploadDropzone/types.d.ts +1 -1
  33. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +342 -342
  34. package/dist/runtime/components/Form/InputUploadDropzoneAuto/types.d.ts +1 -1
  35. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/ItemUpload.vue +241 -241
  36. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/ItemView.vue +89 -89
  37. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +164 -164
  38. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/types.d.ts +1 -1
  39. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/ItemUpload.vue +161 -161
  40. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/ItemView.vue +64 -64
  41. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/index.vue +172 -172
  42. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/types.d.ts +1 -1
  43. package/dist/runtime/components/Form/InputUploadFileClassic/index.vue +95 -95
  44. package/dist/runtime/components/Form/InputUploadFileClassicAuto/index.vue +151 -151
  45. package/dist/runtime/components/Form/InputUploadFileClassicAuto/types.d.ts +1 -1
  46. package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +219 -219
  47. package/dist/runtime/components/Form/InputUploadImageAuto/types.d.ts +1 -1
  48. package/dist/runtime/components/Form/InputWYSIWYG/index.vue +53 -53
  49. package/dist/runtime/components/Form/index.vue +6 -6
  50. package/dist/runtime/components/Icon.vue +23 -23
  51. package/dist/runtime/components/Image.vue +36 -36
  52. package/dist/runtime/components/Loader.vue +27 -27
  53. package/dist/runtime/components/Modal/index.vue +146 -146
  54. package/dist/runtime/components/QRCode.vue +22 -22
  55. package/dist/runtime/components/SimplePagination.vue +96 -96
  56. package/dist/runtime/components/Slideover/index.vue +110 -110
  57. package/dist/runtime/components/Table/Base.vue +139 -139
  58. package/dist/runtime/components/Table/ColumnDate.vue +16 -16
  59. package/dist/runtime/components/Table/ColumnDateTime.vue +18 -18
  60. package/dist/runtime/components/Table/ColumnImage.vue +15 -15
  61. package/dist/runtime/components/Table/ColumnNumber.vue +14 -14
  62. package/dist/runtime/components/Table/ColumnText.vue +25 -25
  63. package/dist/runtime/components/Table/Simple.vue +69 -69
  64. package/dist/runtime/components/Table/index.vue +65 -65
  65. package/dist/runtime/components/Tabs/index.vue +64 -64
  66. package/dist/runtime/components/TeleportSafe.vue +40 -40
  67. package/dist/runtime/composables/loaderList.d.ts +2 -2
  68. package/dist/runtime/composables/{loaderList.js → loaderList.mjs} +2 -2
  69. package/dist/runtime/composables/loaderObject.d.ts +1 -1
  70. package/dist/runtime/composables/{loaderObject.js → loaderObject.mjs} +2 -2
  71. package/dist/runtime/composables/loaderPage.d.ts +1 -1
  72. package/dist/runtime/composables/{loaderPage.js → loaderPage.mjs} +3 -3
  73. package/dist/runtime/composables/useConfig.d.ts +1 -1
  74. package/dist/runtime/composables/useForm.d.ts +1 -1
  75. package/dist/runtime/composables/useTable.d.ts +2 -2
  76. package/dist/runtime/composables/{useTable.js → useTable.mjs} +1 -1
  77. package/dist/runtime/composables/{useUpload.js → useUpload.mjs} +1 -1
  78. package/dist/runtime/helpers/{apiListHelper.js → apiListHelper.mjs} +1 -1
  79. package/dist/runtime/helpers/{apiObjectHelper.js → apiObjectHelper.mjs} +1 -1
  80. package/dist/runtime/helpers/apiPageHelper.d.ts +1 -1
  81. package/dist/runtime/helpers/{apiPageHelper.js → apiPageHelper.mjs} +4 -4
  82. package/dist/runtime/ui.config/index.d.ts +16 -16
  83. package/dist/runtime/ui.config/index.mjs +16 -0
  84. package/dist/runtime/ui.config/{uploadDropzoneImage.js → uploadDropzoneImage.mjs} +1 -1
  85. package/dist/runtime/utils/ArrayHelper.d.ts +1 -1
  86. package/dist/runtime/utils/{ArrayHelper.spec.js → ArrayHelper.spec.mjs} +1 -1
  87. package/dist/runtime/utils/{FileHelper.spec.js → FileHelper.spec.mjs} +1 -1
  88. package/dist/runtime/utils/ObjectHelper.d.ts +2 -2
  89. package/dist/runtime/utils/{ObjectHelper.js → ObjectHelper.mjs} +2 -2
  90. package/dist/runtime/utils/{ObjectHelper.spec.js → ObjectHelper.spec.mjs} +1 -1
  91. package/dist/runtime/utils/ParamHelper.d.ts +1 -1
  92. package/dist/runtime/utils/{ParamHelper.spec.js → ParamHelper.spec.mjs} +1 -1
  93. package/dist/runtime/utils/{StringHelper.spec.js → StringHelper.spec.mjs} +1 -1
  94. package/dist/runtime/utils/{TimeHelper.spec.js → TimeHelper.spec.mjs} +1 -1
  95. package/dist/runtime/utils/{TimeHelper.thai.spec.js → TimeHelper.thai.spec.mjs} +1 -1
  96. package/dist/types.d.mts +16 -1
  97. package/dist/types.d.ts +16 -1
  98. package/package.json +92 -93
  99. package/dist/runtime/ui.config/index.js +0 -16
  100. /package/dist/runtime/components/Dropdown/{types.js → types.mjs} +0 -0
  101. /package/dist/runtime/components/FlexDeck/{types.js → types.mjs} +0 -0
  102. /package/dist/runtime/components/Form/InputCheckbox/{types.js → types.mjs} +0 -0
  103. /package/dist/runtime/components/Form/InputDateTime/{date_time_field.types.js → date_time_field.types.mjs} +0 -0
  104. /package/dist/runtime/components/Form/InputDateTimeRange/{date_range_time_field.types.js → date_range_time_field.types.mjs} +0 -0
  105. /package/dist/runtime/components/Form/InputNumber/{types.js → types.mjs} +0 -0
  106. /package/dist/runtime/components/Form/InputRadio/{types.js → types.mjs} +0 -0
  107. /package/dist/runtime/components/Form/InputSelect/{types.js → types.mjs} +0 -0
  108. /package/dist/runtime/components/Form/InputSelectMultiple/{types.js → types.mjs} +0 -0
  109. /package/dist/runtime/components/Form/InputStatic/{types.js → types.mjs} +0 -0
  110. /package/dist/runtime/components/Form/InputTags/{types.js → types.mjs} +0 -0
  111. /package/dist/runtime/components/Form/InputText/{types.js → types.mjs} +0 -0
  112. /package/dist/runtime/components/Form/InputTextarea/{types.js → types.mjs} +0 -0
  113. /package/dist/runtime/components/Form/InputToggle/{types.js → types.mjs} +0 -0
  114. /package/dist/runtime/components/Form/InputUploadDropzone/{types.js → types.mjs} +0 -0
  115. /package/dist/runtime/components/Form/InputUploadDropzoneAuto/{types.js → types.mjs} +0 -0
  116. /package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/{types.js → types.mjs} +0 -0
  117. /package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/{types.js → types.mjs} +0 -0
  118. /package/dist/runtime/components/Form/InputUploadFileClassic/{types.js → types.mjs} +0 -0
  119. /package/dist/runtime/components/Form/InputUploadFileClassicAuto/{types.js → types.mjs} +0 -0
  120. /package/dist/runtime/components/Form/InputUploadImageAuto/{types.js → types.mjs} +0 -0
  121. /package/dist/runtime/components/Form/InputWYSIWYG/{types.js → types.mjs} +0 -0
  122. /package/dist/runtime/components/Form/{types.js → types.mjs} +0 -0
  123. /package/dist/runtime/components/Table/{types.js → types.mjs} +0 -0
  124. /package/dist/runtime/composables/{useApp.js → useApp.mjs} +0 -0
  125. /package/dist/runtime/composables/{useConfig.js → useConfig.mjs} +0 -0
  126. /package/dist/runtime/composables/{useDialog.js → useDialog.mjs} +0 -0
  127. /package/dist/runtime/composables/{useFlexDeck.js → useFlexDeck.mjs} +0 -0
  128. /package/dist/runtime/composables/{useForm.js → useForm.mjs} +0 -0
  129. /package/dist/runtime/composables/{useNotification.js → useNotification.mjs} +0 -0
  130. /package/dist/runtime/composables/{useWatch.js → useWatch.mjs} +0 -0
  131. /package/dist/runtime/{core.config.js → core.config.mjs} +0 -0
  132. /package/dist/runtime/helpers/{componentHelper.js → componentHelper.mjs} +0 -0
  133. /package/dist/runtime/lib/{Requester.js → Requester.mjs} +0 -0
  134. /package/dist/runtime/{plugin.js → plugin.mjs} +0 -0
  135. /package/dist/runtime/{quill.plugin.js → quill.plugin.mjs} +0 -0
  136. /package/dist/runtime/types/{common.js → common.mjs} +0 -0
  137. /package/dist/runtime/types/{config.js → config.mjs} +0 -0
  138. /package/dist/runtime/types/{lib.js → lib.mjs} +0 -0
  139. /package/dist/runtime/ui.config/{alert.js → alert.mjs} +0 -0
  140. /package/dist/runtime/ui.config/{badge.js → badge.mjs} +0 -0
  141. /package/dist/runtime/ui.config/{breadcrumb.js → breadcrumb.mjs} +0 -0
  142. /package/dist/runtime/ui.config/{button.js → button.mjs} +0 -0
  143. /package/dist/runtime/ui.config/{buttonGroup.js → buttonGroup.mjs} +0 -0
  144. /package/dist/runtime/ui.config/{card.js → card.mjs} +0 -0
  145. /package/dist/runtime/ui.config/{checkbox.js → checkbox.mjs} +0 -0
  146. /package/dist/runtime/ui.config/{formGroup.js → formGroup.mjs} +0 -0
  147. /package/dist/runtime/ui.config/{icon.js → icon.mjs} +0 -0
  148. /package/dist/runtime/ui.config/{input.js → input.mjs} +0 -0
  149. /package/dist/runtime/ui.config/{modal.js → modal.mjs} +0 -0
  150. /package/dist/runtime/ui.config/{notification.js → notification.mjs} +0 -0
  151. /package/dist/runtime/ui.config/{pagination.js → pagination.mjs} +0 -0
  152. /package/dist/runtime/ui.config/{select.js → select.mjs} +0 -0
  153. /package/dist/runtime/ui.config/{selectMenu.js → selectMenu.mjs} +0 -0
  154. /package/dist/runtime/ui.config/{slideover.js → slideover.mjs} +0 -0
  155. /package/dist/runtime/ui.config/{table.js → table.mjs} +0 -0
  156. /package/dist/runtime/ui.config/{tabs.js → tabs.mjs} +0 -0
  157. /package/dist/runtime/ui.config/{tags.js → tags.mjs} +0 -0
  158. /package/dist/runtime/ui.config/{textarea.js → textarea.mjs} +0 -0
  159. /package/dist/runtime/ui.config/{toggle.js → toggle.mjs} +0 -0
  160. /package/dist/runtime/ui.config/{uploadFileDropzone.js → uploadFileDropzone.mjs} +0 -0
  161. /package/dist/runtime/ui.config/{uploadFileInputClassicAuto.js → uploadFileInputClassicAuto.mjs} +0 -0
  162. /package/dist/runtime/ui.config/{uploadImage.js → uploadImage.mjs} +0 -0
  163. /package/dist/runtime/utils/{ArrayHelper.js → ArrayHelper.mjs} +0 -0
  164. /package/dist/runtime/utils/{FileHelper.js → FileHelper.mjs} +0 -0
  165. /package/dist/runtime/utils/{ParamHelper.js → ParamHelper.mjs} +0 -0
  166. /package/dist/runtime/utils/{StringHelper.js → StringHelper.mjs} +0 -0
  167. /package/dist/runtime/utils/{TimeHelper.js → TimeHelper.mjs} +0 -0
  168. /package/dist/runtime/utils/{lodash.js → lodash.mjs} +0 -0
@@ -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,172 +1,172 @@
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
- selectedFiles.value.splice(index, 1)
148
- }
149
-
150
- const handleDeleteFileView = (index: number) => {
151
- value.value.splice(index, 1)
152
- emits('delete')
153
- }
154
-
155
- const handleError = (index: number, error: any) => {}
156
-
157
- const handleSuccess = (index: number, res: any) => {
158
- value.value = [
159
- {
160
- url: _get(res, props.responseURL),
161
- path: _get(res, props.responsePath),
162
- name: res.name,
163
- size: res.size,
164
- },
165
- ...ArrayHelper.toArray(value.value),
166
- ]
167
-
168
- selectedFiles.value.splice(index, 1)
169
- emits('change', value.value)
170
- emits('success', value.value)
171
- }
172
- </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
+ selectedFiles.value.splice(index, 1)
148
+ }
149
+
150
+ const handleDeleteFileView = (index: number) => {
151
+ value.value.splice(index, 1)
152
+ emits('delete')
153
+ }
154
+
155
+ const handleError = (index: number, error: any) => {}
156
+
157
+ const handleSuccess = (index: number, res: any) => {
158
+ value.value = [
159
+ {
160
+ url: _get(res, props.responseURL),
161
+ path: _get(res, props.responsePath),
162
+ name: res.name,
163
+ size: res.size,
164
+ },
165
+ ...ArrayHelper.toArray(value.value),
166
+ ]
167
+
168
+ selectedFiles.value.splice(index, 1)
169
+ emits('change', value.value)
170
+ emits('success', value.value)
171
+ }
172
+ </script>
@@ -1,5 +1,5 @@
1
1
  import { type AxiosRequestConfig } from 'axios';
2
- import { type IFieldProps, type IFileValue, type IFormFieldBase, type INPUT_TYPES } from '../types.js';
2
+ import { type IFieldProps, type IFileValue, type IFormFieldBase, type INPUT_TYPES } from '../types';
3
3
  export interface IUploadDropzoneImageAutoMultipleProps extends IFieldProps {
4
4
  requestOptions: Omit<AxiosRequestConfig, 'baseURL'> & {
5
5
  baseURL: string;