653 lines
21 KiB
Java
653 lines
21 KiB
Java
![]() |
function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|||
|
|
|||
|
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
|||
|
|
|||
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|||
|
|
|||
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
|
|||
|
|
|||
|
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
var Util = require('../util');
|
|||
|
|
|||
|
var Category = require('./category');
|
|||
|
|
|||
|
var _require = require('../const'),
|
|||
|
FONT_FAMILY = _require.FONT_FAMILY;
|
|||
|
|
|||
|
var DomUtil = Util.DomUtil;
|
|||
|
var Group = Util.Group;
|
|||
|
var CONTAINER_CLASS = 'g2-legend';
|
|||
|
var TITLE_CLASS = 'g2-legend-title';
|
|||
|
var LIST_CLASS = 'g2-legend-list';
|
|||
|
var ITEM_CLASS = 'g2-legend-list-item';
|
|||
|
var TEXT_CLASS = 'g2-legend-text';
|
|||
|
var MARKER_CLASS = 'g2-legend-marker'; // find a dom node from the chidren of the node with className.
|
|||
|
|
|||
|
function findNodeByClass(node, className) {
|
|||
|
return node.getElementsByClassName(className)[0];
|
|||
|
}
|
|||
|
|
|||
|
function getParentNode(node, className) {
|
|||
|
var nodeClass = node.className;
|
|||
|
|
|||
|
if (Util.isNil(nodeClass)) {
|
|||
|
return node;
|
|||
|
}
|
|||
|
|
|||
|
nodeClass = nodeClass.split(' ');
|
|||
|
|
|||
|
if (nodeClass.indexOf(className) > -1) {
|
|||
|
return node;
|
|||
|
}
|
|||
|
|
|||
|
if (node.parentNode) {
|
|||
|
if (node.parentNode.className === CONTAINER_CLASS) {
|
|||
|
return node.parentNode;
|
|||
|
}
|
|||
|
|
|||
|
return getParentNode(node.parentNode, className);
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
function findItem(items, refer) {
|
|||
|
var rst = null;
|
|||
|
var value = refer instanceof Group ? refer.get('value') : refer;
|
|||
|
Util.each(items, function (item) {
|
|||
|
if (item.value === value) {
|
|||
|
rst = item;
|
|||
|
return false;
|
|||
|
}
|
|||
|
});
|
|||
|
return rst;
|
|||
|
}
|
|||
|
|
|||
|
var CatHtml = /*#__PURE__*/function (_Category) {
|
|||
|
_inheritsLoose(CatHtml, _Category);
|
|||
|
|
|||
|
var _super = _createSuper(CatHtml);
|
|||
|
|
|||
|
function CatHtml() {
|
|||
|
return _Category.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = CatHtml.prototype;
|
|||
|
|
|||
|
_proto.getDefaultCfg = function getDefaultCfg() {
|
|||
|
var cfg = _Category.prototype.getDefaultCfg.call(this);
|
|||
|
|
|||
|
return Util.mix({}, cfg, {
|
|||
|
/**
|
|||
|
* type 标识
|
|||
|
* @type {String}
|
|||
|
*/
|
|||
|
type: 'category-legend',
|
|||
|
|
|||
|
/**
|
|||
|
* html 容器
|
|||
|
* @type {DOM}
|
|||
|
*/
|
|||
|
container: null,
|
|||
|
|
|||
|
/**
|
|||
|
* 使用html时的外层模板
|
|||
|
* @type {String}
|
|||
|
*/
|
|||
|
containerTpl: '<div class="' + CONTAINER_CLASS + '">' + '<h4 class="' + TITLE_CLASS + '"></h4>' + '<ul class="' + LIST_CLASS + '"></ul>' + '</div>',
|
|||
|
|
|||
|
/**
|
|||
|
* html 模板
|
|||
|
* @type {String|Function}
|
|||
|
*/
|
|||
|
itemTpl: '<li class="' + ITEM_CLASS + ' item-{index} {checked}" data-color="{originColor}" data-value="{originValue}">' + '<i class="' + MARKER_CLASS + '" style="background-color:{color};"></i>' + '<span class="' + TEXT_CLASS + '">{value}</span></li>',
|
|||
|
|
|||
|
/**
|
|||
|
* html style
|
|||
|
* @type {Attrs}
|
|||
|
*/
|
|||
|
legendStyle: {},
|
|||
|
|
|||
|
/**
|
|||
|
* 图例文字样式
|
|||
|
* @type {ATTRS}
|
|||
|
*/
|
|||
|
textStyle: {
|
|||
|
fill: '#333',
|
|||
|
fontSize: 12,
|
|||
|
textAlign: 'middle',
|
|||
|
textBaseline: 'top',
|
|||
|
fontFamily: FONT_FAMILY
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 当文本太长时是否进行缩略
|
|||
|
* @type {Boolean}
|
|||
|
*/
|
|||
|
abridgeText: false,
|
|||
|
|
|||
|
/**
|
|||
|
* abridgeText 为 true 时,鼠标放置在 item 上时显示全称的悬浮 div 的 html 模板
|
|||
|
* @type {String}
|
|||
|
*/
|
|||
|
tipTpl: '<div class="textTip"></div>',
|
|||
|
|
|||
|
/**
|
|||
|
* abridgeText 为 true 时,鼠标放置在 item 上时显示全称的悬浮 div 的样式
|
|||
|
* @type {Attrs}
|
|||
|
*/
|
|||
|
tipStyle: {
|
|||
|
display: 'none',
|
|||
|
fontSize: '12px',
|
|||
|
backgroundColor: '#fff',
|
|||
|
position: 'absolute',
|
|||
|
width: 'auto',
|
|||
|
height: 'auto',
|
|||
|
padding: '3px',
|
|||
|
boxShadow: '2px 2px 5px #888'
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* useHtml 为 true 时生效,用于自动定位
|
|||
|
* @type {[type]}
|
|||
|
*/
|
|||
|
autoPosition: true
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
_proto._init = function _init() {
|
|||
|
return;
|
|||
|
};
|
|||
|
|
|||
|
_proto.beforeRender = function beforeRender() {
|
|||
|
return;
|
|||
|
};
|
|||
|
|
|||
|
_proto.render = function render() {
|
|||
|
this._renderHTML();
|
|||
|
} // user interaction
|
|||
|
;
|
|||
|
|
|||
|
_proto._bindEvents = function _bindEvents() {
|
|||
|
var _this = this;
|
|||
|
|
|||
|
var legendWrapper = this.get('legendWrapper');
|
|||
|
var itemListDom = findNodeByClass(legendWrapper, LIST_CLASS);
|
|||
|
|
|||
|
if (this.get('hoverable')) {
|
|||
|
itemListDom.onmousemove = function (ev) {
|
|||
|
return _this._onMousemove(ev);
|
|||
|
};
|
|||
|
|
|||
|
itemListDom.onmouseout = function (ev) {
|
|||
|
return _this._onMouseleave(ev);
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
if (this.get('clickable')) {
|
|||
|
itemListDom.onclick = function (ev) {
|
|||
|
return _this._onClick(ev);
|
|||
|
};
|
|||
|
}
|
|||
|
} // mouse move listener of an item
|
|||
|
// when mouse over an item, reduce the opacity of the other items.
|
|||
|
;
|
|||
|
|
|||
|
_proto._onMousemove = function _onMousemove(ev) {
|
|||
|
var items = this.get('items');
|
|||
|
var target = ev.target;
|
|||
|
var targetClass = target.className;
|
|||
|
targetClass = targetClass.split(' ');
|
|||
|
|
|||
|
if (targetClass.indexOf(CONTAINER_CLASS) > -1 || targetClass.indexOf(LIST_CLASS) > -1) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var parentDom = getParentNode(target, ITEM_CLASS);
|
|||
|
var hoveredItem = findItem(items, parentDom.getAttribute('data-value'));
|
|||
|
|
|||
|
if (hoveredItem) {
|
|||
|
// change the opacity of other items
|
|||
|
this.deactivate();
|
|||
|
this.activate(parentDom.getAttribute('data-value'));
|
|||
|
this.emit('itemhover', {
|
|||
|
item: hoveredItem,
|
|||
|
currentTarget: parentDom,
|
|||
|
checked: hoveredItem.checked
|
|||
|
});
|
|||
|
} else if (!hoveredItem) {
|
|||
|
// restore the opacity of all the items
|
|||
|
this.deactivate();
|
|||
|
this.emit('itemunhover', ev);
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
} // mouse leave listener of an item
|
|||
|
;
|
|||
|
|
|||
|
_proto._onMouseleave = function _onMouseleave(ev) {
|
|||
|
// restore the opacity of all the items when mouse leave
|
|||
|
this.deactivate();
|
|||
|
this.emit('itemunhover', ev);
|
|||
|
return;
|
|||
|
} // the click listener of an item
|
|||
|
;
|
|||
|
|
|||
|
_proto._onClick = function _onClick(ev) {
|
|||
|
var _this2 = this;
|
|||
|
|
|||
|
var legendWrapper = this.get('legendWrapper');
|
|||
|
var itemListDom = findNodeByClass(legendWrapper, LIST_CLASS);
|
|||
|
var unCheckedColor = this.get('unCheckColor');
|
|||
|
var items = this.get('items');
|
|||
|
var mode = this.get('selectedMode');
|
|||
|
var childNodes = itemListDom.childNodes;
|
|||
|
var target = ev.target;
|
|||
|
var targetClass = target.className;
|
|||
|
targetClass = targetClass.split(' ');
|
|||
|
|
|||
|
if (targetClass.indexOf(CONTAINER_CLASS) > -1 || targetClass.indexOf(LIST_CLASS) > -1) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var parentDom = getParentNode(target, ITEM_CLASS);
|
|||
|
var textDom = findNodeByClass(parentDom, TEXT_CLASS);
|
|||
|
var markerDom = findNodeByClass(parentDom, MARKER_CLASS);
|
|||
|
var clickedItem = findItem(items, parentDom.getAttribute('data-value'));
|
|||
|
|
|||
|
if (!clickedItem) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var domClass = parentDom.className;
|
|||
|
var originColor = parentDom.getAttribute('data-color');
|
|||
|
|
|||
|
if (mode === 'single') {
|
|||
|
// 单选模式
|
|||
|
// update checked status
|
|||
|
clickedItem.checked = true; // 其他图例项全部置灰
|
|||
|
|
|||
|
Util.each(childNodes, function (child) {
|
|||
|
if (child !== parentDom) {
|
|||
|
var childMarkerDom = findNodeByClass(child, MARKER_CLASS);
|
|||
|
childMarkerDom.style.backgroundColor = unCheckedColor;
|
|||
|
child.className = child.className.replace('checked', 'unChecked');
|
|||
|
child.style.color = unCheckedColor;
|
|||
|
var childItem = findItem(items, child.getAttribute('data-value'));
|
|||
|
childItem.checked = false;
|
|||
|
} else {
|
|||
|
if (textDom) {
|
|||
|
textDom.style.color = _this2.get('textStyle').fill;
|
|||
|
}
|
|||
|
|
|||
|
if (markerDom) {
|
|||
|
markerDom.style.backgroundColor = originColor;
|
|||
|
}
|
|||
|
|
|||
|
parentDom.className = domClass.replace('unChecked', 'checked');
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
// 混合模式
|
|||
|
var clickedItemChecked = domClass.indexOf('checked') !== -1; // domClass.includes('checked');
|
|||
|
|
|||
|
var count = 0;
|
|||
|
Util.each(childNodes, function (child) {
|
|||
|
if (child.className.indexOf('checked') !== -1) {
|
|||
|
// .includes('checked')
|
|||
|
count++;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (!this.get('allowAllCanceled') && clickedItemChecked && count === 1) {
|
|||
|
this.emit('clicklastitem', {
|
|||
|
item: clickedItem,
|
|||
|
currentTarget: parentDom,
|
|||
|
checked: mode === 'single' ? true : clickedItem.checked
|
|||
|
});
|
|||
|
return;
|
|||
|
} // 在判断最后一个图例后再更新checked状态,防止点击最后一个图例item时图例样式没有变化但是checked状态改变了 fix #422
|
|||
|
|
|||
|
|
|||
|
clickedItem.checked = !clickedItem.checked;
|
|||
|
|
|||
|
if (clickedItemChecked) {
|
|||
|
if (markerDom) {
|
|||
|
markerDom.style.backgroundColor = unCheckedColor;
|
|||
|
}
|
|||
|
|
|||
|
parentDom.className = domClass.replace('checked', 'unChecked');
|
|||
|
parentDom.style.color = unCheckedColor;
|
|||
|
} else {
|
|||
|
if (markerDom) {
|
|||
|
markerDom.style.backgroundColor = originColor;
|
|||
|
}
|
|||
|
|
|||
|
parentDom.className = domClass.replace('unChecked', 'checked');
|
|||
|
parentDom.style.color = this.get('textStyle').fill;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
this.emit('itemclick', {
|
|||
|
item: clickedItem,
|
|||
|
currentTarget: parentDom,
|
|||
|
checked: mode === 'single' ? true : clickedItem.checked
|
|||
|
});
|
|||
|
return;
|
|||
|
} // activate an item by reduce the opacity of other items.
|
|||
|
// it is reserved for bi-direction interaction between charts / graph and legend
|
|||
|
;
|
|||
|
|
|||
|
_proto.activate = function activate(value) {
|
|||
|
var _this3 = this;
|
|||
|
|
|||
|
var self = this;
|
|||
|
var items = self.get('items');
|
|||
|
var item = findItem(items, value);
|
|||
|
var legendWrapper = self.get('legendWrapper');
|
|||
|
var itemListDom = findNodeByClass(legendWrapper, LIST_CLASS);
|
|||
|
var childNodes = itemListDom.childNodes;
|
|||
|
childNodes.forEach(function (child) {
|
|||
|
var childMarkerDom = findNodeByClass(child, MARKER_CLASS);
|
|||
|
var childItem = findItem(items, child.getAttribute('data-value'));
|
|||
|
|
|||
|
if (_this3.get('highlight')) {
|
|||
|
if (childItem === item && childItem.checked) {
|
|||
|
childMarkerDom.style.border = '1px solid #333';
|
|||
|
return;
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (childItem === item) {
|
|||
|
childMarkerDom.style.opacity = self.get('activeOpacity');
|
|||
|
} else {
|
|||
|
if (childItem.checked) childMarkerDom.style.opacity = self.get('inactiveOpacity');
|
|||
|
}
|
|||
|
} // if (childItem !== item && childItem.checked) {
|
|||
|
// if (this.get('highlight')) {
|
|||
|
// childMarkerDom.style.border = '1px solid #fff';
|
|||
|
// } else childMarkerDom.style.opacity = 0.5;
|
|||
|
// } else {
|
|||
|
// if (this.get('highlight')) {
|
|||
|
// childMarkerDom.style.border = '1px solid #333';
|
|||
|
// } else childMarkerDom.style.opacity = 1;
|
|||
|
// }
|
|||
|
|
|||
|
});
|
|||
|
return;
|
|||
|
} // restore the opacity of items
|
|||
|
// it is reserved for bi-direction interaction between charts / graph and legend
|
|||
|
;
|
|||
|
|
|||
|
_proto.deactivate = function deactivate() {
|
|||
|
var _this4 = this;
|
|||
|
|
|||
|
var self = this;
|
|||
|
var legendWrapper = self.get('legendWrapper');
|
|||
|
var itemListDom = findNodeByClass(legendWrapper, LIST_CLASS);
|
|||
|
var childNodes = itemListDom.childNodes;
|
|||
|
childNodes.forEach(function (child) {
|
|||
|
var childMarkerDom = findNodeByClass(child, MARKER_CLASS);
|
|||
|
|
|||
|
if (_this4.get('highlight')) {
|
|||
|
childMarkerDom.style.border = '1px solid #fff';
|
|||
|
} else {
|
|||
|
childMarkerDom.style.opacity = self.get('inactiveOpacity');
|
|||
|
}
|
|||
|
});
|
|||
|
return;
|
|||
|
};
|
|||
|
|
|||
|
_proto._renderHTML = function _renderHTML() {
|
|||
|
var _this5 = this;
|
|||
|
|
|||
|
// const canvas = this.get('canvas');
|
|||
|
var container = this.get('container'); // const outterNode = container.parentNode;
|
|||
|
|
|||
|
var title = this.get('title');
|
|||
|
var containerTpl = this.get('containerTpl');
|
|||
|
var legendWrapper = DomUtil.createDom(containerTpl);
|
|||
|
var titleDom = findNodeByClass(legendWrapper, TITLE_CLASS);
|
|||
|
var itemListDom = findNodeByClass(legendWrapper, LIST_CLASS); // ul
|
|||
|
|
|||
|
var unCheckedColor = this.get('unCheckColor');
|
|||
|
var LEGEND_STYLE = Util.deepMix({}, {
|
|||
|
CONTAINER_CLASS: {
|
|||
|
height: 'auto',
|
|||
|
width: 'auto',
|
|||
|
position: 'absolute',
|
|||
|
overflowY: 'auto',
|
|||
|
fontSize: '12px',
|
|||
|
fontFamily: FONT_FAMILY,
|
|||
|
lineHeight: '20px',
|
|||
|
color: '#8C8C8C'
|
|||
|
},
|
|||
|
TITLE_CLASS: {
|
|||
|
marginBottom: this.get('titleGap') + 'px',
|
|||
|
fontSize: '12px',
|
|||
|
color: '#333',
|
|||
|
// 默认样式
|
|||
|
textBaseline: 'middle',
|
|||
|
fontFamily: FONT_FAMILY
|
|||
|
},
|
|||
|
LIST_CLASS: {
|
|||
|
listStyleType: 'none',
|
|||
|
margin: 0,
|
|||
|
padding: 0,
|
|||
|
textAlign: 'center'
|
|||
|
},
|
|||
|
LIST_ITEM_CLASS: {
|
|||
|
cursor: 'pointer',
|
|||
|
marginBottom: '5px',
|
|||
|
marginRight: '24px'
|
|||
|
},
|
|||
|
MARKER_CLASS: {
|
|||
|
width: '9px',
|
|||
|
height: '9px',
|
|||
|
borderRadius: '50%',
|
|||
|
display: 'inline-block',
|
|||
|
marginRight: '4px',
|
|||
|
verticalAlign: 'middle'
|
|||
|
}
|
|||
|
}, this.get('legendStyle')); // fix:IE 9 兼容问题,先加入 legendWrapper
|
|||
|
// let container = this.get('container');
|
|||
|
|
|||
|
if (/^\#/.test(container) || typeof container === 'string' && container.constructor === String) {
|
|||
|
// 如果传入 dom 节点的 id
|
|||
|
var id = container.replace('#', '');
|
|||
|
container = document.getElementById(id);
|
|||
|
container.appendChild(legendWrapper);
|
|||
|
} else {
|
|||
|
var _position = this.get('position');
|
|||
|
|
|||
|
var rangeStyle = {};
|
|||
|
|
|||
|
if (_position === 'left' || _position === 'right') {
|
|||
|
rangeStyle = {
|
|||
|
maxHeight: (this.get('maxLength') || container.offsetHeight) + 'px'
|
|||
|
};
|
|||
|
} else {
|
|||
|
rangeStyle = {
|
|||
|
maxWidth: (this.get('maxLength') || container.offsetWidth) + 'px'
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
DomUtil.modifyCSS(legendWrapper, Util.mix({}, LEGEND_STYLE.CONTAINER_CLASS, rangeStyle, this.get(CONTAINER_CLASS)));
|
|||
|
container.appendChild(legendWrapper);
|
|||
|
}
|
|||
|
|
|||
|
DomUtil.modifyCSS(itemListDom, Util.mix({}, LEGEND_STYLE.LIST_CLASS, this.get(LIST_CLASS))); // render title
|
|||
|
|
|||
|
if (titleDom) {
|
|||
|
if (title && title.text) {
|
|||
|
titleDom.innerHTML = title.text;
|
|||
|
DomUtil.modifyCSS(titleDom, Util.mix({}, LEGEND_STYLE.TITLE_CLASS, this.get(TITLE_CLASS), title));
|
|||
|
} else {
|
|||
|
legendWrapper.removeChild(titleDom);
|
|||
|
}
|
|||
|
} // 开始渲染图例项
|
|||
|
|
|||
|
|
|||
|
var items = this.get('items');
|
|||
|
var itemTpl = this.get('itemTpl');
|
|||
|
var position = this.get('position');
|
|||
|
var layout = this.get('layout');
|
|||
|
var itemDisplay = position === 'right' || position === 'left' || layout === 'vertical' ? 'block' : 'inline-block';
|
|||
|
var itemStyle = Util.mix({}, LEGEND_STYLE.LIST_ITEM_CLASS, {
|
|||
|
display: itemDisplay
|
|||
|
}, this.get(ITEM_CLASS));
|
|||
|
var markerStyle = Util.mix({}, LEGEND_STYLE.MARKER_CLASS, this.get(MARKER_CLASS));
|
|||
|
Util.each(items, function (item, index) {
|
|||
|
var checked = item.checked;
|
|||
|
|
|||
|
var value = _this5._formatItemValue(item.value);
|
|||
|
|
|||
|
var markerColor = item.marker.fill || item.marker.stroke;
|
|||
|
var color = checked ? markerColor : unCheckedColor;
|
|||
|
var domStr;
|
|||
|
|
|||
|
if (Util.isFunction(itemTpl)) {
|
|||
|
domStr = itemTpl(value, color, checked, index);
|
|||
|
} else {
|
|||
|
domStr = itemTpl;
|
|||
|
}
|
|||
|
|
|||
|
var itemDiv = Util.substitute(domStr, Util.mix({}, item, {
|
|||
|
index: index,
|
|||
|
checked: checked ? 'checked' : 'unChecked',
|
|||
|
value: value,
|
|||
|
color: color,
|
|||
|
originColor: markerColor,
|
|||
|
// @2018-07-09 by blue.lb 修复如果legend值中存在双引号"时, 导致的无法点击触发legend正常操作bug
|
|||
|
originValue: item.value.replace(/\"/g, '"')
|
|||
|
})); // li
|
|||
|
|
|||
|
var itemDom = DomUtil.createDom(itemDiv);
|
|||
|
itemDom.style.color = _this5.get('textStyle').fill;
|
|||
|
var markerDom = findNodeByClass(itemDom, MARKER_CLASS);
|
|||
|
var textDom = findNodeByClass(itemDom, TEXT_CLASS);
|
|||
|
DomUtil.modifyCSS(itemDom, itemStyle);
|
|||
|
markerDom && DomUtil.modifyCSS(markerDom, markerStyle); // textDom && DomUtil.modifyCSS(textDom, this.get('textStyle'));
|
|||
|
|
|||
|
if (!checked) {
|
|||
|
itemDom.style.color = unCheckedColor;
|
|||
|
|
|||
|
if (markerDom) {
|
|||
|
markerDom.style.backgroundColor = unCheckedColor;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
itemListDom.appendChild(itemDom); // abridge the text if the width of the text exceeds the width of the item
|
|||
|
|
|||
|
if (_this5.get('abridgeText')) {
|
|||
|
var text = value; // const itemWidth = parseFloat(this.get(ITEM_CLASS).width.substr(0, this.get(ITEM_CLASS).width.length - 2));
|
|||
|
|
|||
|
var itemWidth = itemDom.offsetWidth;
|
|||
|
|
|||
|
var fs = _this5.get('textStyle').fontSize;
|
|||
|
|
|||
|
if (isNaN(fs)) {
|
|||
|
// 6.5pt = 6.5 * 1/72 * 96 = 8.6px
|
|||
|
if (fs.indexOf('pt') !== -1) fs = parseFloat(fs.substr(0, fs.length - 2)) * 1 / 72 * 96;else if (fs.indexOf('px') !== -1) fs = parseFloat(fs.substr(0, fs.length - 2));
|
|||
|
}
|
|||
|
|
|||
|
var textWidth = fs * text.length;
|
|||
|
var letterNum = Math.floor(itemWidth / fs);
|
|||
|
|
|||
|
if (itemWidth < 2 * fs) {
|
|||
|
// unable to contain '...'
|
|||
|
text = '';
|
|||
|
} else if (itemWidth < textWidth) {
|
|||
|
// replace the tail as '...
|
|||
|
if (letterNum > 1) text = text.substr(0, letterNum - 1) + '...';
|
|||
|
}
|
|||
|
|
|||
|
textDom.innerText = text; // show the text tip while mouse hovering an item
|
|||
|
|
|||
|
itemDom.addEventListener('mouseover', function () {
|
|||
|
var tipDom = findNodeByClass(legendWrapper.parentNode, 'textTip');
|
|||
|
tipDom.style.display = 'block';
|
|||
|
tipDom.style.left = itemDom.offsetLeft + itemDom.offsetWidth + 'px';
|
|||
|
tipDom.style.top = itemDom.offsetTop + 15 + 'px';
|
|||
|
tipDom.innerText = value;
|
|||
|
}); // hide the text tip while mouse leave the item
|
|||
|
|
|||
|
itemDom.addEventListener('mouseout', function () {
|
|||
|
var tipDom = findNodeByClass(legendWrapper.parentNode, 'textTip');
|
|||
|
tipDom.style.display = 'none';
|
|||
|
});
|
|||
|
}
|
|||
|
}); // append the tip div as a brother node of legend dom
|
|||
|
|
|||
|
if (this.get('abridgeText')) {
|
|||
|
var tipTpl = this.get('tipTpl');
|
|||
|
var tipDom = DomUtil.createDom(tipTpl);
|
|||
|
var tipDomStyle = this.get('tipStyle');
|
|||
|
DomUtil.modifyCSS(tipDom, tipDomStyle);
|
|||
|
legendWrapper.parentNode.appendChild(tipDom); // hide the tip while mouse entering the tip dom
|
|||
|
|
|||
|
tipDom.addEventListener('mouseover', function () {
|
|||
|
tipDom.style.display = 'none';
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
this.set('legendWrapper', legendWrapper);
|
|||
|
};
|
|||
|
|
|||
|
_proto._adjustPositionOffset = function _adjustPositionOffset() {
|
|||
|
var autoPosition = this.get('autoPosition'); // @2018-12-29 by maplor. if autoPosition is false, don't set inline-style
|
|||
|
|
|||
|
if (autoPosition === false) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var position = this.get('position');
|
|||
|
var offset = this.get('offset');
|
|||
|
var offsetX = this.get('offsetX');
|
|||
|
var offsetY = this.get('offsetY');
|
|||
|
if (offsetX) offset[0] = offsetX;
|
|||
|
if (offsetY) offset[1] = offsetY;
|
|||
|
var legendWrapper = this.get('legendWrapper');
|
|||
|
legendWrapper.style.left = position[0] + 'px';
|
|||
|
legendWrapper.style.top = position[1] + 'px';
|
|||
|
legendWrapper.style.marginLeft = offset[0] + 'px';
|
|||
|
legendWrapper.style.marginTop = offset[1] + 'px';
|
|||
|
};
|
|||
|
|
|||
|
_proto.getWidth = function getWidth() {
|
|||
|
return DomUtil.getOuterWidth(this.get('legendWrapper'));
|
|||
|
};
|
|||
|
|
|||
|
_proto.getHeight = function getHeight() {
|
|||
|
return DomUtil.getOuterHeight(this.get('legendWrapper'));
|
|||
|
};
|
|||
|
|
|||
|
_proto.move = function move(x, y) {
|
|||
|
if (!/^\#/.test(this.get('container'))) {
|
|||
|
DomUtil.modifyCSS(this.get('legendWrapper'), {
|
|||
|
left: x + 'px',
|
|||
|
top: y + 'px'
|
|||
|
});
|
|||
|
this.set('x', x);
|
|||
|
this.set('y', y);
|
|||
|
} else {
|
|||
|
_Category.prototype.move.call(this, x, y);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
_proto.destroy = function destroy() {
|
|||
|
var legendWrapper = this.get('legendWrapper');
|
|||
|
|
|||
|
if (legendWrapper && legendWrapper.parentNode) {
|
|||
|
legendWrapper.parentNode.removeChild(legendWrapper);
|
|||
|
}
|
|||
|
|
|||
|
_Category.prototype.destroy.call(this);
|
|||
|
};
|
|||
|
|
|||
|
return CatHtml;
|
|||
|
}(Category);
|
|||
|
|
|||
|
module.exports = CatHtml;
|