diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index e01adcd716..893285f36d 100644 --- a/app/src/components/v-input/v-input.vue +++ b/app/src/components/v-input/v-input.vue @@ -84,6 +84,10 @@ export default defineComponent({ type: [String, Number], default: null, }, + nullable: { + type: Boolean, + default: true, + }, slug: { type: Boolean, default: false, @@ -197,6 +201,11 @@ export default defineComponent({ function emitValue(event: InputEvent) { let value = (event.target as HTMLInputElement).value; + if (props.nullable === true && !value) { + emit('input', null); + return; + } + if (props.type === 'number') { emit('input', Number(value)); } else { diff --git a/app/src/displays/related-values/index.ts b/app/src/displays/related-values/index.ts index 99c24dfa7e..f421f220f6 100644 --- a/app/src/displays/related-values/index.ts +++ b/app/src/displays/related-values/index.ts @@ -20,13 +20,15 @@ export default defineDisplay(({ i18n }) => ({ options: options, types: ['alias', 'string', 'uuid', 'integer', 'bigInteger', 'json'], groups: ['m2m', 'm2o', 'o2m'], - fields: (options: Options, { field, collection }) => { + fields: (options: Options | null, { field, collection }) => { const relatedCollection = getRelatedCollection(collection, field); const { primaryKeyField } = useCollection(ref(relatedCollection as string)); if (!relatedCollection) return []; - const fields = adjustFieldsForDisplays(getFieldsFromTemplate(options.template), relatedCollection); + const fields = options?.template + ? adjustFieldsForDisplays(getFieldsFromTemplate(options.template), relatedCollection) + : []; if (fields.includes(primaryKeyField.value.field) === false) { fields.push(primaryKeyField.value.field); diff --git a/app/src/displays/related-values/related-values.vue b/app/src/displays/related-values/related-values.vue index 2b262bcfaa..7679691ca8 100644 --- a/app/src/displays/related-values/related-values.vue +++ b/app/src/displays/related-values/related-values.vue @@ -1,6 +1,10 @@