@finema/core 1.4.115 → 1.4.116

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 (69) 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 +13 -13
  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 +90 -90
  15. package/dist/runtime/components/FlexDeck/index.vue +66 -66
  16. package/dist/runtime/components/Form/FieldWrapper.vue +23 -23
  17. package/dist/runtime/components/Form/Fields.vue +222 -222
  18. package/dist/runtime/components/Form/InputCheckbox/index.vue +21 -21
  19. package/dist/runtime/components/Form/InputDateTime/index.vue +60 -60
  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 +36 -36
  24. package/dist/runtime/components/Form/InputStatic/index.vue +16 -16
  25. package/dist/runtime/components/Form/InputTags/index.vue +145 -134
  26. package/dist/runtime/components/Form/InputText/index.vue +67 -67
  27. package/dist/runtime/components/Form/InputTextarea/index.vue +25 -25
  28. package/dist/runtime/components/Form/InputToggle/index.vue +14 -14
  29. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +206 -206
  30. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +341 -333
  31. package/dist/runtime/components/Form/InputUploadDropzoneAuto/types.d.ts +2 -1
  32. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/{Item.vue → ItemUpload.vue} +241 -260
  33. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/ItemView.vue +89 -0
  34. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +164 -140
  35. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/types.d.ts +4 -3
  36. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/{item.vue → ItemUpload.vue} +161 -179
  37. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/ItemView.vue +64 -0
  38. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/index.vue +172 -148
  39. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/types.d.ts +4 -3
  40. package/dist/runtime/components/Form/InputUploadFileClassic/index.vue +95 -95
  41. package/dist/runtime/components/Form/InputUploadFileClassicAuto/index.vue +151 -143
  42. package/dist/runtime/components/Form/InputUploadFileClassicAuto/types.d.ts +2 -1
  43. package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +219 -222
  44. package/dist/runtime/components/Form/InputUploadImageAuto/types.d.ts +2 -1
  45. package/dist/runtime/components/Form/InputWYSIWYG/index.vue +53 -53
  46. package/dist/runtime/components/Form/index.vue +6 -6
  47. package/dist/runtime/components/Form/types.d.ts +6 -0
  48. package/dist/runtime/components/Icon.vue +23 -23
  49. package/dist/runtime/components/Image.vue +36 -36
  50. package/dist/runtime/components/Loader.vue +27 -27
  51. package/dist/runtime/components/Modal/index.vue +146 -146
  52. package/dist/runtime/components/QRCode.vue +22 -22
  53. package/dist/runtime/components/SimplePagination.vue +96 -96
  54. package/dist/runtime/components/Slideover/index.vue +110 -110
  55. package/dist/runtime/components/Table/Base.vue +139 -139
  56. package/dist/runtime/components/Table/ColumnDate.vue +16 -16
  57. package/dist/runtime/components/Table/ColumnDateTime.vue +18 -18
  58. package/dist/runtime/components/Table/ColumnImage.vue +15 -15
  59. package/dist/runtime/components/Table/ColumnNumber.vue +14 -14
  60. package/dist/runtime/components/Table/ColumnText.vue +25 -25
  61. package/dist/runtime/components/Table/Simple.vue +69 -69
  62. package/dist/runtime/components/Table/index.vue +65 -65
  63. package/dist/runtime/components/Tabs/index.vue +64 -64
  64. package/dist/runtime/helpers/apiListHelper.d.ts +0 -1
  65. package/dist/runtime/helpers/apiObjectHelper.d.ts +0 -1
  66. package/dist/runtime/helpers/apiPageHelper.d.ts +0 -1
  67. package/dist/runtime/helpers/componentHelper.d.ts +6 -0
  68. package/dist/runtime/helpers/componentHelper.mjs +15 -0
  69. package/package.json +92 -92
