From 12b68dfd85c51dface86f358da8ec25b4e85d7c1 Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Wed, 16 Sep 2026 20:03:19 +0530 Subject: [PATCH 1/2] fix: canvas custom comparison not applying --- .../src/features/canvas/filters/CanvasComparisonPill.svelte | 4 ++-- .../src/features/dashboards/url-state/time-ranges/RillTime.ts | 2 ++ .../src/features/dashboards/url-state/time-ranges/parser.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte b/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte index d53a823a0eaf..91dcd6e1a4a8 100644 --- a/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte +++ b/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte @@ -101,8 +101,8 @@ {#if activeTimeGrain && interval} Date: Wed, 16 Sep 2026 22:11:18 +0530 Subject: [PATCH 2/2] PR review --- web-admin/src/features/bookmarks/utils.ts | 9 ++----- .../url-state/time-ranges/RillTime.ts | 4 --- .../url-state/time-ranges/parser.ts | 11 +++++++- .../src/lib/time/comparisons/index.spec.ts | 27 +++++++++++++++++++ web-common/src/lib/time/comparisons/index.ts | 14 ++++++++-- 5 files changed, 51 insertions(+), 14 deletions(-) diff --git a/web-admin/src/features/bookmarks/utils.ts b/web-admin/src/features/bookmarks/utils.ts index a89bb3200fd1..91e5446ffa06 100644 --- a/web-admin/src/features/bookmarks/utils.ts +++ b/web-admin/src/features/bookmarks/utils.ts @@ -1,7 +1,7 @@ import type { V1Bookmark } from "@rilldata/web-admin/client"; import { isHomeBookmark } from "@rilldata/web-admin/features/bookmarks/selectors.ts"; import { cleanUrlParams } from "@rilldata/web-common/features/dashboards/url-state/clean-url-params.ts"; -import { parseRillTime } from "@rilldata/web-common/features/dashboards/url-state/time-ranges/parser.ts"; +import { isAbsoluteTimeRange } from "@rilldata/web-common/features/dashboards/url-state/time-ranges/parser.ts"; import { ExploreStateURLParams } from "@rilldata/web-common/features/dashboards/url-state/url-params"; import { prettyFormatTimeRange } from "@rilldata/web-common/lib/time/ranges/formatter.ts"; import { type DashboardTimeControls } from "@rilldata/web-common/lib/time/types.ts"; @@ -223,12 +223,7 @@ function isAbsoluteTimeRangeBookmark(bookmarkUrlParams: URLSearchParams) { const timeRange = bookmarkUrlParams.get(ExploreStateURLParams.TimeRange); if (!timeRange) return false; - try { - const rt = parseRillTime(timeRange); - return rt.isAbsoluteTime(); - } catch { - return false; - } + return isAbsoluteTimeRange(timeRange); } export function isFilterOnlyBookmark( diff --git a/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts b/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts index 03dd835b83f8..91ea47db36f7 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts +++ b/web-common/src/features/dashboards/url-state/time-ranges/RillTime.ts @@ -102,10 +102,6 @@ export class RillTime { } } - public isAbsoluteTime() { - return this.interval instanceof RillIsoInterval; - } - public toString() { let timeRange = this.interval.toString(); diff --git a/web-common/src/features/dashboards/url-state/time-ranges/parser.ts b/web-common/src/features/dashboards/url-state/time-ranges/parser.ts index 383faafb4aa2..c90aeeec2d08 100644 --- a/web-common/src/features/dashboards/url-state/time-ranges/parser.ts +++ b/web-common/src/features/dashboards/url-state/time-ranges/parser.ts @@ -14,7 +14,16 @@ export function parseRillTime(rillTimeRange: string): RillTime { export function isNewRillTimeFormat(rillTime: string): boolean { try { const parser = parseRillTime(rillTime); - return !parser.isOldFormat && !parser.isAbsolute; + return !parser.isOldFormat; + } catch { + return false; + } +} + +export function isAbsoluteTimeRange(rillTime: string): boolean { + try { + const parser = parseRillTime(rillTime); + return parser.isAbsolute; } catch { return false; } diff --git a/web-common/src/lib/time/comparisons/index.spec.ts b/web-common/src/lib/time/comparisons/index.spec.ts index a7769450f34c..72ecff94d6d3 100644 --- a/web-common/src/lib/time/comparisons/index.spec.ts +++ b/web-common/src/lib/time/comparisons/index.spec.ts @@ -35,6 +35,33 @@ const contiguousAndCustomComparisonRanges = [ end: new Date("2020-03-05T06:05:00.000Z"), }, }, + // custom cases + { + description: + "should return the parsed range when comparison is a custom absolute range", + input: { + start: new Date("2020-03-05T00:00:00.000Z"), + end: new Date("2020-03-06T00:00:00.000Z"), + comparison: "2024-01-01T00:00:00.000Z,2024-02-01T00:00:00.000Z", + }, + output: { + start: new Date("2024-01-01T00:00:00.000Z"), + end: new Date("2024-02-01T00:00:00.000Z"), + }, + }, + { + description: + "should return the parsed range when comparison is a custom absolute range using an interval separator", + input: { + start: new Date("2020-03-05T00:00:00.000Z"), + end: new Date("2020-03-06T00:00:00.000Z"), + comparison: "2024-01-01T00:00:00.000Z/2024-02-01T00:00:00.000Z", + }, + output: { + start: new Date("2024-01-01T00:00:00.000Z"), + end: new Date("2024-02-01T00:00:00.000Z"), + }, + }, ]; const periodStart = new Date("2020-03-05T00:00:00.000Z"); diff --git a/web-common/src/lib/time/comparisons/index.ts b/web-common/src/lib/time/comparisons/index.ts index 81ec883e78de..83a6164f29d2 100644 --- a/web-common/src/lib/time/comparisons/index.ts +++ b/web-common/src/lib/time/comparisons/index.ts @@ -14,7 +14,10 @@ import { TimeOffsetType, TimeRangePreset, } from "../types"; -import { isNewRillTimeFormat } from "@rilldata/web-common/features/dashboards/url-state/time-ranges/parser.ts"; +import { + isAbsoluteTimeRange, + isNewRillTimeFormat, +} from "@rilldata/web-common/features/dashboards/url-state/time-ranges/parser.ts"; export function getComparisonTransform( start: Date, @@ -322,7 +325,14 @@ export function getComparisonInterval( comparisonRange: string | undefined, activeTimeZone: string, ): Interval | undefined { - if (!interval || !comparisonRange || isNewRillTimeFormat(comparisonRange)) + // New format ranges are resolved by the backend, so there is nothing to compute here. + // Absolute ranges are the exception: they carry their own start and end, so they are parsed below. + if ( + !interval || + !comparisonRange || + (isNewRillTimeFormat(comparisonRange) && + !isAbsoluteTimeRange(comparisonRange)) + ) return undefined; let comparisonInterval: Interval | undefined = undefined;