From e386caabc1659a8c42c9c09f60390dd61d403caa Mon Sep 17 00:00:00 2001 From: Brainslug Date: Thu, 7 Jul 2022 11:01:44 +0200 Subject: [PATCH] limiting the fields selectable as sort field for multi relation interfaces (#14303) --- .../field-detail-advanced-relationship-m2a.vue | 14 +++++++++++++- .../field-detail-advanced-relationship-m2m.vue | 14 +++++++++++++- .../field-detail-advanced-relationship-o2m.vue | 14 +++++++++++++- .../field-detail/shared/related-field-select.vue | 10 +++++++++- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2a.vue b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2a.vue index 00da7bae04..3e51949d1a 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2a.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2a.vue @@ -64,6 +64,7 @@ {{ t('sort_field') }} { + let fields = ['item', 'collection']; + if (junctionCollection.value) { + const relations = relationsStore.getRelationsForCollection(junctionCollection.value); + fields.push(...relations.map((field) => field.field)); + } + return fields; + }); + return { t, availableCollections, @@ -218,6 +229,7 @@ export default defineComponent({ sortField, onDelete, onDeselect, + unsortableJunctionFields, }; }, }); diff --git a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2m.vue b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2m.vue index 907506a5a5..9d2f75a6ec 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2m.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2m.vue @@ -71,6 +71,7 @@ @@ -203,7 +204,7 @@ import { useFieldDetailStore, syncFieldDetailStoreProperty } from '../store'; import { storeToRefs } from 'pinia'; import RelatedCollectionSelect from '../shared/related-collection-select.vue'; import RelatedFieldSelect from '../shared/related-field-select.vue'; -import { useFieldsStore } from '@/stores'; +import { useFieldsStore, useRelationsStore } from '@/stores'; export default defineComponent({ components: { RelatedCollectionSelect, RelatedFieldSelect }, @@ -211,6 +212,7 @@ export default defineComponent({ const { t } = useI18n(); const fieldDetailStore = useFieldDetailStore(); + const relationsStore = useRelationsStore(); const fieldsStore = useFieldsStore(); const { field, collection, editing, generationInfo } = storeToRefs(fieldDetailStore); @@ -265,6 +267,15 @@ export default defineComponent({ return t('add_field_related'); }); + const unsortableJunctionFields = computed(() => { + let fields = []; + if (junctionCollection.value) { + const relations = relationsStore.getRelationsForCollection(junctionCollection.value); + fields.push(...relations.map((field) => field.field)); + } + return fields; + }); + return { t, autoGenerateJunctionRelation, @@ -285,6 +296,7 @@ export default defineComponent({ correspondingLabel, correspondingFieldKey, generationInfo, + unsortableJunctionFields, }; }, }); diff --git a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-o2m.vue b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-o2m.vue index f43146fdd8..0ca2002a9f 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-o2m.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-o2m.vue @@ -24,6 +24,7 @@ @@ -117,7 +118,7 @@ import { useFieldDetailStore, syncFieldDetailStoreProperty } from '../store'; import { storeToRefs } from 'pinia'; import RelatedCollectionSelect from '../shared/related-collection-select.vue'; import RelatedFieldSelect from '../shared/related-field-select.vue'; -import { useFieldsStore } from '@/stores'; +import { useFieldsStore, useRelationsStore } from '@/stores'; export default defineComponent({ components: { RelatedCollectionSelect, RelatedFieldSelect }, @@ -125,6 +126,7 @@ export default defineComponent({ const { t } = useI18n(); const fieldDetailStore = useFieldDetailStore(); + const relationsStore = useRelationsStore(); const fieldsStore = useFieldsStore(); const relatedCollection = syncFieldDetailStoreProperty('relations.o2m.collection'); @@ -138,6 +140,15 @@ export default defineComponent({ const isExisting = computed(() => editing.value !== '+'); const currentPrimaryKey = computed(() => fieldsStore.getPrimaryKeyFieldForCollection(collection.value!)?.field); + const unsortableJunctionFields = computed(() => { + let fields = ['item', 'collection']; + if (relatedCollection.value) { + const relations = relationsStore.getRelationsForCollection(relatedCollection.value); + fields.push(...relations.map((field) => field.field)); + } + return fields; + }); + return { t, isExisting, @@ -149,6 +160,7 @@ export default defineComponent({ sortField, onDelete, onDeselect, + unsortableJunctionFields, }; }, }); diff --git a/app/src/modules/settings/routes/data-model/field-detail/shared/related-field-select.vue b/app/src/modules/settings/routes/data-model/field-detail/shared/related-field-select.vue index fd32fb191d..34104fc010 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/shared/related-field-select.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/shared/related-field-select.vue @@ -57,6 +57,10 @@ export default defineComponent({ type: String, default: null, }, + disabledFields: { + type: Array as PropType, + default: () => [], + }, typeDenyList: { type: Array as PropType, default: () => [], @@ -81,7 +85,11 @@ export default defineComponent({ return fieldsStore.getFieldsForCollectionAlphabetical(props.collection).map((field) => ({ text: field.field, value: field.field, - disabled: !field.schema || !!field.schema?.is_primary_key || !!props.typeDenyList.includes(field.type), + disabled: + !field.schema || + !!field.schema?.is_primary_key || + props.disabledFields.includes(field.field) || + props.typeDenyList.includes(field.type), })); });