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 {