From ec98d072d428fa5ec801c3a1cdf4ae965df9d50d Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Mon, 2 Nov 2020 15:33:26 -0500 Subject: [PATCH] Fix o2m not rendering nested m2o data Fixes #841 --- .../interfaces/many-to-many/use-preview.ts | 114 +++++++++--------- .../interfaces/one-to-many/one-to-many.vue | 4 +- 2 files changed, 60 insertions(+), 58 deletions(-) diff --git a/app/src/interfaces/many-to-many/use-preview.ts b/app/src/interfaces/many-to-many/use-preview.ts index f58f3fdce6..468af348a9 100644 --- a/app/src/interfaces/many-to-many/use-preview.ts +++ b/app/src/interfaces/many-to-many/use-preview.ts @@ -1,8 +1,8 @@ -import { Ref, ref, watch, computed } from '@vue/composition-api'; +import { Ref, ref, watch } from '@vue/composition-api'; import { Header } from '@/components/v-table/types'; import { RelationInfo } from './use-relation'; import { useFieldsStore } from '@/stores/'; -import { Field, Collection } from '@/types'; +import { Field } from '@/types'; import api from '@/api'; import { cloneDeep, get } from 'lodash'; @@ -25,20 +25,6 @@ export default function usePreview( const items = ref[]>([]); const error = ref(null); - function getRelatedFields(fields: string[]) { - const { junctionField } = relation.value; - - return fields.reduce((acc: string[], field) => { - const sections = field.split('.'); - if (junctionField === sections[0] && sections.length >= 2) acc.push(sections.slice(1).join('.')); - return acc; - }, []); - } - - function getJunctionFields() { - return (fields.value || []).filter((field) => field.includes('.') === false); - } - watch( () => value.value, async (newVal) => { @@ -112,6 +98,61 @@ export default function usePreview( { immediate: true } ); + // Seeing we don't care about saving those tableHeaders, we can reset it whenever the + // fields prop changes (most likely when we're navigating to a different o2m context) + watch( + () => fields.value, + () => { + const { junctionField, junctionCollection } = relation.value; + + tableHeaders.value = (fields.value.length > 0 + ? fields.value + : getDefaultFields().map((field) => `${junctionField}.${field}`) + ) + .map((fieldKey) => { + let field = fieldsStore.getField(junctionCollection, fieldKey); + + if (!field) return null; + + const header: Header = { + text: field.name, + value: fieldKey, + align: 'left', + sortable: true, + width: null, + field: { + display: field.meta?.display, + displayOptions: field.meta?.display_options, + interface: field.meta?.interface, + interfaceOptions: field.meta?.options, + type: field.type, + field: field.field, + }, + }; + + return header; + }) + .filter((h) => h) as Header[]; + }, + { immediate: true } + ); + + return { tableHeaders, items, loading, error }; + + function getRelatedFields(fields: string[]) { + const { junctionField } = relation.value; + + return fields.reduce((acc: string[], field) => { + const sections = field.split('.'); + if (junctionField === sections[0] && sections.length >= 2) acc.push(sections.slice(1).join('.')); + return acc; + }, []); + } + + function getJunctionFields() { + return (fields.value || []).filter((field) => field.includes('.') === false); + } + async function loadRelatedIds() { const { junctionPkField, junctionField, relationPkField, junctionCollection } = relation.value; @@ -162,49 +203,8 @@ export default function usePreview( return response?.data.data as Record[]; } - // Seeing we don't care about saving those tableHeaders, we can reset it whenever the - // fields prop changes (most likely when we're navigating to a different o2m context) - watch( - () => fields.value, - () => { - const { junctionField, junctionCollection } = relation.value; - - tableHeaders.value = (fields.value.length > 0 - ? fields.value - : getDefaultFields().map((field) => `${junctionField}.${field}`) - ) - .map((fieldKey) => { - let field = fieldsStore.getField(junctionCollection, fieldKey); - - if (!field) return null; - - const header: Header = { - text: field.name, - value: fieldKey, - align: 'left', - sortable: true, - width: null, - field: { - display: field.meta?.display, - displayOptions: field.meta?.display_options, - interface: field.meta?.interface, - interfaceOptions: field.meta?.options, - type: field.type, - field: field.field, - }, - }; - - return header; - }) - .filter((h) => h) as Header[]; - }, - { immediate: true } - ); - function getDefaultFields(): string[] { const fields = fieldsStore.getFieldsForCollection(relation.value.relationCollection); return fields.slice(0, 3).map((field: Field) => field.field); } - - return { tableHeaders, items, loading, error }; } diff --git a/app/src/interfaces/one-to-many/one-to-many.vue b/app/src/interfaces/one-to-many/one-to-many.vue index 6bb1128d19..a3a8c858fa 100644 --- a/app/src/interfaces/one-to-many/one-to-many.vue +++ b/app/src/interfaces/one-to-many/one-to-many.vue @@ -19,7 +19,7 @@