@finema/core 1.4.205 → 1.4.207

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 (64) 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 +152 -152
  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 +54 -45
  24. package/dist/runtime/components/Form/InputSelect/types.d.ts +1 -0
  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 +141 -141
  28. package/dist/runtime/components/Form/InputText/index.vue +68 -68
  29. package/dist/runtime/components/Form/InputTextarea/index.vue +25 -25
  30. package/dist/runtime/components/Form/InputToggle/index.vue +27 -27
  31. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +206 -206
  32. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +342 -342
  33. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/ItemUpload.vue +241 -241
  34. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/ItemView.vue +89 -89
  35. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +170 -170
  36. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/ItemUpload.vue +161 -161
  37. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/ItemView.vue +64 -64
  38. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/index.vue +178 -178
  39. package/dist/runtime/components/Form/InputUploadFileClassic/index.vue +95 -95
  40. package/dist/runtime/components/Form/InputUploadFileClassicAuto/index.vue +151 -151
  41. package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +219 -219
  42. package/dist/runtime/components/Form/InputWYSIWYG/UploadImageForm.vue +55 -55
  43. package/dist/runtime/components/Form/InputWYSIWYG/index.vue +228 -228
  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 +153 -153
  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 +103 -102
  63. package/dist/runtime/components/Form/InputDateTime/index.vue~ +0 -61
  64. package/dist/runtime/ui.config/table.ts~ +0 -48
@@ -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>