@mui/x-charts
Version:
The community edition of MUI X Charts components.
91 lines (86 loc) • 3.51 kB
JavaScript
import { createSelectorMemoized } from '@mui/x-internals/store';
import { selectorChartRawXAxis, selectorChartRawYAxis } from "./useChartCartesianAxisLayout.selectors.mjs";
import { computeAxisAutoSize } from "./computeAxisAutoSize.mjs";
import { selectorChartXAxisDomainsForAutoSize, selectorChartYAxisDomainsForAutoSize } from "./useChartAxisDomains.selectors.mjs";
// Direct state access to avoid circular dependency
const selectorIsHydrated = state => state.dimensions.width && state.dimensions.height;
const EMPTY_SIZES = {};
const EMPTY_RESULTS = {};
/**
* Selector that computes full auto-size results for X axes that have `height: 'auto'`.
* Returns a map of axis ID to full result (including group tick sizes for grouped axes).
*/
export const selectorChartXAxisAutoSizeResults = createSelectorMemoized(selectorChartRawXAxis, selectorIsHydrated, selectorChartXAxisDomainsForAutoSize, function selectorChartXAxisAutoSizeResults(xAxes, isHydrated, domainsMap) {
const hasAutoAxis = xAxes?.some(axis => axis.height === 'auto');
if (!hasAutoAxis || !isHydrated) {
return EMPTY_RESULTS;
}
const results = {};
for (let axisIndex = 0; axisIndex < (xAxes?.length ?? 0); axisIndex += 1) {
const axis = xAxes[axisIndex];
if (axis.height === 'auto') {
const computed = computeAxisAutoSize({
axis,
direction: 'x',
domain: domainsMap[axis.id]
});
if (computed !== undefined) {
results[axis.id] = computed;
}
}
}
return results;
});
/**
* Selector that computes auto-sizes for X axes that have `height: 'auto'`.
* Returns a map of axis ID to computed height (just the size, not group tick sizes).
*/
export const selectorChartXAxisAutoSizes = createSelectorMemoized(selectorChartXAxisAutoSizeResults, function selectorChartXAxisAutoSizes(results) {
if (results === EMPTY_RESULTS) {
return EMPTY_SIZES;
}
const sizes = {};
for (const [axisId, result] of Object.entries(results)) {
sizes[axisId] = result.size;
}
return sizes;
});
/**
* Selector that computes full auto-size results for Y axes that have `width: 'auto'`.
* Returns a map of axis ID to full result (including group tick sizes for grouped axes).
*/
export const selectorChartYAxisAutoSizeResults = createSelectorMemoized(selectorChartRawYAxis, selectorIsHydrated, selectorChartYAxisDomainsForAutoSize, function selectorChartYAxisAutoSizeResults(yAxes, isHydrated, domainsMap) {
const hasAutoAxis = yAxes?.some(axis => axis.width === 'auto');
if (!hasAutoAxis || !isHydrated) {
return EMPTY_RESULTS;
}
const results = {};
for (let axisIndex = 0; axisIndex < (yAxes?.length ?? 0); axisIndex += 1) {
const axis = yAxes[axisIndex];
if (axis.width === 'auto') {
const computed = computeAxisAutoSize({
axis,
direction: 'y',
domain: domainsMap[axis.id]
});
if (computed !== undefined) {
results[axis.id] = computed;
}
}
}
return results;
});
/**
* Selector that computes auto-sizes for Y axes that have `width: 'auto'`.
* Returns a map of axis ID to computed width (just the size, not group tick sizes).
*/
export const selectorChartYAxisAutoSizes = createSelectorMemoized(selectorChartYAxisAutoSizeResults, function selectorChartYAxisAutoSizes(results) {
if (results === EMPTY_RESULTS) {
return EMPTY_SIZES;
}
const sizes = {};
for (const [axisId, result] of Object.entries(results)) {
sizes[axisId] = result.size;
}
return sizes;
});