From 7c35f3b7aa6d57dfbe1cc33335a00f774eed0de1 Mon Sep 17 00:00:00 2001 From: Oreille <33065839+Oreilles@users.noreply.github.com> Date: Wed, 16 Feb 2022 16:00:56 +0100 Subject: [PATCH] Change relation onDelete rule to `NO ACTION` when the field is set non-nullable (#11597) --- ...field-detail-advanced-relationship-m2o.vue | 49 ++++++++++--------- .../field-detail/store/alterations/file.ts | 8 ++- .../field-detail/store/alterations/m2o.ts | 8 ++- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2o.vue b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2o.vue index 918ff13c90..168118c8f7 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2o.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2o.vue @@ -51,29 +51,7 @@ v-model="onDeleteRelated" :disabled="collection === relatedCollection" :placeholder="t('choose_action') + '...'" - :items="[ - { - text: t('referential_action_set_null', { field: currentField }), - value: 'SET NULL', - }, - { - text: t('referential_action_set_default', { field: currentField }), - value: 'SET DEFAULT', - }, - { - text: t('referential_action_cascade', { - collection: collection, - field: currentField, - }), - value: 'CASCADE', - }, - { - text: t('referential_action_no_action', { - field: currentField, - }), - value: 'NO ACTION', - }, - ]" + :items="onDeleteOptions" /> @@ -152,6 +130,30 @@ export default defineComponent({ return t('add_field_related'); }); + const onDeleteOptions = computed(() => + [ + { + text: t('referential_action_set_null', { field: currentField.value }), + value: 'SET NULL', + }, + { + text: t('referential_action_set_default', { field: currentField.value }), + value: 'SET DEFAULT', + }, + { + text: t('referential_action_cascade', { + collection: collection.value, + field: currentField.value, + }), + value: 'CASCADE', + }, + { + text: t('referential_action_no_action', { field: currentField.value }), + value: 'NO ACTION', + }, + ].filter((o) => !(o.value === 'SET NULL' && field.value.schema?.is_nullable === false)) + ); + return { t, collection, @@ -164,6 +166,7 @@ export default defineComponent({ correspondingFieldKey, generationInfo, onDeleteRelated, + onDeleteOptions, }; }, }); diff --git a/app/src/modules/settings/routes/data-model/field-detail/store/alterations/file.ts b/app/src/modules/settings/routes/data-model/field-detail/store/alterations/file.ts index 5ed81944c8..b5c9203e96 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/store/alterations/file.ts +++ b/app/src/modules/settings/routes/data-model/field-detail/store/alterations/file.ts @@ -2,7 +2,7 @@ import { StateUpdates, State, HelperFunctions } from '../types'; import { set } from 'lodash'; export function applyChanges(updates: StateUpdates, state: State, helperFn: HelperFunctions) { - const { hasChanged } = helperFn; + const { hasChanged, getCurrent } = helperFn; if (hasChanged('localType')) { setTypeToUUID(updates); @@ -12,6 +12,12 @@ export function applyChanges(updates: StateUpdates, state: State, helperFn: Help if (hasChanged('field.field')) { updateRelationField(updates); } + + if (hasChanged('field.schema.is_nullable')) { + if (updates.field?.schema?.is_nullable === false && getCurrent('relations.m2o.schema.on_delete') === 'SET NULL') { + set(updates, 'relations.m2o.schema.on_delete', 'NO ACTION'); + } + } } export function setTypeToUUID(updates: StateUpdates) { diff --git a/app/src/modules/settings/routes/data-model/field-detail/store/alterations/m2o.ts b/app/src/modules/settings/routes/data-model/field-detail/store/alterations/m2o.ts index bc881dd010..d0b735fb76 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/store/alterations/m2o.ts +++ b/app/src/modules/settings/routes/data-model/field-detail/store/alterations/m2o.ts @@ -3,7 +3,7 @@ import { set } from 'lodash'; import { useCollectionsStore, useFieldsStore } from '@/stores'; export function applyChanges(updates: StateUpdates, state: State, helperFn: HelperFunctions) { - const { hasChanged } = helperFn; + const { hasChanged, getCurrent } = helperFn; if (hasChanged('localType')) { prepareRelation(updates, state); @@ -22,6 +22,12 @@ export function applyChanges(updates: StateUpdates, state: State, helperFn: Help if (hasChanged('fields.corresponding')) { setRelatedOneFieldForCorrespondingField(updates); } + + if (hasChanged('field.schema.is_nullable')) { + if (updates.field?.schema?.is_nullable === false && getCurrent('relations.m2o.schema.on_delete') === 'SET NULL') { + set(updates, 'relations.m2o.schema.on_delete', 'NO ACTION'); + } + } } export function prepareRelation(updates: StateUpdates, state: State) {