From 1d4fddc52180dbadd32b6d8ca917c236b62cfc55 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 7 Jul 2020 17:40:44 +0200 Subject: [PATCH] fix(axes): remove only consecutive duplicated ticks (#742) This commit fixes the current behavior of the duplicated ticks handling the removal only for consecutive duplicated ticks fix #667 --- ...g-values-visually-looks-correct-1-snap.png | Bin 113834 -> 114117 bytes ...ide-consecutive-duplicate-ticks-1-snap.png | Bin 0 -> 16301 bytes .../integration/tests/axis_stories.test.ts | 5 ++ .../xy_chart/utils/axis_utils.test.ts | 45 +++++++++++++++++- .../chart_types/xy_chart/utils/axis_utils.ts | 2 +- packages/osd-charts/src/utils/commons.ts | 9 +++- .../stories/axes/12_duplicate_ticks.tsx | 13 +++-- 7 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 packages/osd-charts/integration/tests/__image_snapshots__/axis-stories-test-ts-axis-stories-should-hide-consecutive-duplicate-ticks-1-snap.png diff --git a/packages/osd-charts/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-line-chart-multi-series-with-log-values-visually-looks-correct-1-snap.png b/packages/osd-charts/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-line-chart-multi-series-with-log-values-visually-looks-correct-1-snap.png index 996ee961f54907df9015966edbfaf91654f86687..17e6d545ef122f2975030dbf8a421767e669f108 100644 GIT binary patch delta 15057 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 TXw>B&Acvfkl4Pa0@z4JQ%Yjn+ diff --git a/packages/osd-charts/integration/tests/__image_snapshots__/axis-stories-test-ts-axis-stories-should-hide-consecutive-duplicate-ticks-1-snap.png b/packages/osd-charts/integration/tests/__image_snapshots__/axis-stories-test-ts-axis-stories-should-hide-consecutive-duplicate-ticks-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..1590f04bbbc2bb9c29c7ee5e2f1a3ce1b9b13ade GIT binary patch literal 16301 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 literal 0 HcmV?d00001 diff --git a/packages/osd-charts/integration/tests/axis_stories.test.ts b/packages/osd-charts/integration/tests/axis_stories.test.ts index 23ebce1a85db..d30dbdf83cf3 100644 --- a/packages/osd-charts/integration/tests/axis_stories.test.ts +++ b/packages/osd-charts/integration/tests/axis_stories.test.ts @@ -65,4 +65,9 @@ describe('Axis stories', () => { 'http://localhost:9001/?path=/story/axes--custom-mixed&knob-left min=2&knob-xDomain max=2', ); }); + it('should hide consecutive duplicate ticks', async() => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/axes--duplicate-ticks&knob-formatter=hourly&knob-Show duplicate ticks in x axis=true', + ); + }); }); diff --git a/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.test.ts b/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.test.ts index 07d0716c5af9..00f47012a74e 100644 --- a/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.test.ts +++ b/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.test.ts @@ -55,7 +55,7 @@ import { enableDuplicatedTicks, } from './axis_utils'; import { computeXScale } from './scales'; -import { AxisSpec, DomainRange, AxisStyle, DEFAULT_GLOBAL_ID } from './specs'; +import { AxisSpec, DomainRange, AxisStyle, DEFAULT_GLOBAL_ID, TickFormatter } from './specs'; describe('Axis computational utils', () => { const mockedRect = { @@ -1435,6 +1435,49 @@ describe('Axis computational utils', () => { { value: 1547596800000, label: '2019-01-16', position: 568.2958333333333 }, ]); }); + test('should show unique consecutive ticks if duplicateTicks is set to false', () => { + const formatter: TickFormatter = (d, options = { timeZone: 'utc+1' }) => DateTime.fromMillis(d, { setZone: true, zone: options.timeZone }).toFormat('HH:mm'); + const axisSpec: AxisSpec = { + id: 'bottom', + position: 'bottom', + showDuplicatedTicks: false, + chartType: 'xy_axis', + specType: 'axis', + groupId: DEFAULT_GLOBAL_ID, + hide: false, + showOverlappingLabels: false, + showOverlappingTicks: false, + tickSize: 10, + tickPadding: 10, + tickLabelRotation: 0, + tickFormat: formatter, + }; + const xDomainTime: XDomain = { + type: 'xDomain', + isBandScale: false, + timeZone: 'utc+1', + domain: [1547190000000, 1547622000000], + minInterval: 86400000, + scaleType: ScaleType.Time, + }; + const scale: Scale = computeXScale({ xDomain: xDomainTime, totalBarsInCluster: 0, range: [0, 603.5] }); + const offset = 0; + const tickFormatOption = { timeZone: xDomainTime.timeZone }; + const ticks = enableDuplicatedTicks(axisSpec, scale, offset, tickFormatOption); + const tickLabels = ticks.map(({ label }) => ({ label })); + expect(tickLabels).toEqual([ + { label: '12:00' }, + { label: '00:00' }, + { label: '12:00' }, + { label: '00:00' }, + { label: '12:00' }, + { label: '00:00' }, + { label: '12:00' }, + { label: '00:00' }, + { label: '12:00' }, + { label: '00:00' }, + ]); + }); test('should show duplicate tick labels if duplicateTicks is set to true', () => { const now = DateTime.fromISO('2019-01-11T00:00:00.000') .setZone('utc+1') diff --git a/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.ts b/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.ts index dac8845330ed..5c8abfdceb80 100644 --- a/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.ts +++ b/packages/osd-charts/src/chart_types/xy_chart/utils/axis_utils.ts @@ -471,7 +471,7 @@ export function enableDuplicatedTicks( if (axisSpec.showDuplicatedTicks === true) { return allTicks; } - return getUniqueValues(allTicks, 'label'); + return getUniqueValues(allTicks, 'label', true); } /** @internal */ diff --git a/packages/osd-charts/src/utils/commons.ts b/packages/osd-charts/src/utils/commons.ts index c21dd22fbd90..273b24e083bc 100644 --- a/packages/osd-charts/src/utils/commons.ts +++ b/packages/osd-charts/src/utils/commons.ts @@ -331,7 +331,7 @@ export function mergePartial( } /** @internal */ -export function getUniqueValues(fullArray: T[], uniqueProperty: keyof T): T[] { +export function getUniqueValues(fullArray: T[], uniqueProperty: keyof T, filterConsecutives = false): T[] { return fullArray.reduce<{ filtered: T[]; uniqueValues: Set; @@ -341,7 +341,12 @@ export function getUniqueValues(fullArray: T[], uniqueProperty: keyof T): T[] if (acc.uniqueValues.has(uniqueValue)) { return acc; } - acc.uniqueValues.add(uniqueValue); + if (filterConsecutives) { + acc.uniqueValues.clear(); + acc.uniqueValues.add(uniqueValue); + } else { + acc.uniqueValues.add(uniqueValue); + } acc.filtered.push(currentValue); return acc; }, diff --git a/packages/osd-charts/stories/axes/12_duplicate_ticks.tsx b/packages/osd-charts/stories/axes/12_duplicate_ticks.tsx index 903db1c9d1b2..0048f8175589 100644 --- a/packages/osd-charts/stories/axes/12_duplicate_ticks.tsx +++ b/packages/osd-charts/stories/axes/12_duplicate_ticks.tsx @@ -17,12 +17,12 @@ * under the License. */ -import { boolean } from '@storybook/addon-knobs'; +import { boolean, select } from '@storybook/addon-knobs'; import { DateTime } from 'luxon'; import moment from 'moment-timezone'; import React from 'react'; -import { Axis, Chart, LineSeries, Position, ScaleType, niceTimeFormatter } from '../../src'; +import { Axis, Chart, LineSeries, Position, ScaleType, niceTimeFormatter, TickFormatter } from '../../src'; import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; export const Example = () => { @@ -31,11 +31,16 @@ export const Example = () => { .toMillis(); const oneDay = moment.duration(1, 'd'); const twoDays = moment.duration(2, 'd'); - const oneMonth = moment.duration(31, 'd'); const threeDays = moment.duration(3, 'd'); const fourDays = moment.duration(4, 'd'); const fiveDays = moment.duration(5, 'd'); - const formatter = niceTimeFormatter([now, oneMonth.add(now).asMilliseconds()]); + const formatters: Record = { + daily: niceTimeFormatter([now, moment.duration(31, 'd').add(now).asMilliseconds()]), + hourly: (d) => moment(d).format('HH:mm'), + }; + const formatterSelect = select('formatter', ['daily', 'hourly'], 'daily'); + const formatter = formatters[formatterSelect]; + const duplicateTicksInAxis = boolean('Show duplicate ticks in x axis', false); return (