UNPKG

@antv/g2

Version:

the Grammar of Graphics in Javascript

102 lines 3.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExceedAdjust = void 0; const style_1 = require("../utils/style"); const adjustPosition = (target, edge) => { const [[minEdgeX, minEdgeY], [maxEdgeX, maxEdgeY]] = edge; const [[minX, minY], [maxX, maxY]] = target; let changeX = 0, changeY = 0; // x-axis if (minX < minEdgeX) { changeX = minEdgeX - minX; } else if (maxX > maxEdgeX) { changeX = maxEdgeX - maxX; } // y-axis if (minY < minEdgeY) { changeY = minEdgeY - minY; } else if (maxY > maxEdgeY) { changeY = maxEdgeY - maxY; } return [changeX, changeY]; }; const union = (a, b) => { // Handle null bounds by returning the non-null one, or a default AABB if (!a || !a.min || !a.max) { if (!b || !b.min || !b.max) { return { min: [0, 0], max: [0, 0] }; } return b; } if (!b || !b.min || !b.max) { return a; } return { min: [Math.min(a.min[0], b.min[0]), Math.min(a.min[1], b.min[1])], max: [Math.max(a.max[0], b.max[0]), Math.max(a.max[1], b.max[1])], }; }; /** * adjust the label when exceed the specific area */ const ExceedAdjust = (options = {}) => { return (labels, { canvas, layout }) => { const { bounds = 'view', offsetX = 0, offsetY = 0 } = options; // Calculate boundary area based on bounds option const getBoundaryArea = () => { if (bounds === 'main') { // Main area: exclude margins and paddings from view area const { x = 0, y = 0, width = 0, height = 0, marginLeft = 0, marginRight = 0, marginTop = 0, marginBottom = 0, paddingLeft = 0, paddingRight = 0, paddingTop = 0, paddingBottom = 0, } = layout; return [ [ x + marginLeft + paddingLeft + offsetX, y + marginTop + paddingTop + offsetY, ], [ x + width - marginRight - paddingRight - offsetX, y + height - marginBottom - paddingBottom - offsetY, ], ]; } else { // View area (default): entire layout area const { x = 0, y = 0, width = 0, height = 0 } = layout; return [ [x + offsetX, y + offsetY], [x + width - offsetX, y + height - offsetY], ]; } }; const boundaryArea = getBoundaryArea(); labels.forEach((l) => { (0, style_1.show)(l); const { max, min } = union(l.getRenderBounds(), l.getBounds()); // Skip labels with invalid bounds (filtered out data points) // When bounds are all zeros or invalid, it means the label shouldn't be displayed if (!max || !min || (max[0] === 0 && max[1] === 0 && min[0] === 0 && min[1] === 0)) { return; } const [xMax, yMax] = max, [xMin, yMin] = min; const changeValue = adjustPosition([ [xMin, yMin], [xMax, yMax], ], // Use the calculated boundary area based on bounds configuration boundaryArea); // For label with connectorPoints if (l.style.connector && l.style.connectorPoints) { l.style.connectorPoints[0][0] -= changeValue[0]; l.style.connectorPoints[0][1] -= changeValue[1]; } l.style.x += changeValue[0]; l.style.y += changeValue[1]; }); return labels; }; }; exports.ExceedAdjust = ExceedAdjust; //# sourceMappingURL=exceedAdjust.js.map