UNPKG

cione-comp-lib

Version:

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

1,387 lines 61.1 kB
import { __extends } from "../../../tslib/tslib.es6.mjs"; import { init as init$1 } from "../../../zrender/lib/zrender.mjs"; import { isObject, each, extend, createHashMap, map, indexOf, retrieve2, bind, clone, setAsPrimitive, defaults, isArray, isString, assert, noop, isFunction } from "../../../zrender/lib/core/util.mjs"; import env from "../../../zrender/lib/core/env.mjs"; import sort from "../../../zrender/lib/core/timsort.mjs"; import Eventful from "../../../zrender/lib/core/Eventful.mjs"; import GlobalModel from "../model/Global.mjs"; import ExtensionAPI from "./ExtensionAPI.mjs"; import CoordinateSystem from "./CoordinateSystem.mjs"; import OptionManager from "../model/OptionManager.mjs"; import globalBackwardCompat from "../preprocessor/backwardCompat.mjs"; import dataStack from "../processor/dataStack.mjs"; import SeriesModel from "../model/Series.mjs"; import ComponentView from "../view/Component.mjs"; import ChartView from "../view/Chart.mjs"; import { getECData } from "../util/innerStore.mjs"; import { isSelectChangePayload, isHighDownPayload, allLeaveBlur, getAllSelectedIndices, updateSeriesElementSelection, HOVER_STATE_EMPHASIS, HOVER_STATE_BLUR, savePathStates, enterEmphasis, leaveEmphasis, enterBlur, leaveBlur, enterSelect, leaveSelect, HIGHLIGHT_ACTION_TYPE, DOWNPLAY_ACTION_TYPE, SELECT_ACTION_TYPE, UNSELECT_ACTION_TYPE, TOGGLE_SELECT_ACTION_TYPE, blurSeriesFromHighlightPayload, findComponentHighDownDispatchers, blurComponent, toggleSelectionFromPayload, isHighDownDispatcher, handleGlobalMouseOverForHighDown, handleGlobalMouseOutForHighDown } from "../util/states.mjs"; import { parseFinder, setAttribute, preParseFinder, getAttribute, convertOptionIdName, normalizeToArray } from "../util/model.mjs"; import { throttle } from "../util/throttle.mjs"; import { seriesStyleTask, dataStyleTask, dataColorPaletteTask } from "../visual/style.mjs"; import defaultLoading from "../loading/default.mjs"; import Scheduler from "./Scheduler.mjs"; import lightTheme from "../theme/light.mjs"; import darkTheme from "../theme/dark.mjs"; import { parseClassType } from "../util/clazz.mjs"; import { ECEventProcessor } from "../util/ECEventProcessor.mjs"; import { seriesSymbolTask, dataSymbolTask } from "../visual/symbol.mjs"; import { getItemVisualFromData, getVisualFromData } from "../visual/helper.mjs"; import { handleLegacySelectEvents } from "../legacy/dataSelectAction.mjs"; import { registerExternalTransform } from "../data/helper/transform.mjs"; import { createLocaleObject, SYSTEM_LANG } from "./locale.mjs"; export { registerLocale } from "./locale.mjs"; import { findEventDispatcher } from "../util/event.mjs"; import decalVisual from "../visual/decal.mjs"; import lifecycle from "./lifecycle.mjs"; import { platformApi, setPlatformAPI } from "../../../zrender/lib/core/platform.mjs"; import { getImpl } from "./impl.mjs"; import Rect from "../../../zrender/lib/graphic/shape/Rect.mjs"; import { isElementRemoved } from "../animation/basicTransition.mjs"; import Path from "../../../zrender/lib/graphic/Path.mjs"; import ZRImage from "../../../zrender/lib/graphic/Image.mjs"; var version = "5.4.1"; var dependencies = { zrender: "5.4.1" }; var TEST_FRAME_REMAIN_TIME = 1; var PRIORITY_PROCESSOR_SERIES_FILTER = 800; var PRIORITY_PROCESSOR_DATASTACK = 900; var PRIORITY_PROCESSOR_FILTER = 1e3; var PRIORITY_PROCESSOR_DEFAULT = 2e3; var PRIORITY_PROCESSOR_STATISTIC = 5e3; var PRIORITY_VISUAL_LAYOUT = 1e3; var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100; var PRIORITY_VISUAL_GLOBAL = 2e3; var PRIORITY_VISUAL_CHART = 3e3; var PRIORITY_VISUAL_COMPONENT = 4e3; var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500; var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600; var PRIORITY_VISUAL_BRUSH = 5e3; var PRIORITY_VISUAL_ARIA = 6e3; var PRIORITY_VISUAL_DECAL = 7e3; var PRIORITY = { PROCESSOR: { FILTER: PRIORITY_PROCESSOR_FILTER, SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER, STATISTIC: PRIORITY_PROCESSOR_STATISTIC }, VISUAL: { LAYOUT: PRIORITY_VISUAL_LAYOUT, PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT, GLOBAL: PRIORITY_VISUAL_GLOBAL, CHART: PRIORITY_VISUAL_CHART, POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT, COMPONENT: PRIORITY_VISUAL_COMPONENT, BRUSH: PRIORITY_VISUAL_BRUSH, CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM, ARIA: PRIORITY_VISUAL_ARIA, DECAL: PRIORITY_VISUAL_DECAL } }; var IN_MAIN_PROCESS_KEY = "__flagInMainProcess"; var PENDING_UPDATE = "__pendingUpdate"; var STATUS_NEEDS_UPDATE_KEY = "__needsUpdateStatus"; var ACTION_REG = /^[a-zA-Z0-9_]+$/; var CONNECT_STATUS_KEY = "__connectUpdateStatus"; var CONNECT_STATUS_PENDING = 0; var CONNECT_STATUS_UPDATING = 1; var CONNECT_STATUS_UPDATED = 2; function createRegisterEventWithLowercaseECharts(method) { return function() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (this.isDisposed()) { disposedWarning(this.id); return; } return toLowercaseNameAndCallEventful(this, method, args); }; } function createRegisterEventWithLowercaseMessageCenter(method) { return function() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return toLowercaseNameAndCallEventful(this, method, args); }; } function toLowercaseNameAndCallEventful(host, method, args) { args[0] = args[0] && args[0].toLowerCase(); return Eventful.prototype[method].apply(host, args); } var MessageCenter = function(_super) { __extends(MessageCenter2, _super); function MessageCenter2() { return _super !== null && _super.apply(this, arguments) || this; } return MessageCenter2; }(Eventful); var messageCenterProto = MessageCenter.prototype; messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter("on"); messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter("off"); var prepare; var prepareView; var updateDirectly; var updateMethods; var doConvertPixel; var updateStreamModes; var doDispatchAction; var flushPendingActions; var triggerUpdatedEvent; var bindRenderedEvent; var bindMouseEvent; var render; var renderComponents; var renderSeries; var createExtensionAPI; var enableConnect; var markStatusToUpdate; var applyChangedStates; var ECharts = function(_super) { __extends(ECharts2, _super); function ECharts2(dom, theme, opts) { var _this = _super.call(this, new ECEventProcessor()) || this; _this._chartsViews = []; _this._chartsMap = {}; _this._componentsViews = []; _this._componentsMap = {}; _this._pendingActions = []; opts = opts || {}; if (isString(theme)) { theme = themeStorage[theme]; } _this._dom = dom; var defaultRenderer = "canvas"; var defaultCoarsePointer = "auto"; var defaultUseDirtyRect = false; var zr = _this._zr = init$1(dom, { renderer: opts.renderer || defaultRenderer, devicePixelRatio: opts.devicePixelRatio, width: opts.width, height: opts.height, ssr: opts.ssr, useDirtyRect: retrieve2(opts.useDirtyRect, defaultUseDirtyRect), useCoarsePointer: retrieve2(opts.useCoarsePointer, defaultCoarsePointer), pointerSize: opts.pointerSize }); _this._ssr = opts.ssr; _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17); theme = clone(theme); theme && globalBackwardCompat(theme, true); _this._theme = theme; _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG); _this._coordSysMgr = new CoordinateSystem(); var api = _this._api = createExtensionAPI(_this); function prioritySortFunc(a, b) { return a.__prio - b.__prio; } sort(visualFuncs, prioritySortFunc); sort(dataProcessorFuncs, prioritySortFunc); _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs); _this._messageCenter = new MessageCenter(); _this._initEvents(); _this.resize = bind(_this.resize, _this); zr.animation.on("frame", _this._onframe, _this); bindRenderedEvent(zr, _this); bindMouseEvent(zr, _this); setAsPrimitive(_this); return _this; } ECharts2.prototype._onframe = function() { if (this._disposed) { return; } applyChangedStates(this); var scheduler = this._scheduler; if (this[PENDING_UPDATE]) { var silent = this[PENDING_UPDATE].silent; this[IN_MAIN_PROCESS_KEY] = true; try { prepare(this); updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams); } catch (e) { this[IN_MAIN_PROCESS_KEY] = false; this[PENDING_UPDATE] = null; throw e; } this._zr.flush(); this[IN_MAIN_PROCESS_KEY] = false; this[PENDING_UPDATE] = null; flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); } else if (scheduler.unfinished) { var remainTime = TEST_FRAME_REMAIN_TIME; var ecModel = this._model; var api = this._api; scheduler.unfinished = false; do { var startTime = +new Date(); scheduler.performSeriesTasks(ecModel); scheduler.performDataProcessorTasks(ecModel); updateStreamModes(this, ecModel); scheduler.performVisualTasks(ecModel); renderSeries(this, this._model, api, "remain", {}); remainTime -= +new Date() - startTime; } while (remainTime > 0 && scheduler.unfinished); if (!scheduler.unfinished) { this._zr.flush(); } } }; ECharts2.prototype.getDom = function() { return this._dom; }; ECharts2.prototype.getId = function() { return this.id; }; ECharts2.prototype.getZr = function() { return this._zr; }; ECharts2.prototype.isSSR = function() { return this._ssr; }; ECharts2.prototype.setOption = function(option, notMerge, lazyUpdate) { if (this[IN_MAIN_PROCESS_KEY]) { return; } if (this._disposed) { disposedWarning(this.id); return; } var silent; var replaceMerge; var transitionOpt; if (isObject(notMerge)) { lazyUpdate = notMerge.lazyUpdate; silent = notMerge.silent; replaceMerge = notMerge.replaceMerge; transitionOpt = notMerge.transition; notMerge = notMerge.notMerge; } this[IN_MAIN_PROCESS_KEY] = true; if (!this._model || notMerge) { var optionManager = new OptionManager(this._api); var theme = this._theme; var ecModel = this._model = new GlobalModel(); ecModel.scheduler = this._scheduler; ecModel.ssr = this._ssr; ecModel.init(null, null, null, theme, this._locale, optionManager); } this._model.setOption(option, { replaceMerge }, optionPreprocessorFuncs); var updateParams = { seriesTransition: transitionOpt, optionChanged: true }; if (lazyUpdate) { this[PENDING_UPDATE] = { silent, updateParams }; this[IN_MAIN_PROCESS_KEY] = false; this.getZr().wakeUp(); } else { try { prepare(this); updateMethods.update.call(this, null, updateParams); } catch (e) { this[PENDING_UPDATE] = null; this[IN_MAIN_PROCESS_KEY] = false; throw e; } if (!this._ssr) { this._zr.flush(); } this[PENDING_UPDATE] = null; this[IN_MAIN_PROCESS_KEY] = false; flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); } }; ECharts2.prototype.setTheme = function() { }; ECharts2.prototype.getModel = function() { return this._model; }; ECharts2.prototype.getOption = function() { return this._model && this._model.getOption(); }; ECharts2.prototype.getWidth = function() { return this._zr.getWidth(); }; ECharts2.prototype.getHeight = function() { return this._zr.getHeight(); }; ECharts2.prototype.getDevicePixelRatio = function() { return this._zr.painter.dpr || env.hasGlobalWindow && window.devicePixelRatio || 1; }; ECharts2.prototype.getRenderedCanvas = function(opts) { return this.renderToCanvas(opts); }; ECharts2.prototype.renderToCanvas = function(opts) { opts = opts || {}; var painter = this._zr.painter; return painter.getRenderedCanvas({ backgroundColor: opts.backgroundColor || this._model.get("backgroundColor"), pixelRatio: opts.pixelRatio || this.getDevicePixelRatio() }); }; ECharts2.prototype.renderToSVGString = function(opts) { opts = opts || {}; var painter = this._zr.painter; return painter.renderToString({ useViewBox: opts.useViewBox }); }; ECharts2.prototype.getSvgDataURL = function() { if (!env.svgSupported) { return; } var zr = this._zr; var list = zr.storage.getDisplayList(); each(list, function(el) { el.stopAnimation(null, true); }); return zr.painter.toDataURL(); }; ECharts2.prototype.getDataURL = function(opts) { if (this._disposed) { disposedWarning(this.id); return; } opts = opts || {}; var excludeComponents = opts.excludeComponents; var ecModel = this._model; var excludesComponentViews = []; var self = this; each(excludeComponents, function(componentType) { ecModel.eachComponent({ mainType: componentType }, function(component) { var view = self._componentsMap[component.__viewId]; if (!view.group.ignore) { excludesComponentViews.push(view); view.group.ignore = true; } }); }); var url = this._zr.painter.getType() === "svg" ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL("image/" + (opts && opts.type || "png")); each(excludesComponentViews, function(view) { view.group.ignore = false; }); return url; }; ECharts2.prototype.getConnectedDataURL = function(opts) { if (this._disposed) { disposedWarning(this.id); return; } var isSvg = opts.type === "svg"; var groupId = this.group; var mathMin = Math.min; var mathMax = Math.max; var MAX_NUMBER = Infinity; if (connectedGroups[groupId]) { var left_1 = MAX_NUMBER; var top_1 = MAX_NUMBER; var right_1 = -MAX_NUMBER; var bottom_1 = -MAX_NUMBER; var canvasList_1 = []; var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio(); each(instances, function(chart, id) { if (chart.group === groupId) { var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone(opts)); var boundingRect = chart.getDom().getBoundingClientRect(); left_1 = mathMin(boundingRect.left, left_1); top_1 = mathMin(boundingRect.top, top_1); right_1 = mathMax(boundingRect.right, right_1); bottom_1 = mathMax(boundingRect.bottom, bottom_1); canvasList_1.push({ dom: canvas, left: boundingRect.left, top: boundingRect.top }); } }); left_1 *= dpr_1; top_1 *= dpr_1; right_1 *= dpr_1; bottom_1 *= dpr_1; var width = right_1 - left_1; var height = bottom_1 - top_1; var targetCanvas = platformApi.createCanvas(); var zr_1 = init$1(targetCanvas, { renderer: isSvg ? "svg" : "canvas" }); zr_1.resize({ width, height }); if (isSvg) { var content_1 = ""; each(canvasList_1, function(item) { var x = item.left - left_1; var y = item.top - top_1; content_1 += '<g transform="translate(' + x + "," + y + ')">' + item.dom + "</g>"; }); zr_1.painter.getSvgRoot().innerHTML = content_1; if (opts.connectedBackgroundColor) { zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor); } zr_1.refreshImmediately(); return zr_1.painter.toDataURL(); } else { if (opts.connectedBackgroundColor) { zr_1.add(new Rect({ shape: { x: 0, y: 0, width, height }, style: { fill: opts.connectedBackgroundColor } })); } each(canvasList_1, function(item) { var img = new ZRImage({ style: { x: item.left * dpr_1 - left_1, y: item.top * dpr_1 - top_1, image: item.dom } }); zr_1.add(img); }); zr_1.refreshImmediately(); return targetCanvas.toDataURL("image/" + (opts && opts.type || "png")); } } else { return this.getDataURL(opts); } }; ECharts2.prototype.convertToPixel = function(finder, value) { return doConvertPixel(this, "convertToPixel", finder, value); }; ECharts2.prototype.convertFromPixel = function(finder, value) { return doConvertPixel(this, "convertFromPixel", finder, value); }; ECharts2.prototype.containPixel = function(finder, value) { if (this._disposed) { disposedWarning(this.id); return; } var ecModel = this._model; var result; var findResult = parseFinder(ecModel, finder); each(findResult, function(models, key) { key.indexOf("Models") >= 0 && each(models, function(model) { var coordSys = model.coordinateSystem; if (coordSys && coordSys.containPoint) { result = result || !!coordSys.containPoint(value); } else if (key === "seriesModels") { var view = this._chartsMap[model.__viewId]; if (view && view.containPoint) { result = result || view.containPoint(value, model); } } else ; }, this); }, this); return !!result; }; ECharts2.prototype.getVisual = function(finder, visualType) { var ecModel = this._model; var parsedFinder = parseFinder(ecModel, finder, { defaultMainType: "series" }); var seriesModel = parsedFinder.seriesModel; var data = seriesModel.getData(); var dataIndexInside = parsedFinder.hasOwnProperty("dataIndexInside") ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty("dataIndex") ? data.indexOfRawIndex(parsedFinder.dataIndex) : null; return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType); }; ECharts2.prototype.getViewOfComponentModel = function(componentModel) { return this._componentsMap[componentModel.__viewId]; }; ECharts2.prototype.getViewOfSeriesModel = function(seriesModel) { return this._chartsMap[seriesModel.__viewId]; }; ECharts2.prototype._initEvents = function() { var _this = this; each(MOUSE_EVENT_NAMES, function(eveName) { var handler = function(e) { var ecModel = _this.getModel(); var el = e.target; var params; var isGlobalOut = eveName === "globalout"; if (isGlobalOut) { params = {}; } else { el && findEventDispatcher(el, function(parent) { var ecData = getECData(parent); if (ecData && ecData.dataIndex != null) { var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex); params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType) || {}; return true; } else if (ecData.eventData) { params = extend({}, ecData.eventData); return true; } }, true); } if (params) { var componentType = params.componentType; var componentIndex = params.componentIndex; if (componentType === "markLine" || componentType === "markPoint" || componentType === "markArea") { componentType = "series"; componentIndex = params.seriesIndex; } var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex); var view = model && _this[model.mainType === "series" ? "_chartsMap" : "_componentsMap"][model.__viewId]; params.event = e; params.type = eveName; _this._$eventProcessor.eventInfo = { targetEl: el, packedEvent: params, model, view }; _this.trigger(eveName, params); } }; handler.zrEventfulCallAtLast = true; _this._zr.on(eveName, handler, _this); }); each(eventActionMap, function(actionType, eventType) { _this._messageCenter.on(eventType, function(event) { this.trigger(eventType, event); }, _this); }); each(["selectchanged"], function(eventType) { _this._messageCenter.on(eventType, function(event) { this.trigger(eventType, event); }, _this); }); handleLegacySelectEvents(this._messageCenter, this, this._api); }; ECharts2.prototype.isDisposed = function() { return this._disposed; }; ECharts2.prototype.clear = function() { if (this._disposed) { disposedWarning(this.id); return; } this.setOption({ series: [] }, true); }; ECharts2.prototype.dispose = function() { if (this._disposed) { disposedWarning(this.id); return; } this._disposed = true; var dom = this.getDom(); if (dom) { setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ""); } var chart = this; var api = chart._api; var ecModel = chart._model; each(chart._componentsViews, function(component) { component.dispose(ecModel, api); }); each(chart._chartsViews, function(chart2) { chart2.dispose(ecModel, api); }); chart._zr.dispose(); chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null; delete instances[chart.id]; }; ECharts2.prototype.resize = function(opts) { if (this[IN_MAIN_PROCESS_KEY]) { return; } if (this._disposed) { disposedWarning(this.id); return; } this._zr.resize(opts); var ecModel = this._model; this._loadingFX && this._loadingFX.resize(); if (!ecModel) { return; } var needPrepare = ecModel.resetOption("media"); var silent = opts && opts.silent; if (this[PENDING_UPDATE]) { if (silent == null) { silent = this[PENDING_UPDATE].silent; } needPrepare = true; this[PENDING_UPDATE] = null; } this[IN_MAIN_PROCESS_KEY] = true; try { needPrepare && prepare(this); updateMethods.update.call(this, { type: "resize", animation: extend({ duration: 0 }, opts && opts.animation) }); } catch (e) { this[IN_MAIN_PROCESS_KEY] = false; throw e; } this[IN_MAIN_PROCESS_KEY] = false; flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); }; ECharts2.prototype.showLoading = function(name, cfg) { if (this._disposed) { disposedWarning(this.id); return; } if (isObject(name)) { cfg = name; name = ""; } name = name || "default"; this.hideLoading(); if (!loadingEffects[name]) { return; } var el = loadingEffects[name](this._api, cfg); var zr = this._zr; this._loadingFX = el; zr.add(el); }; ECharts2.prototype.hideLoading = function() { if (this._disposed) { disposedWarning(this.id); return; } this._loadingFX && this._zr.remove(this._loadingFX); this._loadingFX = null; }; ECharts2.prototype.makeActionFromEvent = function(eventObj) { var payload = extend({}, eventObj); payload.type = eventActionMap[eventObj.type]; return payload; }; ECharts2.prototype.dispatchAction = function(payload, opt) { if (this._disposed) { disposedWarning(this.id); return; } if (!isObject(opt)) { opt = { silent: !!opt }; } if (!actions[payload.type]) { return; } if (!this._model) { return; } if (this[IN_MAIN_PROCESS_KEY]) { this._pendingActions.push(payload); return; } var silent = opt.silent; doDispatchAction.call(this, payload, silent); var flush = opt.flush; if (flush) { this._zr.flush(); } else if (flush !== false && env.browser.weChat) { this._throttledZrFlush(); } flushPendingActions.call(this, silent); triggerUpdatedEvent.call(this, silent); }; ECharts2.prototype.updateLabelLayout = function() { lifecycle.trigger("series:layoutlabels", this._model, this._api, { updatedSeries: [] }); }; ECharts2.prototype.appendData = function(params) { if (this._disposed) { disposedWarning(this.id); return; } var seriesIndex = params.seriesIndex; var ecModel = this.getModel(); var seriesModel = ecModel.getSeriesByIndex(seriesIndex); seriesModel.appendData(params); this._scheduler.unfinished = true; this.getZr().wakeUp(); }; ECharts2.internalField = function() { prepare = function(ecIns) { var scheduler = ecIns._scheduler; scheduler.restorePipelines(ecIns._model); scheduler.prepareStageTasks(); prepareView(ecIns, true); prepareView(ecIns, false); scheduler.plan(); }; prepareView = function(ecIns, isComponent) { var ecModel = ecIns._model; var scheduler = ecIns._scheduler; var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; var zr = ecIns._zr; var api = ecIns._api; for (var i = 0; i < viewList.length; i++) { viewList[i].__alive = false; } isComponent ? ecModel.eachComponent(function(componentType, model) { componentType !== "series" && doPrepare(model); }) : ecModel.eachSeries(doPrepare); function doPrepare(model) { var requireNewView = model.__requireNewView; model.__requireNewView = false; var viewId = "_ec_" + model.id + "_" + model.type; var view2 = !requireNewView && viewMap[viewId]; if (!view2) { var classType = parseClassType(model.type); var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) : ChartView.getClass(classType.sub); view2 = new Clazz(); view2.init(ecModel, api); viewMap[viewId] = view2; viewList.push(view2); zr.add(view2.group); } model.__viewId = view2.__id = viewId; view2.__alive = true; view2.__model = model; view2.group.__ecComponentInfo = { mainType: model.mainType, index: model.componentIndex }; !isComponent && scheduler.prepareView(view2, model, ecModel, api); } for (var i = 0; i < viewList.length; ) { var view = viewList[i]; if (!view.__alive) { !isComponent && view.renderTask.dispose(); zr.remove(view.group); view.dispose(ecModel, api); viewList.splice(i, 1); if (viewMap[view.__id] === view) { delete viewMap[view.__id]; } view.__id = view.group.__ecComponentInfo = null; } else { i++; } } }; updateDirectly = function(ecIns, method, payload, mainType, subType) { var ecModel = ecIns._model; ecModel.setUpdatePayload(payload); if (!mainType) { each([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView); return; } var query = {}; query[mainType + "Id"] = payload[mainType + "Id"]; query[mainType + "Index"] = payload[mainType + "Index"]; query[mainType + "Name"] = payload[mainType + "Name"]; var condition = { mainType, query }; subType && (condition.subType = subType); var excludeSeriesId = payload.excludeSeriesId; var excludeSeriesIdMap; if (excludeSeriesId != null) { excludeSeriesIdMap = createHashMap(); each(normalizeToArray(excludeSeriesId), function(id) { var modelId = convertOptionIdName(id, null); if (modelId != null) { excludeSeriesIdMap.set(modelId, true); } }); } ecModel && ecModel.eachComponent(condition, function(model) { var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; if (isExcluded) { return; } if (isHighDownPayload(payload)) { if (model instanceof SeriesModel) { if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(["emphasis", "disabled"])) { blurSeriesFromHighlightPayload(model, payload, ecIns._api); } } else { var _a = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api), focusSelf = _a.focusSelf, dispatchers = _a.dispatchers; if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) { blurComponent(model.mainType, model.componentIndex, ecIns._api); } if (dispatchers) { each(dispatchers, function(dispatcher) { payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher); }); } } } else if (isSelectChangePayload(payload)) { if (model instanceof SeriesModel) { toggleSelectionFromPayload(model, payload, ecIns._api); updateSeriesElementSelection(model); markStatusToUpdate(ecIns); } } }, ecIns); ecModel && ecModel.eachComponent(condition, function(model) { var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; if (isExcluded) { return; } callView(ecIns[mainType === "series" ? "_chartsMap" : "_componentsMap"][model.__viewId]); }, ecIns); function callView(view) { view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload); } }; updateMethods = { prepareAndUpdate: function(payload) { prepare(this); updateMethods.update.call(this, payload, { optionChanged: payload.newOption != null }); }, update: function(payload, updateParams) { var ecModel = this._model; var api = this._api; var zr = this._zr; var coordSysMgr = this._coordSysMgr; var scheduler = this._scheduler; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); scheduler.restoreData(ecModel, payload); scheduler.performSeriesTasks(ecModel); coordSysMgr.create(ecModel, api); scheduler.performDataProcessorTasks(ecModel, payload); updateStreamModes(this, ecModel); coordSysMgr.update(ecModel, api); clearColorPalette(ecModel); scheduler.performVisualTasks(ecModel, payload); render(this, ecModel, api, payload, updateParams); var backgroundColor = ecModel.get("backgroundColor") || "transparent"; var darkMode = ecModel.get("darkMode"); zr.setBackgroundColor(backgroundColor); if (darkMode != null && darkMode !== "auto") { zr.setDarkMode(darkMode); } lifecycle.trigger("afterupdate", ecModel, api); }, updateTransform: function(payload) { var _this = this; var ecModel = this._model; var api = this._api; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); var componentDirtyList = []; ecModel.eachComponent(function(componentType, componentModel) { if (componentType === "series") { return; } var componentView = _this.getViewOfComponentModel(componentModel); if (componentView && componentView.__alive) { if (componentView.updateTransform) { var result = componentView.updateTransform(componentModel, ecModel, api, payload); result && result.update && componentDirtyList.push(componentView); } else { componentDirtyList.push(componentView); } } }); var seriesDirtyMap = createHashMap(); ecModel.eachSeries(function(seriesModel) { var chartView = _this._chartsMap[seriesModel.__viewId]; if (chartView.updateTransform) { var result = chartView.updateTransform(seriesModel, ecModel, api, payload); result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); } else { seriesDirtyMap.set(seriesModel.uid, 1); } }); clearColorPalette(ecModel); this._scheduler.performVisualTasks(ecModel, payload, { setDirty: true, dirtyMap: seriesDirtyMap }); renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap); lifecycle.trigger("afterupdate", ecModel, api); }, updateView: function(payload) { var ecModel = this._model; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); ChartView.markUpdateMethod(payload, "updateView"); clearColorPalette(ecModel); this._scheduler.performVisualTasks(ecModel, payload, { setDirty: true }); render(this, ecModel, this._api, payload, {}); lifecycle.trigger("afterupdate", ecModel, this._api); }, updateVisual: function(payload) { var _this = this; var ecModel = this._model; if (!ecModel) { return; } ecModel.setUpdatePayload(payload); ecModel.eachSeries(function(seriesModel) { seriesModel.getData().clearAllVisual(); }); ChartView.markUpdateMethod(payload, "updateVisual"); clearColorPalette(ecModel); this._scheduler.performVisualTasks(ecModel, payload, { visualType: "visual", setDirty: true }); ecModel.eachComponent(function(componentType, componentModel) { if (componentType !== "series") { var componentView = _this.getViewOfComponentModel(componentModel); componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload); } }); ecModel.eachSeries(function(seriesModel) { var chartView = _this._chartsMap[seriesModel.__viewId]; chartView.updateVisual(seriesModel, ecModel, _this._api, payload); }); lifecycle.trigger("afterupdate", ecModel, this._api); }, updateLayout: function(payload) { updateMethods.update.call(this, payload); } }; doConvertPixel = function(ecIns, methodName, finder, value) { if (ecIns._disposed) { disposedWarning(ecIns.id); return; } var ecModel = ecIns._model; var coordSysList = ecIns._coordSysMgr.getCoordinateSystems(); var result; var parsedFinder = parseFinder(ecModel, finder); for (var i = 0; i < coordSysList.length; i++) { var coordSys = coordSysList[i]; if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) { return result; } } }; updateStreamModes = function(ecIns, ecModel) { var chartsMap = ecIns._chartsMap; var scheduler = ecIns._scheduler; ecModel.eachSeries(function(seriesModel) { scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); }); }; doDispatchAction = function(payload, silent) { var _this = this; var ecModel = this.getModel(); var payloadType = payload.type; var escapeConnect = payload.escapeConnect; var actionWrap = actions[payloadType]; var actionInfo = actionWrap.actionInfo; var cptTypeTmp = (actionInfo.update || "update").split(":"); var updateMethod = cptTypeTmp.pop(); var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]); this[IN_MAIN_PROCESS_KEY] = true; var payloads = [payload]; var batched = false; if (payload.batch) { batched = true; payloads = map(payload.batch, function(item) { item = defaults(extend({}, item), payload); item.batch = null; return item; }); } var eventObjBatch = []; var eventObj; var isSelectChange = isSelectChangePayload(payload); var isHighDown = isHighDownPayload(payload); if (isHighDown) { allLeaveBlur(this._api); } each(payloads, function(batchItem) { eventObj = actionWrap.action(batchItem, _this._model, _this._api); eventObj = eventObj || extend({}, batchItem); eventObj.type = actionInfo.event || eventObj.type; eventObjBatch.push(eventObj); if (isHighDown) { var _a = preParseFinder(payload), queryOptionMap = _a.queryOptionMap, mainTypeSpecified = _a.mainTypeSpecified; var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : "series"; updateDirectly(_this, updateMethod, batchItem, componentMainType); markStatusToUpdate(_this); } else if (isSelectChange) { updateDirectly(_this, updateMethod, batchItem, "series"); markStatusToUpdate(_this); } else if (cptType) { updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub); } }); if (updateMethod !== "none" && !isHighDown && !isSelectChange && !cptType) { try { if (this[PENDING_UPDATE]) { prepare(this); updateMethods.update.call(this, payload); this[PENDING_UPDATE] = null; } else { updateMethods[updateMethod].call(this, payload); } } catch (e) { this[IN_MAIN_PROCESS_KEY] = false; throw e; } } if (batched) { eventObj = { type: actionInfo.event || payloadType, escapeConnect, batch: eventObjBatch }; } else { eventObj = eventObjBatch[0]; } this[IN_MAIN_PROCESS_KEY] = false; if (!silent) { var messageCenter = this._messageCenter; messageCenter.trigger(eventObj.type, eventObj); if (isSelectChange) { var newObj = { type: "selectchanged", escapeConnect, selected: getAllSelectedIndices(ecModel), isFromClick: payload.isFromClick || false, fromAction: payload.type, fromActionPayload: payload }; messageCenter.trigger(newObj.type, newObj); } } }; flushPendingActions = function(silent) { var pendingActions = this._pendingActions; while (pendingActions.length) { var payload = pendingActions.shift(); doDispatchAction.call(this, payload, silent); } }; triggerUpdatedEvent = function(silent) { !silent && this.trigger("updated"); }; bindRenderedEvent = function(zr, ecIns) { zr.on("rendered", function(params) { ecIns.trigger("rendered", params); if (zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) { ecIns.trigger("finished"); } }); }; bindMouseEvent = function(zr, ecIns) { zr.on("mouseover", function(e) { var el = e.target; var dispatcher = findEventDispatcher(el, isHighDownDispatcher); if (dispatcher) { handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api); markStatusToUpdate(ecIns); } }).on("mouseout", function(e) { var el = e.target; var dispatcher = findEventDispatcher(el, isHighDownDispatcher); if (dispatcher) { handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api); markStatusToUpdate(ecIns); } }).on("click", function(e) { var el = e.target; var dispatcher = findEventDispatcher(el, function(target) { return getECData(target).dataIndex != null; }, true); if (dispatcher) { var actionType = dispatcher.selected ? "unselect" : "select"; var ecData = getECData(dispatcher); ecIns._api.dispatchAction({ type: actionType, dataType: ecData.dataType, dataIndexInside: ecData.dataIndex, seriesIndex: ecData.seriesIndex, isFromClick: true }); } }); }; function clearColorPalette(ecModel) { ecModel.clearColorPalette(); ecModel.eachSeries(function(seriesModel) { seriesModel.clearColorPalette(); }); } function allocateZlevels(ecModel) { var componentZLevels = []; var seriesZLevels = []; var hasSeperateZLevel = false; ecModel.eachComponent(function(componentType, componentModel) { var zlevel = componentModel.get("zlevel") || 0; var z = componentModel.get("z") || 0; var zlevelKey = componentModel.getZLevelKey(); hasSeperateZLevel = hasSeperateZLevel || !!zlevelKey; (componentType === "series" ? seriesZLevels : componentZLevels).push({ zlevel, z, idx: componentModel.componentIndex, type: componentType, key: zlevelKey }); }); if (hasSeperateZLevel) { var zLevels = componentZLevels.concat(seriesZLevels); var lastSeriesZLevel_1; var lastSeriesKey_1; sort(zLevels, function(a, b) { if (a.zlevel === b.zlevel) { return a.z - b.z; } return a.zlevel - b.zlevel; }); each(zLevels, function(item) { var componentModel = ecModel.getComponent(item.type, item.idx); var zlevel = item.zlevel; var key = item.key; if (lastSeriesZLevel_1 != null) { zlevel = Math.max(lastSeriesZLevel_1, zlevel); } if (key) { if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) { zlevel++; } lastSeriesKey_1 = key; } else if (lastSeriesKey_1) { if (zlevel === lastSeriesZLevel_1) { zlevel++; } lastSeriesKey_1 = ""; } lastSeriesZLevel_1 = zlevel; componentModel.setZLevel(zlevel); }); } } render = function(ecIns, ecModel, api, payload, updateParams) { allocateZlevels(ecModel); renderComponents(ecIns, ecModel, api, payload, updateParams); each(ecIns._chartsViews, function(chart) { chart.__alive = false; }); renderSeries(ecIns, ecModel, api, payload, updateParams); each(ecIns._chartsViews, function(chart) { if (!chart.__alive) { chart.remove(ecModel, api); } }); }; renderComponents = function(ecIns, ecModel, api, payload, updateParams, dirtyList) { each(dirtyList || ecIns._componentsViews, function(componentView) { var componentModel = componentView.__model; clearStates(componentModel, componentView); componentView.render(componentModel, ecModel, api, payload); updateZ(componentModel, componentView); updateStates(componentModel, componentView); }); }; renderSeries = function(ecIns, ecModel, api, payload, updateParams, dirtyMap) { var scheduler = ecIns._scheduler; updateParams = extend(updateParams || {}, { updatedSeries: ecModel.getSeries() }); lifecycle.trigger("series:beforeupdate", ecModel, api, updateParams); var unfinished = false; ecModel.eachSeries(function(seriesModel) { var chartView = ecIns._chartsMap[seriesModel.__viewId]; chartView.__alive = true; var renderTask = chartView.renderTask; scheduler.updatePayload(renderTask, payload); clearStates(seriesModel, chartView); if (dirtyMap && dirtyMap.get(seriesModel.uid)) { renderTask.dirty(); } if (renderTask.perform(scheduler.getPerformArgs(renderTask))) { unfinished = true; } chartView.group.silent = !!seriesModel.get("silent"); updateBlend(seriesModel, chartView); updateSeriesElementSelection(seriesModel); }); scheduler.unfinished = unfinished || scheduler.unfinished; lifecycle.trigger("series:layoutlabels", ecModel, api, updateParams); lifecycle.trigger("series:transition", ecModel, api, updateParams); ecModel.eachSeries(function(seriesModel) { var chartView = ecIns._chartsMap[seriesModel.__viewId]; updateZ(seriesModel, chartView); updateStates(seriesModel, chartView); }); updateHoverLayerStatus(ecIns, ecModel); lifecycle.trigger("series:afterupdate", ecModel, api, updateParams); }; markStatusToUpdate = function(ecIns) { ecIns[STATUS_NEEDS_UPDATE_KEY] = true; ecIns.getZr().wakeUp(); }; applyChangedStates = function(ecIns) { if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) { return; } ecIns.getZr().storage.traverse(function(el) { if (isElementRemoved(el)) { return; } applyElementStates(el); }); ecIns[STATUS_NEEDS_UPDATE_KEY] = false; }; function applyElementStates(el) { var newStates = []; var oldStates = el.currentStates; for (var i = 0; i < oldStates.length; i++) { var stateName = oldStates[i]; if (!(stateName === "emphasis" || stateName === "blur" || stateName === "select")) { newStates.push(stateName); } } if (el.selected && el.states.select) { newStates.push("select"); } if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) { newStates.push("emphasis"); } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) { newStates.push("blur"); } el.useStates(newStates); } function updateHoverLayerStatus(ecIns, ecModel) { var zr = ecIns._zr; var storage = zr.storage; var elCount = 0; storage.traverse(function(el) { if (!el.isGroup) { elCount++; } }); if (elCount > ecModel.get("hoverLayerThreshold") && !env.node && !env.worker) { ecModel.eachSeries(function(seriesModel) { if (seriesModel.preventUsingHoverLayer) { return; } var chartView = ecIns._chartsMap[seriesModel.__viewId]; if (chartView.__alive) { chartView.eachRendered(function(el) { if (el.states.emphasis) { el.states.emphasis.hoverLayer = true; } }); } }); } } function updateBlend(seriesModel, chartView) { var blendMode = seriesModel.get("blendMode") || null; chartView.eachRendered(function(el) { if (!el.isGroup) { el.style.blend = blendMode; } }); } function updateZ(model, view) { if (model.preventAutoZ) { return; } var z = model.get("z") || 0; var zlevel = model.get("zlevel") || 0; view.eachRendered(function(el) { doUpdateZ(el, z, zlevel, -Infinity); return true; }); } function doUpdateZ(el, z, zlevel, maxZ2) { var label = el.getTextContent(); var labelLine = el.getTextGuideLine(); var isGroup = el.isGroup; if (isGroup) { var children = el.childrenRef(); for (var i = 0; i < children.length; i++) { maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2); } } else { el.z = z; el.zlevel = zlevel; maxZ2 = Math.max(el.z2, maxZ2); } if (label) { label.z = z; label.zlevel = zlevel; isFinite(maxZ2) && (label.z2 = maxZ2 + 2); } if (labelLine) { var textGuideLineConfig = el.textGuideLineConfig; labelLine.z = z; labelLine.zlevel = zlevel; isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1)); } return maxZ2; } function clearStates(model, view) { view.eachRendered(function(el) { if (isElementRemoved(el)) { return; } var textContent = el.getTextContent(); var textGuide = el.getTextGuideLine(); if (el.stateTransition) { el.stateTransition = null; } if (textContent && textContent.stateTransition) { textContent.stateTransition = null; } if (textGuide && textGuide.stateTransition) { textGuide.stateTransition = null; } if (el.hasState()) { el.prevStates = el.currentStates; el.clearStates(); } else if (el.prevStates) { el.prevStates = null; } }); } function updateStates(model, view) { var stateAnimationModel = model.getModel("stateAnimation"); var enableAnimation = model.isAnimationEnabled(); var duration = stateAnimationModel.get("duration"); var stateTransition = duration > 0 ? { duration, delay: stateAnimationModel.get("delay"), easing: stateAnimationModel.get("easing") } : null; view.eachRendered(function(el) { if