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..2c1068d0db3 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 "@rilldata/web-common/lib/time/comparisons"; +import { DateTime, Interval } from "luxon"; export function getComparisonOptionsForCanvas( selectedTimeRange: DashboardTimeControls | undefined, allowCustomTimeRange: boolean, + timezone: string, ) { if (!selectedTimeRange) { return []; @@ -27,35 +26,42 @@ 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, ); - return timeComparisonOptions.map((co, i) => { - const comparisonTimeRange = getComparisonRange( - selectedTimeRange.start, - selectedTimeRange.end, - co, - ); - return { + const interval = Interval.fromDateTimes( + DateTime.fromJSDate(selectedTimeRange.start, { zone: timezone }), + DateTime.fromJSDate(selectedTimeRange.end, { zone: timezone }), + ); + + if (!interval.isValid) { + return []; + } + + const options: { + name: TimeComparisonOption; + key: number; + start: Date; + end: Date; + }[] = []; + + timeComparisonOptions.forEach((co, i) => { + const comparisonTimeRange = getComparisonInterval(interval, co, timezone); + + if (!comparisonTimeRange) return; + options.push({ name: co, key: i, - start: comparisonTimeRange.start, - end: comparisonTimeRange.end, - }; + start: comparisonTimeRange.start.toJSDate(), + end: comparisonTimeRange.end.toJSDate(), + }); }); + + return options; } diff --git a/web-common/src/features/canvas/stores/time-state.ts b/web-common/src/features/canvas/stores/time-state.ts index 4edb7560523..d1574e6fc9a 100644 --- a/web-common/src/features/canvas/stores/time-state.ts +++ b/web-common/src/features/canvas/stores/time-state.ts @@ -25,6 +25,7 @@ import { } from "@rilldata/web-common/lib/time/new-grains"; import { maybeWritable } from "@rilldata/web-common/lib/store-utils"; import type { TimeManager } from "./time-manager"; +import { getComparisonInterval } from "@rilldata/web-common/lib/time/comparisons"; export type MinMax = { min: DateTime; @@ -427,39 +428,3 @@ const timeGrainToComparisonOptionMap: Record< [V1TimeGrain.TIME_GRAIN_YEAR]: TimeComparisonOption.YEAR, [V1TimeGrain.TIME_GRAIN_UNSPECIFIED]: TimeComparisonOption.CONTIGUOUS, }; - -function getComparisonInterval( - interval: Interval | undefined, - comparisonRange: string | undefined, - activeTimeZone: string, -): Interval | undefined { - if (!interval || !comparisonRange) return undefined; - - let comparisonInterval: Interval | undefined = undefined; - - const COMPARISON_DURATIONS = { - "rill-PP": interval.toDuration(), - "rill-PD": { days: 1 }, - "rill-PW": { weeks: 1 }, - "rill-PM": { months: 1 }, - "rill-PQ": { quarter: 1 }, - "rill-PY": { years: 1 }, - }; - - const duration = - COMPARISON_DURATIONS[comparisonRange as keyof typeof COMPARISON_DURATIONS]; - - if (duration) { - comparisonInterval = Interval.fromDateTimes( - interval.start.minus(duration), - interval.end.minus(duration), - ); - } else { - const normalizedRange = comparisonRange.replace(",", "/"); - comparisonInterval = Interval.fromISO(normalizedRange).mapEndpoints((dt) => - dt.setZone(activeTimeZone), - ); - } - - return comparisonInterval.isValid ? comparisonInterval : undefined; -} 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..08a409cb84a 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 @@