From b31430f44c2540ac5be118a4fc0f5c0f8c974a64 Mon Sep 17 00:00:00 2001 From: Davide Silvestri <davide@baserow.io> Date: Tue, 11 Mar 2025 14:31:05 +0100 Subject: [PATCH] Resolve "Updating a cell fails when a view is sorted or grouped by a linked field that has a primary field of the type formula" --- changelog/entries/unreleased/bug/3484_.json | 8 ++++++++ .../modules/database/formula/formulaTypes.js | 19 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 changelog/entries/unreleased/bug/3484_.json diff --git a/changelog/entries/unreleased/bug/3484_.json b/changelog/entries/unreleased/bug/3484_.json new file mode 100644 index 000000000..a258ed939 --- /dev/null +++ b/changelog/entries/unreleased/bug/3484_.json @@ -0,0 +1,8 @@ +{ + "type": "bug", + "message": "Updating a cell no longer fails when a view is sorted or grouped by a linked field whose primary field is a formula.", + "domain": "database", + "issue_number": 3484, + "bullet_points": [], + "created_at": "2025-03-10" +} \ No newline at end of file diff --git a/web-frontend/modules/database/formula/formulaTypes.js b/web-frontend/modules/database/formula/formulaTypes.js index 15aaf9379..49111efae 100644 --- a/web-frontend/modules/database/formula/formulaTypes.js +++ b/web-frontend/modules/database/formula/formulaTypes.js @@ -261,6 +261,14 @@ export class BaserowFormulaTypeDefinition extends Registerable { toBaserowFormulaType(field) { return this.getType() } + + parseFromLinkedRowItemValue(field, value) { + const underlyingFieldType = this.app.$registry.get( + 'field', + this._mapFormulaTypeToFieldType(field.formula_type) + ) + return underlyingFieldType.parseFromLinkedRowItemValue(field, value) + } } export class BaserowFormulaTextType extends mix( @@ -753,8 +761,10 @@ export class BaserowFormulaArrayType extends mix( const innerSortFunction = subType.getSort(name, order, field) return (a, b) => { - const valuesA = a[name].map(subType.mapToSortableArray.bind(subType)) - const valuesB = b[name].map(subType.mapToSortableArray.bind(subType)) + const valA = Array.isArray(a[name]) ? a[name] : [a[name]] + const valB = Array.isArray(b[name]) ? b[name] : [b[name]] + const valuesA = valA.map(subType.mapToSortableArray.bind(subType)) + const valuesB = valB.map(subType.mapToSortableArray.bind(subType)) for (let i = 0; i < Math.max(valuesA.length, valuesB.length); i++) { let compared = 0 @@ -825,6 +835,11 @@ export class BaserowFormulaArrayType extends mix( toBaserowFormulaType(field) { return this.getSubType(field)?.toBaserowFormulaType(field) } + + parseFromLinkedRowItemValue(field, value) { + const subType = this.getSubType(field) + return subType.parseFromLinkedRowItemValue(field, value) + } } export class BaserowFormulaFileType extends BaserowFormulaTypeDefinition {