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