From 7faa6188c4b26940f0fea0c55dedaa2e083ef792 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 17 Jul 2024 12:33:05 +0100 Subject: [PATCH] Improve support for formula columns when using table conditional colouring --- .../controls/CellConditionEditor.svelte | 10 ++++++++-- .../src/components/grid/stores/conditions.js | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/builder/src/components/design/settings/controls/CellConditionEditor.svelte b/packages/builder/src/components/design/settings/controls/CellConditionEditor.svelte index 69b65fb449..0b9a8a74a2 100644 --- a/packages/builder/src/components/design/settings/controls/CellConditionEditor.svelte +++ b/packages/builder/src/components/design/settings/controls/CellConditionEditor.svelte @@ -15,7 +15,7 @@ import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte" import { QueryUtils, Constants } from "@budibase/frontend-core" import { generate } from "shortid" - import { FieldType } from "@budibase/types" + import { FieldType, FormulaType } from "@budibase/types" import { dndzone } from "svelte-dnd-action" import { flip } from "svelte/animate" @@ -63,7 +63,13 @@ value: type, }, ] - $: operatorOptions = QueryUtils.getValidOperatorsForType({ type }) + $: operatorOptions = QueryUtils.getValidOperatorsForType({ + type, + + // We can filter on any formula columns here since we already have the data + // on the page, so adding this ensures formula columns get operators + formulaType: FormulaType.STATIC, + }) const openDrawer = () => { tempValue = cloneDeep(value || []) diff --git a/packages/frontend-core/src/components/grid/stores/conditions.js b/packages/frontend-core/src/components/grid/stores/conditions.js index e5d8d89824..99b403d776 100644 --- a/packages/frontend-core/src/components/grid/stores/conditions.js +++ b/packages/frontend-core/src/components/grid/stores/conditions.js @@ -1,5 +1,6 @@ import { writable, get } from "svelte/store" import { derivedMemo, QueryUtils } from "../../../utils" +import { FieldType } from "@budibase/types" export const createStores = () => { const metadata = writable({}) @@ -90,17 +91,27 @@ const evaluateConditions = (row, conditions) => { let value = row[column] // Coerce values into correct types for primitives - if (type === "number") { + let coercedType = type + if (type === FieldType.FORMULA) { + // For formulas we want to ensure that the reference type matches the + // real type + if (value === true || value === false) { + coercedType = FieldType.BOOLEAN + } else if (typeof value === "number") { + coercedType = FieldType.NUMBER + } + } + if (coercedType === FieldType.NUMBER) { referenceValue = parseFloat(referenceValue) value = parseFloat(value) - } else if (type === "datetime") { + } else if (coercedType === FieldType.DATETIME) { if (referenceValue) { referenceValue = new Date(referenceValue).toISOString() } if (value) { value = new Date(value).toISOString() } - } else if (type === "boolean") { + } else if (coercedType === FieldType.BOOLEAN) { referenceValue = `${referenceValue}`.toLowerCase() === "true" value = `${value}`.toLowerCase() === "true" }