From 9eea034bb207df77f7040fb15d83ad7b55d4b1f8 Mon Sep 17 00:00:00 2001 From: Emmad Usmani <emmadusmani@berkeley.edu> Date: Wed, 7 Aug 2024 09:10:53 -0700 Subject: [PATCH] truncate total text in pie chart (#46466) * truncate total text in pie chart * add story * Update Loki Snapshots * add e2e test --------- Co-authored-by: Metabase Automation <github-automation@metabase.com> --- ...op_static_viz_PieChart_Truncated_Total.png | Bin 0 -> 38242 bytes .../pie_chart.cy.spec.js | 33 ++ .../components/PieChart/PieChart.stories.tsx | 7 + .../components/PieChart/stories-data/index.ts | 2 + .../stories-data/truncated-total.json | 297 ++++++++++++++++++ .../visualizations/echarts/pie/constants.ts | 6 +- .../visualizations/echarts/pie/option.ts | 29 +- 7 files changed, 363 insertions(+), 11 deletions(-) create mode 100644 .loki/reference/chrome_laptop_static_viz_PieChart_Truncated_Total.png create mode 100644 frontend/src/metabase/static-viz/components/PieChart/stories-data/truncated-total.json diff --git a/.loki/reference/chrome_laptop_static_viz_PieChart_Truncated_Total.png b/.loki/reference/chrome_laptop_static_viz_PieChart_Truncated_Total.png new file mode 100644 index 0000000000000000000000000000000000000000..c44c4bbaabd94cae4bdb4f09bffab74aaf67c6a9 GIT binary patch literal 38242 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�jJsg@?y!Tc7_!Vy9v0sXg> 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 aZW+uR<2I>SCc6Xz9+#7D4rRyv?)?|KKMZC7 literal 0 HcmV?d00001 diff --git a/e2e/test/scenarios/visualizations-charts/pie_chart.cy.spec.js b/e2e/test/scenarios/visualizations-charts/pie_chart.cy.spec.js index c2b2c9db09f..2cc2e48c08f 100644 --- a/e2e/test/scenarios/visualizations-charts/pie_chart.cy.spec.js +++ b/e2e/test/scenarios/visualizations-charts/pie_chart.cy.spec.js @@ -85,6 +85,39 @@ describe("scenarios > visualizations > pie chart", () => { cy.findByText("TOTAL").should("be.visible"); }); }); + + it("should truncate the center dimension label if it overflows", () => { + visitQuestionAdhoc({ + dataset_query: { + type: "query", + query: { + "source-table": PRODUCTS_ID, + expressions: { + category_foo: [ + "concat", + ["field", PRODUCTS.CATEGORY, null], + " the quick brown fox jumps over the lazy dog", + ], + }, + aggregation: [["count"]], + breakout: [["expression", "category_foo"]], + }, + database: SAMPLE_DB_ID, + }, + display: "pie", + }); + + // Ensure chart renders before hovering the legend item + cy.findByTestId("query-visualization-root").within(() => { + cy.findByText("TOTAL"); + }); + + cy.findAllByTestId("legend-item").eq(0).realHover(); + + cy.findByTestId("query-visualization-root").within(() => { + cy.findByText("DOOHICKEY THE QUICK BROWN FOX J…"); + }); + }); }); function ensurePieChartRendered(rows, totalValue) { diff --git a/frontend/src/metabase/static-viz/components/PieChart/PieChart.stories.tsx b/frontend/src/metabase/static-viz/components/PieChart/PieChart.stories.tsx index 77f4dfef229..efaf15f55db 100644 --- a/frontend/src/metabase/static-viz/components/PieChart/PieChart.stories.tsx +++ b/frontend/src/metabase/static-viz/components/PieChart/PieChart.stories.tsx @@ -203,6 +203,13 @@ NumDecimalPlacesLegend.args = { renderingContext, }; +export const TruncatedTotal = Template.bind({}); +TruncatedTotal.args = { + rawSeries: data.truncatedTotal as any, + dashcardSettings: {}, + renderingContext, +}; + export const UnaggregatedDimension = Template.bind({}); UnaggregatedDimension.args = { rawSeries: data.unaggregatedDimension as any, diff --git a/frontend/src/metabase/static-viz/components/PieChart/stories-data/index.ts b/frontend/src/metabase/static-viz/components/PieChart/stories-data/index.ts index 8fcfb43405d..94cbd832dca 100644 --- a/frontend/src/metabase/static-viz/components/PieChart/stories-data/index.ts +++ b/frontend/src/metabase/static-viz/components/PieChart/stories-data/index.ts @@ -35,6 +35,7 @@ import singleDimension from "./single-dimension.json"; import smallMinimumSlicePercentage from "./small-min-slice-percentage.json"; import sortedMetricCol from "./sorted-metric-col.json"; import tinySlicesDisappear43766 from "./tiny-slices-disappear-43766.json"; +import truncatedTotal from "./truncated-total.json"; import unaggregatedDimension from "./unaggregated-dimension.json"; import zeroMinimumSlicePercentage from "./zero-min-slice-percentage.json"; @@ -63,6 +64,7 @@ export const data = { nullDimension, numDecimalPlacesChart, numDecimalPlacesLegend, + truncatedTotal, unaggregatedDimension, singleDimension, longDimensionName, diff --git a/frontend/src/metabase/static-viz/components/PieChart/stories-data/truncated-total.json b/frontend/src/metabase/static-viz/components/PieChart/stories-data/truncated-total.json new file mode 100644 index 00000000000..cd260f3d578 --- /dev/null +++ b/frontend/src/metabase/static-viz/components/PieChart/stories-data/truncated-total.json @@ -0,0 +1,297 @@ +[ + { + "card": { + "original_card_id": 346, + "public_uuid": null, + "parameter_usage_count": 0, + "created_at": "2024-06-05T23:14:45.449636Z", + "parameters": [], + "metabase_version": "v0.2.0-SNAPSHOT (a727fad)", + "collection": { + "authority_level": null, + "description": null, + "archived": false, + "trashed_from_location": null, + "slug": "pie", + "name": "Pie", + "personal_owner_id": null, + "type": null, + "is_sample": false, + "id": 23, + "entity_id": "hy98llXqY3i_uwtm5ISY_", + "location": "/5/", + "namespace": null, + "is_personal": false, + "created_at": "2024-06-03T19:59:20.91934Z" + }, + "visualization_settings": { + "column_settings": { + "[\"name\",\"sum\"]": { + "number_style": "decimal", + "scale": 0.001, + "suffix": " kg", + "prefix": "incredibly super duper long prefix for the weight of this penguin that weighs ", + "decimals": 2 + } + } + }, + "last-edit-info": { + "id": 1, + "email": "emmad@metabase.com", + "first_name": "Emmad", + "last_name": "Usmani", + "timestamp": "2024-06-05T23:14:45.710965Z" + }, + "collection_preview": true, + "entity_id": "-lZmLkBMVbB0U5puWZnOu", + "display": "pie", + "parameter_mappings": [], + "id": 346, + "dataset_query": { + "database": 2, + "type": "query", + "query": { + "aggregation": [ + [ + "sum", + [ + "field", + "body_mass_g", + { + "base-type": "type/Float" + } + ] + ] + ], + "breakout": [ + [ + "field", + "species", + { + "base-type": "type/Text" + } + ] + ], + "source-table": "card__92" + } + }, + "cache_ttl": null, + "embedding_params": null, + "made_public_by_id": null, + "updated_at": "2024-06-06T00:13:07.782678Z", + "moderation_reviews": [], + "creator_id": 1, + "average_query_time": 319.5882352941176, + "type": "question", + "last_used_at": "2024-06-06T00:13:07.782678Z", + "dashboard_count": 1, + "last_query_start": "2024-06-06T00:13:07.345851Z", + "name": "Pie - Column Settings - Penguins sum of body mass by species", + "query_type": "query", + "collection_id": 23, + "enable_embedding": false, + "database_id": 2, + "trashed_from_collection_id": null, + "can_write": true, + "initially_published_at": null, + "creator": { + "email": "emmad@metabase.com", + "first_name": "Emmad", + "last_login": "2024-06-05T21:21:49.288174Z", + "is_qbnewb": false, + "is_superuser": true, + "id": 1, + "last_name": "Usmani", + "date_joined": "2023-11-21T21:25:41.062104Z", + "common_name": "Emmad Usmani" + }, + "result_metadata": [ + { + "semantic_type": "type/Category", + "name": "species", + "field_ref": [ + "field", + "species", + { + "base-type": "type/Text" + } + ], + "effective_type": "type/Text", + "id": 1403, + "visibility_type": "normal", + "display_name": "Species", + "fingerprint": { + "global": { + "distinct-count": 3, + "nil%": 0 + }, + "type": { + "type/Text": { + "percent-json": 0, + "percent-url": 0, + "percent-email": 0, + "percent-state": 0, + "average-length": 6.593023255813954 + } + } + }, + "base_type": "type/Text" + }, + { + "display_name": "Sum of Body Mass G", + "semantic_type": "type/Quantity", + "field_ref": ["aggregation", 0], + "name": "sum", + "base_type": "type/Float", + "effective_type": "type/Float", + "fingerprint": { + "global": { + "distinct-count": 3, + "nil%": 0 + }, + "type": { + "type/Number": { + "min": 253850, + "q1": 330087.5, + "q3": 607962.5, + "max": 624350, + "sd": 197720.9966088579, + "avg": 479000 + } + } + } + } + ], + "can_run_adhoc_query": true, + "table_id": 151, + "collection_position": null, + "view_count": 12, + "archived": false, + "description": null, + "cache_invalidated_at": null, + "displayIsLocked": true + }, + "data": { + "rows": [ + ["Adelie", 558800], + ["Chinstrap", 253850], + ["Gentoo", 624350] + ], + "cols": [ + { + "database_type": "varchar", + "semantic_type": "type/Category", + "table_id": 151, + "name": "species", + "source": "breakout", + "field_ref": [ + "field", + "species", + { + "base-type": "type/Text" + } + ], + "effective_type": "type/Text", + "id": 1403, + "position": 1, + "visibility_type": "normal", + "display_name": "Species", + "fingerprint": { + "global": { + "distinct-count": 3, + "nil%": 0 + }, + "type": { + "type/Text": { + "percent-json": 0, + "percent-url": 0, + "percent-email": 0, + "percent-state": 0, + "average-length": 6.593023255813954 + } + } + }, + "base_type": "type/Text" + }, + { + "semantic_type": "type/Quantity", + "base_type": "type/Float", + "name": "sum", + "display_name": "Sum of Body Mass G", + "source": "aggregation", + "field_ref": ["aggregation", 0], + "aggregation_index": 0, + "effective_type": "type/Float" + } + ], + "native_form": { + "query": "SELECT \"source\".\"species\" AS \"species\", SUM(\"source\".\"body_mass_g\") AS \"sum\" FROM (SELECT \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"id\" AS \"id\", \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"species\" AS \"species\", \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"island\" AS \"island\", \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"bill_length_mm\" AS \"bill_length_mm\", \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"bill_depth_mm\" AS \"bill_depth_mm\", \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"flipper_length_mm\" AS \"flipper_length_mm\", \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"body_mass_g\" AS \"body_mass_g\", \"csv_upload_data\".\"csv_upload_penguins_20231130074915\".\"sex\" AS \"sex\" FROM \"csv_upload_data\".\"csv_upload_penguins_20231130074915\") AS \"source\" GROUP BY \"source\".\"species\" ORDER BY \"source\".\"species\" ASC", + "params": null + }, + "dataset": true, + "model": true, + "format-rows?": true, + "results_timezone": "America/Los_Angeles", + "results_metadata": { + "columns": [ + { + "semantic_type": "type/Category", + "name": "species", + "field_ref": [ + "field", + "species", + { + "base-type": "type/Text" + } + ], + "effective_type": "type/Text", + "id": 1403, + "visibility_type": "normal", + "display_name": "Species", + "fingerprint": { + "global": { + "distinct-count": 3, + "nil%": 0 + }, + "type": { + "type/Text": { + "percent-json": 0, + "percent-url": 0, + "percent-email": 0, + "percent-state": 0, + "average-length": 6.593023255813954 + } + } + }, + "base_type": "type/Text" + }, + { + "display_name": "Sum of Body Mass G", + "semantic_type": "type/Quantity", + "field_ref": ["aggregation", 0], + "name": "sum", + "base_type": "type/Float", + "effective_type": "type/Float", + "fingerprint": { + "global": { + "distinct-count": 3, + "nil%": 0 + }, + "type": { + "type/Number": { + "min": 253850, + "q1": 330087.5, + "q3": 607962.5, + "max": 624350, + "sd": 197720.9966088579, + "avg": 479000 + } + } + } + } + ] + }, + "insights": null + } + } +] diff --git a/frontend/src/metabase/visualizations/echarts/pie/constants.ts b/frontend/src/metabase/visualizations/echarts/pie/constants.ts index c6fc5d44377..3c5fb32bbce 100644 --- a/frontend/src/metabase/visualizations/echarts/pie/constants.ts +++ b/frontend/src/metabase/visualizations/echarts/pie/constants.ts @@ -2,7 +2,6 @@ import { t } from "ttag"; export const DIMENSIONS = { maxSideLength: 550, - totalDiameterThreshold: 120, padding: { legend: 16, side: 12, @@ -17,6 +16,11 @@ export const DIMENSIONS = { padding: 4, }, }, + total: { + minWidth: 120, + valueFontSize: 22, + labelFontSize: 14, + }, }; export const SLICE_THRESHOLD = 0.025; // approx 1 degree in percentage diff --git a/frontend/src/metabase/visualizations/echarts/pie/option.ts b/frontend/src/metabase/visualizations/echarts/pie/option.ts index 9db471d17d0..4274a38486f 100644 --- a/frontend/src/metabase/visualizations/echarts/pie/option.ts +++ b/frontend/src/metabase/visualizations/echarts/pie/option.ts @@ -2,6 +2,7 @@ import Color from "color"; import type { EChartsOption } from "echarts"; import { getTextColorForBackground } from "metabase/lib/colors"; +import { truncateText } from "metabase/static-viz/lib/text"; import type { ComputedVisualizationSettings, RenderingContext, @@ -36,21 +37,27 @@ function getTotalGraphicOption( let labelText = ""; // Don't display any text if there isn't enough width - const hasSufficientWidth = - outerRadius * 2 >= DIMENSIONS.totalDiameterThreshold; + const hasSufficientWidth = outerRadius * 2 >= DIMENSIONS.total.minWidth; if (hasSufficientWidth && settings["pie.show_total"]) { - valueText = formatters.formatMetric( - hoveredIndex != null - ? chartModel.slices[hoveredIndex].data.displayValue - : chartModel.total, + valueText = truncateText( + formatters.formatMetric( + hoveredIndex != null + ? chartModel.slices[hoveredIndex].data.displayValue + : chartModel.total, + ), + outerRadius, // innerRadius technically makes more sense, but looks too narrow in practice + DIMENSIONS.total.valueFontSize, ); - labelText = + labelText = truncateText( hoveredIndex != null ? formatters .formatDimension(chartModel.slices[hoveredIndex].data.key) .toUpperCase() - : TOTAL_TEXT; + : TOTAL_TEXT, + outerRadius, + DIMENSIONS.total.labelFontSize, + ); } return { @@ -59,10 +66,11 @@ function getTotalGraphicOption( left: "center", children: [ { + // Value type: "text", cursor: "text", style: { - fontSize: "22px", + fontSize: `${DIMENSIONS.total.valueFontSize}px`, fontWeight: "700", textAlign: "center", fontFamily: renderingContext.fontFamily, @@ -71,11 +79,12 @@ function getTotalGraphicOption( }, }, { + // Label type: "text", cursor: "text", top: 26, style: { - fontSize: "14px", + fontSize: `${DIMENSIONS.total.labelFontSize}px`, fontWeight: "700", textAlign: "center", fontFamily: renderingContext.fontFamily, -- GitLab