From d550a27e5ecb7b21a5e7669cbea0495a1f2f9d50 Mon Sep 17 00:00:00 2001
From: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
Date: Fri, 26 May 2023 16:04:16 -0300
Subject: [PATCH] fix dashcards crash (#31044)

---
 .../lib/settings/visualization.js             |  9 ++++---
 .../lib/settings/visualization.unit.spec.js   | 25 +++++++++++++++++++
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/frontend/src/metabase/visualizations/lib/settings/visualization.js b/frontend/src/metabase/visualizations/lib/settings/visualization.js
index 6f037386177..75fe135f2f7 100644
--- a/frontend/src/metabase/visualizations/lib/settings/visualization.js
+++ b/frontend/src/metabase/visualizations/lib/settings/visualization.js
@@ -1,4 +1,5 @@
 import { t } from "ttag";
+import { assocIn } from "icepick";
 import { getVisualizationRaw } from "metabase/visualizations";
 import { isVirtualDashCard } from "metabase/dashboard/utils";
 import { normalizeFieldRef } from "metabase-lib/queries/utils/dataset";
@@ -64,12 +65,14 @@ function normalizeColumnSettings(columnSettings) {
 }
 
 export function getStoredSettingsForSeries(series) {
-  const storedSettings =
+  let storedSettings =
     (series && series[0] && series[0].card.visualization_settings) || {};
   if (storedSettings.column_settings) {
     // normalize any settings stored under old style keys: [ref, [fk->, 1, 2]]
-    storedSettings.column_settings = normalizeColumnSettings(
-      storedSettings.column_settings,
+    storedSettings = assocIn(
+      storedSettings,
+      ["column_settings"],
+      normalizeColumnSettings(storedSettings.column_settings),
     );
   }
   return storedSettings;
diff --git a/frontend/src/metabase/visualizations/lib/settings/visualization.unit.spec.js b/frontend/src/metabase/visualizations/lib/settings/visualization.unit.spec.js
index 4ceb03d7600..32b723198e7 100644
--- a/frontend/src/metabase/visualizations/lib/settings/visualization.unit.spec.js
+++ b/frontend/src/metabase/visualizations/lib/settings/visualization.unit.spec.js
@@ -1,3 +1,4 @@
+import icepick from "icepick";
 // NOTE: need to load visualizations first for getSettings to work
 import "metabase/visualizations/index";
 
@@ -164,6 +165,30 @@ describe("visualization_settings", () => {
       ]);
       expect(settings).toEqual({ foo: "bar" });
     });
+    it("should work correctly with frozen objects", () => {
+      const settings = getStoredSettingsForSeries(
+        icepick.freeze([
+          {
+            card: {
+              visualization_settings: {
+                column_settings: {
+                  '["name","A"]': {
+                    number_style: "currency",
+                  },
+                },
+              },
+            },
+          },
+        ]),
+      );
+      expect(settings).toEqual({
+        column_settings: {
+          '["name","A"]': {
+            number_style: "currency",
+          },
+        },
+      });
+    });
   });
   describe("table.cell_column", () => {
     it("should pick the first metric column", () => {
-- 
GitLab