UNPKG

@antv/g2plot

Version:

G2 Plot, a market of plots built with the Grammar of Graphics'

213 lines 8.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var _ = tslib_1.__importStar(require("@antv/util")); var global_1 = require("../../base/global"); var layer_1 = tslib_1.__importDefault(require("../pie/layer")); var apply_responsive_1 = tslib_1.__importDefault(require("./apply-responsive")); require("./apply-responsive/theme"); var statisticTemplate = tslib_1.__importStar(require("./component/statistic-template")); var EventParser = tslib_1.__importStar(require("./event")); var G2_GEOM_MAP = { ring: 'interval', }; var PLOT_GEOM_MAP = { interval: 'ring', }; var RingLayer = /** @class */ (function (_super) { tslib_1.__extends(RingLayer, _super); function RingLayer() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = 'ring'; return _this; } RingLayer.getDefaultOptions = function () { return _.deepMix({}, _super.getDefaultOptions.call(this), { radius: 0.8, innerRadius: 0.64, statistic: { visible: true, triggerOn: 'mouseenter', triggerOff: 'mouseleave', }, }); }; RingLayer.prototype.getOptions = function (props) { var options = _super.prototype.getOptions.call(this, props); // @ts-ignore var defaultOptions = this.constructor.getDefaultOptions(); return _.deepMix({}, options, defaultOptions, props); }; RingLayer.prototype.beforeInit = function () { _super.prototype.beforeInit.call(this); RingLayer.centralId++; this.statisticClass = "statisticClassId" + RingLayer.centralId; var props = this.options; /** 响应式图形 */ if (props.responsive && props.padding !== 'auto') { this.applyResponsive('preRender'); } }; RingLayer.prototype.afterInit = function () { var _this = this; _super.prototype.afterInit.call(this); /** 处理环图中心文本响应交互的问题 */ if (this.statistic && this.statistic.visible && this.statistic.triggerOn) { var triggerOnEvent = this.statistic.triggerOn; this.view.on("interval:" + triggerOnEvent, _.debounce(function (e) { var displayData = _this.parseStatisticData(e.data._origin); var htmlString = _this.getStatisticHtmlString(displayData); document.getElementsByClassName(_this.statisticClass)[0].innerHTML = htmlString; }, 150)); var triggerOffEvent = this.statistic.triggerOff ? this.statistic.triggerOff : 'mouseleave'; this.view.on("interval:" + triggerOffEvent, _.debounce(function (e) { var totalValue = _this.getTotalValue(); var displayData = _this.parseStatisticData(totalValue); var htmlString = _this.getStatisticHtmlString(displayData); document.getElementsByClassName(_this.statisticClass)[0].innerHTML = htmlString; }, 150)); } }; RingLayer.prototype.geometryParser = function (dim, type) { if (dim === 'g2') { return G2_GEOM_MAP[type]; } return PLOT_GEOM_MAP[type]; }; RingLayer.prototype.coord = function () { var props = this.options; var coordConfig = { type: 'theta', cfg: { radius: props.radius, innerRadius: props.innerRadius, }, }; this.setConfig('coord', coordConfig); }; RingLayer.prototype.annotation = function () { var annotationConfigs = []; var props = this.options; if (props.statistic && props.statistic.visible) { var statistic = this.drawStatistic(props.statistic); annotationConfigs.push(statistic); this.statistic = statistic; } this.setConfig('annotations', annotationConfigs); }; RingLayer.prototype.parseEvents = function (eventParser) { _super.prototype.parseEvents.call(this, EventParser); }; RingLayer.prototype.drawStatistic = function (config) { var statistic = _.deepMix({}, { type: 'html', top: true, position: ['50%', '50%'], triggerOn: 'mouseenter', }, config); /** 中心文本内容 */ var displayData; if (config.content) { displayData = config.content; } else { /** 用户没有指定文本内容时,默认显示总计 */ var data = this.getTotalValue(); displayData = this.parseStatisticData(data); } /** 中心文本显示 */ var htmlString; if (config.htmlContent) { htmlString = config.htmlContent(displayData); } else { htmlString = this.getStatisticTemplate(displayData); } statistic.html = htmlString; /** 是否响应状态量 */ if (statistic.triggerOn) { this.setConfig('tooltip', false); } return statistic; }; /** 获取总计数据 */ RingLayer.prototype.getTotalValue = function () { var _a; var props = this.options; var total = 0; _.each(props.data, function (item) { if (typeof item[props.angleField] === 'number') { total += item[props.angleField]; } }); var data = (_a = {}, _a[props.angleField] = total, _a[props.colorField] = '总计', _a); return data; }; RingLayer.prototype.parseStatisticData = function (data) { var props = this.options; var angleField = props.angleField; return props.colorField ? { name: data[props.colorField], value: data[angleField] } : data[angleField]; }; RingLayer.prototype.getStatisticTemplate = function (displayData) { var size = this.getStatisticSize(); var htmlString; /** 如果文本内容为string或单条数据 */ if (_.isString(displayData)) { htmlString = statisticTemplate.getSingleDataTemplate(displayData, this.statisticClass, size); } else if (_.isObject(displayData) && _.keys(displayData).length === 2) { /** 如果文本内容为两条数据 */ var content = displayData; htmlString = statisticTemplate.getTwoDataTemplate(content.name, content.value, this.statisticClass, size); } /** 更为复杂的文本要求用户自行制定html模板 */ return htmlString; }; /** 获取中心文本的htmlString */ RingLayer.prototype.getStatisticHtmlString = function (_displayData) { var triggerOnConfig = this.statistic.triggerOn; var htmlString; if (_.isString(triggerOnConfig)) { htmlString = this.getStatisticTemplate(_displayData); } if (_.isFunction(triggerOnConfig)) { htmlString = triggerOnConfig(_displayData); htmlString = "<div class=\"ring-guide-html " + this.statisticClass + "\">" + htmlString + "</div>"; } return htmlString; }; RingLayer.prototype.applyResponsive = function (stage) { var _this = this; var methods = apply_responsive_1.default[stage]; _.each(methods, function (r) { var responsive = r; responsive.method(_this); }); }; RingLayer.prototype.getStatisticSize = function () { return this.width * this.options.radius; }; /** @override 调整 label 默认 options */ RingLayer.prototype.adjustLabelDefaultOptions = function (options) { var labelConfig = tslib_1.__assign({}, options.label); if (labelConfig && labelConfig.type === 'inner') { var labelStyleConfig = (labelConfig.style || {}); if (!labelStyleConfig.textAlign) { labelStyleConfig.textAlign = 'center'; } labelConfig.style = labelStyleConfig; if (!labelConfig.offset) { labelConfig.offset = ((options.innerRadius - 1) / 2) * 100 + "%"; } } return labelConfig; }; RingLayer.centralId = 0; return RingLayer; }(layer_1.default)); exports.default = RingLayer; global_1.registerPlotType('ring', RingLayer); //# sourceMappingURL=layer.js.map