@finema/core 3.2.0 → 3.2.1

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 (33) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +1 -1
  3. package/dist/runtime/components/Form/FieldWrapper.vue +13 -13
  4. package/dist/runtime/components/Form/Fields.vue +13 -13
  5. package/dist/runtime/components/Form/InputCheckbox/index.vue +18 -18
  6. package/dist/runtime/components/Form/InputCurrency/index.vue +49 -49
  7. package/dist/runtime/components/Form/InputNumber/index.vue +20 -20
  8. package/dist/runtime/components/Form/InputSelect/index.vue +38 -38
  9. package/dist/runtime/components/Form/InputSelectMultiple/index.vue +43 -43
  10. package/dist/runtime/components/Form/InputTags/index.vue +23 -23
  11. package/dist/runtime/components/Form/InputTextarea/index.vue +18 -18
  12. package/dist/runtime/components/Form/InputTime/index.vue +38 -38
  13. package/dist/runtime/components/Form/InputToggle/index.vue +17 -17
  14. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +30 -30
  15. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +50 -50
  16. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +31 -31
  17. package/dist/runtime/components/Form/fileState/EmptyState.vue +21 -21
  18. package/dist/runtime/components/Form/fileState/FailedState.vue +33 -33
  19. package/dist/runtime/components/Form/fileState/LoadingState.vue +24 -24
  20. package/dist/runtime/components/Form/fileState/MultipleFilesState.vue +145 -145
  21. package/dist/runtime/components/Form/fileState/PreviewModal.vue +23 -23
  22. package/dist/runtime/components/Form/index.vue +5 -5
  23. package/dist/runtime/components/Image.vue +28 -28
  24. package/dist/runtime/components/Log/index.vue +17 -17
  25. package/dist/runtime/components/Table/ColumnDate.vue +1 -1
  26. package/dist/runtime/components/Table/ColumnDateTime.vue +1 -1
  27. package/dist/runtime/components/Table/ColumnImage.vue +4 -4
  28. package/dist/runtime/components/Table/ColumnText.vue +1 -1
  29. package/dist/runtime/components/Table/Pagination.vue +46 -46
  30. package/dist/runtime/components/Table/Simple.vue +17 -17
  31. package/dist/runtime/helpers/apiPageHelper.js +4 -4
  32. package/dist/runtime/server/tsconfig.json +3 -3
  33. package/package.json +1 -1
@@ -1,149 +1,149 @@
1
1
  <template>