@@ -1,140 +1,164 @@
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 :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
- </div>
37
- </div>
38
- <Item
39
- v-for="(file, index) in selectedFiles"
40
- :key="file.key"
41
- v-bind="$props"
42
- :ui="ui"
43
- :selected-file="file.file"
44
- @success="handleSuccess(index, $event)"
45
- @delete="handleDeleteFile(index)"
46
- @error="handleError(index, $event)"
47
- />
48
- </div>
49
- </FieldWrapper>
50
- </template>
51
-
52
- <script lang="ts" setup>
53
- import { useDropZone } from '@vueuse/core'
54
- import { type IUploadDropzoneAutoMultipleProps } from './types'
55
- import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
56
- import { useFieldHOC } from '#core/composables/useForm'
57
- import { _get, computed, ref, toRef, useUI, useUiConfig, StringHelper } from '#imports'
58
- import { uploadFileDropzone } from '#core/ui.config'
59
- import Item from './Item.vue'
60
-
61
- const config = useUiConfig<typeof uploadFileDropzone>(uploadFileDropzone, 'uploadFileDropzone')
62
- const props = withDefaults(defineProps<IUploadDropzoneAutoMultipleProps>(), {
63
- bodyKey: 'file',
64
- responseKey: 'url',
65
- selectFileLabel: 'คลิกเพื่อเลือกไฟล์',
66
- selectFileSubLabel: 'หรือ ลากและวางที่นี่',
67
- retryLabel: 'ลองอีกครั้ง',
68
- uploadingLabel: 'กำลังอัพโหลด...',
69
- uploadFailedLabel: 'อัพโหลดล้มเหลว, กรุณาลองอีกครั้ง',
70
- })
71
-
72
- const emits = defineEmits(['change', 'success', 'delete'])
73
- const selectedFiles = ref<Array<{ file: File; key: string }>>([])
74
- const { wrapperProps, handleChange: onChange, setErrors, value } = useFieldHOC<File[]>(props)
75
-
76
- const { ui } = useUI('uploadFileDropzone', toRef(props, 'ui'), config)
77
-
78
- const fileInputRef = ref<HTMLInputElement | null>()
79
- const dropzoneRef = ref<HTMLDivElement>()
80
-
81
- const acceptFile = computed(() =>
82
- typeof props.accept === 'string' ? props.accept : props.accept?.join(',')
83
- )
84
-
85
- const onDrop = (files: File[] | null) => {
86
- if (props.isDisabled || files?.length === 0 || !files) return
87
-
88
- for (const file of files) {
89
- selectedFiles.value = [
90
- {
91
- file,
92
- key: StringHelper.genString(),
93
- },
94
- ...selectedFiles.value,
95
- ]
96
-
97
- emits('change', value.value)
98
- }
99
- }
100
-
101
- const { isOverDropZone } = useDropZone(dropzoneRef as unknown as HTMLElement, {
102
- onDrop,
103
- })
104
-
105
- const handleChange = (e: Event) => {
106
- if (props.isDisabled) return
107
-
108
- for (const file of (e.target as HTMLInputElement).files ?? []) {
109
- selectedFiles.value = [
110
- {
111
- file,
112
- key: StringHelper.genString(),
113
- },
114
- ...selectedFiles.value,
115
- ]
116
-
117
- emits('change', value.value)
118
- }
119
-
120
- fileInputRef.value?.value && (fileInputRef.value.value = '')
121
- }
122
-
123
- const handleOpenFile = () => {
124
- fileInputRef.value?.click()
125
- }
126
-
127
- const handleDeleteFile = (index: number) => {
128
- selectedFiles.value.splice(index, 1)
129
- onChange(undefined)
130
- emits('delete')
131
- }
132
-
133
- const handleError = (index: number, error: any) => {}
134
-
135
- const handleSuccess = (index: number, any: any) => {
136
- value.value = [_get(any, props.responseKey), ...(value.value || [])]
137
- emits('change', value.value)
138
- emits('success', value.value)
139
- }
140
- </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 :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
+ </div>
37
+ </div>
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
+ </div>
57
+ </FieldWrapper>
58
+ </template>
59
+
60
+ <script lang="ts" setup>
61
+ import { useDropZone } from '@vueuse/core'
62
+ import { type IUploadDropzoneAutoMultipleProps } from './types'
63
+ import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
64
+ import { useFieldHOC } from '#core/composables/useForm'
65
+ import { _get, computed, ref, toRef, useUI, useUiConfig, StringHelper, ArrayHelper } from '#imports'
66
+ import { uploadFileDropzone } from '#core/ui.config'
67
+ import ItemView from './ItemView.vue'
68
+ import ItemUpload from './ItemUpload.vue'
69
+ import type { IFileValue } from '#core/components/Form/types'
70
+
71
+ const config = useUiConfig<typeof uploadFileDropzone>(uploadFileDropzone, 'uploadFileDropzone')
72
+ const props = withDefaults(defineProps<IUploadDropzoneAutoMultipleProps>(), {
73
+ bodyKey: 'file',
74
+ responseURL: 'url',
75
+ responsePath: 'path',
76
+ selectFileLabel: 'คลิกเพื่อเลือกไฟล์',
77
+ selectFileSubLabel: 'หรือ ลากและวางที่นี่',
78
+ retryLabel: 'ลองอีกครั้ง',
79
+ uploadingLabel: 'กำลังอัพโหลด...',
80
+ uploadFailedLabel: 'อัพโหลดล้มเหลว, กรุณาลองอีกครั้ง',
81
+ })
82
+
83
+ const emits = defineEmits(['change', 'success', 'delete'])
84
+ const selectedFiles = ref<Array<{ file: File; key: string }>>([])
85
+ const { wrapperProps, handleChange: onChange, setErrors, value } = useFieldHOC<IFileValue[]>(props)
86
+
87
+ const { ui } = useUI('uploadFileDropzone', toRef(props, 'ui'), config)
88
+
89
+ const fileInputRef = ref<HTMLInputElement | null>()
90
+ const dropzoneRef = ref<HTMLDivElement>()
91
+
92
+ const acceptFile = computed(() =>
93
+ typeof props.accept === 'string' ? props.accept : props.accept?.join(',')
94
+ )
95
+
96
+ const onDrop = (files: File[] | null) => {
97
+ if (props.isDisabled || files?.length === 0 || !files) return
98
+
99
+ for (const file of files) {
100
+ selectedFiles.value = [
101
+ {
102
+ file,
103
+ key: StringHelper.genString(),
104
+ },
105
+ ...selectedFiles.value,
106
+ ]
107
+
108
+ emits('change', value.value)
109
+ }
110
+ }
111
+
112
+ const { isOverDropZone } = useDropZone(dropzoneRef as unknown as HTMLElement, {
113
+ onDrop,
114
+ })
115
+
116
+ const handleChange = (e: Event) => {
117
+ if (props.isDisabled) return
118
+
119
+ for (const file of (e.target as HTMLInputElement).files ?? []) {
120
+ selectedFiles.value = [
121
+ {
122
+ file,
123
+ key: StringHelper.genString(),
124
+ },
125
+ ...selectedFiles.value,
126
+ ]
127
+
128
+ emits('change', value.value)
129
+ }
130
+
131
+ fileInputRef.value?.value && (fileInputRef.value.value = '')
132
+ }
133
+
134
+ const handleOpenFile = () => {
135
+ fileInputRef.value?.click()
136
+ }
137
+
138
+ const handleDeleteFile = (index: number) => {
139
+ selectedFiles.value.splice(index, 1)
140
+ }
141
+
142
+ const handleDeleteFileView = (index: number) => {
143
+ value.value.splice(index, 1)
144
+ emits('delete')
145
+ }
146
+
147
+ const handleError = (index: number, error: any) => {}
148
+
149
+ const handleSuccess = (index: number, res: any) => {
150
+ value.value = [
151
+ {
152
+ url: _get(res, props.responseURL),
153
+ path: _get(res, props.responseURL),
154
+ name: res.name,
155
+ size: res.size,
156
+ },
157
+ ...ArrayHelper.toArray(value.value),
158
+ ]
159
+
160
+ selectedFiles.value.splice(index, 1)
161
+ emits('change', value.value)
162
+ emits('success', value.value)
163
+ }
164
+ </script>
@@ -1,5 +1,5 @@
1
1
  import { type AxiosRequestConfig } from 'axios';
2
- import { type IFieldProps, type IFormFieldBase, type INPUT_TYPES } from '../types';
2
+ import { type IFieldProps, type IFileValue, type IFormFieldBase, type INPUT_TYPES } from '../types';
3
3
  export interface IUploadDropzoneAutoMultipleProps extends IFieldProps {
4
4
  requestOptions: Omit<AxiosRequestConfig, 'baseURL'> & {
5
5
  baseURL: string;
@@ -12,11 +12,12 @@ export interface IUploadDropzoneAutoMultipleProps extends IFieldProps {
12
12
  retryLabel?: string;
13
13
  accept?: string[] | string;
14
14
  bodyKey?: string;
15
- responseKey?: string;
15
+ responseURL?: string;
16
+ responsePath?: string;
16
17
  maxSize?: number;
17
18
  }
18
19
  export type IUploadDropzoneAutoMultipleField = IFormFieldBase<INPUT_TYPES.UPLOAD_DROPZONE_AUTO_MULTIPLE, IUploadDropzoneAutoMultipleProps, {
19
- change: (value: File[] | undefined) => void;
20
+ change: (value: IFileValue[] | undefined) => void;
20
21
  success: (res: any) => void;
21
22
  delete: () => void;
22
23
  }>;