@mui/x-charts
Version:
The community edition of MUI X Charts components.
104 lines (102 loc) • 4.04 kB
JavaScript
'use client';
import _formatErrorMessage from "@mui/x-internals/formatErrorMessage";
import _extends from "@babel/runtime/helpers/esm/extends";
import * as React from 'react';
import { isOrdinalScale } from "../internals/scaleGuards.mjs";
import { useChartsContext } from "../context/ChartsProvider/useChartsContext.mjs";
import { TICK_LABEL_GAP } from "./utilities.mjs";
import { useTicksGrouped } from "../hooks/useTicksGrouped.mjs";
import { useAxisTicksProps } from "./useAxisTicksProps.mjs";
import { useStore } from "../internals/store/useStore.mjs";
import { selectorChartXAxisAutoSizeResults } from "../internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisAutoSize.selectors.mjs";
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
const DEFAULT_GROUPING_CONFIG = {
tickSize: 6
};
const getGroupingConfig = (groups, groupIndex, tickSize, computedGroupTickSizes) => {
const config = groups[groupIndex] ?? {};
const defaultTickSize = tickSize ?? DEFAULT_GROUPING_CONFIG.tickSize;
const calculatedTickSize = defaultTickSize * groupIndex * 2 + defaultTickSize;
return _extends({}, DEFAULT_GROUPING_CONFIG, config, {
tickSize: computedGroupTickSizes?.[groupIndex] ?? config.tickSize ?? calculatedTickSize
});
};
/**
* @ignore - internal component.
*/
function ChartsGroupedXAxisTicks(inProps) {
const {
xScale,
defaultizedProps,
tickNumber,
positionSign,
classes,
Tick,
TickLabel,
axisTickLabelProps
} = useAxisTicksProps(inProps);
if (!isOrdinalScale(xScale)) {
throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X Charts: ChartsGroupedXAxis only supports the `band` and `point` scale types. ' + 'Grouped axis ticks require an ordinal scale to display category groupings. ' + 'Use a band or point scale type for the x-axis, or use a non-grouped axis component.' : _formatErrorMessage(8));
}
const {
disableTicks,
tickSize,
valueFormatter,
slotProps,
tickInterval,
tickPlacement,
tickLabelPlacement
} = defaultizedProps;
const groups = defaultizedProps.groups;
const axisId = defaultizedProps.id;
const {
instance
} = useChartsContext();
const store = useStore();
// Get computed group tick sizes from auto-sizing (if available)
const autoSizeResults = store.use(selectorChartXAxisAutoSizeResults);
const axisAutoSizeResult = axisId ? autoSizeResults[axisId] : undefined;
const computedGroupTickSizes = axisAutoSizeResult?.groupTickSizes;
const xTicks = useTicksGrouped({
scale: xScale,
tickNumber,
valueFormatter,
tickInterval,
tickPlacement,
tickLabelPlacement,
direction: 'x',
groups
});
return /*#__PURE__*/_jsx(React.Fragment, {
children: xTicks.map((item, index) => {
const {
offset: tickOffset,
labelOffset
} = item;
const xTickLabel = labelOffset ?? 0;
const showTick = instance.isXInside(tickOffset);
const tickLabel = item.formattedValue;
const ignoreTick = item.ignoreTick ?? false;
const groupIndex = item.groupIndex ?? 0;
const groupConfig = getGroupingConfig(groups, groupIndex, tickSize, computedGroupTickSizes);
const tickYSize = positionSign * groupConfig.tickSize;
const labelPositionY = positionSign * (groupConfig.tickSize + TICK_LABEL_GAP);
return /*#__PURE__*/_jsxs("g", {
transform: `translate(${tickOffset}, 0)`,
className: classes.tickContainer,
"data-group-index": groupIndex,
children: [!disableTicks && !ignoreTick && showTick && /*#__PURE__*/_jsx(Tick, _extends({
y2: tickYSize,
className: classes.tick
}, slotProps?.axisTick)), tickLabel !== undefined && /*#__PURE__*/_jsx(TickLabel, _extends({
x: xTickLabel,
y: labelPositionY
}, axisTickLabelProps, {
style: _extends({}, axisTickLabelProps.style, groupConfig.tickLabelStyle),
text: tickLabel
}))]
}, index);
})
});
}
export { ChartsGroupedXAxisTicks };