2
- <div :class="theme.multipleFilesWrapper()">
3
- <div
4
- v-for="(item, index) in fileItems"
5
- :key="index"
6
- :class="theme.fileItemWrapper()"
7
- >
8
- <!-- Uploading State -->
9
- <div
10
- v-if="item.state === UploadState.UPLOADING"
11
- :class="theme.uploadingItemWrapper()"
12
- >
13
- <div :class="theme.uploadingIconWrapper()">
14
- <Icon
15
- :name="icons.filePreviewIcon"
16
- :class="theme.uploadingIconClass()"
17
- />
18
- </div>
19
- <div :class="theme.uploadingTextWrapper()">
20
- <h1 class="truncate font-bold">
21
- {{ item.file.name }}
22
- </h1>
23
- <div class="flex items-center gap-2">
24
- <div :class="theme.progressBarWrapper()">
25
- <div
26
- :class="theme.progressBarFill()"
27
- :style="{ width: `${item.progress}%` }"
28
- />
29
- </div>
30
- <p class="text-sm text-gray-400">
31
- {{ item.progress }}%
32
- </p>
33
- </div>
34
- </div>
35
- </div>
36
-
37
- <!-- Success State -->
38
- <div
39
- v-else-if="item.state === UploadState.SUCCESS && item.value"
40
- :class="theme.successItemWrapper()"
41
- >
42
- <div
43
- v-if="isImageFromPath(item.value.path)"
44
- :class="theme.successImgWrapper()"
45
- >
46
- <img
47
- :src="item.value.url"
48
- :class="theme.successImgClass()"
49
- alt="img-preview"
50
- />
51
- </div>
52
- <div
53
- v-else
54
- :class="theme.successFileWrapper()"
55
- >
56
- <Icon
57
- :name="icons.filePreviewIcon"
58
- :class="theme.successFileClass()"
59
- />
60
- </div>
61
- <div :class="theme.successTextWrapper()">
62
- <div class="truncate">
63
- <h1 class="truncate font-bold">
64
- {{ item.value.name }}
65
- </h1>
66
- <p class="truncate text-sm font-light text-gray-400">
67
- {{ getFileSizeFromValue(item.value) }}
68
- </p>
69
- </div>
70
- <div :class="theme.actionWrapper()">
71
- <a
72
- v-if="isPDFFromPath(item.value.path)"
73
- :href="item.value.url"
74
- target="_blank"
75
- class="flex"
76
- >
77
- <Icon
78
- :name="icons.actionPreviewIcon"
79
- :class="theme.actionIconClass()"
80
- title="ดูตัวอย่าง"
81
- />
82
- </a>
83
- <Icon
84
- v-if="isImageFromPath(item.value.path) || isVideoFromPath(item.value.path)"
85
- :name="icons.actionPreviewIcon"
86
- :class="theme.actionIconClass()"
87
- title="ดูตัวอย่าง"
88
- @click="$emit('preview', item.value)"
89
- />
90
- <Icon
91
- :name="icons.actionDownloadIcon"
92
- :class="theme.actionIconClass()"
93
- title="ดาวน์โหลดไฟล์"
94
- @click="$emit('download', item.value)"
95
- />
96
- <Icon
97
- v-if="!disabled && !readonly"
98
- :name="icons.actionDeleteIcon"
99
- :class="theme.actionIconClass()"
100
- title="ลบไฟล์"
101
- @click="$emit('delete', index)"
102
- />
103
- </div>
104
- </div>
105
- </div>
106
-
107
- <!-- Error State -->
108
- <div
109
- v-else-if="item.state === UploadState.ERROR"
110
- :class="theme.errorItemWrapper()"
111
- >
112
- <div :class="theme.errorIconWrapper()">
113
- <Icon
114
- :name="icons.errorIcon"
115
- :class="theme.errorIconClass()"
116
- />
117
- </div>
118
- <div :class="theme.errorTextWrapper()">
119
- <h1 class="truncate font-bold">
120
- {{ item.file.name }}
121
- </h1>
122
- <p class="text-error-500 text-sm">
123
- {{ item.error || uploadFailedLabel }}
124
- </p>
125
- </div>
126
- <div :class="theme.errorActionWrapper()">
127
- <Button
128
- variant="link"
129
- :icon="icons.actionRetryIcon"
130
- :class="theme.actionRetryBtnClass()"
131
- color="primary"
132
- @click="$emit('retry', index)"
133
- >
134
- {{ retryLabel }}
135
- </Button>
136
- <Icon
137
- v-if="!disabled && !readonly"
138
- :name="icons.actionDeleteIcon"
139
- :class="theme.actionIconClass()"
140
- title="ลบไฟล์"
141
- @click="$emit('delete', index)"
142
- />
143
- </div>
144
- </div>
145
- </div>
146
- </div>
2
+ <div :class="theme.multipleFilesWrapper()">
3
+ <div
4
+ v-for="(item, index) in fileItems"
5
+ :key="index"
6
+ :class="theme.fileItemWrapper()"
7
+ >
8
+ <!-- Uploading State -->
9
+ <div
10
+ v-if="item.state === UploadState.UPLOADING"
11
+ :class="theme.uploadingItemWrapper()"
12
+ >
13
+ <div :class="theme.uploadingIconWrapper()">
14
+ <Icon
15
+ :name="icons.filePreviewIcon"
16
+ :class="theme.uploadingIconClass()"
17
+ />
18
+ </div>
19
+ <div :class="theme.uploadingTextWrapper()">
20
+ <h1 class="truncate font-bold">
21
+ {{ item.file.name }}
22
+ </h1>
23
+ <div class="flex items-center gap-2">
24
+ <div :class="theme.progressBarWrapper()">
25
+ <div
26
+ :class="theme.progressBarFill()"
27
+ :style="{ width: `${item.progress}%` }"
28
+ />
29
+ </div>
30
+ <p class="text-sm text-gray-400">
31
+ {{ item.progress }}%
32
+ </p>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ <!-- Success State -->
38
+ <div
39
+ v-else-if="item.state === UploadState.SUCCESS && item.value"
40
+ :class="theme.successItemWrapper()"
41
+ >
42
+ <div
43
+ v-if="isImageFromPath(item.value.path)"
44
+ :class="theme.successImgWrapper()"
45
+ >
46
+ <img
47
+ :src="item.value.url"
48
+ :class="theme.successImgClass()"
49
+ alt="img-preview"
50
+ />
51
+ </div>
52
+ <div
53
+ v-else
54
+ :class="theme.successFileWrapper()"
55
+ >
56
+ <Icon
57
+ :name="icons.filePreviewIcon"
58
+ :class="theme.successFileClass()"
59
+ />
60
+ </div>
61
+ <div :class="theme.successTextWrapper()">
62
+ <div class="truncate">
63
+ <h1 class="truncate font-bold">
64
+ {{ item.value.name }}
65
+ </h1>
66
+ <p class="truncate text-sm font-light text-gray-400">
67
+ {{ getFileSizeFromValue(item.value) }}
68
+ </p>
69
+ </div>
70
+ <div :class="theme.actionWrapper()">
71
+ <a
72
+ v-if="isPDFFromPath(item.value.path)"
73
+ :href="item.value.url"
74
+ target="_blank"
75
+ class="flex"
76
+ >
77
+ <Icon
78
+ :name="icons.actionPreviewIcon"
79
+ :class="theme.actionIconClass()"
80
+ title="ดูตัวอย่าง"
81
+ />
82
+ </a>
83
+ <Icon
84
+ v-if="isImageFromPath(item.value.path) || isVideoFromPath(item.value.path)"
85
+ :name="icons.actionPreviewIcon"
86
+ :class="theme.actionIconClass()"
87
+ title="ดูตัวอย่าง"
88
+ @click="$emit('preview', item.value)"
89
+ />
90
+ <Icon
91
+ :name="icons.actionDownloadIcon"
92
+ :class="theme.actionIconClass()"
93
+ title="ดาวน์โหลดไฟล์"
94
+ @click="$emit('download', item.value)"
95
+ />
96
+ <Icon
97
+ v-if="!disabled && !readonly"
98
+ :name="icons.actionDeleteIcon"
99
+ :class="theme.actionIconClass()"
100
+ title="ลบไฟล์"
101
+ @click="$emit('delete', index)"
102
+ />
103
+ </div>
104
+ </div>
105
+ </div>
106
+
107
+ <!-- Error State -->
108
+ <div
109
+ v-else-if="item.state === UploadState.ERROR"
110
+ :class="theme.errorItemWrapper()"
111
+ >
112
+ <div :class="theme.errorIconWrapper()">
113
+ <Icon
114
+ :name="icons.errorIcon"
115
+ :class="theme.errorIconClass()"
116
+ />
117
+ </div>
118
+ <div :class="theme.errorTextWrapper()">
119
+ <h1 class="truncate font-bold">
120
+ {{ item.file.name }}
121
+ </h1>
122
+ <p class="text-error-500 text-sm">
123
+ {{ item.error || uploadFailedLabel }}
124
+ </p>
125
+ </div>
126
+ <div :class="theme.errorActionWrapper()">
127
+ <Button
128
+ variant="link"
129
+ :icon="icons.actionRetryIcon"
130
+ :class="theme.actionRetryBtnClass()"
131
+ color="primary"
132
+ @click="$emit('retry', index)"
133
+ >
134
+ {{ retryLabel }}
135
+ </Button>
136
+ <Icon
137
+ v-if="!disabled && !readonly"
138
+ :name="icons.actionDeleteIcon"
139
+ :class="theme.actionIconClass()"
140
+ title="ลบไฟล์"
141
+ @click="$emit('delete', index)"
142
+ />
143
+ </div>
144
+ </div>
145
+ </div>
146
+ </div>
147
147
  </template>
