1
0
Fork 0
mirror of synced 2024-05-07 22:13:05 +12:00
budibase/packages/client/src/utils/blocks.js

82 lines
2.5 KiB
JavaScript

import { makePropSafe as safe } from "@budibase/string-templates"
// Map of data types to component types for search fields inside blocks
const schemaComponentMap = {
string: "stringfield",
options: "optionsfield",
number: "numberfield",
datetime: "datetimefield",
boolean: "booleanfield",
formula: "stringfield",
}
/**
* Determine data types for search fields and only use those that are valid
* @param searchColumns the search columns to use
* @param schema the datasource schema
*/
export const enrichSearchColumns = (searchColumns, schema) => {
let enrichedColumns = []
searchColumns?.forEach(column => {
const schemaType = schema?.[column]?.type
const componentType = schemaComponentMap[schemaType]
if (componentType) {
enrichedColumns.push({
name: column,
componentType,
type: schemaType,
})
}
})
return enrichedColumns.slice(0, 5)
}
/**
* Enriches a normal datasource filter with bindings representing the additional
* search fields configured as part of a searchable block. These bindings are
* fields inside a form used as part of the block.
* @param filter the normal data provider filter
* @param columns the enriched search column structure
* @param formId the ID of the form containing the search fields
*/
export const enrichFilter = (filter, columns, formId) => {
let enrichedFilter = [...(filter || [])]
columns?.forEach(column => {
const safePath = column.name.split(".").map(safe).join(".")
const stringType = column.type === "string" || column.type === "formula"
const dateType = column.type === "datetime"
const binding = `${safe(formId)}.${safePath}`
// For dates, use a range of the entire day selected
if (dateType) {
enrichedFilter.push({
field: column.name,
type: column.type,
operator: "rangeLow",
valueType: "Binding",
value: `{{ ${binding} }}`,
})
const format = "YYYY-MM-DDTHH:mm:ss.SSSZ"
enrichedFilter.push({
field: column.name,
type: column.type,
operator: "rangeHigh",
valueType: "Binding",
value: `{{ date (add (date ${binding} "x") 86399999) "${format}" }}`,
})
}
// For other fields, do an exact match
else {
enrichedFilter.push({
field: column.name,
type: column.type,
operator: stringType ? "string" : "equal",
valueType: "Binding",
value: `{{ ${binding} }}`,
})
}
})
return enrichedFilter
}