UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

281 lines (280 loc) 9.39 kB
import { getLayoutRect } from "../../util/layout.mjs"; import { parsePercent, linearMap } from "../../util/number.mjs"; import { isFunction } from "../../../../zrender/lib/core/util.mjs"; function getViewRect(seriesModel, api) { return getLayoutRect(seriesModel.getBoxLayoutParams(), { width: api.getWidth(), height: api.getHeight() }); } function getSortedIndices(data, sort) { var valueDim = data.mapDimension("value"); var valueArr = data.mapArray(valueDim, function(val) { return val; }); var indices = []; var isAscending = sort === "ascending"; for (var i = 0, len = data.count(); i < len; i++) { indices[i] = i; } if (isFunction(sort)) { indices.sort(sort); } else if (sort !== "none") { indices.sort(function(a, b) { return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; }); } return indices; } function labelLayout(data) { var seriesModel = data.hostModel; var orient = seriesModel.get("orient"); data.each(function(idx) { var itemModel = data.getItemModel(idx); var labelModel = itemModel.getModel("label"); var labelPosition = labelModel.get("position"); var labelLineModel = itemModel.getModel("labelLine"); var layout = data.getItemLayout(idx); var points = layout.points; var isLabelInside = labelPosition === "inner" || labelPosition === "inside" || labelPosition === "center" || labelPosition === "insideLeft" || labelPosition === "insideRight"; var textAlign; var textX; var textY; var linePoints; if (isLabelInside) { if (labelPosition === "insideLeft") { textX = (points[0][0] + points[3][0]) / 2 + 5; textY = (points[0][1] + points[3][1]) / 2; textAlign = "left"; } else if (labelPosition === "insideRight") { textX = (points[1][0] + points[2][0]) / 2 - 5; textY = (points[1][1] + points[2][1]) / 2; textAlign = "right"; } else { textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4; textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4; textAlign = "center"; } linePoints = [[textX, textY], [textX, textY]]; } else { var x1 = void 0; var y1 = void 0; var x2 = void 0; var y2 = void 0; var labelLineLen = labelLineModel.get("length"); if (labelPosition === "left") { x1 = (points[3][0] + points[0][0]) / 2; y1 = (points[3][1] + points[0][1]) / 2; x2 = x1 - labelLineLen; textX = x2 - 5; textAlign = "right"; } else if (labelPosition === "right") { x1 = (points[1][0] + points[2][0]) / 2; y1 = (points[1][1] + points[2][1]) / 2; x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "left"; } else if (labelPosition === "top") { x1 = (points[3][0] + points[0][0]) / 2; y1 = (points[3][1] + points[0][1]) / 2; y2 = y1 - labelLineLen; textY = y2 - 5; textAlign = "center"; } else if (labelPosition === "bottom") { x1 = (points[1][0] + points[2][0]) / 2; y1 = (points[1][1] + points[2][1]) / 2; y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else if (labelPosition === "rightTop") { x1 = orient === "horizontal" ? points[3][0] : points[1][0]; y1 = orient === "horizontal" ? points[3][1] : points[1][1]; if (orient === "horizontal") { y2 = y1 - labelLineLen; textY = y2 - 5; textAlign = "center"; } else { x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "top"; } } else if (labelPosition === "rightBottom") { x1 = points[2][0]; y1 = points[2][1]; if (orient === "horizontal") { y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else { x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "bottom"; } } else if (labelPosition === "leftTop") { x1 = points[0][0]; y1 = orient === "horizontal" ? points[0][1] : points[1][1]; if (orient === "horizontal") { y2 = y1 - labelLineLen; textY = y2 - 5; textAlign = "center"; } else { x2 = x1 - labelLineLen; textX = x2 - 5; textAlign = "right"; } } else if (labelPosition === "leftBottom") { x1 = orient === "horizontal" ? points[1][0] : points[3][0]; y1 = orient === "horizontal" ? points[1][1] : points[2][1]; if (orient === "horizontal") { y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else { x2 = x1 - labelLineLen; textX = x2 - 5; textAlign = "right"; } } else { x1 = (points[1][0] + points[2][0]) / 2; y1 = (points[1][1] + points[2][1]) / 2; if (orient === "horizontal") { y2 = y1 + labelLineLen; textY = y2 + 5; textAlign = "center"; } else { x2 = x1 + labelLineLen; textX = x2 + 5; textAlign = "left"; } } if (orient === "horizontal") { x2 = x1; textX = x2; } else { y2 = y1; textY = y2; } linePoints = [[x1, y1], [x2, y2]]; } layout.label = { linePoints, x: textX, y: textY, verticalAlign: "middle", textAlign, inside: isLabelInside }; }); } function funnelLayout(ecModel, api) { ecModel.eachSeriesByType("funnel", function(seriesModel) { var data = seriesModel.getData(); var valueDim = data.mapDimension("value"); var sort = seriesModel.get("sort"); var viewRect = getViewRect(seriesModel, api); var orient = seriesModel.get("orient"); var viewWidth = viewRect.width; var viewHeight = viewRect.height; var indices = getSortedIndices(data, sort); var x = viewRect.x; var y = viewRect.y; var sizeExtent = orient === "horizontal" ? [parsePercent(seriesModel.get("minSize"), viewHeight), parsePercent(seriesModel.get("maxSize"), viewHeight)] : [parsePercent(seriesModel.get("minSize"), viewWidth), parsePercent(seriesModel.get("maxSize"), viewWidth)]; var dataExtent = data.getDataExtent(valueDim); var min = seriesModel.get("min"); var max = seriesModel.get("max"); if (min == null) { min = Math.min(dataExtent[0], 0); } if (max == null) { max = dataExtent[1]; } var funnelAlign = seriesModel.get("funnelAlign"); var gap = seriesModel.get("gap"); var viewSize = orient === "horizontal" ? viewWidth : viewHeight; var itemSize = (viewSize - gap * (data.count() - 1)) / data.count(); var getLinePoints = function(idx2, offset) { if (orient === "horizontal") { var val_1 = data.get(valueDim, idx2) || 0; var itemHeight = linearMap(val_1, [min, max], sizeExtent, true); var y0 = void 0; switch (funnelAlign) { case "top": y0 = y; break; case "center": y0 = y + (viewHeight - itemHeight) / 2; break; case "bottom": y0 = y + (viewHeight - itemHeight); break; } return [[offset, y0], [offset, y0 + itemHeight]]; } var val = data.get(valueDim, idx2) || 0; var itemWidth = linearMap(val, [min, max], sizeExtent, true); var x0; switch (funnelAlign) { case "left": x0 = x; break; case "center": x0 = x + (viewWidth - itemWidth) / 2; break; case "right": x0 = x + viewWidth - itemWidth; break; } return [[x0, offset], [x0 + itemWidth, offset]]; }; if (sort === "ascending") { itemSize = -itemSize; gap = -gap; if (orient === "horizontal") { x += viewWidth; } else { y += viewHeight; } indices = indices.reverse(); } for (var i = 0; i < indices.length; i++) { var idx = indices[i]; var nextIdx = indices[i + 1]; var itemModel = data.getItemModel(idx); if (orient === "horizontal") { var width = itemModel.get(["itemStyle", "width"]); if (width == null) { width = itemSize; } else { width = parsePercent(width, viewWidth); if (sort === "ascending") { width = -width; } } var start = getLinePoints(idx, x); var end = getLinePoints(nextIdx, x + width); x += width + gap; data.setItemLayout(idx, { points: start.concat(end.slice().reverse()) }); } else { var height = itemModel.get(["itemStyle", "height"]); if (height == null) { height = itemSize; } else { height = parsePercent(height, viewHeight); if (sort === "ascending") { height = -height; } } var start = getLinePoints(idx, y); var end = getLinePoints(nextIdx, y + height); y += height + gap; data.setItemLayout(idx, { points: start.concat(end.slice().reverse()) }); } } labelLayout(data); }); } export { funnelLayout as default };