From 12a70624bd03e32398430b1a9a96823f3e10dd9a Mon Sep 17 00:00:00 2001
From: Jonathan Eatherly <jonathan.eatherly@involver.com>
Date: Tue, 7 Nov 2017 14:52:40 -0600
Subject: [PATCH] Add custom null state messaging when visualization has no
 columns enabled

---
 .../components/Visualization.jsx              |  28 ++--
 .../visualizations/visualizations/Table.jsx   |  41 ++++--
 .../components/Visualization.integ.spec.js    |   2 +-
 .../ChartSettingOrderedFields.unit.spec.js    | 121 ++++++++++++++++++
 .../app/assets/img/hidden-field.png           | Bin 0 -> 4740 bytes
 .../app/assets/img/hidden-field@2x.png        | Bin 0 -> 10283 bytes
 6 files changed, 166 insertions(+), 26 deletions(-)
 create mode 100644 frontend/test/visualizations/components/settings/ChartSettingOrderedFields.unit.spec.js
 create mode 100644 resources/frontend_client/app/assets/img/hidden-field.png
 create mode 100644 resources/frontend_client/app/assets/img/hidden-field@2x.png

diff --git a/frontend/src/metabase/visualizations/components/Visualization.jsx b/frontend/src/metabase/visualizations/components/Visualization.jsx
index f336f993a9c..fb9ed971871 100644
--- a/frontend/src/metabase/visualizations/components/Visualization.jsx
+++ b/frontend/src/metabase/visualizations/components/Visualization.jsx
@@ -258,7 +258,7 @@ export default class Visualization extends Component {
     }
 
     render() {
-        const { actionButtons, className, showTitle, isDashboard, width, height, errorIcon, isSlow, expectedDuration, replacementContent } = this.props;
+        const { actionButtons, className, showTitle, isDashboard, width, height, isSlow, expectedDuration, replacementContent } = this.props;
         const { series, CardVisualization } = this.state;
         const small = width < 330;
 
@@ -270,6 +270,7 @@ export default class Visualization extends Component {
         }
 
         let error = this.props.error || this.state.error;
+        let errorIcon = this.props.errorIcon || this.state.errorIcon;
         let loading = !(series && series.length > 0 && _.every(series, (s) => s.data));
         let noResults = false;
 
@@ -287,17 +288,22 @@ export default class Visualization extends Component {
                     }
                 } catch (e) {
                     error = e.message || "Could not display this chart with this data.";
-                    if (e instanceof ChartSettingsError && this.props.onOpenChartSettings) {
-                        error = (
-                            <div>
-                                <div>{error}</div>
-                                <div className="mt2">
-                                    <button className="Button Button--primary Button--medium" onClick={this.props.onOpenChartSettings}>
-                                        {e.buttonText}
-                                    </button>
+                    if (e instanceof ChartSettingsError) {
+                        if (this.props.onOpenChartSettings) {
+                            error = (
+                                <div>
+                                    <div>{error}</div>
+                                    <div className="mt2">
+                                        <button className="Button Button--primary Button--medium" onClick={this.props.onOpenChartSettings}>
+                                            {e.buttonText}
+                                        </button>
+                                    </div>
                                 </div>
-                            </div>
-                        );
+                            );
+                        }
+                        if (e.section === "Columns") {
+                            errorIcon = 'empty';
+                        }
                     } else if (e instanceof MinRowsError) {
                         noResults = true;
                     }
diff --git a/frontend/src/metabase/visualizations/visualizations/Table.jsx b/frontend/src/metabase/visualizations/visualizations/Table.jsx
index 7082cc4d2ac..1a3e4f112eb 100644
--- a/frontend/src/metabase/visualizations/visualizations/Table.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/Table.jsx
@@ -11,9 +11,9 @@ import Query from "metabase/lib/query";
 import { isMetric, isDimension } from "metabase/lib/schema_metadata";
 import { columnsAreValid, getFriendlyName } from "metabase/visualizations/lib/utils";
 import ChartSettingOrderedFields from "metabase/visualizations/components/settings/ChartSettingOrderedFields.jsx";
-import { MinColumnsError } from "metabase/visualizations/lib/errors";
 
 import _ from "underscore";
+import RetinaImage from "react-retina-image";
 import { getIn } from "icepick";
 
 import type { DatasetData } from "metabase/meta/types/Dataset";
@@ -45,10 +45,6 @@ export default class Table extends Component {
 
     static checkRenderable([{ data: { cols, rows} }], settings) {
         // scalar can always be rendered, nothing needed here
-        const enabledColumns = (settings["table.columns"] || []).filter(f => f.enabled);
-        if (enabledColumns.length < 1) {
-            throw new MinColumnsError(1, enabledColumns.length);
-        }
     }
 
     static settings = {
@@ -130,21 +126,38 @@ export default class Table extends Component {
         const { data } = this.state;
         const sort = getIn(card, ["dataset_query", "query", "order_by"]) || null;
         const isPivoted = settings["table.pivot"];
+        const isColumnsDisabled = (settings["table.columns"] || []).filter(f => f.enabled).length < 1;
         const TableComponent = isDashboard ? TableSimple : TableInteractive;
 
         if (!data) {
             return null;
         }
 
-        return (
-            // $FlowFixMe
-            <TableComponent
-                {...this.props}
-                data={data}
-                isPivoted={isPivoted}
-                sort={sort}
-            />
-        );
+        if (isColumnsDisabled) {
+            return (
+                <div className={"flex-full px1 pb1 text-centered flex flex-column layout-centered " + (isDashboard ? "text-slate-light" : "text-slate")}>
+                    <RetinaImage
+                        width={99}
+                        src="app/assets/img/hidden-field.png"
+                        forceOriginalDimensions={false}
+                        className="mb2"
+                    />
+                    <span className="h4 text-bold">
+                        Every field is hidden right now
+                    </span>
+                </div>
+            )
+        } else {
+            return (
+                // $FlowFixMe
+                <TableComponent
+                    {...this.props}
+                    data={data}
+                    isPivoted={isPivoted}
+                    sort={sort}
+                />
+            );
+        }
     }
 }
 
diff --git a/frontend/test/visualizations/components/Visualization.integ.spec.js b/frontend/test/visualizations/components/Visualization.integ.spec.js
index 275a365fa2f..7b26d15eb74 100644
--- a/frontend/test/visualizations/components/Visualization.integ.spec.js
+++ b/frontend/test/visualizations/components/Visualization.integ.spec.js
@@ -2,7 +2,7 @@ import "__support__/integrated_tests";
 
 import React from "react";
 
-import Visualization from "metabase/visualizations/components/Visualization";
+import ChartSettingOrderedFields from "metabase/visualizations/components/Visualization";
 
 import LegendHeader from "metabase/visualizations/components/LegendHeader";
 import LegendItem from "metabase/visualizations/components/LegendItem";
diff --git a/frontend/test/visualizations/components/settings/ChartSettingOrderedFields.unit.spec.js b/frontend/test/visualizations/components/settings/ChartSettingOrderedFields.unit.spec.js
new file mode 100644
index 00000000000..4df304f2f02
--- /dev/null
+++ b/frontend/test/visualizations/components/settings/ChartSettingOrderedFields.unit.spec.js
@@ -0,0 +1,121 @@
+import "__support__/integrated_tests";
+
+import React from "react";
+
+import ChartSettingOrderedFields from "metabase/visualizations/components/settings/ChartSettingOrderedFields";
+
+import { ScalarCard } from "../__support__/visualizations";
+
+import { mount } from "enzyme";
+
+function renderVisualization(props) {
+    return mount(<ChartSettingOrderedFields className="spread" {...props} />);
+}
+
+function getScalarTitles (scalarComponent) {
+    return scalarComponent.find('.Scalar-title').map((title) => title.text())
+}
+
+function getTitles(viz) {
+    return viz.find(LegendHeader).map(header =>
+        header.find(LegendItem).map((item) => item.props().title)
+    )
+}
+
+describe("Visualization", () => {
+    describe("not in dashboard", () => {
+        describe("scalar card", () => {
+            it("should not render title", () => {
+                let viz = renderVisualization({ series: [ScalarCard("Foo")] });
+                expect(getScalarTitles(viz)).toEqual([]);
+            });
+        });
+
+        describe("line card", () => {
+            it("should not render card title", () => {
+                let viz = renderVisualization({ series: [LineCard("Foo")] });
+                expect(getTitles(viz)).toEqual([]);
+            });
+            it("should not render setting title", () => {
+                let viz = renderVisualization({ series: [LineCard("Foo", { card: { visualization_settings: { "card.title": "Foo_title" }}})] });
+                expect(getTitles(viz)).toEqual([]);
+            });
+            it("should render breakout multiseries titles", () => {
+                let viz = renderVisualization({ series: [MultiseriesLineCard("Foo")] });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_cat1", "Foo_cat2"]
+                ]);
+            });
+        });
+    });
+
+    describe("in dashboard", () => {
+        describe("scalar card", () => {
+            it("should render a scalar title, not a legend title", () => {
+                let viz = renderVisualization({ series: [ScalarCard("Foo")], showTitle: true, isDashboard: true });
+                expect(getTitles(viz)).toEqual([]);
+                expect(getScalarTitles(viz).length).toEqual(1);
+            });
+            it("should render title when loading", () => {
+                let viz = renderVisualization({ series: [ScalarCard("Foo", { data: null })], showTitle: true });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_name"]
+                ]);
+            });
+            it("should render title when there's an error", () => {
+                let viz = renderVisualization({ series: [ScalarCard("Foo")], showTitle: true, error: "oops" });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_name"]
+                ]);
+            });
+            it("should not render scalar title", () => {
+                let viz = renderVisualization({ series: [ScalarCard("Foo")], showTitle: true });
+                expect(getTitles(viz)).toEqual([]);
+            });
+            it("should render multi scalar titles", () => {
+                let viz = renderVisualization({ series: [ScalarCard("Foo"), ScalarCard("Bar")], showTitle: true });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_name", "Bar_name"]
+                ]);
+            });
+        });
+
+        describe("line card", () => {
+            it("should render normal title", () => {
+                let viz = renderVisualization({ series: [LineCard("Foo")], showTitle: true });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_name"]
+                ]);
+            });
+            it("should render normal title and breakout multiseries titles", () => {
+                let viz = renderVisualization({ series: [MultiseriesLineCard("Foo")], showTitle: true });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_name"],
+                    ["Foo_cat1", "Foo_cat2"]
+                ]);
+            });
+            it("should render dashboard multiseries titles", () => {
+                let viz = renderVisualization({ series: [LineCard("Foo"), LineCard("Bar")], showTitle: true });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_name", "Bar_name"]
+                ]);
+            });
+            it("should render dashboard multiseries titles and chart setting title", () => {
+                let viz = renderVisualization({ series: [
+                    LineCard("Foo", { card: { visualization_settings: { "card.title": "Foo_title" }}}),
+                    LineCard("Bar")
+                ], showTitle: true });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_title"],
+                    ["Foo_name", "Bar_name"]
+                ]);
+            });
+            it("should render multiple breakout multiseries titles (with both card titles and breakout values)", () => {
+                let viz = renderVisualization({ series: [MultiseriesLineCard("Foo"), MultiseriesLineCard("Bar")], showTitle: true });
+                expect(getTitles(viz)).toEqual([
+                    ["Foo_name: Foo_cat1", "Foo_name: Foo_cat2", "Bar_name: Bar_cat1", "Bar_name: Bar_cat2"]
+                ]);
+            });
+        });
+    });
+});
diff --git a/resources/frontend_client/app/assets/img/hidden-field.png b/resources/frontend_client/app/assets/img/hidden-field.png
new file mode 100644
index 0000000000000000000000000000000000000000..534b47c4de9a55a5ff6563e43a17e2fac7023339
GIT binary patch
literal 4740
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
Sm@=*a0000<MNUMnLSTXc8aPD&

literal 0
HcmV?d00001

diff --git a/resources/frontend_client/app/assets/img/hidden-field@2x.png b/resources/frontend_client/app/assets/img/hidden-field@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..5fb615c47eb72f0bf27da619014aaa343d90f289
GIT binary patch
literal 10283
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
Ra{3QSPD)v_THGY$e*u-_J;wk5

literal 0
HcmV?d00001

-- 
GitLab