@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,224 +1,236 @@
1
- <script lang="ts" setup>
2
- import {VDataTable} from 'vuetify/components/VDataTable'
3
- import {VInput} from 'vuetify/components/VInput'
4
- import {computed, defineOptions,defineExpose, ref, useAttrs, watch, useTemplateRef} from 'vue'
5
- import {cloneDeep, isEqual, omit, isArray, isString} from 'lodash-es'
6
- import {templateItemToString} from "../../composables/document/template";
7
- import {templateToHeader} from "../../composables/document/templateFormTable";
8
- import { useLocalStorageModel, type PersistSlimProps } from '../../composables/localStorageModel'
9
-
10
- defineOptions({
11
- inheritAttrs: false,
12
- })
13
-
14
- interface Props extends /* @vue-ignore */ InstanceType<typeof VDataTable['$props']> {
15
- title: string
16
- noDataText?: string
17
- modelValue?: Record<string, any>[]
18
- modelKey?: string
19
- toolbarColor?: string
20
- headers : Record<string, any>[]
21
- itemsInitial : Record<string, any>[]
22
- dataTemplate?: string | object
23
- disableApplyToAll?: boolean | string | string[]
24
- }
25
-
26
- const props = withDefaults(defineProps<Props & PersistSlimProps>(), {
27
- noDataText: 'ไม่พบข้อมูล',
28
- modelKey: 'id',
29
- toolbarColor: 'primary',
30
- disableApplyToAll: false,
31
- })
32
-
33
- const emit = defineEmits(['update:modelValue'])
34
- const attrs = useAttrs()
35
- const plainAttrs = computed(() => {
36
- return omit(attrs, ['modelValue','items','onUpdate:modelValue','itemsInitial','dataTemplate'])
37
- })
38
-
39
- const inputRef = useTemplateRef<VInput>("inputRef")
40
-
41
- const itemsInternal = ref<Record<string, any>[]>([])
42
- const itemsApplyAll = ref<Record<string, any>>({})
43
-
44
- useLocalStorageModel(itemsInternal,props)
45
-
46
- const computedDisableApplyToAll = computed(()=>{
47
- if (isString(props.disableApplyToAll)) {
48
- return props.disableApplyToAll.split(',').map(i=>i.trim())
49
- }
50
- return props.disableApplyToAll
51
- })
52
- const canApplyAll = (variableName: string) => {
53
- if (isArray(computedDisableApplyToAll.value)) return !computedDisableApplyToAll.value.includes(variableName)
54
- return !computedDisableApplyToAll.value
55
- }
56
-
57
- watch(() => props.modelValue, (newValue) => {
58
- if (!Array.isArray(newValue) || !newValue.every(item => typeof item === 'object')) {
59
- itemsInternal.value = cloneDeep(props.itemsInitial)
60
- }
61
- else {
62
- let maxKey = 0
63
-
64
- newValue.forEach((item) => {
65
- if (!item.hasOwnProperty(props.modelKey)) {
66
- maxKey = Math.max(maxKey, ...newValue.map(i => i[props.modelKey] || 0))
67
- item[props.modelKey] = maxKey + 1
68
- }
69
- })
70
-
71
- itemsInternal.value = newValue
72
- }
73
- }, { immediate: true })
74
-
75
- watch(()=>props.itemsInitial, (newValue,oldValue)=>{
76
- if (!isEqual(newValue,oldValue)) itemsInternal.value = cloneDeep(props.itemsInitial)
77
- },{immediate:true,deep:true})
78
-
79
- watch(itemsInternal, () => {
80
- emit('update:modelValue', itemsInternal.value)
81
- }, { deep: true })
82
-
83
- watch(itemsApplyAll, () => {
84
- itemsInternal.value = itemsInternal.value?.map((item) => {
85
- return Object.assign(item, itemsApplyAll.value)
86
- })
87
- },{deep:true})
88
-
89
- const computedHeaders = computed(()=>{
90
- let dataHeaders = templateToHeader(props.dataTemplate)
91
- let combinedHeaders = [...props.headers, ...dataHeaders]
92
- return combinedHeaders.map((header: any) => {
93
- return {...header,headerProps:
94
- {
95
- style: 'font-weight: 800'
96
- }
97
- }
98
- })
99
- })
100
-
101
- const computedDataTemplate = computed(()=>{
102
- let template = cloneDeep(props.dataTemplate)
103
- if (isString(props.dataTemplate)) {
104
- try {
105
- template = JSON.parse(props.dataTemplate)
106
- } catch (e) {
107
- void e
108
- }
109
- }
110
- if (isArray(template)) {
111
- return template.map((t: any) => {
112
- const out = { ...t }
113
- let s = out.inputAttributes?.trim() || ""
114
- if (!/(^|\s)hide-details(\s|$)/.test(s) && !/(^|\s)hideDetails(\s|$)/.test(s)) {
115
- s = `${s} hide-details`.trim()
116
- }
117
- out.inputAttributes = s
118
- return out
119
- })
120
- }
121
- return []
122
- })
123
-
124
- const reset = ()=>{
125
- inputRef.value?.reset()
126
- itemsApplyAll.value = {}
127
- }
128
-
129
- const isValid = computed(()=>{
130
- return inputRef.value?.isValid
131
- })
132
-
133
- const errorMessages = computed(()=>{
134
- return inputRef.value?.errorMessages
135
- })
136
-
137
- const operation = ref({reset})
138
-
139
- defineExpose({
140
- errorMessages,
141
- isValid,
142
- reset,
143
- resetValidation : ()=>inputRef.value?.resetValidation(),
144
- validate : ()=>inputRef.value?.validate(),
145
- operation
146
- })
147
- </script>
148
-
149
- <template>
150
- <v-input v-model="itemsInternal" v-bind="plainAttrs" ref="inputRef">
151
- <template #default="{isReadonly,isDisabled}">
152
- <v-container fluid class="ma-0 pa-0">
153
- <v-card>
154
- <slot
155
- name="header"
156
- :items="itemsInternal"
157
- :operation="operation"
158
- >
159
- <VToolbar :color="toolbarColor">
160
- <v-row
161
- justify="end"
162
- class="ma-1"
163
- dense
164
- no-gutters
165
- align="center"
166
- >
167
- <v-col>
168
- <VToolbarTitle class="pl-3">
169
- <slot name="title">
170
- {{ title }}
171
- </slot>
172
- </VToolbarTitle>
173
- </v-col>
174
- </v-row>
175
-
176
- <VToolbarItems>
177
- <slot name="toolbarItems" :items="itemsInternal" :operation="operation"/>
178
- <VBtn
179
- :color="toolbarColor"
180
- icon="mdi:mdi-restore"
181
- variant="flat"
182
- @click="reset()"
183
- >
184
- </VBtn>
185
- </VToolbarItems>
186
- </VToolbar>
187
- </slot>
188
- <v-data-table
189
- v-bind="plainAttrs"
190
- color="primary"
191
- :items="itemsInternal"
192
- :headers="computedHeaders"
193
- disable-sort
194
- hide-default-footer
195
- >
196
- <!-- @ts-ignore -->
197
- <template
198
- v-for="(_, name, index) in ($slots as {})"
199
- :key="index"
200
- #[name]="slotData"
201
- >
202
- <slot
203
- :name="name"
204
- v-bind="((slotData || {}) as object)"
205
- :operation="operation"
206
- :isReadonly="isReadonly"
207
- :isDisabled="isDisabled"
208
- />
209
- </template>
210
-
211
- <template v-for="template in computedDataTemplate" :key="template.variableName" #[`header.${template.variableName}`]="props">
212
- <form-pad v-model="itemsApplyAll" :template="templateItemToString(template,[])" v-if="canApplyAll(template.variableName)"></form-pad>
213
- <template v-else>{{props.column.title}}</template>
214
- </template>
215
-
216
- <template v-for="template in computedDataTemplate" :key="template.variableName" #[`item.${template.variableName}`]="{index}">
217
- <form-pad v-model="itemsInternal[index]" :template="templateItemToString(template,[])"></form-pad>
218
- </template>
219
- </v-data-table>
220
- </v-card>
221
- </v-container>
222
- </template>
223
- </v-input>
224
- </template>
1
+ <script lang="ts" setup>
2
+ /**
3
+ * FormTableData 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 {VDataTable} from 'vuetify/components/VDataTable'
7
+ import {VInput} from 'vuetify/components/VInput'
8
+ import {computed, defineOptions,defineExpose, ref, useAttrs, watch, useTemplateRef} from 'vue'
9
+ import {cloneDeep, isEqual, omit, isArray, isString} from 'lodash-es'
10
+ import {templateItemToString} from "../../composables/document/template";
11
+ import {templateToHeader} from "../../composables/document/templateFormTable";
12
+ import { useLocalStorageModel, type PersistSlimProps } from '../../composables/localStorageModel'
13
+
14
+ defineOptions({
15
+ inheritAttrs: false,
16
+ })
17
+
18
+ interface Props extends /* @vue-ignore */ InstanceType<typeof VDataTable['$props']> {
19
+ title: string // Title text displayed in the component header or dialog.
20
+ noDataText?: string // Fallback message shown when there is no data to display.
21
+ modelValue?: Record<string, any>[] // Bound value for v-model synchronization with the parent component.
22
+ modelKey?: string // Primary key field name used to track row identity.
23
+ toolbarColor?: string // Vuetify color name applied to toolbar and action areas.
24
+ headers: Record<string, any>[] // Column definitions used to render table headers and field mapping.
25
+ itemsInitial: Record<string, any>[] // Initial rows used before external data is loaded.
26
+ dataTemplate?: string | object // Template object/string used to seed new row data.
27
+ disableApplyToAll?: boolean | string | string[] // Disables apply-to-all behavior globally or for selected field keys.
28
+ }
29
+
30
+ /**
31
+ * Public props accepted by FormTableData.
32
+ * Document each prop field with intent, defaults, and side effects for clear generated docs.
33
+ */
34
+ const props = withDefaults(defineProps<Props & PersistSlimProps>(), {
35
+ noDataText: 'ไม่พบข้อมูล',
36
+ modelKey: 'id',
37
+ toolbarColor: 'primary',
38
+ disableApplyToAll: false,
39
+ })
40
+
41
+ /**
42
+ * Custom events emitted by FormTableData.
43
+ * Parents can listen to these events to react to user actions and internal state changes.
44
+ */
45
+ const emit = defineEmits(['update:modelValue'])
46
+ const attrs = useAttrs()
47
+ const plainAttrs = computed(() => {
48
+ return omit(attrs, ['modelValue','items','onUpdate:modelValue','itemsInitial','dataTemplate'])
49
+ })
50
+
51
+ const inputRef = useTemplateRef<VInput>("inputRef")
52
+
53
+ const itemsInternal = ref<Record<string, any>[]>([])
54
+ const itemsApplyAll = ref<Record<string, any>>({})
55
+
56
+ useLocalStorageModel(itemsInternal,props)
57
+
58
+ const computedDisableApplyToAll = computed(()=>{
59
+ if (isString(props.disableApplyToAll)) {
60
+ return props.disableApplyToAll.split(',').map(i=>i.trim())
61
+ }
62
+ return props.disableApplyToAll
63
+ })
64
+ const canApplyAll = (variableName: string) => {
65
+ if (isArray(computedDisableApplyToAll.value)) return !computedDisableApplyToAll.value.includes(variableName)
66
+ return !computedDisableApplyToAll.value
67
+ }
68
+
69
+ watch(() => props.modelValue, (newValue) => {
70
+ if (!Array.isArray(newValue) || !newValue.every(item => typeof item === 'object')) {
71
+ itemsInternal.value = cloneDeep(props.itemsInitial)
72
+ }
73
+ else {
74
+ let maxKey = 0
75
+
76
+ newValue.forEach((item) => {
77
+ if (!item.hasOwnProperty(props.modelKey)) {
78
+ maxKey = Math.max(maxKey, ...newValue.map(i => i[props.modelKey] || 0))
79
+ item[props.modelKey] = maxKey + 1
80
+ }
81
+ })
82
+
83
+ itemsInternal.value = newValue
84
+ }
85
+ }, { immediate: true })
86
+
87
+ watch(()=>props.itemsInitial, (newValue,oldValue)=>{
88
+ if (!isEqual(newValue,oldValue)) itemsInternal.value = cloneDeep(props.itemsInitial)
89
+ },{immediate:true,deep:true})
90
+
91
+ watch(itemsInternal, () => {
92
+ emit('update:modelValue', itemsInternal.value)
93
+ }, { deep: true })
94
+
95
+ watch(itemsApplyAll, () => {
96
+ itemsInternal.value = itemsInternal.value?.map((item) => {
97
+ return Object.assign(item, itemsApplyAll.value)
98
+ })
99
+ },{deep:true})
100
+
101
+ const computedHeaders = computed(()=>{
102
+ let dataHeaders = templateToHeader(props.dataTemplate)
103
+ let combinedHeaders = [...props.headers, ...dataHeaders]
104
+ return combinedHeaders.map((header: any) => {
105
+ return {...header,headerProps:
106
+ {
107
+ style: 'font-weight: 800'
108
+ }
109
+ }
110
+ })
111
+ })
112
+
113
+ const computedDataTemplate = computed(()=>{
114
+ let template = cloneDeep(props.dataTemplate)
115
+ if (isString(props.dataTemplate)) {
116
+ try {
117
+ template = JSON.parse(props.dataTemplate)
118
+ } catch (e) {
119
+ void e
120
+ }
121
+ }
122
+ if (isArray(template)) {
123
+ return template.map((t: any) => {
124
+ const out = { ...t }
125
+ let s = out.inputAttributes?.trim() || ""
126
+ if (!/(^|\s)hide-details(\s|$)/.test(s) && !/(^|\s)hideDetails(\s|$)/.test(s)) {
127
+ s = `${s} hide-details`.trim()
128
+ }
129
+ out.inputAttributes = s
130
+ return out
131
+ })
132
+ }
133
+ return []
134
+ })
135
+
136
+ const reset = ()=>{
137
+ inputRef.value?.reset()
138
+ itemsApplyAll.value = {}
139
+ }
140
+
141
+ const isValid = computed(()=>{
142
+ return inputRef.value?.isValid
143
+ })
144
+
145
+ const errorMessages = computed(()=>{
146
+ return inputRef.value?.errorMessages
147
+ })
148
+
149
+ const operation = ref({reset})
150
+
151
+ defineExpose({
152
+ errorMessages,
153
+ isValid,
154
+ reset,
155
+ resetValidation : ()=>inputRef.value?.resetValidation(),
156
+ validate : ()=>inputRef.value?.validate(),
157
+ operation
158
+ })
159
+ </script>
160
+
161
+ <template>
162
+ <v-input v-model="itemsInternal" v-bind="plainAttrs" ref="inputRef">
163
+ <template #default="{isReadonly,isDisabled}">
164
+ <v-container fluid class="ma-0 pa-0">
165
+ <v-card>
166
+ <slot
167
+ name="header"
168
+ :items="itemsInternal"
169
+ :operation="operation"
170
+ >
171
+ <VToolbar :color="toolbarColor">
172
+ <v-row
173
+ justify="end"
174
+ class="ma-1"
175
+ dense
176
+ no-gutters
177
+ align="center"
178
+ >
179
+ <v-col>
180
+ <VToolbarTitle class="pl-3">
181
+ <slot name="title">
182
+ {{ title }}
183
+ </slot>
184
+ </VToolbarTitle>
185
+ </v-col>
186
+ </v-row>
187
+
188
+ <VToolbarItems>
189
+ <slot name="toolbarItems" :items="itemsInternal" :operation="operation"/>
190
+ <VBtn
191
+ :color="toolbarColor"
192
+ icon="mdi:mdi-restore"
193
+ variant="flat"
194
+ @click="reset()"
195
+ >
196
+ </VBtn>
197
+ </VToolbarItems>
198
+ </VToolbar>
199
+ </slot>
200
+ <v-data-table
201
+ v-bind="plainAttrs"
202
+ color="primary"
203
+ :items="itemsInternal"
204
+ :headers="computedHeaders"
205
+ disable-sort
206
+ hide-default-footer
207
+ >
208
+ <!-- @ts-ignore -->
209
+ <template
210
+ v-for="(_, name, index) in ($slots as {})"
211
+ :key="index"
212
+ #[name]="slotData"
213
+ >
214
+ <slot
215
+ :name="name"
216
+ v-bind="((slotData || {}) as object)"
217
+ :operation="operation"
218
+ :isReadonly="isReadonly"
219
+ :isDisabled="isDisabled"
220
+ />
221
+ </template>
222
+
223
+ <template v-for="template in computedDataTemplate" :key="template.variableName" #[`header.${template.variableName}`]="props">
224
+ <form-pad v-model="itemsApplyAll" :template="templateItemToString(template,[])" v-if="canApplyAll(template.variableName)"></form-pad>
225
+ <template v-else>{{props.column.title}}</template>
226
+ </template>
227
+
228
+ <template v-for="template in computedDataTemplate" :key="template.variableName" #[`item.${template.variableName}`]="{index}">
229
+ <form-pad v-model="itemsInternal[index]" :template="templateItemToString(template,[])"></form-pad>
230
+ </template>
231
+ </v-data-table>
232
+ </v-card>
233
+ </v-container>
234
+ </template>
235
+ </v-input>
236
+ </template>