12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273 |
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- /**
- * AUTO-GENERATED FILE. DO NOT MODIFY.
- */
- import { __extends } from "tslib";
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- import * as zrender from 'zrender/lib/zrender.js';
- import { assert, each, isFunction, isObject, indexOf, bind, clone, setAsPrimitive, extend, createHashMap, map, defaults, isDom, isArray, noop, isString, retrieve2 } from 'zrender/lib/core/util.js';
- import env from 'zrender/lib/core/env.js';
- import timsort from 'zrender/lib/core/timsort.js';
- import Eventful from 'zrender/lib/core/Eventful.js';
- import GlobalModel from '../model/Global.js';
- import ExtensionAPI from './ExtensionAPI.js';
- import CoordinateSystemManager from './CoordinateSystem.js';
- import OptionManager from '../model/OptionManager.js';
- import backwardCompat from '../preprocessor/backwardCompat.js';
- import dataStack from '../processor/dataStack.js';
- import SeriesModel from '../model/Series.js';
- import ComponentView from '../view/Component.js';
- import ChartView from '../view/Chart.js';
- import * as graphic from '../util/graphic.js';
- import { getECData } from '../util/innerStore.js';
- import { isHighDownDispatcher, HOVER_STATE_EMPHASIS, HOVER_STATE_BLUR, blurSeriesFromHighlightPayload, toggleSelectionFromPayload, updateSeriesElementSelection, getAllSelectedIndices, isSelectChangePayload, isHighDownPayload, HIGHLIGHT_ACTION_TYPE, DOWNPLAY_ACTION_TYPE, SELECT_ACTION_TYPE, UNSELECT_ACTION_TYPE, TOGGLE_SELECT_ACTION_TYPE, savePathStates, enterEmphasis, leaveEmphasis, leaveBlur, enterSelect, leaveSelect, enterBlur, allLeaveBlur, findComponentHighDownDispatchers, blurComponent, handleGlobalMouseOverForHighDown, handleGlobalMouseOutForHighDown } from '../util/states.js';
- import * as modelUtil from '../util/model.js';
- import { throttle } from '../util/throttle.js';
- import { seriesStyleTask, dataStyleTask, dataColorPaletteTask } from '../visual/style.js';
- import loadingDefault from '../loading/default.js';
- import Scheduler from './Scheduler.js';
- import lightTheme from '../theme/light.js';
- import darkTheme from '../theme/dark.js';
- import { parseClassType } from '../util/clazz.js';
- import { ECEventProcessor } from '../util/ECEventProcessor.js';
- import { seriesSymbolTask, dataSymbolTask } from '../visual/symbol.js';
- import { getVisualFromData, getItemVisualFromData } from '../visual/helper.js';
- import { deprecateLog, deprecateReplaceLog, error, warn } from '../util/log.js';
- import { handleLegacySelectEvents } from '../legacy/dataSelectAction.js';
- import { registerExternalTransform } from '../data/helper/transform.js';
- import { createLocaleObject, SYSTEM_LANG } from './locale.js';
- import { findEventDispatcher } from '../util/event.js';
- import decal from '../visual/decal.js';
- import lifecycle from './lifecycle.js';
- import { platformApi, setPlatformAPI } from 'zrender/lib/core/platform.js';
- import { getImpl } from './impl.js';
- export var version = '5.5.1';
- export var dependencies = {
- zrender: '5.6.0'
- };
- var TEST_FRAME_REMAIN_TIME = 1;
- var PRIORITY_PROCESSOR_SERIES_FILTER = 800;
- // Some data processors depends on the stack result dimension (to calculate data extent).
- // So data stack stage should be in front of data processing stage.
- var PRIORITY_PROCESSOR_DATASTACK = 900;
- // "Data filter" will block the stream, so it should be
- // put at the beginning of data processing.
- var PRIORITY_PROCESSOR_FILTER = 1000;
- var PRIORITY_PROCESSOR_DEFAULT = 2000;
- var PRIORITY_PROCESSOR_STATISTIC = 5000;
- var PRIORITY_VISUAL_LAYOUT = 1000;
- var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100;
- var PRIORITY_VISUAL_GLOBAL = 2000;
- var PRIORITY_VISUAL_CHART = 3000;
- var PRIORITY_VISUAL_COMPONENT = 4000;
- // Visual property in data. Greater than `PRIORITY_VISUAL_COMPONENT` to enable to
- // overwrite the viusal result of component (like `visualMap`)
- // using data item specific setting (like itemStyle.xxx on data item)
- var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500;
- // Greater than `PRIORITY_VISUAL_CHART_DATA_CUSTOM` to enable to layout based on
- // visual result like `symbolSize`.
- var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600;
- var PRIORITY_VISUAL_BRUSH = 5000;
- var PRIORITY_VISUAL_ARIA = 6000;
- var PRIORITY_VISUAL_DECAL = 7000;
- export 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
- }
- };
- // Main process have three entries: `setOption`, `dispatchAction` and `resize`,
- // where they must not be invoked nestedly, except the only case: invoke
- // dispatchAction with updateMethod "none" in main process.
- // This flag is used to carry out this rule.
- // All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]).
- 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]` is event name. Event name is all lowercase.
- args[0] = args[0] && args[0].toLowerCase();
- return Eventful.prototype[method].apply(host, args);
- }
- var MessageCenter = /** @class */function (_super) {
- __extends(MessageCenter, _super);
- function MessageCenter() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return MessageCenter;
- }(Eventful);
- var messageCenterProto = MessageCenter.prototype;
- messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter('on');
- messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter('off');
- // ---------------------------------------
- // Internal method names for class ECharts
- // ---------------------------------------
- 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 = /** @class */function (_super) {
- __extends(ECharts, _super);
- function ECharts(dom,
- // Theme name or themeOption.
- theme, opts) {
- var _this = _super.call(this, new ECEventProcessor()) || this;
- _this._chartsViews = [];
- _this._chartsMap = {};
- _this._componentsViews = [];
- _this._componentsMap = {};
- // Can't dispatch action during rendering procedure
- _this._pendingActions = [];
- opts = opts || {};
- // Get theme by name
- if (isString(theme)) {
- theme = themeStorage[theme];
- }
- _this._dom = dom;
- var defaultRenderer = 'canvas';
- var defaultCoarsePointer = 'auto';
- var defaultUseDirtyRect = false;
- if (process.env.NODE_ENV !== 'production') {
- var root = /* eslint-disable-next-line */
- env.hasGlobalWindow ? window : global;
- if (root) {
- defaultRenderer = retrieve2(root.__ECHARTS__DEFAULT__RENDERER__, defaultRenderer);
- defaultCoarsePointer = retrieve2(root.__ECHARTS__DEFAULT__COARSE_POINTER, defaultCoarsePointer);
- defaultUseDirtyRect = retrieve2(root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__, defaultUseDirtyRect);
- }
- }
- if (opts.ssr) {
- zrender.registerSSRDataGetter(function (el) {
- var ecData = getECData(el);
- var dataIndex = ecData.dataIndex;
- if (dataIndex == null) {
- return;
- }
- var hashMap = createHashMap();
- hashMap.set('series_index', ecData.seriesIndex);
- hashMap.set('data_index', dataIndex);
- ecData.ssrType && hashMap.set('ssr_type', ecData.ssrType);
- return hashMap;
- });
- }
- var zr = _this._zr = zrender.init(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;
- // Expect 60 fps.
- _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17);
- theme = clone(theme);
- theme && backwardCompat(theme, true);
- _this._theme = theme;
- _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG);
- _this._coordSysMgr = new CoordinateSystemManager();
- var api = _this._api = createExtensionAPI(_this);
- // Sort on demand
- function prioritySortFunc(a, b) {
- return a.__prio - b.__prio;
- }
- timsort(visualFuncs, prioritySortFunc);
- timsort(dataProcessorFuncs, prioritySortFunc);
- _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs);
- _this._messageCenter = new MessageCenter();
- // Init mouse events
- _this._initEvents();
- // In case some people write `window.onresize = chart.resize`
- _this.resize = bind(_this.resize, _this);
- zr.animation.on('frame', _this._onframe, _this);
- bindRenderedEvent(zr, _this);
- bindMouseEvent(zr, _this);
- // ECharts instance can be used as value.
- setAsPrimitive(_this);
- return _this;
- }
- ECharts.prototype._onframe = function () {
- if (this._disposed) {
- return;
- }
- applyChangedStates(this);
- var scheduler = this._scheduler;
- // Lazy update
- 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;
- }
- // At present, in each frame, zrender performs:
- // (1) animation step forward.
- // (2) trigger('frame') (where this `_onframe` is called)
- // (3) zrender flush (render).
- // If we do nothing here, since we use `setToFinal: true`, the step (3) above
- // will render the final state of the elements before the real animation started.
- this._zr.flush();
- this[IN_MAIN_PROCESS_KEY] = false;
- this[PENDING_UPDATE] = null;
- flushPendingActions.call(this, silent);
- triggerUpdatedEvent.call(this, silent);
- }
- // Avoid do both lazy update and progress in one frame.
- else if (scheduler.unfinished) {
- // Stream progress.
- 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);
- // Currently dataProcessorFuncs do not check threshold.
- scheduler.performDataProcessorTasks(ecModel);
- updateStreamModes(this, ecModel);
- // Do not update coordinate system here. Because that coord system update in
- // each frame is not a good user experience. So we follow the rule that
- // the extent of the coordinate system is determined in the first frame (the
- // frame is executed immediately after task reset.
- // this._coordSysMgr.update(ecModel, api);
- // console.log('--- ec frame visual ---', remainTime);
- scheduler.performVisualTasks(ecModel);
- renderSeries(this, this._model, api, 'remain', {});
- remainTime -= +new Date() - startTime;
- } while (remainTime > 0 && scheduler.unfinished);
- // Call flush explicitly for trigger finished event.
- if (!scheduler.unfinished) {
- this._zr.flush();
- }
- // Else, zr flushing be ensue within the same frame,
- // because zr flushing is after onframe event.
- }
- };
- ECharts.prototype.getDom = function () {
- return this._dom;
- };
- ECharts.prototype.getId = function () {
- return this.id;
- };
- ECharts.prototype.getZr = function () {
- return this._zr;
- };
- ECharts.prototype.isSSR = function () {
- return this._ssr;
- };
- /* eslint-disable-next-line */
- ECharts.prototype.setOption = function (option, notMerge, lazyUpdate) {
- if (this[IN_MAIN_PROCESS_KEY]) {
- if (process.env.NODE_ENV !== 'production') {
- error('`setOption` should not be called during main process.');
- }
- 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: replaceMerge
- }, optionPreprocessorFuncs);
- var updateParams = {
- seriesTransition: transitionOpt,
- optionChanged: true
- };
- if (lazyUpdate) {
- this[PENDING_UPDATE] = {
- silent: silent,
- updateParams: updateParams
- };
- this[IN_MAIN_PROCESS_KEY] = false;
- // `setOption(option, {lazyMode: true})` may be called when zrender has been slept.
- // It should wake it up to make sure zrender start to render at the next frame.
- 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;
- }
- // Ensure zr refresh sychronously, and then pixel in canvas can be
- // fetched after `setOption`.
- if (!this._ssr) {
- // not use flush when using ssr mode.
- this._zr.flush();
- }
- this[PENDING_UPDATE] = null;
- this[IN_MAIN_PROCESS_KEY] = false;
- flushPendingActions.call(this, silent);
- triggerUpdatedEvent.call(this, silent);
- }
- };
- /**
- * @deprecated
- */
- ECharts.prototype.setTheme = function () {
- deprecateLog('ECharts#setTheme() is DEPRECATED in ECharts 3.0');
- };
- // We don't want developers to use getModel directly.
- ECharts.prototype.getModel = function () {
- return this._model;
- };
- ECharts.prototype.getOption = function () {
- return this._model && this._model.getOption();
- };
- ECharts.prototype.getWidth = function () {
- return this._zr.getWidth();
- };
- ECharts.prototype.getHeight = function () {
- return this._zr.getHeight();
- };
- ECharts.prototype.getDevicePixelRatio = function () {
- return this._zr.painter.dpr
- /* eslint-disable-next-line */ || env.hasGlobalWindow && window.devicePixelRatio || 1;
- };
- /**
- * Get canvas which has all thing rendered
- * @deprecated Use renderToCanvas instead.
- */
- ECharts.prototype.getRenderedCanvas = function (opts) {
- if (process.env.NODE_ENV !== 'production') {
- deprecateReplaceLog('getRenderedCanvas', 'renderToCanvas');
- }
- return this.renderToCanvas(opts);
- };
- ECharts.prototype.renderToCanvas = function (opts) {
- opts = opts || {};
- var painter = this._zr.painter;
- if (process.env.NODE_ENV !== 'production') {
- if (painter.type !== 'canvas') {
- throw new Error('renderToCanvas can only be used in the canvas renderer.');
- }
- }
- return painter.getRenderedCanvas({
- backgroundColor: opts.backgroundColor || this._model.get('backgroundColor'),
- pixelRatio: opts.pixelRatio || this.getDevicePixelRatio()
- });
- };
- ECharts.prototype.renderToSVGString = function (opts) {
- opts = opts || {};
- var painter = this._zr.painter;
- if (process.env.NODE_ENV !== 'production') {
- if (painter.type !== 'svg') {
- throw new Error('renderToSVGString can only be used in the svg renderer.');
- }
- }
- return painter.renderToString({
- useViewBox: opts.useViewBox
- });
- };
- /**
- * Get svg data url
- */
- ECharts.prototype.getSvgDataURL = function () {
- if (!env.svgSupported) {
- return;
- }
- var zr = this._zr;
- var list = zr.storage.getDisplayList();
- // Stop animations
- each(list, function (el) {
- el.stopAnimation(null, true);
- });
- return zr.painter.toDataURL();
- };
- ECharts.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;
- };
- ECharts.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 = zrender.init(targetCanvas, {
- renderer: isSvg ? 'svg' : 'canvas'
- });
- zr_1.resize({
- width: width,
- height: 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 {
- // Background between the charts
- if (opts.connectedBackgroundColor) {
- zr_1.add(new graphic.Rect({
- shape: {
- x: 0,
- y: 0,
- width: width,
- height: height
- },
- style: {
- fill: opts.connectedBackgroundColor
- }
- }));
- }
- each(canvasList_1, function (item) {
- var img = new graphic.Image({
- 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);
- }
- };
- ECharts.prototype.convertToPixel = function (finder, value) {
- return doConvertPixel(this, 'convertToPixel', finder, value);
- };
- ECharts.prototype.convertFromPixel = function (finder, value) {
- return doConvertPixel(this, 'convertFromPixel', finder, value);
- };
- /**
- * Is the specified coordinate systems or components contain the given pixel point.
- * @param {Array|number} value
- * @return {boolean} result
- */
- ECharts.prototype.containPixel = function (finder, value) {
- if (this._disposed) {
- disposedWarning(this.id);
- return;
- }
- var ecModel = this._model;
- var result;
- var findResult = modelUtil.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 {
- if (process.env.NODE_ENV !== 'production') {
- warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.'));
- }
- }
- } else {
- if (process.env.NODE_ENV !== 'production') {
- warn(key + ': containPoint is not supported');
- }
- }
- }, this);
- }, this);
- return !!result;
- };
- /**
- * Get visual from series or data.
- * @param finder
- * If string, e.g., 'series', means {seriesIndex: 0}.
- * If Object, could contain some of these properties below:
- * {
- * seriesIndex / seriesId / seriesName,
- * dataIndex / dataIndexInside
- * }
- * If dataIndex is not specified, series visual will be fetched,
- * but not data item visual.
- * If all of seriesIndex, seriesId, seriesName are not specified,
- * visual will be fetched from first series.
- * @param visualType 'color', 'symbol', 'symbolSize'
- */
- ECharts.prototype.getVisual = function (finder, visualType) {
- var ecModel = this._model;
- var parsedFinder = modelUtil.parseFinder(ecModel, finder, {
- defaultMainType: 'series'
- });
- var seriesModel = parsedFinder.seriesModel;
- if (process.env.NODE_ENV !== 'production') {
- if (!seriesModel) {
- warn('There is no specified series model');
- }
- }
- 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);
- };
- /**
- * Get view of corresponding component model
- */
- ECharts.prototype.getViewOfComponentModel = function (componentModel) {
- return this._componentsMap[componentModel.__viewId];
- };
- /**
- * Get view of corresponding series model
- */
- ECharts.prototype.getViewOfSeriesModel = function (seriesModel) {
- return this._chartsMap[seriesModel.__viewId];
- };
- ECharts.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';
- // no e.target when '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, el) || {};
- return true;
- }
- // If element has custom eventData of components
- else if (ecData.eventData) {
- params = extend({}, ecData.eventData);
- return true;
- }
- }, true);
- }
- // Contract: if params prepared in mouse event,
- // these properties must be specified:
- // {
- // componentType: string (component main type)
- // componentIndex: number
- // }
- // Otherwise event query can not work.
- if (params) {
- var componentType = params.componentType;
- var componentIndex = params.componentIndex;
- // Special handling for historic reason: when trigger by
- // markLine/markPoint/markArea, the componentType is
- // 'markLine'/'markPoint'/'markArea', but we should better
- // enable them to be queried by seriesIndex, since their
- // option is set in each series.
- 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];
- if (process.env.NODE_ENV !== 'production') {
- // `event.componentType` and `event[componentTpype + 'Index']` must not
- // be missed, otherwise there is no way to distinguish source component.
- // See `dataFormat.getDataParams`.
- if (!isGlobalOut && !(model && view)) {
- warn('model or view can not be found by params');
- }
- }
- params.event = e;
- params.type = eveName;
- _this._$eventProcessor.eventInfo = {
- targetEl: el,
- packedEvent: params,
- model: model,
- view: view
- };
- _this.trigger(eveName, params);
- }
- };
- // Consider that some component (like tooltip, brush, ...)
- // register zr event handler, but user event handler might
- // do anything, such as call `setOption` or `dispatchAction`,
- // which probably update any of the content and probably
- // cause problem if it is called previous other inner handlers.
- 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);
- });
- // Extra events
- // TODO register?
- each(['selectchanged'], function (eventType) {
- _this._messageCenter.on(eventType, function (event) {
- this.trigger(eventType, event);
- }, _this);
- });
- handleLegacySelectEvents(this._messageCenter, this, this._api);
- };
- ECharts.prototype.isDisposed = function () {
- return this._disposed;
- };
- ECharts.prototype.clear = function () {
- if (this._disposed) {
- disposedWarning(this.id);
- return;
- }
- this.setOption({
- series: []
- }, true);
- };
- ECharts.prototype.dispose = function () {
- if (this._disposed) {
- disposedWarning(this.id);
- return;
- }
- this._disposed = true;
- var dom = this.getDom();
- if (dom) {
- modelUtil.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 (chart) {
- chart.dispose(ecModel, api);
- });
- // Dispose after all views disposed
- chart._zr.dispose();
- // Set properties to null.
- // To reduce the memory cost in case the top code still holds this instance unexpectedly.
- 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];
- };
- /**
- * Resize the chart
- */
- ECharts.prototype.resize = function (opts) {
- if (this[IN_MAIN_PROCESS_KEY]) {
- if (process.env.NODE_ENV !== 'production') {
- error('`resize` should not be called during main process.');
- }
- return;
- }
- if (this._disposed) {
- disposedWarning(this.id);
- return;
- }
- this._zr.resize(opts);
- var ecModel = this._model;
- // Resize loading effect
- this._loadingFX && this._loadingFX.resize();
- if (!ecModel) {
- return;
- }
- var needPrepare = ecModel.resetOption('media');
- var silent = opts && opts.silent;
- // There is some real cases that:
- // chart.setOption(option, { lazyUpdate: true });
- // chart.resize();
- 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({
- // Disable animation
- 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);
- };
- ECharts.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]) {
- if (process.env.NODE_ENV !== 'production') {
- warn('Loading effects ' + name + ' not exists.');
- }
- return;
- }
- var el = loadingEffects[name](this._api, cfg);
- var zr = this._zr;
- this._loadingFX = el;
- zr.add(el);
- };
- /**
- * Hide loading effect
- */
- ECharts.prototype.hideLoading = function () {
- if (this._disposed) {
- disposedWarning(this.id);
- return;
- }
- this._loadingFX && this._zr.remove(this._loadingFX);
- this._loadingFX = null;
- };
- ECharts.prototype.makeActionFromEvent = function (eventObj) {
- var payload = extend({}, eventObj);
- payload.type = eventActionMap[eventObj.type];
- return payload;
- };
- /**
- * @param opt If pass boolean, means opt.silent
- * @param opt.silent Default `false`. Whether trigger events.
- * @param opt.flush Default `undefined`.
- * true: Flush immediately, and then pixel in canvas can be fetched
- * immediately. Caution: it might affect performance.
- * false: Not flush.
- * undefined: Auto decide whether perform flush.
- */
- ECharts.prototype.dispatchAction = function (payload, opt) {
- if (this._disposed) {
- disposedWarning(this.id);
- return;
- }
- if (!isObject(opt)) {
- opt = {
- silent: !!opt
- };
- }
- if (!actions[payload.type]) {
- return;
- }
- // Avoid dispatch action before setOption. Especially in `connect`.
- if (!this._model) {
- return;
- }
- // May dispatchAction in rendering procedure
- 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) {
- // In WeChat embedded browser, `requestAnimationFrame` and `setInterval`
- // hang when sliding page (on touch event), which cause that zr does not
- // refresh until user interaction finished, which is not expected.
- // But `dispatchAction` may be called too frequently when pan on touch
- // screen, which impacts performance if do not throttle them.
- this._throttledZrFlush();
- }
- flushPendingActions.call(this, silent);
- triggerUpdatedEvent.call(this, silent);
- };
- ECharts.prototype.updateLabelLayout = function () {
- lifecycle.trigger('series:layoutlabels', this._model, this._api, {
- // Not adding series labels.
- // TODO
- updatedSeries: []
- });
- };
- ECharts.prototype.appendData = function (params) {
- if (this._disposed) {
- disposedWarning(this.id);
- return;
- }
- var seriesIndex = params.seriesIndex;
- var ecModel = this.getModel();
- var seriesModel = ecModel.getSeriesByIndex(seriesIndex);
- if (process.env.NODE_ENV !== 'production') {
- assert(params.data && seriesModel);
- }
- seriesModel.appendData(params);
- // Note: `appendData` does not support that update extent of coordinate
- // system, util some scenario require that. In the expected usage of
- // `appendData`, the initial extent of coordinate system should better
- // be fixed by axis `min`/`max` setting or initial data, otherwise if
- // the extent changed while `appendData`, the location of the painted
- // graphic elements have to be changed, which make the usage of
- // `appendData` meaningless.
- this._scheduler.unfinished = true;
- this.getZr().wakeUp();
- };
- // A work around for no `internal` modifier in ts yet but
- // need to strictly hide private methods to JS users.
- ECharts.internalField = function () {
- prepare = function (ecIns) {
- var scheduler = ecIns._scheduler;
- scheduler.restorePipelines(ecIns._model);
- scheduler.prepareStageTasks();
- prepareView(ecIns, true);
- prepareView(ecIns, false);
- scheduler.plan();
- };
- /**
- * Prepare view instances of charts and components
- */
- 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) {
- // By default view will be reused if possible for the case that `setOption` with "notMerge"
- // mode and need to enable transition animation. (Usually, when they have the same id, or
- // especially no id but have the same type & name & index. See the `model.id` generation
- // rule in `makeIdAndName` and `viewId` generation rule here).
- // But in `replaceMerge` mode, this feature should be able to disabled when it is clear that
- // the new model has nothing to do with the old model.
- var requireNewView = model.__requireNewView;
- // This command should not work twice.
- model.__requireNewView = false;
- // Consider: id same and type changed.
- var viewId = '_ec_' + model.id + '_' + model.type;
- var view = !requireNewView && viewMap[viewId];
- if (!view) {
- var classType = parseClassType(model.type);
- var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) :
- // FIXME:TS
- // (ChartView as ChartViewConstructor).getClass('series', classType.sub)
- // For backward compat, still support a chart type declared as only subType
- // like "liquidfill", but recommend "series.liquidfill"
- // But need a base class to make a type series.
- ChartView.getClass(classType.sub);
- if (process.env.NODE_ENV !== 'production') {
- assert(Clazz, classType.sub + ' does not exist.');
- }
- view = new Clazz();
- view.init(ecModel, api);
- viewMap[viewId] = view;
- viewList.push(view);
- zr.add(view.group);
- }
- model.__viewId = view.__id = viewId;
- view.__alive = true;
- view.__model = model;
- view.group.__ecComponentInfo = {
- mainType: model.mainType,
- index: model.componentIndex
- };
- !isComponent && scheduler.prepareView(view, 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);
- // broadcast
- if (!mainType) {
- // FIXME
- // Chart will not be update directly here, except set dirty.
- // But there is no such scenario now.
- 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: mainType,
- query: query
- };
- subType && (condition.subType = subType); // subType may be '' by parseClassType;
- var excludeSeriesId = payload.excludeSeriesId;
- var excludeSeriesIdMap;
- if (excludeSeriesId != null) {
- excludeSeriesIdMap = createHashMap();
- each(modelUtil.normalizeToArray(excludeSeriesId), function (id) {
- var modelId = modelUtil.convertOptionIdName(id, null);
- if (modelId != null) {
- excludeSeriesIdMap.set(modelId, true);
- }
- });
- }
- // If dispatchAction before setOption, do nothing.
- 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);
- }
- // PENDING:
- // Whether to put this "enter emphasis" code in `ComponentView`,
- // which will be the same as `ChartView` but might be not necessary
- // and will be far from this logic.
- if (dispatchers) {
- each(dispatchers, function (dispatcher) {
- payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher);
- });
- }
- }
- } else if (isSelectChangePayload(payload)) {
- // TODO geo
- 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, {
- // Needs to mark option changed if newOption is given.
- // It's from MagicType.
- // TODO If use a separate flag optionChanged in 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;
- // update before setOption
- if (!ecModel) {
- return;
- }
- ecModel.setUpdatePayload(payload);
- scheduler.restoreData(ecModel, payload);
- scheduler.performSeriesTasks(ecModel);
- // TODO
- // Save total ecModel here for undo/redo (after restoring data and before processing data).
- // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call.
- // Create new coordinate system each update
- // In LineView may save the old coordinate system and use it to get the original point.
- coordSysMgr.create(ecModel, api);
- scheduler.performDataProcessorTasks(ecModel, payload);
- // Current stream render is not supported in data process. So we can update
- // stream modes after data processing, where the filtered data is used to
- // determine whether to use progressive rendering.
- updateStreamModes(this, ecModel);
- // We update stream modes before coordinate system updated, then the modes info
- // can be fetched when coord sys updating (consider the barGrid extent fix). But
- // the drawback is the full coord info can not be fetched. Fortunately this full
- // coord is not required in stream mode updater currently.
- coordSysMgr.update(ecModel, api);
- clearColorPalette(ecModel);
- scheduler.performVisualTasks(ecModel, payload);
- render(this, ecModel, api, payload, updateParams);
- // Set background
- var backgroundColor = ecModel.get('backgroundColor') || 'transparent';
- var darkMode = ecModel.get('darkMode');
- zr.setBackgroundColor(backgroundColor);
- // Force set dark mode.
- 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;
- // update before setOption
- if (!ecModel) {
- return;
- }
- ecModel.setUpdatePayload(payload);
- // ChartView.markUpdateMethod(payload, 'updateTransform');
- 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);
- // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.
- // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true);
- this._scheduler.performVisualTasks(ecModel, payload, {
- setDirty: true,
- dirtyMap: seriesDirtyMap
- });
- // Currently, not call render of components. Geo render cost a lot.
- // renderComponents(ecIns, ecModel, api, payload, componentDirtyList);
- renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap);
- lifecycle.trigger('afterupdate', ecModel, api);
- },
- updateView: function (payload) {
- var ecModel = this._model;
- // update before setOption
- if (!ecModel) {
- return;
- }
- ecModel.setUpdatePayload(payload);
- ChartView.markUpdateMethod(payload, 'updateView');
- clearColorPalette(ecModel);
- // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.
- this._scheduler.performVisualTasks(ecModel, payload, {
- setDirty: true
- });
- render(this, ecModel, this._api, payload, {});
- lifecycle.trigger('afterupdate', ecModel, this._api);
- },
- updateVisual: function (payload) {
- // updateMethods.update.call(this, payload);
- var _this = this;
- var ecModel = this._model;
- // update before setOption
- if (!ecModel) {
- return;
- }
- ecModel.setUpdatePayload(payload);
- // clear all visual
- ecModel.eachSeries(function (seriesModel) {
- seriesModel.getData().clearAllVisual();
- });
- // Perform visual
- ChartView.markUpdateMethod(payload, 'updateVisual');
- clearColorPalette(ecModel);
- // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.
- 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 = modelUtil.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;
- }
- }
- if (process.env.NODE_ENV !== 'production') {
- warn('No coordinate system that supports ' + methodName + ' found by the given finder.');
- }
- };
- 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;
- // Batch action
- 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);
- // Only leave blur once if there are multiple batches.
- if (isHighDown) {
- allLeaveBlur(this._api);
- }
- each(payloads, function (batchItem) {
- // Action can specify the event by return it.
- eventObj = actionWrap.action(batchItem, _this._model, _this._api);
- // Emit event outside
- eventObj = eventObj || extend({}, batchItem);
- // Convert type to eventType
- eventObj.type = actionInfo.event || eventObj.type;
- eventObjBatch.push(eventObj);
- // light update does not perform data process, layout and visual.
- if (isHighDown) {
- var _a = modelUtil.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) {
- // At present `dispatchAction({ type: 'select', ... })` is not supported on components.
- // geo still use 'geoselect'.
- 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 {
- // Still dirty
- 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;
- }
- }
- // Follow the rule of action batch
- if (batched) {
- eventObj = {
- type: actionInfo.event || payloadType,
- escapeConnect: escapeConnect,
- batch: eventObjBatch
- };
- } else {
- eventObj = eventObjBatch[0];
- }
- this[IN_MAIN_PROCESS_KEY] = false;
- if (!silent) {
- var messageCenter = this._messageCenter;
- messageCenter.trigger(eventObj.type, eventObj);
- // Extra triggered 'selectchanged' event
- if (isSelectChange) {
- var newObj = {
- type: 'selectchanged',
- escapeConnect: 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');
- };
- /**
- * Event `rendered` is triggered when zr
- * rendered. It is useful for realtime
- * snapshot (reflect animation).
- *
- * Event `finished` is triggered when:
- * (1) zrender rendering finished.
- * (2) initial animation finished.
- * (3) progressive rendering finished.
- * (4) no pending action.
- * (5) no delayed setOption needs to be processed.
- */
- bindRenderedEvent = function (zr, ecIns) {
- zr.on('rendered', function (params) {
- ecIns.trigger('rendered', params);
- // The `finished` event should not be triggered repeatedly,
- // so it should only be triggered when rendering indeed happens
- // in zrender. (Consider the case that dipatchAction is keep
- // triggering when mouse move).
- if (
- // Although zr is dirty if initial animation is not finished
- // and this checking is called on frame, we also check
- // animation finished for robustness.
- 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();
- });
- }
- ;
- // Allocate zlevels for series and components
- function allocateZlevels(ecModel) {
- ;
- var componentZLevels = [];
- var seriesZLevels = [];
- var hasSeparateZLevel = false;
- ecModel.eachComponent(function (componentType, componentModel) {
- var zlevel = componentModel.get('zlevel') || 0;
- var z = componentModel.get('z') || 0;
- var zlevelKey = componentModel.getZLevelKey();
- hasSeparateZLevel = hasSeparateZLevel || !!zlevelKey;
- (componentType === 'series' ? seriesZLevels : componentZLevels).push({
- zlevel: zlevel,
- z: z,
- idx: componentModel.componentIndex,
- type: componentType,
- key: zlevelKey
- });
- });
- if (hasSeparateZLevel) {
- // Series after component
- var zLevels = componentZLevels.concat(seriesZLevels);
- var lastSeriesZLevel_1;
- var lastSeriesKey_1;
- timsort(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);
- // Remove groups of unrendered charts
- 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);
- });
- };
- /**
- * Render each chart and component
- */
- renderSeries = function (ecIns, ecModel, api, payload, updateParams, dirtyMap) {
- // Render all charts
- var scheduler = ecIns._scheduler;
- updateParams = extend(updateParams || {}, {
- updatedSeries: ecModel.getSeries()
- });
- // TODO progressive?
- 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);
- // TODO states on marker.
- 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');
- // Should not call markRedraw on group, because it will disable zrender
- // incremental render (always render from the __startIndex each frame)
- // chartView.group.markRedraw();
- updateBlend(seriesModel, chartView);
- updateSeriesElementSelection(seriesModel);
- });
- scheduler.unfinished = unfinished || scheduler.unfinished;
- lifecycle.trigger('series:layoutlabels', ecModel, api, updateParams);
- // transition after label is layouted.
- lifecycle.trigger('series:transition', ecModel, api, updateParams);
- ecModel.eachSeries(function (seriesModel) {
- var chartView = ecIns._chartsMap[seriesModel.__viewId];
- // Update Z after labels updated. Before applying states.
- updateZ(seriesModel, chartView);
- // NOTE: Update states after label is updated.
- // label should be in normal status when layouting.
- updateStates(seriesModel, chartView);
- });
- // If use hover layer
- updateHoverLayerStatus(ecIns, ecModel);
- lifecycle.trigger('series:afterupdate', ecModel, api, updateParams);
- };
- markStatusToUpdate = function (ecIns) {
- ecIns[STATUS_NEEDS_UPDATE_KEY] = true;
- // Wake up zrender if it's sleep. Let it update states in the next frame.
- ecIns.getZr().wakeUp();
- };
- applyChangedStates = function (ecIns) {
- if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) {
- return;
- }
- ecIns.getZr().storage.traverse(function (el) {
- // Not applied on removed elements, it may still in fading.
- if (graphic.isElementRemoved(el)) {
- return;
- }
- applyElementStates(el);
- });
- ecIns[STATUS_NEEDS_UPDATE_KEY] = false;
- };
- function applyElementStates(el) {
- var newStates = [];
- var oldStates = el.currentStates;
- // Keep other states.
- for (var i = 0; i < oldStates.length; i++) {
- var stateName = oldStates[i];
- if (!(stateName === 'emphasis' || stateName === 'blur' || stateName === 'select')) {
- newStates.push(stateName);
- }
- }
- // Only use states when it's exists.
- 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;
- }
- });
- }
- });
- }
- }
- ;
- /**
- * Update chart and blend.
- */
- function updateBlend(seriesModel, chartView) {
- var blendMode = seriesModel.get('blendMode') || null;
- chartView.eachRendered(function (el) {
- // FIXME marker and other components
- if (!el.isGroup) {
- // DON'T mark the element dirty. In case element is incremental and don't want to rerender.
- el.style.blend = blendMode;
- }
- });
- }
- ;
- function updateZ(model, view) {
- if (model.preventAutoZ) {
- return;
- }
- var z = model.get('z') || 0;
- var zlevel = model.get('zlevel') || 0;
- // Set z and zlevel
- view.eachRendered(function (el) {
- doUpdateZ(el, z, zlevel, -Infinity);
- // Don't traverse the children because it has been traversed in _updateZ.
- return true;
- });
- }
- ;
- function doUpdateZ(el, z, zlevel, maxZ2) {
- // Group may also have textContent
- var label = el.getTextContent();
- var labelLine = el.getTextGuideLine();
- var isGroup = el.isGroup;
- if (isGroup) {
- // set z & zlevel of children elements of Group
- var children = el.childrenRef();
- for (var i = 0; i < children.length; i++) {
- maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2);
- }
- } else {
- // not Group
- el.z = z;
- el.zlevel = zlevel;
- maxZ2 = Math.max(el.z2, maxZ2);
- }
- // always set z and zlevel if label/labelLine exists
- if (label) {
- label.z = z;
- label.zlevel = zlevel;
- // lift z2 of text content
- // TODO if el.emphasis.z2 is spcefied, what about textContent.
- 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;
- }
- // Clear states without animation.
- // TODO States on component.
- function clearStates(model, view) {
- view.eachRendered(function (el) {
- // Not applied on removed elements, it may still in fading.
- if (graphic.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;
- }
- // TODO If el is incremental.
- 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: duration,
- delay: stateAnimationModel.get('delay'),
- easing: stateAnimationModel.get('easing')
- // additive: stateAnimationModel.get('additive')
- } : null;
- view.eachRendered(function (el) {
- if (el.states && el.states.emphasis) {
- // Not applied on removed elements, it may still in fading.
- if (graphic.isElementRemoved(el)) {
- return;
- }
- if (el instanceof graphic.Path) {
- savePathStates(el);
- }
- // Only updated on changed element. In case element is incremental and don't want to rerender.
- // TODO, a more proper way?
- if (el.__dirty) {
- var prevStates = el.prevStates;
- // Restore states without animation
- if (prevStates) {
- el.useStates(prevStates);
- }
- }
- // Update state transition and enable animation again.
- if (enableAnimation) {
- el.stateTransition = stateTransition;
- var textContent = el.getTextContent();
- var textGuide = el.getTextGuideLine();
- // TODO Is it necessary to animate label?
- if (textContent) {
- textContent.stateTransition = stateTransition;
- }
- if (textGuide) {
- textGuide.stateTransition = stateTransition;
- }
- }
- // Use highlighted and selected flag to toggle states.
- if (el.__dirty) {
- applyElementStates(el);
- }
- }
- });
- }
- ;
- createExtensionAPI = function (ecIns) {
- return new ( /** @class */function (_super) {
- __extends(class_1, _super);
- function class_1() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- class_1.prototype.getCoordinateSystems = function () {
- return ecIns._coordSysMgr.getCoordinateSystems();
- };
- class_1.prototype.getComponentByElement = function (el) {
- while (el) {
- var modelInfo = el.__ecComponentInfo;
- if (modelInfo != null) {
- return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index);
- }
- el = el.parent;
- }
- };
- class_1.prototype.enterEmphasis = function (el, highlightDigit) {
- enterEmphasis(el, highlightDigit);
- markStatusToUpdate(ecIns);
- };
- class_1.prototype.leaveEmphasis = function (el, highlightDigit) {
- leaveEmphasis(el, highlightDigit);
- markStatusToUpdate(ecIns);
- };
- class_1.prototype.enterBlur = function (el) {
- enterBlur(el);
- markStatusToUpdate(ecIns);
- };
- class_1.prototype.leaveBlur = function (el) {
- leaveBlur(el);
- markStatusToUpdate(ecIns);
- };
- class_1.prototype.enterSelect = function (el) {
- enterSelect(el);
- markStatusToUpdate(ecIns);
- };
- class_1.prototype.leaveSelect = function (el) {
- leaveSelect(el);
- markStatusToUpdate(ecIns);
- };
- class_1.prototype.getModel = function () {
- return ecIns.getModel();
- };
- class_1.prototype.getViewOfComponentModel = function (componentModel) {
- return ecIns.getViewOfComponentModel(componentModel);
- };
- class_1.prototype.getViewOfSeriesModel = function (seriesModel) {
- return ecIns.getViewOfSeriesModel(seriesModel);
- };
- return class_1;
- }(ExtensionAPI))(ecIns);
- };
- enableConnect = function (chart) {
- function updateConnectedChartsStatus(charts, status) {
- for (var i = 0; i < charts.length; i++) {
- var otherChart = charts[i];
- otherChart[CONNECT_STATUS_KEY] = status;
- }
- }
- each(eventActionMap, function (actionType, eventType) {
- chart._messageCenter.on(eventType, function (event) {
- if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) {
- if (event && event.escapeConnect) {
- return;
- }
- var action_1 = chart.makeActionFromEvent(event);
- var otherCharts_1 = [];
- each(instances, function (otherChart) {
- if (otherChart !== chart && otherChart.group === chart.group) {
- otherCharts_1.push(otherChart);
- }
- });
- updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING);
- each(otherCharts_1, function (otherChart) {
- if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) {
- otherChart.dispatchAction(action_1);
- }
- });
- updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED);
- }
- });
- });
- };
- }();
- return ECharts;
- }(Eventful);
- var echartsProto = ECharts.prototype;
- echartsProto.on = createRegisterEventWithLowercaseECharts('on');
- echartsProto.off = createRegisterEventWithLowercaseECharts('off');
- /**
- * @deprecated
- */
- // @ts-ignore
- echartsProto.one = function (eventName, cb, ctx) {
- var self = this;
- deprecateLog('ECharts#one is deprecated.');
- function wrapped() {
- var args2 = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args2[_i] = arguments[_i];
- }
- cb && cb.apply && cb.apply(this, args2);
- // @ts-ignore
- self.off(eventName, wrapped);
- }
- ;
- // @ts-ignore
- this.on.call(this, eventName, wrapped, ctx);
- };
- var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu'];
- function disposedWarning(id) {
- if (process.env.NODE_ENV !== 'production') {
- warn('Instance ' + id + ' has been disposed');
- }
- }
- var actions = {};
- /**
- * Map eventType to actionType
- */
- var eventActionMap = {};
- var dataProcessorFuncs = [];
- var optionPreprocessorFuncs = [];
- var visualFuncs = [];
- var themeStorage = {};
- var loadingEffects = {};
- var instances = {};
- var connectedGroups = {};
- var idBase = +new Date() - 0;
- var groupIdBase = +new Date() - 0;
- var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
- /**
- * @param opts.devicePixelRatio Use window.devicePixelRatio by default
- * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart.
- * @param opts.width Use clientWidth of the input `dom` by default.
- * Can be 'auto' (the same as null/undefined)
- * @param opts.height Use clientHeight of the input `dom` by default.
- * Can be 'auto' (the same as null/undefined)
- * @param opts.locale Specify the locale.
- * @param opts.useDirtyRect Enable dirty rectangle rendering or not.
- */
- export function init(dom, theme, opts) {
- var isClient = !(opts && opts.ssr);
- if (isClient) {
- if (process.env.NODE_ENV !== 'production') {
- if (!dom) {
- throw new Error('Initialize failed: invalid dom.');
- }
- }
- var existInstance = getInstanceByDom(dom);
- if (existInstance) {
- if (process.env.NODE_ENV !== 'production') {
- warn('There is a chart instance already initialized on the dom.');
- }
- return existInstance;
- }
- if (process.env.NODE_ENV !== 'production') {
- if (isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth && (!opts || opts.width == null) || !dom.clientHeight && (!opts || opts.height == null))) {
- warn('Can\'t get DOM width or height. Please check ' + 'dom.clientWidth and dom.clientHeight. They should not be 0.' + 'For example, you may need to call this in the callback ' + 'of window.onload.');
- }
- }
- }
- var chart = new ECharts(dom, theme, opts);
- chart.id = 'ec_' + idBase++;
- instances[chart.id] = chart;
- isClient && modelUtil.setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id);
- enableConnect(chart);
- lifecycle.trigger('afterinit', chart);
- return chart;
- }
- /**
- * @usage
- * (A)
- * ```js
- * let chart1 = echarts.init(dom1);
- * let chart2 = echarts.init(dom2);
- * chart1.group = 'xxx';
- * chart2.group = 'xxx';
- * echarts.connect('xxx');
- * ```
- * (B)
- * ```js
- * let chart1 = echarts.init(dom1);
- * let chart2 = echarts.init(dom2);
- * echarts.connect('xxx', [chart1, chart2]);
- * ```
- */
- export function connect(groupId) {
- // Is array of charts
- if (isArray(groupId)) {
- var charts = groupId;
- groupId = null;
- // If any chart has group
- each(charts, function (chart) {
- if (chart.group != null) {
- groupId = chart.group;
- }
- });
- groupId = groupId || 'g_' + groupIdBase++;
- each(charts, function (chart) {
- chart.group = groupId;
- });
- }
- connectedGroups[groupId] = true;
- return groupId;
- }
- export function disconnect(groupId) {
- connectedGroups[groupId] = false;
- }
- /**
- * Alias and backward compatibility
- * @deprecated
- */
- export var disConnect = disconnect;
- /**
- * Dispose a chart instance
- */
- export function dispose(chart) {
- if (isString(chart)) {
- chart = instances[chart];
- } else if (!(chart instanceof ECharts)) {
- // Try to treat as dom
- chart = getInstanceByDom(chart);
- }
- if (chart instanceof ECharts && !chart.isDisposed()) {
- chart.dispose();
- }
- }
- export function getInstanceByDom(dom) {
- return instances[modelUtil.getAttribute(dom, DOM_ATTRIBUTE_KEY)];
- }
- export function getInstanceById(key) {
- return instances[key];
- }
- /**
- * Register theme
- */
- export function registerTheme(name, theme) {
- themeStorage[name] = theme;
- }
- /**
- * Register option preprocessor
- */
- export function registerPreprocessor(preprocessorFunc) {
- if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) {
- optionPreprocessorFuncs.push(preprocessorFunc);
- }
- }
- export function registerProcessor(priority, processor) {
- normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT);
- }
- /**
- * Register postIniter
- * @param {Function} postInitFunc
- */
- export function registerPostInit(postInitFunc) {
- registerUpdateLifecycle('afterinit', postInitFunc);
- }
- /**
- * Register postUpdater
- * @param {Function} postUpdateFunc
- */
- export function registerPostUpdate(postUpdateFunc) {
- registerUpdateLifecycle('afterupdate', postUpdateFunc);
- }
- export function registerUpdateLifecycle(name, cb) {
- lifecycle.on(name, cb);
- }
- export function registerAction(actionInfo, eventName, action) {
- if (isFunction(eventName)) {
- action = eventName;
- eventName = '';
- }
- var actionType = isObject(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = {
- event: eventName
- }][0];
- // Event name is all lowercase
- actionInfo.event = (actionInfo.event || actionType).toLowerCase();
- eventName = actionInfo.event;
- if (eventActionMap[eventName]) {
- // Already registered.
- return;
- }
- // Validate action type and event name.
- assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName));
- if (!actions[actionType]) {
- actions[actionType] = {
- action: action,
- actionInfo: actionInfo
- };
- }
- eventActionMap[eventName] = actionType;
- }
- export function registerCoordinateSystem(type, coordSysCreator) {
- CoordinateSystemManager.register(type, coordSysCreator);
- }
- /**
- * Get dimensions of specified coordinate system.
- * @param {string} type
- * @return {Array.<string|Object>}
- */
- export function getCoordinateSystemDimensions(type) {
- var coordSysCreator = CoordinateSystemManager.get(type);
- if (coordSysCreator) {
- return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice();
- }
- }
- export { registerLocale } from './locale.js';
- function registerLayout(priority, layoutTask) {
- normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout');
- }
- function registerVisual(priority, visualTask) {
- normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual');
- }
- export { registerLayout, registerVisual };
- var registeredTasks = [];
- function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) {
- if (isFunction(priority) || isObject(priority)) {
- fn = priority;
- priority = defaultPriority;
- }
- if (process.env.NODE_ENV !== 'production') {
- if (isNaN(priority) || priority == null) {
- throw new Error('Illegal priority');
- }
- // Check duplicate
- each(targetList, function (wrap) {
- assert(wrap.__raw !== fn);
- });
- }
- // Already registered
- if (indexOf(registeredTasks, fn) >= 0) {
- return;
- }
- registeredTasks.push(fn);
- var stageHandler = Scheduler.wrapStageHandler(fn, visualType);
- stageHandler.__prio = priority;
- stageHandler.__raw = fn;
- targetList.push(stageHandler);
- }
- export function registerLoading(name, loadingFx) {
- loadingEffects[name] = loadingFx;
- }
- /**
- * ZRender need a canvas context to do measureText.
- * But in node environment canvas may be created by node-canvas.
- * So we need to specify how to create a canvas instead of using document.createElement('canvas')
- *
- *
- * @deprecated use setPlatformAPI({ createCanvas }) instead.
- *
- * @example
- * let Canvas = require('canvas');
- * let echarts = require('echarts');
- * echarts.setCanvasCreator(function () {
- * // Small size is enough.
- * return new Canvas(32, 32);
- * });
- */
- export function setCanvasCreator(creator) {
- if (process.env.NODE_ENV !== 'production') {
- deprecateLog('setCanvasCreator is deprecated. Use setPlatformAPI({ createCanvas }) instead.');
- }
- setPlatformAPI({
- createCanvas: creator
- });
- }
- /**
- * The parameters and usage: see `geoSourceManager.registerMap`.
- * Compatible with previous `echarts.registerMap`.
- */
- export function registerMap(mapName, geoJson, specialAreas) {
- var registerMap = getImpl('registerMap');
- registerMap && registerMap(mapName, geoJson, specialAreas);
- }
- export function getMap(mapName) {
- var getMap = getImpl('getMap');
- return getMap && getMap(mapName);
- }
- export var registerTransform = registerExternalTransform;
- /**
- * Globa dispatchAction to a specified chart instance.
- */
- // export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters<ECharts['dispatchAction']>[1]) {
- // if (!payload || !payload.chartId) {
- // // Must have chartId to find chart
- // return;
- // }
- // const chart = instances[payload.chartId];
- // if (chart) {
- // chart.dispatchAction(payload, opt);
- // }
- // }
- // Builtin global visual
- registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask);
- registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask);
- registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask);
- registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask);
- registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask);
- registerVisual(PRIORITY_VISUAL_DECAL, decal);
- registerPreprocessor(backwardCompat);
- registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack);
- registerLoading('default', loadingDefault);
- // Default actions
- registerAction({
- type: HIGHLIGHT_ACTION_TYPE,
- event: HIGHLIGHT_ACTION_TYPE,
- update: HIGHLIGHT_ACTION_TYPE
- }, noop);
- registerAction({
- type: DOWNPLAY_ACTION_TYPE,
- event: DOWNPLAY_ACTION_TYPE,
- update: DOWNPLAY_ACTION_TYPE
- }, noop);
- registerAction({
- type: SELECT_ACTION_TYPE,
- event: SELECT_ACTION_TYPE,
- update: SELECT_ACTION_TYPE
- }, noop);
- registerAction({
- type: UNSELECT_ACTION_TYPE,
- event: UNSELECT_ACTION_TYPE,
- update: UNSELECT_ACTION_TYPE
- }, noop);
- registerAction({
- type: TOGGLE_SELECT_ACTION_TYPE,
- event: TOGGLE_SELECT_ACTION_TYPE,
- update: TOGGLE_SELECT_ACTION_TYPE
- }, noop);
- // Default theme
- registerTheme('light', lightTheme);
- registerTheme('dark', darkTheme);
- // For backward compatibility, where the namespace `dataTool` will
- // be mounted on `echarts` is the extension `dataTool` is imported.
- export var dataTool = {};
|