| 
/* 
 | 
* 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 { __extends } from "tslib"; 
 | 
import SeriesData from '../../data/SeriesData.js'; 
 | 
import * as numberUtil from '../../util/number.js'; 
 | 
import * as markerHelper from './markerHelper.js'; 
 | 
import LineDraw from '../../chart/helper/LineDraw.js'; 
 | 
import MarkerView from './MarkerView.js'; 
 | 
import { getStackedDimension } from '../../data/helper/dataStackHelper.js'; 
 | 
import { isCoordinateSystemType } from '../../coord/CoordinateSystem.js'; 
 | 
import { getECData } from '../../util/innerStore.js'; 
 | 
import MarkerModel from './MarkerModel.js'; 
 | 
import { isArray, retrieve, retrieve2, clone, extend, logError, merge, map, curry, filter, isNumber } from 'zrender/lib/core/util.js'; 
 | 
import { makeInner } from '../../util/model.js'; 
 | 
import { getVisualFromData } from '../../visual/helper.js'; 
 | 
var inner = makeInner(); 
 | 
var markLineTransform = function (seriesModel, coordSys, mlModel, item) { 
 | 
  var data = seriesModel.getData(); 
 | 
  var itemArray; 
 | 
  if (!isArray(item)) { 
 | 
    // Special type markLine like 'min', 'max', 'average', 'median' 
 | 
    var mlType = item.type; 
 | 
    if (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median' 
 | 
    // In case 
 | 
    // data: [{ 
 | 
    //   yAxis: 10 
 | 
    // }] 
 | 
    || item.xAxis != null || item.yAxis != null) { 
 | 
      var valueAxis = void 0; 
 | 
      var value = void 0; 
 | 
      if (item.yAxis != null || item.xAxis != null) { 
 | 
        valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x'); 
 | 
        value = retrieve(item.yAxis, item.xAxis); 
 | 
      } else { 
 | 
        var axisInfo = markerHelper.getAxisInfo(item, data, coordSys, seriesModel); 
 | 
        valueAxis = axisInfo.valueAxis; 
 | 
        var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim); 
 | 
        value = markerHelper.numCalculate(data, valueDataDim, mlType); 
 | 
      } 
 | 
      var valueIndex = valueAxis.dim === 'x' ? 0 : 1; 
 | 
      var baseIndex = 1 - valueIndex; 
 | 
      // Normized to 2d data with start and end point 
 | 
      var mlFrom = clone(item); 
 | 
      var mlTo = { 
 | 
        coord: [] 
 | 
      }; 
 | 
      mlFrom.type = null; 
 | 
      mlFrom.coord = []; 
 | 
      mlFrom.coord[baseIndex] = -Infinity; 
 | 
      mlTo.coord[baseIndex] = Infinity; 
 | 
      var precision = mlModel.get('precision'); 
 | 
      if (precision >= 0 && isNumber(value)) { 
 | 
        value = +value.toFixed(Math.min(precision, 20)); 
 | 
      } 
 | 
      mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value; 
 | 
      itemArray = [mlFrom, mlTo, { 
 | 
        type: mlType, 
 | 
        valueIndex: item.valueIndex, 
 | 
        // Force to use the value of calculated value. 
 | 
        value: value 
 | 
      }]; 
 | 
    } else { 
 | 
      // Invalid data 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        logError('Invalid markLine data.'); 
 | 
      } 
 | 
      itemArray = []; 
 | 
    } 
 | 
  } else { 
 | 
    itemArray = item; 
 | 
  } 
 | 
  var normalizedItem = [markerHelper.dataTransform(seriesModel, itemArray[0]), markerHelper.dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])]; 
 | 
  // Avoid line data type is extended by from(to) data type 
 | 
  normalizedItem[2].type = normalizedItem[2].type || null; 
 | 
  // Merge from option and to option into line option 
 | 
  merge(normalizedItem[2], normalizedItem[0]); 
 | 
  merge(normalizedItem[2], normalizedItem[1]); 
 | 
  return normalizedItem; 
 | 
}; 
 | 
function isInfinity(val) { 
 | 
  return !isNaN(val) && !isFinite(val); 
 | 
} 
 | 
// If a markLine has one dim 
 | 
function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { 
 | 
  var otherDimIndex = 1 - dimIndex; 
 | 
  var dimName = coordSys.dimensions[dimIndex]; 
 | 
  return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]); 
 | 
} 
 | 
function markLineFilter(coordSys, item) { 
 | 
  if (coordSys.type === 'cartesian2d') { 
 | 
    var fromCoord = item[0].coord; 
 | 
    var toCoord = item[1].coord; 
 | 
    // In case 
 | 
    // { 
 | 
    //  markLine: { 
 | 
    //    data: [{ yAxis: 2 }] 
 | 
    //  } 
 | 
    // } 
 | 
    if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) { 
 | 
      return true; 
 | 
    } 
 | 
  } 
 | 
  return markerHelper.dataFilter(coordSys, item[0]) && markerHelper.dataFilter(coordSys, item[1]); 
 | 
} 
 | 
function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) { 
 | 
  var coordSys = seriesModel.coordinateSystem; 
 | 
  var itemModel = data.getItemModel(idx); 
 | 
  var point; 
 | 
  var xPx = numberUtil.parsePercent(itemModel.get('x'), api.getWidth()); 
 | 
  var yPx = numberUtil.parsePercent(itemModel.get('y'), api.getHeight()); 
 | 
  if (!isNaN(xPx) && !isNaN(yPx)) { 
 | 
    point = [xPx, yPx]; 
 | 
  } else { 
 | 
    // Chart like bar may have there own marker positioning logic 
 | 
    if (seriesModel.getMarkerPosition) { 
 | 
      // Use the getMarkerPosition 
 | 
      point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx)); 
 | 
    } else { 
 | 
      var dims = coordSys.dimensions; 
 | 
      var x = data.get(dims[0], idx); 
 | 
      var y = data.get(dims[1], idx); 
 | 
      point = coordSys.dataToPoint([x, y]); 
 | 
    } 
 | 
    // Expand line to the edge of grid if value on one axis is Inifnity 
 | 
    // In case 
 | 
    //  markLine: { 
 | 
    //    data: [{ 
 | 
    //      yAxis: 2 
 | 
    //      // or 
 | 
    //      type: 'average' 
 | 
    //    }] 
 | 
    //  } 
 | 
    if (isCoordinateSystemType(coordSys, 'cartesian2d')) { 
 | 
      // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug 
 | 
      var xAxis = coordSys.getAxis('x'); 
 | 
      var yAxis = coordSys.getAxis('y'); 
 | 
      var dims = coordSys.dimensions; 
 | 
      if (isInfinity(data.get(dims[0], idx))) { 
 | 
        point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]); 
 | 
      } else if (isInfinity(data.get(dims[1], idx))) { 
 | 
        point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]); 
 | 
      } 
 | 
    } 
 | 
    // Use x, y if has any 
 | 
    if (!isNaN(xPx)) { 
 | 
      point[0] = xPx; 
 | 
    } 
 | 
    if (!isNaN(yPx)) { 
 | 
      point[1] = yPx; 
 | 
    } 
 | 
  } 
 | 
  data.setItemLayout(idx, point); 
 | 
} 
 | 
var MarkLineView = /** @class */function (_super) { 
 | 
  __extends(MarkLineView, _super); 
 | 
  function MarkLineView() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = MarkLineView.type; 
 | 
    return _this; 
 | 
  } 
 | 
  MarkLineView.prototype.updateTransform = function (markLineModel, ecModel, api) { 
 | 
    ecModel.eachSeries(function (seriesModel) { 
 | 
      var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markLine'); 
 | 
      if (mlModel) { 
 | 
        var mlData_1 = mlModel.getData(); 
 | 
        var fromData_1 = inner(mlModel).from; 
 | 
        var toData_1 = inner(mlModel).to; 
 | 
        // Update visual and layout of from symbol and to symbol 
 | 
        fromData_1.each(function (idx) { 
 | 
          updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api); 
 | 
          updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api); 
 | 
        }); 
 | 
        // Update layout of line 
 | 
        mlData_1.each(function (idx) { 
 | 
          mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]); 
 | 
        }); 
 | 
        this.markerGroupMap.get(seriesModel.id).updateLayout(); 
 | 
      } 
 | 
    }, this); 
 | 
  }; 
 | 
  MarkLineView.prototype.renderSeries = function (seriesModel, mlModel, ecModel, api) { 
 | 
    var coordSys = seriesModel.coordinateSystem; 
 | 
    var seriesId = seriesModel.id; 
 | 
    var seriesData = seriesModel.getData(); 
 | 
    var lineDrawMap = this.markerGroupMap; 
 | 
    var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw()); 
 | 
    this.group.add(lineDraw.group); 
 | 
    var mlData = createList(coordSys, seriesModel, mlModel); 
 | 
    var fromData = mlData.from; 
 | 
    var toData = mlData.to; 
 | 
    var lineData = mlData.line; 
 | 
    inner(mlModel).from = fromData; 
 | 
    inner(mlModel).to = toData; 
 | 
    // Line data for tooltip and formatter 
 | 
    mlModel.setData(lineData); 
 | 
    // TODO 
 | 
    // Functionally, `symbolSize` & `symbolOffset` can also be 2D array now. 
 | 
    // But the related logic and type definition are not finished yet. 
 | 
    // Finish it if required 
 | 
    var symbolType = mlModel.get('symbol'); 
 | 
    var symbolSize = mlModel.get('symbolSize'); 
 | 
    var symbolRotate = mlModel.get('symbolRotate'); 
 | 
    var symbolOffset = mlModel.get('symbolOffset'); 
 | 
    // TODO: support callback function like markPoint 
 | 
    if (!isArray(symbolType)) { 
 | 
      symbolType = [symbolType, symbolType]; 
 | 
    } 
 | 
    if (!isArray(symbolSize)) { 
 | 
      symbolSize = [symbolSize, symbolSize]; 
 | 
    } 
 | 
    if (!isArray(symbolRotate)) { 
 | 
      symbolRotate = [symbolRotate, symbolRotate]; 
 | 
    } 
 | 
    if (!isArray(symbolOffset)) { 
 | 
      symbolOffset = [symbolOffset, symbolOffset]; 
 | 
    } 
 | 
    // Update visual and layout of from symbol and to symbol 
 | 
    mlData.from.each(function (idx) { 
 | 
      updateDataVisualAndLayout(fromData, idx, true); 
 | 
      updateDataVisualAndLayout(toData, idx, false); 
 | 
    }); 
 | 
    // Update visual and layout of line 
 | 
    lineData.each(function (idx) { 
 | 
      var lineStyle = lineData.getItemModel(idx).getModel('lineStyle').getLineStyle(); 
 | 
      // lineData.setItemVisual(idx, { 
 | 
      //     color: lineColor || fromData.getItemVisual(idx, 'color') 
 | 
      // }); 
 | 
      lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]); 
 | 
      if (lineStyle.stroke == null) { 
 | 
        lineStyle.stroke = fromData.getItemVisual(idx, 'style').fill; 
 | 
      } 
 | 
      lineData.setItemVisual(idx, { 
 | 
        fromSymbolKeepAspect: fromData.getItemVisual(idx, 'symbolKeepAspect'), 
 | 
        fromSymbolOffset: fromData.getItemVisual(idx, 'symbolOffset'), 
 | 
        fromSymbolRotate: fromData.getItemVisual(idx, 'symbolRotate'), 
 | 
        fromSymbolSize: fromData.getItemVisual(idx, 'symbolSize'), 
 | 
        fromSymbol: fromData.getItemVisual(idx, 'symbol'), 
 | 
        toSymbolKeepAspect: toData.getItemVisual(idx, 'symbolKeepAspect'), 
 | 
        toSymbolOffset: toData.getItemVisual(idx, 'symbolOffset'), 
 | 
        toSymbolRotate: toData.getItemVisual(idx, 'symbolRotate'), 
 | 
        toSymbolSize: toData.getItemVisual(idx, 'symbolSize'), 
 | 
        toSymbol: toData.getItemVisual(idx, 'symbol'), 
 | 
        style: lineStyle 
 | 
      }); 
 | 
    }); 
 | 
    lineDraw.updateData(lineData); 
 | 
    // Set host model for tooltip 
 | 
    // FIXME 
 | 
    mlData.line.eachItemGraphicEl(function (el) { 
 | 
      getECData(el).dataModel = mlModel; 
 | 
      el.traverse(function (child) { 
 | 
        getECData(child).dataModel = mlModel; 
 | 
      }); 
 | 
    }); 
 | 
    function updateDataVisualAndLayout(data, idx, isFrom) { 
 | 
      var itemModel = data.getItemModel(idx); 
 | 
      updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api); 
 | 
      var style = itemModel.getModel('itemStyle').getItemStyle(); 
 | 
      if (style.fill == null) { 
 | 
        style.fill = getVisualFromData(seriesData, 'color'); 
 | 
      } 
 | 
      data.setItemVisual(idx, { 
 | 
        symbolKeepAspect: itemModel.get('symbolKeepAspect'), 
 | 
        // `0` should be considered as a valid value, so use `retrieve2` instead of `||` 
 | 
        symbolOffset: retrieve2(itemModel.get('symbolOffset', true), symbolOffset[isFrom ? 0 : 1]), 
 | 
        symbolRotate: retrieve2(itemModel.get('symbolRotate', true), symbolRotate[isFrom ? 0 : 1]), 
 | 
        // TODO: when 2d array is supported, it should ignore parent 
 | 
        symbolSize: retrieve2(itemModel.get('symbolSize'), symbolSize[isFrom ? 0 : 1]), 
 | 
        symbol: retrieve2(itemModel.get('symbol', true), symbolType[isFrom ? 0 : 1]), 
 | 
        style: style 
 | 
      }); 
 | 
    } 
 | 
    this.markKeep(lineDraw); 
 | 
    lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent'); 
 | 
  }; 
 | 
  MarkLineView.type = 'markLine'; 
 | 
  return MarkLineView; 
 | 
}(MarkerView); 
 | 
