@ramathibodi/nuxt-commons 0.1.74 → 0.1.75
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.
- package/README.md +115 -115
- package/dist/module.json +1 -1
- package/dist/runtime/components/Alert.vue +58 -58
- package/dist/runtime/components/BarcodeReader.vue +130 -130
- package/dist/runtime/components/ExportCSV.vue +110 -110
- package/dist/runtime/components/FileBtn.vue +79 -79
- package/dist/runtime/components/ImportCSV.vue +151 -151
- package/dist/runtime/components/MrzReader.vue +168 -168
- package/dist/runtime/components/SplitterPanel.vue +67 -67
- package/dist/runtime/components/TabsGroup.vue +39 -39
- package/dist/runtime/components/TextBarcode.vue +66 -66
- package/dist/runtime/components/device/IdCardButton.vue +95 -95
- package/dist/runtime/components/device/IdCardWebSocket.vue +207 -207
- package/dist/runtime/components/device/Scanner.vue +350 -350
- package/dist/runtime/components/dialog/Confirm.vue +112 -112
- package/dist/runtime/components/dialog/Host.vue +88 -88
- package/dist/runtime/components/dialog/Index.vue +84 -84
- package/dist/runtime/components/dialog/Loading.vue +51 -51
- package/dist/runtime/components/dialog/default/Confirm.vue +112 -112
- package/dist/runtime/components/dialog/default/Loading.vue +60 -60
- package/dist/runtime/components/dialog/default/Notify.vue +82 -82
- package/dist/runtime/components/dialog/default/Printing.vue +46 -46
- package/dist/runtime/components/dialog/default/VerifyUser.vue +144 -144
- package/dist/runtime/components/document/Form.vue +50 -50
- package/dist/runtime/components/document/TemplateBuilder.vue +536 -536
- package/dist/runtime/components/form/ActionPad.vue +156 -156
- package/dist/runtime/components/form/Birthdate.vue +116 -116
- package/dist/runtime/components/form/CheckboxGroup.vue +99 -99
- package/dist/runtime/components/form/CodeEditor.vue +45 -45
- package/dist/runtime/components/form/Date.vue +270 -270
- package/dist/runtime/components/form/DateTime.vue +220 -220
- package/dist/runtime/components/form/Dialog.vue +178 -178
- package/dist/runtime/components/form/EditPad.vue +157 -157
- package/dist/runtime/components/form/File.vue +295 -295
- package/dist/runtime/components/form/Hidden.vue +44 -44
- package/dist/runtime/components/form/Iterator.vue +538 -538
- package/dist/runtime/components/form/Login.vue +143 -143
- package/dist/runtime/components/form/Pad.vue +399 -399
- package/dist/runtime/components/form/SignPad.vue +226 -226
- package/dist/runtime/components/form/System.vue +34 -34
- package/dist/runtime/components/form/Table.vue +391 -391
- package/dist/runtime/components/form/TableData.vue +236 -236
- package/dist/runtime/components/form/Time.vue +177 -177
- package/dist/runtime/components/form/images/Capture.vue +245 -245
- package/dist/runtime/components/form/images/Edit.vue +133 -133
- package/dist/runtime/components/form/images/Field.vue +331 -331
- package/dist/runtime/components/form/images/Pad.vue +54 -54
- package/dist/runtime/components/label/Date.vue +37 -37
- package/dist/runtime/components/label/DateAgo.vue +102 -102
- package/dist/runtime/components/label/DateCount.vue +152 -152
- package/dist/runtime/components/label/Field.vue +111 -111
- package/dist/runtime/components/label/FormatMoney.vue +37 -37
- package/dist/runtime/components/label/Mask.vue +46 -46
- package/dist/runtime/components/label/Object.vue +21 -21
- package/dist/runtime/components/master/Autocomplete.vue +89 -89
- package/dist/runtime/components/master/Combobox.vue +88 -88
- package/dist/runtime/components/master/RadioGroup.vue +90 -90
- package/dist/runtime/components/master/Select.vue +70 -70
- package/dist/runtime/components/master/label.vue +55 -55
- package/dist/runtime/components/model/Autocomplete.vue +91 -91
- package/dist/runtime/components/model/Combobox.vue +90 -90
- package/dist/runtime/components/model/Pad.vue +114 -114
- package/dist/runtime/components/model/Select.vue +78 -84
- package/dist/runtime/components/model/Table.vue +370 -370
- package/dist/runtime/components/model/iterator.vue +497 -497
- package/dist/runtime/components/model/label.vue +58 -58
- package/dist/runtime/components/pdf/Print.vue +75 -75
- package/dist/runtime/components/pdf/View.vue +146 -146
- package/dist/runtime/composables/dialog.d.ts +1 -1
- package/dist/runtime/composables/graphql.d.ts +1 -1
- package/dist/runtime/composables/graphqlModel.d.ts +9 -9
- package/dist/runtime/composables/graphqlModelItem.d.ts +7 -7
- package/dist/runtime/composables/graphqlModelOperation.d.ts +6 -6
- package/dist/runtime/composables/userPermission.d.ts +1 -1
- package/dist/runtime/labs/Calendar.vue +99 -99
- package/dist/runtime/labs/form/EditMobile.vue +152 -152
- package/dist/runtime/labs/form/TextFieldMask.vue +43 -43
- package/dist/runtime/plugins/clientConfig.d.ts +1 -1
- package/dist/runtime/plugins/default.d.ts +1 -1
- package/dist/runtime/plugins/dialogManager.d.ts +1 -1
- package/dist/runtime/plugins/permission.d.ts +1 -1
- package/dist/runtime/types/alert.d.ts +11 -11
- package/dist/runtime/types/clientConfig.d.ts +13 -13
- package/dist/runtime/types/dialogManager.d.ts +35 -35
- package/dist/runtime/types/formDialog.d.ts +5 -5
- package/dist/runtime/types/graphqlOperation.d.ts +23 -23
- package/dist/runtime/types/menu.d.ts +31 -31
- package/dist/runtime/types/modules.d.ts +7 -7
- package/dist/runtime/types/permission.d.ts +13 -13
- package/package.json +131 -131
- package/scripts/enrich-vue-docs-from-ai.mjs +197 -197
- package/scripts/generate-ai-summary.mjs +321 -321
- package/scripts/generate-composables-md.mjs +129 -129
- package/scripts/postInstall.cjs +70 -70
- package/templates/.codegen/codegen.ts +32 -32
- package/templates/.codegen/plugin-schema-object.js +161 -161
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
/**
|
|
3
|
-
* FormTime is a schema-driven form field component that binds model data, renders field UI, and emits normalized updates.
|
|
4
|
-
* This doc block is consumed by vue-docgen for generated API documentation.
|
|
5
|
-
*/
|
|
6
|
-
import { ref, watch, watchEffect, nextTick, defineExpose } from 'vue'
|
|
7
|
-
import { VTextField } from 'vuetify/components/VTextField'
|
|
8
|
-
import Datepicker from '@vuepic/vue-datepicker'
|
|
9
|
-
import '@vuepic/vue-datepicker/dist/main.css'
|
|
10
|
-
import { Datetime } from '../../utils/datetime'
|
|
11
|
-
|
|
12
|
-
interface Props extends /* @vue-ignore */ InstanceType<typeof VTextField['$props']> {
|
|
13
|
-
enableSeconds?: boolean // Includes seconds selector in the time picker.
|
|
14
|
-
locale?: 'TH' | 'EN' // Locale used for date/time formatting and localized labels.
|
|
15
|
-
pickerOnly?: boolean // forces value selection through picker interaction only
|
|
16
|
-
modelValue?: string | null // Bound value for v-model synchronization with the parent component.
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Public props accepted by FormTime.
|
|
21
|
-
* Document each prop field with intent, defaults, and side effects for clear generated docs.
|
|
22
|
-
*/
|
|
23
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
24
|
-
locale: 'TH',
|
|
25
|
-
pickerOnly: false,
|
|
26
|
-
enableSeconds: false,
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Custom events emitted by FormTime.
|
|
31
|
-
* Parents can listen to these events to react to user actions and internal state changes.
|
|
32
|
-
*/
|
|
33
|
-
const emit = defineEmits(['update:modelValue'])
|
|
34
|
-
|
|
35
|
-
const time = ref<string | null>(null)
|
|
36
|
-
const tempTime = ref<string | null>(null)
|
|
37
|
-
const isMenuOpen = ref(false)
|
|
38
|
-
const isTextFieldFocused = ref(false)
|
|
39
|
-
const isTextFieldTyped = ref(false)
|
|
40
|
-
|
|
41
|
-
function onTextFieldFocus(event: Event) {
|
|
42
|
-
isTextFieldFocused.value = true
|
|
43
|
-
nextTick(() => {
|
|
44
|
-
(event.target as HTMLInputElement).select()
|
|
45
|
-
})
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function onTextFieldTyped() {
|
|
49
|
-
if (!isTextFieldTyped.value) {
|
|
50
|
-
isTextFieldTyped.value = true
|
|
51
|
-
isMenuOpen.value = false
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function onTextFieldBlur() {
|
|
56
|
-
if (isTextFieldTyped.value) {
|
|
57
|
-
setTime(tempTime.value)
|
|
58
|
-
isTextFieldTyped.value = false
|
|
59
|
-
}
|
|
60
|
-
isTextFieldFocused.value = false
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function onTextFieldEnterKey() {
|
|
64
|
-
onTextFieldBlur()
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function onTextFieldClear() {
|
|
68
|
-
reset()
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function reset() {
|
|
72
|
-
time.value = null
|
|
73
|
-
tempTime.value = null
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function setTime(TimeString: string | null) {
|
|
77
|
-
const dateTime = Datetime().fromStringTime(TimeString, undefined, props.locale)
|
|
78
|
-
if (!dateTime.luxonDateTime.isValid) {
|
|
79
|
-
tempTime.value = null
|
|
80
|
-
time.value = null
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
time.value = dateTime.toFormat('HH:mm:ss', 'EN')
|
|
84
|
-
tempTime.value = time.value
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function setDatePicker(DateString: string | null) {
|
|
89
|
-
setTime(DateString)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
watchEffect(() => {
|
|
93
|
-
if (!isTextFieldFocused.value && time.value) {
|
|
94
|
-
const dateTime = Datetime().fromString(time.value, undefined, props.locale)
|
|
95
|
-
tempTime.value = dateTime.toFormat((props.enableSeconds) ? 'HH:mm:ss' : 'HH:mm', props.locale)
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
tempTime.value = time.value
|
|
99
|
-
}
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
watch(time, (newValue) => {
|
|
103
|
-
if (!isMenuOpen.value) emit('update:modelValue', newValue)
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
watch(isMenuOpen, () => {
|
|
107
|
-
if (isMenuOpen.value && !time.value) {
|
|
108
|
-
time.value = Datetime().now().toFormat((props.enableSeconds) ? 'HH:mm:ss' : 'HH:mm:00')
|
|
109
|
-
}
|
|
110
|
-
if (!isMenuOpen.value) emit('update:modelValue', time.value)
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
watch(() => props.modelValue, () => {
|
|
114
|
-
setTime(props.modelValue || null)
|
|
115
|
-
}, { immediate: true })
|
|
116
|
-
|
|
117
|
-
function toggleMenuOpen(trigger: string) {
|
|
118
|
-
if ((trigger === 'textField' && props.pickerOnly) || (trigger === 'icon' && !props.pickerOnly)) {
|
|
119
|
-
if (!props.readonly) isMenuOpen.value = true
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const textFieldRef = ref<VTextField>()
|
|
124
|
-
function validate() {
|
|
125
|
-
textFieldRef.value?.validate()
|
|
126
|
-
}
|
|
127
|
-
function resetValidation() {
|
|
128
|
-
textFieldRef.value?.resetValidation()
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
defineExpose({
|
|
132
|
-
reset,validate,resetValidation, isValid: textFieldRef.value?.isValid
|
|
133
|
-
})
|
|
134
|
-
</script>
|
|
135
|
-
|
|
136
|
-
<template>
|
|
137
|
-
<v-menu
|
|
138
|
-
v-model="isMenuOpen"
|
|
139
|
-
:close-on-content-click="false"
|
|
140
|
-
:open-on-click="false"
|
|
141
|
-
>
|
|
142
|
-
<template #activator="{ props }">
|
|
143
|
-
<v-text-field
|
|
144
|
-
ref="textFieldRef"
|
|
145
|
-
v-model="tempTime"
|
|
146
|
-
v-bind="$attrs"
|
|
147
|
-
@focus="onTextFieldFocus"
|
|
148
|
-
@blur="onTextFieldBlur"
|
|
149
|
-
@keydown="onTextFieldTyped"
|
|
150
|
-
@keyup.enter="onTextFieldEnterKey"
|
|
151
|
-
@click:clear="onTextFieldClear"
|
|
152
|
-
@click="toggleMenuOpen('textField')"
|
|
153
|
-
>
|
|
154
|
-
<template #append="{ isReadonly, isDisabled }">
|
|
155
|
-
<v-icon
|
|
156
|
-
:disabled="isReadonly.value || isDisabled.value"
|
|
157
|
-
v-bind="props"
|
|
158
|
-
@click="toggleMenuOpen('icon')"
|
|
159
|
-
>
|
|
160
|
-
fa:fa-regular fa-clock
|
|
161
|
-
</v-icon>
|
|
162
|
-
</template>
|
|
163
|
-
</v-text-field>
|
|
164
|
-
</template>
|
|
165
|
-
<Datepicker
|
|
166
|
-
v-model="time"
|
|
167
|
-
model-type="HH:mm:ss"
|
|
168
|
-
:enable-seconds="enableSeconds"
|
|
169
|
-
minutes-grid-increment="1"
|
|
170
|
-
time-picker
|
|
171
|
-
auto-apply
|
|
172
|
-
:close-on-auto-apply="false"
|
|
173
|
-
inline
|
|
174
|
-
:locale="locale"
|
|
175
|
-
@update:model-value="setDatePicker"
|
|
176
|
-
/>
|
|
177
|
-
</v-menu>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
/**
|
|
3
|
+
* FormTime is a schema-driven form field component that binds model data, renders field UI, and emits normalized updates.
|
|
4
|
+
* This doc block is consumed by vue-docgen for generated API documentation.
|
|
5
|
+
*/
|
|
6
|
+
import { ref, watch, watchEffect, nextTick, defineExpose } from 'vue'
|
|
7
|
+
import { VTextField } from 'vuetify/components/VTextField'
|
|
8
|
+
import Datepicker from '@vuepic/vue-datepicker'
|
|
9
|
+
import '@vuepic/vue-datepicker/dist/main.css'
|
|
10
|
+
import { Datetime } from '../../utils/datetime'
|
|
11
|
+
|
|
12
|
+
interface Props extends /* @vue-ignore */ InstanceType<typeof VTextField['$props']> {
|
|
13
|
+
enableSeconds?: boolean // Includes seconds selector in the time picker.
|
|
14
|
+
locale?: 'TH' | 'EN' // Locale used for date/time formatting and localized labels.
|
|
15
|
+
pickerOnly?: boolean // forces value selection through picker interaction only
|
|
16
|
+
modelValue?: string | null // Bound value for v-model synchronization with the parent component.
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Public props accepted by FormTime.
|
|
21
|
+
* Document each prop field with intent, defaults, and side effects for clear generated docs.
|
|
22
|
+
*/
|
|
23
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
24
|
+
locale: 'TH',
|
|
25
|
+
pickerOnly: false,
|
|
26
|
+
enableSeconds: false,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Custom events emitted by FormTime.
|
|
31
|
+
* Parents can listen to these events to react to user actions and internal state changes.
|
|
32
|
+
*/
|
|
33
|
+
const emit = defineEmits(['update:modelValue'])
|
|
34
|
+
|
|
35
|
+
const time = ref<string | null>(null)
|
|
36
|
+
const tempTime = ref<string | null>(null)
|
|
37
|
+
const isMenuOpen = ref(false)
|
|
38
|
+
const isTextFieldFocused = ref(false)
|
|
39
|
+
const isTextFieldTyped = ref(false)
|
|
40
|
+
|
|
41
|
+
function onTextFieldFocus(event: Event) {
|
|
42
|
+
isTextFieldFocused.value = true
|
|
43
|
+
nextTick(() => {
|
|
44
|
+
(event.target as HTMLInputElement).select()
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function onTextFieldTyped() {
|
|
49
|
+
if (!isTextFieldTyped.value) {
|
|
50
|
+
isTextFieldTyped.value = true
|
|
51
|
+
isMenuOpen.value = false
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function onTextFieldBlur() {
|
|
56
|
+
if (isTextFieldTyped.value) {
|
|
57
|
+
setTime(tempTime.value)
|
|
58
|
+
isTextFieldTyped.value = false
|
|
59
|
+
}
|
|
60
|
+
isTextFieldFocused.value = false
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function onTextFieldEnterKey() {
|
|
64
|
+
onTextFieldBlur()
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function onTextFieldClear() {
|
|
68
|
+
reset()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function reset() {
|
|
72
|
+
time.value = null
|
|
73
|
+
tempTime.value = null
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function setTime(TimeString: string | null) {
|
|
77
|
+
const dateTime = Datetime().fromStringTime(TimeString, undefined, props.locale)
|
|
78
|
+
if (!dateTime.luxonDateTime.isValid) {
|
|
79
|
+
tempTime.value = null
|
|
80
|
+
time.value = null
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
time.value = dateTime.toFormat('HH:mm:ss', 'EN')
|
|
84
|
+
tempTime.value = time.value
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function setDatePicker(DateString: string | null) {
|
|
89
|
+
setTime(DateString)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
watchEffect(() => {
|
|
93
|
+
if (!isTextFieldFocused.value && time.value) {
|
|
94
|
+
const dateTime = Datetime().fromString(time.value, undefined, props.locale)
|
|
95
|
+
tempTime.value = dateTime.toFormat((props.enableSeconds) ? 'HH:mm:ss' : 'HH:mm', props.locale)
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
tempTime.value = time.value
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
watch(time, (newValue) => {
|
|
103
|
+
if (!isMenuOpen.value) emit('update:modelValue', newValue)
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
watch(isMenuOpen, () => {
|
|
107
|
+
if (isMenuOpen.value && !time.value) {
|
|
108
|
+
time.value = Datetime().now().toFormat((props.enableSeconds) ? 'HH:mm:ss' : 'HH:mm:00')
|
|
109
|
+
}
|
|
110
|
+
if (!isMenuOpen.value) emit('update:modelValue', time.value)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
watch(() => props.modelValue, () => {
|
|
114
|
+
setTime(props.modelValue || null)
|
|
115
|
+
}, { immediate: true })
|
|
116
|
+
|
|
117
|
+
function toggleMenuOpen(trigger: string) {
|
|
118
|
+
if ((trigger === 'textField' && props.pickerOnly) || (trigger === 'icon' && !props.pickerOnly)) {
|
|
119
|
+
if (!props.readonly) isMenuOpen.value = true
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const textFieldRef = ref<VTextField>()
|
|
124
|
+
function validate() {
|
|
125
|
+
textFieldRef.value?.validate()
|
|
126
|
+
}
|
|
127
|
+
function resetValidation() {
|
|
128
|
+
textFieldRef.value?.resetValidation()
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
defineExpose({
|
|
132
|
+
reset,validate,resetValidation, isValid: textFieldRef.value?.isValid
|
|
133
|
+
})
|
|
134
|
+
</script>
|
|
135
|
+
|
|
136
|
+
<template>
|
|
137
|
+
<v-menu
|
|
138
|
+
v-model="isMenuOpen"
|
|
139
|
+
:close-on-content-click="false"
|
|
140
|
+
:open-on-click="false"
|
|
141
|
+
>
|
|
142
|
+
<template #activator="{ props }">
|
|
143
|
+
<v-text-field
|
|
144
|
+
ref="textFieldRef"
|
|
145
|
+
v-model="tempTime"
|
|
146
|
+
v-bind="$attrs"
|
|
147
|
+
@focus="onTextFieldFocus"
|
|
148
|
+
@blur="onTextFieldBlur"
|
|
149
|
+
@keydown="onTextFieldTyped"
|
|
150
|
+
@keyup.enter="onTextFieldEnterKey"
|
|
151
|
+
@click:clear="onTextFieldClear"
|
|
152
|
+
@click="toggleMenuOpen('textField')"
|
|
153
|
+
>
|
|
154
|
+
<template #append="{ isReadonly, isDisabled }">
|
|
155
|
+
<v-icon
|
|
156
|
+
:disabled="isReadonly.value || isDisabled.value"
|
|
157
|
+
v-bind="props"
|
|
158
|
+
@click="toggleMenuOpen('icon')"
|
|
159
|
+
>
|
|
160
|
+
fa:fa-regular fa-clock
|
|
161
|
+
</v-icon>
|
|
162
|
+
</template>
|
|
163
|
+
</v-text-field>
|
|
164
|
+
</template>
|
|
165
|
+
<Datepicker
|
|
166
|
+
v-model="time"
|
|
167
|
+
model-type="HH:mm:ss"
|
|
168
|
+
:enable-seconds="enableSeconds"
|
|
169
|
+
minutes-grid-increment="1"
|
|
170
|
+
time-picker
|
|
171
|
+
auto-apply
|
|
172
|
+
:close-on-auto-apply="false"
|
|
173
|
+
inline
|
|
174
|
+
:locale="locale"
|
|
175
|
+
@update:model-value="setDatePicker"
|
|
176
|
+
/>
|
|
177
|
+
</v-menu>
|
|
178
178
|
</template>
|