limiting the fields selectable as sort field for multi relation interfaces (#14303)

This commit is contained in:
Brainslug
2022-07-07 11:01:44 +02:00
committed by GitHub
parent 7190e661ec
commit e386caabc1
4 changed files with 48 additions and 4 deletions

View File

@@ -64,6 +64,7 @@
<v-divider large :inline-title="false">{{ t('sort_field') }}</v-divider>
<related-field-select
v-model="sortField"
:disabled-fields="unsortableJunctionFields"
:collection="junctionCollection"
:placeholder="t('add_sort_field')"
:nullable="true"
@@ -157,7 +158,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, useCollectionsStore } from '@/stores';
import { useFieldsStore, useCollectionsStore, useRelationsStore } from '@/stores';
import { orderBy } from 'lodash';
export default defineComponent({
@@ -167,6 +168,7 @@ export default defineComponent({
const fieldDetailStore = useFieldDetailStore();
const collectionsStore = useCollectionsStore();
const relationsStore = useRelationsStore();
const fieldsStore = useFieldsStore();
const { collection, editing, generationInfo } = storeToRefs(fieldDetailStore);
@@ -202,6 +204,15 @@ export default defineComponent({
);
});
const unsortableJunctionFields = computed(() => {
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,
};
},
});

View File

@@ -71,6 +71,7 @@
<related-field-select
v-model="sortField"
:collection="junctionCollection"
:disabled-fields="unsortableJunctionFields"
:placeholder="t('add_sort_field') + '...'"
:nullable="true"
/>
@@ -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,
};
},
});

View File

@@ -24,6 +24,7 @@
<related-field-select
v-model="sortField"
:collection="relatedCollection"
:disabled-fields="unsortableJunctionFields"
:placeholder="t('add_sort_field') + '...'"
:nullable="true"
/>
@@ -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,
};
},
});

View File

@@ -57,6 +57,10 @@ export default defineComponent({
type: String,
default: null,
},
disabledFields: {
type: Array as PropType<string[]>,
default: () => [],
},
typeDenyList: {
type: Array as PropType<string[]>,
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),
}));
});