mayneyao/eidos

BUG when changing a table column type after data is set

florenthobein opened this issue · 2 comments

Hi, I just tried Eidos and noticed a bug with the change of column types.
Here is an easy repro :

  1. Create a table
  2. Create a Rating column
  3. Set a value for this column in a row
  4. Change the column type for Multiselect

Then the page crashes with error

TypeError: t.split is not a function
    at u$.getCellContent (https://eidos.space/assets/index-a-qe5GgR.js:8184:10199)

No time to help with a PR for now but I believe the culprit is around there: multi-select.ts#L67

I actually made a fix on a branch but I can't push it. Here is the diff if you want to apply it

diff --git a/lib/fields/created-time.ts b/lib/fields/created-time.ts
index 9c2a238..6fcae02 100644
--- a/lib/fields/created-time.ts
+++ b/lib/fields/created-time.ts
@@ -32,7 +32,7 @@ export class CreatedTimeField extends BaseField<
   getCellContent(rawData: string | undefined): TextCell {
     // 2024-01-22 02:51:26 => 2024-01-22T02:51:26.000Z
     const str = rawData
-      ? new Date(rawData.split(" ").join("T") + ".000Z").toLocaleString()
+      ? new Date(String(rawData || "").split(" ").join("T") + ".000Z").toLocaleString()
       : ""
     return {
       kind: GridCellKind.Text,
diff --git a/lib/fields/file.ts b/lib/fields/file.ts
index 2538df5..8e9e5ad 100644
--- a/lib/fields/file.ts
+++ b/lib/fields/file.ts
@@ -41,7 +41,7 @@ export class FileField extends BaseField<FileCell, FileProperty, string> {
   }
 
   getCellContent(rawData: string): FileCell {
-    const data = rawData?.split(",") ?? []
+    const data = (rawData || "")?.split(",") ?? []
     return {
       kind: GridCellKind.Custom,
       data: {
diff --git a/lib/fields/last-edited-time.ts b/lib/fields/last-edited-time.ts
index 1895e60..da66e24 100644
--- a/lib/fields/last-edited-time.ts
+++ b/lib/fields/last-edited-time.ts
@@ -33,7 +33,7 @@ export class LastEditedTimeField extends BaseField<
     // 2024-01-22 02:51:26 => 2024-01-22T02:51:26.000Z
     const str = rawData
       ? new Date(
-          (rawData || "").split(" ").join("T") + ".000Z"
+          String(rawData || "").split(" ").join("T") + ".000Z"
         ).toLocaleString()
       : ""
     return {
diff --git a/lib/fields/link.ts b/lib/fields/link.ts
index c8ae4a0..85c144b 100644
--- a/lib/fields/link.ts
+++ b/lib/fields/link.ts
@@ -32,7 +32,7 @@ export class LinkField extends BaseField<LinkCell, ILinkProperty> {
     context?: { row?: Record<string, string> }
   ): LinkCell {
     const titleKey = `${this.column.table_column_name}__title`
-    const ids = rawData?.split(",") || []
+    const ids = (rawData || "")?.split(",") || []
     const titles = context?.row?.[titleKey]?.split(",") || []
     return {
       kind: GridCellKind.Custom,
diff --git a/lib/fields/multi-select.ts b/lib/fields/multi-select.ts
index 01e4965..92e9be7 100644
--- a/lib/fields/multi-select.ts
+++ b/lib/fields/multi-select.ts
@@ -64,7 +64,7 @@ export class MultiSelectField extends BaseField<
       data: {
         kind: "multi-select-cell",
         allowedValues: this.column.property?.options ?? [],
-        values: rawData ? rawData.split(/[\s,]+/) : [],
+        values: rawData ? String(rawData || "").split(/[\s,]+/) : [],
       },
       copyData: rawData,
       allowOverlay: true,
diff --git a/lib/fields/text.ts b/lib/fields/text.ts
index 47b06cb..0cc6931 100644
--- a/lib/fields/text.ts
+++ b/lib/fields/text.ts
@@ -19,8 +19,8 @@ export class TextField extends BaseField<TextCell, TextProperty> {
   getCellContent(rawData: string | null): TextCell {
     return {
       kind: GridCellKind.Text,
-      data: rawData ? rawData + "" : "",
-      displayData: rawData ? rawData + "" : "",
+      data: rawData ?? "",
+      displayData: rawData ?? "",
       allowOverlay: true,
     }
   }

Thanks, I will fix it later