148
148
 
149
149
  <script setup>
@@ -1,29 +1,29 @@
1
1
  <template>
2
- <Modal
3
- :close="{ onClick: () => emits('close', false) }"
4
- :dismissible="false"
5
- :title="value?.name"
2
+ <Modal
3
+ :close="{ onClick: () => emits('close', false) }"
4
+ :dismissible="false"
5
+ :title="value?.name"
6
6
  :ui="{
7
7
  content: 'max-w-3xl'
8
- }"
9
- >
10
- <template #body>
11
- <div class="flex justify-center">
12
- <img
13
- v-if="value && isImageFromPath(value.path)"
14
- :src="value.url"
15
- alt="img-preview"
16
- class="max-h-96 max-w-full rounded-lg"
17
- />
18
- <video
19
- v-else-if="value && isVideoFromPath(value.path)"
20
- :src="value.url"
21
- controls
22
- class="max-h-96 max-w-full"
23
- />
24
- </div>
25
- </template>
26
- </Modal>
8
+ }"
9
+ >
10
+ <template #body>
11
+ <div class="flex justify-center">
12
+ <img
13
+ v-if="value && isImageFromPath(value.path)"
14
+ :src="value.url"
15
+ alt="img-preview"
16
+ class="max-h-96 max-w-full rounded-lg"
17
+ />
18
+ <video
19
+ v-else-if="value && isVideoFromPath(value.path)"
20
+ :src="value.url"
21
+ controls
22
+ class="max-h-96 max-w-full"
23
+ />
24
+ </div>
25
+ </template>
26
+ </Modal>
27
27
  </template>
