Merge pull request #14418 from Budibase/fix/invalid-primary-display-columns
Invalid primary display setting (no relationship columns)
This commit is contained in:
commit
56fd011598
|
@ -2762,6 +2762,57 @@ describe.each([
|
|||
})
|
||||
})
|
||||
|
||||
isSql &&
|
||||
describe("primaryDisplay", () => {
|
||||
beforeAll(async () => {
|
||||
let toRelateTable = await createTable({
|
||||
name: {
|
||||
name: "name",
|
||||
type: FieldType.STRING,
|
||||
},
|
||||
})
|
||||
table = await config.api.table.save(
|
||||
tableForDatasource(datasource, {
|
||||
schema: {
|
||||
name: {
|
||||
name: "name",
|
||||
type: FieldType.STRING,
|
||||
},
|
||||
link: {
|
||||
name: "link",
|
||||
type: FieldType.LINK,
|
||||
relationshipType: RelationshipType.MANY_TO_ONE,
|
||||
tableId: toRelateTable._id!,
|
||||
fieldName: "link",
|
||||
},
|
||||
},
|
||||
})
|
||||
)
|
||||
toRelateTable = await config.api.table.get(toRelateTable._id!)
|
||||
await config.api.table.save({
|
||||
...toRelateTable,
|
||||
primaryDisplay: "link",
|
||||
})
|
||||
const relatedRows = await Promise.all([
|
||||
config.api.row.save(toRelateTable._id!, { name: "test" }),
|
||||
])
|
||||
await Promise.all([
|
||||
config.api.row.save(table._id!, {
|
||||
name: "test",
|
||||
link: relatedRows.map(row => row._id),
|
||||
}),
|
||||
])
|
||||
})
|
||||
|
||||
it("should be able to query, primary display on related table shouldn't be used", async () => {
|
||||
// this test makes sure that if a relationship has been specified as the primary display on a table
|
||||
// it is ignored and another column is used instead
|
||||
await expectQuery({}).toContain([
|
||||
{ name: "test", link: [{ primaryDisplay: "test" }] },
|
||||
])
|
||||
})
|
||||
})
|
||||
|
||||
!isLucene &&
|
||||
describe("$and", () => {
|
||||
beforeAll(async () => {
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import LinkController from "./LinkController"
|
||||
import {
|
||||
getLinkDocuments,
|
||||
getUniqueByProp,
|
||||
getRelatedTableForField,
|
||||
getLinkedTableIDs,
|
||||
getLinkedTable,
|
||||
getLinkedTableIDs,
|
||||
getRelatedTableForField,
|
||||
getUniqueByProp,
|
||||
} from "./linkUtils"
|
||||
import flatten from "lodash/flatten"
|
||||
import { USER_METDATA_PREFIX } from "../utils"
|
||||
|
@ -13,16 +13,25 @@ import { getGlobalUsersFromMetadata } from "../../utilities/global"
|
|||
import { processFormulas } from "../../utilities/rowProcessor"
|
||||
import { context } from "@budibase/backend-core"
|
||||
import {
|
||||
Table,
|
||||
Row,
|
||||
LinkDocumentValue,
|
||||
FieldType,
|
||||
ContextUser,
|
||||
FieldType,
|
||||
LinkDocumentValue,
|
||||
Row,
|
||||
Table,
|
||||
} from "@budibase/types"
|
||||
import sdk from "../../sdk"
|
||||
|
||||
export { IncludeDocs, getLinkDocuments, createLinkView } from "./linkUtils"
|
||||
|
||||
const INVALID_DISPLAY_COLUMN_TYPE = [
|
||||
FieldType.LINK,
|
||||
FieldType.ATTACHMENTS,
|
||||
FieldType.ATTACHMENT_SINGLE,
|
||||
FieldType.SIGNATURE_SINGLE,
|
||||
FieldType.BB_REFERENCE,
|
||||
FieldType.BB_REFERENCE_SINGLE,
|
||||
]
|
||||
|
||||
/**
|
||||
* This functionality makes sure that when rows with links are created, updated or deleted they are processed
|
||||
* correctly - making sure that no stale links are left around and that all links have been made successfully.
|
||||
|
@ -206,6 +215,31 @@ export async function attachFullLinkedDocs(
|
|||
return rows
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a valid value for the primary display, avoiding columns which break things
|
||||
* like relationships (can be circular).
|
||||
* @param row The row to lift a value from for the primary display.
|
||||
* @param table The related table to attempt to work out the primary display column from.
|
||||
*/
|
||||
function getPrimaryDisplayValue(row: Row, table?: Table) {
|
||||
const primaryDisplay = table?.primaryDisplay
|
||||
let invalid = true
|
||||
if (primaryDisplay) {
|
||||
const primaryDisplaySchema = table?.schema[primaryDisplay]
|
||||
invalid = INVALID_DISPLAY_COLUMN_TYPE.includes(primaryDisplaySchema.type)
|
||||
}
|
||||
if (invalid || !primaryDisplay) {
|
||||
const validKey = Object.keys(table?.schema || {}).find(
|
||||
key =>
|
||||
table?.schema[key].type &&
|
||||
!INVALID_DISPLAY_COLUMN_TYPE.includes(table?.schema[key].type)
|
||||
)
|
||||
return validKey ? row[validKey] : undefined
|
||||
} else {
|
||||
return row[primaryDisplay]
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will take the given enriched rows and squash the links to only contain the primary display field.
|
||||
* @param table The table from which the rows originated.
|
||||
|
@ -232,9 +266,7 @@ export async function squashLinksToPrimaryDisplay(
|
|||
const linkTblId = link.tableId || getRelatedTableForField(table, column)
|
||||
const linkedTable = await getLinkedTable(linkTblId!, linkedTables)
|
||||
const obj: any = { _id: link._id }
|
||||
if (linkedTable?.primaryDisplay && link[linkedTable.primaryDisplay]) {
|
||||
obj.primaryDisplay = link[linkedTable.primaryDisplay]
|
||||
}
|
||||
obj.primaryDisplay = getPrimaryDisplayValue(link, linkedTable)
|
||||
newLinks.push(obj)
|
||||
}
|
||||
row[column] = newLinks
|
||||
|
|
Loading…
Reference in New Issue