diff --git a/app/src/interfaces/list/list.vue b/app/src/interfaces/list/list.vue index 3b39fe18e5..e760740d00 100644 --- a/app/src/interfaces/list/list.vue +++ b/app/src/interfaces/list/list.vue @@ -49,7 +49,7 @@ @@ -163,6 +163,19 @@ export default defineComponent({ const activeItem = computed(() => (active.value !== null ? edits.value : null)); + const isSaveDisabled = computed(() => { + for (const field of props.fields) { + if ( + field.meta?.required && + field.field && + (edits.value[field.field] === null || edits.value[field.field] === undefined) + ) { + return true; + } + } + return false; + }); + const { displayValue } = renderStringTemplate(templateWithDefaults, activeItem); const defaults = computed(() => { @@ -197,7 +210,7 @@ export default defineComponent({ }); const isNewItem = ref(false); - const edits = ref({}); + const edits = ref({} as Record); const confirmDiscard = ref(false); return { @@ -212,6 +225,7 @@ export default defineComponent({ drawerOpen, displayValue, activeItem, + isSaveDisabled, closeDrawer, onSort, templateWithDefaults, diff --git a/app/src/interfaces/list/options.vue b/app/src/interfaces/list/options.vue index fcbe526279..f215cd9ae2 100644 --- a/app/src/interfaces/list/options.vue +++ b/app/src/interfaces/list/options.vue @@ -86,6 +86,7 @@ export default defineComponent({ interface: 'input', width: 'half', sort: 2, + required: true, options: { dbSafe: true, font: 'monospace', @@ -159,6 +160,19 @@ export default defineComponent({ }, schema: null, }, + { + name: t('required'), + field: 'required', + type: 'boolean', + meta: { + interface: 'boolean', + sort: 7, + options: { + label: t('requires_value'), + }, + width: 'half', + }, + }, { name: t('options'), field: 'options', @@ -166,7 +180,7 @@ export default defineComponent({ meta: { interface: 'system-interface-options', width: 'full', - sort: 7, + sort: 8, options: { interfaceField: 'interface', },