@ederzeel/nuxt-schema-form-nightly 0.1.0-29118956.9ee4a3d → 0.1.0-29119026.5bb3293
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/dist/runtime/components/Array.vue +41 -24
- package/dist/runtime/components/Component.vue +126 -10
- package/dist/runtime/components/Date.vue +0 -1
- package/dist/runtime/components/Object.vue +11 -4
- package/dist/runtime/components/Toggle.vue +0 -1
- package/dist/runtime/types/index.d.ts +6 -0
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@ import SComponent from './Component.vue'
|
|
|
4
4
|
import { ref, computed, h, resolveComponent } from 'vue'
|
|
5
5
|
import type { TableColumn } from '@nuxt/ui'
|
|
6
6
|
import type { Row } from '@tanstack/vue-table'
|
|
7
|
+
import type { PropertiesType } from '../types'
|
|
7
8
|
|
|
8
9
|
const UDropdownMenu = resolveComponent('UDropdownMenu')
|
|
9
10
|
const UButton = resolveComponent('UButton')
|
|
@@ -24,13 +25,6 @@ const props = defineProps<{
|
|
|
24
25
|
}>()
|
|
25
26
|
const emit = defineEmits(['update:modelValue', 'submit'])
|
|
26
27
|
|
|
27
|
-
type PropertiesType = {
|
|
28
|
-
properties: {
|
|
29
|
-
[key: string]: unknown
|
|
30
|
-
}
|
|
31
|
-
[key: string]: unknown
|
|
32
|
-
}
|
|
33
|
-
|
|
34
28
|
const massActions = [
|
|
35
29
|
[
|
|
36
30
|
{
|
|
@@ -204,8 +198,15 @@ const massRemove = () => {
|
|
|
204
198
|
<div>
|
|
205
199
|
<div class="flex justify-between items-center w-full px-4 py-3">
|
|
206
200
|
<div class="flex gap-1.5 items-center">
|
|
207
|
-
<UButton
|
|
208
|
-
|
|
201
|
+
<UButton
|
|
202
|
+
v-if="edit"
|
|
203
|
+
:disabled="maxItems && values.length >= maxItems"
|
|
204
|
+
@click="add"
|
|
205
|
+
icon="i-heroicons-plus"
|
|
206
|
+
trailing
|
|
207
|
+
color="neutral"
|
|
208
|
+
size="xs"
|
|
209
|
+
/>
|
|
209
210
|
</div>
|
|
210
211
|
<div class="flex gap-1.5 items-center">
|
|
211
212
|
<UDropdownMenu v-if="selectedRows.length > 0" :items="massActions">
|
|
@@ -215,13 +216,19 @@ const massRemove = () => {
|
|
|
215
216
|
</div>
|
|
216
217
|
<UTable v-bind="options" by="__id" :data="values" :columns="columns" class="flex-1">
|
|
217
218
|
<template #expanded="{ row }">
|
|
218
|
-
{{ row }}
|
|
219
219
|
<div class="p-4">
|
|
220
|
-
<SComponent
|
|
221
|
-
:
|
|
222
|
-
|
|
220
|
+
<SComponent
|
|
221
|
+
:id="id.length <= 0 ? `${row.index}` : `${id}[${row.index}]`"
|
|
222
|
+
:model-value="row.original"
|
|
223
|
+
:json-schema-path="
|
|
224
|
+
jsonSchemaPath?.length <= 0 ? `properties.${row.index}` : `${jsonSchemaPath}[${row.index}]`
|
|
225
|
+
"
|
|
226
|
+
v-bind="items"
|
|
227
|
+
:isRequired="false"
|
|
228
|
+
class="mt-4"
|
|
223
229
|
@update:model-value="(event: Record<string, unknown>) => onInput(event, row.index)"
|
|
224
|
-
@submit="() => emit('submit')"
|
|
230
|
+
@submit="() => emit('submit')"
|
|
231
|
+
/>
|
|
225
232
|
</div>
|
|
226
233
|
</template>
|
|
227
234
|
</UTable>
|
|
@@ -229,18 +236,28 @@ const massRemove = () => {
|
|
|
229
236
|
<UModal v-model:open="model.open">
|
|
230
237
|
<template #content>
|
|
231
238
|
<UCard>
|
|
232
|
-
<SComponent
|
|
233
|
-
:
|
|
234
|
-
|
|
239
|
+
<SComponent
|
|
240
|
+
:id="id.length <= 0 ? `${model.index}` : `${id}[0]`"
|
|
241
|
+
:model-value="model.value"
|
|
242
|
+
:json-schema-path="
|
|
243
|
+
jsonSchemaPath?.length <= 0 ? `properties.${model.index}` : `${jsonSchemaPath}[${model.index}]`
|
|
244
|
+
"
|
|
245
|
+
v-bind="items"
|
|
246
|
+
:isRequired="false"
|
|
247
|
+
class="mt-4"
|
|
235
248
|
@update:model-value="(event: Record<string, unknown>) => (model.value = event)"
|
|
236
|
-
@submit="() => emit('submit')"
|
|
249
|
+
@submit="() => emit('submit')"
|
|
250
|
+
/>
|
|
237
251
|
<template #footer>
|
|
238
|
-
<UButton
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
252
|
+
<UButton
|
|
253
|
+
@click="
|
|
254
|
+
() => {
|
|
255
|
+
onInput(model.value, model.index)
|
|
256
|
+
model.open = false
|
|
257
|
+
}
|
|
258
|
+
"
|
|
259
|
+
>Save</UButton
|
|
260
|
+
>
|
|
244
261
|
</template>
|
|
245
262
|
</UCard>
|
|
246
263
|
</template>
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
|
-
import {
|
|
2
|
+
import { h, resolveComponent } from 'vue'
|
|
3
3
|
import SObject from './Object.vue'
|
|
4
4
|
import SDate from './Date.vue'
|
|
5
5
|
import SToggle from './Toggle.vue'
|
|
6
6
|
import SArray from './Array.vue'
|
|
7
7
|
import SInputNumber from './InputNumber.vue'
|
|
8
8
|
import SInputField from './InputField.vue'
|
|
9
|
+
import type { PropertiesType } from '../types'
|
|
10
|
+
import type { TableColumn } from '@nuxt/ui'
|
|
9
11
|
|
|
10
12
|
type Properties = {
|
|
11
13
|
properties?: { [key: string]: unknown }
|
|
@@ -24,11 +26,12 @@ export type SComponentProps = {
|
|
|
24
26
|
jsonSchemaPath?: string
|
|
25
27
|
required?: string[]
|
|
26
28
|
isRequired: boolean
|
|
27
|
-
items?:
|
|
29
|
+
items?: PropertiesType[]
|
|
28
30
|
edit?: boolean
|
|
29
31
|
minItems?: number
|
|
30
32
|
maxItems?: number
|
|
31
33
|
editInline?: boolean
|
|
34
|
+
columns?: TableColumn<{}>[]
|
|
32
35
|
validateFields?: (fields: string[]) => Promise<boolean>
|
|
33
36
|
}
|
|
34
37
|
|
|
@@ -36,20 +39,133 @@ const props = withDefaults(defineProps<SComponentProps>(), { id: '', jsonSchemaP
|
|
|
36
39
|
const value = defineModel<unknown>({ required: true })
|
|
37
40
|
const emit = defineEmits(['submit'])
|
|
38
41
|
|
|
39
|
-
const options = computed(() => ({
|
|
40
|
-
...props,
|
|
41
|
-
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`
|
|
42
|
-
}))
|
|
43
42
|
const onSubmit = () => {
|
|
44
43
|
emit('submit')
|
|
45
44
|
}
|
|
45
|
+
|
|
46
|
+
const Render = () => {
|
|
47
|
+
const { type, renderer, format } = props
|
|
48
|
+
if (type == null || (renderer != null && renderer === 'none')) {
|
|
49
|
+
return undefined
|
|
50
|
+
} else if (renderer) {
|
|
51
|
+
return h(resolveComponent(renderer), {
|
|
52
|
+
...props,
|
|
53
|
+
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`,
|
|
54
|
+
onSubmit,
|
|
55
|
+
// is: typeof renderer === 'string' ? renderer : undefined,
|
|
56
|
+
modelValue: value.value,
|
|
57
|
+
'onUpdate:modelValue': (v: unknown) => {
|
|
58
|
+
value.value = v
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
} else if (type === 'string') {
|
|
62
|
+
if (format === 'full-date') {
|
|
63
|
+
return h(SDate, {
|
|
64
|
+
id: props.id,
|
|
65
|
+
title: props.title,
|
|
66
|
+
description: props.description,
|
|
67
|
+
type: props.type,
|
|
68
|
+
isRequired: props.isRequired,
|
|
69
|
+
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`,
|
|
70
|
+
modelValue: value.value as string,
|
|
71
|
+
'onUpdate:modelValue': (v: string) => {
|
|
72
|
+
value.value = v
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
} else {
|
|
76
|
+
return h(SInputField, {
|
|
77
|
+
id: props.id,
|
|
78
|
+
title: props.title,
|
|
79
|
+
isRequired: props.isRequired,
|
|
80
|
+
type,
|
|
81
|
+
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`,
|
|
82
|
+
modelValue: value.value as string,
|
|
83
|
+
'onUpdate:modelValue': (v: string) => {
|
|
84
|
+
value.value = v
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
} else if (type === 'number' || type === 'integer') {
|
|
89
|
+
return h(SInputNumber, {
|
|
90
|
+
id: props.id,
|
|
91
|
+
title: props.title,
|
|
92
|
+
description: props.description,
|
|
93
|
+
type,
|
|
94
|
+
isRequired: props.isRequired,
|
|
95
|
+
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`,
|
|
96
|
+
modelValue: value.value as number,
|
|
97
|
+
'onUpdate:modelValue': (v: number) => {
|
|
98
|
+
value.value = v
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
} else if (type === 'boolean') {
|
|
102
|
+
return h(SToggle, {
|
|
103
|
+
id: props.id,
|
|
104
|
+
title: props.title,
|
|
105
|
+
description: props.description,
|
|
106
|
+
isRequired: props.isRequired,
|
|
107
|
+
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`,
|
|
108
|
+
modelValue: value.value as boolean,
|
|
109
|
+
'onUpdate:modelValue': (v: boolean) => {
|
|
110
|
+
value.value = v
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
} else if (type === 'object') {
|
|
114
|
+
if (!props.properties) throw new Error('object is missing properties')
|
|
115
|
+
if (!props.required) throw new Error('object is missing required')
|
|
116
|
+
|
|
117
|
+
return h(SObject, {
|
|
118
|
+
id: props.id,
|
|
119
|
+
title: props.title,
|
|
120
|
+
description: props.description,
|
|
121
|
+
properties: props.properties,
|
|
122
|
+
required: props.required,
|
|
123
|
+
isRequired: props.isRequired,
|
|
124
|
+
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`,
|
|
125
|
+
onSubmit,
|
|
126
|
+
modelValue: value.value as Record<string, unknown>,
|
|
127
|
+
'onUpdate:modelValue': (v: Record<string, unknown>) => {
|
|
128
|
+
value.value = v
|
|
129
|
+
}
|
|
130
|
+
})
|
|
131
|
+
} else if (type === 'array') {
|
|
132
|
+
if (!props.items) throw new Error('array has no items')
|
|
133
|
+
|
|
134
|
+
return h(SArray, {
|
|
135
|
+
id: props.id,
|
|
136
|
+
title: props.title,
|
|
137
|
+
description: props.description,
|
|
138
|
+
items: props.items,
|
|
139
|
+
isRequired: props.isRequired,
|
|
140
|
+
minItems: props.minItems,
|
|
141
|
+
maxItems: props.maxItems,
|
|
142
|
+
edit: props.edit,
|
|
143
|
+
columns: props.columns,
|
|
144
|
+
editInline: props.editInline,
|
|
145
|
+
jsonSchemaPath: `${props.jsonSchemaPath}.${props.id}`,
|
|
146
|
+
onSubmit,
|
|
147
|
+
modelValue: value.value as Record<string, unknown>[],
|
|
148
|
+
'onUpdate:modelValue': (v: string) => {
|
|
149
|
+
value.value = v
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
return undefined
|
|
154
|
+
}
|
|
46
155
|
</script>
|
|
47
156
|
|
|
48
157
|
<template>
|
|
49
158
|
<div class="s-form-group">
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
159
|
+
<Render />
|
|
160
|
+
|
|
161
|
+
<!--<template v-if="renderer != null && renderer === 'none'">{{ undefined }}</template>
|
|
162
|
+
<component
|
|
163
|
+
v-else-if="renderer"
|
|
164
|
+
v-bind="options"
|
|
165
|
+
v-model="value"
|
|
166
|
+
:is="typeof renderer === 'string' ? renderer : undefined"
|
|
167
|
+
@submit="onSubmit"
|
|
168
|
+
/>
|
|
53
169
|
|
|
54
170
|
<SDate v-else-if="type === 'string' && format === 'full-date'" v-bind="options" v-model="value" />
|
|
55
171
|
<SInputNumber v-else-if="type === 'number' || type === 'integer'" v-bind="options" v-model="value" />
|
|
@@ -57,6 +173,6 @@ const onSubmit = () => {
|
|
|
57
173
|
<SToggle v-else-if="type === 'boolean'" v-bind="options" v-model="value" />
|
|
58
174
|
<SObject v-else-if="type === 'object'" v-bind="options" v-model="value" @submit="onSubmit" />
|
|
59
175
|
<SArray v-else-if="type === 'array'" v-bind="options" v-model="value" />
|
|
60
|
-
<div v-else>else</div
|
|
176
|
+
<div v-else>else</div>-->
|
|
61
177
|
</div>
|
|
62
178
|
</template>
|
|
@@ -26,10 +26,17 @@ const onInput = (value: unknown, key: string) => {
|
|
|
26
26
|
<h2 v-if="props.title" class="mb-4 text-2xl leading-none tracking-tight">{{ props.title }}</h2>
|
|
27
27
|
<p v-if="props.description" class="mb-4">{{ props.description }}</p>
|
|
28
28
|
|
|
29
|
-
<SComponent
|
|
30
|
-
|
|
29
|
+
<SComponent
|
|
30
|
+
v-for="[key, options] of Object.entries(properties)"
|
|
31
|
+
:id="id.length <= 0 ? `${key}` : `${id}.${key}`"
|
|
32
|
+
:key="key"
|
|
33
|
+
:model-value="modelValue[key]"
|
|
31
34
|
:json-schema-path="jsonSchemaPath?.length <= 0 ? `properties.${key}` : `${jsonSchemaPath}.properties.${key}`"
|
|
32
|
-
v-bind="options"
|
|
33
|
-
|
|
35
|
+
v-bind="options"
|
|
36
|
+
:isRequired="required.includes(key)"
|
|
37
|
+
class="mt-4"
|
|
38
|
+
@update:model-value="(event: unknown) => onInput(event, key)"
|
|
39
|
+
@submit="() => emit('submit')"
|
|
40
|
+
/>
|
|
34
41
|
</div>
|
|
35
42
|
</template>
|