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