UNPKG

victory-core

Version:
245 lines (241 loc) 7.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDegrees = getDegrees; exports.getPolarAngle = getPolarAngle; exports.getPolarTextAnchor = getPolarTextAnchor; exports.getPolarVerticalAnchor = getPolarVerticalAnchor; exports.getProps = getProps; exports.getText = getText; var Helpers = _interopRequireWildcard(require("./helpers")); var _defaults = _interopRequireDefault(require("lodash/defaults")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } // Private Functions function getVerticalAnchor(props, datum) { if (datum === void 0) { datum = {}; } const sign = datum._y >= 0 ? 1 : -1; const labelStyle = props.style && props.style.labels || {}; if (datum.verticalAnchor || labelStyle.verticalAnchor) { return datum.verticalAnchor || labelStyle.verticalAnchor; } else if (!props.horizontal) { return sign >= 0 ? "end" : "start"; } return "middle"; } function getTextAnchor(props, datum) { if (datum === void 0) { datum = {}; } const { style, horizontal } = props; const sign = datum._y >= 0 ? 1 : -1; const labelStyle = style && style.labels || {}; if (datum.verticalAnchor || labelStyle.verticalAnchor) { return datum.verticalAnchor || labelStyle.verticalAnchor; } else if (!horizontal) { return "middle"; } return sign >= 0 ? "start" : "end"; } function getAngle(props, datum) { if (datum === void 0) { datum = {}; } const labelStyle = props.style && props.style.labels || {}; return datum.angle === undefined ? labelStyle.angle : datum.angle; } function getPadding(props, datum) { if (datum === void 0) { datum = {}; } const { horizontal, style } = props; const labelStyle = style.labels || {}; const defaultPadding = Helpers.evaluateProp(labelStyle.padding, props) || 0; const sign = datum._y < 0 ? -1 : 1; return { x: horizontal ? sign * defaultPadding : 0, y: horizontal ? 0 : -1 * sign * defaultPadding }; } function getOffset(props, datum) { if (props.polar) { return {}; } const padding = getPadding(props, datum); return { dx: padding.x, dy: padding.y }; } function getPosition(props, datum) { const { polar } = props; const { x, y } = Helpers.scalePoint(props, datum); if (!polar) { return { x, y }; } const polarPadding = getPolarPadding(props, datum); return { x: x + polarPadding.x, y: y + polarPadding.y }; } function getPolarPadding(props, datum) { const { style } = props; const degrees = getDegrees(props, datum); const labelStyle = style.labels || {}; const padding = Helpers.evaluateProp(labelStyle.padding, props) || 0; const angle = Helpers.degreesToRadians(degrees); return { x: padding * Math.cos(angle), y: -padding * Math.sin(angle) }; } function getLabelPlacement(props) { const { labelComponent, labelPlacement, polar } = props; const defaultLabelPlacement = polar ? "perpendicular" : "vertical"; return labelPlacement ? labelPlacement : labelComponent.props && labelComponent.props.labelPlacement || defaultLabelPlacement; } function getPolarOrientation(degrees) { // eslint-disable-next-line no-magic-numbers if (degrees < 45 || degrees > 315) { return "right"; // eslint-disable-next-line no-magic-numbers } else if (degrees >= 45 && degrees <= 135) { return "top"; // eslint-disable-next-line no-magic-numbers } else if (degrees > 135 && degrees < 225) { return "left"; } return "bottom"; } // Exported Functions function getText(props, datum, index) { if (datum === void 0) { datum = {}; } if (datum.label !== undefined) { return datum.label; } return Array.isArray(props.labels) ? props.labels[index] : props.labels; } function getPolarTextAnchor(props, degrees) { const labelPlacement = getLabelPlacement(props); if (labelPlacement === "perpendicular" || labelPlacement === "vertical" && (degrees === 90 || degrees === 270)) { return "middle"; } return degrees <= 90 || degrees > 270 ? "start" : "end"; } function getPolarVerticalAnchor(props, degrees) { const labelPlacement = getLabelPlacement(props); const orientation = getPolarOrientation(degrees); if (labelPlacement === "parallel" || orientation === "left" || orientation === "right") { return "middle"; } return orientation === "top" ? "end" : "start"; } function getPolarAngle(props, baseAngle) { const { labelPlacement, datum } = props; if (!labelPlacement || labelPlacement === "vertical") { return 0; } const degrees = baseAngle !== undefined ? baseAngle % 360 : getDegrees(props, datum); const sign = degrees > 90 && degrees < 180 || degrees > 270 ? 1 : -1; let angle = 0; if (degrees === 0 || degrees === 180) { angle = 90; } else if (degrees > 0 && degrees < 180) { angle = 90 - degrees; } else if (degrees > 180 && degrees < 360) { angle = 270 - degrees; } const labelRotation = labelPlacement === "perpendicular" ? 0 : 90; return angle + sign * labelRotation; } function getDegrees(props, datum) { const { x } = Helpers.getPoint(datum); return Helpers.radiansToDegrees(props.scale.x(x)) % 360; } function getProps(props, index) { const { scale, data, style, horizontal, polar, width, height, theme, labelComponent, disableInlineStyles } = props; const datum = data[index]; const degrees = getDegrees(props, datum); const textAnchor = polar ? getPolarTextAnchor(props, degrees) : getTextAnchor(props, datum); const verticalAnchor = polar ? getPolarVerticalAnchor(props, degrees) : getVerticalAnchor(props, datum); const angle = getAngle(props, datum); const text = getText(props, datum, index); const labelPlacement = getLabelPlacement(props); const { x, y } = getPosition(props, datum); const { dx, dy } = getOffset(props, datum); const labelProps = { angle, data, datum, disableInlineStyles, horizontal, index, polar, scale, labelPlacement, text, textAnchor, verticalAnchor, x, y, dx, dy, width, height, style: style.labels }; if (!Helpers.isTooltip(labelComponent)) { return labelProps; } const tooltipTheme = theme && theme.tooltip || {}; return (0, _defaults.default)({}, labelProps, Helpers.omit(tooltipTheme, ["style"])); }