From 9b20daf930b01545445b6bf33fd3ca94c66ae12a Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 22 Apr 2022 12:56:36 +0100 Subject: [PATCH] Fix for #5495 - making sure that formula columns have access to the relationship details before squashing the results ready for response from the API. Also making sure that the frontend inputs the relationship bindings as expected with the proper path for access. --- .../components/backend/DataTable/formula.js | 5 +-- .../api/controllers/row/ExternalRequest.ts | 32 +++++++++++++++---- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/formula.js b/packages/builder/src/components/backend/DataTable/formula.js index 42f203ca1c..ea024cdf81 100644 --- a/packages/builder/src/components/backend/DataTable/formula.js +++ b/packages/builder/src/components/backend/DataTable/formula.js @@ -60,6 +60,7 @@ export function getBindings({ ) const label = path == null ? column : `${path}.0.${column}` + const binding = path == null ? `[${column}]` : `${path}.0.[${column}]` // only supply a description for relationship paths const description = path == null @@ -73,8 +74,8 @@ export function getBindings({ description, // don't include path, it messes things up, relationship path // will be replaced by the main array binding - readableBinding: column, - runtimeBinding: `[${column}]`, + readableBinding: label, + runtimeBinding: binding, }) } return bindings diff --git a/packages/server/src/api/controllers/row/ExternalRequest.ts b/packages/server/src/api/controllers/row/ExternalRequest.ts index c109a43afa..1465f20ac8 100644 --- a/packages/server/src/api/controllers/row/ExternalRequest.ts +++ b/packages/server/src/api/controllers/row/ExternalRequest.ts @@ -323,6 +323,28 @@ module External { return { row: newRow, manyRelationships } } + squashRelationshipColumns( + table: Table, + row: Row, + relationships: RelationshipsJson[] + ): Row { + for (let relationship of relationships) { + const linkedTable = this.tables[relationship.tableName] + if (!linkedTable) { + continue + } + const display = linkedTable.primaryDisplay + for (let key of Object.keys(row[relationship.column])) { + const related: Row = row[relationship.column][key] + row[relationship.column][key] = { + primaryDisplay: display ? related[display] : undefined, + _id: related._id, + } + } + } + return row + } + /** * This iterates through the returned rows and works out what elements of the rows * actually match up to another row (based on primary keys) - this is pretty specific @@ -354,12 +376,6 @@ module External { if (!linked._id) { continue } - // if not returning full docs then get the minimal links out - const display = linkedTable.primaryDisplay - linked = { - primaryDisplay: display ? linked[display] : undefined, - _id: linked._id, - } columns[relationship.column] = linked } for (let [column, related] of Object.entries(columns)) { @@ -417,7 +433,9 @@ module External { relationships ) } - return processFormulas(table, Object.values(finalRows)) + return processFormulas(table, Object.values(finalRows)).map((row: Row) => + this.squashRelationshipColumns(table, row, relationships) + ) } /**