NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/lib/chart/controller/legend.js

1020 lines
31 KiB
Java
Raw Normal View History

2023-09-14 14:47:11 +08:00
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
var Util = require('../../util');
var _require = require('@antv/component/lib'),
Legend = _require.Legend;
var Tail = require('../../component/legend/tail');
var Shape = require('../../geom/shape/shape');
var bboxOfBackPlot = require('../util/bbox-of-back-plot');
var plotRange2BBox = require('../util/plot-range2bbox');
var Global = require('../../global');
var FIELD_ORIGIN = '_origin';
var MARKER_SIZE = 4.5;
var requireAnimationFrameFn = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
var STROKE_MARKERS = ['cross', 'tick', 'plus', 'hyphen', 'line', 'hollowCircle', 'hollowSquare', 'hollowDiamond', 'hollowTriangle', 'hollowTriangleDown', 'hollowHexagon', 'hollowBowtie'];
function _snapEqual(v1, v2, scale) {
var isEqual;
if (Util.isNil(scale)) {
return false;
}
v1 = scale.translate(v1);
v2 = scale.translate(v2);
if (scale.isCategory) {
isEqual = v1 === v2;
} else {
isEqual = Math.abs(v1 - v2) <= 1;
}
return isEqual;
}
function findGeom(geoms, value) {
var rst;
Util.each(geoms, function (geom) {
if (geom.get('visible')) {
var yScale = geom.getYScale();
if (yScale.field === value) {
rst = geom;
return;
}
}
});
return rst;
}
var LegendController = /*#__PURE__*/function () {
function LegendController(cfg) {
var self = this;
self.options = {};
Util.mix(self, cfg);
self.clear();
var chart = self.chart;
self.container = chart.get('frontPlot');
self.plotRange = chart.get('plotRange');
}
var _proto = LegendController.prototype;
_proto.clear = function clear() {
var legends = this.legends;
this.backRange = null;
Util.each(legends, function (legendItems) {
Util.each(legendItems, function (legend) {
legend.destroy();
});
});
this.legends = {};
} // 获取坐标轴等背景元素占的范围,防止遮挡坐标轴
;
_proto.getBackRange = function getBackRange() {
var backRange = this.backRange;
if (!backRange) {
var backPlot = this.chart.get('backPlot');
backRange = bboxOfBackPlot(backPlot, plotRange2BBox(this.chart.get('plotRange')));
var plotRange = this.plotRange;
if (backRange.maxX - backRange.minX < plotRange.br.x - plotRange.tl.x && backRange.maxY - backRange.minY < plotRange.br.y - plotRange.tl.y) {
// 如果背景小于则直接使用 plotRange
backRange = {
minX: plotRange.tl.x,
minY: plotRange.tl.y,
maxX: plotRange.br.x,
maxY: plotRange.br.y
};
}
this.backRange = backRange;
}
return backRange;
};
_proto._isFieldInView = function _isFieldInView(field, value, view) {
var flag = false;
var scales = view.get('scales');
var fieldScale = scales[field];
if (fieldScale && fieldScale.values) {
flag = Util.inArray(fieldScale.values, value);
}
return flag;
};
_proto._bindClickEvent = function _bindClickEvent(legend, scale, filterVals) {
var self = this;
var chart = self.chart;
var views = chart.get('views');
var field = scale.field;
var options = self.options;
legend.on('itemclick', function (ev) {
if (options.onClick && options.defaultClickHandlerEnabled !== true) {
options.onClick(ev);
} else {
// if 'defaultClickHandlerEnabled' is true the default click behavior would be worked.
var item = ev.item;
var checked = ev.checked;
var isSingleSelected = legend.get('selectedMode') === 'single'; // 图例的选中模式
var clickedValue = item.dataValue; // import: 需要取该图例项原始的数值
if (checked) {
Util.Array.remove(filterVals, clickedValue);
if (self._isFieldInView(field, clickedValue, chart)) {
chart.filter(field, function (field) {
return isSingleSelected ? field === clickedValue : !Util.inArray(filterVals, field);
});
}
Util.each(views, function (view) {
if (self._isFieldInView(field, clickedValue, view)) {
view.filter(field, function (field) {
return isSingleSelected ? field === clickedValue : !Util.inArray(filterVals, field);
});
}
});
} else if (!isSingleSelected) {
filterVals.push(clickedValue);
if (self._isFieldInView(field, clickedValue, chart)) {
chart.filter(field, function (field) {
return !Util.inArray(filterVals, field);
});
}
Util.each(views, function (view) {
if (self._isFieldInView(field, clickedValue, view)) {
view.filter(field, function (field) {
return !Util.inArray(filterVals, field);
});
}
});
}
if (options.onClick) {
options.onClick(ev);
}
chart.set('keepLegend', true); // 图例不重新渲染
chart.set('keepPadding', true); // 边框不重新计算
chart.repaint();
chart.set('keepPadding', false);
chart.set('keepLegend', false);
}
});
};
_proto._bindClickEventForMix = function _bindClickEventForMix(legend) {
var self = this;
var chart = self.chart;
var geoms = chart.getAllGeoms();
legend.on('itemclick', function (ev) {
var itemField = ev.item.field;
var checked = ev.checked;
if (checked) {
Util.each(geoms, function (geom) {
var field = geom.getYScale().field;
if (field === itemField) {
geom.show();
}
});
} else {
Util.each(geoms, function (geom) {
var field = geom.getYScale().field;
if (field === itemField) {
geom.hide();
}
});
}
});
};
_proto._filterLabels = function _filterLabels(shape, geom, visible) {
if (shape.get('gLabel')) {
shape.get('gLabel').set('visible', visible);
} else {
var labelCfg = geom.get('labelCfg');
if (labelCfg && labelCfg.fields && labelCfg.fields.length > 0) {
var xScale = geom.getXScale();
var yScale = geom.getYScale();
var xField = xScale.field;
var yField = yScale.field;
var shapeData = shape.get('origin')._origin;
var labelContainer = geom.get('labelContainer');
var labels = labelContainer.get('labelsGroup').get('children');
Util.each(labels, function (label) {
var labelData = label.get('origin') || [];
if (labelData[xField] === shapeData[xField] && labelData[yField] === shapeData[yField]) {
label.set('visible', visible);
shape.set('gLabel', label);
}
});
}
}
};
_proto._bindFilterEvent = function _bindFilterEvent(legend, scale) {
var self = this;
var chart = this.chart;
var field = scale.field;
legend.on('itemfilter', function (ev) {
var range = ev.range;
chart.filterShape(function (obj, shape, geom) {
// @2018-12-21 by blue.lb 由于数值0直接被类型转换为false这里需要做更精确一点的判断
if (!Util.isNil(obj[field])) {
var filtered = obj[field] >= range[0] && obj[field] <= range[1]; // shape 带 label则还需要隐藏 label
self._filterLabels(shape, geom, filtered);
return filtered;
}
return true;
});
var geoms = chart.getAllGeoms() || [];
var _loop = function _loop(i) {
var geom = geoms[i];
if (geom.get('type') === 'heatmap') {
requireAnimationFrameFn(function () {
geom.drawWithRange(range);
});
}
};
for (var i = 0; i < geoms.length; i++) {
_loop(i);
}
});
};
_proto._getShapeData = function _getShapeData(shape) {
var originData = shape.get('origin');
if (Util.isArray(originData)) {
originData = originData[0];
}
return originData[FIELD_ORIGIN];
};
_proto._bindHoverEvent = function _bindHoverEvent(legend, field) {
var self = this;
var chart = self.chart;
var geoms = chart.getAllGeoms();
var options = self.options;
var canvas = chart.get('canvas');
legend.on('itemhover', function (ev) {
var value = ev.item.value;
var pre = self.pre;
if (!pre) {
Util.each(geoms, function (geom) {
var shapeContainer = geom.get('shapeContainer');
var shapes = geom.getShapes();
var activeShapes = [];
if (field) {
var scale = geom.get('scales')[field];
Util.each(shapes, function (shape) {
var origin = self._getShapeData(shape);
if (origin && _snapEqual(origin[field], value, scale)) {
activeShapes.push(shape);
}
});
} else if (geom.getYScale().field === value) {
activeShapes = shapes;
}
if (!Util.isEmpty(activeShapes)) {
ev.shapes = activeShapes;
ev.geom = geom;
if (options.onHover) {
options.onHover(ev);
shapeContainer.sort();
canvas.draw();
} else {
geom.setShapesActived(activeShapes);
}
}
});
self.pre = value;
} else if (pre === value) {
return;
}
});
legend.on('itemunhover', function (ev) {
self.pre = null;
if (options.onUnhover) {
options.onUnhover(ev);
}
Util.each(geoms, function (geom) {
if (geom.get('activeShapes')) {
geom.clearActivedShapes();
canvas.draw();
}
});
});
};
_proto._isFiltered = function _isFiltered(scale, filterVals, scaleValue) {
if (!scale.isCategory) {
return true;
}
var rst = true;
scaleValue = scale.invert(scaleValue);
Util.each(filterVals, function (val) {
if (scale.getText(val) === scale.getText(scaleValue)) {
rst = false;
return false;
}
});
return rst;
};
_proto._alignLegend = function _alignLegend(legend, pre, region, position) {
var self = this;
var viewTheme = self.viewTheme;
var container = self.container;
var canvas = container.get('canvas');
var width = canvas.get('width');
var height = canvas.get('height');
var totalRegion = self.totalRegion;
var plotRange = self.plotRange;
var backRange = self.getBackRange(); // 背景占得范围
var offsetX = legend.get('offset')[0] || 0;
var offsetY = legend.get('offset')[1] || 0; // const offset = Util.isNil(legend.get('offset')) ? MARGIN : legend.get('offset');
var legendHeight = legend.getHeight();
var legendWidth = legend.getWidth();
var borderMargin = viewTheme.legend.margin;
var innerMargin = viewTheme.legend.legendMargin;
var legendNum = self.legends[position].length;
var posArray = position.split('-');
var x = 0;
var y = 0;
var tempoRegion = legendNum > 1 ? totalRegion : region;
if (posArray[0] === 'left' || posArray[0] === 'right') {
height = plotRange.br.y;
x = self._getXAlign(posArray[0], width, region, backRange, legendWidth, borderMargin);
if (pre) {
// @2018-10-19 by blue.lb 由于legend中并不存在y属性这里需要先获取group再获取y值
// @2019-03-21 by blue.lb 由于内部实现问题usehtml部分的实例可以直接获取x、y的
y = (pre.get('y') || pre.get('group').get('y')) + pre.getHeight() + innerMargin;
} else {
y = self._getYAlignVertical(posArray[1], height, tempoRegion, backRange, 0, borderMargin, canvas.get('height'));
}
} else if (posArray[0] === 'top' || posArray[0] === 'bottom') {
y = self._getYAlignHorizontal(posArray[0], height, region, backRange, legendHeight, borderMargin);
if (pre) {
var preWidth = pre.getWidth(); // @2018-10-19 by blue.lb 由于legend中并不存在x属性这里需要先获取group再获取x值
// @2019-03-21 by blue.lb 由于内部实现问题usehtml部分的实例可以直接获取x、y的
x = (pre.get('x') || pre.get('group').get('x')) + preWidth + innerMargin;
} else {
x = self._getXAlign(posArray[1], width, tempoRegion, backRange, 0, borderMargin);
if (posArray[1] === 'right') x = plotRange.br.x - tempoRegion.totalWidth;
}
}
legend.move(x + offsetX, y + offsetY);
};
_proto._getXAlign = function _getXAlign(pos, width, region, backRange, legendWidth, borderMargin) {
var leftPos = backRange.minX - legendWidth - borderMargin[3] < 0 ? 0 : backRange.minX - legendWidth - borderMargin[3];
var x = pos === 'left' ? leftPos : backRange.maxX + borderMargin[1];
if (pos === 'center') {
x = (width - region.totalWidth) / 2;
}
return x;
};
_proto._getYAlignHorizontal = function _getYAlignHorizontal(pos, height, region, backRange, legendHeight, borderMargin) {
var y = pos === 'top' ? backRange.minY - legendHeight - borderMargin[0] : backRange.maxY + borderMargin[2];
return y;
};
_proto._getYAlignVertical = function _getYAlignVertical(pos, height, region, backRange, legendHeight, borderMargin, canvasHeight) {
var y = pos === 'top' ? backRange.minY - legendHeight - borderMargin[0] : height - region.totalHeight;
if (pos === 'center') {
y = (canvasHeight - region.totalHeight) / 2;
}
return y;
};
_proto._getSubRegion = function _getSubRegion(legends) {
var maxWidth = 0;
var maxHeight = 0;
var totalWidth = 0;
var totalHeight = 0;
Util.each(legends, function (legend) {
var width = legend.getWidth();
var height = legend.getHeight();
if (maxWidth < width) {
maxWidth = width;
}
totalWidth += width;
if (maxHeight < height) {
maxHeight = height;
}
totalHeight += height;
});
return {
maxWidth: maxWidth,
totalWidth: totalWidth,
maxHeight: maxHeight,
totalHeight: totalHeight
};
};
_proto._getRegion = function _getRegion() {
var self = this;
var viewTheme = self.viewTheme;
var legends = self.legends;
var innerMargin = viewTheme.legend.legendMargin;
var subs = [];
var totalWidth = 0;
var totalHeight = 0;
Util.each(legends, function (legendItems) {
var subRegion = self._getSubRegion(legendItems);
subs.push(subRegion);
totalWidth += subRegion.totalWidth + innerMargin;
totalHeight += subRegion.totalHeight + innerMargin;
});
return {
totalWidth: totalWidth,
totalHeight: totalHeight,
subs: subs
};
};
_proto._addCategoryLegend = function _addCategoryLegend(scale, attr, geom, filterVals, position) {
var self = this;
var field = scale.field;
var legendOptions = self.options;
var fieldOption = legendOptions[field];
if (fieldOption) {
legendOptions = fieldOption;
}
var legends = self.legends;
legends[position] = legends[position] || [];
var container = self.container;
var items = [];
var ticks = scale.getTicks();
var isByAttr = true;
var shapeType = geom.get('shapeType') || 'point';
var shape = geom.getDefaultValue('shape') || 'circle';
if (legendOptions[field] && legendOptions[field].marker) {
// 用户为 field 对应的图例定义了 marker
shape = legendOptions[field].marker;
shapeType = 'point';
isByAttr = false;
} else if (legendOptions.marker) {
shape = legendOptions.marker;
shapeType = 'point';
isByAttr = false;
}
var chart = self.chart;
var viewTheme = self.viewTheme;
var canvas = chart.get('canvas');
var plotRange = self.plotRange;
var posArray = position.split('-');
var maxLength = posArray[0] === 'right' || posArray[0] === 'left' ? plotRange.bl.y - plotRange.tr.y : canvas.get('width');
Util.each(ticks, function (tick) {
var text = tick.text;
var name = text;
var scaleValue = tick.value;
var value = scale.invert(scaleValue);
var cfg = {
isInCircle: geom.isInCircle()
};
var checked = filterVals ? self._isFiltered(scale, filterVals, scaleValue) : true;
var colorAttr = geom.getAttr('color');
var shapeAttr = geom.getAttr('shape');
if (colorAttr) {
// 存在颜色映射
if (colorAttr.callback && colorAttr.callback.length > 1) {
// 多参数映射,阻止程序报错
var restArgs = Array(colorAttr.callback.length - 1).fill('');
cfg.color = colorAttr.mapping.apply(colorAttr, [value].concat(restArgs)).join('') || viewTheme.defaultColor;
} else {
cfg.color = colorAttr.mapping(value).join('') || viewTheme.defaultColor;
}
}
if (isByAttr && shapeAttr) {
// 存在形状映射
if (shapeAttr.callback && shapeAttr.callback.length > 1) {
// 多参数映射,阻止程序报错
var _restArgs = Array(shapeAttr.callback.length - 1).fill('');
shape = shapeAttr.mapping.apply(shapeAttr, [value].concat(_restArgs)).join('');
} else {
shape = shapeAttr.mapping(value).join('');
}
}
var shapeObject = Shape.getShapeFactory(shapeType);
var marker = shapeObject.getMarkerCfg(shape, cfg);
if (Global.legendMarkerRadius) {
marker.radius = Global.legendMarkerRadius;
}
if (Util.isFunction(shape)) {
marker.symbol = shape;
}
items.push({
value: name,
// 图例项显示文本的内容
dataValue: value,
// 图例项对应原始数据中的数值
checked: checked,
marker: marker
});
});
var legendCfg = Util.deepMix({}, viewTheme.legend[posArray[0]], legendOptions[field] || legendOptions, {
viewId: chart.get('_id'),
maxLength: maxLength,
items: items,
container: container,
position: [0, 0]
});
if (legendCfg.title) {
Util.deepMix(legendCfg, {
title: {
text: scale.alias || scale.field
}
});
}
var legend;
if (self._isTailLegend(legendOptions, geom)) {
legendCfg.chart = self.chart;
legendCfg.geom = geom;
legend = new Tail(legendCfg);
} else {
if (legendOptions.useHtml) {
var canvasEle = container.get('canvas').get('el');
container = legendOptions.container;
if (Util.isString(container) && /^\#/.test(container)) {
// 如果传入 dom 节点的 id
var id = container.replace('#', '');
container = document.getElementById(id);
}
if (!container) {
container = canvasEle.parentNode;
}
legendCfg.container = container;
if (legendCfg.legendStyle === undefined) legendCfg.legendStyle = {};
legendCfg.legendStyle.CONTAINER_CLASS = _extends({}, legendCfg.legendStyle.CONTAINER_CLASS, {
position: 'absolute',
overflow: 'auto',
'z-index': canvasEle.style.zIndex === '' ? 1 : parseInt(canvasEle.style.zIndex, 10) + 1
});
if (legendOptions.flipPage) {
legendCfg.legendStyle.CONTAINER_CLASS.height = posArray[0] === 'right' || posArray[0] === 'left' ? maxLength + 'px' : 'auto';
legendCfg.legendStyle.CONTAINER_CLASS.width = !(posArray[0] === 'right' || posArray[0] === 'left') ? maxLength + 'px' : 'auto';
legend = new Legend.CatPageHtml(legendCfg);
} else {
legend = new Legend.CatHtml(legendCfg);
}
} else {
legend = new Legend.Category(legendCfg);
}
}
self._bindClickEvent(legend, scale, filterVals);
legends[position].push(legend);
return legend;
};
_proto._bindChartMove = function _bindChartMove(scale) {
var chart = this.chart;
var legends = this.legends;
chart.on('plotmove', function (ev) {
var selected = false;
if (ev.target) {
var origin = ev.target.get('origin');
if (origin) {
var data = origin[FIELD_ORIGIN] || origin[0][FIELD_ORIGIN];
var field = scale.field;
if (data) {
var value = data[field];
Util.each(legends, function (legendItems) {
Util.each(legendItems, function (legend) {
selected = true;
!legend.destroyed && legend.activate(value);
});
});
}
}
}
if (!selected) {
Util.each(legends, function (legendItems) {
Util.each(legendItems, function (legend) {
!legend.destroyed && legend.deactivate();
});
});
}
});
};
_proto._addContinuousLegend = function _addContinuousLegend(scale, attr, position) {
var self = this;
var legends = self.legends;
legends[position] = legends[position] || [];
var container = self.container;
var field = scale.field;
var ticks = scale.getTicks();
var items = [];
var legend;
var minValue;
var maxValue;
var viewTheme = self.viewTheme;
Util.each(ticks, function (tick) {
var scaleValue = tick.value;
var invertValue = scale.invert(scaleValue);
var attrValue = attr.mapping(invertValue).join('');
items.push({
value: tick.tickValue,
// tick.text
attrValue: attrValue,
color: attrValue,
scaleValue: scaleValue
});
if (scaleValue === 0) {
minValue = true;
}
if (scaleValue === 1) {
maxValue = true;
}
});
if (!minValue) {
items.push({
value: scale.min,
attrValue: attr.mapping(0).join(''),
color: attr.mapping(0).join(''),
scaleValue: 0
});
}
if (!maxValue) {
items.push({
value: scale.max,
attrValue: attr.mapping(1).join(''),
color: attr.mapping(1).join(''),
scaleValue: 1
});
}
var options = self.options;
var posArray = position.split('-');
var defaultCfg = viewTheme.legend[posArray[0]];
if (options && options.slidable === false || options[field] && options[field].slidable === false) {
defaultCfg = Util.mix({}, defaultCfg, viewTheme.legend.gradient);
}
var legendCfg = Util.deepMix({}, defaultCfg, options[field] || options, {
items: items,
attr: attr,
formatter: scale.formatter,
container: container,
position: [0, 0]
});
if (legendCfg.title) {
Util.deepMix(legendCfg, {
title: {
text: scale.alias || scale.field
}
});
}
if (attr.type === 'color') {
legend = new Legend.Color(legendCfg);
} else if (attr.type === 'size') {
if (options && options.sizeType === 'circle') legend = new Legend.CircleSize(legendCfg);else legend = new Legend.Size(legendCfg);
} else {
return;
}
self._bindFilterEvent(legend, scale);
legends[position].push(legend);
return legend;
};
_proto._isTailLegend = function _isTailLegend(opt, geom) {
if (opt.hasOwnProperty('attachLast') && opt.attachLast) {
var geomType = geom.get('type');
if (geomType === 'line' || geomType === 'lineStack' || geomType === 'area' || geomType === 'areaStack') return true;
}
return false;
};
_proto._adjustPosition = function _adjustPosition(position, isTailLegend) {
var pos;
if (isTailLegend) {
pos = 'right-top';
} else if (Util.isArray(position)) {
pos = String(position[0]) + '-' + String(position[1]);
} else {
var posArr = position.split('-');
if (posArr.length === 1) {
// 只用了left/right/bottom/top一个位置定位
if (posArr[0] === 'left') pos = 'left-bottom';
if (posArr[0] === 'right') pos = 'right-bottom';
if (posArr[0] === 'top') pos = 'top-center';
if (posArr[0] === 'bottom') pos = 'bottom-center';
} else {
pos = position;
}
}
return pos;
};
_proto.addLegend = function addLegend(scale, attr, geom, filterVals) {
var self = this;
var legendOptions = self.options;
var field = scale.field;
var fieldOption = legendOptions[field];
var viewTheme = self.viewTheme;
if (fieldOption === false) {
// 如果不显示此图例
return null;
}
if (fieldOption && fieldOption.custom) {
self.addCustomLegend(field);
} else {
var position = legendOptions.position || viewTheme.defaultLegendPosition;
position = self._adjustPosition(position, self._isTailLegend(legendOptions, geom));
if (fieldOption && fieldOption.position) {
// 如果对某个图例单独设置 position则对 position 重新赋值
position = self._adjustPosition(fieldOption.position, self._isTailLegend(fieldOption, geom));
}
var legend;
if (scale.isLinear) {
legend = self._addContinuousLegend(scale, attr, position);
} else {
legend = self._addCategoryLegend(scale, attr, geom, filterVals, position);
}
if (legend) {
self._bindHoverEvent(legend, field);
legendOptions.reactive && self._bindChartMove(scale);
}
}
}
/**
* 自定义图例
* @param {string} field 自定义图例的数据字段名可以为空
* @return {object} legend 自定义图例实例
*/
;
_proto.addCustomLegend = function addCustomLegend(field) {
var self = this;
var chart = self.chart;
var viewTheme = self.viewTheme;
var container = self.container;
var legendOptions = self.options;
if (field) {
legendOptions = legendOptions[field];
}
var position = legendOptions.position || viewTheme.defaultLegendPosition;
position = self._adjustPosition(position);
var legends = self.legends;
legends[position] = legends[position] || [];
var items = legendOptions.items;
if (!items) {
return;
}
var geoms = chart.getAllGeoms();
Util.each(items, function (item) {
var geom = findGeom(geoms, item.value);
if (!Util.isPlainObject(item.marker)) {
// 直接传入字符串或者回调函数时转换为对象,如 item.marker = 'circle'
item.marker = {
symbol: item.marker || 'circle',
radius: Global.legendMarkerRadius || MARKER_SIZE
};
if (Util.indexOf(STROKE_MARKERS, item.marker.symbol) !== -1) {
item.marker.stroke = item.fill;
} else {
item.marker.fill = item.fill;
}
} else {
// 用户传入对象 item.marker = { symbol: 'circle', fill: 'red', radius: 3 }
item.marker.radius = item.marker.radius || Global.legendMarkerRadius || MARKER_SIZE;
}
var symbol = item.marker.symbol;
if (Util.isString(symbol) && symbol.indexOf('hollow') !== -1) {
item.marker.symbol = Util.lowerFirst(symbol.substr(6));
}
item.checked = Util.isNil(item.checked) ? true : item.checked;
item.geom = geom;
});
var canvas = chart.get('canvas');
var plotRange = self.plotRange;
var posArray = position.split('-');
var maxLength = posArray[0] === 'right' || posArray[0] === 'left' ? plotRange.bl.y - plotRange.tr.y : canvas.get('width');
var legendCfg = Util.deepMix({}, viewTheme.legend[posArray[0]], legendOptions, {
maxLength: maxLength,
items: items,
container: container,
position: [0, 0]
});
var legend;
if (legendOptions.useHtml) {
var htmlContainer = legendOptions.container;
if (/^\#/.test(container)) {
// 如果传入 dom 节点的 id
var id = htmlContainer.replace('#', '');
htmlContainer = document.getElementById(id);
} else if (!htmlContainer) {
htmlContainer = container.get('canvas').get('el').parentNode;
}
legendCfg.container = htmlContainer;
if (legendCfg.legendStyle === undefined) legendCfg.legendStyle = {};
if (!legendCfg.legendStyle.CONTAINER_CLASS) {
legendCfg.legendStyle.CONTAINER_CLASS = {
height: posArray[0] === 'right' || posArray[0] === 'left' ? maxLength + 'px' : 'auto',
width: !(posArray[0] === 'right' || posArray[0] === 'left') ? maxLength + 'px' : 'auto',
position: 'absolute',
overflow: 'auto'
};
}
if (legendOptions.flipPage) legend = new Legend.CatPageHtml(legendCfg);else legend = new Legend.CatHtml(legendCfg);
} else legend = new Legend.Category(legendCfg);
legends[position].push(legend);
legend.on('itemclick', function (ev) {
if (legendOptions.onClick) {
// 用户自定义了图例点击事件
legendOptions.onClick(ev);
}
});
self._bindHoverEvent(legend);
return legend;
};
_proto.addMixedLegend = function addMixedLegend(scales, geoms) {
var self = this;
var legendOptions = self.options;
var items = [];
Util.each(scales, function (scale) {
var value = scale.alias || scale.field;
var fieldLegendOptions = legendOptions[scale.field];
Util.each(geoms, function (geom) {
if (geom.getYScale() === scale && scale.values && scale.values.length > 0 && fieldLegendOptions !== false) {
var shapeType = geom.get('shapeType') || 'point';
var shape = geom.getDefaultValue('shape') || 'circle';
var shapeObject = Shape.getShapeFactory(shapeType);
var cfg = {
color: geom.getDefaultValue('color')
};
var marker = shapeObject.getMarkerCfg(shape, cfg);
if (Global.legendMarkerRadius) {
marker.radius = Global.legendMarkerRadius;
}
var item = {
value: value,
marker: marker,
field: scale.field
};
items.push(item);
}
}); // end of geom loop
}); // end of scale loop
var options = {
custom: true,
items: items
};
self.options = Util.deepMix({}, options, self.options);
var legend = self.addCustomLegend();
self._bindClickEventForMix(legend);
};
_proto.alignLegends = function alignLegends() {
var self = this;
var legends = self.legends;
var totalRegion = self._getRegion(legends);
self.totalRegion = totalRegion;
var i = 0;
Util.each(legends, function (legendItems, position) {
var region =
/* self._getRegion(legendItems)*/
totalRegion.subs[i];
Util.each(legendItems, function (legend, index) {
var pre = legendItems[index - 1];
if (!(legend.get('useHtml') && !legend.get('autoPosition'))) {
self._alignLegend(legend, pre, region, position);
}
});
i++;
});
return this;
};
return LegendController;
}();
module.exports = LegendController;