@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,208 +1,220 @@
1
- <script lang="ts" setup>
2
- import {ref, computed, watch, watchEffect, nextTick, useAttrs} from 'vue'
3
- import {union, isBoolean, isArray, isString, omit} from 'lodash-es'
4
- import { VTextField } from 'vuetify/components/VTextField'
5
- import { type dateFormat, Datetime } from '../../utils/datetime'
6
- import { useRules } from '../../composables/utils/validation'
7
-
8
- interface Props {
9
- modelValue?: string | null
10
- format?: dateFormat | string
11
- label?: string
12
- enableSeconds?: boolean
13
- rules?: typeof import('vuetify/components')['VTextField']['rules']
14
- dateRules?: typeof import('vuetify/components')['VTextField']['rules']
15
- timeRules?: typeof import('vuetify/components')['VTextField']['rules']
16
- dense?: boolean
17
- pickerOnly?: boolean
18
- minDate?: Date | string
19
- maxDate?: Date | string
20
- readonly?: boolean
21
- locale?: 'TH' | 'EN'
22
-
23
- defaultDate?: boolean | string,
24
- defaultDateTime?: boolean | string,
25
- fixedDate?: boolean
26
- }
27
-
28
- const props = withDefaults(defineProps<Props>(), {
29
- dense: false,
30
- locale: 'TH',
31
- enableSeconds: false,
32
- format: 'shortDate',
33
- pickerOnly: false,
34
- readonly: false,
35
- defaultDate: false,
36
- defaultDateTime: false,
37
- fixedDate: false,
38
- })
39
-
40
- const emit = defineEmits(['update:modelValue'])
41
-
42
- const attrs = useAttrs()
43
- const plainAttrs = computed(() => {
44
- return omit(attrs, ['modelValue', 'onUpdate:modelValue','defaultDate','defaultDateTime','fixedDate'])
45
- })
46
-
47
- const dateRef = ref<VTextField>()
48
- const timeRef = ref<VTextField>()
49
-
50
- const computedRules = computed(() => {
51
- const isoDateString = Datetime().fromString(`${datePart.value}T${timePart.value}`).toISO()
52
-
53
- if (props.rules && isArray(props.rules)) {
54
-
55
- const ruleConfig = {
56
- singleModifier: ['DateFuture', 'DatetimeFuture', 'DateHappen', 'DatetimeHappen'],
57
- twoPartModifier: ['DateAfter', 'DateBefore', 'DateEqual']
58
- };
59
-
60
- const ruleMapping : Record<string,Function> = {
61
- 'DateFuture' : useRules().DateFuture,
62
- 'DatetimeFuture' : useRules().DatetimeFuture,
63
- 'DateHappen' : useRules().DateHappen,
64
- 'DatetimeHappen' : useRules().DatetimeHappen,
65
- 'DateAfter' : useRules().DateAfter,
66
- 'DateBefore' : useRules().DatetimeFuture,
67
- 'DateEqual' : useRules().DateEqual,
68
- }
69
-
70
- const applyRule = (ruleName: string, modifier: any) => {
71
- if (props.readonly) return true
72
- const ruleFunc = ruleMapping[ruleName](...Object.values(modifier))
73
- return ruleFunc(isoDateString)
74
- };
75
-
76
- return props.rules.map((rule) => {
77
- if (isString(rule)) {
78
- const ruleParts = rule.split('#')
79
- const baseRule = ruleParts[0]
80
-
81
- if (ruleConfig.singleModifier.includes(baseRule)) {
82
- const modifiers = ruleParts.slice(1).join('#').trim() || undefined
83
- return applyRule(baseRule, { modifiers });
84
- }
85
-
86
- if (ruleConfig.twoPartModifier.includes(baseRule)) {
87
- const [modifier1, ...modifierRest] = ruleParts.slice(1)
88
- const combinedModifier = modifierRest.join('#') || undefined
89
- return applyRule(baseRule, { modifier1, combinedModifier })
90
- }
91
- }
92
- return rule
93
- })
94
- } else {
95
- return props.rules
96
- }
97
- })
98
-
99
- const computedDateRules = computed(() => union(computedRules.value, props.dateRules))
100
- const computedTimeRules = computed(() => union(computedRules.value, props.timeRules))
101
-
102
- const datePart = ref<string | null>(null)
103
- const timePart = ref<string | null>(null)
104
- const pauseEmit = ref(true)
105
-
106
- function reset() {
107
- datePart.value = null
108
- timePart.value = null
109
- if (props.defaultDateTime) {
110
- const dateTime = (isBoolean(props.defaultDateTime)) ? Datetime().now() : Datetime().fromString(props.defaultDateTime)
111
- if (dateTime.luxonDateTime.isValid) {
112
- datePart.value = dateTime.toFormat('yyyy-MM-dd')
113
- timePart.value = dateTime.toFormat('HH:mm:ss')
114
- }
115
- } else {
116
- if (props.defaultDate) {
117
- if (props.defaultDate === true) {
118
- datePart.value = Datetime().now().toFormat('yyyy-MM-dd', 'EN');
119
- } else if (typeof props.defaultDate === 'string' &&/^[+-]?\d+$/.test(props.defaultDate.trim())) {
120
- datePart.value = Datetime().now().luxonDateTime
121
- .plus({ days: Number(props.defaultDate) })
122
- .toFormat('yyyy-MM-dd');
123
- } else {
124
- const dateTime = Datetime().fromString(props.defaultDate)
125
- if (dateTime.luxonDateTime.isValid) datePart.value = dateTime.toFormat('yyyy-MM-dd')
126
- }
127
- }
128
- }
129
- }
130
-
131
- watchEffect(() => {
132
- if (!pauseEmit.value) {
133
- if (datePart.value && timePart.value) {
134
- emit('update:modelValue', Datetime().fromString(`${datePart.value}T${timePart.value}`).toISO())
135
- }
136
- else if (!datePart.value) {
137
- emit('update:modelValue', null)
138
- }
139
- }
140
- })
141
-
142
- watch(computedDateRules,()=>{
143
- if (!props.readonly) nextTick(()=>dateRef.value?.validate())
144
- },{
145
- deep: true
146
- })
147
-
148
- watch(computedTimeRules,()=>{
149
- if (!props.readonly) nextTick(()=>timeRef.value?.validate())
150
- },{
151
- deep: true
152
- })
153
-
154
- watch(() => props.modelValue, () => {
155
- pauseEmit.value = true
156
- if (!props.modelValue) {
157
- reset()
158
- }
159
- else {
160
- const dateTime = Datetime().fromString(props.modelValue)
161
- if (dateTime.luxonDateTime.isValid) {
162
- datePart.value = dateTime.toFormat('yyyy-MM-dd')
163
- timePart.value = dateTime.toFormat('HH:mm:ss')
164
- }
165
- else {
166
- reset()
167
- }
168
- }
169
- pauseEmit.value = false
170
- }, { immediate: true })
171
- </script>
172
-
173
- <template>
174
- <v-container
175
- :fluid="true"
176
- class="pa-0"
177
- >
178
- <v-row :dense="dense">
179
- <v-col cols="8">
180
- <FormDate
181
- v-model="datePart"
182
- ref="dateRef"
183
- :rules="computedDateRules"
184
- :label="label"
185
- :format="format"
186
- :picker-only="pickerOnly"
187
- :readonly="readonly"
188
- :disabled="fixedDate"
189
- :min-date="minDate"
190
- :max-date="maxDate"
191
- v-bind="plainAttrs"
192
- />
193
- </v-col>
194
- <v-col cols="4">
195
- <FormTime
196
- v-model="timePart"
197
- ref="timeRef"
198
- :rules="computedTimeRules"
199
- :label="label"
200
- :enable-seconds="enableSeconds"
201
- :picker-only="pickerOnly"
202
- :readonly="readonly"
203
- v-bind="plainAttrs"
204
- />
205
- </v-col>
206
- </v-row>
207
- </v-container>
208
- </template>
1
+ <script lang="ts" setup>
2
+ /**
3
+ * FormDateTime 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, computed, watch, watchEffect, nextTick, useAttrs} from 'vue'
7
+ import {union, isBoolean, isArray, isString, omit} from 'lodash-es'
8
+ import { VTextField } from 'vuetify/components/VTextField'
9
+ import { type dateFormat, Datetime } from '../../utils/datetime'
10
+ import { useRules } from '../../composables/utils/validation'
11
+
12
+ interface Props {
13
+ modelValue?: string | null // Bound value for v-model synchronization with the parent component.
14
+ format?: dateFormat | string // Output format used when converting the value for display or emit.
15
+ label?: string // UI label displayed to end users
16
+ enableSeconds?: boolean // Includes seconds selector in the time picker.
17
+ rules?: typeof import('vuetify/components')['VTextField']['rules'] // validation rules applied before accepting input
18
+ dateRules?: typeof import('vuetify/components')['VTextField']['rules'] // date value used by component logic and display
19
+ timeRules?: typeof import('vuetify/components')['VTextField']['rules'] // time value used by component logic and display
20
+ dense?: boolean // Configuration option used by DateTime.
21
+ pickerOnly?: boolean // forces value selection through picker interaction only
22
+ minDate?: Date | string // earliest selectable date allowed by business rules
23
+ maxDate?: Date | string // latest selectable date allowed by business rules
24
+ readonly?: boolean // renders as read-only while keeping value visible
25
+ locale?: 'TH' | 'EN' // Locale used for date/time formatting and localized labels.
26
+
27
+ defaultDate?: boolean | string, // default date behavior/value when model is initially empty
28
+ defaultDateTime?: boolean | string, // date value used by component logic and display
29
+ fixedDate?: boolean // date value used by component logic and display
30
+ }
31
+
32
+ /**
33
+ * Public props accepted by FormDateTime.
34
+ * Document each prop field with intent, defaults, and side effects for clear generated docs.
35
+ */
36
+ const props = withDefaults(defineProps<Props>(), {
37
+ dense: false,
38
+ locale: 'TH',
39
+ enableSeconds: false,
40
+ format: 'shortDate',
41
+ pickerOnly: false,
42
+ readonly: false,
43
+ defaultDate: false,
44
+ defaultDateTime: false,
45
+ fixedDate: false,
46
+ })
47
+
48
+ /**
49
+ * Custom events emitted by FormDateTime.
50
+ * Parents can listen to these events to react to user actions and internal state changes.
51
+ */
52
+ const emit = defineEmits(['update:modelValue'])
53
+
54
+ const attrs = useAttrs()
55
+ const plainAttrs = computed(() => {
56
+ return omit(attrs, ['modelValue', 'onUpdate:modelValue','defaultDate','defaultDateTime','fixedDate'])
57
+ })
58
+
59
+ const dateRef = ref<VTextField>()
60
+ const timeRef = ref<VTextField>()
61
+
62
+ const computedRules = computed(() => {
63
+ const isoDateString = Datetime().fromString(`${datePart.value}T${timePart.value}`).toISO()
64
+
65
+ if (props.rules && isArray(props.rules)) {
66
+
67
+ const ruleConfig = {
68
+ singleModifier: ['DateFuture', 'DatetimeFuture', 'DateHappen', 'DatetimeHappen'],
69
+ twoPartModifier: ['DateAfter', 'DateBefore', 'DateEqual']
70
+ };
71
+
72
+ const ruleMapping : Record<string,Function> = {
73
+ 'DateFuture' : useRules().DateFuture,
74
+ 'DatetimeFuture' : useRules().DatetimeFuture,
75
+ 'DateHappen' : useRules().DateHappen,
76
+ 'DatetimeHappen' : useRules().DatetimeHappen,
77
+ 'DateAfter' : useRules().DateAfter,
78
+ 'DateBefore' : useRules().DatetimeFuture,
79
+ 'DateEqual' : useRules().DateEqual,
80
+ }
81
+
82
+ const applyRule = (ruleName: string, modifier: any) => {
83
+ if (props.readonly) return true
84
+ const ruleFunc = ruleMapping[ruleName](...Object.values(modifier))
85
+ return ruleFunc(isoDateString)
86
+ };
87
+
88
+ return props.rules.map((rule) => {
89
+ if (isString(rule)) {
90
+ const ruleParts = rule.split('#')
91
+ const baseRule = ruleParts[0]
92
+
93
+ if (ruleConfig.singleModifier.includes(baseRule)) {
94
+ const modifiers = ruleParts.slice(1).join('#').trim() || undefined
95
+ return applyRule(baseRule, { modifiers });
96
+ }
97
+
98
+ if (ruleConfig.twoPartModifier.includes(baseRule)) {
99
+ const [modifier1, ...modifierRest] = ruleParts.slice(1)
100
+ const combinedModifier = modifierRest.join('#') || undefined
101
+ return applyRule(baseRule, { modifier1, combinedModifier })
102
+ }
103
+ }
104
+ return rule
105
+ })
106
+ } else {
107
+ return props.rules
108
+ }
109
+ })
110
+
111
+ const computedDateRules = computed(() => union(computedRules.value, props.dateRules))
112
+ const computedTimeRules = computed(() => union(computedRules.value, props.timeRules))
113
+
114
+ const datePart = ref<string | null>(null)
115
+ const timePart = ref<string | null>(null)
116
+ const pauseEmit = ref(true)
117
+
118
+ function reset() {
119
+ datePart.value = null
120
+ timePart.value = null
121
+ if (props.defaultDateTime) {
122
+ const dateTime = (isBoolean(props.defaultDateTime)) ? Datetime().now() : Datetime().fromString(props.defaultDateTime)
123
+ if (dateTime.luxonDateTime.isValid) {
124
+ datePart.value = dateTime.toFormat('yyyy-MM-dd')
125
+ timePart.value = dateTime.toFormat('HH:mm:ss')
126
+ }
127
+ } else {
128
+ if (props.defaultDate) {
129
+ if (props.defaultDate === true) {
130
+ datePart.value = Datetime().now().toFormat('yyyy-MM-dd', 'EN');
131
+ } else if (typeof props.defaultDate === 'string' &&/^[+-]?\d+$/.test(props.defaultDate.trim())) {
132
+ datePart.value = Datetime().now().luxonDateTime
133
+ .plus({ days: Number(props.defaultDate) })
134
+ .toFormat('yyyy-MM-dd');
135
+ } else {
136
+ const dateTime = Datetime().fromString(props.defaultDate)
137
+ if (dateTime.luxonDateTime.isValid) datePart.value = dateTime.toFormat('yyyy-MM-dd')
138
+ }
139
+ }
140
+ }
141
+ }
142
+
143
+ watchEffect(() => {
144
+ if (!pauseEmit.value) {
145
+ if (datePart.value && timePart.value) {
146
+ emit('update:modelValue', Datetime().fromString(`${datePart.value}T${timePart.value}`).toISO())
147
+ }
148
+ else if (!datePart.value) {
149
+ emit('update:modelValue', null)
150
+ }
151
+ }
152
+ })
153
+
154
+ watch(computedDateRules,()=>{
155
+ if (!props.readonly) nextTick(()=>dateRef.value?.validate())
156
+ },{
157
+ deep: true
158
+ })
159
+
160
+ watch(computedTimeRules,()=>{
161
+ if (!props.readonly) nextTick(()=>timeRef.value?.validate())
162
+ },{
163
+ deep: true
164
+ })
165
+
166
+ watch(() => props.modelValue, () => {
167
+ pauseEmit.value = true
168
+ if (!props.modelValue) {
169
+ reset()
170
+ }
171
+ else {
172
+ const dateTime = Datetime().fromString(props.modelValue)
173
+ if (dateTime.luxonDateTime.isValid) {
174
+ datePart.value = dateTime.toFormat('yyyy-MM-dd')
175
+ timePart.value = dateTime.toFormat('HH:mm:ss')
176
+ }
177
+ else {
178
+ reset()
179
+ }
180
+ }
181
+ pauseEmit.value = false
182
+ }, { immediate: true })
183
+ </script>
184
+
185
+ <template>
186
+ <v-container
187
+ :fluid="true"
188
+ class="pa-0"
189
+ >
190
+ <v-row :dense="dense">
191
+ <v-col cols="8">
192
+ <FormDate
193
+ v-model="datePart"
194
+ ref="dateRef"
195
+ :rules="computedDateRules"
196
+ :label="label"
197
+ :format="format"
198
+ :picker-only="pickerOnly"
199
+ :readonly="readonly"
200
+ :disabled="fixedDate"
201
+ :min-date="minDate"
202
+ :max-date="maxDate"
203
+ v-bind="plainAttrs"
204
+ />
205
+ </v-col>
206
+ <v-col cols="4">
207
+ <FormTime
208
+ v-model="timePart"
209
+ ref="timeRef"
210
+ :rules="computedTimeRules"
211
+ :label="label"
212
+ :enable-seconds="enableSeconds"
213
+ :picker-only="pickerOnly"
214
+ :readonly="readonly"
215
+ v-bind="plainAttrs"
216
+ />
217
+ </v-col>
218
+ </v-row>
219
+ </v-container>
220
+ </template>