From de6ef688707d4cb265eabbd921755e183c1803f4 Mon Sep 17 00:00:00 2001 From: Brian Holmes Date: Tue, 13 Jan 2026 15:10:17 -0500 Subject: [PATCH 01/10] wip --- .../filters/CanvasComparisonPill.svelte | 2 + .../src/features/canvas/filters/util.ts | 35 +++--- .../src/features/canvas/stores/time-state.ts | 2 +- .../dashboards/filters/Filters.svelte | 2 + .../get-explore-state-from-yaml-config.ts | 1 + .../comparison-pill/ComparisonPill.svelte | 1 + .../super-pill/components/Comparison.svelte | 19 +-- .../time-controls/time-control-store.ts | 20 +++- .../time-controls/time-range-store.ts | 28 +++-- .../url-state/getDefaultExplorePreset.ts | 1 + .../src/lib/time/comparisons/index.spec.ts | 26 ++-- web-common/src/lib/time/comparisons/index.ts | 111 ++++++++++++------ web-common/src/lib/time/config.ts | 2 +- web-common/src/lib/time/ranges/formatter.ts | 1 + 14 files changed, 157 insertions(+), 94 deletions(-) diff --git a/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte b/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte index cd825836179..405c80881ad 100644 --- a/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte +++ b/web-common/src/features/canvas/filters/CanvasComparisonPill.svelte @@ -48,6 +48,7 @@ $: comparisonOptions = getComparisonOptionsForCanvas( selectedTimeRange, allowCustomTimeRange, + activeTimeZone, ); function onSelectComparisonRange( @@ -101,6 +102,7 @@ {minTimeGrain} maxDate={minDate} minDate={maxDate} + timeGrain={activeTimeGrain} timeComparisonOptionsState={comparisonOptions} selectedComparison={selectedComparisonTimeRange} showComparison={showTimeComparison} diff --git a/web-common/src/features/canvas/filters/util.ts b/web-common/src/features/canvas/filters/util.ts index 58d95c2525f..58adf5ddd37 100644 --- a/web-common/src/features/canvas/filters/util.ts +++ b/web-common/src/features/canvas/filters/util.ts @@ -1,17 +1,16 @@ -import { - getAvailableComparisonsForTimeRange, - getComparisonRange, -} from "@rilldata/web-common/lib/time/comparisons"; -import { PREVIOUS_COMPLETE_DATE_RANGES } from "@rilldata/web-common/lib/time/config"; +import { getAvailableComparisonsForTimeRange } from "@rilldata/web-common/lib/time/comparisons"; import { TimeComparisonOption, TimeRangePreset, type DashboardTimeControls, } from "@rilldata/web-common/lib/time/types"; +import { getComparisonInterval } from "../stores/time-state"; +import { DateTime, Interval } from "luxon"; export function getComparisonOptionsForCanvas( selectedTimeRange: DashboardTimeControls | undefined, allowCustomTimeRange: boolean, + timezone: string, ) { if (!selectedTimeRange) { return []; @@ -27,35 +26,31 @@ export function getComparisonOptionsForCanvas( allOptions = allOptions.filter((o) => o !== TimeComparisonOption.CUSTOM); } - if ( - selectedTimeRange?.name && - selectedTimeRange?.name in PREVIOUS_COMPLETE_DATE_RANGES - ) { - // Previous complete ranges should only have previous period. - // Other options dont make sense with our current wording of the comparison ranges. - allOptions = [TimeComparisonOption.CONTIGUOUS]; - if (allowCustomTimeRange) allOptions.push(TimeComparisonOption.CUSTOM); - } - const timeComparisonOptions = getAvailableComparisonsForTimeRange( allTimeRange.start, allTimeRange.end, selectedTimeRange.start, selectedTimeRange.end, allOptions, + timezone, + ); + + const interval = Interval.fromDateTimes( + DateTime.fromJSDate(selectedTimeRange.start, { zone: timezone }), + DateTime.fromJSDate(selectedTimeRange.end, { zone: timezone }), ); return timeComparisonOptions.map((co, i) => { - const comparisonTimeRange = getComparisonRange( - selectedTimeRange.start, - selectedTimeRange.end, + const comparisonTimeRange = getComparisonInterval( + interval as Interval, co, + timezone, ); return { name: co, key: i, - start: comparisonTimeRange.start, - end: comparisonTimeRange.end, + start: comparisonTimeRange?.start.toJSDate(), + end: comparisonTimeRange?.end.toJSDate(), }; }); } diff --git a/web-common/src/features/canvas/stores/time-state.ts b/web-common/src/features/canvas/stores/time-state.ts index 4edb7560523..421d83ee016 100644 --- a/web-common/src/features/canvas/stores/time-state.ts +++ b/web-common/src/features/canvas/stores/time-state.ts @@ -428,7 +428,7 @@ const timeGrainToComparisonOptionMap: Record< [V1TimeGrain.TIME_GRAIN_UNSPECIFIED]: TimeComparisonOption.CONTIGUOUS, }; -function getComparisonInterval( +export function getComparisonInterval( interval: Interval | undefined, comparisonRange: string | undefined, activeTimeZone: string, diff --git a/web-common/src/features/dashboards/filters/Filters.svelte b/web-common/src/features/dashboards/filters/Filters.svelte index 9770b7a14c5..2de97610a6e 100644 --- a/web-common/src/features/dashboards/filters/Filters.svelte +++ b/web-common/src/features/dashboards/filters/Filters.svelte @@ -300,6 +300,8 @@ | TimeComparisonOption | undefined, allTimeRange, + + activeTimeZone, ); makeTimeSeriesTimeRangeAndUpdateAppState(range, timeGrain, { diff --git a/web-common/src/features/dashboards/stores/get-explore-state-from-yaml-config.ts b/web-common/src/features/dashboards/stores/get-explore-state-from-yaml-config.ts index f0d29c61182..12199fab74e 100644 --- a/web-common/src/features/dashboards/stores/get-explore-state-from-yaml-config.ts +++ b/web-common/src/features/dashboards/stores/get-explore-state-from-yaml-config.ts @@ -175,6 +175,7 @@ function getDefaultComparisonTimeRangeName( timeRange, undefined, allTimeRange, + timezone, ); return comparisonTimeRangeName; diff --git a/web-common/src/features/dashboards/time-controls/comparison-pill/ComparisonPill.svelte b/web-common/src/features/dashboards/time-controls/comparison-pill/ComparisonPill.svelte index 3709a0ccdbf..51f1691d42c 100644 --- a/web-common/src/features/dashboards/time-controls/comparison-pill/ComparisonPill.svelte +++ b/web-common/src/features/dashboards/time-controls/comparison-pill/ComparisonPill.svelte @@ -115,6 +115,7 @@ minDate={DateTime.fromJSDate(allTimeRange.start)} timeComparisonOptionsState={$timeComparisonOptionsState} {minTimeGrain} + timeGrain={activeTimeGrain} selectedComparison={selectedComparisonTimeRange} showComparison={showTimeComparison} currentInterval={interval} diff --git a/web-common/src/features/dashboards/time-controls/super-pill/components/Comparison.svelte b/web-common/src/features/dashboards/time-controls/super-pill/components/Comparison.svelte index 804e2ad68db..a37ae6a110f 100644 --- a/web-common/src/features/dashboards/time-controls/super-pill/components/Comparison.svelte +++ b/web-common/src/features/dashboards/time-controls/super-pill/components/Comparison.svelte @@ -1,7 +1,6 @@