From ca297dda3a930bbfc38a2930f1b7d1c8230906e8 Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Mon, 26 Oct 2020 11:14:35 +0100 Subject: [PATCH] Check for default values --- .../use-collection/use-collection.ts | 16 ++++++++++++- app/src/composables/use-item/use-item.ts | 2 +- app/src/modules/collections/routes/item.vue | 23 +++++++++++++++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/app/src/composables/use-collection/use-collection.ts b/app/src/composables/use-collection/use-collection.ts index d14374bf1c..e9efcc3143 100644 --- a/app/src/composables/use-collection/use-collection.ts +++ b/app/src/composables/use-collection/use-collection.ts @@ -16,6 +16,20 @@ export function useCollection(collectionKey: string | Ref) { return fieldsStore.getFieldsForCollection(collection.value); }); + const defaults = computed(() => { + if (!fields.value) return {}; + + const defaults: Record = {}; + + for (const field of fields.value) { + if (field.schema?.default_value) { + defaults[field.field] = field.schema.default_value; + } + } + + return defaults; + }); + const primaryKeyField = computed(() => { // Every collection has a primary key; rules of the land // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -32,5 +46,5 @@ export function useCollection(collectionKey: string | Ref) { return info.value?.meta?.sort_field || null; }); - return { info, fields, primaryKeyField, userCreatedField, sortField }; + return { info, fields, defaults, primaryKeyField, userCreatedField, sortField }; } diff --git a/app/src/composables/use-item/use-item.ts b/app/src/composables/use-item/use-item.ts index a1f0466456..d0850b9d13 100644 --- a/app/src/composables/use-item/use-item.ts +++ b/app/src/composables/use-item/use-item.ts @@ -16,7 +16,7 @@ export function useItem(collection: Ref, primaryKey: Ref>({}); const isNew = computed(() => primaryKey.value === '+'); const isBatch = computed(() => typeof primaryKey.value === 'string' && primaryKey.value.includes(',')); const isSingle = computed(() => !!collectionInfo.value?.meta?.singleton); diff --git a/app/src/modules/collections/routes/item.vue b/app/src/modules/collections/routes/item.vue index 246fd84b8d..2b8cbdf319 100644 --- a/app/src/modules/collections/routes/item.vue +++ b/app/src/modules/collections/routes/item.vue @@ -267,7 +267,7 @@ export default defineComponent({ const revisionsDrawerDetail = ref(null); - const { info: collectionInfo, primaryKeyField } = useCollection(collection); + const { info: collectionInfo, defaults, primaryKeyField } = useCollection(collection); const { isNew, @@ -288,11 +288,24 @@ export default defineComponent({ validationErrors, } = useItem(collection, primaryKey); - const hasEdits = computed(() => Object.keys(edits.value).length > 0); + const hasEdits = computed(() => Object.keys(edits.value).length > 0); - const isSavable = computed( - () => saveAllowed.value === true && (hasEdits.value === true || isNew.value === true) - ); + const isSavable = computed(() => { + if (saveAllowed.value === false) return false; + + if ( + !primaryKeyField.value?.schema?.has_auto_increment && + !primaryKeyField.value?.meta?.special?.includes('uuid') + ) { + return !!edits.value?.[primaryKeyField.value.field]; + } + + if (isNew.value === true) { + return Object.keys(defaults.value).length > 0 || hasEdits.value; + } + + return hasEdits.value; + }); const confirmDelete = ref(false); const confirmArchive = ref(false);