| 
/* 
 | 
* 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. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* 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 Model from '../../model/Model.js'; 
 | 
import { each, curry, clone, defaults, isArray, indexOf } from 'zrender/lib/core/util.js'; 
 | 
// Build axisPointerModel, mergin tooltip.axisPointer model for each axis. 
 | 
// allAxesInfo should be updated when setOption performed. 
 | 
export function collect(ecModel, api) { 
 | 
  var result = { 
 | 
    /** 
 | 
     * key: makeKey(axis.model) 
 | 
     * value: { 
 | 
     *      axis, 
 | 
     *      coordSys, 
 | 
     *      axisPointerModel, 
 | 
     *      triggerTooltip, 
 | 
     *      triggerEmphasis, 
 | 
     *      involveSeries, 
 | 
     *      snap, 
 | 
     *      seriesModels, 
 | 
     *      seriesDataCount 
 | 
     * } 
 | 
     */ 
 | 
    axesInfo: {}, 
 | 
    seriesInvolved: false, 
 | 
    /** 
 | 
     * key: makeKey(coordSys.model) 
 | 
     * value: Object: key makeKey(axis.model), value: axisInfo 
 | 
     */ 
 | 
    coordSysAxesInfo: {}, 
 | 
    coordSysMap: {} 
 | 
  }; 
 | 
  collectAxesInfo(result, ecModel, api); 
 | 
  // Check seriesInvolved for performance, in case too many series in some chart. 
 | 
  result.seriesInvolved && collectSeriesInfo(result, ecModel); 
 | 
  return result; 
 | 
} 
 | 
function collectAxesInfo(result, ecModel, api) { 
 | 
  var globalTooltipModel = ecModel.getComponent('tooltip'); 
 | 
  var globalAxisPointerModel = ecModel.getComponent('axisPointer'); 
 | 
  // links can only be set on global. 
 | 
  var linksOption = globalAxisPointerModel.get('link', true) || []; 
 | 
  var linkGroups = []; 
 | 
  // Collect axes info. 
 | 
  each(api.getCoordinateSystems(), function (coordSys) { 
 | 
    // Some coordinate system do not support axes, like geo. 
 | 
    if (!coordSys.axisPointerEnabled) { 
 | 
      return; 
 | 
    } 
 | 
    var coordSysKey = makeKey(coordSys.model); 
 | 
    var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; 
 | 
    result.coordSysMap[coordSysKey] = coordSys; 
 | 
    // Set tooltip (like 'cross') is a convenient way to show axisPointer 
 | 
    // for user. So we enable setting tooltip on coordSys model. 
 | 
    var coordSysModel = coordSys.model; 
 | 
    var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); 
 | 
    each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null)); 
 | 
    // If axis tooltip used, choose tooltip axis for each coordSys. 
 | 
    // Notice this case: coordSys is `grid` but not `cartesian2D` here. 
 | 
    if (coordSys.getTooltipAxes && globalTooltipModel 
 | 
    // If tooltip.showContent is set as false, tooltip will not 
 | 
    // show but axisPointer will show as normal. 
 | 
    && baseTooltipModel.get('show')) { 
 | 
      // Compatible with previous logic. But series.tooltip.trigger: 'axis' 
 | 
      // or series.data[n].tooltip.trigger: 'axis' are not support any more. 
 | 
      var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; 
 | 
      var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross'; 
 | 
      var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis'])); 
 | 
      if (triggerAxis || cross) { 
 | 
        each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis)); 
 | 
      } 
 | 
      if (cross) { 
 | 
        each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false)); 
 | 
      } 
 | 
    } 
 | 
    // fromTooltip: true | false | 'cross' 
 | 
    // triggerTooltip: true | false | null 
 | 
    function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { 
 | 
      var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); 
 | 
      var axisPointerShow = axisPointerModel.get('show'); 
 | 
      if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) { 
 | 
        return; 
 | 
      } 
 | 
      if (triggerTooltip == null) { 
 | 
        triggerTooltip = axisPointerModel.get('triggerTooltip'); 
 | 
      } 
 | 
      axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; 
 | 
      var snap = axisPointerModel.get('snap'); 
 | 
      var triggerEmphasis = axisPointerModel.get('triggerEmphasis'); 
 | 
      var axisKey = makeKey(axis.model); 
 | 
      var involveSeries = triggerTooltip || snap || axis.type === 'category'; 
 | 
      // If result.axesInfo[key] exist, override it (tooltip has higher priority). 
 | 
      var axisInfo = result.axesInfo[axisKey] = { 
 | 
        key: axisKey, 
 | 
        axis: axis, 
 | 
        coordSys: coordSys, 
 | 
        axisPointerModel: axisPointerModel, 
 | 
        triggerTooltip: triggerTooltip, 
 | 
        triggerEmphasis: triggerEmphasis, 
 | 
        involveSeries: involveSeries, 
 | 
        snap: snap, 
 | 
        useHandle: isHandleTrigger(axisPointerModel), 
 | 
        seriesModels: [], 
 | 
        linkGroup: null 
 | 
      }; 
 | 
      axesInfoInCoordSys[axisKey] = axisInfo; 
 | 
      result.seriesInvolved = result.seriesInvolved || involveSeries; 
 | 
      var groupIndex = getLinkGroupIndex(linksOption, axis); 
 | 
      if (groupIndex != null) { 
 | 
        var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { 
 | 
          axesInfo: {} 
 | 
        }); 
 | 
        linkGroup.axesInfo[axisKey] = axisInfo; 
 | 
        linkGroup.mapper = linksOption[groupIndex].mapper; 
 | 
        axisInfo.linkGroup = linkGroup; 
 | 
      } 
 | 
    } 
 | 
  }); 
 | 
} 
 | 
