cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
1,387 lines • 61.1 kB
JavaScript
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