@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.
- package/README.md +115 -96
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -0
- package/dist/runtime/components/Alert.vue +58 -54
- package/dist/runtime/components/BarcodeReader.vue +130 -122
- package/dist/runtime/components/ExportCSV.vue +110 -102
- package/dist/runtime/components/FileBtn.vue +79 -67
- package/dist/runtime/components/ImportCSV.vue +151 -139
- package/dist/runtime/components/MrzReader.vue +168 -0
- package/dist/runtime/components/SplitterPanel.vue +67 -59
- package/dist/runtime/components/TabsGroup.vue +39 -31
- package/dist/runtime/components/TextBarcode.vue +66 -54
- package/dist/runtime/components/device/IdCardButton.vue +95 -83
- package/dist/runtime/components/device/IdCardWebSocket.vue +207 -195
- package/dist/runtime/components/device/Scanner.vue +350 -338
- package/dist/runtime/components/dialog/Confirm.vue +112 -100
- package/dist/runtime/components/dialog/Host.vue +88 -84
- package/dist/runtime/components/dialog/Index.vue +84 -72
- package/dist/runtime/components/dialog/Loading.vue +51 -39
- package/dist/runtime/components/dialog/default/Confirm.vue +112 -100
- package/dist/runtime/components/dialog/default/Loading.vue +60 -48
- package/dist/runtime/components/dialog/default/Notify.vue +82 -70
- package/dist/runtime/components/dialog/default/Printing.vue +46 -34
- package/dist/runtime/components/dialog/default/VerifyUser.vue +144 -132
- package/dist/runtime/components/document/Form.vue +50 -42
- package/dist/runtime/components/document/TemplateBuilder.vue +536 -524
- package/dist/runtime/components/form/ActionPad.vue +156 -144
- package/dist/runtime/components/form/Birthdate.vue +116 -104
- package/dist/runtime/components/form/CheckboxGroup.vue +99 -87
- package/dist/runtime/components/form/CodeEditor.vue +45 -37
- package/dist/runtime/components/form/Date.vue +270 -258
- package/dist/runtime/components/form/DateTime.vue +220 -208
- package/dist/runtime/components/form/Dialog.vue +178 -166
- package/dist/runtime/components/form/EditPad.vue +157 -145
- package/dist/runtime/components/form/File.vue +295 -283
- package/dist/runtime/components/form/Hidden.vue +44 -32
- package/dist/runtime/components/form/Iterator.vue +538 -526
- package/dist/runtime/components/form/Login.vue +143 -131
- package/dist/runtime/components/form/Pad.vue +399 -387
- package/dist/runtime/components/form/SignPad.vue +226 -218
- package/dist/runtime/components/form/System.vue +34 -26
- package/dist/runtime/components/form/Table.vue +391 -379
- package/dist/runtime/components/form/TableData.vue +236 -224
- package/dist/runtime/components/form/Time.vue +177 -165
- package/dist/runtime/components/form/images/Capture.vue +245 -237
- package/dist/runtime/components/form/images/Edit.vue +133 -121
- package/dist/runtime/components/form/images/Field.vue +331 -320
- package/dist/runtime/components/form/images/Pad.vue +54 -42
- package/dist/runtime/components/label/Date.vue +37 -29
- package/dist/runtime/components/label/DateAgo.vue +102 -94
- package/dist/runtime/components/label/DateCount.vue +152 -144
- package/dist/runtime/components/label/Field.vue +111 -103
- package/dist/runtime/components/label/FormatMoney.vue +37 -29
- package/dist/runtime/components/label/Mask.vue +46 -38
- package/dist/runtime/components/label/Object.vue +21 -13
- package/dist/runtime/components/master/Autocomplete.vue +89 -81
- package/dist/runtime/components/master/Combobox.vue +88 -80
- package/dist/runtime/components/master/RadioGroup.vue +90 -78
- package/dist/runtime/components/master/Select.vue +70 -62
- package/dist/runtime/components/master/label.vue +55 -47
- package/dist/runtime/components/model/Autocomplete.vue +91 -79
- package/dist/runtime/components/model/Combobox.vue +90 -78
- package/dist/runtime/components/model/Pad.vue +114 -102
- package/dist/runtime/components/model/Select.vue +78 -72
- package/dist/runtime/components/model/Table.vue +370 -358
- package/dist/runtime/components/model/iterator.vue +497 -489
- package/dist/runtime/components/model/label.vue +58 -50
- package/dist/runtime/components/pdf/Print.vue +75 -63
- package/dist/runtime/components/pdf/View.vue +146 -134
- package/dist/runtime/composables/alert.d.ts +4 -0
- package/dist/runtime/composables/api.d.ts +4 -0
- package/dist/runtime/composables/dialog.d.ts +1 -1
- package/dist/runtime/composables/document/templateFormHidden.d.ts +4 -0
- 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/localStorageModel.d.ts +4 -0
- package/dist/runtime/composables/lookupList.d.ts +4 -0
- package/dist/runtime/composables/menu.d.ts +4 -0
- package/dist/runtime/composables/useMrzReader.d.ts +48 -0
- package/dist/runtime/composables/useMrzReader.js +423 -0
- package/dist/runtime/composables/useTesseract.d.ts +16 -0
- package/dist/runtime/composables/useTesseract.js +45 -0
- 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/dist/runtime/utils/asset.d.ts +2 -0
- package/dist/runtime/utils/asset.js +49 -0
- package/package.json +131 -122
- package/scripts/enrich-vue-docs-from-ai.mjs +197 -0
- package/scripts/generate-ai-summary.mjs +321 -0
- package/scripts/generate-composables-md.mjs +129 -0
- package/scripts/postInstall.cjs +70 -70
- package/templates/.codegen/codegen.ts +32 -32
- package/templates/.codegen/plugin-schema-object.js +161 -161
- package/templates/public/tesseract/mrz.traineddata.gz +0 -0
- package/templates/public/tesseract/ocrb.traineddata.gz +0 -0
|
@@ -1,208 +1,220 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
watch(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
:
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
:
|
|
199
|
-
:
|
|
200
|
-
:
|
|
201
|
-
:
|
|
202
|
-
:
|
|
203
|
-
v-bind="plainAttrs"
|
|
204
|
-
/>
|
|
205
|
-
</v-col>
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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>
|