From e99af4ca09d991f85576a1c2327e78682477f78a Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 4 Nov 2021 19:50:17 +0100 Subject: [PATCH 01/16] Fix the heatmap time discretization --- .../heatmap/layout/viewmodel/viewmodel.ts | 58 +++++++++---------- .../src/chart_types/heatmap/specs/heatmap.ts | 21 +++++-- .../state/selectors/get_heatmap_table.ts | 4 +- packages/charts/src/utils/chrono/chrono.ts | 6 +- .../src/utils/chrono/elasticsearch.test.ts | 8 +-- .../charts/src/utils/chrono/elasticsearch.ts | 44 ++++++++++++-- packages/charts/src/utils/chrono/moment.ts | 6 +- 7 files changed, 97 insertions(+), 50 deletions(-) diff --git a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts index 5a12a328ee..7dbe2e912c 100644 --- a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts +++ b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts @@ -17,14 +17,14 @@ import { ScaleContinuous } from '../../../../scales'; import { ScaleType } from '../../../../scales/constants'; import { SettingsSpec } from '../../../../specs'; import { withTextMeasure } from '../../../../utils/bbox/canvas_text_bbox_calculator'; -import { snapDateToESInterval } from '../../../../utils/chrono/elasticsearch'; -import { clamp, range } from '../../../../utils/common'; +import { addIntervalToTime, timeRange } from '../../../../utils/chrono/elasticsearch'; +import { clamp } from '../../../../utils/common'; import { Dimensions } from '../../../../utils/dimensions'; import { ContinuousDomain } from '../../../../utils/domain'; import { Logger } from '../../../../utils/logger'; import { Theme } from '../../../../utils/themes/theme'; import { PrimitiveValue } from '../../../partition_chart/layout/utils/group_by_rollup'; -import { HeatmapSpec } from '../../specs'; +import { HeatmapSpec, HeatmapTimeScale } from '../../specs'; import { HeatmapTable } from '../../state/selectors/compute_chart_dimensions'; import { ColorScale } from '../../state/selectors/get_color_scale'; import { GridHeightParams } from '../../state/selectors/get_grid_full_height'; @@ -100,33 +100,26 @@ export function shapeViewModel( const yInvertedScale = scaleQuantize>().domain([0, height]).range(yValues); - const timeScale = - xDomain.type === ScaleType.Time - ? new ScaleContinuous( - { - type: ScaleType.Time, - domain: xDomain.domain as number[], - range: [0, chartDimensions.width], - nice: false, - }, - { - desiredTickCount: estimatedNonOverlappingTickCount(chartDimensions.width, config.xAxisLabel), - timeZone: config.timeZone, - }, - ) - : null; - - const xValues = timeScale - ? range( - snapDateToESInterval( - (xDomain.domain as ContinuousDomain)[0], - { type: 'fixed', unit: 'ms', quantity: xDomain.minInterval }, - 'start', - ), - (xDomain.domain as ContinuousDomain)[1], - xDomain.minInterval, + const xScaleConfig = spec.xScale; + const timeScale = isTimeXScale(xScaleConfig) + ? new ScaleContinuous( + { + type: ScaleType.Time, + domain: xDomain.domain as number[], + range: [0, chartDimensions.width], + nice: false, + }, + { + desiredTickCount: estimatedNonOverlappingTickCount(chartDimensions.width, config.xAxisLabel), + timeZone: config.timeZone, + }, ) + : null; + + const xValues = isTimeXScale(xScaleConfig) + ? timeRange((xDomain.domain as ContinuousDomain)[0], (xDomain.domain as ContinuousDomain)[1], xScaleConfig.interval) : xDomain.domain; + // compute the scale for the columns positions const xScale = scaleBand>().domain(xValues).range([0, chartDimensions.width]); @@ -291,8 +284,9 @@ export function shapeViewModel( const allXValuesInRange: Array> = getValuesInRange(xValues, startX, endX); const allYValuesInRange: Array> = getValuesInRange(yValues, startY, endY); const invertedXValues: Array> = - timeScale && typeof endX === 'number' ? [startX, endX + xDomain.minInterval] : [...allXValuesInRange]; - + isTimeXScale(xScaleConfig) && typeof endX === 'number' + ? [startX, addIntervalToTime(endX, xScaleConfig.interval, xScaleConfig.timeZone)] + : [...allXValuesInRange]; const cells: Cell[] = []; allXValuesInRange.forEach((x) => { @@ -423,3 +417,7 @@ function getCellKey(x: NonNullable, y: NonNullable) { return rangesToHide.some(([min, max]) => min <= value && value < max); } + +function isTimeXScale(scale: HeatmapSpec['xScale']): scale is HeatmapTimeScale { + return scale.type === ScaleType.Time; +} diff --git a/packages/charts/src/chart_types/heatmap/specs/heatmap.ts b/packages/charts/src/chart_types/heatmap/specs/heatmap.ts index 36a8fe96f7..02ccde2aa7 100644 --- a/packages/charts/src/chart_types/heatmap/specs/heatmap.ts +++ b/packages/charts/src/chart_types/heatmap/specs/heatmap.ts @@ -12,10 +12,11 @@ import { ChartType } from '../..'; import { Color } from '../../../common/colors'; import { Predicate } from '../../../common/predicate'; import { ScaleType } from '../../../scales/constants'; -import { SeriesScales, Spec } from '../../../specs'; +import { Spec } from '../../../specs'; import { SpecType } from '../../../specs/constants'; import { getConnect, specComponentFactory } from '../../../state/spec_factory'; import { Accessor, AccessorFn } from '../../../utils/accessor'; +import { ESCalendarInterval, ESFixedInterval } from '../../../utils/chrono/elasticsearch'; import { Datum, RecursivePartial } from '../../../utils/common'; import { config } from '../layout/config/config'; import { Config } from '../layout/types/config_types'; @@ -27,7 +28,7 @@ const defaultProps = { data: [], xAccessor: ({ x }: { x: string | number }) => x, yAccessor: ({ y }: { y: string | number }) => y, - xScaleType: X_SCALE_DEFAULT.type, + xScale: { type: X_SCALE_DEFAULT.type }, valueAccessor: ({ value }: { value: string | number }) => value, valueFormatter: (value: number) => `${value}`, xSortPredicate: Predicate.AlphaAsc, @@ -58,6 +59,18 @@ export interface HeatmapBandsColorScale { labelFormatter?: (start: number, end: number) => string; } +/** @alpha */ +export interface HeatmapTimeScale { + type: typeof ScaleType.Time; + interval: ESCalendarInterval | ESFixedInterval; + timeZone: string; +} + +/** @alpha */ +export interface HeatmapNonTimeScale { + type: typeof ScaleType.Ordinal | typeof ScaleType.Linear; +} + /** @alpha */ export interface HeatmapSpec extends Spec { specType: typeof SpecType.Series; @@ -70,7 +83,7 @@ export interface HeatmapSpec extends Spec { valueFormatter: (value: number) => string; xSortPredicate: Predicate; ySortPredicate: Predicate; - xScaleType: SeriesScales['xScaleType']; + xScale: HeatmapTimeScale | HeatmapNonTimeScale; config: RecursivePartial; highlightedData?: { x: Array; y: Array }; name?: string; @@ -90,6 +103,6 @@ export const Heatmap: React.FunctionComponent< | 'xSortPredicate' | 'valueFormatter' | 'config' - | 'xScaleType' + | 'xScale' >(defaultProps), ); diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts index 9a7ae82b32..2d8231f5ad 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts @@ -64,7 +64,7 @@ export const getHeatmapTableSelector = createCustomCachedSelector( resultData.xDomain = mergeXDomain( { - type: getXScaleTypeFromSpec(spec.xScaleType), + type: getXScaleTypeFromSpec(spec.xScale.type), nice: getXNiceFromSpec(), isBandScale: false, desiredTickCount: X_SCALE_DEFAULT.desiredTickCount, @@ -74,7 +74,7 @@ export const getHeatmapTableSelector = createCustomCachedSelector( ); // sort values by their predicates - if (spec.xScaleType === ScaleType.Ordinal) { + if (spec.xScale.type === ScaleType.Ordinal) { resultData.xDomain.domain.sort(getPredicateFn(xSortPredicate)); } resultData.yValues.sort(getPredicateFn(ySortPredicate)); diff --git a/packages/charts/src/utils/chrono/chrono.ts b/packages/charts/src/utils/chrono/chrono.ts index 495a826e37..1942876a27 100644 --- a/packages/charts/src/utils/chrono/chrono.ts +++ b/packages/charts/src/utils/chrono/chrono.ts @@ -18,13 +18,13 @@ import { formatTimeObj, diffTimeObjs, } from './moment'; -import { CalendarIntervalUnit, CalendarObj, DateTime, FixedIntervalUnit, Minutes, UnixTimestamp } from './types'; +import { CalendarIntervalUnit, DateTime, FixedIntervalUnit, Minutes, UnixTimestamp } from './types'; /** @internal */ export function addTime( dateTime: DateTime, timeZone: string | undefined, - unit: keyof CalendarObj, + unit: CalendarIntervalUnit | FixedIntervalUnit, count: number, ): UnixTimestamp { return timeObjToUnixTimestamp(addTimeToObj(getTimeObj(dateTime, timeZone), unit, count)); @@ -34,7 +34,7 @@ export function addTime( export function subtractTime( dateTime: DateTime, timeZone: string | undefined, - unit: keyof CalendarObj, + unit: CalendarIntervalUnit | FixedIntervalUnit, count: number, ): UnixTimestamp { return timeObjToUnixTimestamp(subtractTimeToObj(getTimeObj(dateTime, timeZone), unit, count)); diff --git a/packages/charts/src/utils/chrono/elasticsearch.test.ts b/packages/charts/src/utils/chrono/elasticsearch.test.ts index 9db1f5c05d..5f1c3b13d3 100644 --- a/packages/charts/src/utils/chrono/elasticsearch.test.ts +++ b/packages/charts/src/utils/chrono/elasticsearch.test.ts @@ -15,7 +15,7 @@ describe('snap to interval', () => { const initialDate = DateTime.fromISO('2020-01-03T07:00:01Z'); const snappedDate = snapDateToESInterval( initialDate.toMillis(), - { type: 'calendar', unit: 'd', quantity: 1 }, + { type: 'calendar', unit: 'd', value: 1 }, 'start', 'UTC', ); @@ -26,7 +26,7 @@ describe('snap to interval', () => { const initialDate = DateTime.fromISO('2020-01-03T07:00:01Z'); const snappedDate = snapDateToESInterval( initialDate.toMillis(), - { type: 'calendar', unit: 'd', quantity: 1 }, + { type: 'calendar', unit: 'd', value: 1 }, 'end', 'UTC', ); @@ -37,7 +37,7 @@ describe('snap to interval', () => { const initialDate = DateTime.fromISO('2020-01-03T07:00:01Z'); const snappedDate = snapDateToESInterval( initialDate.toMillis(), - { type: 'fixed', unit: 'm', quantity: 30 }, + { type: 'fixed', unit: 'm', value: 30 }, 'start', 'UTC', ); @@ -48,7 +48,7 @@ describe('snap to interval', () => { const initialDate = DateTime.fromISO('2020-01-03T07:00:01Z'); const snappedDate = snapDateToESInterval( initialDate.toMillis(), - { type: 'fixed', unit: 'm', quantity: 30 }, + { type: 'fixed', unit: 'm', value: 30 }, 'end', 'UTC', ); diff --git a/packages/charts/src/utils/chrono/elasticsearch.ts b/packages/charts/src/utils/chrono/elasticsearch.ts index 4b0af3c5c2..115b851df8 100644 --- a/packages/charts/src/utils/chrono/elasticsearch.ts +++ b/packages/charts/src/utils/chrono/elasticsearch.ts @@ -7,7 +7,7 @@ */ import { TimeMs } from '../../common/geometry'; -import { endOf, getUnixTimestamp, startOf } from './chrono'; +import { addTime, endOf, getUnixTimestamp, getUTCOffset, startOf } from './chrono'; import { CalendarIntervalUnit, FixedIntervalUnit, UnixTimestamp } from './types'; /** @internal */ @@ -42,14 +42,14 @@ export const ES_FIXED_INTERVAL_UNIT_TO_BASE: Record export type ESCalendarInterval = { type: 'calendar'; unit: ESCalendarIntervalUnit; - quantity: number; + value: number; }; /** @internal */ export interface ESFixedInterval { type: 'fixed'; unit: ESFixedIntervalUnit; - quantity: number; + value: number; } const esCalendarIntervalToChronoInterval: Record = { @@ -102,8 +102,42 @@ function esFixedIntervalSnap( snapTo: 'start' | 'end', timeZone?: string, ): UnixTimestamp { - const unitMultiplier = interval.quantity * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit]; + const unitMultiplier = interval.value * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit]; const unixTimestamp = getUnixTimestamp(date, timeZone); - const roundedDate = Math.floor(unixTimestamp / unitMultiplier) * unitMultiplier; + const utcOffsetInMs = getUTCOffset(date, timeZone) * 60 * 1000; + const roundedDate = Math.floor((unixTimestamp + utcOffsetInMs) / unitMultiplier) * unitMultiplier - utcOffsetInMs; return snapTo === 'start' ? roundedDate : roundedDate + unitMultiplier - 1; } + +/** @internal */ +export function timeRange( + from: number, + to: number, + interval: ESCalendarInterval | ESFixedInterval, + timeZone?: string, +): number[] { + const snappedFrom = snapDateToESInterval(from, interval, 'start', timeZone); + const snappedTo = snapDateToESInterval(to - 1, interval, 'start', timeZone); + const values: number[] = [snappedFrom]; + let current = snappedFrom; + + while (current < snappedTo) { + current = addIntervalToTime(current, interval, timeZone); + values.push(current); + } + return values; +} + +/** @internal */ +export function addIntervalToTime(time: number, interval: ESCalendarInterval | ESFixedInterval, timeZone?: string) { + return interval.type === 'fixed' + ? utcToLocal(localToUTC(time, timeZone) + interval.value * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit], timeZone) + : addTime(time, timeZone, esCalendarIntervalToChronoInterval[interval.unit], interval.value); +} + +function utcToLocal(time: number, timeZone?: string) { + return time - getUTCOffset(time, timeZone) * 60 * 1000; +} +function localToUTC(time: number, timeZone?: string) { + return time + getUTCOffset(time, timeZone) * 60 * 1000; +} diff --git a/packages/charts/src/utils/chrono/moment.ts b/packages/charts/src/utils/chrono/moment.ts index 339bdfc291..1d5627d742 100644 --- a/packages/charts/src/utils/chrono/moment.ts +++ b/packages/charts/src/utils/chrono/moment.ts @@ -60,10 +60,12 @@ export const addTimeToObj = (obj: moment.Moment, unit: CalendarIntervalUnit | Fi export const subtractTimeToObj = (obj: moment.Moment, unit: CalendarIntervalUnit | FixedIntervalUnit, count: number) => obj.subtract(count, unit); /** @internal */ -export const startTimeOfObj = (obj: moment.Moment, unit: CalendarIntervalUnit | FixedIntervalUnit) => obj.startOf(unit); +export const startTimeOfObj = (obj: moment.Moment, unit: CalendarIntervalUnit | FixedIntervalUnit) => + obj.startOf(unit === 'week' ? 'isoWeek' : unit); // we should use the ISO week to align to ES /** @internal */ -export const endTimeOfObj = (obj: moment.Moment, unit: CalendarIntervalUnit | FixedIntervalUnit) => obj.endOf(unit); +export const endTimeOfObj = (obj: moment.Moment, unit: CalendarIntervalUnit | FixedIntervalUnit) => + obj.endOf(unit === 'week' ? 'isoWeek' : unit); // we should use the ISO week to align to ES /** @internal */ export const timeObjToUTCOffset = (obj: moment.Moment): Minutes => obj.utcOffset(); From 4f6e7c59262337b715992292b4b80b7424e8627c Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 4 Nov 2021 19:58:08 +0100 Subject: [PATCH 02/16] Update API specs --- packages/charts/api/charts.api.md | 41 ++++++++++++++++++- packages/charts/src/chart_types/specs.ts | 2 +- packages/charts/src/index.ts | 7 ++++ .../charts/src/utils/chrono/elasticsearch.ts | 9 ++-- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index 22b56eeb25..6d98f2265b 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -709,6 +709,29 @@ export const entryKey: ([key]: ArrayEntry) => string; // @public (undocumented) export const entryValue: ([, value]: ArrayEntry) => ArrayNode; +// @public (undocumented) +export type ESCalendarInterval = { + type: 'calendar'; + unit: ESCalendarIntervalUnit; + value: number; +}; + +// @public (undocumented) +export type ESCalendarIntervalUnit = 'minute' | 'm' | 'hour' | 'h' | 'day' | 'd' | 'week' | 'w' | 'month' | 'M' | 'quarter' | 'q' | 'year' | 'y'; + +// @public (undocumented) +export interface ESFixedInterval { + // (undocumented) + type: 'fixed'; + // (undocumented) + unit: ESFixedIntervalUnit; + // (undocumented) + value: number; +} + +// @public (undocumented) +export type ESFixedIntervalUnit = 'ms' | 's' | 'm' | 'h' | 'd'; + // @alpha export interface ExternalPointerEventsSettings { tooltip: TooltipPortalSettings<'chart'> & { @@ -1036,6 +1059,12 @@ export interface HeatmapConfig { // @public (undocumented) export type HeatmapElementEvent = [Cell, SeriesIdentifier]; +// @alpha (undocumented) +export interface HeatmapNonTimeScale { + // (undocumented) + type: typeof ScaleType.Ordinal | typeof ScaleType.Linear; +} + // @alpha (undocumented) export interface HeatmapSpec extends Spec { // (undocumented) @@ -1062,7 +1091,7 @@ export interface HeatmapSpec extends Spec { // (undocumented) xAccessor: Accessor | AccessorFn; // (undocumented) - xScaleType: SeriesScales['xScaleType']; + xScale: HeatmapTimeScale | HeatmapNonTimeScale; // (undocumented) xSortPredicate: Predicate; // (undocumented) @@ -1071,6 +1100,16 @@ export interface HeatmapSpec extends Spec { ySortPredicate: Predicate; } +// @alpha (undocumented) +export interface HeatmapTimeScale { + // (undocumented) + interval: ESCalendarInterval | ESFixedInterval; + // (undocumented) + timeZone: string; + // (undocumented) + type: typeof ScaleType.Time; +} + // @public export const HIERARCHY_ROOT_KEY: Key; diff --git a/packages/charts/src/chart_types/specs.ts b/packages/charts/src/chart_types/specs.ts index 6f6d636a4b..0e307b7ad8 100644 --- a/packages/charts/src/chart_types/specs.ts +++ b/packages/charts/src/chart_types/specs.ts @@ -21,4 +21,4 @@ export * from './xy_chart/utils/specs'; export { Partition } from './partition_chart/specs'; -export { Heatmap, HeatmapSpec } from './heatmap/specs'; +export { Heatmap, HeatmapSpec, HeatmapTimeScale, HeatmapNonTimeScale } from './heatmap/specs'; diff --git a/packages/charts/src/index.ts b/packages/charts/src/index.ts index b25ed1e11d..902b92577a 100644 --- a/packages/charts/src/index.ts +++ b/packages/charts/src/index.ts @@ -96,3 +96,10 @@ export { Pixels, Ratio } from './common/geometry'; export { AdditiveNumber } from './utils/accessor'; export { FontStyle, FONT_STYLES } from './common/text_utils'; export { Color } from './common/colors'; + +export { + ESCalendarInterval, + ESCalendarIntervalUnit, + ESFixedInterval, + ESFixedIntervalUnit, +} from './utils/chrono/elasticsearch'; diff --git a/packages/charts/src/utils/chrono/elasticsearch.ts b/packages/charts/src/utils/chrono/elasticsearch.ts index 115b851df8..99a8e1347b 100644 --- a/packages/charts/src/utils/chrono/elasticsearch.ts +++ b/packages/charts/src/utils/chrono/elasticsearch.ts @@ -10,7 +10,7 @@ import { TimeMs } from '../../common/geometry'; import { addTime, endOf, getUnixTimestamp, getUTCOffset, startOf } from './chrono'; import { CalendarIntervalUnit, FixedIntervalUnit, UnixTimestamp } from './types'; -/** @internal */ +/** @public */ export type ESCalendarIntervalUnit = | 'minute' | 'm' @@ -27,7 +27,8 @@ export type ESCalendarIntervalUnit = | 'year' | 'y'; -type ESFixedIntervalUnit = 'ms' | 's' | 'm' | 'h' | 'd'; +/** @public */ +export type ESFixedIntervalUnit = 'ms' | 's' | 'm' | 'h' | 'd'; /** @internal */ export const ES_FIXED_INTERVAL_UNIT_TO_BASE: Record = { @@ -38,14 +39,14 @@ export const ES_FIXED_INTERVAL_UNIT_TO_BASE: Record d: 1000 * 60 * 60 * 24, }; -/** @internal */ +/** @public */ export type ESCalendarInterval = { type: 'calendar'; unit: ESCalendarIntervalUnit; value: number; }; -/** @internal */ +/** @public */ export interface ESFixedInterval { type: 'fixed'; unit: ESFixedIntervalUnit; From 5c16f8486e619cc4a23509a2675a462043284731 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 4 Nov 2021 19:58:38 +0100 Subject: [PATCH 03/16] Fix basic heatmap story --- storybook/stories/heatmap/1_basic.story.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storybook/stories/heatmap/1_basic.story.tsx b/storybook/stories/heatmap/1_basic.story.tsx index 4804c093d5..b4896e4fa8 100644 --- a/storybook/stories/heatmap/1_basic.story.tsx +++ b/storybook/stories/heatmap/1_basic.story.tsx @@ -109,7 +109,7 @@ export const Example = () => { showLegend legendPosition="right" brushAxis="both" - xDomain={{ min: 1572825600000, max: 1572912000000, minInterval: 1800000 }} + xDomain={{ min: 1572825600000, max: 1572912000000 }} debugState={debugState} baseTheme={useBaseTheme()} onBrushEnd={(e) => { @@ -136,7 +136,7 @@ export const Example = () => { valueAccessor={(d) => d.value} valueFormatter={(d) => `${Number(d.toFixed(2))}℃`} ySortPredicate="numAsc" - xScaleType={ScaleType.Time} + xScale={{ type: ScaleType.Time, timeZone: 'UTC', interval: { type: 'fixed', value: 30, unit: 'm' } }} config={config} highlightedData={persistCellsSelection ? selection : undefined} /> From 7c89a570bc0703c767d6b0f227452083580b85b7 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 4 Nov 2021 20:02:56 +0100 Subject: [PATCH 04/16] Fix time story --- storybook/stories/heatmap/3_time.story.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/storybook/stories/heatmap/3_time.story.tsx b/storybook/stories/heatmap/3_time.story.tsx index 5586a3dcdf..f6f2cd8180 100644 --- a/storybook/stories/heatmap/3_time.story.tsx +++ b/storybook/stories/heatmap/3_time.story.tsx @@ -84,12 +84,11 @@ export const Example = () => { { valueAccessor={(d) => d[2]} valueFormatter={(d) => d.toFixed(2)} ySortPredicate="numAsc" - xScaleType={ScaleType.Time} + xScale={{ + type: ScaleType.Time, + interval: { + type: 'fixed', + unit: 'h', + value: 1, + }, + timeZone: 'Europe/Rome', + }} config={config} /> From eb00c5dc6937836edf1b96b8ce3bf0a3b378aa23 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 4 Nov 2021 20:11:16 +0100 Subject: [PATCH 05/16] Align both ESInterval to interfaces --- packages/charts/src/utils/chrono/elasticsearch.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/charts/src/utils/chrono/elasticsearch.ts b/packages/charts/src/utils/chrono/elasticsearch.ts index 99a8e1347b..3d74d67a3e 100644 --- a/packages/charts/src/utils/chrono/elasticsearch.ts +++ b/packages/charts/src/utils/chrono/elasticsearch.ts @@ -40,11 +40,11 @@ export const ES_FIXED_INTERVAL_UNIT_TO_BASE: Record }; /** @public */ -export type ESCalendarInterval = { +export interface ESCalendarInterval { type: 'calendar'; unit: ESCalendarIntervalUnit; value: number; -}; +} /** @public */ export interface ESFixedInterval { From bc0fffd738295d62bf01ce5684527472279a1423 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 4 Nov 2021 20:24:52 +0100 Subject: [PATCH 06/16] Fix test used types --- .../state/selectors/get_brushed_highlighted_shapes.test.ts | 4 ++-- .../heatmap/state/selectors/get_picked_cells.test.ts | 2 +- packages/charts/src/mocks/specs/specs.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts index 2d7833d995..c84c6ac9d6 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts @@ -29,7 +29,7 @@ describe('Categorical heatmap brush', () => { onBrushEnd: onBrushEndMock, }), MockSeriesSpec.heatmap({ - xScaleType: ScaleType.Ordinal, + xScale: { type: ScaleType.Ordinal }, data: [ { x: 'a', y: 'ya', value: 1 }, { x: 'b', y: 'ya', value: 2 }, @@ -91,7 +91,7 @@ describe('Temporal heatmap brush', () => { onBrushEnd: onBrushEndMock, }), MockSeriesSpec.heatmap({ - xScaleType: ScaleType.Time, + xScale: { type: ScaleType.Time, timeZone: 'UTC', interval: { type: 'calendar', unit: 'd', value: 1 } }, data: [ { x: start.toMillis(), y: 'ya', value: 1 }, { x: start.plus({ days: 1 }).toMillis(), y: 'ya', value: 2 }, diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_picked_cells.test.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_picked_cells.test.ts index 1cdbeb230f..e70a0d2756 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_picked_cells.test.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_picked_cells.test.ts @@ -26,7 +26,7 @@ describe('Heatmap picked cells', () => { [ MockGlobalSpec.settingsNoMargins({ onBrushEnd: onBrushEndMock }), MockSeriesSpec.heatmap({ - xScaleType: ScaleType.Ordinal, + xScale: { type: ScaleType.Ordinal }, data: [ { x: 'a', y: 'ya', value: 1 }, { x: 'b', y: 'ya', value: 2 }, diff --git a/packages/charts/src/mocks/specs/specs.ts b/packages/charts/src/mocks/specs/specs.ts index de693631fa..f0e9aa3d9a 100644 --- a/packages/charts/src/mocks/specs/specs.ts +++ b/packages/charts/src/mocks/specs/specs.ts @@ -185,7 +185,7 @@ export class MockSeriesSpec { }, xAccessor: ({ x }: { x: string | number }) => x, yAccessor: ({ y }: { y: string | number }) => y, - xScaleType: X_SCALE_DEFAULT.type, + xScale: { type: X_SCALE_DEFAULT.type }, valueAccessor: ({ value }: { value: string | number }) => value, valueFormatter: (value: number) => `${value}`, xSortPredicate: Predicate.AlphaAsc, From 100bf5b28d243229cb95fbb8254ad0dcba7f8304 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 5 Nov 2021 15:47:22 +0100 Subject: [PATCH 07/16] Fix the fixed interval time range Add dataset and updated stories --- packages/charts/api/charts.api.md | 13 +- .../heatmap/layout/config/config.ts | 2 - .../heatmap/layout/types/config_types.ts | 1 - .../heatmap/layout/viewmodel/viewmodel.ts | 47 +- .../selectors/compute_chart_dimensions.ts | 6 +- .../get_brushed_highlighted_shapes.test.ts | 8 +- .../state/selectors/get_heatmap_table.ts | 39 +- .../selectors/get_x_axis_right_overflow.ts | 18 +- .../charts/src/utils/chrono/elasticsearch.ts | 26 +- .../data_samples/test_dataset_heatmap.ts | 4242 +++++++++++++++++ storybook/stories/heatmap/1_basic.story.tsx | 11 +- storybook/stories/heatmap/3_time.story.tsx | 14 +- .../heatmap/4_test_time_snap.story.tsx | 104 + storybook/stories/heatmap/heatmap.stories.tsx | 1 + 14 files changed, 4447 insertions(+), 85 deletions(-) create mode 100644 packages/charts/src/utils/data_samples/test_dataset_heatmap.ts create mode 100644 storybook/stories/heatmap/4_test_time_snap.story.tsx diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index 6d98f2265b..9873fb9ab1 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -710,11 +710,14 @@ export const entryKey: ([key]: ArrayEntry) => string; export const entryValue: ([, value]: ArrayEntry) => ArrayNode; // @public (undocumented) -export type ESCalendarInterval = { +export interface ESCalendarInterval { + // (undocumented) type: 'calendar'; + // (undocumented) unit: ESCalendarIntervalUnit; + // (undocumented) value: number; -}; +} // @public (undocumented) export type ESCalendarIntervalUnit = 'minute' | 'm' | 'hour' | 'h' | 'day' | 'd' | 'week' | 'w' | 'month' | 'M' | 'quarter' | 'q' | 'year' | 'y'; @@ -1021,8 +1024,6 @@ export interface HeatmapConfig { // (undocumented) maxRowHeight: Pixels; // (undocumented) - timeZone: string; - // (undocumented) width: Pixels; // Warning: (ae-forgotten-export) The symbol "Font" needs to be exported by the entry point index.d.ts // @@ -2461,8 +2462,8 @@ export type YDomainRange = YDomainBase & DomainRange & LogScaleOptions; // Warnings were encountered during analysis: // // src/chart_types/heatmap/layout/types/config_types.ts:19:13 - (ae-forgotten-export) The symbol "SizeRatio" needs to be exported by the entry point index.d.ts -// src/chart_types/heatmap/layout/types/config_types.ts:47:5 - (ae-forgotten-export) The symbol "TextAlign" needs to be exported by the entry point index.d.ts -// src/chart_types/heatmap/layout/types/config_types.ts:48:5 - (ae-forgotten-export) The symbol "TextBaseline" needs to be exported by the entry point index.d.ts +// src/chart_types/heatmap/layout/types/config_types.ts:46:5 - (ae-forgotten-export) The symbol "TextAlign" needs to be exported by the entry point index.d.ts +// src/chart_types/heatmap/layout/types/config_types.ts:47:5 - (ae-forgotten-export) The symbol "TextBaseline" needs to be exported by the entry point index.d.ts // src/chart_types/partition_chart/layout/types/config_types.ts:137:5 - (ae-forgotten-export) The symbol "TimeMs" needs to be exported by the entry point index.d.ts // src/chart_types/partition_chart/layout/types/config_types.ts:138:5 - (ae-forgotten-export) The symbol "AnimKeyframe" needs to be exported by the entry point index.d.ts diff --git a/packages/charts/src/chart_types/heatmap/layout/config/config.ts b/packages/charts/src/chart_types/heatmap/layout/config/config.ts index 0ef5278d7c..7cf6a33580 100644 --- a/packages/charts/src/chart_types/heatmap/layout/config/config.ts +++ b/packages/charts/src/chart_types/heatmap/layout/config/config.ts @@ -33,8 +33,6 @@ export const config: Config = { fill: 'gray', }, - timeZone: 'UTC', - xAxisLabel: { name: 'X Value', visible: true, diff --git a/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts b/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts index 7fdf528a30..f6c6e21a1c 100644 --- a/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts +++ b/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts @@ -21,7 +21,6 @@ export interface Config { maxColumnWidth: Pixels; // general text config fontFamily: FontFamily; - timeZone: string; /** * Config of the mask over the area outside of the selected cells diff --git a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts index 7dbe2e912c..4d616be658 100644 --- a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts +++ b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts @@ -17,10 +17,9 @@ import { ScaleContinuous } from '../../../../scales'; import { ScaleType } from '../../../../scales/constants'; import { SettingsSpec } from '../../../../specs'; import { withTextMeasure } from '../../../../utils/bbox/canvas_text_bbox_calculator'; -import { addIntervalToTime, timeRange } from '../../../../utils/chrono/elasticsearch'; +import { addIntervalToTime } from '../../../../utils/chrono/elasticsearch'; import { clamp } from '../../../../utils/common'; import { Dimensions } from '../../../../utils/dimensions'; -import { ContinuousDomain } from '../../../../utils/domain'; import { Logger } from '../../../../utils/logger'; import { Theme } from '../../../../utils/themes/theme'; import { PrimitiveValue } from '../../../partition_chart/layout/utils/group_by_rollup'; @@ -86,7 +85,7 @@ export function shapeViewModel( ): ShapeViewModel { const gridStrokeWidth = config.grid.stroke.width ?? 1; - const { table, yValues, xDomain } = heatmapTable; + const { table, yValues, xValues, xNumericExtent } = heatmapTable; // measure the text width of all rows values to get the grid area width const boxedYValues = yValues.map }>((value) => ({ @@ -100,26 +99,6 @@ export function shapeViewModel( const yInvertedScale = scaleQuantize>().domain([0, height]).range(yValues); - const xScaleConfig = spec.xScale; - const timeScale = isTimeXScale(xScaleConfig) - ? new ScaleContinuous( - { - type: ScaleType.Time, - domain: xDomain.domain as number[], - range: [0, chartDimensions.width], - nice: false, - }, - { - desiredTickCount: estimatedNonOverlappingTickCount(chartDimensions.width, config.xAxisLabel), - timeZone: config.timeZone, - }, - ) - : null; - - const xValues = isTimeXScale(xScaleConfig) - ? timeRange((xDomain.domain as ContinuousDomain)[0], (xDomain.domain as ContinuousDomain)[1], xScaleConfig.interval) - : xDomain.domain; - // compute the scale for the columns positions const xScale = scaleBand>().domain(xValues).range([0, chartDimensions.width]); @@ -141,7 +120,7 @@ export function shapeViewModel( scaleCallback: (x: any) => number | undefined | null = xScale, ) => (value: any): TextBox => { return { - text: formatter(value, { timeZone: config.timeZone }), + text: formatter(value, { timeZone: isTimeXScale(spec.xScale) ? spec.xScale.timeZone ?? 'UTC' : 'UTC' }), value, ...config.xAxisLabel, x: chartDimensions.left + (scaleCallback(value) || 0), @@ -149,6 +128,20 @@ export function shapeViewModel( }; }; + const timeScale = isTimeXScale(spec.xScale) + ? new ScaleContinuous( + { + type: ScaleType.Time, + domain: xNumericExtent, + range: [0, chartDimensions.width], + nice: false, + }, + { + desiredTickCount: estimatedNonOverlappingTickCount(chartDimensions.width, config.xAxisLabel), + timeZone: spec.xScale.timeZone, + }, + ) + : null; // compute the position of each column label const textXValues: Array = timeScale ? timeScale.ticks().map(getTextValue(config.xAxisLabel.formatter, (x: any) => timeScale.scale(x))) @@ -284,8 +277,8 @@ export function shapeViewModel( const allXValuesInRange: Array> = getValuesInRange(xValues, startX, endX); const allYValuesInRange: Array> = getValuesInRange(yValues, startY, endY); const invertedXValues: Array> = - isTimeXScale(xScaleConfig) && typeof endX === 'number' - ? [startX, addIntervalToTime(endX, xScaleConfig.interval, xScaleConfig.timeZone)] + isTimeXScale(spec.xScale) && typeof endX === 'number' + ? [startX, addIntervalToTime(endX, spec.xScale.interval, spec.xScale.timeZone)] : [...allXValuesInRange]; const cells: Cell[] = []; @@ -366,7 +359,7 @@ export function shapeViewModel( // vertical lines const xLines = []; - for (let i = 0; i < xValues.length + 1; i++) { + for (let i = 0; i < xValues.length; i++) { const x = chartDimensions.left + i * cellWidth; const y1 = chartDimensions.top; const y2 = cellHeight * pageSize; diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/compute_chart_dimensions.ts b/packages/charts/src/chart_types/heatmap/state/selectors/compute_chart_dimensions.ts index c365c2c5c3..b07a0e8b27 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/compute_chart_dimensions.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/compute_chart_dimensions.ts @@ -15,7 +15,6 @@ import { getLegendSizeSelector } from '../../../../state/selectors/get_legend_si import { getSettingsSpecSelector } from '../../../../state/selectors/get_settings_specs'; import { Position } from '../../../../utils/common'; import { Dimensions } from '../../../../utils/dimensions'; -import { XDomain } from '../../../xy_chart/domains/types'; import { HeatmapCellDatum } from '../../layout/viewmodel/viewmodel'; import { getGridHeightParamsSelector } from './get_grid_full_height'; import { getHeatmapConfigSelector } from './get_heatmap_config'; @@ -25,10 +24,9 @@ import { getXAxisRightOverflow } from './get_x_axis_right_overflow'; /** @internal */ export interface HeatmapTable { table: Array; - // unique set of column values - xDomain: XDomain; - // unique set of row values yValues: Array; + xValues: Array; + xNumericExtent: [number, number]; extent: [number, number]; } diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts index c84c6ac9d6..d91635f767 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts @@ -81,7 +81,7 @@ describe('Categorical heatmap brush', () => { describe('Temporal heatmap brush', () => { let store: Store; let onBrushEndMock = jest.fn(); - const start = DateTime.fromISO('2021-07-01T00:00:00.000Z'); + const start = DateTime.fromISO('2021-07-01T00:00:00', { zone: 'Europe/Rome' }); beforeEach(() => { store = MockStore.default({ width: 300, height: 300, top: 0, left: 0 }, 'chartId'); onBrushEndMock = jest.fn(); @@ -91,7 +91,7 @@ describe('Temporal heatmap brush', () => { onBrushEnd: onBrushEndMock, }), MockSeriesSpec.heatmap({ - xScale: { type: ScaleType.Time, timeZone: 'UTC', interval: { type: 'calendar', unit: 'd', value: 1 } }, + xScale: { type: ScaleType.Time, timeZone: 'Europe/Rome', interval: { type: 'fixed', unit: 'h', value: 24 } }, data: [ { x: start.toMillis(), y: 'ya', value: 1 }, { x: start.plus({ days: 1 }).toMillis(), y: 'ya', value: 2 }, @@ -126,7 +126,7 @@ describe('Temporal heatmap brush', () => { ); }); - it('should brush on the x scale + minInterval', () => { + it('should brush above every cell', () => { const caller = createOnBrushEndCaller(); store.dispatch(onPointerMove({ x: 50, y: 50 }, 0)); store.dispatch(onMouseDown({ x: 50, y: 50 }, 100)); @@ -135,7 +135,7 @@ describe('Temporal heatmap brush', () => { caller(store.getState()); expect(onBrushEndMock).toBeCalledTimes(1); const brushEvent = onBrushEndMock.mock.calls[0][0]; - expect(brushEvent.cells).toHaveLength(6); + expect(brushEvent.cells).toHaveLength(9); // it covers from the beginning of the cell to the end of the next cell expect(brushEvent.x).toEqual([start.toMillis(), start.plus({ days: 2 }).toMillis()]); expect(brushEvent.y).toEqual(['ya', 'yb', 'yc']); diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts index 2d8231f5ad..562bef3f9c 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts @@ -6,14 +6,14 @@ * Side Public License, v 1. */ +import { extent } from 'd3-array'; + import { getPredicateFn } from '../../../../common/predicate'; import { ScaleType } from '../../../../scales/constants'; import { createCustomCachedSelector } from '../../../../state/create_selector'; import { getSettingsSpecSelector } from '../../../../state/selectors/get_settings_specs'; import { getAccessorValue } from '../../../../utils/accessor'; -import { mergeXDomain } from '../../../xy_chart/domains/x_domain'; -import { getXNiceFromSpec, getXScaleTypeFromSpec } from '../../../xy_chart/scales/get_api_scales'; -import { X_SCALE_DEFAULT } from '../../specs/scale_defaults'; +import { addIntervalToTime, timeRange } from '../../../../utils/chrono/elasticsearch'; import { HeatmapTable } from './compute_chart_dimensions'; import { getHeatmapSpecSelector } from './get_heatmap_spec'; @@ -27,7 +27,7 @@ export const getHeatmapTableSelector = createCustomCachedSelector( const { data, valueAccessor, xAccessor, yAccessor, xSortPredicate, ySortPredicate } = spec; const { xDomain } = settingsSpec; - const resultData = data.reduce( + const resultData = data.reduce( (acc, curr, index) => { const x = getAccessorValue(curr, xAccessor); @@ -59,26 +59,29 @@ export const getHeatmapTableSelector = createCustomCachedSelector( xValues: [], yValues: [], extent: [+Infinity, -Infinity], + xNumericExtent: [+Infinity, -Infinity], }, ); + if (spec.xScale.type === ScaleType.Time) { + const [xDataMin = NaN, xDataMax = NaN] = extent(resultData.xValues as number[]); + // to correctly compute the time extent from data, we need to add an interval to the max value of the dataset + const dataMaxExtended = xDataMax ? addIntervalToTime(xDataMax, spec.xScale.interval, spec.xScale.timeZone) : NaN; - resultData.xDomain = mergeXDomain( - { - type: getXScaleTypeFromSpec(spec.xScale.type), - nice: getXNiceFromSpec(), - isBandScale: false, - desiredTickCount: X_SCALE_DEFAULT.desiredTickCount, - customDomain: xDomain, - }, - resultData.xValues, - ); - - // sort values by their predicates - if (spec.xScale.type === ScaleType.Ordinal) { - resultData.xDomain.domain.sort(getPredicateFn(xSortPredicate)); + const [customMin, customMax] = !Array.isArray(xDomain) ? [xDomain?.min ?? NaN, xDomain?.max ?? NaN] : [NaN, NaN]; + const [min, max] = extent([xDataMin, customMin, customMax, dataMaxExtended]); + resultData.xNumericExtent = [min ?? NaN, max ?? NaN]; + resultData.xValues = isFiniteNumber(min) && isFiniteNumber(max) ? timeRange(min, max, spec.xScale.interval) : []; + } else if (spec.xScale.type === ScaleType.Ordinal) { + resultData.xValues.sort(getPredicateFn(xSortPredicate)); } + + // sort Y values by their predicates resultData.yValues.sort(getPredicateFn(ySortPredicate)); return resultData; }, ); + +function isFiniteNumber(value: number | undefined): value is number { + return Number.isFinite(value); +} diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts index 4fdb8a5e08..18b7897bfa 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts @@ -11,6 +11,7 @@ import { ScaleType } from '../../../../scales/constants'; import { createCustomCachedSelector } from '../../../../state/create_selector'; import { withTextMeasure } from '../../../../utils/bbox/canvas_text_bbox_calculator'; import { getHeatmapConfigSelector } from './get_heatmap_config'; +import { getHeatmapSpecSelector } from './get_heatmap_spec'; import { getHeatmapTableSelector } from './get_heatmap_table'; /** @@ -18,16 +19,19 @@ import { getHeatmapTableSelector } from './get_heatmap_table'; * Gets color scale based on specification and values range. */ export const getXAxisRightOverflow = createCustomCachedSelector( - [getHeatmapConfigSelector, getHeatmapTableSelector], - ({ xAxisLabel: { fontSize, fontFamily, padding, formatter, width }, timeZone }, { xDomain: { domain, type } }) => { - return type !== ScaleType.Time + [getHeatmapSpecSelector, getHeatmapConfigSelector, getHeatmapTableSelector], + ({ xScale }, { xAxisLabel: { fontSize, fontFamily, padding, formatter, width } }, { xValues, xNumericExtent }) => { + return xScale.type !== ScaleType.Time ? 0 : typeof width === 'number' ? width / 2 - : withTextMeasure((measure) => - new ScaleContinuous({ type: ScaleType.Time, domain: domain as number[], range: [0, 1] }, { timeZone }) + : withTextMeasure((measure) => { + return new ScaleContinuous( + { type: ScaleType.Time, domain: xNumericExtent, range: [0, 1] }, + { timeZone: xScale.type === ScaleType.Time ? xScale.timeZone : undefined }, + ) .ticks() - .reduce((max, n) => Math.max(max, measure(formatter(n), padding, fontSize, fontFamily).width + padding), 0), - ) / 2; + .reduce((max, n) => Math.max(max, measure(formatter(n), padding, fontSize, fontFamily).width + padding), 0); + }) / 2; }, ); diff --git a/packages/charts/src/utils/chrono/elasticsearch.ts b/packages/charts/src/utils/chrono/elasticsearch.ts index 3d74d67a3e..fa28533c70 100644 --- a/packages/charts/src/utils/chrono/elasticsearch.ts +++ b/packages/charts/src/utils/chrono/elasticsearch.ts @@ -117,18 +117,36 @@ export function timeRange( interval: ESCalendarInterval | ESFixedInterval, timeZone?: string, ): number[] { + return interval.type === 'fixed' + ? fixedTimeRange(from, to, interval, timeZone) + : calendarTimeRange(from, to, interval, timeZone); +} + +function calendarTimeRange(from: number, to: number, interval: ESCalendarInterval, timeZone?: string): number[] { const snappedFrom = snapDateToESInterval(from, interval, 'start', timeZone); - const snappedTo = snapDateToESInterval(to - 1, interval, 'start', timeZone); + const snappedTo = snapDateToESInterval(to, interval, 'start', timeZone); const values: number[] = [snappedFrom]; let current = snappedFrom; - - while (current < snappedTo) { - current = addIntervalToTime(current, interval, timeZone); + while (addTime(current, timeZone, esCalendarIntervalToChronoInterval[interval.unit], interval.value) < snappedTo) { + current = addTime(current, timeZone, esCalendarIntervalToChronoInterval[interval.unit], interval.value); values.push(current); } return values; } +function fixedTimeRange(from: number, to: number, interval: ESFixedInterval, timeZone?: string): number[] { + const snappedFrom = snapDateToESInterval(from, interval, 'start', timeZone); + const snappedTo = snapDateToESInterval(to, interval, 'start', timeZone); + const utcTo = localToUTC(snappedTo, timeZone); + let current = localToUTC(snappedFrom, timeZone); + const values: number[] = [current]; + while (current + interval.value * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit] < utcTo) { + current = current + interval.value * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit]; + values.push(current); + } + return values.map((d) => utcToLocal(d, timeZone)); +} + /** @internal */ export function addIntervalToTime(time: number, interval: ESCalendarInterval | ESFixedInterval, timeZone?: string) { return interval.type === 'fixed' diff --git a/packages/charts/src/utils/data_samples/test_dataset_heatmap.ts b/packages/charts/src/utils/data_samples/test_dataset_heatmap.ts new file mode 100644 index 0000000000..92c0411614 --- /dev/null +++ b/packages/charts/src/utils/data_samples/test_dataset_heatmap.ts @@ -0,0 +1,4242 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { DateTime } from 'luxon'; + +import { HeatmapConfig } from '../..'; +import { ESCalendarInterval, ESFixedInterval } from '../chrono/elasticsearch'; + +type HeatmapDataSets = { + domain?: { min: number; max: number }; + timeZone?: string; + data: Array<{ x: number; y: string; value: number }>; + interval: ESFixedInterval | ESCalendarInterval; + xFormatter?: HeatmapConfig['xAxisLabel']['formatter']; +}; + +/** @internal */ +export const DATA_1: HeatmapDataSets = { + interval: { type: 'fixed', unit: 'h', value: 12 }, + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('dd/MM HHa', { timeZone: 'Europe/Rome' }); + }, + data: [ + { + y: 'AE', + x: 1633946400000, + value: 1630.1986083984375, + }, + { + y: 'AE', + x: 1633989600000, + value: 589.9012451171875, + }, + { + y: 'AE', + x: 1634076000000, + value: 1320.9326171875, + }, + { + y: 'AE', + x: 1634162400000, + value: 1246.115478515625, + }, + { + y: 'AE', + x: 1634248800000, + value: 1498.811767578125, + }, + { + y: 'AE', + x: 1634292000000, + value: 1184.3049011230469, + }, + { + y: 'AE', + x: 1634378400000, + value: 882.4849243164062, + }, + { + y: 'AE', + x: 1634508000000, + value: 381.0003967285156, + }, + { + y: 'AE', + x: 1634594400000, + value: 1137.0064697265625, + }, + { + y: 'AE', + x: 1634637600000, + value: 221.59982299804688, + }, + { + y: 'AR', + x: 1633903200000, + value: 1071.3580627441406, + }, + { + y: 'AR', + x: 1633946400000, + value: 533.4688110351562, + }, + { + y: 'AR', + x: 1633989600000, + value: 521.6063842773438, + }, + { + y: 'AR', + x: 1634032800000, + value: 1779.9789428710938, + }, + { + y: 'AR', + x: 1634076000000, + value: 1067.8575439453125, + }, + { + y: 'AR', + x: 1634119200000, + value: 1489.5529174804688, + }, + { + y: 'AR', + x: 1634162400000, + value: 1596.3911743164062, + }, + { + y: 'AR', + x: 1634205600000, + value: 1026.2750549316406, + }, + { + y: 'AR', + x: 1634248800000, + value: 1342.860107421875, + }, + { + y: 'AR', + x: 1634292000000, + value: 1527.0611572265625, + }, + { + y: 'AR', + x: 1634335200000, + value: 2064.026611328125, + }, + { + y: 'AR', + x: 1634378400000, + value: 1553.267333984375, + }, + { + y: 'AR', + x: 1634421600000, + value: 1454.1295166015625, + }, + { + y: 'AR', + x: 1634464800000, + value: 1645.395263671875, + }, + { + y: 'AR', + x: 1634508000000, + value: 1369.0120849609375, + }, + { + y: 'AR', + x: 1634551200000, + value: 1482.1971435546875, + }, + { + y: 'AR', + x: 1634594400000, + value: 1205.93310546875, + }, + { + y: 'AR', + x: 1634637600000, + value: 1348.623291015625, + }, + { + y: 'AR', + x: 1634680800000, + value: 959.8377685546875, + }, + { + y: 'AT', + x: 1633903200000, + value: 749.7982788085938, + }, + { + y: 'AT', + x: 1633946400000, + value: 1156.054931640625, + }, + { + y: 'AT', + x: 1633989600000, + value: 1419.3067626953125, + }, + { + y: 'AT', + x: 1634032800000, + value: 1137.7723999023438, + }, + { + y: 'AT', + x: 1634076000000, + value: 1555.2818603515625, + }, + { + y: 'AT', + x: 1634119200000, + value: 1516.8120727539062, + }, + { + y: 'AT', + x: 1634162400000, + value: 1545.7149047851562, + }, + { + y: 'AT', + x: 1634205600000, + value: 1298.5445556640625, + }, + { + y: 'AT', + x: 1634248800000, + value: 1644.07177734375, + }, + { + y: 'AT', + x: 1634292000000, + value: 1570.9822998046875, + }, + { + y: 'AT', + x: 1634335200000, + value: 1123.7603759765625, + }, + { + y: 'AT', + x: 1634378400000, + value: 1502.600341796875, + }, + { + y: 'AT', + x: 1634421600000, + value: 1215.3555908203125, + }, + { + y: 'AT', + x: 1634464800000, + value: 1761.99755859375, + }, + { + y: 'AT', + x: 1634508000000, + value: 1402.3016357421875, + }, + { + y: 'AT', + x: 1634551200000, + value: 1324.6370849609375, + }, + { + y: 'AT', + x: 1634594400000, + value: 1205.5257568359375, + }, + { + y: 'AT', + x: 1634637600000, + value: 1176.2248840332031, + }, + { + y: 'AT', + x: 1634680800000, + value: 934.2395324707031, + }, + { + y: 'AU', + x: 1633903200000, + value: 1228.46826171875, + }, + { + y: 'AU', + x: 1633946400000, + value: 1528.995849609375, + }, + { + y: 'AU', + x: 1633989600000, + value: 729.99755859375, + }, + { + y: 'AU', + x: 1634032800000, + value: 1393.302978515625, + }, + { + y: 'AU', + x: 1634076000000, + value: 971.7767944335938, + }, + { + y: 'AU', + x: 1634119200000, + value: 1033.0284423828125, + }, + { + y: 'AU', + x: 1634162400000, + value: 1826.966064453125, + }, + { + y: 'AU', + x: 1634205600000, + value: 1540.0936889648438, + }, + { + y: 'AU', + x: 1634248800000, + value: 1498.648681640625, + }, + { + y: 'AU', + x: 1634292000000, + value: 1128.2857666015625, + }, + { + y: 'AU', + x: 1634335200000, + value: 1374.63427734375, + }, + { + y: 'AU', + x: 1634378400000, + value: 1749.794677734375, + }, + { + y: 'AU', + x: 1634421600000, + value: 1624.445068359375, + }, + { + y: 'AU', + x: 1634464800000, + value: 1714.9954223632812, + }, + { + y: 'AU', + x: 1634508000000, + value: 1153.7655029296875, + }, + { + y: 'AU', + x: 1634551200000, + value: 1165.4229736328125, + }, + { + y: 'AU', + x: 1634594400000, + value: 1615.3231811523438, + }, + { + y: 'AU', + x: 1634637600000, + value: 799.819580078125, + }, + { + y: 'AU', + x: 1634680800000, + value: 1784.1341552734375, + }, + { + y: 'CA', + x: 1633903200000, + value: 1373.2542724609375, + }, + { + y: 'CA', + x: 1633946400000, + value: 984.0171508789062, + }, + { + y: 'CA', + x: 1633989600000, + value: 667.0845947265625, + }, + { + y: 'CA', + x: 1634032800000, + value: 1149.9925537109375, + }, + { + y: 'CA', + x: 1634076000000, + value: 1397.2909545898438, + }, + { + y: 'CA', + x: 1634119200000, + value: 1390.003662109375, + }, + { + y: 'CA', + x: 1634162400000, + value: 1242.8565673828125, + }, + { + y: 'CA', + x: 1634205600000, + value: 853.4672546386719, + }, + { + y: 'CA', + x: 1634248800000, + value: 937.9247436523438, + }, + { + y: 'CA', + x: 1634292000000, + value: 1240.626953125, + }, + { + y: 'CA', + x: 1634335200000, + value: 1598.92431640625, + }, + { + y: 'CA', + x: 1634378400000, + value: 2096.9384765625, + }, + { + y: 'CA', + x: 1634421600000, + value: 1404.4989013671875, + }, + { + y: 'CA', + x: 1634464800000, + value: 1532.7533569335938, + }, + { + y: 'CA', + x: 1634508000000, + value: 1308.9225463867188, + }, + { + y: 'CA', + x: 1634551200000, + value: 1254.5380859375, + }, + { + y: 'CA', + x: 1634594400000, + value: 1447.060791015625, + }, + { + y: 'CA', + x: 1634637600000, + value: 1026.0033569335938, + }, + { + y: 'CA', + x: 1634680800000, + value: 1454.3275146484375, + }, + { + y: 'CA', + x: 1634724000000, + value: 1378.6402587890625, + }, + { + y: 'CH', + x: 1633903200000, + value: 585.6773834228516, + }, + { + y: 'CH', + x: 1633946400000, + value: 690.4444274902344, + }, + { + y: 'CH', + x: 1633989600000, + value: 695.4150390625, + }, + { + y: 'CH', + x: 1634032800000, + value: 508.3909606933594, + }, + { + y: 'CH', + x: 1634076000000, + value: 1424.2265014648438, + }, + { + y: 'CH', + x: 1634119200000, + value: 1313.9705810546875, + }, + { + y: 'CH', + x: 1634162400000, + value: 1311.3236694335938, + }, + { + y: 'CH', + x: 1634205600000, + value: 1160.4334716796875, + }, + { + y: 'CH', + x: 1634248800000, + value: 549.681884765625, + }, + { + y: 'CH', + x: 1634292000000, + value: 879.4996032714844, + }, + { + y: 'CH', + x: 1634335200000, + value: 1364.97216796875, + }, + { + y: 'CH', + x: 1634378400000, + value: 1379.3760986328125, + }, + { + y: 'CH', + x: 1634421600000, + value: 1590.429931640625, + }, + { + y: 'CH', + x: 1634464800000, + value: 1702.2340698242188, + }, + { + y: 'CH', + x: 1634508000000, + value: 941.3290405273438, + }, + { + y: 'CH', + x: 1634551200000, + value: 1174.7496337890625, + }, + { + y: 'CH', + x: 1634594400000, + value: 729.7496948242188, + }, + { + y: 'CH', + x: 1634637600000, + value: 1526.578369140625, + }, + { + y: 'CH', + x: 1634680800000, + value: 1129.46484375, + }, + { + y: 'CL', + x: 1633946400000, + value: 1536.809814453125, + }, + { + y: 'CL', + x: 1634076000000, + value: 1113.52978515625, + }, + { + y: 'CL', + x: 1634162400000, + value: 1973.97119140625, + }, + { + y: 'CL', + x: 1634205600000, + value: 1560.9017333984375, + }, + { + y: 'CL', + x: 1634292000000, + value: 862.6887512207031, + }, + { + y: 'CL', + x: 1634335200000, + value: 2353.2763671875, + }, + { + y: 'CL', + x: 1634378400000, + value: 1944.758544921875, + }, + { + y: 'CL', + x: 1634508000000, + value: 1354.3873291015625, + }, + { + y: 'CL', + x: 1634637600000, + value: 996.3539428710938, + }, + { + y: 'CL', + x: 1634680800000, + value: 1355.901611328125, + }, + { + y: 'CN', + x: 1633903200000, + value: 1448.720703125, + }, + { + y: 'CN', + x: 1633946400000, + value: 1519.4761352539062, + }, + { + y: 'CN', + x: 1633989600000, + value: 1109.7001953125, + }, + { + y: 'CN', + x: 1634032800000, + value: 1220.62548828125, + }, + { + y: 'CN', + x: 1634076000000, + value: 968.7841186523438, + }, + { + y: 'CN', + x: 1634119200000, + value: 1275.71826171875, + }, + { + y: 'CN', + x: 1634162400000, + value: 1687.98876953125, + }, + { + y: 'CN', + x: 1634205600000, + value: 1047.9259033203125, + }, + { + y: 'CN', + x: 1634248800000, + value: 1552.34521484375, + }, + { + y: 'CN', + x: 1634292000000, + value: 1690.6611328125, + }, + { + y: 'CN', + x: 1634335200000, + value: 2057.9147338867188, + }, + { + y: 'CN', + x: 1634378400000, + value: 1597.23876953125, + }, + { + y: 'CN', + x: 1634421600000, + value: 1500.2396850585938, + }, + { + y: 'CN', + x: 1634464800000, + value: 1854.201416015625, + }, + { + y: 'CN', + x: 1634508000000, + value: 1057.568359375, + }, + { + y: 'CN', + x: 1634551200000, + value: 1644.513671875, + }, + { + y: 'CN', + x: 1634594400000, + value: 924.8408813476562, + }, + { + y: 'CN', + x: 1634637600000, + value: 1176.250244140625, + }, + { + y: 'CN', + x: 1634680800000, + value: 1293.4815673828125, + }, + { + y: 'CN', + x: 1634724000000, + value: 857.4727172851562, + }, + { + y: 'CO', + x: 1633903200000, + value: 1095.269775390625, + }, + { + y: 'CO', + x: 1633946400000, + value: 453.3008728027344, + }, + { + y: 'CO', + x: 1633989600000, + value: 1304.517822265625, + }, + { + y: 'CO', + x: 1634032800000, + value: 1854.322021484375, + }, + { + y: 'CO', + x: 1634076000000, + value: 1052.2171630859375, + }, + { + y: 'CO', + x: 1634292000000, + value: 989.3553466796875, + }, + { + y: 'CO', + x: 1634335200000, + value: 1096.70849609375, + }, + { + y: 'CO', + x: 1634378400000, + value: 1076.895751953125, + }, + { + y: 'CO', + x: 1634421600000, + value: 1075.150390625, + }, + { + y: 'CO', + x: 1634508000000, + value: 871.4742431640625, + }, + { + y: 'CO', + x: 1634551200000, + value: 1245.4185791015625, + }, + { + y: 'CO', + x: 1634594400000, + value: 1923.149658203125, + }, + { + y: 'CO', + x: 1634680800000, + value: 1824.5716552734375, + }, + { + y: 'DE', + x: 1633946400000, + value: 1132.97509765625, + }, + { + y: 'DE', + x: 1633989600000, + value: 1571.764404296875, + }, + { + y: 'DE', + x: 1634032800000, + value: 1040.1160888671875, + }, + { + y: 'DE', + x: 1634076000000, + value: 1529.804931640625, + }, + { + y: 'DE', + x: 1634119200000, + value: 960.6709594726562, + }, + { + y: 'DE', + x: 1634162400000, + value: 950.5629272460938, + }, + { + y: 'DE', + x: 1634205600000, + value: 1107.2994995117188, + }, + { + y: 'DE', + x: 1634248800000, + value: 770.2896118164062, + }, + { + y: 'DE', + x: 1634292000000, + value: 1618.79541015625, + }, + { + y: 'DE', + x: 1634335200000, + value: 1981.40087890625, + }, + { + y: 'DE', + x: 1634378400000, + value: 1429.888916015625, + }, + { + y: 'DE', + x: 1634421600000, + value: 1276.201171875, + }, + { + y: 'DE', + x: 1634464800000, + value: 2380.615478515625, + }, + { + y: 'DE', + x: 1634551200000, + value: 921.33544921875, + }, + { + y: 'DE', + x: 1634594400000, + value: 1053.485107421875, + }, + { + y: 'DE', + x: 1634637600000, + value: 1144.2720947265625, + }, + { + y: 'DE', + x: 1634680800000, + value: 1533.2845458984375, + }, + { + y: 'DK', + x: 1633903200000, + value: 1195.4417114257812, + }, + { + y: 'DK', + x: 1634032800000, + value: 945.0773315429688, + }, + { + y: 'DK', + x: 1634292000000, + value: 1464.6525268554688, + }, + { + y: 'DK', + x: 1634335200000, + value: 1778.8946533203125, + }, + { + y: 'DK', + x: 1634421600000, + value: 1895.1260986328125, + }, + { + y: 'DK', + x: 1634464800000, + value: 2099.8984375, + }, + { + y: 'DK', + x: 1634508000000, + value: 1178.702392578125, + }, + { + y: 'DK', + x: 1634637600000, + value: 1082.788818359375, + }, + { + y: 'DK', + x: 1634680800000, + value: 1333.0047607421875, + }, + { + y: 'EC', + x: 1633903200000, + value: 1260.6492309570312, + }, + { + y: 'EC', + x: 1633946400000, + value: 1139.206298828125, + }, + { + y: 'EC', + x: 1633989600000, + value: 1083.087646484375, + }, + { + y: 'EC', + x: 1634032800000, + value: 1226.3377075195312, + }, + { + y: 'EC', + x: 1634076000000, + value: 1277.2030029296875, + }, + { + y: 'EC', + x: 1634119200000, + value: 1494.2833251953125, + }, + { + y: 'EC', + x: 1634205600000, + value: 1556.5960693359375, + }, + { + y: 'EC', + x: 1634248800000, + value: 888.1316528320312, + }, + { + y: 'EC', + x: 1634292000000, + value: 1607.5115966796875, + }, + { + y: 'EC', + x: 1634335200000, + value: 1786.5728759765625, + }, + { + y: 'EC', + x: 1634378400000, + value: 1059.01220703125, + }, + { + y: 'EC', + x: 1634421600000, + value: 1307.0654907226562, + }, + { + y: 'EC', + x: 1634464800000, + value: 1700.533447265625, + }, + { + y: 'EC', + x: 1634508000000, + value: 1518.436279296875, + }, + { + y: 'EC', + x: 1634551200000, + value: 1680.8818359375, + }, + { + y: 'EC', + x: 1634594400000, + value: 1138.2274169921875, + }, + { + y: 'EC', + x: 1634637600000, + value: 801.6689453125, + }, + { + y: 'EC', + x: 1634680800000, + value: 1023.8098754882812, + }, + { + y: 'ES', + x: 1634205600000, + value: 1095.447250366211, + }, + { + y: 'ES', + x: 1634248800000, + value: 846.2098999023438, + }, + { + y: 'ES', + x: 1634464800000, + value: 513.0786743164062, + }, + { + y: 'ES', + x: 1634551200000, + value: 421.4815673828125, + }, + { + y: 'ES', + x: 1634680800000, + value: 1783.7108154296875, + }, + { + y: 'FI', + x: 1633946400000, + value: 1989.708740234375, + }, + { + y: 'FI', + x: 1633989600000, + value: 1616.2996826171875, + }, + { + y: 'FI', + x: 1634032800000, + value: 1238.53076171875, + }, + { + y: 'FI', + x: 1634076000000, + value: 1953.0860595703125, + }, + { + y: 'FI', + x: 1634162400000, + value: 1701.4493408203125, + }, + { + y: 'FI', + x: 1634205600000, + value: 1323.0477294921875, + }, + { + y: 'FI', + x: 1634508000000, + value: 958.4090576171875, + }, + { + y: 'FI', + x: 1634551200000, + value: 1426.584716796875, + }, + { + y: 'FI', + x: 1634594400000, + value: 1633.1131591796875, + }, + { + y: 'FI', + x: 1634680800000, + value: 778.8355102539062, + }, + { + y: 'FR', + x: 1633903200000, + value: 741.9657592773438, + }, + { + y: 'FR', + x: 1633946400000, + value: 1027.302001953125, + }, + { + y: 'FR', + x: 1633989600000, + value: 933.7100830078125, + }, + { + y: 'FR', + x: 1634032800000, + value: 1727.9757080078125, + }, + { + y: 'FR', + x: 1634205600000, + value: 1445.7293701171875, + }, + { + y: 'FR', + x: 1634335200000, + value: 1083.11572265625, + }, + { + y: 'FR', + x: 1634378400000, + value: 840.2843017578125, + }, + { + y: 'FR', + x: 1634464800000, + value: 1074.0158081054688, + }, + { + y: 'FR', + x: 1634508000000, + value: 1994.239501953125, + }, + { + y: 'FR', + x: 1634680800000, + value: 1290.5693359375, + }, + { + y: 'GB', + x: 1633903200000, + value: 1000.9656982421875, + }, + { + y: 'GB', + x: 1633946400000, + value: 1361.612060546875, + }, + { + y: 'GB', + x: 1633989600000, + value: 1048.4798278808594, + }, + { + y: 'GB', + x: 1634032800000, + value: 1040.1541748046875, + }, + { + y: 'GB', + x: 1634076000000, + value: 1261.7947387695312, + }, + { + y: 'GB', + x: 1634119200000, + value: 1279.813720703125, + }, + { + y: 'GB', + x: 1634162400000, + value: 1494.7257080078125, + }, + { + y: 'GB', + x: 1634205600000, + value: 1481.67041015625, + }, + { + y: 'GB', + x: 1634248800000, + value: 1128.2760009765625, + }, + { + y: 'GB', + x: 1634292000000, + value: 1075.6246337890625, + }, + { + y: 'GB', + x: 1634335200000, + value: 1837.26220703125, + }, + { + y: 'GB', + x: 1634378400000, + value: 1100.0601806640625, + }, + { + y: 'GB', + x: 1634421600000, + value: 2098.5350341796875, + }, + { + y: 'GB', + x: 1634464800000, + value: 1313.1705322265625, + }, + { + y: 'GB', + x: 1634508000000, + value: 1930.4819946289062, + }, + { + y: 'GB', + x: 1634551200000, + value: 1384.9301147460938, + }, + { + y: 'GB', + x: 1634594400000, + value: 1308.79443359375, + }, + { + y: 'GB', + x: 1634637600000, + value: 1189.3238525390625, + }, + { + y: 'GB', + x: 1634680800000, + value: 1454.0706787109375, + }, + { + y: '__other__', + x: 1633903200000, + value: 1193.8202514648438, + }, + { + y: '__other__', + x: 1633946400000, + value: 1200.88037109375, + }, + { + y: '__other__', + x: 1633989600000, + value: 1234.8555908203125, + }, + { + y: '__other__', + x: 1634032800000, + value: 1078.6812133789062, + }, + { + y: '__other__', + x: 1634076000000, + value: 995.9703979492188, + }, + { + y: '__other__', + x: 1634119200000, + value: 1198.1402587890625, + }, + { + y: '__other__', + x: 1634162400000, + value: 1106.43212890625, + }, + { + y: '__other__', + x: 1634205600000, + value: 1180.4904174804688, + }, + { + y: '__other__', + x: 1634248800000, + value: 1319.378173828125, + }, + { + y: '__other__', + x: 1634292000000, + value: 1177.3067016601562, + }, + { + y: '__other__', + x: 1634335200000, + value: 1503.594482421875, + }, + { + y: '__other__', + x: 1634378400000, + value: 1577.262939453125, + }, + { + y: '__other__', + x: 1634421600000, + value: 1739.27294921875, + }, + { + y: '__other__', + x: 1634464800000, + value: 1519.1485595703125, + }, + { + y: '__other__', + x: 1634508000000, + value: 1136.928466796875, + }, + { + y: '__other__', + x: 1634551200000, + value: 1072.9026489257812, + }, + { + y: '__other__', + x: 1634594400000, + value: 1105.2606201171875, + }, + { + y: '__other__', + x: 1634637600000, + value: 1313.4656982421875, + }, + { + y: '__other__', + x: 1634680800000, + value: 1250.16357421875, + }, + { + y: '__other__', + x: 1634724000000, + value: 999.7426681518555, + }, + ], +}; + +/** @internal */ +export const DATA_2: HeatmapDataSets = { + interval: { type: 'fixed', unit: 'h', value: 3 }, + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('dd MMM HHa', { timeZone: 'Europe/Rome' }); + }, + timeZone: 'Europe/Rome', + data: [ + { y: 'CN', x: 1635285600000, value: 1 }, + { y: 'CN', x: 1635296400000, value: 1 }, + { y: 'CN', x: 1635307200000, value: 4 }, + { y: 'CN', x: 1635318000000, value: 9 }, + { y: 'CN', x: 1635328800000, value: 13 }, + { y: 'CN', x: 1635339600000, value: 13 }, + { y: 'CN', x: 1635350400000, value: 4 }, + { y: 'CN', x: 1635361200000, value: 1 }, + { y: 'CN', x: 1635372000000, value: 0 }, + { y: 'CN', x: 1635382800000, value: 1 }, + { y: 'CN', x: 1635393600000, value: 0 }, + { y: 'CN', x: 1635404400000, value: 12 }, + { y: 'CN', x: 1635415200000, value: 21 }, + { y: 'CN', x: 1635426000000, value: 6 }, + { y: 'CN', x: 1635436800000, value: 11 }, + { y: 'CN', x: 1635447600000, value: 1 }, + { y: 'CN', x: 1635458400000, value: 0 }, + { y: 'CN', x: 1635469200000, value: 0 }, + { y: 'CN', x: 1635480000000, value: 4 }, + { y: 'CN', x: 1635490800000, value: 8 }, + { y: 'CN', x: 1635501600000, value: 19 }, + { y: 'CN', x: 1635512400000, value: 10 }, + { y: 'CN', x: 1635523200000, value: 5 }, + { y: 'CN', x: 1635534000000, value: 1 }, + { y: 'CN', x: 1635544800000, value: 0 }, + { y: 'CN', x: 1635555600000, value: 0 }, + { y: 'CN', x: 1635566400000, value: 3 }, + { y: 'CN', x: 1635577200000, value: 15 }, + { y: 'CN', x: 1635588000000, value: 12 }, + { y: 'CN', x: 1635598800000, value: 8 }, + { y: 'CN', x: 1635609600000, value: 4 }, + { y: 'CN', x: 1635620400000, value: 2 }, + { y: 'CN', x: 1635631200000, value: 0 }, + { y: 'CN', x: 1635645600000, value: 1 }, + { y: 'CN', x: 1635656400000, value: 6 }, + { y: 'CN', x: 1635667200000, value: 13 }, + { y: 'CN', x: 1635678000000, value: 17 }, + { y: 'CN', x: 1635688800000, value: 10 }, + { y: 'CN', x: 1635699600000, value: 0 }, + { y: 'CN', x: 1635710400000, value: 0 }, + { y: 'CN', x: 1635721200000, value: 0 }, + { y: 'CN', x: 1635732000000, value: 1 }, + { y: 'CN', x: 1635742800000, value: 4 }, + { y: 'CN', x: 1635753600000, value: 13 }, + { y: 'CN', x: 1635764400000, value: 13 }, + { y: 'CN', x: 1635775200000, value: 12 }, + { y: 'CN', x: 1635786000000, value: 7 }, + { y: 'CN', x: 1635796800000, value: 0 }, + { y: 'CN', x: 1635807600000, value: 0 }, + { y: 'CN', x: 1635818400000, value: 3 }, + { y: 'CN', x: 1635829200000, value: 4 }, + { y: 'CN', x: 1635840000000, value: 9 }, + { y: 'CN', x: 1635850800000, value: 9 }, + { y: 'CN', x: 1635861600000, value: 8 }, + { y: 'CN', x: 1635872400000, value: 1 }, + { y: 'CN', x: 1635883200000, value: 1 }, + { y: 'CN', x: 1635894000000, value: 0 }, + { y: 'CN', x: 1635904800000, value: 1 }, + { y: 'CN', x: 1635915600000, value: 6 }, + { y: 'CN', x: 1635926400000, value: 16 }, + { y: 'CN', x: 1635937200000, value: 13 }, + { y: 'CN', x: 1635948000000, value: 14 }, + { y: 'IN', x: 1635307200000, value: 1 }, + { y: 'IN', x: 1635318000000, value: 14 }, + { y: 'IN', x: 1635328800000, value: 15 }, + { y: 'IN', x: 1635339600000, value: 11 }, + { y: 'IN', x: 1635350400000, value: 4 }, + { y: 'IN', x: 1635361200000, value: 0 }, + { y: 'IN', x: 1635372000000, value: 0 }, + { y: 'IN', x: 1635382800000, value: 1 }, + { y: 'IN', x: 1635393600000, value: 4 }, + { y: 'IN', x: 1635404400000, value: 8 }, + { y: 'IN', x: 1635415200000, value: 12 }, + { y: 'IN', x: 1635426000000, value: 11 }, + { y: 'IN', x: 1635436800000, value: 1 }, + { y: 'IN', x: 1635447600000, value: 1 }, + { y: 'IN', x: 1635458400000, value: 0 }, + { y: 'IN', x: 1635469200000, value: 1 }, + { y: 'IN', x: 1635480000000, value: 2 }, + { y: 'IN', x: 1635490800000, value: 7 }, + { y: 'IN', x: 1635501600000, value: 9 }, + { y: 'IN', x: 1635512400000, value: 9 }, + { y: 'IN', x: 1635523200000, value: 4 }, + { y: 'IN', x: 1635534000000, value: 1 }, + { y: 'IN', x: 1635544800000, value: 0 }, + { y: 'IN', x: 1635555600000, value: 2 }, + { y: 'IN', x: 1635566400000, value: 2 }, + { y: 'IN', x: 1635577200000, value: 8 }, + { y: 'IN', x: 1635588000000, value: 8 }, + { y: 'IN', x: 1635598800000, value: 10 }, + { y: 'IN', x: 1635609600000, value: 7 }, + { y: 'IN', x: 1635620400000, value: 0 }, + { y: 'IN', x: 1635631200000, value: 0 }, + { y: 'IN', x: 1635645600000, value: 1 }, + { y: 'IN', x: 1635656400000, value: 4 }, + { y: 'IN', x: 1635667200000, value: 6 }, + { y: 'IN', x: 1635678000000, value: 10 }, + { y: 'IN', x: 1635688800000, value: 3 }, + { y: 'IN', x: 1635699600000, value: 4 }, + { y: 'IN', x: 1635710400000, value: 0 }, + { y: 'IN', x: 1635721200000, value: 1 }, + { y: 'IN', x: 1635732000000, value: 1 }, + { y: 'IN', x: 1635742800000, value: 3 }, + { y: 'IN', x: 1635753600000, value: 6 }, + { y: 'IN', x: 1635764400000, value: 10 }, + { y: 'IN', x: 1635775200000, value: 11 }, + { y: 'IN', x: 1635786000000, value: 1 }, + { y: 'IN', x: 1635796800000, value: 1 }, + { y: 'IN', x: 1635807600000, value: 0 }, + { y: 'IN', x: 1635818400000, value: 2 }, + { y: 'IN', x: 1635829200000, value: 2 }, + { y: 'IN', x: 1635840000000, value: 10 }, + { y: 'IN', x: 1635850800000, value: 17 }, + { y: 'IN', x: 1635861600000, value: 7 }, + { y: 'IN', x: 1635872400000, value: 1 }, + { y: 'IN', x: 1635883200000, value: 1 }, + { y: 'IN', x: 1635894000000, value: 1 }, + { y: 'IN', x: 1635904800000, value: 0 }, + { y: 'IN', x: 1635915600000, value: 3 }, + { y: 'IN', x: 1635926400000, value: 4 }, + { y: 'IN', x: 1635937200000, value: 4 }, + { y: 'IN', x: 1635948000000, value: 10 }, + { y: 'IN', x: 1635958800000, value: 2 }, + { y: 'IN', x: 1635969600000, value: 1 }, + { y: 'US', x: 1635318000000, value: 6 }, + { y: 'US', x: 1635328800000, value: 6 }, + { y: 'US', x: 1635339600000, value: 4 }, + { y: 'US', x: 1635350400000, value: 5 }, + { y: 'US', x: 1635361200000, value: 0 }, + { y: 'US', x: 1635372000000, value: 0 }, + { y: 'US', x: 1635382800000, value: 0 }, + { y: 'US', x: 1635393600000, value: 1 }, + { y: 'US', x: 1635404400000, value: 2 }, + { y: 'US', x: 1635415200000, value: 5 }, + { y: 'US', x: 1635426000000, value: 6 }, + { y: 'US', x: 1635436800000, value: 2 }, + { y: 'US', x: 1635447600000, value: 0 }, + { y: 'US', x: 1635458400000, value: 0 }, + { y: 'US', x: 1635469200000, value: 0 }, + { y: 'US', x: 1635480000000, value: 1 }, + { y: 'US', x: 1635490800000, value: 4 }, + { y: 'US', x: 1635501600000, value: 4 }, + { y: 'US', x: 1635512400000, value: 2 }, + { y: 'US', x: 1635523200000, value: 0 }, + { y: 'US', x: 1635534000000, value: 1 }, + { y: 'US', x: 1635544800000, value: 0 }, + { y: 'US', x: 1635555600000, value: 0 }, + { y: 'US', x: 1635566400000, value: 1 }, + { y: 'US', x: 1635577200000, value: 4 }, + { y: 'US', x: 1635588000000, value: 9 }, + { y: 'US', x: 1635598800000, value: 4 }, + { y: 'US', x: 1635609600000, value: 1 }, + { y: 'US', x: 1635620400000, value: 1 }, + { y: 'US', x: 1635631200000, value: 0 }, + { y: 'US', x: 1635645600000, value: 0 }, + { y: 'US', x: 1635656400000, value: 3 }, + { y: 'US', x: 1635667200000, value: 4 }, + { y: 'US', x: 1635678000000, value: 10 }, + { y: 'US', x: 1635688800000, value: 3 }, + { y: 'US', x: 1635699600000, value: 0 }, + { y: 'US', x: 1635710400000, value: 0 }, + { y: 'US', x: 1635721200000, value: 0 }, + { y: 'US', x: 1635732000000, value: 0 }, + { y: 'US', x: 1635742800000, value: 2 }, + { y: 'US', x: 1635753600000, value: 6 }, + { y: 'US', x: 1635764400000, value: 3 }, + { y: 'US', x: 1635775200000, value: 4 }, + { y: 'US', x: 1635786000000, value: 1 }, + { y: 'US', x: 1635796800000, value: 0 }, + { y: 'US', x: 1635807600000, value: 0 }, + { y: 'US', x: 1635818400000, value: 0 }, + { y: 'US', x: 1635829200000, value: 1 }, + { y: 'US', x: 1635840000000, value: 5 }, + { y: 'US', x: 1635850800000, value: 4 }, + { y: 'US', x: 1635861600000, value: 3 }, + { y: 'US', x: 1635872400000, value: 0 }, + { y: 'US', x: 1635883200000, value: 0 }, + { y: 'US', x: 1635894000000, value: 1 }, + { y: 'US', x: 1635904800000, value: 1 }, + { y: 'US', x: 1635915600000, value: 4 }, + { y: 'US', x: 1635926400000, value: 2 }, + { y: 'US', x: 1635937200000, value: 7 }, + { y: 'US', x: 1635948000000, value: 0 }, + { y: 'US', x: 1635958800000, value: 4 }, + { y: '__other__', x: 1635296400000, value: 1 }, + { y: '__other__', x: 1635307200000, value: 8 }, + { y: '__other__', x: 1635318000000, value: 26 }, + { y: '__other__', x: 1635328800000, value: 39 }, + { y: '__other__', x: 1635339600000, value: 27 }, + { y: '__other__', x: 1635350400000, value: 21 }, + { y: '__other__', x: 1635361200000, value: 3 }, + { y: '__other__', x: 1635372000000, value: 0 }, + { y: '__other__', x: 1635382800000, value: 4 }, + { y: '__other__', x: 1635393600000, value: 12 }, + { y: '__other__', x: 1635404400000, value: 26 }, + { y: '__other__', x: 1635415200000, value: 34 }, + { y: '__other__', x: 1635426000000, value: 32 }, + { y: '__other__', x: 1635436800000, value: 15 }, + { y: '__other__', x: 1635447600000, value: 0 }, + { y: '__other__', x: 1635458400000, value: 1 }, + { y: '__other__', x: 1635469200000, value: 4 }, + { y: '__other__', x: 1635480000000, value: 10 }, + { y: '__other__', x: 1635490800000, value: 31 }, + { y: '__other__', x: 1635501600000, value: 40 }, + { y: '__other__', x: 1635512400000, value: 28 }, + { y: '__other__', x: 1635523200000, value: 19 }, + { y: '__other__', x: 1635534000000, value: 5 }, + { y: '__other__', x: 1635544800000, value: 1 }, + { y: '__other__', x: 1635555600000, value: 3 }, + { y: '__other__', x: 1635566400000, value: 3 }, + { y: '__other__', x: 1635577200000, value: 23 }, + { y: '__other__', x: 1635588000000, value: 50 }, + { y: '__other__', x: 1635598800000, value: 32 }, + { y: '__other__', x: 1635609600000, value: 12 }, + { y: '__other__', x: 1635620400000, value: 5 }, + { y: '__other__', x: 1635631200000, value: 2 }, + { y: '__other__', x: 1635645600000, value: 2 }, + { y: '__other__', x: 1635656400000, value: 16 }, + { y: '__other__', x: 1635667200000, value: 38 }, + { y: '__other__', x: 1635678000000, value: 36 }, + { y: '__other__', x: 1635688800000, value: 29 }, + { y: '__other__', x: 1635699600000, value: 11 }, + { y: '__other__', x: 1635710400000, value: 1 }, + { y: '__other__', x: 1635721200000, value: 2 }, + { y: '__other__', x: 1635732000000, value: 1 }, + { y: '__other__', x: 1635742800000, value: 19 }, + { y: '__other__', x: 1635753600000, value: 32 }, + { y: '__other__', x: 1635764400000, value: 44 }, + { y: '__other__', x: 1635775200000, value: 22 }, + { y: '__other__', x: 1635786000000, value: 9 }, + { y: '__other__', x: 1635796800000, value: 2 }, + { y: '__other__', x: 1635807600000, value: 0 }, + { y: '__other__', x: 1635818400000, value: 7 }, + { y: '__other__', x: 1635829200000, value: 16 }, + { y: '__other__', x: 1635840000000, value: 44 }, + { y: '__other__', x: 1635850800000, value: 40 }, + { y: '__other__', x: 1635861600000, value: 25 }, + { y: '__other__', x: 1635872400000, value: 8 }, + { y: '__other__', x: 1635883200000, value: 1 }, + { y: '__other__', x: 1635894000000, value: 1 }, + { y: '__other__', x: 1635904800000, value: 4 }, + { y: '__other__', x: 1635915600000, value: 13 }, + { y: '__other__', x: 1635926400000, value: 36 }, + { y: '__other__', x: 1635937200000, value: 35 }, + { y: '__other__', x: 1635948000000, value: 33 }, + { y: '__other__', x: 1635958800000, value: 12 }, + { y: '__other__', x: 1635969600000, value: 1 }, + ], +}; + +/** @internal */ +export const DATA_3: HeatmapDataSets = { + interval: { type: 'fixed', unit: 'h', value: 12 }, + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('HH:mm', { timeZone: 'Europe/Rome' }); + }, + timeZone: 'Europe/Rome', + data: [ + { x: 1635588000000, y: 'a', value: 1 }, + { x: 1635631200000, y: 'a', value: 2 }, + { x: 1635678000000, y: 'a', value: 3 }, + { x: 1635721200000, y: 'a', value: 4 }, + { x: 1635764400000, y: 'a', value: 5 }, + ], +}; + +/** @internal */ +export const DATA_4: HeatmapDataSets = { + interval: { type: 'calendar', unit: 'w', value: 1 }, + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('dd/MM HH:mm', { timeZone: 'Europe/Rome' }); + }, + timeZone: 'Europe/Rome', + data: [ + { x: 1634508000000, y: 'CN', value: 43 }, + { x: 1635112800000, y: 'CN', value: 330 }, + { x: 1635721200000, y: 'CN', value: 155 }, + { x: 1634508000000, y: 'IN', value: 41 }, + { x: 1635112800000, y: 'IN', value: 261 }, + { x: 1635721200000, y: 'IN', value: 115 }, + { x: 1634508000000, y: 'US', value: 20 }, + { x: 1635112800000, y: 'US', value: 123 }, + { x: 1635721200000, y: 'US', value: 53 }, + { x: 1634508000000, y: '__other__', value: 145 }, + { x: 1635112800000, y: '__other__', value: 902 }, + { x: 1635721200000, y: '__other__', value: 448 }, + ], +}; + +/** @internal */ +export const DATA_5: HeatmapDataSets = { + domain: { min: 1635984000000, max: 1636002000000 }, + interval: { type: 'calendar', unit: 'h', value: 1 }, + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('HH:mm', { timeZone: 'Europe/Rome' }); + }, + data: [ + { x: 1635984000000, y: 'sample_web_logs', value: 4202 }, + { x: 1635987600000, y: 'sample_web_logs', value: 0 }, + { x: 1635994800000, y: 'sample_web_logs', value: 5808 }, + { x: 1635998400000, y: 'sample_web_logs', value: 4629 }, + ], +}; + +/** @internal */ +export const DATA_6: HeatmapDataSets = { + interval: { type: 'fixed', value: 30, unit: 'm' }, + timeZone: 'UTC', + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('HH:mm', { timeZone: 'UTC' }); + }, + data: [ + { + x: 1572847200000, + y: 'i-71a7f77b', + value: 0, + }, + { + x: 1572892200000, + y: 'i-71a7f77b', + value: 3, + }, + { + x: 1572894000000, + y: 'i-71a7f77b', + value: 25, + }, + { + x: 1572895800000, + y: 'i-71a7f77b', + value: 50, + }, + { + x: 1572897600000, + y: 'i-71a7f77b', + value: 75, + }, + { + x: 1572899400000, + y: 'i-71a7f77b', + value: 1, + }, + { + x: 1572901200000, + y: 'i-71a7f77b', + value: 2, + }, + { + x: 1572903000000, + y: 'i-71a7f77b', + value: 24, + }, + { + x: 1572904800000, + y: 'i-71a7f77b', + value: 49, + }, + { + x: 1572906600000, + y: 'i-71a7f77b', + value: 74, + }, + { + x: 1572908400000, + y: 'i-71a7f77b', + value: 0.07397995823713518, + }, + { + x: 1572910200000, + y: 'i-71a7f77b', + value: 0.03091943662761636, + }, + { + x: 1572836400000, + y: 'i-5d303091', + value: 0.08552883, + }, + { + x: 1572883200000, + y: 'i-5d303091', + value: 93.72707, + }, + { + x: 1572885000000, + y: 'i-5d303091', + value: 50.42717, + }, + { + x: 1572910200000, + y: 'i-5d303091', + value: 2.397241548271217, + }, + { + x: 1572879600000, + y: 'i-9f07c700', + value: 76.10974, + }, + { + x: 1572881400000, + y: 'i-9f07c700', + value: 90.75613, + }, + { + x: 1572883200000, + y: 'i-9f07c700', + value: 28.016079894074096, + }, + { + x: 1572885000000, + y: 'i-9f07c700', + value: 2.1780847014803517, + }, + { + x: 1572899400000, + y: 'i-9f07c700', + value: 0.02531410357696053, + }, + { + x: 1572910200000, + y: 'i-9f07c700', + value: 2.258382748340588, + }, + { + x: 1572849000000, + y: 'i-d17dcd4c', + value: 4.210354, + }, + { + x: 1572892200000, + y: 'i-d17dcd4c', + value: 89.6491, + }, + { + x: 1572894000000, + y: 'i-d17dcd4c', + value: 21.289199095933952, + }, + { + x: 1572895800000, + y: 'i-d17dcd4c', + value: 2.6694704470251565, + }, + { + x: 1572897600000, + y: 'i-d17dcd4c', + value: 0.5850535152380327, + }, + { + x: 1572899400000, + y: 'i-d17dcd4c', + value: 65.51073, + }, + { + x: 1572901200000, + y: 'i-d17dcd4c', + value: 0.792024488699497, + }, + { + x: 1572903000000, + y: 'i-d17dcd4c', + value: 0.5615131943374475, + }, + { + x: 1572904800000, + y: 'i-d17dcd4c', + value: 0.394169564717292, + }, + { + x: 1572906600000, + y: 'i-d17dcd4c', + value: 0.2046931978696015, + }, + { + x: 1572908400000, + y: 'i-d17dcd4c', + value: 0.15470219555712722, + }, + { + x: 1572910200000, + y: 'i-d17dcd4c', + value: 0.11787869182904363, + }, + { + x: 1572883200000, + y: 'i-37fbfb39', + value: 83.92723, + }, + { + x: 1572885000000, + y: 'i-37fbfb39', + value: 21.49062, + }, + { + x: 1572910200000, + y: 'i-37fbfb39', + value: 0.5619960991147903, + }, + { + x: 1572847200000, + y: 'i-b118880c', + value: 0.7038798, + }, + { + x: 1572849000000, + y: 'i-b118880c', + value: 8.885096, + }, + { + x: 1572892200000, + y: 'i-b118880c', + value: 81.92052, + }, + { + x: 1572894000000, + y: 'i-b118880c', + value: 6.385433818669964, + }, + { + x: 1572895800000, + y: 'i-b118880c', + value: 0.7529454579485226, + }, + { + x: 1572897600000, + y: 'i-b118880c', + value: 0.16135425990161706, + }, + { + x: 1572899400000, + y: 'i-b118880c', + value: 32.23389, + }, + { + x: 1572901200000, + y: 'i-b118880c', + value: 0.7578572100943552, + }, + { + x: 1572903000000, + y: 'i-b118880c', + value: 0.6111162033658646, + }, + { + x: 1572904800000, + y: 'i-b118880c', + value: 0.443324186956941, + }, + { + x: 1572906600000, + y: 'i-b118880c', + value: 0.3075144354570065, + }, + { + x: 1572908400000, + y: 'i-b118880c', + value: 0.18905638316915416, + }, + { + x: 1572910200000, + y: 'i-b118880c', + value: 0.15234682243112949, + }, + { + x: 1572881400000, + y: 'i-66578749', + value: 60.28918, + }, + { + x: 1572883200000, + y: 'i-66578749', + value: 67.31324, + }, + { + x: 1572885000000, + y: 'i-66578749', + value: 81.34977, + }, + { + x: 1572892200000, + y: 'i-66578749', + value: 48.25439, + }, + { + x: 1572894000000, + y: 'i-66578749', + value: 31.06416, + }, + { + x: 1572895800000, + y: 'i-66578749', + value: 3.0462498034282, + }, + { + x: 1572897600000, + y: 'i-66578749', + value: 0.23590009859709954, + }, + { + x: 1572899400000, + y: 'i-66578749', + value: 59.04865, + }, + { + x: 1572901200000, + y: 'i-66578749', + value: 0.9189229698167014, + }, + { + x: 1572903000000, + y: 'i-66578749', + value: 0.3479760519757592, + }, + { + x: 1572904800000, + y: 'i-66578749', + value: 0.09983690866310621, + }, + { + x: 1572906600000, + y: 'i-66578749', + value: 0.026896391677229674, + }, + { + x: 1572883200000, + y: 'i-5d302081', + value: 79.62794, + }, + { + x: 1572885000000, + y: 'i-5d302081', + value: 38.70934, + }, + { + x: 1572910200000, + y: 'i-5d302081', + value: 2.3953009901171605, + }, + { + x: 1572849000000, + y: 'i-ef74d410', + value: 0.1538905, + }, + { + x: 1572881400000, + y: 'i-ef74d410', + value: 77.86751, + }, + { + x: 1572883200000, + y: 'i-ef74d410', + value: 7.1111139045789935, + }, + { + x: 1572885000000, + y: 'i-ef74d410', + value: 0.07120867159413205, + }, + { + x: 1572892200000, + y: 'i-ef74d410', + value: 0.46005659357549517, + }, + { + x: 1572899400000, + y: 'i-ef74d410', + value: 0.38022323217471177, + }, + { + x: 1572901200000, + y: 'i-ef74d410', + value: 0.05279469228246696, + }, + { + x: 1572903000000, + y: 'i-ef74d410', + value: 0.04307715617784296, + }, + { + x: 1572881400000, + y: 'i-3b3565e0', + value: 49.34176, + }, + { + x: 1572883200000, + y: 'i-3b3565e0', + value: 74.35002, + }, + { + x: 1572885000000, + y: 'i-3b3565e0', + value: 70.82227, + }, + { + x: 1572899400000, + y: 'i-3b3565e0', + value: 1.129179725764338, + }, + { + x: 1572901200000, + y: 'i-3b3565e0', + value: 0.08944716315823782, + }, + { + x: 1572903000000, + y: 'i-3b3565e0', + value: 0.025215653478830508, + }, + { + x: 1572881400000, + y: 'i-7db7c747', + value: 56.8998, + }, + { + x: 1572883200000, + y: 'i-7db7c747', + value: 34.59895, + }, + { + x: 1572885000000, + y: 'i-7db7c747', + value: 69.07187, + }, + { + x: 1572899400000, + y: 'i-7db7c747', + value: 20.04246, + }, + { + x: 1572901200000, + y: 'i-7db7c747', + value: 0.501246678069153, + }, + { + x: 1572903000000, + y: 'i-7db7c747', + value: 0.10228357345625516, + }, + { + x: 1572858000000, + y: 'i-8270d519', + value: 23.41472, + }, + { + x: 1572870600000, + y: 'i-8270d519', + value: 0.09778774, + }, + { + x: 1572881400000, + y: 'i-8270d519', + value: 57.96897, + }, + { + x: 1572883200000, + y: 'i-8270d519', + value: 63.73998, + }, + { + x: 1572885000000, + y: 'i-8270d519', + value: 45.19735, + }, + { + x: 1572892200000, + y: 'i-8270d519', + value: 2.166846374797418, + }, + { + x: 1572894000000, + y: 'i-8270d519', + value: 0.2283247569954898, + }, + { + x: 1572899400000, + y: 'i-8270d519', + value: 42.24531, + }, + { + x: 1572901200000, + y: 'i-8270d519', + value: 0.49207037746175214, + }, + { + x: 1572903000000, + y: 'i-8270d519', + value: 0.3243143048875506, + }, + { + x: 1572904800000, + y: 'i-8270d519', + value: 0.10024450293348822, + }, + { + x: 1572906600000, + y: 'i-8270d519', + value: 0.033965805201251434, + }, + { + x: 1572847200000, + y: 'i-4fefbf6c', + value: 0.1867262, + }, + { + x: 1572849000000, + y: 'i-4fefbf6c', + value: 11.47219, + }, + { + x: 1572892200000, + y: 'i-4fefbf6c', + value: 53.59314, + }, + { + x: 1572894000000, + y: 'i-4fefbf6c', + value: 15.91959, + }, + { + x: 1572895800000, + y: 'i-4fefbf6c', + value: 0.5736916311300446, + }, + { + x: 1572897600000, + y: 'i-4fefbf6c', + value: 29.28071, + }, + { + x: 1572899400000, + y: 'i-4fefbf6c', + value: 25.1765, + }, + { + x: 1572901200000, + y: 'i-4fefbf6c', + value: 1.4671989108080628, + }, + { + x: 1572903000000, + y: 'i-4fefbf6c', + value: 0.8367316591855911, + }, + { + x: 1572904800000, + y: 'i-4fefbf6c', + value: 0.48490204846685775, + }, + { + x: 1572906600000, + y: 'i-4fefbf6c', + value: 0.24413767062868427, + }, + { + x: 1572908400000, + y: 'i-4fefbf6c', + value: 0.17736807671463703, + }, + { + x: 1572910200000, + y: 'i-4fefbf6c', + value: 0.10326196476266834, + }, + { + x: 1572859800000, + y: 'i-16fd8d2a', + value: 33.42309, + }, + { + x: 1572861600000, + y: 'i-16fd8d2a', + value: 47.17204, + }, + { + x: 1572863400000, + y: 'i-16fd8d2a', + value: 0.16179846422070132, + }, + { + x: 1572847200000, + y: 'i-ca80c01a', + value: 0.6692097, + }, + { + x: 1572870600000, + y: 'i-ca80c01a', + value: 44.60156, + }, + { + x: 1572883200000, + y: 'i-ca80c01a', + value: 26.06775, + }, + { + x: 1572885000000, + y: 'i-ca80c01a', + value: 0.24539550844649843, + }, + { + x: 1572910200000, + y: 'i-ca80c01a', + value: 0.09130230719255052, + }, + { + x: 1572883200000, + y: 'i-4a90d021', + value: 43.41428, + }, + { + x: 1572885000000, + y: 'i-4a90d021', + value: 20.30829, + }, + { + x: 1572910200000, + y: 'i-4a90d021', + value: 20.706159141229445, + }, + { + x: 1572883200000, + y: 'i-4ff414ac', + value: 42.82781, + }, + { + x: 1572885000000, + y: 'i-4ff414ac', + value: 3.643815188524499, + }, + { + x: 1572910200000, + y: 'i-4ff414ac', + value: 7.987421742621203, + }, + { + x: 1572870600000, + y: 'i-850643a7', + value: 37.51045, + }, + { + x: 1572904800000, + y: 'i-850643a7', + value: 0.08720035850172568, + }, + { + x: 1572859800000, + y: 'i-c961f137', + value: 0.7612613, + }, + { + x: 1572861600000, + y: 'i-c961f137', + value: 36.94459, + }, + { + x: 1572863400000, + y: 'i-c961f137', + value: 3.530620723871948, + }, + { + x: 1572874200000, + y: 'i-7cdbab5b', + value: 3.468401, + }, + { + x: 1572876000000, + y: 'i-7cdbab5b', + value: 15.87705, + }, + { + x: 1572877800000, + y: 'i-7cdbab5b', + value: 21.19452, + }, + { + x: 1572879600000, + y: 'i-7cdbab5b', + value: 22.534, + }, + { + x: 1572881400000, + y: 'i-7cdbab5b', + value: 30.46893, + }, + { + x: 1572883200000, + y: 'i-7cdbab5b', + value: 9.532251, + }, + { + x: 1572885000000, + y: 'i-7cdbab5b', + value: 6.127118137471535, + }, + { + x: 1572892200000, + y: 'i-7cdbab5b', + value: 0.13956047806108005, + }, + { + x: 1572894000000, + y: 'i-7cdbab5b', + value: 0.11986169822285726, + }, + { + x: 1572899400000, + y: 'i-7cdbab5b', + value: 4.098007780030352, + }, + { + x: 1572901200000, + y: 'i-7cdbab5b', + value: 0.6927671145991932, + }, + { + x: 1572903000000, + y: 'i-7cdbab5b', + value: 0.2113142229906149, + }, + { + x: 1572904800000, + y: 'i-7cdbab5b', + value: 0.0823203266441151, + }, + ], +}; + +/** @internal */ +export const DATA_7: HeatmapDataSets = { + interval: { type: 'fixed', unit: 'h', value: 12 }, + timeZone: 'Europe/Rome', + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('dd/MM HH:mm', { timeZone: 'Europe/Rome' }); + }, + data: [ + { + x: 1635026400000, + value: 33, + y: '', + }, + { + x: 1635069600000, + value: 59, + y: '', + }, + { + x: 1635112800000, + value: 29, + y: '', + }, + { + x: 1635156000000, + value: 67, + y: '', + }, + { + x: 1635199200000, + value: 27, + y: '', + }, + { + x: 1635242400000, + value: 61, + y: '', + }, + { + x: 1635285600000, + value: 19, + y: '', + }, + { + x: 1635328800000, + value: 71, + y: '', + }, + { + x: 1635372000000, + value: 26, + y: '', + }, + { + x: 1635415200000, + value: 51, + y: '', + }, + { + x: 1635458400000, + value: 30, + y: '', + }, + { + x: 1635501600000, + value: 54, + y: '', + }, + { + x: 1635544800000, + value: 20, + y: '', + }, + { + x: 1635588000000, + value: 59, + y: '', + }, + { + x: 1635631200000, + value: 30, + y: '', + }, + { + x: 1635678000000, + value: 58, + y: '', + }, + { + x: 1635721200000, + value: 34, + y: '', + }, + { + x: 1635764400000, + value: 58, + y: '', + }, + { + x: 1635807600000, + value: 41, + y: '', + }, + { + x: 1635850800000, + value: 48, + y: '', + }, + { + x: 1635894000000, + value: 37, + y: '', + }, + { + x: 1635937200000, + value: 44, + y: '', + }, + { + x: 1635980400000, + value: 37, + y: '', + }, + { + x: 1636023600000, + value: 62, + y: '', + }, + { + x: 1636066800000, + value: 16, + y: '', + }, + { + x: 1635026400000, + value: 18, + y: 'gz', + }, + { + x: 1635069600000, + value: 37, + y: 'gz', + }, + { + x: 1635112800000, + value: 8, + y: 'gz', + }, + { + x: 1635156000000, + value: 27, + y: 'gz', + }, + { + x: 1635199200000, + value: 13, + y: 'gz', + }, + { + x: 1635242400000, + value: 33, + y: 'gz', + }, + { + x: 1635285600000, + value: 13, + y: 'gz', + }, + { + x: 1635328800000, + value: 22, + y: 'gz', + }, + { + x: 1635372000000, + value: 20, + y: 'gz', + }, + { + x: 1635415200000, + value: 36, + y: 'gz', + }, + { + x: 1635458400000, + value: 12, + y: 'gz', + }, + { + x: 1635501600000, + value: 31, + y: 'gz', + }, + { + x: 1635544800000, + value: 9, + y: 'gz', + }, + { + x: 1635588000000, + value: 29, + y: 'gz', + }, + { + x: 1635631200000, + value: 18, + y: 'gz', + }, + { + x: 1635678000000, + value: 22, + y: 'gz', + }, + { + x: 1635721200000, + value: 15, + y: 'gz', + }, + { + x: 1635764400000, + value: 25, + y: 'gz', + }, + { + x: 1635807600000, + value: 12, + y: 'gz', + }, + { + x: 1635850800000, + value: 25, + y: 'gz', + }, + { + x: 1635894000000, + value: 16, + y: 'gz', + }, + { + x: 1635937200000, + value: 28, + y: 'gz', + }, + { + x: 1635980400000, + value: 12, + y: 'gz', + }, + { + x: 1636023600000, + value: 20, + y: 'gz', + }, + { + x: 1636066800000, + value: 10, + y: 'gz', + }, + { + x: 1635026400000, + value: 9, + y: 'css', + }, + { + x: 1635069600000, + value: 24, + y: 'css', + }, + { + x: 1635112800000, + value: 9, + y: 'css', + }, + { + x: 1635156000000, + value: 38, + y: 'css', + }, + { + x: 1635199200000, + value: 11, + y: 'css', + }, + { + x: 1635242400000, + value: 33, + y: 'css', + }, + { + x: 1635285600000, + value: 18, + y: 'css', + }, + { + x: 1635328800000, + value: 18, + y: 'css', + }, + { + x: 1635372000000, + value: 6, + y: 'css', + }, + { + x: 1635415200000, + value: 26, + y: 'css', + }, + { + x: 1635458400000, + value: 8, + y: 'css', + }, + { + x: 1635501600000, + value: 23, + y: 'css', + }, + { + x: 1635544800000, + value: 10, + y: 'css', + }, + { + x: 1635588000000, + value: 28, + y: 'css', + }, + { + x: 1635631200000, + value: 16, + y: 'css', + }, + { + x: 1635678000000, + value: 21, + y: 'css', + }, + { + x: 1635721200000, + value: 17, + y: 'css', + }, + { + x: 1635764400000, + value: 19, + y: 'css', + }, + { + x: 1635807600000, + value: 16, + y: 'css', + }, + { + x: 1635850800000, + value: 24, + y: 'css', + }, + { + x: 1635894000000, + value: 14, + y: 'css', + }, + { + x: 1635937200000, + value: 26, + y: 'css', + }, + { + x: 1635980400000, + value: 11, + y: 'css', + }, + { + x: 1636023600000, + value: 24, + y: 'css', + }, + { + x: 1636066800000, + value: 14, + y: 'css', + }, + { + x: 1635026400000, + value: 28, + y: '__other__', + }, + { + x: 1635069600000, + value: 41, + y: '__other__', + }, + { + x: 1635112800000, + value: 17, + y: '__other__', + }, + { + x: 1635156000000, + value: 36, + y: '__other__', + }, + { + x: 1635199200000, + value: 16, + y: '__other__', + }, + { + x: 1635242400000, + value: 35, + y: '__other__', + }, + { + x: 1635285600000, + value: 21, + y: '__other__', + }, + { + x: 1635328800000, + value: 55, + y: '__other__', + }, + { + x: 1635372000000, + value: 19, + y: '__other__', + }, + { + x: 1635415200000, + value: 45, + y: '__other__', + }, + { + x: 1635458400000, + value: 23, + y: '__other__', + }, + { + x: 1635501600000, + value: 49, + y: '__other__', + }, + { + x: 1635544800000, + value: 26, + y: '__other__', + }, + { + x: 1635588000000, + value: 49, + y: '__other__', + }, + { + x: 1635631200000, + value: 32, + y: '__other__', + }, + { + x: 1635678000000, + value: 33, + y: '__other__', + }, + { + x: 1635721200000, + value: 25, + y: '__other__', + }, + { + x: 1635764400000, + value: 38, + y: '__other__', + }, + { + x: 1635807600000, + value: 34, + y: '__other__', + }, + { + x: 1635850800000, + value: 29, + y: '__other__', + }, + { + x: 1635894000000, + value: 26, + y: '__other__', + }, + { + x: 1635937200000, + value: 40, + y: '__other__', + }, + { + x: 1635980400000, + value: 22, + y: '__other__', + }, + { + x: 1636023600000, + value: 42, + y: '__other__', + }, + { + x: 1636066800000, + value: 7, + y: '__other__', + }, + ], +}; + +/** @internal */ +export const DATA_8: HeatmapDataSets = { + interval: { type: 'fixed', unit: 'm', value: 60 }, + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('HH:mm', { timeZone: 'Europe/Rome' }); + }, + timeZone: 'Europe/Rome', + data: [ + { + x: 1616799600000, + value: 150, + y: 'jpg', + }, + { + x: 1616803200000, + value: 1, + y: 'jpg', + }, + { + x: 1616806800000, + value: 2, + y: 'jpg', + }, + { + x: 1616810400000, + value: 9, + y: 'jpg', + }, + { + x: 1616814000000, + value: 11, + y: 'jpg', + }, + { + x: 1616817600000, + value: 19, + y: 'jpg', + }, + { + x: 1616821200000, + value: 29, + y: 'jpg', + }, + { + x: 1616824800000, + value: 54, + y: 'jpg', + }, + { + x: 1616828400000, + value: 74, + y: 'jpg', + }, + { + x: 1616832000000, + value: 91, + y: 'jpg', + }, + { + x: 1616835600000, + value: 118, + y: 'jpg', + }, + { + x: 1616839200000, + value: 109, + y: 'jpg', + }, + { + x: 1616842800000, + value: 123, + y: 'jpg', + }, + { + x: 1616846400000, + value: 97, + y: 'jpg', + }, + { + x: 1616850000000, + value: 87, + y: 'jpg', + }, + { + x: 1616853600000, + value: 83, + y: 'jpg', + }, + { + x: 1616857200000, + value: 48, + y: 'jpg', + }, + { + x: 1616860800000, + value: 35, + y: 'jpg', + }, + { + x: 1616864400000, + value: 30, + y: 'jpg', + }, + { + x: 1616868000000, + value: 8, + y: 'jpg', + }, + { + x: 1616871600000, + value: 8, + y: 'jpg', + }, + { + x: 1616875200000, + value: 5, + y: 'jpg', + }, + { + x: 1616878800000, + value: 5, + y: 'jpg', + }, + { + x: 1616882400000, + value: 3, + y: 'jpg', + }, + { + x: 1616886000000, + value: 2, + y: 'jpg', + }, + { + x: 1616889600000, + value: 0, + y: 'jpg', + }, + { + x: 1616893200000, + value: 19, + y: 'jpg', + }, + { + x: 1616896800000, + value: 16, + y: 'jpg', + }, + { + x: 1616900400000, + value: 20, + y: 'jpg', + }, + { + x: 1616904000000, + value: 45, + y: 'jpg', + }, + { + x: 1616907600000, + value: 33, + y: 'jpg', + }, + { + x: 1616911200000, + value: 84, + y: 'jpg', + }, + { + x: 1616914800000, + value: 90, + y: 'jpg', + }, + { + x: 1616918400000, + value: 94, + y: 'jpg', + }, + { + x: 1616922000000, + value: 129, + y: 'jpg', + }, + { + x: 1616925600000, + value: 108, + y: 'jpg', + }, + { + x: 1616929200000, + value: 103, + y: 'jpg', + }, + { + x: 1616932800000, + value: 98, + y: 'jpg', + }, + { + x: 1616936400000, + value: 76, + y: 'jpg', + }, + { + x: 1616940000000, + value: 59, + y: 'jpg', + }, + { + x: 1616943600000, + value: 45, + y: 'jpg', + }, + { + x: 1616947200000, + value: 30, + y: 'jpg', + }, + { + x: 1616950800000, + value: 11, + y: 'jpg', + }, + { + x: 1616954400000, + value: 12, + y: 'jpg', + }, + { + x: 1616958000000, + value: 7, + y: 'jpg', + }, + { + x: 1616961600000, + value: 1, + y: 'jpg', + }, + { + x: 1616965200000, + value: 2, + y: 'jpg', + }, + { + x: 1616968800000, + value: 1, + y: 'jpg', + }, + { + x: 1616972400000, + value: 3, + y: 'jpg', + }, + { + x: 1616976000000, + value: 2, + y: 'jpg', + }, + { + x: 1616979600000, + value: 9, + y: 'jpg', + }, + { + x: 1616983200000, + value: 9, + y: 'jpg', + }, + { + x: 1616986800000, + value: 30, + y: 'jpg', + }, + { + x: 1616990400000, + value: 28, + y: 'jpg', + }, + { + x: 1616994000000, + value: 71, + y: 'jpg', + }, + { + x: 1616997600000, + value: 89, + y: 'jpg', + }, + { + x: 1617001200000, + value: 78, + y: 'jpg', + }, + { + x: 1617004800000, + value: 109, + y: 'jpg', + }, + { + x: 1617008400000, + value: 106, + y: 'jpg', + }, + { + x: 1617012000000, + value: 131, + y: 'jpg', + }, + { + x: 1617015600000, + value: 100, + y: 'jpg', + }, + { + x: 1617019200000, + value: 93, + y: 'jpg', + }, + { + x: 1617022800000, + value: 67, + y: 'jpg', + }, + { + x: 1617026400000, + value: 52, + y: 'jpg', + }, + { + x: 1617030000000, + value: 46, + y: 'jpg', + }, + { + x: 1617033600000, + value: 24, + y: 'jpg', + }, + { + x: 1617037200000, + value: 13, + y: 'jpg', + }, + { + x: 1617040800000, + value: 4, + y: 'jpg', + }, + { + x: 1617044400000, + value: 5, + y: 'jpg', + }, + { + x: 1617048000000, + value: 0, + y: 'jpg', + }, + { + x: 1617051600000, + value: 2, + y: 'jpg', + }, + { + x: 1617055200000, + value: 150, + y: 'jpg', + }, + { + x: 1616810400000, + value: 2, + y: 'css', + }, + { + x: 1616814000000, + value: 5, + y: 'css', + }, + { + x: 1616817600000, + value: 5, + y: 'css', + }, + { + x: 1616821200000, + value: 8, + y: 'css', + }, + { + x: 1616824800000, + value: 15, + y: 'css', + }, + { + x: 1616828400000, + value: 16, + y: 'css', + }, + { + x: 1616832000000, + value: 31, + y: 'css', + }, + { + x: 1616835600000, + value: 22, + y: 'css', + }, + { + x: 1616839200000, + value: 26, + y: 'css', + }, + { + x: 1616842800000, + value: 32, + y: 'css', + }, + { + x: 1616846400000, + value: 20, + y: 'css', + }, + { + x: 1616850000000, + value: 20, + y: 'css', + }, + { + x: 1616853600000, + value: 19, + y: 'css', + }, + { + x: 1616857200000, + value: 11, + y: 'css', + }, + { + x: 1616860800000, + value: 10, + y: 'css', + }, + { + x: 1616864400000, + value: 6, + y: 'css', + }, + { + x: 1616868000000, + value: 2, + y: 'css', + }, + { + x: 1616871600000, + value: 0, + y: 'css', + }, + { + x: 1616875200000, + value: 3, + y: 'css', + }, + { + x: 1616878800000, + value: 3, + y: 'css', + }, + { + x: 1616882400000, + value: 1, + y: 'css', + }, + { + x: 1616886000000, + value: 0, + y: 'css', + }, + { + x: 1616889600000, + value: 0, + y: 'css', + }, + { + x: 1616893200000, + value: 2, + y: 'css', + }, + { + x: 1616896800000, + value: 0, + y: 'css', + }, + { + x: 1616900400000, + value: 7, + y: 'css', + }, + { + x: 1616904000000, + value: 7, + y: 'css', + }, + { + x: 1616907600000, + value: 23, + y: 'css', + }, + { + x: 1616911200000, + value: 16, + y: 'css', + }, + { + x: 1616914800000, + value: 19, + y: 'css', + }, + { + x: 1616918400000, + value: 27, + y: 'css', + }, + { + x: 1616922000000, + value: 34, + y: 'css', + }, + { + x: 1616925600000, + value: 24, + y: 'css', + }, + { + x: 1616929200000, + value: 22, + y: 'css', + }, + { + x: 1616932800000, + value: 23, + y: 'css', + }, + { + x: 1616936400000, + value: 23, + y: 'css', + }, + { + x: 1616940000000, + value: 9, + y: 'css', + }, + { + x: 1616943600000, + value: 7, + y: 'css', + }, + { + x: 1616947200000, + value: 9, + y: 'css', + }, + { + x: 1616950800000, + value: 2, + y: 'css', + }, + { + x: 1616954400000, + value: 1, + y: 'css', + }, + { + x: 1616958000000, + value: 3, + y: 'css', + }, + { + x: 1616961600000, + value: 1, + y: 'css', + }, + { + x: 1616965200000, + value: 1, + y: 'css', + }, + { + x: 1616968800000, + value: 0, + y: 'css', + }, + { + x: 1616972400000, + value: 1, + y: 'css', + }, + { + x: 1616976000000, + value: 3, + y: 'css', + }, + { + x: 1616979600000, + value: 0, + y: 'css', + }, + { + x: 1616983200000, + value: 1, + y: 'css', + }, + { + x: 1616986800000, + value: 5, + y: 'css', + }, + { + x: 1616990400000, + value: 13, + y: 'css', + }, + { + x: 1616994000000, + value: 9, + y: 'css', + }, + { + x: 1616997600000, + value: 16, + y: 'css', + }, + { + x: 1617001200000, + value: 25, + y: 'css', + }, + { + x: 1617004800000, + value: 26, + y: 'css', + }, + { + x: 1617008400000, + value: 36, + y: 'css', + }, + { + x: 1617012000000, + value: 27, + y: 'css', + }, + { + x: 1617015600000, + value: 29, + y: 'css', + }, + { + x: 1617019200000, + value: 20, + y: 'css', + }, + { + x: 1617022800000, + value: 25, + y: 'css', + }, + { + x: 1617026400000, + value: 14, + y: 'css', + }, + { + x: 1617030000000, + value: 10, + y: 'css', + }, + { + x: 1617033600000, + value: 3, + y: 'css', + }, + { + x: 1617037200000, + value: 5, + y: 'css', + }, + { + x: 1617040800000, + value: 3, + y: 'css', + }, + { + x: 1617044400000, + value: 1, + y: 'css', + }, + { + x: 1617048000000, + value: 3, + y: 'css', + }, + { + x: 1616799600000, + value: 3, + y: 'png', + }, + { + x: 1616803200000, + value: 1, + y: 'png', + }, + { + x: 1616806800000, + value: 1, + y: 'png', + }, + { + x: 1616810400000, + value: 2, + y: 'png', + }, + { + x: 1616814000000, + value: 2, + y: 'png', + }, + { + x: 1616817600000, + value: 5, + y: 'png', + }, + { + x: 1616821200000, + value: 6, + y: 'png', + }, + { + x: 1616824800000, + value: 16, + y: 'png', + }, + { + x: 1616828400000, + value: 12, + y: 'png', + }, + { + x: 1616832000000, + value: 21, + y: 'png', + }, + { + x: 1616835600000, + value: 11, + y: 'png', + }, + { + x: 1616839200000, + value: 15, + y: 'png', + }, + { + x: 1616842800000, + value: 25, + y: 'png', + }, + { + x: 1616846400000, + value: 14, + y: 'png', + }, + { + x: 1616850000000, + value: 17, + y: 'png', + }, + { + x: 1616853600000, + value: 16, + y: 'png', + }, + { + x: 1616857200000, + value: 8, + y: 'png', + }, + { + x: 1616860800000, + value: 7, + y: 'png', + }, + { + x: 1616864400000, + value: 1, + y: 'png', + }, + { + x: 1616868000000, + value: 1, + y: 'png', + }, + { + x: 1616871600000, + value: 2, + y: 'png', + }, + { + x: 1616875200000, + value: 0, + y: 'png', + }, + { + x: 1616878800000, + value: 0, + y: 'png', + }, + { + x: 1616882400000, + value: 0, + y: 'png', + }, + { + x: 1616886000000, + value: 0, + y: 'png', + }, + { + x: 1616889600000, + value: 0, + y: 'png', + }, + { + x: 1616893200000, + value: 2, + y: 'png', + }, + { + x: 1616896800000, + value: 2, + y: 'png', + }, + { + x: 1616900400000, + value: 3, + y: 'png', + }, + { + x: 1616904000000, + value: 5, + y: 'png', + }, + { + x: 1616907600000, + value: 8, + y: 'png', + }, + { + x: 1616911200000, + value: 9, + y: 'png', + }, + { + x: 1616914800000, + value: 7, + y: 'png', + }, + { + x: 1616918400000, + value: 24, + y: 'png', + }, + { + x: 1616922000000, + value: 22, + y: 'png', + }, + { + x: 1616925600000, + value: 19, + y: 'png', + }, + { + x: 1616929200000, + value: 19, + y: 'png', + }, + { + x: 1616932800000, + value: 12, + y: 'png', + }, + { + x: 1616936400000, + value: 7, + y: 'png', + }, + { + x: 1616940000000, + value: 7, + y: 'png', + }, + { + x: 1616943600000, + value: 3, + y: 'png', + }, + { + x: 1616947200000, + value: 4, + y: 'png', + }, + { + x: 1616950800000, + value: 3, + y: 'png', + }, + { + x: 1616954400000, + value: 1, + y: 'png', + }, + { + x: 1616958000000, + value: 2, + y: 'png', + }, + { + x: 1616961600000, + value: 1, + y: 'png', + }, + { + x: 1616965200000, + value: 0, + y: 'png', + }, + { + x: 1616968800000, + value: 1, + y: 'png', + }, + { + x: 1616972400000, + value: 0, + y: 'png', + }, + { + x: 1616976000000, + value: 0, + y: 'png', + }, + { + x: 1616979600000, + value: 2, + y: 'png', + }, + { + x: 1616983200000, + value: 2, + y: 'png', + }, + { + x: 1616986800000, + value: 2, + y: 'png', + }, + { + x: 1616990400000, + value: 4, + y: 'png', + }, + { + x: 1616994000000, + value: 8, + y: 'png', + }, + { + x: 1616997600000, + value: 7, + y: 'png', + }, + { + x: 1617001200000, + value: 17, + y: 'png', + }, + { + x: 1617004800000, + value: 16, + y: 'png', + }, + { + x: 1617008400000, + value: 16, + y: 'png', + }, + { + x: 1617012000000, + value: 24, + y: 'png', + }, + { + x: 1617015600000, + value: 16, + y: 'png', + }, + { + x: 1617019200000, + value: 17, + y: 'png', + }, + { + x: 1617022800000, + value: 11, + y: 'png', + }, + { + x: 1617026400000, + value: 10, + y: 'png', + }, + { + x: 1617030000000, + value: 7, + y: 'png', + }, + { + x: 1617033600000, + value: 6, + y: 'png', + }, + { + x: 1617037200000, + value: 1, + y: 'png', + }, + { + x: 1616810400000, + value: 1, + y: '__other__', + }, + { + x: 1616814000000, + value: 3, + y: '__other__', + }, + { + x: 1616817600000, + value: 2, + y: '__other__', + }, + { + x: 1616821200000, + value: 3, + y: '__other__', + }, + { + x: 1616824800000, + value: 6, + y: '__other__', + }, + { + x: 1616828400000, + value: 11, + y: '__other__', + }, + { + x: 1616832000000, + value: 19, + y: '__other__', + }, + { + x: 1616835600000, + value: 21, + y: '__other__', + }, + { + x: 1616839200000, + value: 18, + y: '__other__', + }, + { + x: 1616842800000, + value: 11, + y: '__other__', + }, + { + x: 1616846400000, + value: 17, + y: '__other__', + }, + { + x: 1616850000000, + value: 16, + y: '__other__', + }, + { + x: 1616853600000, + value: 17, + y: '__other__', + }, + { + x: 1616857200000, + value: 13, + y: '__other__', + }, + { + x: 1616860800000, + value: 4, + y: '__other__', + }, + { + x: 1616864400000, + value: 6, + y: '__other__', + }, + { + x: 1616868000000, + value: 4, + y: '__other__', + }, + { + x: 1616871600000, + value: 1, + y: '__other__', + }, + { + x: 1616875200000, + value: 1, + y: '__other__', + }, + { + x: 1616878800000, + value: 0, + y: '__other__', + }, + { + x: 1616882400000, + value: 0, + y: '__other__', + }, + { + x: 1616886000000, + value: 1, + y: '__other__', + }, + { + x: 1616889600000, + value: 0, + y: '__other__', + }, + { + x: 1616893200000, + value: 3, + y: '__other__', + }, + { + x: 1616896800000, + value: 1, + y: '__other__', + }, + { + x: 1616900400000, + value: 3, + y: '__other__', + }, + { + x: 1616904000000, + value: 5, + y: '__other__', + }, + { + x: 1616907600000, + value: 9, + y: '__other__', + }, + { + x: 1616911200000, + value: 9, + y: '__other__', + }, + { + x: 1616914800000, + value: 13, + y: '__other__', + }, + { + x: 1616918400000, + value: 13, + y: '__other__', + }, + { + x: 1616922000000, + value: 26, + y: '__other__', + }, + { + x: 1616925600000, + value: 23, + y: '__other__', + }, + { + x: 1616929200000, + value: 15, + y: '__other__', + }, + { + x: 1616932800000, + value: 11, + y: '__other__', + }, + { + x: 1616936400000, + value: 14, + y: '__other__', + }, + { + x: 1616940000000, + value: 9, + y: '__other__', + }, + { + x: 1616943600000, + value: 1, + y: '__other__', + }, + { + x: 1616947200000, + value: 0, + y: '__other__', + }, + { + x: 1616950800000, + value: 4, + y: '__other__', + }, + { + x: 1616954400000, + value: 0, + y: '__other__', + }, + { + x: 1616958000000, + value: 1, + y: '__other__', + }, + { + x: 1616961600000, + value: 0, + y: '__other__', + }, + { + x: 1616965200000, + value: 0, + y: '__other__', + }, + { + x: 1616968800000, + value: 0, + y: '__other__', + }, + { + x: 1616972400000, + value: 1, + y: '__other__', + }, + { + x: 1616976000000, + value: 0, + y: '__other__', + }, + { + x: 1616979600000, + value: 2, + y: '__other__', + }, + { + x: 1616983200000, + value: 0, + y: '__other__', + }, + { + x: 1616986800000, + value: 5, + y: '__other__', + }, + { + x: 1616990400000, + value: 1, + y: '__other__', + }, + { + x: 1616994000000, + value: 10, + y: '__other__', + }, + { + x: 1616997600000, + value: 11, + y: '__other__', + }, + { + x: 1617001200000, + value: 16, + y: '__other__', + }, + { + x: 1617004800000, + value: 14, + y: '__other__', + }, + { + x: 1617008400000, + value: 17, + y: '__other__', + }, + { + x: 1617012000000, + value: 18, + y: '__other__', + }, + { + x: 1617015600000, + value: 12, + y: '__other__', + }, + { + x: 1617019200000, + value: 12, + y: '__other__', + }, + { + x: 1617022800000, + value: 11, + y: '__other__', + }, + { + x: 1617026400000, + value: 8, + y: '__other__', + }, + { + x: 1617030000000, + value: 9, + y: '__other__', + }, + { + x: 1617033600000, + value: 0, + y: '__other__', + }, + { + x: 1617037200000, + value: 0, + y: '__other__', + }, + { + x: 1617040800000, + value: 2, + y: '__other__', + }, + { + x: 1617044400000, + value: 1, + y: '__other__', + }, + ], +}; + +/** @internal */ +export const DATA_9: HeatmapDataSets = { + // adding 6 hours to the max to include the last data interval that belongs to the max + 60m bucket + domain: { min: 1616799600000 - 5 * 60 * 60 * 1000, max: 1617055200000 + 6 * 60 * 60 * 1000 }, + interval: { type: 'fixed', unit: 'm', value: 60 }, + xFormatter: (value: string | number) => { + return DateTime.fromMillis(value as number).toFormat('HH:mm', { timeZone: 'Europe/Rome' }); + }, + timeZone: 'Europe/Rome', + data: DATA_8.data, +}; diff --git a/storybook/stories/heatmap/1_basic.story.tsx b/storybook/stories/heatmap/1_basic.story.tsx index b4896e4fa8..c1bb7983e1 100644 --- a/storybook/stories/heatmap/1_basic.story.tsx +++ b/storybook/stories/heatmap/1_basic.story.tsx @@ -26,6 +26,7 @@ import { import { Config } from '@elastic/charts/src/chart_types/heatmap/layout/types/config_types'; import { SWIM_LANE_DATA } from '@elastic/charts/src/utils/data_samples/test_anomaly_swim_lane'; +import { DATA_6 } from '../../../packages/charts/src/utils/data_samples/test_dataset_heatmap'; import { useBaseTheme } from '../../use_base_theme'; export const Example = () => { @@ -130,13 +131,13 @@ export const Example = () => { { start: 75, end: Infinity, color: '#fe5050' }, ], }} - data={SWIM_LANE_DATA.map((v) => ({ ...v, time: v.time * 1000 }))} - xAccessor={(d) => d.time} - yAccessor={(d) => d.laneLabel} - valueAccessor={(d) => d.value} + data={DATA_6.data} + xAccessor="x" + yAccessor="y" + valueAccessor="value" valueFormatter={(d) => `${Number(d.toFixed(2))}℃`} ySortPredicate="numAsc" - xScale={{ type: ScaleType.Time, timeZone: 'UTC', interval: { type: 'fixed', value: 30, unit: 'm' } }} + xScale={{ type: ScaleType.Time, timeZone: DATA_6.timeZone ?? 'UTC', interval: DATA_6.interval }} config={config} highlightedData={persistCellsSelection ? selection : undefined} /> diff --git a/storybook/stories/heatmap/3_time.story.tsx b/storybook/stories/heatmap/3_time.story.tsx index f6f2cd8180..3dfc3c8df2 100644 --- a/storybook/stories/heatmap/3_time.story.tsx +++ b/storybook/stories/heatmap/3_time.story.tsx @@ -14,15 +14,15 @@ import { Chart, Heatmap, RecursivePartial, ScaleType, Settings, HeatmapConfig } import { getRandomNumberGenerator } from '@elastic/charts/src/mocks/utils'; const rng = getRandomNumberGenerator(); -const start = DateTime.fromISO('2021-03-27T20:00:00'); -const end = DateTime.fromISO('2021-03-28T11:00:00'); +const start = DateTime.fromISO('2021-03-27T20:00:00', { zone: 'Europe/Rome' }); +const end = DateTime.fromISO('2021-03-28T11:00:00', { zone: 'Europe/Rome' }); const data = [...new Array(14)].flatMap((d, i) => { return [ - [start.plus({ hour: i }).toMillis(), 'cat A', rng(-5, 5)], - [start.plus({ hour: i }).toMillis(), 'cat B', rng(-5, 5)], - [start.plus({ hour: i }).toMillis(), 'cat C', rng(-5, 5)], - [start.plus({ hour: i }).toMillis(), 'cat D', rng(-5, 5)], - [start.plus({ hour: i }).toMillis(), 'cat E', rng(-5, 5)], + [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat A', rng(-5, 5)], + [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat B', rng(-5, 5)], + [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat C', rng(-5, 5)], + [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat D', rng(-5, 5)], + [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat E', rng(-5, 5)], ]; }); diff --git a/storybook/stories/heatmap/4_test_time_snap.story.tsx b/storybook/stories/heatmap/4_test_time_snap.story.tsx new file mode 100644 index 0000000000..9cab374497 --- /dev/null +++ b/storybook/stories/heatmap/4_test_time_snap.story.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { select } from '@storybook/addon-knobs'; +import { extent } from 'd3-array'; +import { DateTime } from 'luxon'; +import React from 'react'; + +import { Chart, Heatmap, ScaleType, Settings } from '@elastic/charts'; + +import { ColorBand } from '../../../packages/charts/src/chart_types/heatmap/specs/heatmap'; +import { + DATA_1, + DATA_2, + DATA_3, + DATA_4, + DATA_5, + DATA_6, + DATA_7, + DATA_8, + DATA_9, +} from '../../../packages/charts/src/utils/data_samples/test_dataset_heatmap'; + +const datasets = [DATA_1, DATA_2, DATA_3, DATA_4, DATA_5, DATA_6, DATA_7, DATA_8, DATA_9]; + +export const Example = () => { + const datasetIndex = select('dataset', [1, 2, 3, 4, 5, 6, 7, 8, 9], 3) - 1; + const dataset = datasets[datasetIndex]; + const [min = 0, max = 0] = extent(dataset.data, (d) => d.value); + const colors = ['#ca0020', '#f4a582', '#cecece', '#92c5de', '#0571b0']; + const numOfColors = colors.length; + const interval = (max - min) / numOfColors; + + const colorBands = Array.from({ length: numOfColors }, (d, i) => ({ + color: colors[i], + start: Math.floor(min + i * interval), + end: i === numOfColors - 1 ? Infinity : Math.ceil(min + (i + 1) * interval), + })); + const [tMin = 0, tMax = 0] = extent(dataset.data, (d) => d.x); + return ( + <> +
+ {DateTime.fromMillis(tMin).toISO()} to {DateTime.fromMillis(tMax).toISO()}{' '} + {`${dataset.interval.type}: ${dataset.interval.value}${dataset.interval.unit} points:${dataset.data.length}`} +
+ + + `[${s}, ${e})`, + }} + data={dataset.data} + xAccessor="x" + yAccessor="y" + valueAccessor="value" + ySortPredicate="numAsc" + xScale={{ + type: ScaleType.Time, + interval: dataset.interval, + timeZone: dataset.timeZone ?? 'Europe/Rome', + }} + config={{ + grid: { + cellHeight: { + min: 20, + }, + stroke: { + width: 1, + color: 'black', + }, + }, + cell: { + maxWidth: 'fill', + maxHeight: 3, + label: { + visible: true, + }, + border: { + stroke: 'transparent', + strokeWidth: 0, + }, + }, + yAxisLabel: { + visible: true, + width: 'auto', + padding: { left: 10, right: 10 }, + }, + xAxisLabel: { + formatter: dataset.xFormatter, + }, + }} + /> + + + ); +}; diff --git a/storybook/stories/heatmap/heatmap.stories.tsx b/storybook/stories/heatmap/heatmap.stories.tsx index 4d7781aab1..3b942b137d 100644 --- a/storybook/stories/heatmap/heatmap.stories.tsx +++ b/storybook/stories/heatmap/heatmap.stories.tsx @@ -13,3 +13,4 @@ export default { export { Example as basic } from './1_basic.story'; export { Example as time } from './3_time.story'; export { Example as categorical } from './2_categorical.story'; +export { Example as timeSnap } from './4_test_time_snap.story'; From 296d46e4eb676db8440d07fec412538e2749ddf4 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 5 Nov 2021 16:35:56 +0100 Subject: [PATCH 08/16] Filter duplicated x values around DST --- .../heatmap/layout/viewmodel/viewmodel.ts | 25 ++++++++++--------- .../charts/src/utils/chrono/elasticsearch.ts | 3 ++- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts index 4d616be658..59e81518cb 100644 --- a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts +++ b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts @@ -358,19 +358,20 @@ export function shapeViewModel( }; // vertical lines - const xLines = []; - for (let i = 0; i < xValues.length; i++) { - const x = chartDimensions.left + i * cellWidth; - const y1 = chartDimensions.top; - const y2 = cellHeight * pageSize; - xLines.push({ x1: x, y1, x2: x, y2 }); - } + const xLines = Array.from({ length: xValues.length + 1 }, (d, i) => ({ + x1: chartDimensions.left + i * cellWidth, + x2: chartDimensions.left + i * cellWidth, + y1: chartDimensions.top, + y2: cellHeight * pageSize, + })); + // horizontal lines - const yLines = []; - for (let i = 0; i < pageSize + 1; i++) { - const y = i * cellHeight; - yLines.push({ x1: chartDimensions.left, y1: y, x2: chartDimensions.width + chartDimensions.left, y2: y }); - } + const yLines = Array.from({ length: pageSize + 1 }, (d, i) => ({ + x1: chartDimensions.left, + x2: chartDimensions.left + chartDimensions.width, + y1: i * cellHeight, + y2: i * cellHeight, + })); const cells = Object.values(cellMap); const tableMinFontSize = cells.reduce((acc, { fontSize }) => Math.min(acc, fontSize), Infinity); diff --git a/packages/charts/src/utils/chrono/elasticsearch.ts b/packages/charts/src/utils/chrono/elasticsearch.ts index fa28533c70..44205df138 100644 --- a/packages/charts/src/utils/chrono/elasticsearch.ts +++ b/packages/charts/src/utils/chrono/elasticsearch.ts @@ -144,7 +144,8 @@ function fixedTimeRange(from: number, to: number, interval: ESFixedInterval, tim current = current + interval.value * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit]; values.push(current); } - return values.map((d) => utcToLocal(d, timeZone)); + // filtering duplicates that can be generated around DST + return [...new Set(values.map((d) => utcToLocal(d, timeZone)))]; } /** @internal */ From 500f58f1c4737f2878e3135b53e5479803592aaa Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 5 Nov 2021 18:13:41 +0100 Subject: [PATCH 09/16] Fix missing timezone in computing the fixedTimeRange --- ...ime-snap-visually-looks-correct-1-snap.png | Bin 0 -> 24025 bytes ...pha-time-visually-looks-correct-1-snap.png | Bin 13848 -> 14052 bytes ...tories-time-snap-with-dataset-2-1-snap.png | Bin 0 -> 16859 bytes ...tories-time-snap-with-dataset-3-1-snap.png | Bin 0 -> 7178 bytes ...tories-time-snap-with-dataset-4-1-snap.png | Bin 0 -> 12909 bytes ...tories-time-snap-with-dataset-5-1-snap.png | Bin 0 -> 9030 bytes ...tories-time-snap-with-dataset-6-1-snap.png | Bin 0 -> 42182 bytes ...tories-time-snap-with-dataset-7-1-snap.png | Bin 0 -> 36225 bytes ...tories-time-snap-with-dataset-8-1-snap.png | Bin 0 -> 15009 bytes ...tories-time-snap-with-dataset-9-1-snap.png | Bin 0 -> 16739 bytes integration/tests/heatmap_stories.test.ts | 7 +++++++ .../state/selectors/get_heatmap_table.ts | 5 ++++- .../charts/src/utils/chrono/elasticsearch.ts | 16 ++++++++-------- .../heatmap/4_test_time_snap.story.tsx | 2 +- 14 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-heatmap-alpha-time-snap-visually-looks-correct-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-2-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-3-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-4-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-5-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-6-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-7-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-8-1-snap.png create mode 100644 integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-9-1-snap.png diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-heatmap-alpha-time-snap-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-heatmap-alpha-time-snap-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..037b37feeec481d4345371314e649780dae37d21 GIT binary patch literal 24025 zcmbTe2UwF^_C1WEq9S0W7ZnAOCLN?HAVr#r6zN4e1nC`YfJhes=_)8F-Oxi5B%qXB zDbjoI(mQ_(+mB$$R!XYp=ET@xP@cLvob*C;o`V0|XMaaVf*`Yz7JhS(&A*)=9UVEEb#YN+XMD`5vmxESNm)iwXhsfwT7dh$oMHfPM!kl7 z5?lX;^pmqvj8BizQd;rfzd$v*=_kYAq_E=dR$3EXGgI8#_Kv4&*`-XE=NQhlVbhQO z_~8SgJlxK++DD0rizYv&1)92x(ErHLsu5l7HWH!HZ;0X3wr}9Oz{Et2`FqZbr=8O;2`Byhtzqig06V* z#~B!GL@=*kKP)c3iYgp9G}Pf$o>(0~vDj`DLIp3jz1&vxvyxa&Nr^u}=l1Q-jq$?K z{MIq^Ru4@RTzy$o-XEu-u@n&&7iUPs$yiu?oVQBE)$rg%su*^D5)E|_(C}O7*M^?E zaPcA)&gp9W>C>mLxGvm>Unq+%pXM=bg!hkiS%Fve4-CBj<=F`=x>T3b@<;l>BO>}M z2_)IJL(-A#S|(rTv}D>dIQp#&(H*jiipI0uMOZW$tzbnkop7Puw;tM5OWqjI>ur}# zE-t*XorrKKc7F5S>fs~#IV1N1RDGg&p9_CQr4Mnms5?I&AD^`SjFWI)UfwY(?x*+A zCR7cFE?vI-HZ}EGZZ2<$Zr1l{R8Mh^>!OKCLrnF>C~ZStn*I*c#F1uY@sUU^)SGwj zs?D6TbW3HGl}$(Mqp^DS@xspUOG@Ix7-hH}C+{Y85X_aX(sM)w6jgCz_1yn3%ipg2 zJUslxuFrGzd%3qaJU~8@ZQ$oXRb&ayRfL|KhbP*rU3zALBFIFBnfZ3y%P(L2PqE*7 z){$>bqni~a7tZv(rR6>^Mka**{{8z`Sj)uyyvx6s@ju+n`5;J3Do=jk^5x654GnqI zb8cQ*|aET!eCPPCZ;wb0M z_lmLE9ahZNK0ZF=s+Z5hkKLzG%O=7{1RWh6U$EF05fP3}+uIwVN1O$ z1wX?r5}9&+rS1Z)t*vZY`GLz*ZHvoodIgw16ZDBQXIfFsJNn40om7Cw;l6z{TpIu0 z?bKyWVAWIHI`|xU38|}0$uUds-!t)}x@(8OhEKG7I91T=HYJBCDb(h0Tbb@aS)x$+ zsfH)uCoJ5j#kI-a-ae;m#+u@6G`I254SYxF2f)4V8;ky#=c^VoUM_6YwI)5@zm6 z2n|Kv5do!$%auphDjdx5kD)sWkHP=#jf7$`a?4~xZ-;Xr|8nyFpEr?;4<2$|il`vq zDaCeUo%4}sH0BkcMr~bPQc+QdOMcDJ=b`zZ1M)a39E#vFE9=*-VabzY$~*~rTLUO< z4hmv&HmI;aIy=98R83jsQ`m$0ghmIM61KFogocG(_wXp0 zpML!Kv6K2`{;zYZL#vzjO5O4R2%4Ji#Kgp0;^Y)S5aRlc8wcfkce`Eq8&6VGQ@e~t zn?4H);-gPYObo$|p@%&i#})?`*ELQNYy70w%l8rmgm_(8*zS_wJn?11;gi?48=yl_ zP|*FB$Wun2OXfD}^s>8V*0#NdI&`xrvf3;=`j#grE#&QlZz{SG9o)Z9UTis`HgDln z0T!iLHY!?z&2(*RuVUHk;?szr2{tO=7N#8CwtCG}N@>1Iwj5)}`LXsp>{jM~)GZ z`G~HFw^xJNN>Mqrw65WK9*)u%N~;{aF(g+WOn6$&{Rr|B*e32xVwXm%aExOCLR=jx z^KxI7Sn|@;2(|nmy?F7W&&!vm(H*qjr`RuFHXQ%bQAiyVXrkA$P0Mf7TVJk3C0|Lw zK+|wY!+U4hc4AdUWBJ|p=}c1LC*SIdmL~gt{w(8= zM(>LZrVg$fF|1vSzUvy|wM(|euyGs5F+4nc#k7&uLo5*x?$s;G$*C!Sj2AU~h6zp7 z%f+PH`uh9WKq@E-s)pd_&)*gnz5-NpTb;G$rFmUeMxWJImn;`=HzpLX|0}!nRPDIc3APJ$!7X9_itx$t~uFzzM5jXyC@uXLxL+N z^_0Q%qTlkZyOi9z+w{B@O-z{P%6H2yj#c3iNhm(lya|m)n_F8O0~&s*scFvA6Njg` zebdps>NxoY5J~Rl&8rh^SC9*wS0j#Q@|@|+6WLiCn(o0ASi6rzsJFwmKp!&pQhc$N zF(lh#-Hwz&%&Jfm|2gK!PbzLCh`I~9{5#ztW-~@qiu^ zrz;!RQ~mPV*=xGG^bP7d#v)y4Q&##Azv-Q^&s*l$MOMAFhxN*07rsB99wc)fvMVYa zU#18&og>iH(z=&BPj~*jg7|2kKmfb@*8ID+ zXCWa133|7(ElL2}L9oJCPlQ6whLN~C-^=qPNSmpXDgT~_E{ zzj^a0f>r$_!fM3#SdD{2?))^n7=u`1NPWEmfRnMY@qJU%@Ru*|i*!vmz)HMV?o|pv zh{Z~)WopYQCtLJ=3cBVuWhikg*D`%L24DC}XE9^_v~n0O#7R`0uEw6ba0~nxFO! zkVYHTkiw>IvUT(WtnT5F5!MM&sa*FAX?rtkyVGfR9A7Tpb zjmEy5u>ejW7+s8%np*NVZyse~VUb1;ti_t$zI{THxe?p?$9>+-x3go}2=!@ z`t<36n>TNc^H^LhGxAF6h`Jaj@8))uF{Mx0Afls9Tiq}I`p8Hiy=crn!b6k|hXn10 z4+HJ_ppvrCs;)=XFxy)yEF>gUAI(FQh%@D-2`9{@juq*)2>WW-ku^gD0Y z3w#SAL|qUNh+1D9qrv$O^=ZeGG`UIVB`wZP}D-;Q?|@eq*uCC%{T z%SHdh3&joAtP%+Yg=0fCA*RE%Vd*-UACoVTvXpAnkma9%DhJ-D2t4XHor6d0(V3%v-UU3Jf%kh|`ZvaNa=3E+tm)t0J&DO_4)NT7#}U{} zpv)p7B1Cq#7JuuGkSzs%k&%&M<+%eitKR!PI~!Z_$B)ke)uA`R6Q1Y%>D&oD1i*N* z-Iguj^97AjoIZU^U0o(i*D}zwd;p<6f5i|0QW{)VYU=B^Zy(3S(ZVH2NJ!GPi(a(1 zYYcU)udlCph`mip3Np2sU;nx8ao@y*8h7XtD=VY0aBOn&g`p0mlv63qUpJPgfNJsb z^MA4%xoK!<2#D92M~vwS?h~(c$uD?-bO8s6$tiJ%QZqC2FBBxTBsyz@G1mgS=@{oA(YR0LI!{!K1_Yg0(N7F|afd9Lgey$YVKFh^YQq?VOoeGl zou=DAN2tt>UeihXK22OK9rh}!W?KdOy?o_VQU`&}GA68T_fzb@fXKr5Q%iFeSD*^P z_Nf_k-$tUgUe1rX)teCdWtK%lHTWvU1*N_DYPNEt2WPN2+7MX2NPjaH1ISSLX7!-Q zMw=n3XoOr-Q!~(Hb+R>JX~_X_Mov*N==(JEfGWDWjli<0uIN7mYQrcK+;3Mz$?e6Y z+N+|sIOw;Kl%P}l^{c^FJyH8q9yD!*{G-~`lT*+BZ|vu_t@G_Jvz56z<-x{_&;`pd z1)ZO)*aW_{wQ~ZRsp4(7=kwE+#a+-(8SiYZV*w%s)J+Lz!Z}V3Tk$WFNM>hSOsh2( zCD?GWQ;v#KT4di84AD_i{&V3TDPr=3=K*Ak!KUq0(C0D~v{mE1C4=dLWNwb* zV>IJ63jgac+49vT1OJqiQ{0MfYHH-b#-WlWDuU^;yMvk*E(zZ zt*#D{2r@3IBak&L>?0NKHU7uBg@pxpZ>;XCv&M71rKc$<7JpWe70fKyby*k8Po`xp zU}`ytoT5k2A>n_m^QB975TA6`eS?=7vpL; zQYcQEI&)n-emFELO2*zEJ#Q6K^Q2~IpeibX2O#9Gn%bwWciPaB0)$Z5RE^mE6M)z{ z*GNyCcrV_}e@8<@R#o-P8A(6t#zU)_4bXG_20;_+rv7_0=GHYG9lBDtW$uKT)y?_M z?R4GJP8a@PEC!E2nR^KILUFXFjL6K)Ouu>37#eqK9Q@RbEuNsGvlej=!1>|E7zZbIr(zQ90B52{aZ%>lmk*N>l+)<(xo5{M7Q`vfI6E z{YSub{-*zO^HDY;OPqd?;LKX{KN_$=TA?PF{Hg){nqWE+yPk`=v|DN4r)w8EFK}{( zZKeb!dCxFIHTF(AGiL1?3!Gw7xU$18t*uQUIHp)~?KII$fO#GEpwcCCkbACyhDF#N@lN z;Wn6=C@r7XfxS4gbqSGhxQq@tIyy?Dlit3)#KFPD&K}fT>JFV>YF1Xw)H1hu(*p7{YS&@+Gk0bd$acJ>{7t<8~hD{iRk zc~*lKWm}|e)$z#(7_*(d{fCSUq;9Q4x^m4=k@`I;=<}i}=(0B0BSb04)6h6Ed3$>v zt$eF<&;-MRfxDrRV|Y+q+xAA+(5FwIkazL*>sM%4H8gS%^s4>fqY%E+C_Hz?X5B2U(?2qGEQ=NP-rN~(#p0TwbLY+tk&~AXLc+8zih8L)N$)Z9aD=XU{Rlao*_!HB&Q^*Sn89}#} z^8Woor)AbW=v0XgdZ6n(Arq?r;lX9z5H@@$xUr-VF~go>$K2dpja&bG+g>0U;UTqb z-DGF8d^Z;8{*ALLZ;UPky<8Y#U zd&VZOZcn#6gK0gur8n7{MnOeI1v+4yL*GD^pYl2n4n$!xoyffn;%WWOJ)|B)R3gOr)&Pg$5{p5RCv3 z8#Cx?TR*BwNxj-t(AonxKTd>9DfES3HxD9wOU5!Ra)HE-qJ zq4)FOunnMRTkgieGiS~yY$iGveu^FVxln3lX{JB&Edl{JQopS&4-YX0Sm{`F!I}rq zEht6cQZFMS!s6o<@7#GYZnkz!zqdf6>x&sY56<3UPK^K(aFNGXbT$lyk%+h5QWIK;-1EmobuuJoz)X0IFcf+!j*_1eCiSnb8yjCFctS)riu2yF$0Q;x z`9-3SNJTu0QvzNDO(nE8zQ%Qt15TKAD0)P4Eh;Kfi(*1p1GFTz{o^2;xU7#vL0@d} z$Ls4A^G_bqyY%m)6JkRiVj3T+A?FQ!wycs8%JPqLIimZ>tJiigT~KR+@;GwjNZ)2* z2ikP8f{-kCdl$SGv7|&i@NlufL)@3fZKc&iG;_^P04cKWO7K{aBW&GcZVIxz6L8C4 zzI=I0P0gvvv#*;OP-GT%ffQ@>U=t3x{`o%U3o%OuRlZyXl?OoKs{(*oU#R2!keN9; zk&2h)N5`+ydjC5Sh;Rw(jZiIED?nlX|NC6!Ogp}9tI>3usfk}sF_cHoJNHVO+fzW93M`d9RNmFJ`f8b3 zR1^&j+Gx=B#hR6J8{RH*d-{=)Cxv)@T5NH#%%SB0+$TvaF8P~#i`hzuo6|XFX1~o@ zObDzqMDPY$??=XvKg>5a@A5aYG%Pc_#fH&x_8z>;)%K~J6ZSO`Zu8T(iRyPU3D>q6 z9|+P0QuBRtaf;&5LF_H7ULZv5UuP~sGj{%ZoeA1U6;;?=A}`o9rCS#8Cz(IBr>WrO z%&|E8ao8{ccLuA-#1Hg?tZV?qL$1E3pY(t+r3Y)rx!abgIYrq<*kUtSc=jwSYu#iM zvaY2XWo79ECl}XU)&~66al2c}v*7gPciBK=g|xE7tb5GD9uy7TyLZ1t>3Mwx>rS~? znaE@h9nL4mIE2(l!Uq`d%u8#1hy3fat!8NQ=DsHp$pq65%z5u(e*br6Ik|z7#YUql zUlQh?lr&AGSZh1ZCzH|!1qY9QWlkJ^<3|q?6_-WJC6E@r*3}KgJNFvEhDZR*J(zyG zrga*`EKOx=-@52|XizC;y981)eO4tE($^F(4oSSSg!Eb_Eowr6p^c8g!hzgboZh-KwFbm7vUSpdYo;u~B1i;RQZBe&ATLDkni{Oo20&7!d*YF7BuniYVdz(qXagN2Gd>H+$6W{T|Z61Y+Ki2 z-tr};JX?R^3`dDBCz;;&D7BD|R#o?1`LDIl3>xEvTuOBjdZZ=nSM@pdc2c0J^F)(R zcegfuk(f^;Zk4(rc)TNOYwJK#^e)>k87H>&q6YS3j+W4vTUm9k{;O5})X$d(M4W^~ z5nmO4t}{VP5gAEN&aU|d0NDTe^TA4DPQ+S+-hTfTm!JB@PBYJIhRipk!S?2H7{8Tv z6JIz&h|tp9)T9B6xGs{tYQ|~tGZ6#w1mHYf^hgg8$#&1sAOe4xKF$lIv^{83GKBgA z)r0=#@Wa_244y;?+pRg5Z_ag~^Oz@8$E&alxFh~drJ$*s zdMu}UZEtXay1di3yXh_dKox(P-MCP*CKVMGphIuc)2EX+l^prfYUteq9jAWW*40J5 z75POE{Fyw#Qc`$z4BZ zfT|evmbj*rc!SA4v%>(o6g0L9FaIQR=wI6M<^PIHCx?|BGk5=kNmUCb)ze?%@;|#D zGCj9O7bn77_wIdN#EB~#8or(18XPo)O^`+a#k=RFzYUr@e!^gb$C?qs6n9lsZ9xjF z>gdP!Kc}rVj72c}es6%b9zRAJpzmpI)I%LMYuf8=t%Zm6^F~l&tKvDhKCKY0z8&K*f@%YPY!k9 z#5UOyy*55vG_paVm_$Y6U5&iI=4^wyl3yJsK}u-ja^W=X)9mJG2MTHP`_sl(p_0%GA{uFIgS4mT zHrc(m2yK$}LmmlM8RV_RW?GXV9t7q=gIqz|j~~D%#yikse|aQ$_MmMovyc&p+Fncp zJ`D&AjiC3rIDoJ)$ld@R88PPV;gLVOOpZvS#Dxpl_{hB12opV5sDPiH6BkdUK^5+M zC}cl+{KSdR)&)J-zMT~T1mqB{30yNJH@9L^YQ*0Udwud`&jikEg{Rkh*HdhJNyV3x z?j~qCWMXS)!CLk9^a6SdwilF$rOP^ zwcEG}ePBapo+XJIn23nucf|kCZtU%U>&C#GKgyhGeQrPoS6cg3;)MMYl0l4c zFvC62RFdR3yS)c*x3BZADr3>kgkVdEEVroOm7G4jk`sTzt9*W1`&UdTs#)iq*sIiE z5XQU%5SGbrHvMDRvbW0efB9r!AOx8*2tIg7C+u{^x|0`4Snvvi?psnK!n9Rq6_=j? zq6cc@_P)8&?L*#$xy+Bim7n7sr(n~j{5&q~U6a6B#v4Ot9ine$%^sz-HTunMf8CXpLWwJTj|l>LRi|qYEi;m5SdpVRV#gobFnN;A=sK2+k**uE`a09!2`JQUPY5wELUVY+Yu8vh?F-cfZoa0xTYj4rU1(~|m4 z>@|i;EW@!&u+*K@L*x|{M9htKNbs`jf$&gNQ*2C(%Tz`|;qK067b+kyFj+ZKj9d** zyX@S~QV7ooW6bgcDG}j&J4Xhgo2#3EG^T1`#2lKoF&&%l;X#m zQ^>#%qlnUVV{u=ZegjZq9kRZ)i1QB)Mip3he5$VexYzIzNB8KcrE7eKo=s`e9Z7b(F3vej=$r`rJ+KYfFqBtJ%nP2iH!|H zvdOSlg3=CZ3`7k()+#R})|crV88^ZI@Ri?*G855cPpoVcRY({)_#9zD9vg(Q>r ztgpyvHlBo_MI^!l23O45n#<7q!Gj0?MISCHH7S~(KJ*%dc1VrVD*~kGEl48*G58GN zk0a(6w8Ar)cdT!Ed5J-4r|+G#WNyc_ud_H3ErT2m`txpDdU{}eQ0!Obn;=d*ps-*7 zI4DN|@A3J~gRj~1;2RG^|K^n07SJ}8H_fN6qhl?HlKHS$w3?Bg$t+6qAy2bt~KQhz#!D?;CR#hw-{pnLX?47tEnwziZv%gO(J@L98RVO{T zxSrkB;Qc-xBFw)S5f&W)Y)HtS3BF7C;=NYTi8&?>)PG?_6RW!J1AdSMQUFivL6J7z zJcH~h4VTzN4@@1A8j;v6U=oB+G>YslY89aPfD~h#ZC0#3 z{Sm7R=e5wBW&4|^QwVAb1l3-Hr)Zf~8tKR2^$K=r`2`$;D6pC8qoZwtZ!Dtt8p=H= z{#>j`V+MH=BXkE)g4b}BV>JAMBXvAXpEGzMiem!- zrF^DIp7Whvxz}`WDP|@g81K(Iy`2|u;ak7p;vK-nzLO_U3VN(Dq|C5#aJ+x_&IdB0 zP|L`BmVy}L%&gsIkPT)s=>GcOXit z`0hHcXf(z$P|rXSc@M)5AXk-duXG{lY~%~OSM0#D+UG6KS-RB3!axJ82o$8+{?AW} zRyr-s&CIT7XCQnH{Jwgz3846!y*23?Id6M*85tQnAZ19Vicd4tieH592oG5jkN(^u zAV7#*^RHIC)P+kR9;eA4mXC3^G~XG)Jgx80Q8;{HKV;v&L(EO2YiPcI-bG{2pZ@mk zCNvC^y1EJT(|Zlt1clCh5t=a+$jPoSAOW)xyV3c3AwmmF%b-0uxxhH9C?{&aOXw%Dh+NY`R(K9&yT`32$>%%&C>K9)sKn@w;o%Z z$F!I|7ZTM6lNFgu>@vjoHWk-p+ zy1LejuG4zb5_X!_@60u)74v8}a{~Sh;##-3G3~acI8c(GYUMPp+nku_D+Z6} zZMa}wM5FM*IkYM6{rmS=v-}=ZN`8JMWSk-QA81lFFYq1Ouu)v14NRf@7V*KA{Yv=! ztHn+wwC!~?4Y*Lx9(looj^1KcQJv-v(Z4rhAXAcxCE_5B?46jAmBl=}VV;{CW37Fs zG2}cCPq<#67iaZsIZeZ?t&-`B=K)2=le`v&MAQw3WXmdj+NO+~lI3{$_#k=+>gqq_ znd}-A}udZ96-)) z2%$?*-E0SZD7cNV$6yO&Psghk$)ynT*#|wFFK*1TON3sz%kw`uQRHfPn+X^Xogg(8 zmE7ICEpi2O9cVw$l%rp~I0;PYz%{6F*ZxOD4i0!@`andemfSAKT*)FSkUndY4S|W* zBuJefVLI2A3`Oky-V~Q$-35&V8ErY`EeVOo)q8N^Q6AdWW87V6%cfJDJF`pbM=0ne z)&$lw?&Bw<`XG7;`fj3qqY&PMngR)(;5UN`XO@U}gz(qdL_}xNP81;}zZE5C8?34?)zw^( z9fZ^%4j3PM=AQP$0QjQ^(Sk?U`jcls8z-!QSc*-r$j(YZIh4Nw*hk(Q&55!K3b}=L z$QKaiefYyK969}aqzCzEh*yPw%wAU6XVG;l_CEX_tVa{)c=aIh%$)K*;;|zKS?;`CkS&(l5#G z_659&9_HL629dg;?Nzy#B;h{{tIeP>?>qlGSb=P?IXOAlAuvSd*F9j&ga+3;h>TXW z7diPL1PK_9y8S2Fo4{~(!~TZ>?)`M$%4UEch`zD69w>K+#R4eeFqj*xHuAp>tL%fk zlBUyPGW2g?H-=V`v<#4%nMxgK?Z3`!OY5kNF!z9R!d) zs~lT2D2Uxv5O!a&@;ydX2|jJ0DFvv}_M-|An1gS1YuZ$N$cI8V`vNkm2DK2mQ_S!v zNhZ)lX6wFS4`+GVjK$aY+prjn0r8+2YIRwGwN!%yT45l^5|9cgP09Lb>=L9=T~=OP zl!xv1%8un zV2+}JInl!q6rgCMc<|2pd`up&;MZENMi73|L1nAe5bA;f!@Q{09DAux2||@u3Wr)`FQ|G z@iTx$O>KP9%etR)?H`AhpaSMNI(HbTsE$;4Z?}2p7}t^ax(tzkv2zW$4}e0jsxh9! z#NB}yF?`YIFJGQa?gGw;+!^uh3FUo=M*y6JS0@3#U7P!K&vK+J2Iy@)2I>?B(UxF% z3llBk_@3aU#3#8#V4n~Hw(3f789YKTTQo)=$)WQtEvxL?8FlUJ5)%7a)iZN{O(LvF z*f~dmAk76?)BIiMna(qUUe8lt7zNk|1U*VNCex4*;yFoQLgqk2h;7XMw4a`JoyfkhFF-+R8O=;Vm?v7Q;6;AUV^ilfen;YKV`btva|7XA7Ke zX$J>h(Azv#I!v{lI*iHH@Y5Piy0V!_Cl)_GKAt}_CcY~~0HHcVVBWAS62T)+aGPX- z@-AFzl4t)l8Nncdy66cybDwJ;Os7SQxPJO18CV0L|4UZzn zx_#TAqn+lT6Iu!J_z5i-i7BAMt$3~=K5bpNv3k``TB3<{^_9>+_f65U6 zi>pON`NXMHMk4MI9B-d-l3oJ=*}ha4L6Ak=zqUwt<>mh%9v9hF(WKG6+y$JqnaxiFd%K9(=>;z_J}5bEPJ}$jmikGF)5|@e=_8!9^txr zdN9XnSr9LH&8YdkVx&g~3sS6hR}Ik08>We#*n1ml)`$cA?WWzd`q*>4y_Nav75 z7U;0M&(Jytt={BW9f*n@X{LNEf_P#w6#`728DPc2h>sY8u^#ze4$UN<%U{t$5* zkO5v=QenJ<43X&Xdk(VVT=|!z9!UT9XyUWCFa?Z7_x#HQ5y%h4GdDjooxz9yYw#*3 zu$(Qg@{1h=@7}!wf{7SlA{Yq$BMkty_m4j+VCq@Y$|`++8XrhYgtlQFNu!b5^uWBf z#cz@SiM_~wN|85rLMe@zmDMmP?VpBkj_<{7hgL(bB+RgP`yz6Kb7^sL=Zo&(JK??8 zVL5mXt`%CUOVw7SH*+(mv@wN)x5}L=HWRt7pmprv^oZb(}`h~ldD#U6Ab%@*ifVH zkg?%eS6kZ;xrk50G?L|gA&@R^Nxh9lV;m+VP^e7f#eXlRs`$|!>KNy+{^Wm@lXkcm z*tAysT9^#z4Z(!S-<6S;hL~fmQHbb!bD?o=0s=aB{0$q>}J;uY3ZgSdsEOd z?U4VFJnN%Sd5tdb$5qt-MzYwvF+80S{dnOO_h1ey?m^GtKmBIb^itqH>K$JMo z$Vhe7;gV5J@CXE0vQzhl8dZqDE+%to=01asa(|7p=lXljvbD#s)4^yjlDZe`+imNO zm*I2F@Fv_n^v78vs{Ob3UB8>FL7SbHv8=r^S>; z+RF30eQGC|Ee@VB^-^uAJd<~g?&qER#}B`}&KO1@*FMLPK5Qy0E8!D(2Mw+T9ux&jF8F#BHgzT?bwQekWC(9Q5cn)M=x##F=M2>sL3^{#6m6kop_VQ8Oqw$Vu5 z9tVFP^yyB_{uVaWzg#g;B7#_=LPFiUn~}f)0KSq&Vx`W1hJzRMO-*ZDr$G(VxOeaR zn_Ca)wb;ld*~n?EyX$~QoGd6!m9=5UzPjCb_0kaaVjvM6X1;NQfJ8XIVRbg1{tt*~BFP>Zi$zwUyQ$GT2yCKfyxs62>>h>Lo%d1$mG z#P}o2H=U2AZbdY=6FkV@y&t!g$hu~h%=+qSm(kq(;FLx|<9;|o0hu;W$;n7h2T$I= zqTTBUKBOr{Tl8Y+N41OhA>ic;^X2% zU%fiqx64DppnGYAm!H66<30O@5XC3;$mvU97@=dVKiWjH$NbN*lDg8nU=QOp(oDuutY{SPM)lEwbIhk zq80a|MXboNoJWy1nZ^5ync|P1su`LO>^Ydk^&^MIzTUj-NSlH|x8fTztYKq~l0(uz z)^fA;bMPoEpvga-kdV;7xIW%jE)Gy(ySwA5DjZUyvOP99`1skg!y;Z=?X{xJd)1^< zaH%O##PuX_Dz@{3H!?Budj+V} zGpMiu2aj-pA+7od^$d26I1$&AS*0tQ%qxL=0I)Jee#6btF|V^pk%CkA>8(rfN9tDS z2AQObo7>}>p*N7JKORu+0?KINEXQ6EUv&&P-&0+E@O+r;@*1c2Ix!$$4h;9*RaZ|F zT?OiAgtj?-9L`xu)_J{3x5mGLJz zuNHGo^%OTua%k%Zo?~Yx34$q8dJNOzX^7rt+w_Sw8WCRm4eX45fnBVJhhRw17At@q z%$SJ+}Z!7VMV03y>>qX;z5SWffq z7oViR2x34HbfdSe*lJWDG^J#mz2V5Qx?WbNvY40OfE>?5ILx`Vv@ zYy7F{v_8KOkA{Zb<}ED8FJM5NB@Yk^ni(H|27)b!LiW_^AE4uf>}++edGpz*I-wvq zS}5DRnF)Rgb4rh!+kxy$ft3MguCODKdH~#?OA{)m$;l1dg}+}qBk+LQJv5CS?7VrU zrQI9(uTpjo(pf!@7qv)B>!%kXTQETpM_m)J1V4xZtf1779|w8!^YZxY?Cg%8;Xjkb zH*8N$Lx2j3JDQ^r2uK4PmOVgX^+A|8z&5>;7xE4{s9Babw77ow$dLh&{EQ6tUudC&Ew_b<>oF0awT8alV1D=WSQ1p+&peY^Y3ioy)OzPOlOP*C&w`jgOv zo$|U+RW-HqY;4C+C=@&r3%HqKK}<$gvoKP}1<@E#7Z_mW&eTgX?v-S-gGCrJBk2Kc zm7x0y+w*{ceFX635j=z$@G30!5D;rPk*E@0p8%0v*QWG#pF{Qs&e%~{_P|m~NJ zP=FAoUFJb$YikQXnaFr1A> zKe=}H;oZwVvKP3`^dPJIBqW3kjPZT`Qu}=*9>EeEgvsl8*TZ`N`5;pzUqCc|qvfM=O*B)onEzy_}vMbVF-kqJD6@1YD z@P{Xzm`5R@+un+NHt$%+z;k|Yxv=uADQtv@?>vJL(KRD?NPnG;xXG9A?&8u9!(g~J z%ouX)2!xtHTB}?-4GrZ}h{j+S;c-WSR%aH=>@D)xV;oH>%89`+H{fidcl9Ng_}RS@ zSr8ewqxe-D2-AHfh<%lV(dWfpbutPTY7iKRVF|>rEPd9fUvKwE!I2vB&Q+8MNrQVS z6r!V|@&rgP;-?}2dFRe!K$MEQx`4%Y2>V`QWBbCyz|d&KxO)_$0y$z6P$-2v3ap=D zVhkki=de(MjR?<&9fm*9JjT@=dI&8woQooP>9ifaFe@uD97+V|8pYM9T{;chDA3_C z5q^U1Qg;d{%)^Hd_lr2evVsx{+hkm=NjUO4Kc8G2>rH5CYT7uYhjAjg^Wikee1jq@ zM?Rc}zr%VPffoSd(7@)-(M%HhdRJ)KPY;ic(OCNk`b#~ANaW|n#^A;FiHV8qPoEx3 zyy+Lo*I@J2V8g19p=^O&SHo#XV`8(36-G-Z8ujgpXdzYWlY@aZ9FOhnqy{$-JA3Hd zQwM6O3OKic8bjlDJM34d;s3_+e{I5hjL3h2`-U4N*g(%EpbtrL{E!SG$76s^4}dBF za00_>?IfcYL8M`)+On5Nj~+cvPJZakt;0Z2AdI`udA9p@-duYQA;b&(09H#%OLO3O zB~>j)M?P4X@Q00^9l?>-H1)I}@^sKXvazv26Om4C4;BvCskM!b{11kUGXp3%4I#n@ zlbWTTQy0*4uL8hyHW4?2wSk%fX64y$wuF1;DXM$S!KlQMW8oM4CH{w(Escpx_({)3P=Hk;ImdkUcndAM`?M^(wS4S zZHr?#Be2up-aL(sr2%_1q$Y$Rt63?xF zNFO`q+IJ;4p}93{?5m@3#@N(U8hI9cqxt#y2-Z0St4FakK?>0yib@}b(x|Qd{r%hF z$Tf&9J%xBbqo^nyL>wbJ?UfS6f?zV%5tf3~`4iGX)IJDd=j0^o?d?UvNG+WL)}2p* zz4t@Rq5{ql;d_BjO+5@n1n@(UZ_}5l_7VudaUxRMTcTb+`}aYB_z#d72&L1f;J_kD zkkldWnD+g>&2&U#f@lC-YoeQipae2ba9oJ^t-E)hLauWFY>zL1ce!HfZ6(xAS#Xq6 z?R{<$m!AY;Vq&kjjC?;fG&i4uJuUR+yN}kJt8;A|1)Vw*-<03M$sI5tYT4ieX)lD2 z6Z8)ZJOWDmF(~H_98HGYU=kYsYZp#lKYJYMr8I{er7|H{PR1R54ANl4Fj@8!)>v9+ zy=WU8?SY&WcUSc^MOo<`1kLN+}z1~Dm!ZDXldzG=4=WCed)hAcGP6r=%$Jy!!_ z4V9IZKY=c!>CR0}5l1Wd!nO+uLw(2-z_D)ot`(7vH{u}Ist>sd$TLb?TeClY^5g_H z^~aUC##%?uMNI%eh&OkadD292>R};}`xEF#+Ki-nCK)xa>`VbO2nMhl!%P7QZC<8g z-x}46#BXj&dYJ_&_+`-GNC2o)37`CKNcf8vcNwlY8tMd=mx~KKjE8pS!;u`>e3m~_ z=|Qu;qNk_VYUCsFxx2etLshlaeoj6L@bu6_;3Kf%0G-qVk;f=72iWwXhoT;9w_53G zY3pGFd^6bvnbK$&arwBdx4S{HIUKG`2}ksl?`))9_nag}x(@7h8f&A(@bD^Kw~33T zn?UsqVO358srhIPhsWt72gs#*;~LY-ysE!^Nu3b@{d=E2tS2@W7XS6lO>}nl6(=|= z21{vl(*G&gF*&e@y;6+ku717aK+(Ano)hWe1>=_YK-d8K$HvGgnIX!{`w~=21#2xx zDFg%ut99kW$ugj&3APRa-N6pcx7dARpZV%Ik^?k8mEIeMSEnP?b#Le0&Mdf9#`#?8 zeBKPBbfA78#BXD>nj@z=S6ZWs8YzvCusPI`L111Zt5n+vh_PA0`9Y~~{J$*E9=jJ)1 zV~DH&6GBDip4LzmsNRwfPUMIv3*fBcS?%0kv9CTsRLe%ZJ}f^++;f9hLPBDxEFTIT z+JM$q&el=5-1j!Rj@yc0X%7Kq`nj}pcQfKMXo_i#xwOJg$3T|>Zrj#HVLv}p0LIF* z6UfN~(y;1;Oq z&{wD;xEdH3=rmIN?%hS0@qKf369ZVvkDH8rVp@X>-5UOsFjcFa2>ZJwS0N#^xOeYmi;5 ze=U*Xm`Ui{u$kDf44WoAyH%V+&ujgirtnCy6Ikfbbo23@fdF461YT{|7mV}fd7LuA zh6Ay9Kg3Te!R5M(7`w1a28M^9f`euVsVj@!2P&Bb4Lv<{aD)Of*lb{J9RxAgG@Zoy z8<_=sSvO4^<32;LkPS7KH{&~6eE0GV3yaGDflKs~&Mj`pTIQH6${#(mwpcVfJstQx zNoEL?8#r2_0?za@FnCjbprC0pkfQ<`Smgwf+oI$F)gNcB)!mC+TU#UTh~gg^8999P zXyvyE)_FMg!7SINJ$oN)j5QF~`#iST+6het5$yJbg@tDE+0Y#Vy}oun><^kka_gXN zXolc0PCvNlRF9t>3eL5-dxV`lV7Y94Dn?z$`_!8^Z`wZ@69Y3hfWT~y9(3%G4G~6C zZL@vlA+KMb-P)MSato=V-5O%pt$;9W|KQ-;yzLHmGIq zNr2}DZQsc(u!ear*c1@Z?;jd^0^Z@-OP3BqfAa*5woe%=&U8Ka5Kw~(7F9K9I4#e) zu6bt?9XL=?S-BskS6C4HUUl9~DHq`e9UaSYnXaA*+C-XVLYo7A3~iH56s%zB!uK)u1p#ktFukHWiZHtU1Kc)+$4 z21oL9LxW1SJLh-K@o!tLObzxA2CWCDu1z6O#f`))!AjhV?#jz)X=y#w0-!GqCkzxt zb*{1{iyCMCRblG^|8-|Y>x-Ij?q!fh058WrVp);_3ebi2K@r-J@fD6U*d02WjNxsX z^BAEmy%<=K# zExc~qYj_34it{B~ObBc7*P@JTzICJI?h^kJPmzUe}bK2-S8_sZ8KX09$@_}xR>8T94fJrp$_yTb2owSkP^0(9?Qb1G@1KQuU4e>akWB**}$ zV15G1x{nic?wr>zM}8>gP}u38J|5oqetdi<)h_uMkwJ0`O9r)a0=~^ylTAL~%#~12 zpjyMB{=V2DLWAQaxQ`IX*lcb}N$s-llbXC^;Q7T0-bY4>eE9}Jbp5%ATS|cB2Jo85 zyYPYD8H5_TavX?)0R=zGI=nZcwy~kX<3-oN6WBzv@y4y*UToddFr*~Db^aif@htuq z23!2oFfv|>=>ykc`c3XRq7ilN&)}(cgZ~93OHb~Fi)C%r*|9WwUa!jt-2xL9Jyw7> zjVbbM;*f6Yy%{li;R>C-nXcYeSytwWb%HX+A68t}w$BQ#(W_;(SZ?DgxqfsYh*pBg zmAMYOfq#jw3_^M3juMdBkJd_ezYZQ_rr-^qR2CJr5|? z2(JW(31QOBclj{f*dIK&6&M&e29eLjogp$67p{V6=ojz2Ny#0k?8q@c#;DvIB=pF! zy}!4&<`K0=QLW@Y%jy$nmVlQlGp~d>za?XqtXAvJ&{s8DLqo1q#a(*X7k~r;Gho7g zFc9MqYyOLLmScw$ct@D9WYCTb(&#!S=h^hkk7~(8HvCfIAt5`o^#6rT?a|fWX2~$d zfW?J{LpGajE?-H#j$3PlJ#(t?GS|xFsFU@-Vbmi$V#y{fDI^Ybc{23MbofQsdktySh9%?rBl~7^Rvhk&++}<**M9XLM;~B6k6eiBdY62 zDeC#Id!Cg$6K0G^il_x7zgk~^GrV5Wd;Cz%1MBCx3DF-dUX=TlX&-lE~Jiy~`g?G=R+?u)tGN$tRY qob)i0n2kcijiw}ulK*F_|Kb$5W1QH;$&_mwZp7Y)Bj`!|+-yQe;`;7r(k0g7qz1CcF&H0?_!P|eHILIfe`86Yr$UCkZ`8@8<%XaoaMc!xyo^OF&+i6|X?c1xJ zlWFI|9Ly6tFHq%`P3>V-^P?p=n^K8;P`i z_a+mQ_Zp_i=z+=4VKl;PvAn*5;mb)RMDS0FiL30vbnp8t{SO18x9|yPsCwapSrm6u zYqhL;%a2lS-LfUZ(dfFm2_km*^{ZC~O`IaI+D8@Ox6?sXhf$PQ6svLn7XGxQ&~f)$ zjDwh(@r4k1f_sIks;bZQ%aNAA+qYl7S33yXq$)#i*7%^^=}w~&4!i!gjeoLXl2oq} znR5%8uigEpJ};iH6Ex84UGKBNH-moM7s@^^=Lgq1r-IkPb-GxqFI>FS)YJqPlsL9% za_2@iNgBI>6xmQ6XPT3{L1yaMKVliXlYMhuhT>)lvwjAxKtS-8obh{-b1D5Y8#A-f zw?+ryfR=?JM^CNyh+6_qYr&Yh%8|D8601~VFj17FaGuAXIbd_tCNDxooTXS;+vcGbZgcywP?kSVW&CB!!AdA zJ?v!{HGB8=?O8Fi4-G^tG=6YT?wdNhPX`?yK5Uy>xg;W@jS5_S#W(-t2#FUPqBW7J~eCY5oeHE1_9Gsl|ngl#@s2WZ_#m=6$y*BHzF#J*Y z(xvWf&A2k>0b%MA!SdR}P6ek$e(l6d3JO;C%@I8!#WnA1Y80$JKQX$6Ai($y=f2Kf zn_v6c(Pxb$kt~%qRcUdL?Q*c9S7rG&)VkdWoBls&D_JUuCDf1c-ZFTC zbfhztG(Z|D&EuO-d(;`@U>=+Om|?g6h)wXegOs$i^Ou*$CtA=LOad@$%teizQ2}VA z=2h8jy>vNP1p$$In2o0}n6~4zxkPYwbu~6OPgYe^8_3aS*K8@aCgNO@khRaB|F$?@ zwU!NETU}lM{)~+jCBL++RPIiYi#&Ht9W3E>WF!>_10#Qrm|mL^zo;J3U1(nF)2Acz zZED4FYk6|CKBRtUeLf2^nxLS@=PX$HMXXQEc z=z2(^l(l%0c2AE1X^0Xi=J%+o2z9x+TsKu!4l=P^|LMh{2~=0lWCdMZ^EHRGSwZQ8 z*5tI|qA~Nm(S!W_+{Ne44sUerF7#xj25*jqo#s55^;siou7{|Q$xg4-?|YP|75jn> zZ^fp#XZdT)&O7j3*10yD&&H2nQ3*WWF;rC~VK1<5P*itoByj$D31>@VdmxYGr zd$);{r*qy_r%s>FX>6>WXz};y>fJwdgxVogi@ib3mZ-gL>-iD$#gg=0IytYkmGpjeRBonrPf&-x zqUi6|6BzpZd0BxCJ(ztip=K8LAs~7pXfuePU%FOOP*T$P^y$;(Qoja#%o~wuYLi!Y zNE}8ykVGo&+85H~P+GX^kc~8~C`zX;7cce2WI2r1__>7R5^Ji)Ey)|>_?qY=N90el zvtyWdrt|esTr~d;N=l(A2qw$Ro@1kFnnxHI9>?5MXB&D#_sbdinC~L)Vbp;%5&y`I zyw1gR?3liqy?r>Yh!YO|!Q)vdO;zrPJ28Ekg;*k1d>W8ZbN5Wr5Rg;zHn;X}mI8xN~NMBLJ zgn{mNa|WN|SHGt(Zgh$dz+gMHxUT#U%bbiyj)>qj5;Jxv#7m-*#<9jV^v6G@rsCuK zs}~mucs&U*UsxC$uYs#;#9>?Sm|TKaI5Kc%jN;UfyJ%6Ub{n$G$29H}@%syf(nLOv z)29o@=amQE_FR;@I}R6&c=!-G^geV=w|ak;Q`))r%Zj&LI(Brz8u^n{B>yOtTi$y* zf3V29*p$7l`yTgSo@*guS`(~ACi;G^M3APpc#mmMe03Qpd1!qb`QT^%m8w#Z@Mm5| ztRb1PgF>y??>98sn0E|fTlh_HJP!7{B@(PHG4T-iU%S z{a{|+)qAR^&v4BFypVIV@-)w!WU#w8p1^eU=#{#zH*fxsRXx~&QhR2-?|wk+I$3q6 zXHFN*f}tWg%ipUh$QiLlVw+|xEIq#x-G)gho-7sa&k1L^=D}!HR^p-kCYQ?Z{ zZk6N%aBoJ~F2Es^2UJEs)SFN!*GXV_s#eU^dxzF%CEAxtjqcEck-K7u@#s^h*rzDc7Bd4Ofmz53 z?qx91*sSr_+KBwJvVH)jw6wH(!)%l0hcM;aVA>}oZuh+rUuoWyy>!h)CO7Y#a+qA> z`{{*2BGIkku*aw0q2u%4z#V_z@}J;`Ah&Ie??*1yFz|Qq;KBHm6!a0^z-1pC^B1hL$wPGx`pZbw}lGo|fr4uM=akaz~n(eum)w6HNgI7gTm zsM?aKP&7&vae%?fENSoF{YePyyGff*V5cU{6ubPO+QYkQ>y7>V#>yvI;V$5q`?R>p z$jB=N4$t^Mnx~hKClzzr{C~hGS1(S;l4VYDgT=N)^b9n;jgMe@xK(p=DcD2{2@#mP zqi8u@w~CM*pUkU?{BD=GWAkQ;R%MhYInduvveSH}z(XW&DpZ8|XN;+Z(8i8*L~YJx zA}J+XZ-94+Xn6y@VYccQk@ln?;SlHW>he$(-HQ) zyjpQn+}eM8AjPMTnK$IryCc-~r`r{|dk@0?#r}-TNi(M_J%8~6{l0PEn**ih zZ()(Lx~6w$Ummg0osOI+0N54t;e$TFLm+J@IGDG{occbNYiML7^`QMM)~c#^2=a!< z4_Inf<*3}A1v{*j#;BkTJ<3!}%yIC@U^Zt9ncCD=<~5ZhHVAp82X^cc#Tm|)kdVN{ zR#6|{JnPa6U^sfr9j^n-V^SYXD+}0k2j~%9Sa>HhGn3St6P`UaR74rYwc%}4Ri7f3 z#z*eaKup!_ov00MpWbF?(-Jz^O;ObewujKDU8_Idc~%)vD5tdg!p*UHoHx4-H&@zlAl6L zVj_md5h_A8FhH zKA^pZlAYf{c?{=ko@@a*wcI&?wnOdN!G*XW7QV)0S>O@1Hr89J;qc!9HNbG)1#7jk zBZLi^VwoB(h?@$zEb4c$7}i!ke^LWDAwyuuuiGBq{qJ8otJ$u-4i7hSbHhS8%e!ii zpo+1c5L3zcqtsS_)@Og}%$eN3bN-CC(4QYvIy2azgm}O`n#(>-hsH!#Rn`$w>|$-4B1G z3yi5&_SJizBPdWl<+>a5vn%t{L)|mmnOEh5a4J)&nEpy+J(!_GWUW?M-FPm#7_kFp z5u+xN_}&Og?SXzD)IB_8Nfc>U2YzWZ7|w>63IPj#jcUovI7?e~>MByC{OQ4iJ{fH} z9`4B?16#!Zpd1eLv~$lOvGS~fRQkic#^m!g1+=F0F6u*mz8#H9&f2NzUZ`@?&oxr3 z{^F$nps?Q3$>7^Z3ziP)0M^Lgz0eoF<`f@8si{3ZI50-kX-FKoX2r>swwV%z9h(D_ z3C$RTg-w_hd=4i~64k?Q{7L&n~pM3AjhyjEmeUmoo%Hg#JAKNii8sC-g6(7fpv z?3`V+lu!r{)z|~{hN=Eze?I>RiV?&@I1v}BoC^y9K~a9Mg?4*)_Gf{AIABD!8rI;K zu9?rw%s{61^!%`2Qe`GlL|6niARw!9&RhT319plx9^?pV&%0T9YLe+{UDwMue^QtJ zn50PShBF^wf%zC`3qYWzatF;QHy+bop`dx4`YED3zDc+;&ip7Y#bDavQnifeR(j#!~VWi;>*MOzCX z+5qgwCp3O?sn6f)uUZT+3kBKP)7kcJE1j+UdA+e+h|>!Os)1=2E(Qhwynzrz3&brFFH*j)0Tj?t(Ic>><{J?x^8P{By5?6ap&N2zhmWD?2P z$VdbvI$PV~loSgPB(-9-wAl*4hQQ1!D@Nd)930>d%!?Q5Qj*g9#7%nLll8SO8B!zj z?(TTpl_WeMdtAETsf+@SAyLA%2;?5;`Q99eD%judqR{Ih(!=fyVD$06`DS$ME!nNF-oY~=$e+T3v%F90%2ihXsCnYM7plAJmt)1N z@4ua}s#XoLsWXJ0=u+5ykKDr|C;IYTG`7a$x{~ny{rz*Fj_~%Q_SXfu<$P|BjEwk` zu@$E{IM7~G&GS>y%8>6IK6duqY({`Cw>+XB&{F_P7h;O*EIxhuIqg5tUKv(ND+a-3^wwDk_y?b@0joN;#%W->k#-iLcS-kT5 z(+A|b&53~OjZv4{1GF&!l)Che0h^mu{h%6I(3?4%aef45i3MV=wsp4j^L4+qpH2g4 z7-{%p7GHq}v2Nlcr$))l+7Y|@eAvnYvv>wCfS1ic(`v+pbLy~naAPo!3%Qv21DT3_2Spb_Bzkbcct>|z3?c2B4(a}kKid5r1=H-(oPLw^G z?Ti~t2aHpiZk~D+S3#FD-3l-eqt$TCgZ8(XQZ9pA|D?{kQlzv2)z}@%Zj(PZ=SZ6t zR5l0-s?7x;ibQfw582=5PztQPdi82bA(BqpBxeLH8Tj~=+4xR|o+SAz@C2>*XlQ9` z_eBS>Vk*7u2S~ID zibf0x`4}OD&xc;m1wmbV@Tske-Svk-c^@xE+ zQycn31+||yqmS$%>Xu}oRF7u{PkRa^gD}f4z(p5D9Xg^dx!co19Y}PO3*34+vEOzN zV5>5;u7g9ugZ%~e(YlMa0|NtEdX((>DkCY+8@8IgEJM*fU%pkiOiL*ndVW}o_ZNV0 zaD!P3iKDD;`Q@s1^tTdGcoefKvFuW)?4dDZiH6DUcj1RgJ1bdIG-b+)6XEYN29P}Q zee?Y(I5Jek^jp&LW;}Y8_w4QaWv{7)(7&r$du`{qk-Elag|HBt9jF&IAT>9@5`ZhH zypsTDL8CqTbAMbF8(oeBKa>?b00$O=pw)=Qg|+HWpLD6Ue`KUh8DD)~uMF$l;b>gW1?* zeoC^+ess0B*8bdl`udhE^1NESjZux`9a;xN1{SDV0>tcv;prb z)s%?P7gaEW;MF=yav}5licyP@_m*8q#oe}ntnhoyRzgUGDa2j`e&4QEkozYxT11f8 zO?{xmU2;OPRcrk$@u7FN_T5iUNJ(dAK-Ohs{O#+x@0aWJG?|z@^FP!290mp;=%li8 zMJr876MlpZD$$EN(@&jTG%z!J3sDsy*kMZI`p-8)1F)?2C4Vh{$;=|X|2Fz}FX0P( zU$>Oho{l0EWun4?z3$(CEGvPO@6)PMK1NkSob?h<(oYvpCI~Qtg z0BG~n@cnu{PImOfukSSXiEQUmwWeeN#S6D9GT7$ZAoQ_626zH9Ei0QN!T@>Lb>ee+D2`pfvP-;<02qD|(%v8_V0 zJjag8igQP{Vm8*;72h~hIZS-h5hF=q3ydQZegHYt3zh`t0SfP z%5d>#boSv=`Wzh5I>^3@hF79H0VpGV_bPCnyqZv3Ito59>1rCote%5#0lf|&VLt^P zU=(2(4A$J02|z4h6{YLC07U=_1VAC3q3VS9M#b6-S|u&9GU?N!dfbXEK^h*do_b{M z=9cd4?0ovf2~kZ8>Jo9CsHccY5YY{^r52aF8hNc8NFNfhOmvv<$Pp zTw~#s0!)G1(xPo=HPj+{T&ni=n*Pvi_FSK07>=x;1M-dR$GarrmFfG3k$Ab6CE5J=Hv8~ zV)zu78xE2B3*r=bqP@Mn*8v2%9SgccWv(MvJ2Dh4=jZ2Bq}@g}U5+p^3V}{ltv|JQ ztxLH$Q!R`HI%tklMj)~>bly>_)!TV}TEvG^y9vQ4j>~qBnV6XRhlej|k|t{LgILSF z%F620n6gO(l%V~c|ui(`5PRnyb=L8A$inK>Cx z0%I^dJOMDk-Mg7G@gb%*HW@n`ix|+q0^AlRKmRsAKYw1om4QLbg$ozJUixam!4r?K zz0y0cC?=)@rG14u`xaJ$-)wq{a!4Hj?J#})cm4gw=85pYiwE5B%J6To{2Y>w`l*AU zDa0VoC24FLc@`5|T(e*6K`u~M$QvS>jf&#}s|A99fvXqG$0U81?Wp7-Jv@?P0w4jv zCJ?+6x30b|7reLw8c#K3em*`&0N}(1i;Ig*K?4r4IGXb?!%y9#o>s23x2(pCIssm` z?6GE>hWYZ`SF`tLhvoWkT3%TIGLx^swAhvKXfs4uOe_b6JIqpN2r}aYN}_H{RdIi~ zm|s)IN?HA+Ah9TBXz%u?Pn|}jk-Rrb_rCnz0U(78!6y!^G9fWB7wTAkZ+Mb&`R-HT z6Y&`tMSy4_k3Z_77RdnC1N5+T0qaq{L&D(fK0Q6@JUcrJQR4GHpo^&a>@Z6&=zOO1 zL!}B^TV08BhXqb2WTH%uB{ESxJ*g07+oQvM!O9KI&d!?`5VCQSA9>plc&?4jRtitx zoIwZ5E`fWRf#FOnqy^aY!MKP9yFH1GJ;AT}ziy!{il;`M|1c0 zoATcLi>6yf+0VJ2tlFezU_FN3mB$%t!@F|E=H#G-Z9S$kAN!bnudX-Jj8tG#iaETk zB);7} zD7RXptyL1S*MUZ(4dL*};8hfIt8BmQ+%^6-L(qJYR79c;4P$?$=s;Fl$N68l=i&(hLax@X3aKH`3x*r2tfQs+0bh?0tb^>A6U8?RzZ| zUC%i6)#lsIOm}%bqdhn-4?2RaZtcE4edY{$VwT!ZLA_n%mY4{+QS1LerrsTv5KN!G zCM>$A4hp8$rI?(&{aqO*W>DBB@W>UqjUh<@8ja^p)J6W%BG|)Udd??bnZ<1j^ni#l zqf0Mnj^HUcI#tw{@VU4f{9m76<&+N01Qn7KLR21)KO>fg?1kF~QCSF*^E+{Midho> zq^_#<+UWZ$BVrOhCzLb1EK`SQ;=jrThGW0FUJS<`4O%b#Xm2;L_a+nHOz?8WcvTl6 zpZoLq0Tu*%V7^Bfv+?!hy^Xf)5dVnx1YO#X*X4wnpz8bl{?p!7@$vD~05ky9~Wsi86DFuwf-#J%sZ3e~Il8|)iU2ZezZ+YLmHLs7$IrM^eO(;?~ zlzSMvLj#ShCKEg3_fbu0_Iq3$$LEZFtP}2OmqU0g$}Z^?FBr;hs{L(bkp3@4j3E7Y z^OL`+3*-lHnmS(^{{dMm?Yyuh&Z0@L<`-8s;a949%?dqM_6z#lS(b~8$ z)`FUvaR^JXvJMtqOq8a`;JfMy4DXHbOwH@vJ0tcUJjx+*=AgFGn99mCl_JVFtj>@ycLUM8zpu5r9(E;nA z2f41{hHNmcty&6>BdsI_O}Tyg(QSxgmm0Fl8Xh(S z3JxPc232qWOy$=E7%xVHrw2${%IDc|JrXd1R4m2d9fTscJp9YAe!7$$7IU`yqGrO?3 zc;~K^>+oe;OK6x*N0quFeb5*IRLcViH6d~FK?0J9)l;S!<8U~ry;k8)2t+G8_g?~% zBKrwc)i@MQl_izJ)&Xt^TI-NOW3ez#PtUlI$=4nV1GA(`yTt<06aW_)A^U!shBt1I zbw|TqybzX>8u&*=47iTU0dCf?L@~?U_wO%2rk9m9m#AHj<@;qxZHd}!uv1Pz zX2fyz{!64{bW2tMrPdUnHA7?L_;S~gURPR@jlZUQ1^(L*AU;O7*1@okuSJ8|-8R(H zdYve0?%g;AIK;tORLI2i$1ooMue-E`ky5FEjfJ?upq=?V>Uy7EMGilB?t9_g@vw6s z3olB z`G71_gmyydETmO4xp6b?-ncGRI~?Mb8=pR#_K^c^6et8T{`RZz+}{+^R5`#3uMDX! ztp3%1zoevIOL}Gu8~P6Jx>cR#{PNX*Dm)_?pyCx8TI;#xlcFe4-#jsR_4*&>XY27n zyFE(Z@r6|+v*VM`fK4OnfR!_B$^0T^|09V19n1gs3q4ACZ<38fz*jUjHbRJMr1YW8 zIiRx$Kg`N?2`CFP6az?r((Uav(Zy@)}Z<`@%f2?&)~peG{& zbr$Z7sF|I4qJxyAq#20W3EMr>X=< z@a%zN&oWwJ^)`M8SUW`yj+VOr^$&8xlS6}~0Sp%CXk38$Y;kW)HlTL7k$JE&lo_iS zuwe$$Z^A%*NC^37s>eoDu}$qL#PP!Cy3e}+oNEFi92Ia~l9rg9pt0V%y}G~Ft6j`& z>l{R*4gnQp`GoHj3mNqP23cgr?Px6_do4}{p(k-Z3(rGC%>na{1E;hQjTXj~mzQ_o z0+UgeqZRGcyxbgFY7u^^1khymKSzN_D<6G-Z6e*U}Tvx=^K) z=wLqB!W-fWN;M164V_p4&0F$Jl5M$YTZy#maQF1Ps=d`V?5~r!)+SN!3L0|dXcItc z!Z!&>OJFInK@gB|z#|HQe6c}37%+}z731F8yL%^sAKUoNoQ6pBjwtTyo(-h&s!}QB zk`=|ip0?-#1-<@~!o*E1q0W_J@nM$yag8w4^rI;p3(4JJ07s=bu$;U4MZWxD7f;)y zry1x}EZQ)Oxy%nAWo9k~p?P4TdQnz6q#}_}=TM{!7wagvs1fB_BEb$e5p<6ICQ!*_ zFFCKOaF(``bE)x#^n@d>mSvwX;`9`Pfd1O2$3PGJAV=k?% z3{iSwgAnxO3EA`F27G3d1!zKpFNTj!(b0@V(0Ogf6X`R6f;I&`VW8AI^~WFYuGlyG zw*2fu6+(Vr8Q+G!gf6 zxN4!K4KT$8D^o3Ga&i5J(nQAEBW+w=E#&sr+K-&w-HS}H7CAs>IS)JoQdSmKlY}WH z?bPe(PxlCqzXk8Fp+rEJ0Equ$_`pfJbm7ALZ&zbtVuU3mlK3Kdm2IY4qBo<0klSCs z-lj~64FI)DEEUW4%&j01@G2P(Tt3No)KU}Ah*@OgT!y6m_Ud+*jKFJ^_P6Y@w)J)2 zC;{X_>;wfk8)CP2#vA7%HoP`7?6d@5SyXPdM8gaWGC?sZS+KqM*Q$IL6gI~n$h@N(s|ZVobW|z^UJ}%16+*H|F#?_<2C@c7qME(nh{3@z_Dgao zYMK9%ydJl;=n;a+(M}=(d4nMkA7@X=oB%E>WxfQ8Djk7#kKLtJaGt436B9T-spR}c z=gH}b5PFbKhJtxpl7uO!Xj3Bq>j1=>PJ3G`ptIi(V%>ymWa0+!z&$0G$(vY3#DWbw z7CX~+g_wcsu1Sna=X9@B0XkY!%0w+BAnoln1W=)K)}pSn3$dG6wcig8i1zsj~<<9DJ?ApI#~pifO&U+giFMy zrxRS$0V6^QanOW%1{MY!I+KEOu$H*S3c;ej`JE3-L@8v~B9HM@;(=3)tm zW!n^rhl>+&bg_+6dPcWD#Xb*L9G>VLgtUc_0yz5mr7cbYgQ{zRvIrm%g7~5rFAk$z zw&j$^7A=477!CENRf9et0W=Cgtc+`!G5~wMzcW-1(mq%v@GFPl+6xmmLbg8h7RJY) zav3Xk6C59~wYBwtgY&nu-4)^vLVUab#>hh~kUW#W##~HvNcWwZgMtO|qzP5!ZZv0TFgH-KEX^sUT zPN4g6f!p2~0DG%}m?EXdMdPpg(k1Hmdi?=KR0yhh&`9Y9)KW@9TAC~HCG*6Ay0tZ= z3$6@0a5~zLNT7*SNG`&60^0urd|~*COLN3IpkP$2AzvGs^0|;5q5+67QB9q?qN<-9 zl&zl~sn~tmt|jPsnE+5ooebmkZvkiNKCpyj!6pzqnSK2D(d6dM=LxB)E+D?((1UeB zyP}$dK+9|a!xR>_bI2nK!LB=lT=8iKMc+mtXtimJ0(u#Njlt0o5oI7S3kwSu-u?W- z9E6U(>uf;z{tP)23$N?9ptTGvT_3g+KtbOhC>Otr&9yl4MJ@Fjkzj z`}mx7vEuCPPv?=pJ*U1lOC!1*AayK=B`#mzoF8Pj4V>hD2+r&Dhe8j+$Ab_mqx@Ag zUq1G$uK)Li;om0sw+Vm>Z|UAFQnh>fzW`K= BPO$(0 literal 13848 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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-3-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-3-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4d6535c2f87406ae65bb6a7bb28da81ae0052f GIT binary patch literal 7178 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 Al>h($ literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-4-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-4-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..ff86455f233c0c501a31e61deb5b472d268f1f3b GIT binary patch literal 12909 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 MU7b4xw;#RwH)Tns1^@s6 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-5-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-5-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..219f538773b5f3cc6eec521a3ed5ef2d94c20ab2 GIT binary patch literal 9030 zcmeHtX;_oz+AaOu>bHw%qkxntEmTpNN@X+1qCJNpX@IwDE!BYg2ESJ|9JpBv-)QU8~phq?vm4w3blip;K(-$ z&h~bflS??WDQO-%r9xSf_mBVi```X{DEljWRR`6Y3pKsNs#hwqZ(ksVtlnz+rzBy` z(y%F~AY!)Ca4?McV|0y1@czQ#pydfq!&5cWmA{prx{~MrkDn%67WSmScDFcw_l45J zZ8#2l5PQ&Ssmv8_At*xyvS?aOC*h1}m(9@x5SYw9u<(B?+zpfeaLz-uHD~ zKNh%_a@{my@|!Zh*Jq4Mt@S)(Ce-wEM`DGtm@eB*#iH?4zf!@HUhpc%g0y-<5ibd{K?s-G_;*1zZ070-muGSR zND+^<)y2Qjr@cm|H?i2BgdBIHHl1nc_}Muhq2tUhw9wwUc-WG=;Eu1XJd>V6>Rm<; z|1KPF?UW*9M3u&o(Cc$&6Y97@@(P+ z(6gY3#WK1&t)=06IA&ljM;Yt4y|SD*fT&An=L&BShJ}Km#O$ZCrIqBAU6F8ZshyOs zn2W84N*JQ{BAmB78G|{Ws@X=}WME{@omNW(-T-dzhbslm*yoCiOVY{+7s{B&1yypX z3>jWx!7o@&+50V7l$XWJUiVj)nXK@_W}dy5cBeYi*(3hi>B3LTb6u$X{CxX+hqZ#= z{_F1$h)GCa{_<=`QezlRr#*hwD30Ebv$eg_5~I~Jo9NpZO*fxzj@Ed1(&fHh zS+Y(lf9>lNCr%(qDqaglwrRqR)`bTb<{NO5D9waXHDdb$;NP$RYza{lh2tO7${@~3-H?IUpEuQC29DJdn1)8VxG5b83$CDt!# zHi5U|nsH7?$2@BCtI!gpqh|aEJ6fejl_h@?ff#w=g4*diV(;PMVX|A{MOtC(1}(5W z0tJuq7??834z}F022ZEqa=Z5tzfxT4QiDL`zghZ)l=r$)voDL9GH+Jkj^8o7&wO41 zB_#L`kBB-)f>|5^X|XU68=YN9+0=-^jxXUrKi_h#u7OqFkR^8N4O6eEkk=P$GFj|q z``twjulRUD59GN61cFRk@AOk!E3E-g8)s&CBltyf0}R z8@$Sle&m5%YKV0b&)+&_6y|3 z(Wv#ClNU?WSS%KAlWI)K(kla1aBy%iN!eWRZi(^VTeKi%LH9l$NUCX>Q+Ku5x!k$&R?#GVPx#mdmB`(6uegXgsGa;xKpKyvW}SS! zBxx=MYKaSach{lfVrej~+yM}Gj+$+H+AqcC(Jd2CFBBTNUB0Yr+}*l0xH;aevq zz#Q`m#AIeZIU7p;^X5K5*jfj-T|ZsAg`yM+gFFD;sdL03&L>x3F(5jM3y|Z(p4pY1hb!4_mM}-RuA2e9Joo$(JzE zZnzRYU4@D&lKjkNyEFu5o%Dw}1>6k%^$+-7`e}P9&OYiAJ4pO;k_k;?B;>u9-3CRE-~nK z>xOWUS9m9~JebOtpjhxX%`tPz?y*FZixU2$j%wfbk7Hr9$^>gkZ;zVfPB(Jk2@d0f zos->UcFJ0dLOePGPS$&i7Wdk_{sX!XCHW;4?}!QJuT8nRxj_tln{#xrGrLE7KRi8; z4;?C#SB#>Spu;TPwktgPJgI_RCekB!LV|bE)haIqtSO^du}9E?#TE2NKisa5(5hU~LX zr^c}Qt-n_!jmKhE2;Ijrb_f5MyguSJuYo(Aec|NL6w!-&j4L2^o59T%s%Y)!EBwbF z5&R&L1;$xg^cIR45q)xS7h60}!v#VKwz5KhBe9ejF@$ivPa+UCx1@Xam${SLXHPOz zG^i6je8XbFZo;__YaY**SS(U(hM1nb{PbQqf|6^Jyzvp#_qdME{FBhKtZ&cXwO<-6 zl~cX+Jq3u7QO&o2}@0&R$z zZhSQ@T$jj5#{)I@9XOQf?rLK;-4Y80MDxD1dkeYK8$Cf@8j@Ty)sOLEvZToj;bYiV zo!agQEY7&YEc}X^uX)VN#I^yAaVNW=2KiolXqY>^E6>;)9(&#D0DM4

9>y|LV#1 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 Ov%^LE+8=+t^}hh{W^lRy literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-6-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-6-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..29a81d39157d6c96bac575f3b8f75d274b2918ef GIT binary patch literal 42182 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

-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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-7-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-7-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..ec87a2f11a31e2673033dcc59019da409d2eda59 GIT binary patch literal 36225 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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-8-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-8-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9fa806b95fe9b8c2b99fa6333161940665ec9e GIT binary patch literal 15009 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 RxaCc{T1Mv!&t1CnzW`J;`u_j` literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-9-1-snap.png b/integration/tests/__image_snapshots__/heatmap-stories-test-ts-heatmap-stories-time-snap-with-dataset-9-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..97beb19e298c6905ad9251a38fbad68266a54fc8 GIT binary patch literal 16739 zcmeIacUaR|*DkE%ql^Wac@$7k7z-+0x*$bm0O`Fq5vid_C$#7|qEZDZ(xrtCQbR{& zC?+7%I}stF6G>x@AH=PoO8bOUf(&_cU|B6kHPS(d#}CLec$WeywK57VLrxj z?7)Eo%&K>P)jM$DhlK+N4m$pL1io2(XSW0&2fg%E?i?unbPj&=%K_D2ZyWfhE>8v; z7}|Z^Ut{?(?D@Ut&+{Ff9nGfrsy*vpYxX}#vTKWox7S!SNOrOz8bp~U=}GT#C|2rG zlF_Ci=P!FT{_-mEgl^1_(Vd#N{x<75OWdPRhrJl3nY{Sp3cjq`;`pbI;7^og`a8<> z!vj*S*H274B#GLEZLUrhJwC)_Mnnvk8V;9Q`V1Nxn-as>1pChWO=SA6jF}Q+Vq!SN z>?4ALf;3DG4dbm)bRW$W$!_vUW20<|N%` zaJ8;O6kqRC#3A9Flj2tYQPdjamL}u3TAVHyXh!4?+0JxpSdo1C`|l=1_ZE5$7i!mo zy0eok+In5ww*5rYdY^hi2XSr=vCx;xp%Bt&m!6zlSYnQG9>~{CKn4Xho;&$$wQ0)= z7c^euDtbZ@GvOI-w>RpLQK0zjxS=HOF zJnf9qMC*`IQGPzYz7J22Z!A~#m=T?voWfqb=$-G)7Nq?C``>u3UR`RYtyXsVEstb| zg&kw&5bqS--=*{n*0`E)tc(wfTGx9QxHYaR`z#K86h&=K`fYqxWa0hgmv^EW(q8C` z7cb6EPupPC)YQaLdqJA%vZLgYh=>!eV^ylt)6)smOvPt$uV3d+w>~o`mY0`%%A|3~ z`oFbn_LxzwcAGRCwhAn;{@tbSxc$vt1AT_ zGwtZE1#jo6Mr6Pqbxtt48;k9m%RrT0P51vGs;!}6aOci%TtVM%<79<|w3L*TcIYIO zdlHIDNF=YV^*%ayNPuEkWK>{WX0tBS0h4qb$ zjL;Z-h`Bymqg+<<=1udZp_2ZQa$7-4PR`{Oe2cY>jZFd-<~A-RrAT3KEjj_Ip%IZR zfk1P*)xHVo z0kJqxkkB#Y%RPc|�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 literal 0 HcmV?d00001 diff --git a/integration/tests/heatmap_stories.test.ts b/integration/tests/heatmap_stories.test.ts index aa5251825d..16ac0add18 100644 --- a/integration/tests/heatmap_stories.test.ts +++ b/integration/tests/heatmap_stories.test.ts @@ -26,4 +26,11 @@ describe('Heatmap stories', () => { 'http://localhost:9001/?path=/story/heatmap-alpha--categorical&knob-use global min fontSize_labels=false', ); }); + + it.each([[2], [3], [4], [5], [6], [7], [8], [9]])('time snap with dataset %i', async (dataset) => { + await page.setViewport({ width: 785, height: 600 }); + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/heatmap-alpha--time-snap&globals=theme:light&knob-dataset=${dataset}`, + ); + }); }); diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts index 562bef3f9c..ab3df97dd7 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts @@ -70,7 +70,10 @@ export const getHeatmapTableSelector = createCustomCachedSelector( const [customMin, customMax] = !Array.isArray(xDomain) ? [xDomain?.min ?? NaN, xDomain?.max ?? NaN] : [NaN, NaN]; const [min, max] = extent([xDataMin, customMin, customMax, dataMaxExtended]); resultData.xNumericExtent = [min ?? NaN, max ?? NaN]; - resultData.xValues = isFiniteNumber(min) && isFiniteNumber(max) ? timeRange(min, max, spec.xScale.interval) : []; + resultData.xValues = + isFiniteNumber(min) && isFiniteNumber(max) + ? timeRange(min, max, spec.xScale.interval, spec.xScale.timeZone) + : []; } else if (spec.xScale.type === ScaleType.Ordinal) { resultData.xValues.sort(getPredicateFn(xSortPredicate)); } diff --git a/packages/charts/src/utils/chrono/elasticsearch.ts b/packages/charts/src/utils/chrono/elasticsearch.ts index 44205df138..a5c44e199e 100644 --- a/packages/charts/src/utils/chrono/elasticsearch.ts +++ b/packages/charts/src/utils/chrono/elasticsearch.ts @@ -75,7 +75,7 @@ export function snapDateToESInterval( date: number | Date, interval: ESCalendarInterval | ESFixedInterval, snapTo: 'start' | 'end', - timeZone?: string, + timeZone: string, ): UnixTimestamp { return isCalendarInterval(interval) ? esCalendarIntervalSnap(date, interval, snapTo, timeZone) @@ -101,7 +101,7 @@ function esFixedIntervalSnap( date: number | Date, interval: ESFixedInterval, snapTo: 'start' | 'end', - timeZone?: string, + timeZone: string, ): UnixTimestamp { const unitMultiplier = interval.value * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit]; const unixTimestamp = getUnixTimestamp(date, timeZone); @@ -115,14 +115,14 @@ export function timeRange( from: number, to: number, interval: ESCalendarInterval | ESFixedInterval, - timeZone?: string, + timeZone: string, ): number[] { return interval.type === 'fixed' ? fixedTimeRange(from, to, interval, timeZone) : calendarTimeRange(from, to, interval, timeZone); } -function calendarTimeRange(from: number, to: number, interval: ESCalendarInterval, timeZone?: string): number[] { +function calendarTimeRange(from: number, to: number, interval: ESCalendarInterval, timeZone: string): number[] { const snappedFrom = snapDateToESInterval(from, interval, 'start', timeZone); const snappedTo = snapDateToESInterval(to, interval, 'start', timeZone); const values: number[] = [snappedFrom]; @@ -134,7 +134,7 @@ function calendarTimeRange(from: number, to: number, interval: ESCalendarInterva return values; } -function fixedTimeRange(from: number, to: number, interval: ESFixedInterval, timeZone?: string): number[] { +function fixedTimeRange(from: number, to: number, interval: ESFixedInterval, timeZone: string): number[] { const snappedFrom = snapDateToESInterval(from, interval, 'start', timeZone); const snappedTo = snapDateToESInterval(to, interval, 'start', timeZone); const utcTo = localToUTC(snappedTo, timeZone); @@ -149,15 +149,15 @@ function fixedTimeRange(from: number, to: number, interval: ESFixedInterval, tim } /** @internal */ -export function addIntervalToTime(time: number, interval: ESCalendarInterval | ESFixedInterval, timeZone?: string) { +export function addIntervalToTime(time: number, interval: ESCalendarInterval | ESFixedInterval, timeZone: string) { return interval.type === 'fixed' ? utcToLocal(localToUTC(time, timeZone) + interval.value * ES_FIXED_INTERVAL_UNIT_TO_BASE[interval.unit], timeZone) : addTime(time, timeZone, esCalendarIntervalToChronoInterval[interval.unit], interval.value); } -function utcToLocal(time: number, timeZone?: string) { +function utcToLocal(time: number, timeZone: string) { return time - getUTCOffset(time, timeZone) * 60 * 1000; } -function localToUTC(time: number, timeZone?: string) { +function localToUTC(time: number, timeZone: string) { return time + getUTCOffset(time, timeZone) * 60 * 1000; } diff --git a/storybook/stories/heatmap/4_test_time_snap.story.tsx b/storybook/stories/heatmap/4_test_time_snap.story.tsx index 9cab374497..55389e4b46 100644 --- a/storybook/stories/heatmap/4_test_time_snap.story.tsx +++ b/storybook/stories/heatmap/4_test_time_snap.story.tsx @@ -29,7 +29,7 @@ import { const datasets = [DATA_1, DATA_2, DATA_3, DATA_4, DATA_5, DATA_6, DATA_7, DATA_8, DATA_9]; export const Example = () => { - const datasetIndex = select('dataset', [1, 2, 3, 4, 5, 6, 7, 8, 9], 3) - 1; + const datasetIndex = select('dataset', [1, 2, 3, 4, 5, 6, 7, 8, 9], 1) - 1; const dataset = datasets[datasetIndex]; const [min = 0, max = 0] = extent(dataset.data, (d) => d.value); const colors = ['#ca0020', '#f4a582', '#cecece', '#92c5de', '#0571b0']; From 7a0d7db112773fa450ecb4c9d394979dc273b5b6 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 5 Nov 2021 18:22:26 +0100 Subject: [PATCH 10/16] Fix the brush to cover gte:start to lt:end --- .../state/selectors/get_brushed_highlighted_shapes.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts index d91635f767..900320dfc1 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts @@ -137,7 +137,7 @@ describe('Temporal heatmap brush', () => { const brushEvent = onBrushEndMock.mock.calls[0][0]; expect(brushEvent.cells).toHaveLength(9); // it covers from the beginning of the cell to the end of the next cell - expect(brushEvent.x).toEqual([start.toMillis(), start.plus({ days: 2 }).toMillis()]); + expect(brushEvent.x).toEqual([start.toMillis(), start.plus({ days: 3 }).toMillis()]); expect(brushEvent.y).toEqual(['ya', 'yb', 'yc']); }); it('should brush on the x scale + minInterval on a single cell', () => { From 40578684686eca57b23ed6e865a6eb8d7a33dc2d Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 5 Nov 2021 19:00:25 +0100 Subject: [PATCH 11/16] Fix linting errors --- .../selectors/get_x_axis_right_overflow.ts | 2 +- .../data_samples/test_anomaly_swim_lane.ts | 721 ------------------ .../data_samples/test_dataset_heatmap.ts | 4 +- storybook/stories/heatmap/1_basic.story.tsx | 1 - 4 files changed, 3 insertions(+), 725 deletions(-) delete mode 100644 packages/charts/src/utils/data_samples/test_anomaly_swim_lane.ts diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts index 18b7897bfa..b840726ea4 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts @@ -20,7 +20,7 @@ import { getHeatmapTableSelector } from './get_heatmap_table'; */ export const getXAxisRightOverflow = createCustomCachedSelector( [getHeatmapSpecSelector, getHeatmapConfigSelector, getHeatmapTableSelector], - ({ xScale }, { xAxisLabel: { fontSize, fontFamily, padding, formatter, width } }, { xValues, xNumericExtent }) => { + ({ xScale }, { xAxisLabel: { fontSize, fontFamily, padding, formatter, width } }, { xNumericExtent }) => { return xScale.type !== ScaleType.Time ? 0 : typeof width === 'number' diff --git a/packages/charts/src/utils/data_samples/test_anomaly_swim_lane.ts b/packages/charts/src/utils/data_samples/test_anomaly_swim_lane.ts deleted file mode 100644 index 9d1cca39f5..0000000000 --- a/packages/charts/src/utils/data_samples/test_anomaly_swim_lane.ts +++ /dev/null @@ -1,721 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -/** @internal */ -export const SWIM_LANE_DATA = [ - { - laneLabel: 'i-71a7f77b', - time: 1572847200, - value: 0, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572892200, - value: 3, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572894000, - value: 25, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572895800, - value: 50, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572897600, - value: 75, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572899400, - value: 1, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572901200, - value: 2, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572903000, - value: 24, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572904800, - value: 49, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572906600, - value: 74, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572908400, - value: 0.07397995823713518, - }, - { - laneLabel: 'i-71a7f77b', - time: 1572910200, - value: 0.03091943662761636, - }, - { - laneLabel: 'i-5d303091', - time: 1572836400, - value: 0.08552883, - }, - { - laneLabel: 'i-5d303091', - time: 1572883200, - value: 93.72707, - }, - { - laneLabel: 'i-5d303091', - time: 1572885000, - value: 50.42717, - }, - { - laneLabel: 'i-5d303091', - time: 1572910200, - value: 2.397241548271217, - }, - { - laneLabel: 'i-9f07c700', - time: 1572879600, - value: 76.10974, - }, - { - laneLabel: 'i-9f07c700', - time: 1572881400, - value: 90.75613, - }, - { - laneLabel: 'i-9f07c700', - time: 1572883200, - value: 28.016079894074096, - }, - { - laneLabel: 'i-9f07c700', - time: 1572885000, - value: 2.1780847014803517, - }, - { - laneLabel: 'i-9f07c700', - time: 1572899400, - value: 0.02531410357696053, - }, - { - laneLabel: 'i-9f07c700', - time: 1572910200, - value: 2.258382748340588, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572849000, - value: 4.210354, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572892200, - value: 89.6491, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572894000, - value: 21.289199095933952, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572895800, - value: 2.6694704470251565, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572897600, - value: 0.5850535152380327, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572899400, - value: 65.51073, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572901200, - value: 0.792024488699497, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572903000, - value: 0.5615131943374475, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572904800, - value: 0.394169564717292, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572906600, - value: 0.2046931978696015, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572908400, - value: 0.15470219555712722, - }, - { - laneLabel: 'i-d17dcd4c', - time: 1572910200, - value: 0.11787869182904363, - }, - { - laneLabel: 'i-37fbfb39', - time: 1572883200, - value: 83.92723, - }, - { - laneLabel: 'i-37fbfb39', - time: 1572885000, - value: 21.49062, - }, - { - laneLabel: 'i-37fbfb39', - time: 1572910200, - value: 0.5619960991147903, - }, - { - laneLabel: 'i-b118880c', - time: 1572847200, - value: 0.7038798, - }, - { - laneLabel: 'i-b118880c', - time: 1572849000, - value: 8.885096, - }, - { - laneLabel: 'i-b118880c', - time: 1572892200, - value: 81.92052, - }, - { - laneLabel: 'i-b118880c', - time: 1572894000, - value: 6.385433818669964, - }, - { - laneLabel: 'i-b118880c', - time: 1572895800, - value: 0.7529454579485226, - }, - { - laneLabel: 'i-b118880c', - time: 1572897600, - value: 0.16135425990161706, - }, - { - laneLabel: 'i-b118880c', - time: 1572899400, - value: 32.23389, - }, - { - laneLabel: 'i-b118880c', - time: 1572901200, - value: 0.7578572100943552, - }, - { - laneLabel: 'i-b118880c', - time: 1572903000, - value: 0.6111162033658646, - }, - { - laneLabel: 'i-b118880c', - time: 1572904800, - value: 0.443324186956941, - }, - { - laneLabel: 'i-b118880c', - time: 1572906600, - value: 0.3075144354570065, - }, - { - laneLabel: 'i-b118880c', - time: 1572908400, - value: 0.18905638316915416, - }, - { - laneLabel: 'i-b118880c', - time: 1572910200, - value: 0.15234682243112949, - }, - { - laneLabel: 'i-66578749', - time: 1572881400, - value: 60.28918, - }, - { - laneLabel: 'i-66578749', - time: 1572883200, - value: 67.31324, - }, - { - laneLabel: 'i-66578749', - time: 1572885000, - value: 81.34977, - }, - { - laneLabel: 'i-66578749', - time: 1572892200, - value: 48.25439, - }, - { - laneLabel: 'i-66578749', - time: 1572894000, - value: 31.06416, - }, - { - laneLabel: 'i-66578749', - time: 1572895800, - value: 3.0462498034282, - }, - { - laneLabel: 'i-66578749', - time: 1572897600, - value: 0.23590009859709954, - }, - { - laneLabel: 'i-66578749', - time: 1572899400, - value: 59.04865, - }, - { - laneLabel: 'i-66578749', - time: 1572901200, - value: 0.9189229698167014, - }, - { - laneLabel: 'i-66578749', - time: 1572903000, - value: 0.3479760519757592, - }, - { - laneLabel: 'i-66578749', - time: 1572904800, - value: 0.09983690866310621, - }, - { - laneLabel: 'i-66578749', - time: 1572906600, - value: 0.026896391677229674, - }, - { - laneLabel: 'i-5d302081', - time: 1572883200, - value: 79.62794, - }, - { - laneLabel: 'i-5d302081', - time: 1572885000, - value: 38.70934, - }, - { - laneLabel: 'i-5d302081', - time: 1572910200, - value: 2.3953009901171605, - }, - { - laneLabel: 'i-ef74d410', - time: 1572849000, - value: 0.1538905, - }, - { - laneLabel: 'i-ef74d410', - time: 1572881400, - value: 77.86751, - }, - { - laneLabel: 'i-ef74d410', - time: 1572883200, - value: 7.1111139045789935, - }, - { - laneLabel: 'i-ef74d410', - time: 1572885000, - value: 0.07120867159413205, - }, - { - laneLabel: 'i-ef74d410', - time: 1572892200, - value: 0.46005659357549517, - }, - { - laneLabel: 'i-ef74d410', - time: 1572899400, - value: 0.38022323217471177, - }, - { - laneLabel: 'i-ef74d410', - time: 1572901200, - value: 0.05279469228246696, - }, - { - laneLabel: 'i-ef74d410', - time: 1572903000, - value: 0.04307715617784296, - }, - { - laneLabel: 'i-3b3565e0', - time: 1572881400, - value: 49.34176, - }, - { - laneLabel: 'i-3b3565e0', - time: 1572883200, - value: 74.35002, - }, - { - laneLabel: 'i-3b3565e0', - time: 1572885000, - value: 70.82227, - }, - { - laneLabel: 'i-3b3565e0', - time: 1572899400, - value: 1.129179725764338, - }, - { - laneLabel: 'i-3b3565e0', - time: 1572901200, - value: 0.08944716315823782, - }, - { - laneLabel: 'i-3b3565e0', - time: 1572903000, - value: 0.025215653478830508, - }, - { - laneLabel: 'i-7db7c747', - time: 1572881400, - value: 56.8998, - }, - { - laneLabel: 'i-7db7c747', - time: 1572883200, - value: 34.59895, - }, - { - laneLabel: 'i-7db7c747', - time: 1572885000, - value: 69.07187, - }, - { - laneLabel: 'i-7db7c747', - time: 1572899400, - value: 20.04246, - }, - { - laneLabel: 'i-7db7c747', - time: 1572901200, - value: 0.501246678069153, - }, - { - laneLabel: 'i-7db7c747', - time: 1572903000, - value: 0.10228357345625516, - }, - { - laneLabel: 'i-8270d519', - time: 1572858000, - value: 23.41472, - }, - { - laneLabel: 'i-8270d519', - time: 1572870600, - value: 0.09778774, - }, - { - laneLabel: 'i-8270d519', - time: 1572881400, - value: 57.96897, - }, - { - laneLabel: 'i-8270d519', - time: 1572883200, - value: 63.73998, - }, - { - laneLabel: 'i-8270d519', - time: 1572885000, - value: 45.19735, - }, - { - laneLabel: 'i-8270d519', - time: 1572892200, - value: 2.166846374797418, - }, - { - laneLabel: 'i-8270d519', - time: 1572894000, - value: 0.2283247569954898, - }, - { - laneLabel: 'i-8270d519', - time: 1572899400, - value: 42.24531, - }, - { - laneLabel: 'i-8270d519', - time: 1572901200, - value: 0.49207037746175214, - }, - { - laneLabel: 'i-8270d519', - time: 1572903000, - value: 0.3243143048875506, - }, - { - laneLabel: 'i-8270d519', - time: 1572904800, - value: 0.10024450293348822, - }, - { - laneLabel: 'i-8270d519', - time: 1572906600, - value: 0.033965805201251434, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572847200, - value: 0.1867262, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572849000, - value: 11.47219, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572892200, - value: 53.59314, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572894000, - value: 15.91959, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572895800, - value: 0.5736916311300446, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572897600, - value: 29.28071, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572899400, - value: 25.1765, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572901200, - value: 1.4671989108080628, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572903000, - value: 0.8367316591855911, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572904800, - value: 0.48490204846685775, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572906600, - value: 0.24413767062868427, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572908400, - value: 0.17736807671463703, - }, - { - laneLabel: 'i-4fefbf6c', - time: 1572910200, - value: 0.10326196476266834, - }, - { - laneLabel: 'i-16fd8d2a', - time: 1572859800, - value: 33.42309, - }, - { - laneLabel: 'i-16fd8d2a', - time: 1572861600, - value: 47.17204, - }, - { - laneLabel: 'i-16fd8d2a', - time: 1572863400, - value: 0.16179846422070132, - }, - { - laneLabel: 'i-ca80c01a', - time: 1572847200, - value: 0.6692097, - }, - { - laneLabel: 'i-ca80c01a', - time: 1572870600, - value: 44.60156, - }, - { - laneLabel: 'i-ca80c01a', - time: 1572883200, - value: 26.06775, - }, - { - laneLabel: 'i-ca80c01a', - time: 1572885000, - value: 0.24539550844649843, - }, - { - laneLabel: 'i-ca80c01a', - time: 1572910200, - value: 0.09130230719255052, - }, - { - laneLabel: 'i-4a90d021', - time: 1572883200, - value: 43.41428, - }, - { - laneLabel: 'i-4a90d021', - time: 1572885000, - value: 20.30829, - }, - { - laneLabel: 'i-4a90d021', - time: 1572910200, - value: 20.706159141229445, - }, - { - laneLabel: 'i-4ff414ac', - time: 1572883200, - value: 42.82781, - }, - { - laneLabel: 'i-4ff414ac', - time: 1572885000, - value: 3.643815188524499, - }, - { - laneLabel: 'i-4ff414ac', - time: 1572910200, - value: 7.987421742621203, - }, - { - laneLabel: 'i-850643a7', - time: 1572870600, - value: 37.51045, - }, - { - laneLabel: 'i-850643a7', - time: 1572904800, - value: 0.08720035850172568, - }, - { - laneLabel: 'i-c961f137', - time: 1572859800, - value: 0.7612613, - }, - { - laneLabel: 'i-c961f137', - time: 1572861600, - value: 36.94459, - }, - { - laneLabel: 'i-c961f137', - time: 1572863400, - value: 3.530620723871948, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572874200, - value: 3.468401, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572876000, - value: 15.87705, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572877800, - value: 21.19452, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572879600, - value: 22.534, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572881400, - value: 30.46893, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572883200, - value: 9.532251, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572885000, - value: 6.127118137471535, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572892200, - value: 0.13956047806108005, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572894000, - value: 0.11986169822285726, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572899400, - value: 4.098007780030352, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572901200, - value: 0.6927671145991932, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572903000, - value: 0.2113142229906149, - }, - { - laneLabel: 'i-7cdbab5b', - time: 1572904800, - value: 0.0823203266441151, - }, -]; diff --git a/packages/charts/src/utils/data_samples/test_dataset_heatmap.ts b/packages/charts/src/utils/data_samples/test_dataset_heatmap.ts index 92c0411614..9aeeb021ff 100644 --- a/packages/charts/src/utils/data_samples/test_dataset_heatmap.ts +++ b/packages/charts/src/utils/data_samples/test_dataset_heatmap.ts @@ -8,7 +8,7 @@ import { DateTime } from 'luxon'; -import { HeatmapConfig } from '../..'; +import { Config } from '../../chart_types/heatmap/layout/types/config_types'; import { ESCalendarInterval, ESFixedInterval } from '../chrono/elasticsearch'; type HeatmapDataSets = { @@ -16,7 +16,7 @@ type HeatmapDataSets = { timeZone?: string; data: Array<{ x: number; y: string; value: number }>; interval: ESFixedInterval | ESCalendarInterval; - xFormatter?: HeatmapConfig['xAxisLabel']['formatter']; + xFormatter?: Config['xAxisLabel']['formatter']; }; /** @internal */ diff --git a/storybook/stories/heatmap/1_basic.story.tsx b/storybook/stories/heatmap/1_basic.story.tsx index c1bb7983e1..3b5af32f58 100644 --- a/storybook/stories/heatmap/1_basic.story.tsx +++ b/storybook/stories/heatmap/1_basic.story.tsx @@ -24,7 +24,6 @@ import { ElementClickListener, } from '@elastic/charts'; import { Config } from '@elastic/charts/src/chart_types/heatmap/layout/types/config_types'; -import { SWIM_LANE_DATA } from '@elastic/charts/src/utils/data_samples/test_anomaly_swim_lane'; import { DATA_6 } from '../../../packages/charts/src/utils/data_samples/test_dataset_heatmap'; import { useBaseTheme } from '../../use_base_theme'; From f623e80e4355cf0aae5151cf3853b0f949989d47 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 8 Nov 2021 10:05:21 +0100 Subject: [PATCH 12/16] Use UTC formatting on heatmap time story --- ...pha-time-visually-looks-correct-1-snap.png | Bin 14052 -> 13848 bytes storybook/stories/heatmap/3_time.story.tsx | 10 ++++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-heatmap-alpha-time-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-heatmap-alpha-time-visually-looks-correct-1-snap.png index 9b79b071695576fc0ddfc450841b981c24cb2e82..b09461c6a2330f42c430cdc23e2b1b86267a30b3 100644 GIT binary patch literal 13848 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 BPO$(0 diff --git a/storybook/stories/heatmap/3_time.story.tsx b/storybook/stories/heatmap/3_time.story.tsx index 3dfc3c8df2..7ec65dfdf2 100644 --- a/storybook/stories/heatmap/3_time.story.tsx +++ b/storybook/stories/heatmap/3_time.story.tsx @@ -14,8 +14,8 @@ import { Chart, Heatmap, RecursivePartial, ScaleType, Settings, HeatmapConfig } import { getRandomNumberGenerator } from '@elastic/charts/src/mocks/utils'; const rng = getRandomNumberGenerator(); -const start = DateTime.fromISO('2021-03-27T20:00:00', { zone: 'Europe/Rome' }); -const end = DateTime.fromISO('2021-03-28T11:00:00', { zone: 'Europe/Rome' }); +const start = DateTime.fromISO('2021-03-27T20:00:00', { zone: 'UTC' }); +const end = DateTime.fromISO('2021-03-28T11:00:00', { zone: 'UTC' }); const data = [...new Array(14)].flatMap((d, i) => { return [ [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat A', rng(-5, 5)], @@ -56,7 +56,9 @@ export const Example = () => { }, xAxisLabel: { formatter: (value: string | number) => { - return DateTime.fromMillis(value as number).toFormat('HH:mm:ss', { timeZone: 'UTC' }); + return DateTime.fromMillis(value as number) + .setZone('UTC') + .toFormat('HH:mm:ss'); }, }, }), @@ -116,7 +118,7 @@ export const Example = () => { unit: 'h', value: 1, }, - timeZone: 'Europe/Rome', + timeZone: 'UTC', }} config={config} /> From 59882e35ff24e09c26f9a6a75584691713f33956 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 8 Nov 2021 10:09:07 +0100 Subject: [PATCH 13/16] Simplify story data --- storybook/stories/heatmap/3_time.story.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/storybook/stories/heatmap/3_time.story.tsx b/storybook/stories/heatmap/3_time.story.tsx index 7ec65dfdf2..f9adbc0954 100644 --- a/storybook/stories/heatmap/3_time.story.tsx +++ b/storybook/stories/heatmap/3_time.story.tsx @@ -18,11 +18,11 @@ const start = DateTime.fromISO('2021-03-27T20:00:00', { zone: 'UTC' }); const end = DateTime.fromISO('2021-03-28T11:00:00', { zone: 'UTC' }); const data = [...new Array(14)].flatMap((d, i) => { return [ - [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat A', rng(-5, 5)], - [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat B', rng(-5, 5)], - [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat C', rng(-5, 5)], - [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat D', rng(-5, 5)], - [start.plus({ millisecond: i * 60 * 60 * 1000 }).toMillis(), 'cat E', rng(-5, 5)], + [start.plus({ hour: i }).toMillis(), 'cat A', rng(-5, 5)], + [start.plus({ hour: i }).toMillis(), 'cat B', rng(-5, 5)], + [start.plus({ hour: i }).toMillis(), 'cat C', rng(-5, 5)], + [start.plus({ hour: i }).toMillis(), 'cat D', rng(-5, 5)], + [start.plus({ hour: i }).toMillis(), 'cat E', rng(-5, 5)], ]; }); From 0eb451aef3ee23cb1525c5b23e48103d9d6ae122 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 8 Nov 2021 17:41:38 +0100 Subject: [PATCH 14/16] Better types for heatmap scales --- packages/charts/api/charts.api.md | 44 +++++---- .../heatmap/layout/config/config.ts | 2 + .../heatmap/layout/types/config_types.ts | 1 + .../heatmap/layout/viewmodel/viewmodel.ts | 97 +++++++++++-------- .../src/chart_types/heatmap/specs/heatmap.ts | 22 +++-- .../get_brushed_highlighted_shapes.test.ts | 3 +- .../state/selectors/get_heatmap_table.ts | 22 ++--- .../selectors/get_x_axis_right_overflow.ts | 4 +- packages/charts/src/chart_types/specs.ts | 2 +- storybook/stories/heatmap/1_basic.story.tsx | 3 +- storybook/stories/heatmap/3_time.story.tsx | 2 +- .../heatmap/4_test_time_snap.story.tsx | 2 +- 12 files changed, 119 insertions(+), 85 deletions(-) diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index 9873fb9ab1..2c141f7d4a 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -1024,6 +1024,8 @@ export interface HeatmapConfig { // (undocumented) maxRowHeight: Pixels; // (undocumented) + timeZone: string; + // (undocumented) width: Pixels; // Warning: (ae-forgotten-export) The symbol "Font" needs to be exported by the entry point index.d.ts // @@ -1060,12 +1062,6 @@ export interface HeatmapConfig { // @public (undocumented) export type HeatmapElementEvent = [Cell, SeriesIdentifier]; -// @alpha (undocumented) -export interface HeatmapNonTimeScale { - // (undocumented) - type: typeof ScaleType.Ordinal | typeof ScaleType.Linear; -} - // @alpha (undocumented) export interface HeatmapSpec extends Spec { // (undocumented) @@ -1092,7 +1088,7 @@ export interface HeatmapSpec extends Spec { // (undocumented) xAccessor: Accessor | AccessorFn; // (undocumented) - xScale: HeatmapTimeScale | HeatmapNonTimeScale; + xScale: RasterTimeScale | OrdinalScale | LinearScale; // (undocumented) xSortPredicate: Predicate; // (undocumented) @@ -1101,16 +1097,6 @@ export interface HeatmapSpec extends Spec { ySortPredicate: Predicate; } -// @alpha (undocumented) -export interface HeatmapTimeScale { - // (undocumented) - interval: ESCalendarInterval | ESFixedInterval; - // (undocumented) - timeZone: string; - // (undocumented) - type: typeof ScaleType.Time; -} - // @public export const HIERARCHY_ROOT_KEY: Key; @@ -1340,6 +1326,12 @@ export interface LineAnnotationStyle { line: StrokeStyle & Opacity & Partial; } +// @public (undocumented) +export interface LinearScale { + // (undocumented) + type: typeof ScaleType.Linear; +} + // Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts // @@ -1442,6 +1434,12 @@ export interface OrderBy { // @public (undocumented) export type OrdinalDomain = (number | string)[]; +// @public (undocumented) +export interface OrdinalScale { + // (undocumented) + type: typeof ScaleType.Ordinal; +} + // @public (undocumented) export type OutOfRoomCallback = (wordCount: number, renderedWordCount: number, renderedWords: string[]) => void; @@ -1667,6 +1665,12 @@ export type ProjectedValues = { // @public export type ProjectionClickListener = (values: ProjectedValues) => void; +// @public (undocumented) +export interface RasterTimeScale extends TimeScale { + // (undocumented) + interval: ESCalendarInterval | ESFixedInterval; +} + // @public export type Ratio = number; @@ -2186,6 +2190,12 @@ export type TickStyle = StrokeStyle & Visible & { // @public (undocumented) export function timeFormatter(format: string): TickFormatter; +// @public (undocumented) +export interface TimeScale { + // (undocumented) + type: typeof ScaleType.Time; +} + // @public export function toEntries, S>(array: T[], accessor: keyof T, staticValue: S): Record; diff --git a/packages/charts/src/chart_types/heatmap/layout/config/config.ts b/packages/charts/src/chart_types/heatmap/layout/config/config.ts index 7cf6a33580..0ef5278d7c 100644 --- a/packages/charts/src/chart_types/heatmap/layout/config/config.ts +++ b/packages/charts/src/chart_types/heatmap/layout/config/config.ts @@ -33,6 +33,8 @@ export const config: Config = { fill: 'gray', }, + timeZone: 'UTC', + xAxisLabel: { name: 'X Value', visible: true, diff --git a/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts b/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts index f6c6e21a1c..5053603bb0 100644 --- a/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts +++ b/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts @@ -89,4 +89,5 @@ export interface Config { }; }; maxLegendHeight?: number; + timeZone: string; } diff --git a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts index 59e81518cb..372a84ad09 100644 --- a/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts +++ b/packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts @@ -7,7 +7,7 @@ */ import { bisectLeft } from 'd3-array'; -import { scaleBand, scaleQuantize } from 'd3-scale'; +import { ScaleBand, scaleBand, scaleQuantize } from 'd3-scale'; import { colorToRgba } from '../../../../common/color_library_wrappers'; import { fillTextColor } from '../../../../common/fill_text_color'; @@ -15,7 +15,7 @@ import { Pixels } from '../../../../common/geometry'; import { Box, maximiseFontSize, TextMeasure } from '../../../../common/text_utils'; import { ScaleContinuous } from '../../../../scales'; import { ScaleType } from '../../../../scales/constants'; -import { SettingsSpec } from '../../../../specs'; +import { LinearScale, OrdinalScale, RasterTimeScale, SettingsSpec } from '../../../../specs'; import { withTextMeasure } from '../../../../utils/bbox/canvas_text_bbox_calculator'; import { addIntervalToTime } from '../../../../utils/chrono/elasticsearch'; import { clamp } from '../../../../utils/common'; @@ -23,7 +23,7 @@ import { Dimensions } from '../../../../utils/dimensions'; import { Logger } from '../../../../utils/logger'; import { Theme } from '../../../../utils/themes/theme'; import { PrimitiveValue } from '../../../partition_chart/layout/utils/group_by_rollup'; -import { HeatmapSpec, HeatmapTimeScale } from '../../specs'; +import { HeatmapSpec } from '../../specs'; import { HeatmapTable } from '../../state/selectors/compute_chart_dimensions'; import { ColorScale } from '../../state/selectors/get_color_scale'; import { GridHeightParams } from '../../state/selectors/get_grid_full_height'; @@ -85,7 +85,7 @@ export function shapeViewModel( ): ShapeViewModel { const gridStrokeWidth = config.grid.stroke.width ?? 1; - const { table, yValues, xValues, xNumericExtent } = heatmapTable; + const { table, yValues, xValues } = heatmapTable; // measure the text width of all rows values to get the grid area width const boxedYValues = yValues.map }>((value) => ({ @@ -115,42 +115,8 @@ export function shapeViewModel( const currentGridHeight = cellHeight * pageSize; - const getTextValue = ( - formatter: (v: any, options: any) => string, - scaleCallback: (x: any) => number | undefined | null = xScale, - ) => (value: any): TextBox => { - return { - text: formatter(value, { timeZone: isTimeXScale(spec.xScale) ? spec.xScale.timeZone ?? 'UTC' : 'UTC' }), - value, - ...config.xAxisLabel, - x: chartDimensions.left + (scaleCallback(value) || 0), - y: cellHeight * pageSize + config.xAxisLabel.fontSize / 2 + config.xAxisLabel.padding, - }; - }; - - const timeScale = isTimeXScale(spec.xScale) - ? new ScaleContinuous( - { - type: ScaleType.Time, - domain: xNumericExtent, - range: [0, chartDimensions.width], - nice: false, - }, - { - desiredTickCount: estimatedNonOverlappingTickCount(chartDimensions.width, config.xAxisLabel), - timeZone: spec.xScale.timeZone, - }, - ) - : null; // compute the position of each column label - const textXValues: Array = timeScale - ? timeScale.ticks().map(getTextValue(config.xAxisLabel.formatter, (x: any) => timeScale.scale(x))) - : xValues.map((textBox: any) => { - return { - ...getTextValue(config.xAxisLabel.formatter)(textBox), - x: chartDimensions.left + (xScale(textBox) || 0) + xScale.bandwidth() / 2, - }; - }); + const textXValues = getXTicks(spec, config, chartDimensions, xScale, heatmapTable, currentGridHeight); const { padding } = config.yAxisLabel; const rightPadding = typeof padding === 'number' ? padding : padding.right ?? 0; @@ -277,8 +243,8 @@ export function shapeViewModel( const allXValuesInRange: Array> = getValuesInRange(xValues, startX, endX); const allYValuesInRange: Array> = getValuesInRange(yValues, startY, endY); const invertedXValues: Array> = - isTimeXScale(spec.xScale) && typeof endX === 'number' - ? [startX, addIntervalToTime(endX, spec.xScale.interval, spec.xScale.timeZone)] + isRasterTimeScale(spec.xScale) && typeof endX === 'number' + ? [startX, addIntervalToTime(endX, spec.xScale.interval, config.timeZone)] : [...allXValuesInRange]; const cells: Cell[] = []; @@ -362,7 +328,7 @@ export function shapeViewModel( x1: chartDimensions.left + i * cellWidth, x2: chartDimensions.left + i * cellWidth, y1: chartDimensions.top, - y2: cellHeight * pageSize, + y2: currentGridHeight, })); // horizontal lines @@ -412,6 +378,51 @@ function isValueHidden(value: number, rangesToHide: Array<[number, number]>) { return rangesToHide.some(([min, max]) => min <= value && value < max); } -function isTimeXScale(scale: HeatmapSpec['xScale']): scale is HeatmapTimeScale { +/** @internal */ +export function isRasterTimeScale(scale: RasterTimeScale | OrdinalScale | LinearScale): scale is RasterTimeScale { return scale.type === ScaleType.Time; } + +function getXTicks( + spec: HeatmapSpec, + config: Config, + chartDimensions: Dimensions, + xScale: ScaleBand, + { xValues, xNumericExtent }: HeatmapTable, + gridHeight: number, +): Array { + const getTextValue = ( + formatter: Config['xAxisLabel']['formatter'], + scaleCallback: (x: string | number) => number | undefined | null, + ) => (value: string | number): TextBox => { + return { + text: formatter(value), + value, + ...config.xAxisLabel, + x: chartDimensions.left + (scaleCallback(value) ?? 0), + y: gridHeight + config.xAxisLabel.fontSize / 2 + config.xAxisLabel.padding, + }; + }; + if (isRasterTimeScale(spec.xScale)) { + const timeScale = new ScaleContinuous( + { + type: ScaleType.Time, + domain: xNumericExtent, + range: [0, chartDimensions.width], + nice: false, + }, + { + desiredTickCount: estimatedNonOverlappingTickCount(chartDimensions.width, config.xAxisLabel), + timeZone: config.timeZone, + }, + ); + return timeScale.ticks().map(getTextValue(config.xAxisLabel.formatter, (x) => timeScale.scale(x))); + } + + return xValues.map((textBox: string | number) => { + return { + ...getTextValue(config.xAxisLabel.formatter, xScale)(textBox), + x: chartDimensions.left + (xScale(textBox) || 0) + xScale.bandwidth() / 2, + }; + }); +} diff --git a/packages/charts/src/chart_types/heatmap/specs/heatmap.ts b/packages/charts/src/chart_types/heatmap/specs/heatmap.ts index 02ccde2aa7..108cad94b9 100644 --- a/packages/charts/src/chart_types/heatmap/specs/heatmap.ts +++ b/packages/charts/src/chart_types/heatmap/specs/heatmap.ts @@ -59,16 +59,24 @@ export interface HeatmapBandsColorScale { labelFormatter?: (start: number, end: number) => string; } -/** @alpha */ -export interface HeatmapTimeScale { +/** @public */ +export interface TimeScale { type: typeof ScaleType.Time; +} + +/** @public */ +export interface RasterTimeScale extends TimeScale { interval: ESCalendarInterval | ESFixedInterval; - timeZone: string; } -/** @alpha */ -export interface HeatmapNonTimeScale { - type: typeof ScaleType.Ordinal | typeof ScaleType.Linear; +/** @public */ +export interface LinearScale { + type: typeof ScaleType.Linear; +} + +/** @public */ +export interface OrdinalScale { + type: typeof ScaleType.Ordinal; } /** @alpha */ @@ -83,7 +91,7 @@ export interface HeatmapSpec extends Spec { valueFormatter: (value: number) => string; xSortPredicate: Predicate; ySortPredicate: Predicate; - xScale: HeatmapTimeScale | HeatmapNonTimeScale; + xScale: RasterTimeScale | OrdinalScale | LinearScale; config: RecursivePartial; highlightedData?: { x: Array; y: Array }; name?: string; diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts index 900320dfc1..9e4f4f2103 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_brushed_highlighted_shapes.test.ts @@ -91,7 +91,7 @@ describe('Temporal heatmap brush', () => { onBrushEnd: onBrushEndMock, }), MockSeriesSpec.heatmap({ - xScale: { type: ScaleType.Time, timeZone: 'Europe/Rome', interval: { type: 'fixed', unit: 'h', value: 24 } }, + xScale: { type: ScaleType.Time, interval: { type: 'fixed', unit: 'h', value: 24 } }, data: [ { x: start.toMillis(), y: 'ya', value: 1 }, { x: start.plus({ days: 1 }).toMillis(), y: 'ya', value: 2 }, @@ -119,6 +119,7 @@ describe('Temporal heatmap brush', () => { visible: false, }, margin: { top: 0, bottom: 0, left: 0, right: 0 }, + timeZone: 'Europe/Rome', }, }), ], diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts index ab3df97dd7..73d1529dc5 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_heatmap_table.ts @@ -15,6 +15,7 @@ import { getSettingsSpecSelector } from '../../../../state/selectors/get_setting import { getAccessorValue } from '../../../../utils/accessor'; import { addIntervalToTime, timeRange } from '../../../../utils/chrono/elasticsearch'; import { HeatmapTable } from './compute_chart_dimensions'; +import { getHeatmapConfigSelector } from './get_heatmap_config'; import { getHeatmapSpecSelector } from './get_heatmap_spec'; /** @@ -22,11 +23,12 @@ import { getHeatmapSpecSelector } from './get_heatmap_spec'; * @internal */ export const getHeatmapTableSelector = createCustomCachedSelector( - [getHeatmapSpecSelector, getSettingsSpecSelector], - (spec, settingsSpec): HeatmapTable => { - const { data, valueAccessor, xAccessor, yAccessor, xSortPredicate, ySortPredicate } = spec; - const { xDomain } = settingsSpec; - + [getHeatmapSpecSelector, getSettingsSpecSelector, getHeatmapConfigSelector], + ( + { data, valueAccessor, xAccessor, yAccessor, xSortPredicate, ySortPredicate, xScale }, + { xDomain }, + { timeZone }, + ): HeatmapTable => { const resultData = data.reduce( (acc, curr, index) => { const x = getAccessorValue(curr, xAccessor); @@ -62,19 +64,17 @@ export const getHeatmapTableSelector = createCustomCachedSelector( xNumericExtent: [+Infinity, -Infinity], }, ); - if (spec.xScale.type === ScaleType.Time) { + if (xScale.type === ScaleType.Time) { const [xDataMin = NaN, xDataMax = NaN] = extent(resultData.xValues as number[]); // to correctly compute the time extent from data, we need to add an interval to the max value of the dataset - const dataMaxExtended = xDataMax ? addIntervalToTime(xDataMax, spec.xScale.interval, spec.xScale.timeZone) : NaN; + const dataMaxExtended = xDataMax ? addIntervalToTime(xDataMax, xScale.interval, timeZone) : NaN; const [customMin, customMax] = !Array.isArray(xDomain) ? [xDomain?.min ?? NaN, xDomain?.max ?? NaN] : [NaN, NaN]; const [min, max] = extent([xDataMin, customMin, customMax, dataMaxExtended]); resultData.xNumericExtent = [min ?? NaN, max ?? NaN]; resultData.xValues = - isFiniteNumber(min) && isFiniteNumber(max) - ? timeRange(min, max, spec.xScale.interval, spec.xScale.timeZone) - : []; - } else if (spec.xScale.type === ScaleType.Ordinal) { + isFiniteNumber(min) && isFiniteNumber(max) ? timeRange(min, max, xScale.interval, timeZone) : []; + } else if (xScale.type === ScaleType.Ordinal) { resultData.xValues.sort(getPredicateFn(xSortPredicate)); } diff --git a/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts b/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts index b840726ea4..b214694c7e 100644 --- a/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts +++ b/packages/charts/src/chart_types/heatmap/state/selectors/get_x_axis_right_overflow.ts @@ -20,7 +20,7 @@ import { getHeatmapTableSelector } from './get_heatmap_table'; */ export const getXAxisRightOverflow = createCustomCachedSelector( [getHeatmapSpecSelector, getHeatmapConfigSelector, getHeatmapTableSelector], - ({ xScale }, { xAxisLabel: { fontSize, fontFamily, padding, formatter, width } }, { xNumericExtent }) => { + ({ xScale }, { timeZone, xAxisLabel: { fontSize, fontFamily, padding, formatter, width } }, { xNumericExtent }) => { return xScale.type !== ScaleType.Time ? 0 : typeof width === 'number' @@ -28,7 +28,7 @@ export const getXAxisRightOverflow = createCustomCachedSelector( : withTextMeasure((measure) => { return new ScaleContinuous( { type: ScaleType.Time, domain: xNumericExtent, range: [0, 1] }, - { timeZone: xScale.type === ScaleType.Time ? xScale.timeZone : undefined }, + { timeZone: xScale.type === ScaleType.Time ? timeZone : undefined }, ) .ticks() .reduce((max, n) => Math.max(max, measure(formatter(n), padding, fontSize, fontFamily).width + padding), 0); diff --git a/packages/charts/src/chart_types/specs.ts b/packages/charts/src/chart_types/specs.ts index 0e307b7ad8..1d0afcc8b7 100644 --- a/packages/charts/src/chart_types/specs.ts +++ b/packages/charts/src/chart_types/specs.ts @@ -21,4 +21,4 @@ export * from './xy_chart/utils/specs'; export { Partition } from './partition_chart/specs'; -export { Heatmap, HeatmapSpec, HeatmapTimeScale, HeatmapNonTimeScale } from './heatmap/specs'; +export { Heatmap, HeatmapSpec, RasterTimeScale, TimeScale, LinearScale, OrdinalScale } from './heatmap/specs'; diff --git a/storybook/stories/heatmap/1_basic.story.tsx b/storybook/stories/heatmap/1_basic.story.tsx index 3b5af32f58..b20cc36bb3 100644 --- a/storybook/stories/heatmap/1_basic.story.tsx +++ b/storybook/stories/heatmap/1_basic.story.tsx @@ -76,6 +76,7 @@ export const Example = () => { return niceTimeFormatter([1572825600000, 1572912000000])(value, { timeZone: 'UTC' }); }, }, + timeZone: DATA_6.timeZone, }), [], ); @@ -136,7 +137,7 @@ export const Example = () => { valueAccessor="value" valueFormatter={(d) => `${Number(d.toFixed(2))}℃`} ySortPredicate="numAsc" - xScale={{ type: ScaleType.Time, timeZone: DATA_6.timeZone ?? 'UTC', interval: DATA_6.interval }} + xScale={{ type: ScaleType.Time, interval: DATA_6.interval }} config={config} highlightedData={persistCellsSelection ? selection : undefined} /> diff --git a/storybook/stories/heatmap/3_time.story.tsx b/storybook/stories/heatmap/3_time.story.tsx index f9adbc0954..7923756a90 100644 --- a/storybook/stories/heatmap/3_time.story.tsx +++ b/storybook/stories/heatmap/3_time.story.tsx @@ -61,6 +61,7 @@ export const Example = () => { .toFormat('HH:mm:ss'); }, }, + timeZone: 'UTC', }), [], ); @@ -118,7 +119,6 @@ export const Example = () => { unit: 'h', value: 1, }, - timeZone: 'UTC', }} config={config} /> diff --git a/storybook/stories/heatmap/4_test_time_snap.story.tsx b/storybook/stories/heatmap/4_test_time_snap.story.tsx index 55389e4b46..8860f4c47a 100644 --- a/storybook/stories/heatmap/4_test_time_snap.story.tsx +++ b/storybook/stories/heatmap/4_test_time_snap.story.tsx @@ -65,7 +65,6 @@ export const Example = () => { xScale={{ type: ScaleType.Time, interval: dataset.interval, - timeZone: dataset.timeZone ?? 'Europe/Rome', }} config={{ grid: { @@ -96,6 +95,7 @@ export const Example = () => { xAxisLabel: { formatter: dataset.xFormatter, }, + timeZone: dataset.timeZone ?? 'Europe/Rome', }} /> From ad7c7d0112e0c5c2070f2065eff76ba91dda74dc Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 8 Nov 2021 17:48:15 +0100 Subject: [PATCH 15/16] Move back to the original position the timeZone param --- .../charts/src/chart_types/heatmap/layout/types/config_types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts b/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts index 5053603bb0..7fdf528a30 100644 --- a/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts +++ b/packages/charts/src/chart_types/heatmap/layout/types/config_types.ts @@ -21,6 +21,7 @@ export interface Config { maxColumnWidth: Pixels; // general text config fontFamily: FontFamily; + timeZone: string; /** * Config of the mask over the area outside of the selected cells @@ -89,5 +90,4 @@ export interface Config { }; }; maxLegendHeight?: number; - timeZone: string; } From 985e3fcb1eac1e54a16d2215509aef35b7123b63 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 8 Nov 2021 18:49:58 +0100 Subject: [PATCH 16/16] Update chart API report --- packages/charts/api/charts.api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index 2c141f7d4a..8956b12d73 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -2472,8 +2472,8 @@ export type YDomainRange = YDomainBase & DomainRange & LogScaleOptions; // Warnings were encountered during analysis: // // src/chart_types/heatmap/layout/types/config_types.ts:19:13 - (ae-forgotten-export) The symbol "SizeRatio" needs to be exported by the entry point index.d.ts -// src/chart_types/heatmap/layout/types/config_types.ts:46:5 - (ae-forgotten-export) The symbol "TextAlign" needs to be exported by the entry point index.d.ts -// src/chart_types/heatmap/layout/types/config_types.ts:47:5 - (ae-forgotten-export) The symbol "TextBaseline" needs to be exported by the entry point index.d.ts +// src/chart_types/heatmap/layout/types/config_types.ts:47:5 - (ae-forgotten-export) The symbol "TextAlign" needs to be exported by the entry point index.d.ts +// src/chart_types/heatmap/layout/types/config_types.ts:48:5 - (ae-forgotten-export) The symbol "TextBaseline" needs to be exported by the entry point index.d.ts // src/chart_types/partition_chart/layout/types/config_types.ts:137:5 - (ae-forgotten-export) The symbol "TimeMs" needs to be exported by the entry point index.d.ts // src/chart_types/partition_chart/layout/types/config_types.ts:138:5 - (ae-forgotten-export) The symbol "AnimKeyframe" needs to be exported by the entry point index.d.ts