28
28
 
29
29
  <script setup>
@@ -1,5 +1,5 @@
1
- <template>
2
- <form class="form">
3
- <slot />
4
- </form>
5
- </template>
1
+ <template>
2
+ <form class="form">
3
+ <slot />
4
+ </form>
5
+ </template>
@@ -1,32 +1,32 @@
1
1
  <template>
2
- <UseImage v-bind="$props">
3
- <template #loading>
4
- <slot name="loading">
5
- <div
6
- class="flex h-full w-full items-center justify-center"
7
- >
8
- <Loader
9
- :loading="true"
10
- />
11
- </div>
12
- </slot>
13
- </template>
14
-
15
- <template #error>
16
- <slot name="error">
17
- <div
18
- class="flex h-full w-full items-center justify-center"
19
- >
20
- <p class="text-error-400">
21
- <Icon
22
- name="i-heroicons:exclamation-circle-solid"
23
- class="text-error-400 size-8"
24
- />
25
- </p>
26
- </div>
27
- </slot>
28
- </template>
29
- </UseImage>
2
+ <UseImage v-bind="$props">
3
+ <template #loading>
4
+ <slot name="loading">
5
+ <div
6
+ class="flex h-full w-full items-center justify-center"
7
+ >
8
+ <Loader
9
+ :loading="true"
10
+ />
11
+ </div>
12
+ </slot>
13
+ </template>
14
+
15
+ <template #error>
16
+ <slot name="error">
17
+ <div
18
+ class="flex h-full w-full items-center justify-center"
19
+ >
20
+ <p class="text-error-400">
21
+ <Icon
22
+ name="i-heroicons:exclamation-circle-solid"
23
+ class="text-error-400 size-8"
24
+ />
25
+ </p>
26
+ </div>
27
+ </slot>
28
+ </template>
29
+ </UseImage>
30
30
  </template>
31
31
 
32
32
  <script setup>
@@ -1,21 +1,21 @@
1
1
  <template>
2
- <DevOnly>
3
- <TeleportSafe
4
- to="#dev-logs"
5
- >
6
- <LogItem
7
- v-if="typeof data !== 'undefined'"
8
- :data="data"
9
- :title="title"
10
- />
11
- <LogItem
12
- v-for="(item, index) in dataItems"
13
- :key="index"
14
- :data="item"
15
- :title="`${title} #${index + 1}`"
16
- />
17
- </TeleportSafe>
18
- </DevOnly>
2
+ <DevOnly>
3
+ <TeleportSafe
4
+ to="#dev-logs"
5
+ >
6
+ <LogItem
7
+ v-if="typeof data !== 'undefined'"
8
+ :data="data"
9
+ :title="title"
10
+ />
11
+ <LogItem
12
+ v-for="(item, index) in dataItems"
13
+ :key="index"
14
+ :data="item"
15
+ :title="`${title} #${index + 1}`"
16
+ />
17
+ </TeleportSafe>
18
+ </DevOnly>
19
19
  </template>
20
20
 
21
21
  <script setup>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- {{ getValue || "-" }}
2
+ {{ getValue || "-" }}
3
3
  </template>
4
4
 
5
5
  <script setup>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- {{ getValue || "-" }}
2
+ {{ getValue || "-" }}
3
3
  </template>
4
4
 
5
5
  <script setup>
@@ -1,8 +1,8 @@
1
1
  <template>
2
- <Image
3
- class="h-12 rounded"
4
- :src="getValue"
5
- />
2
+ <Image
3
+ class="h-12 rounded"
4
+ :src="getValue"
5
+ />
6
6
  </template>
7
7
 
8
8
  <script setup>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- {{ getValue }}
2
+ {{ getValue }}
3
3
  </template>
4
4
 
5
5
  <script setup>
@@ -1,70 +1,70 @@
1
1
  <template>
2
- <div
2
+ <div
3
3
  :class="
4
4
  theme.paginationContainer({
5
5
  class: [ui?.paginationContainer]
6
6
  })
7
- "
8
- >
9
- <div
7
+ "
8
+ >
9
+ <div
10
10
  :class="
11
11
  theme.paginationInfoWrapper({
12
12
  class: [ui?.paginationInfoWrapper]
13
13
  })