function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { 
 | 
  var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); 
 | 
  var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z']; 
 | 
  var volatileOption = {}; 
 | 
  each(fields, function (field) { 
 | 
    volatileOption[field] = clone(tooltipAxisPointerModel.get(field)); 
 | 
  }); 
 | 
  // category axis do not auto snap, otherwise some tick that do not 
 | 
  // has value can not be hovered. value/time/log axis default snap if 
 | 
  // triggered from tooltip and trigger tooltip. 
 | 
  volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; 
 | 
  // Compatible with previous behavior, tooltip axis does not show label by default. 
 | 
  // Only these properties can be overridden from tooltip to axisPointer. 
 | 
  if (tooltipAxisPointerModel.get('type') === 'cross') { 
 | 
    volatileOption.type = 'line'; 
 | 
  } 
 | 
  var labelOption = volatileOption.label || (volatileOption.label = {}); 
 | 
  // Follow the convention, do not show label when triggered by tooltip by default. 
 | 
  labelOption.show == null && (labelOption.show = false); 
 | 
  if (fromTooltip === 'cross') { 
 | 
    // When 'cross', both axes show labels. 
 | 
    var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']); 
 | 
    labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; 
 | 
    // If triggerTooltip, this is a base axis, which should better not use cross style 
 | 
    // (cross style is dashed by default) 
 | 
    if (!triggerTooltip) { 
 | 
      var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); 
 | 
      crossStyle && defaults(labelOption, crossStyle.textStyle); 
 | 
    } 
 | 
  } 
 | 
  return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel)); 
 | 
} 
 | 
function collectSeriesInfo(result, ecModel) { 
 | 
  // Prepare data for axis trigger 
 | 
  ecModel.eachSeries(function (seriesModel) { 
 | 
    // Notice this case: this coordSys is `cartesian2D` but not `grid`. 
 | 
    var coordSys = seriesModel.coordinateSystem; 
 | 
    var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true); 
 | 
    var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true); 
 | 
    if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) { 
 | 
      return; 
 | 
    } 
 | 
    each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { 
 | 
      var axis = axisInfo.axis; 
 | 
      if (coordSys.getAxis(axis.dim) === axis) { 
 | 
        axisInfo.seriesModels.push(seriesModel); 
 | 
        axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); 
 | 
        axisInfo.seriesDataCount += seriesModel.getData().count(); 
 | 
      } 
 | 
    }); 
 | 
  }); 
 | 
} 
 | 
