@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.
@@ -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 v-if="edit" :disabled="maxItems && values.length >= maxItems" @click="add" icon="i-heroicons-plus"
208
- trailing color="neutral" size="xs" />
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 :id="id.length <= 0 ? `${row.index}` : `${id}[${row.index}].${items.id}`"
221
- :model-value="row.original" :json-schema-path="jsonSchemaPath?.length <= 0 ? `properties.${row.index}` : `${jsonSchemaPath}[${row.index}]`
222
- " v-bind="items" :isRequired="false" class="mt-4"
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 :id="id.length <= 0 ? `${model.index}` : `${id}[0].${items.id}`" :model-value="model.value"
233
- :json-schema-path="jsonSchemaPath?.length <= 0 ? `properties.${model.index}` : `${jsonSchemaPath}[${model.index}]`
234
- " v-bind="items" :isRequired="false" class="mt-4"
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 @click="
239
- () => {
240
- onInput(model.value, model.index)
241
- model.open = false
242
- }
243
- ">Save</UButton>
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 { computed } from 'vue'
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?: { [key: string]: unknown }
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
- <template v-if="renderer != null && renderer === 'none'">{{ undefined }}</template>
51
- <component v-else-if="renderer" v-bind="options" v-model="value"
52
- :is="typeof renderer === 'string' ? renderer : undefined" @submit="onSubmit" />
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>
@@ -6,7 +6,6 @@ const props = defineProps<{
6
6
  id: string
7
7
  title?: string
8
8
  description?: string
9
- type: string
10
9
  isRequired: boolean
11
10
  }>()
12
11
 
@@ -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 v-for="[key, options] of Object.entries(properties)" :id="id.length <= 0 ? `${key}` : `${id}.${key}`"
30
- :key="key" :model-value="modelValue[key]"
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" :isRequired="required.includes(key)" class="mt-4"
33
- @update:model-value="(event: unknown) => onInput(event, key)" @submit="() => emit('submit')" />
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>
@@ -3,7 +3,6 @@ const props = defineProps<{
3
3
  id: string
4
4
  title?: string
5
5
  description?: string
6
- enum?: boolean[]
7
6
  isRequired: boolean
8
7
  }>()
9
8
 
@@ -3,3 +3,9 @@ export type CustomValidation = {
3
3
  message: string;
4
4
  validate(state: any): boolean;
5
5
  };
6
+ export type PropertiesType = {
7
+ properties: {
8
+ [key: string]: unknown;
9
+ };
10
+ [key: string]: unknown;
11
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ederzeel/nuxt-schema-form-nightly",
3
- "version": "0.1.0-29118956.9ee4a3d",
3
+ "version": "0.1.0-29119026.5bb3293",
4
4
  "description": "A runtime form generator for nuxt",
5
5
  "type": "module",
6
6
  "exports": {