14
- "
15
- >
16
- <USelect
17
- v-if="options.pageOptions && !options.isHideLimitSelect"
18
- size="lg"
19
- trailing="รายการ"
14
+ "
15
+ >
16
+ <USelect
17
+ v-if="options.pageOptions && !options.isHideLimitSelect"
18
+ size="lg"
19
+ trailing="รายการ"
20
20
  :class="
21
21
  theme.paginationLimitSelect({
22
22
  class: [ui?.paginationLimitSelect, 'cursor-pointer']
23
23
  })
24
- "
25
- :items="pageLimitItems"
26
- :model-value="pageLimit"
27
- @update:modelValue="emits('pageLimitChange', $event)"
28
- >
29
- <template #default="{ modelValue }">
30
- <p
24
+ "
25
+ :items="pageLimitItems"
26
+ :model-value="pageLimit"
27
+ @update:modelValue="emits('pageLimitChange', $event)"
28
+ >
29
+ <template #default="{ modelValue }">
30
+ <p
31
31
  :class="
32
32
  theme.paginationLimitSelectLabel({
33
33
  class: [ui?.paginationLimitSelectLabel]
34
34
  })
35
- "
36
- >
37
- {{ modelValue }} รายการ
38
- </p>
39
- </template>
40
- </USelect>
41
- <p
35
+ "
36
+ >
37
+ {{ modelValue }} รายการ
38
+ </p>
39
+ </template>
40
+ </USelect>
41
+ <p
42
42
  :class="
43
43
  theme.paginationInfo({
44
44
  class: [ui?.paginationInfo, '']
45
45
  })
46
- "
47
- >
48
- <span v-if="options.pageOptions">{{ pageBetween }} จากทั้งหมด {{ totalCountWithComma }}</span>
49
- <span v-else>ทั้งหมด {{ options.rawData.length }} รายการ</span>
50
- </p>
51
- </div>
52
-
53
- <UPagination
54
- v-if="options.pageOptions && options.pageOptions.totalPage > 1"
55
- :page="page"
56
- :default-page="options.pageOptions?.currentPage || 1"
57
- :items-per-page="options.pageOptions.limit"
58
- :total="options.pageOptions.totalCount"
59
- :to="options.isRouteChange ? to : void 0"
60
- show-edges
61
- variant="outline"
62
- color="neutral"
63
- active-color="neutral"
64
- active-variant="subtle"
65
- @update:page="emits('pageChange', $event)"
66
- />
67
- </div>
46
+ "
47
+ >
48
+ <span v-if="options.pageOptions">{{ pageBetween }} จากทั้งหมด {{ totalCountWithComma }}</span>
49
+ <span v-else>ทั้งหมด {{ options.rawData.length }} รายการ</span>
50
+ </p>
51
+ </div>
52
+
53
+ <UPagination
54
+ v-if="options.pageOptions && options.pageOptions.totalPage > 1"
55
+ :page="page"
56
+ :default-page="options.pageOptions?.currentPage || 1"
57
+ :items-per-page="options.pageOptions.limit"
58
+ :total="options.pageOptions.totalCount"
59
+ :to="options.isRouteChange ? to : void 0"
60
+ show-edges
61
+ variant="outline"
62
+ color="neutral"
63
+ active-color="neutral"
64
+ active-variant="subtle"
65
+ @update:page="emits('pageChange', $event)"
66
+ />
67
+ </div>
68
68
  </template>
69
69
 
70
70
  <script setup>
@@ -1,25 +1,25 @@
1
1
  <template>
2
- <Base
3
- v-bind="$attrs"
2
+ <Base
3
+ v-bind="$attrs"
4
4
  :options="{
5
5
  ...options,
6
6
  pageOptions,
7
7
  isHideLimitSelect: true
8
- }"
9
- :ui="ui"
10
- :raw-data="itemsByPage"
11
- @page-change="onPageChange"
12
- >
13
- <template
14
- v-for="(_, slot) of $slots"
15
- #[slot]="slotProps"
16
- >
17
- <slot
18
- :name="slot"
19
- v-bind="slotProps || {}"
20
- />
21
- </template>
22
- </Base>
8
+ }"
9
+ :ui="ui"
10
+ :raw-data="itemsByPage"
11
+ @page-change="onPageChange"
12
+ >
13
+ <template
14
+ v-for="(_, slot) of $slots"
15
+ #[slot]="slotProps"
16
+ >
17
+ <slot
18
+ :name="slot"
19
+ v-bind="slotProps || {}"
20
+ />
21
+ </template>
22
+ </Base>
23
23
  </template>
24
24
 
25
25
  <script setup>