You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					281 lines
				
				8.0 KiB
			
		
		
			
		
	
	
					281 lines
				
				8.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _util = require("zrender/lib/core/util");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var each = _util.each;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Group = require("zrender/lib/container/Group");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var componentUtil = require("../util/component");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var clazzUtil = require("../util/clazz");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var modelUtil = require("../util/model");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _task = require("../stream/task");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var createTask = _task.createTask;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var createRenderPlanner = require("../chart/helper/createRenderPlanner");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								var inner = modelUtil.makeInner();
							 | 
						||
| 
								 | 
							
								var renderPlanner = createRenderPlanner();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Chart() {
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @type {module:zrender/container/Group}
							 | 
						||
| 
								 | 
							
								   * @readOnly
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  this.group = new Group();
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @type {string}
							 | 
						||
| 
								 | 
							
								   * @readOnly
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.uid = componentUtil.getUID('viewChart');
							 | 
						||
| 
								 | 
							
								  this.renderTask = createTask({
							 | 
						||
| 
								 | 
							
								    plan: renderTaskPlan,
							 | 
						||
| 
								 | 
							
								    reset: renderTaskReset
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  this.renderTask.context = {
							 | 
						||
| 
								 | 
							
								    view: this
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Chart.prototype = {
							 | 
						||
| 
								 | 
							
								  type: 'chart',
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Init the chart.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  init: function (ecModel, api) {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Render the chart.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Series} seriesModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   * @param  {Object} payload
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  render: function (seriesModel, ecModel, api, payload) {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Highlight series or specified data item.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Series} seriesModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   * @param  {Object} payload
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  highlight: function (seriesModel, ecModel, api, payload) {
							 | 
						||
| 
								 | 
							
								    toggleHighlight(seriesModel.getData(), payload, 'emphasis');
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Downplay series or specified data item.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Series} seriesModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   * @param  {Object} payload
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  downplay: function (seriesModel, ecModel, api, payload) {
							 | 
						||
| 
								 | 
							
								    toggleHighlight(seriesModel.getData(), payload, 'normal');
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Remove self.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  remove: function (ecModel, api) {
							 | 
						||
| 
								 | 
							
								    this.group.removeAll();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Dispose self.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  dispose: function () {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Rendering preparation in progressive mode.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Series} seriesModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   * @param  {Object} payload
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  incrementalPrepareRender: null,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Render in progressive mode.
							 | 
						||
| 
								 | 
							
								   * @param  {Object} params See taskParams in `stream/task.js`
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Series} seriesModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   * @param  {Object} payload
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  incrementalRender: null,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Update transform directly.
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Series} seriesModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/model/Global} ecModel
							 | 
						||
| 
								 | 
							
								   * @param  {module:echarts/ExtensionAPI} api
							 | 
						||
| 
								 | 
							
								   * @param  {Object} payload
							 | 
						||
| 
								 | 
							
								   * @return {Object} {update: true}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  updateTransform: null,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * The view contains the given point.
							 | 
						||
| 
								 | 
							
								   * @interface
							 | 
						||
| 
								 | 
							
								   * @param {Array.<number>} point
							 | 
						||
| 
								 | 
							
								   * @return {boolean}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  // containPoint: function () {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @param {string} eventType
							 | 
						||
| 
								 | 
							
								   * @param {Object} query
							 | 
						||
| 
								 | 
							
								   * @param {module:zrender/Element} targetEl
							 | 
						||
| 
								 | 
							
								   * @param {Object} packedEvent
							 | 
						||
| 
								 | 
							
								   * @return {boolen} Pass only when return `true`.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  filterForExposedEvent: null
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var chartProto = Chart.prototype;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								chartProto.updateView = chartProto.updateLayout = chartProto.updateVisual = function (seriesModel, ecModel, api, payload) {
							 | 
						||
| 
								 | 
							
								  this.render(seriesModel, ecModel, api, payload);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Set state of single element
							 | 
						||
| 
								 | 
							
								 * @param  {module:zrender/Element} el
							 | 
						||
| 
								 | 
							
								 * @param  {string} state
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function elSetState(el, state) {
							 | 
						||
| 
								 | 
							
								  if (el) {
							 | 
						||
| 
								 | 
							
								    el.trigger(state);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (el.type === 'group') {
							 | 
						||
| 
								 | 
							
								      for (var i = 0; i < el.childCount(); i++) {
							 | 
						||
| 
								 | 
							
								        elSetState(el.childAt(i), state);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param  {module:echarts/data/List} data
							 | 
						||
| 
								 | 
							
								 * @param  {Object} payload
							 | 
						||
| 
								 | 
							
								 * @param  {string} state 'normal'|'emphasis'
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function toggleHighlight(data, payload, state) {
							 | 
						||
| 
								 | 
							
								  var dataIndex = modelUtil.queryDataIndex(data, payload);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (dataIndex != null) {
							 | 
						||
| 
								 | 
							
								    each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
							 | 
						||
| 
								 | 
							
								      elSetState(data.getItemGraphicEl(dataIdx), state);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    data.eachItemGraphicEl(function (el) {
							 | 
						||
| 
								 | 
							
								      elSetState(el, state);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								} // Enable Chart.extend.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								clazzUtil.enableClassExtend(Chart, ['dispose']); // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								clazzUtil.enableClassManagement(Chart, {
							 | 
						||
| 
								 | 
							
								  registerWhenExtend: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Chart.markUpdateMethod = function (payload, methodName) {
							 | 
						||
| 
								 | 
							
								  inner(payload).updateMethod = methodName;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function renderTaskPlan(context) {
							 | 
						||
| 
								 | 
							
								  return renderPlanner(context.model);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function renderTaskReset(context) {
							 | 
						||
| 
								 | 
							
								  var seriesModel = context.model;
							 | 
						||
| 
								 | 
							
								  var ecModel = context.ecModel;
							 | 
						||
| 
								 | 
							
								  var api = context.api;
							 | 
						||
| 
								 | 
							
								  var payload = context.payload; // ???! remove updateView updateVisual
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var progressiveRender = seriesModel.pipelineContext.progressiveRender;
							 | 
						||
| 
								 | 
							
								  var view = context.view;
							 | 
						||
| 
								 | 
							
								  var updateMethod = payload && inner(payload).updateMethod;
							 | 
						||
| 
								 | 
							
								  var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod // `appendData` is also supported when data amount
							 | 
						||
| 
								 | 
							
								  // is less than progressive threshold.
							 | 
						||
| 
								 | 
							
								  : 'render';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (methodName !== 'render') {
							 | 
						||
| 
								 | 
							
								    view[methodName](seriesModel, ecModel, api, payload);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return progressMethodMap[methodName];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var progressMethodMap = {
							 | 
						||
| 
								 | 
							
								  incrementalPrepareRender: {
							 | 
						||
| 
								 | 
							
								    progress: function (params, context) {
							 | 
						||
| 
								 | 
							
								      context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  render: {
							 | 
						||
| 
								 | 
							
								    // Put view.render in `progress` to support appendData. But in this case
							 | 
						||
| 
								 | 
							
								    // view.render should not be called in reset, otherwise it will be called
							 | 
						||
| 
								 | 
							
								    // twise. Use `forceFirstProgress` to make sure that view.render is called
							 | 
						||
| 
								 | 
							
								    // in any cases.
							 | 
						||
| 
								 | 
							
								    forceFirstProgress: true,
							 | 
						||
| 
								 | 
							
								    progress: function (params, context) {
							 | 
						||
| 
								 | 
							
								      context.view.render(context.model, context.ecModel, context.api, context.payload);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var _default = Chart;
							 | 
						||
| 
								 | 
							
								module.exports = _default;
							 |