Skip to content

Commit 0af6a9a

Browse files
committed
feat: deselect cells from legend
1 parent 940b98a commit 0af6a9a

File tree

8 files changed

+67
-18
lines changed

8 files changed

+67
-18
lines changed

src/chart_types/heatmap/layout/types/viewmodel_types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export interface Cell {
4242
stroke: Stroke;
4343
value: number;
4444
formatted: string;
45+
visible: boolean;
4546
datum: HeatmapCellDatum;
4647
}
4748

src/chart_types/heatmap/layout/viewmodel/viewmodel.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export function shapeViewModel(
8181
chartDimensions: Dimensions,
8282
heatmapTable: HeatmapTable,
8383
colorScale: ColorScaleType,
84+
filterRanges: Array<[number, number | null]>,
8485
): ShapeViewModel {
8586
const gridStrokeWidth = config.grid.stroke.width ?? 1;
8687

@@ -233,6 +234,7 @@ export function shapeViewModel(
233234
width: config.cell.border.strokeWidth,
234235
},
235236
value: d.value,
237+
visible: !isFilteredValue(filterRanges, d.value),
236238
formatted: spec.valueFormatter(d.value),
237239
};
238240
return acc;
@@ -426,3 +428,12 @@ export function shapeViewModel(
426428
function getCellKey(x: string | number, y: string | number) {
427429
return [String(x), String(y)].join('&_&');
428430
}
431+
432+
function isFilteredValue(filterRanges: Array<[number, number | null]>, value: number) {
433+
return filterRanges.some(([min, max]) => {
434+
if (max !== null && value > min && value < max) {
435+
return true;
436+
}
437+
return max === null && value > min;
438+
});
439+
}

src/chart_types/heatmap/renderer/canvas/canvas_renderers.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ export function renderCanvas2d(
7676
const { x, y } = heatmapViewModel.gridOrigin;
7777
ctx.translate(x, y);
7878
filteredCells.forEach((cell) => {
79+
if (!cell.visible) {
80+
return;
81+
}
7982
renderRect(ctx, cell, cell.fill, cell.stroke);
8083
});
8184
}),
@@ -88,6 +91,9 @@ export function renderCanvas2d(
8891
return;
8992
}
9093
filteredCells.forEach((cell) => {
94+
if (!cell.visible) {
95+
return;
96+
}
9197
renderText(
9298
ctx,
9399
{

src/chart_types/heatmap/state/selectors/compute_legend.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ export const computeLegendSelector = createCachedSelector(
3737

3838
return colorScale.ticks.map((tick) => {
3939
const color = colorScale.config(tick);
40-
4140
const seriesIdentifier = {
4241
key: String(tick),
4342
specId: String(tick),

src/chart_types/heatmap/state/selectors/geometries.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,19 @@
1919

2020
import createCachedSelector from 're-reselect';
2121

22+
import { GlobalChartState } from '../../../../state/chart_state';
2223
import { getChartIdSelector } from '../../../../state/selectors/get_chart_id';
2324
import { getSettingsSpecSelector } from '../../../../state/selectors/get_settings_specs';
2425
import { nullShapeViewModel, ShapeViewModel } from '../../layout/types/viewmodel_types';
2526
import { computeChartDimensionsSelector } from './compute_chart_dimensions';
2627
import { getColorScale } from './get_color_scale';
2728
import { getHeatmapSpecSelector } from './get_heatmap_spec';
2829
import { getHeatmapTableSelector } from './get_heatmap_table';
30+
import { getLegendItemsLabelsSelector } from './get_legend_items_labels';
2931
import { render } from './scenegraph';
3032

33+
const getDeselectedSeriesSelector = (state: GlobalChartState) => state.interactions.deselectedDataSeries;
34+
3135
/** @internal */
3236
export const geometries = createCachedSelector(
3337
[
@@ -36,10 +40,34 @@ export const geometries = createCachedSelector(
3640
getSettingsSpecSelector,
3741
getHeatmapTableSelector,
3842
getColorScale,
43+
getLegendItemsLabelsSelector,
44+
getDeselectedSeriesSelector,
3945
],
40-
(heatmapSpec, chartDimensions, settingSpec, heatmapTable, colorScale): ShapeViewModel => {
46+
(
47+
heatmapSpec,
48+
chartDimensions,
49+
settingSpec,
50+
heatmapTable,
51+
colorScale,
52+
legendItems,
53+
deselectedSeries,
54+
): ShapeViewModel => {
55+
const deselectedTicks = new Set(
56+
deselectedSeries.map(({ specId }) => {
57+
return Number(specId);
58+
}),
59+
);
60+
const { ticks } = colorScale;
61+
const ranges = ticks.reduce<Array<[number, number | null]>>((acc, d, i) => {
62+
if (deselectedTicks.has(d)) {
63+
const rangeEnd = i + 1 === ticks.length ? null : ticks[i + 1];
64+
acc.push([d, rangeEnd]);
65+
}
66+
return acc;
67+
}, []);
68+
4169
return heatmapSpec
42-
? render(heatmapSpec, settingSpec, chartDimensions, heatmapTable, colorScale)
70+
? render(heatmapSpec, settingSpec, chartDimensions, heatmapTable, colorScale, ranges)
4371
: nullShapeViewModel();
4472
},
4573
)(getChartIdSelector);

src/chart_types/heatmap/state/selectors/get_color_scale.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export const getColorScale = createCachedSelector(
8484
.domain(ranges)
8585
.interpolate(interpolateHcl)
8686
.range(colorRange);
87-
colorScale.ticks = colorScale.config.ticks(6);
87+
colorScale.ticks = [0, ...colorScale.config.ticks(6)];
8888
}
8989
return colorScale;
9090
},

src/chart_types/heatmap/state/selectors/scenegraph.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export function render(
3636
chartDimensions: Dimensions,
3737
heatmapTable: HeatmapTable,
3838
colorScale: ColorScaleType,
39+
filterRanges: Array<[number, number | null]>,
3940
): ShapeViewModel {
4041
const textMeasurer = document.createElement('canvas');
4142
const textMeasurerCtx = textMeasurer.getContext('2d');
@@ -54,5 +55,6 @@ export function render(
5455
chartDimensions,
5556
heatmapTable,
5657
colorScale,
58+
filterRanges,
5759
);
5860
}

src/chart_types/heatmap/state/selectors/tooltip.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,23 @@ export const getTooltipInfoSelector = createCachedSelector(
4545
};
4646

4747
if (Array.isArray(pickedShapes)) {
48-
pickedShapes.forEach((shape) => {
49-
const xValueLabel = config.xAxisLabel.formatter(shape.datum.x);
50-
tooltipInfo.values.push({
51-
label: `${shape.datum.y} - ${xValueLabel}`,
52-
color: RGBtoString(shape.fill.color),
53-
isHighlighted: false,
54-
isVisible: true,
55-
seriesIdentifier: {
56-
specId: spec.id,
57-
key: spec.id,
58-
},
59-
value: `${shape.value}`,
60-
formattedValue: `${shape.value}`,
48+
pickedShapes
49+
.filter(({ visible }) => visible)
50+
.forEach((shape) => {
51+
const xValueLabel = config.xAxisLabel.formatter(shape.datum.x);
52+
tooltipInfo.values.push({
53+
label: `${shape.datum.y} - ${xValueLabel}`,
54+
color: RGBtoString(shape.fill.color),
55+
isHighlighted: false,
56+
isVisible: true,
57+
seriesIdentifier: {
58+
specId: spec.id,
59+
key: spec.id,
60+
},
61+
value: `${shape.value}`,
62+
formattedValue: `${shape.value}`,
63+
});
6164
});
62-
});
6365
} else {
6466
tooltipInfo.values.push({
6567
label: ``,

0 commit comments

Comments
 (0)