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