Skip to content

Commit ac05e1e

Browse files
Address PR feedback
1 parent 9820a86 commit ac05e1e

File tree

5 files changed

+99
-17
lines changed

5 files changed

+99
-17
lines changed

packages/x-charts/src/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisValue.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ import { ComputedAxisConfig, DefaultizedZoomOptions } from './useChartCartesianA
2525
import { ProcessedSeries } from '../../corePlugins/useChartSeries/useChartSeries.types';
2626
import { GetZoomAxisFilters, ZoomData } from './zoom.types';
2727
import { getAxisTriggerTooltip } from './getAxisTriggerTooltip';
28-
import { ScaleDefinition } from './getAxisScale';
28+
import {
29+
applyDomainLimit,
30+
getDomainLimit,
31+
getLimitedDomain,
32+
ScaleDefinition,
33+
} from './getAxisScale';
2934
import { isBandScale, isOrdinalScale } from '../../../scaleGuards';
3035

3136
function getRange(
@@ -57,6 +62,10 @@ type ComputeCommonParams<T extends ChartSeriesType = ChartSeriesType> = {
5762
zoomMap?: Map<AxisId, ZoomData>;
5863
zoomOptions?: Record<AxisId, DefaultizedZoomOptions>;
5964
getFilters?: GetZoomAxisFilters;
65+
/**
66+
* @deprecated To remove in v9. This is an experimental feature to avoid breaking change.
67+
*/
68+
preferStrictDomainInLineCharts?: boolean;
6069
};
6170

6271
export function computeAxisValue<T extends ChartSeriesType>(
@@ -81,6 +90,7 @@ export function computeAxisValue<T extends ChartSeriesType>({
8190
zoomMap,
8291
zoomOptions,
8392
getFilters,
93+
preferStrictDomainInLineCharts,
8494
}: ComputeCommonParams<T> & {
8595
axis?: DefaultedAxis[];
8696
axisDirection: 'x' | 'y';
@@ -108,7 +118,6 @@ export function computeAxisValue<T extends ChartSeriesType>({
108118
const zoom = zoomMap?.get(axis.id);
109119
const zoomRange: [number, number] = zoom ? [zoom.start, zoom.end] : [0, 100];
110120
const range = getRange(drawingArea, axisDirection, axis.reverse ?? false);
111-
const filter = zoom === undefined && !zoomOption ? getFilters : undefined; // Do not apply filtering if zoom is already defined.
112121

113122
const triggerTooltip = !axis.ignoreTooltip && axisIdsTriggeringTooltip.has(axis.id);
114123

@@ -177,6 +186,7 @@ export function computeAxisValue<T extends ChartSeriesType>({
177186
const scaleType = continuousAxis.scaleType ?? ('linear' as const);
178187
const tickNumber = scaleTickNumberByRange(rawTickNumber, zoomRange);
179188

189+
const filter = zoom === undefined && !zoomOption ? getFilters : undefined; // Do not apply filtering if zoom is already defined.
180190
if (filter) {
181191
const [minData, maxData] = getAxisExtremum(
182192
axis,
@@ -188,6 +198,16 @@ export function computeAxisValue<T extends ChartSeriesType>({
188198
);
189199
scale = scale.copy();
190200
scale.domain([minData, maxData]);
201+
202+
const domainLimit = getDomainLimit(
203+
axis,
204+
axisDirection,
205+
axisIndex,
206+
formattedSeries,
207+
preferStrictDomainInLineCharts,
208+
);
209+
scale.domain(getLimitedDomain([axis.min ?? minData, axis.max ?? maxData], domainLimit));
210+
applyDomainLimit(scale, axis, domainLimit, rawTickNumber);
191211
}
192212

193213
completeAxis[axis.id] = {

packages/x-charts/src/internals/plugins/featurePlugins/useChartCartesianAxis/getAxisDomainLimit.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { CartesianChartSeriesType } from '../../../../models/seriesType/config';
33
import { ProcessedSeries } from '../../corePlugins/useChartSeries';
44

55
export const getAxisDomainLimit = <T extends CartesianChartSeriesType>(
6-
axis: AxisConfig,
6+
axis: Pick<AxisConfig, 'id' | 'domainLimit'>,
77
axisDirection: 'x' | 'y',
88
axisIndex: number,
99
formattedSeries: ProcessedSeries<T | 'line'>,

packages/x-charts/src/internals/plugins/featurePlugins/useChartCartesianAxis/getAxisScale.ts

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,15 @@ function getAxisScale<T extends ChartSeriesType>(
183183

184184
const scaleType = axis.scaleType ?? ('linear' as const);
185185

186-
const domainLimit = preferStrictDomainInLineCharts
187-
? getAxisDomainLimit(axis, axisDirection, axisIndex, formattedSeries)
188-
: (axis.domainLimit ?? 'nice');
189-
190-
const axisExtrema = [axis.min ?? minData, axis.max ?? maxData];
186+
const domainLimit = getDomainLimit(
187+
axis,
188+
axisDirection,
189+
axisIndex,
190+
formattedSeries,
191+
preferStrictDomainInLineCharts,
192+
);
191193

192-
if (typeof domainLimit === 'function') {
193-
const { min, max } = domainLimit(minData, maxData);
194-
axisExtrema[0] = min;
195-
axisExtrema[1] = max;
196-
}
194+
const axisExtrema = getLimitedDomain([axis.min ?? minData, axis.max ?? maxData], domainLimit);
197195

198196
const rawTickNumber = getTickNumber({ ...axis, range, domain: axisExtrema });
199197

@@ -205,12 +203,47 @@ function getAxisScale<T extends ChartSeriesType>(
205203
(scale as ScaleSymLog<number, number>).constant(axis.constant);
206204
}
207205

206+
applyDomainLimit(scale, axis, domainLimit, rawTickNumber);
207+
208+
return { scale, tickNumber: rawTickNumber };
209+
}
210+
211+
type DomainLimit = 'nice' | 'strict' | ((min: number, max: number) => { min: number; max: number });
212+
213+
export function getDomainLimit(
214+
axis: Pick<DefaultedAxis, 'id' | 'domainLimit'>,
215+
axisDirection: 'x' | 'y',
216+
axisIndex: number,
217+
formattedSeries: ProcessedSeries,
218+
preferStrictDomainInLineCharts: boolean | undefined,
219+
) {
220+
return preferStrictDomainInLineCharts
221+
? getAxisDomainLimit(axis, axisDirection, axisIndex, formattedSeries)
222+
: (axis.domainLimit ?? 'nice');
223+
}
224+
225+
export function getLimitedDomain(
226+
extrema: [number | Date, number | Date],
227+
domainLimit: DomainLimit,
228+
) {
229+
if (typeof domainLimit === 'function') {
230+
const { min, max } = domainLimit(extrema[0], extrema[1]);
231+
return [min, max];
232+
}
233+
234+
return extrema;
235+
}
236+
237+
export function applyDomainLimit(
238+
scale: D3ContinuousScale,
239+
axis: { min?: number | Date; max?: number | Date },
240+
domainLimit: DomainLimit,
241+
rawTickNumber: number,
242+
) {
208243
if (domainLimit === 'nice') {
209244
scale.nice(rawTickNumber);
210245
}
211246

212247
const [minDomain, maxDomain] = scale.domain();
213248
scale.domain([axis.min ?? minDomain, axis.max ?? maxDomain]);
214-
215-
return { scale, tickNumber: rawTickNumber };
216249
}

packages/x-charts/src/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisPreview.selectors.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export const selectorChartPreviewComputedXAxis = createSelector(
8888
selectorChartZoomOptionsLookup,
8989
selectorChartZoomAxisFilters,
9090
selectorChartDrawingArea,
91+
selectorPreferStrictDomainInLineCharts,
9192
selectorChartPreviewXScales,
9293
(_, axisId: AxisId) => axisId,
9394
],
@@ -99,6 +100,7 @@ export const selectorChartPreviewComputedXAxis = createSelector(
99100
zoomOptions,
100101
getFilters,
101102
chartDrawingArea,
103+
preferStrictDomainInLineCharts,
102104
scales,
103105
axisId,
104106
) => {
@@ -174,6 +176,7 @@ export const selectorChartPreviewComputedYAxis = createSelector(
174176
selectorChartZoomOptionsLookup,
175177
selectorChartZoomAxisFilters,
176178
selectorChartDrawingArea,
179+
selectorPreferStrictDomainInLineCharts,
177180
selectorChartPreviewYScales,
178181
(_, axisId: AxisId) => axisId,
179182
],
@@ -184,6 +187,7 @@ export const selectorChartPreviewComputedYAxis = createSelector(
184187
zoomOptions,
185188
getFilters,
186189
chartDrawingArea,
190+
preferStrictDomainInLineCharts,
187191
scales,
188192
axisId,
189193
) => {
@@ -205,6 +209,7 @@ export const selectorChartPreviewComputedYAxis = createSelector(
205209
zoomMap,
206210
zoomOptions,
207211
getFilters,
212+
preferStrictDomainInLineCharts,
208213
});
209214

210215
if (computedAxes.axis[axisId]) {

packages/x-charts/src/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisRendering.selectors.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,20 @@ export const selectorChartXAxis = createSelector(
182182
selectorChartZoomMap,
183183
selectorChartZoomOptionsLookup,
184184
selectorChartZoomAxisFilters,
185+
selectorPreferStrictDomainInLineCharts,
185186
selectorChartXScales,
186187
],
187-
(axis, drawingArea, formattedSeries, seriesConfig, zoomMap, zoomOptions, getFilters, scales) =>
188+
(
189+
axis,
190+
drawingArea,
191+
formattedSeries,
192+
seriesConfig,
193+
zoomMap,
194+
zoomOptions,
195+
getFilters,
196+
preferStrictDomainInLineCharts,
197+
scales,
198+
) =>
188199
computeAxisValue({
189200
scales,
190201
drawingArea,
@@ -195,6 +206,7 @@ export const selectorChartXAxis = createSelector(
195206
zoomMap,
196207
zoomOptions,
197208
getFilters,
209+
preferStrictDomainInLineCharts,
198210
}),
199211
);
200212

@@ -207,9 +219,20 @@ export const selectorChartYAxis = createSelector(
207219
selectorChartZoomMap,
208220
selectorChartZoomOptionsLookup,
209221
selectorChartZoomAxisFilters,
222+
selectorPreferStrictDomainInLineCharts,
210223
selectorChartYScales,
211224
],
212-
(axis, drawingArea, formattedSeries, seriesConfig, zoomMap, zoomOptions, getFilters, scales) =>
225+
(
226+
axis,
227+
drawingArea,
228+
formattedSeries,
229+
seriesConfig,
230+
zoomMap,
231+
zoomOptions,
232+
getFilters,
233+
preferStrictDomainInLineCharts,
234+
scales,
235+
) =>
213236
computeAxisValue({
214237
scales,
215238
drawingArea,
@@ -220,6 +243,7 @@ export const selectorChartYAxis = createSelector(
220243
zoomMap,
221244
zoomOptions,
222245
getFilters,
246+
preferStrictDomainInLineCharts,
223247
}),
224248
);
225249

0 commit comments

Comments
 (0)