/** 
 | 
 * For example: 
 | 
 * { 
 | 
 *     axisPointer: { 
 | 
 *         links: [{ 
 | 
 *             xAxisIndex: [2, 4], 
 | 
 *             yAxisIndex: 'all' 
 | 
 *         }, { 
 | 
 *             xAxisId: ['a5', 'a7'], 
 | 
 *             xAxisName: 'xxx' 
 | 
 *         }] 
 | 
 *     } 
 | 
 * } 
 | 
 */ 
 | 
function getLinkGroupIndex(linksOption, axis) { 
 | 
  var axisModel = axis.model; 
 | 
  var dim = axis.dim; 
 | 
  for (var i = 0; i < linksOption.length; i++) { 
 | 
    var linkOption = linksOption[i] || {}; 
 | 
    if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) { 
 | 
      return i; 
 | 
    } 
 | 
  } 
 | 
} 
 | 
function checkPropInLink(linkPropValue, axisPropValue) { 
 | 
  return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; 
 | 
} 
 | 
export function fixValue(axisModel) { 
 | 
  var axisInfo = getAxisInfo(axisModel); 
 | 
  if (!axisInfo) { 
 | 
    return; 
 | 
  } 
 | 
  var axisPointerModel = axisInfo.axisPointerModel; 
 | 
  var scale = axisInfo.axis.scale; 
 | 
  var option = axisPointerModel.option; 
 | 
  var status = axisPointerModel.get('status'); 
 | 
  var value = axisPointerModel.get('value'); 
 | 
  // Parse init value for category and time axis. 
 | 
  if (value != null) { 
 | 
    value = scale.parse(value); 
 | 
  } 
 | 
  var useHandle = isHandleTrigger(axisPointerModel); 
 | 
  // If `handle` used, `axisPointer` will always be displayed, so value 
 | 
  // and status should be initialized. 
 | 
  if (status == null) { 
 | 
    option.status = useHandle ? 'show' : 'hide'; 
 | 
  } 
 | 
  var extent = scale.getExtent().slice(); 
 | 
  extent[0] > extent[1] && extent.reverse(); 
 | 
  if ( 
 | 
  // Pick a value on axis when initializing. 
 | 
  value == null 
 | 
  // If both `handle` and `dataZoom` are used, value may be out of axis extent, 
 | 
  // where we should re-pick a value to keep `handle` displaying normally. 
 | 
  || value > extent[1]) { 
 | 
    // Make handle displayed on the end of the axis when init, which looks better. 
 | 
    value = extent[1]; 
 | 
  } 
 | 
  if (value < extent[0]) { 
 | 
    value = extent[0]; 
 | 
  } 
 | 
  option.value = value; 
 | 
  if (useHandle) { 
 | 
    option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; 
 | 
  } 
 | 
} 
 | 
export function getAxisInfo(axisModel) { 
 | 
  var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; 
 | 
  return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; 
 | 
} 
 | 
export function getAxisPointerModel(axisModel) { 
 | 
  var axisInfo = getAxisInfo(axisModel); 
 | 
  return axisInfo && axisInfo.axisPointerModel; 
 | 
} 
 | 
function isHandleTrigger(axisPointerModel) { 
 | 
  return !!axisPointerModel.get(['handle', 'show']); 
 | 
} 
 | 
/** 
 | 
 * @param {module:echarts/model/Model} model 
 | 
 * @return {string} unique key 
 | 
 */ 
 | 
export function makeKey(model) { 
 | 
  return model.type + '||' + model.id; 
 | 
} 
 |