From dfe8fa6d0db8ba8ada5dbc3aa7558ba440f34cbf Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 19 Mar 2024 16:35:55 +0100 Subject: [PATCH 1/2] fix: change format of non-primitive values in queries --- src/utils/schema/resolvers/Query/all.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/utils/schema/resolvers/Query/all.ts b/src/utils/schema/resolvers/Query/all.ts index 0b8967648..dcbcb0652 100644 --- a/src/utils/schema/resolvers/Query/all.ts +++ b/src/utils/schema/resolvers/Query/all.ts @@ -705,15 +705,22 @@ export default (entityName: string, fieldsByName: any, idsByName: any) => styleRules.push({ items: itemsToStyle, style: style }); } } - // === CONSTRUCT OUTPUT + RETURN === + const referenceDataFields = fields.filter((field) => field.referenceData); const edges = items.map((r) => { const record = getAccessibleFields(r, ability); Object.assign(record, { id: record._id }); + const node = display ? { ...record, display, fields } : record; + referenceDataFields.forEach((field) => { + const { value } = node.data[field.name] || {}; + if (value?.id) { + node.data[field.name] = value.id; + } + }); return { cursor: encodeCursor(record.id.toString()), - node: display ? Object.assign(record, { display, fields }) : record, + node: node, meta: { style: getStyle(r, styleRules), raw: record.data, From be2c83d83b88df08d536ae1b0bbfdf076dec4ac3 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 20 Mar 2024 10:45:13 +0100 Subject: [PATCH 2/2] fix: change format of non-primitive questions based on form structure --- src/utils/schema/resolvers/Query/all.ts | 37 +++++++++++++++++++++---- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/utils/schema/resolvers/Query/all.ts b/src/utils/schema/resolvers/Query/all.ts index dcbcb0652..4bf7630ac 100644 --- a/src/utils/schema/resolvers/Query/all.ts +++ b/src/utils/schema/resolvers/Query/all.ts @@ -1,5 +1,5 @@ import { GraphQLError } from 'graphql'; -import { Record, ReferenceData, User } from '@models'; +import { Record, ReferenceData, User, Form } from '@models'; import extendAbilityForRecords from '@security/extendAbilityForRecords'; import { decodeCursor, encodeCursor } from '@schema/types'; import getReversedFields from '../../introspection/getReversedFields'; @@ -705,16 +705,41 @@ export default (entityName: string, fieldsByName: any, idsByName: any) => styleRules.push({ items: itemsToStyle, style: style }); } } + + // List of non-primitive reference data questions + const primitiveReferenceDataFields = []; + // Retrieve the form to get the complete structure + const form = await Form.findOne({ + resource: id, + graphQLTypeName: entityName, + }); + const formStructure = form?.structure && JSON.parse(form.structure); + if (formStructure) { + // Flatten the structure into a single-level array of questions + const flatElements = formStructure.pages.flatMap( + (page) => page.elements + ); + // Find the non-primitive questions + fields.forEach((field) => { + const element = flatElements.find( + (el) => el.name === field.name && el.isPrimitiveValue === false + ); + if (element) { + primitiveReferenceDataFields.push(element); + } + }); + } + // === CONSTRUCT OUTPUT + RETURN === - const referenceDataFields = fields.filter((field) => field.referenceData); const edges = items.map((r) => { const record = getAccessibleFields(r, ability); Object.assign(record, { id: record._id }); const node = display ? { ...record, display, fields } : record; - referenceDataFields.forEach((field) => { - const { value } = node.data[field.name] || {}; - if (value?.id) { - node.data[field.name] = value.id; + // Change the non-primitive questions format to make it reusable + primitiveReferenceDataFields.forEach((field) => { + const fieldValue = node.data[field.name]?.value; + if (fieldValue?.id) { + node.data[field.name] = fieldValue.id; } });