UNPKG

billboard.js

Version:

Re-usable easy interface JavaScript chart library, based on D3 v4+

102 lines (101 loc) • 4.53 kB
/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 4.1.1 */ import { isNumber } from "../../module/util/type-checks.js"; //#region src/ChartInternal/internals/size.axis.ts var size_axis_default = { /** * Get Axis size according its position * @param {string} id Axis id value - x, y or y2 * @returns {number} size Axis size value * @private */ getAxisSize(id) { const $$ = this; const isRotated = $$.config.axis_rotated; return isRotated && id === "x" || !isRotated && /y2?/.test(id) ? $$.getAxisWidthByAxisId(id, true) : $$.getHorizontalAxisHeight(id); }, getAxisWidthByAxisId(id, withoutRecompute) { const $$ = this; if ($$.axis) { const position = $$.axis?.getAxisLabelPosition(id); const { width } = $$.axis.getMaxTickSize(id, withoutRecompute); const gap = width === 0 ? .5 : 0; return width + ($$.config.padding?.mode === "fit" ? position.isInner ? 10 + gap : 10 : position.isInner ? 20 + gap : 40); } else return 40; }, getHorizontalAxisHeight(id) { const $$ = this; const { config, state } = $$; const { rotatedPadding, isLegendRight, isLegendInset } = state; const isRotated = config.axis_rotated; const isFitPadding = config.padding?.mode === "fit"; const isInner = config[`axis_${id}_inner`]; const hasLabelText = config[`axis_${id}_label`].text; const defaultHeight = 13; let h = config.padding?.mode === "fit" ? isInner && !hasLabelText ? id === "y" ? 1 : 0 : 20 : 30; if (id === "x" && !config.axis_x_show) return 8; if (id === "x" && isNumber(config.axis_x_height)) return config.axis_x_height; if (id === "y" && !config.axis_y_show) return config.legend_show && !isLegendRight && !isLegendInset ? 10 : 1; if (id === "y2" && !config.axis_y2_show) return isFitPadding ? 0 : rotatedPadding.top; const maxtickSize = $$.axis.getMaxTickSize(id); const isXAxisTickRotated = Math.abs(config.axis_x_tick_rotate) > 0 && (!config.axis_x_tick_autorotate || $$.needToRotateXAxisTickTexts()); if ((config.axis_x_tick_multiline || isXAxisTickRotated) && maxtickSize.height > defaultHeight) h += maxtickSize.height - defaultHeight; return h + ($$.axis.getAxisLabelPosition(id).isInner ? 0 : 10) + (id === "y2" && !isRotated ? -10 : 0); }, getEventRectWidth() { const { config, axis } = this; const isInverted = config.axis_x_inverted; const tickInterval = axis.x.tickInterval(); return Math.max(0, isInverted ? Math.abs(tickInterval) : tickInterval); }, /** * Get axis tick test rotate value * @param {string} id Axis id * @returns {number} rotate value * @private */ getAxisTickRotate(id) { const $$ = this; const { axis, config, state, $el } = $$; let rotate = config[`axis_${id}_tick_rotate`]; if (id === "x") { const allowedXAxisTypes = axis.isCategorized() || axis.isTimeSeries(); if (config.axis_x_tick_fit && allowedXAxisTypes) { const xTickCount = config.axis_x_tick_count; const currentXTicksLength = state.current.maxTickSize.x.ticks.length; let tickCount = 0; if (xTickCount) tickCount = xTickCount > currentXTicksLength ? currentXTicksLength : xTickCount; else if (currentXTicksLength) tickCount = currentXTicksLength; if (tickCount !== state.axis.x.tickCount) { const { targets } = $$.data; state.axis.x.padding = $$.getXDomainPadding([$$.getXDomainMinMax(targets, "min"), $$.getXDomainMinMax(targets, "max")], tickCount); } state.axis.x.tickCount = tickCount; } if (($el.svg || state.isCanvasMode) && config.axis_x_tick_autorotate && config.axis_x_tick_fit && !config.axis_x_tick_multiline && !config.axis_x_tick_culling && allowedXAxisTypes) rotate = $$.needToRotateXAxisTickTexts() ? config.axis_x_tick_rotate : 0; } return rotate; }, /** * Check weather axis tick text needs to be rotated * @returns {boolean} * @private */ needToRotateXAxisTickTexts() { const $$ = this; const { state: { axis, current, isLegendRight, legendItemWidth } } = $$; const xAxisLength = current.width - (isLegendRight && legendItemWidth) - $$.getCurrentPaddingByDirection("left") - $$.getCurrentPaddingByDirection("right"); const tickCountWithPadding = axis.x.tickCount + axis.x.padding.left + axis.x.padding.right; const { width } = $$.axis.getMaxTickSize("x"); return width > (tickCountWithPadding ? xAxisLength / tickCountWithPadding : 0); } }; //#endregion export { size_axis_default as default };