diff --git a/web-common/src/features/canvas/components/leaderboard/LeaderboardDisplay.svelte b/web-common/src/features/canvas/components/leaderboard/LeaderboardDisplay.svelte index f4d5ea5c6c1..0db0c99abd6 100644 --- a/web-common/src/features/canvas/components/leaderboard/LeaderboardDisplay.svelte +++ b/web-common/src/features/canvas/components/leaderboard/LeaderboardDisplay.svelte @@ -6,6 +6,7 @@ import { splitWhereFilter } from "@rilldata/web-common/features/dashboards/filters/measure-filters/measure-filter-utils"; import { COMPARISON_COLUMN_WIDTH, + deltaColumn, valueColumn, } from "@rilldata/web-common/features/dashboards/leaderboard/leaderboard-widths"; import Leaderboard from "@rilldata/web-common/features/dashboards/leaderboard/Leaderboard.svelte"; @@ -108,13 +109,14 @@ // Reset column widths when the measure changes $: if (leaderboardMeasureNames) { valueColumn.reset(); + deltaColumn.reset(); } $: totalContextWidth = leaderboardMeasureNames.reduce( (sum, measureName) => sum + $valueColumn + - (showTimeComparison ? COMPARISON_COLUMN_WIDTH * 2 : 0) + + (showTimeComparison ? $deltaColumn + COMPARISON_COLUMN_WIDTH : 0) + (isValidPercentOfTotal(measureName) ? COMPARISON_COLUMN_WIDTH : 0), 0, ); diff --git a/web-common/src/features/dashboards/leaderboard/Leaderboard.svelte b/web-common/src/features/dashboards/leaderboard/Leaderboard.svelte index 5c72ec89b69..28611caf324 100644 --- a/web-common/src/features/dashboards/leaderboard/Leaderboard.svelte +++ b/web-common/src/features/dashboards/leaderboard/Leaderboard.svelte @@ -42,7 +42,11 @@ getSort, prepareLeaderboardItemData, } from "./leaderboard-utils"; - import { COMPARISON_COLUMN_WIDTH, valueColumn } from "./leaderboard-widths"; + import { + COMPARISON_COLUMN_WIDTH, + deltaColumn, + valueColumn, + } from "./leaderboard-widths"; const runtimeClient = useRuntimeClient(); const gutterWidth = 24; @@ -346,10 +350,7 @@ /> {/if} {#if isTimeComparisonActive && shouldShowContextColumns(measureName)} - + - 0 - : deltaAbsMap[measureName] < 0) - ? "text-kpi-negative" - : deltaAbsMap[measureName] !== null && - (lowerIsBetterMap[measureName] - ? deltaAbsMap[measureName] < 0 - : deltaAbsMap[measureName] > 0) - ? "text-kpi-positive" - : ""} - truncate={true} - /> +
+ 0 + : deltaAbsMap[measureName] < 0) + ? "text-kpi-negative" + : deltaAbsMap[measureName] !== null && + (lowerIsBetterMap[measureName] + ? deltaAbsMap[measureName] < 0 + : deltaAbsMap[measureName] > 0) + ? "text-kpi-positive" + : ""} + truncate={true} + /> +
{/if} diff --git a/web-common/src/features/dashboards/leaderboard/leaderboard-widths.ts b/web-common/src/features/dashboards/leaderboard/leaderboard-widths.ts index d04301baba2..a8489334705 100644 --- a/web-common/src/features/dashboards/leaderboard/leaderboard-widths.ts +++ b/web-common/src/features/dashboards/leaderboard/leaderboard-widths.ts @@ -9,6 +9,10 @@ export const MEASURES_PADDING = 16; const MIN_COL_WIDTH = 56; const MAX_COL_WIDTH = 164; +// A comparison cell loses 8px to its own horizontal padding. The rest is +// breathing room, so the value doesn't butt up against the previous column. +const COMPARISON_PADDING = 16; + export const DEFAULT_DIMENSION_COLUMN_WIDTH = 164; export const MIN_DIMENSION_COLUMN_WIDTH = 120; export const MAX_DIMENSION_COLUMN_WIDTH = 480; @@ -16,19 +20,27 @@ export const MAX_DIMENSION_COLUMN_WIDTH = 480; class ColumnStore { private value: Writable; private defaultWidth: number; + private minWidth: number; + private padding: number; subscribe: (this: void, run: (value: number) => void) => () => void; - constructor(defaultWidth: number = DEFAULT_COLUMN_WIDTH) { + constructor( + defaultWidth: number = DEFAULT_COLUMN_WIDTH, + minWidth: number = MIN_COL_WIDTH, + padding: number = MEASURES_PADDING, + ) { this.defaultWidth = defaultWidth; + this.minWidth = minWidth; + this.padding = padding; this.value = writable(defaultWidth); this.subscribe = this.value.subscribe; } update = (newValue: number) => { newValue = clamp( - MIN_COL_WIDTH, - Math.ceil(newValue) + MEASURES_PADDING, + this.minWidth, + Math.ceil(newValue) + this.padding, MAX_COL_WIDTH, ); const value = get(this.value); @@ -44,7 +56,14 @@ class ColumnStore { } export const valueColumn = new ColumnStore(DEFAULT_COLUMN_WIDTH); -export const deltaColumn = new ColumnStore(COMPARISON_COLUMN_WIDTH); + +// Delta columns hold formatted measure values, which can be far wider than the +// default comparison width, e.g. a currency delta like "-$1,234,567.89". +export const deltaColumn = new ColumnStore( + COMPARISON_COLUMN_WIDTH, + COMPARISON_COLUMN_WIDTH, + COMPARISON_PADDING, +); // Width of the dimension column in explore leaderboards. Shared by all // leaderboards so resizing one keeps them symmetric; persisted so the