diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index e01adcd716..681061482a 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/interfaces/text-input/index.ts b/app/src/interfaces/text-input/index.ts index 8baee8cbcb..8c42f14269 100644 --- a/app/src/interfaces/text-input/index.ts +++ b/app/src/interfaces/text-input/index.ts @@ -87,5 +87,20 @@ export default defineInterface(({ i18n }) => ({ default_value: false, }, }, + { + field: 'nullable', + name: i18n.t('interfaces.text-input.nullable'), + type: 'boolean', + meta: { + width: 'half', + interface: 'toggle', + options: { + label: i18n.t('interfaces.text-input.nullable_label'), + }, + }, + schema: { + default_value: true, + }, + }, ], })); diff --git a/app/src/interfaces/text-input/text-input.vue b/app/src/interfaces/text-input/text-input.vue index a966c608e1..2b0342cd24 100644 --- a/app/src/interfaces/text-input/text-input.vue +++ b/app/src/interfaces/text-input/text-input.vue @@ -1,6 +1,7 @@