Browse Source

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.

master
mike12345567 5 years ago
parent
commit
89683f9de4
  1. 5
      packages/builder/src/components/backend/DataTable/formula.js
  2. 32
      packages/server/src/api/controllers/row/ExternalRequest.ts

5
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

32
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)
)
}
/**

Loading…
Cancel
Save