108 lines
2.8 KiB
JavaScript
108 lines
2.8 KiB
JavaScript
import { FieldType, RelationshipType } from "@budibase/types"
|
|
import { Helpers } from "@budibase/bbui"
|
|
|
|
const columnTypeManyTypeOverrides = {
|
|
[FieldType.DATETIME]: FieldType.STRING,
|
|
[FieldType.BOOLEAN]: FieldType.STRING,
|
|
[FieldType.SIGNATURE_SINGLE]: FieldType.ATTACHMENTS,
|
|
}
|
|
|
|
const columnTypeManyParser = {
|
|
[FieldType.DATETIME]: (value, field) => {
|
|
function parseDate(value) {
|
|
const { timeOnly, dateOnly, ignoreTimezones } = field || {}
|
|
const enableTime = !dateOnly
|
|
const parsedValue = Helpers.parseDate(value, {
|
|
timeOnly,
|
|
enableTime,
|
|
ignoreTimezones,
|
|
})
|
|
const parsed = Helpers.getDateDisplayValue(parsedValue, {
|
|
enableTime,
|
|
timeOnly,
|
|
})
|
|
return parsed
|
|
}
|
|
|
|
return value?.map(v => parseDate(v))
|
|
},
|
|
[FieldType.BOOLEAN]: value => value?.map(v => !!v),
|
|
[FieldType.BB_REFERENCE_SINGLE]: value => [
|
|
...new Map(value.map(i => [i._id, i])).values(),
|
|
],
|
|
[FieldType.BB_REFERENCE]: value => [
|
|
...new Map(value.map(i => [i._id, i])).values(),
|
|
],
|
|
[FieldType.ARRAY]: value => Array.from(new Set(value)),
|
|
}
|
|
|
|
export function enrichSchemaWithRelColumns(schema) {
|
|
if (!schema) {
|
|
return
|
|
}
|
|
const result = Object.keys(schema).reduce((result, fieldName) => {
|
|
const field = schema[fieldName]
|
|
result[fieldName] = field
|
|
|
|
if (field.visible !== false && field.columns) {
|
|
const fromSingle =
|
|
field?.relationshipType === RelationshipType.ONE_TO_MANY
|
|
|
|
for (const relColumn of Object.keys(field.columns)) {
|
|
const relField = field.columns[relColumn]
|
|
if (!relField.visible) {
|
|
continue
|
|
}
|
|
const name = `${field.name}.${relColumn}`
|
|
result[name] = {
|
|
...relField,
|
|
name,
|
|
related: { field: fieldName, subField: relColumn },
|
|
cellRenderType:
|
|
(!fromSingle && columnTypeManyTypeOverrides[relField.type]) ||
|
|
relField.type,
|
|
}
|
|
}
|
|
}
|
|
return result
|
|
}, {})
|
|
|
|
return result
|
|
}
|
|
|
|
export function getRelatedTableValues(row, field, fromField) {
|
|
const fromSingle =
|
|
fromField?.relationshipType === RelationshipType.ONE_TO_MANY
|
|
|
|
let result = ""
|
|
|
|
if (fromSingle) {
|
|
result = row[field.related.field]?.[0]?.[field.related.subField]
|
|
} else {
|
|
const parser = columnTypeManyParser[field.type] || (value => value)
|
|
|
|
result = parser(
|
|
row[field.related.field]
|
|
?.flatMap(r => r[field.related.subField])
|
|
?.filter(i => i !== undefined && i !== null),
|
|
field
|
|
)
|
|
|
|
if (
|
|
[
|
|
FieldType.STRING,
|
|
FieldType.NUMBER,
|
|
FieldType.BIGINT,
|
|
FieldType.BOOLEAN,
|
|
FieldType.DATETIME,
|
|
FieldType.LONGFORM,
|
|
FieldType.BARCODEQR,
|
|
].includes(field.type)
|
|
) {
|
|
result = result?.join(", ")
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|