From 1bb2f18765e6f83e6e7e0cb90d3e3e6f2dc5fb4d Mon Sep 17 00:00:00 2001
From: Paul Rosenzweig <paulrosenzweig@users.noreply.github.com>
Date: Mon, 20 Jul 2020 14:55:11 -0400
Subject: [PATCH] avoid render loop that POSTed field values to the server
 (#12955)

---
 .../admin/datamodel/components/FieldRemapping.jsx | 15 ++++++++++++---
 .../scenarios/admin/datamodel/field.cy.spec.js    |  3 +--
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx b/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx
index 55616a44127..f90e16f8a8c 100644
--- a/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx
@@ -328,9 +328,18 @@ export class ValueRemappings extends React.Component {
     this._updateEditingRemappings(this.props.remappings);
   }
 
-  componentWillReceiveProps(nextProps) {
-    if (nextProps.remappings !== this.props.remappings) {
-      this._updateEditingRemappings(nextProps.remappings);
+  componentDidUpdate(prevProps) {
+    const { remappings } = this.props;
+    if (
+      !// check if the Maps are different
+      (
+        prevProps.remappings &&
+        remappings &&
+        prevProps.remappings.size === remappings.size &&
+        [...remappings].every(([k, v]) => prevProps.remappings.get(k) === v)
+      )
+    ) {
+      this._updateEditingRemappings(remappings);
     }
   }
 
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
index 37dc97875b9..a51f4681d98 100644
--- a/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
@@ -142,11 +142,10 @@ describe("scenarios > admin > datamodel > field", () => {
       cy.contains("Title");
     });
 
-    it.skip("lets you change to 'Custom mapping' and set custom values (Issue #12771)", () => {
+    it("lets you change to 'Custom mapping' and set custom values (Issue #12771)", () => {
       visitAlias("@ORDERS_QUANTITY_URL");
 
       cy.contains("Use original value").click();
-      // *** Clicking this button starts a loop
       cy.contains("Custom mapping").click();
 
       cy.get('input[value="0"]')
-- 
GitLab