function createList(coordSys, seriesModel, mlModel) { 
 | 
  var coordDimsInfos; 
 | 
  if (coordSys) { 
 | 
    coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { 
 | 
      var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; 
 | 
      // In map series data don't have lng and lat dimension. Fallback to same with coordSys 
 | 
      return extend(extend({}, info), { 
 | 
        name: coordDim, 
 | 
        // DON'T use ordinalMeta to parse and collect ordinal. 
 | 
        ordinalMeta: null 
 | 
      }); 
 | 
    }); 
 | 
  } else { 
 | 
    coordDimsInfos = [{ 
 | 
      name: 'value', 
 | 
      type: 'float' 
 | 
    }]; 
 | 
  } 
 | 
  var fromData = new SeriesData(coordDimsInfos, mlModel); 
 | 
  var toData = new SeriesData(coordDimsInfos, mlModel); 
 | 
  // No dimensions 
 | 
  var lineData = new SeriesData([], mlModel); 
 | 
  var optData = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel)); 
 | 
  if (coordSys) { 
 | 
    optData = filter(optData, curry(markLineFilter, coordSys)); 
 | 
  } 
 | 
  var dimValueGetter = markerHelper.createMarkerDimValueGetter(!!coordSys, coordDimsInfos); 
 | 
  fromData.initData(map(optData, function (item) { 
 | 
    return item[0]; 
 | 
  }), null, dimValueGetter); 
 | 
  toData.initData(map(optData, function (item) { 
 | 
    return item[1]; 
 | 
  }), null, dimValueGetter); 
 | 
  lineData.initData(map(optData, function (item) { 
 | 
    return item[2]; 
 | 
  })); 
 | 
  lineData.hasItemOption = true; 
 | 
  return { 
 | 
    from: fromData, 
 | 
    to: toData, 
 | 
    line: lineData 
 | 
  }; 
 | 
} 
 | 
export default MarkLineView; 
 |