| 
/* 
 | 
* 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 * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import VisualMapModel from './VisualMapModel.js'; 
 | 
import VisualMapping from '../../visual/VisualMapping.js'; 
 | 
import visualDefault from '../../visual/visualDefault.js'; 
 | 
import { reformIntervals } from '../../util/number.js'; 
 | 
import { inheritDefaultOption } from '../../util/component.js'; 
 | 
var PiecewiseModel = /** @class */function (_super) { 
 | 
  __extends(PiecewiseModel, _super); 
 | 
  function PiecewiseModel() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = PiecewiseModel.type; 
 | 
    /** 
 | 
     * The order is always [low, ..., high]. 
 | 
     * [{text: string, interval: Array.<number>}, ...] 
 | 
     */ 
 | 
    _this._pieceList = []; 
 | 
    return _this; 
 | 
  } 
 | 
  PiecewiseModel.prototype.optionUpdated = function (newOption, isInit) { 
 | 
    _super.prototype.optionUpdated.apply(this, arguments); 
 | 
    this.resetExtent(); 
 | 
    var mode = this._mode = this._determineMode(); 
 | 
    this._pieceList = []; 
 | 
    resetMethods[this._mode].call(this, this._pieceList); 
 | 
    this._resetSelected(newOption, isInit); 
 | 
    var categories = this.option.categories; 
 | 
    this.resetVisual(function (mappingOption, state) { 
 | 
      if (mode === 'categories') { 
 | 
        mappingOption.mappingMethod = 'category'; 
 | 
        mappingOption.categories = zrUtil.clone(categories); 
 | 
      } else { 
 | 
        mappingOption.dataExtent = this.getExtent(); 
 | 
        mappingOption.mappingMethod = 'piecewise'; 
 | 
        mappingOption.pieceList = zrUtil.map(this._pieceList, function (piece) { 
 | 
          piece = zrUtil.clone(piece); 
 | 
          if (state !== 'inRange') { 
 | 
            // FIXME 
 | 
            // outOfRange do not support special visual in pieces. 
 | 
            piece.visual = null; 
 | 
          } 
 | 
          return piece; 
 | 
        }); 
 | 
      } 
 | 
    }); 
 | 
  }; 
 | 
  /** 
 | 
   * @protected 
 | 
   * @override 
 | 
   */ 
 | 
  PiecewiseModel.prototype.completeVisualOption = function () { 
 | 
    // Consider this case: 
 | 
    // visualMap: { 
 | 
    //      pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}] 
 | 
    // } 
 | 
    // where no inRange/outOfRange set but only pieces. So we should make 
 | 
    // default inRange/outOfRange for this case, otherwise visuals that only 
 | 
    // appear in `pieces` will not be taken into account in visual encoding. 
 | 
    var option = this.option; 
 | 
    var visualTypesInPieces = {}; 
 | 
    var visualTypes = VisualMapping.listVisualTypes(); 
 | 
    var isCategory = this.isCategory(); 
 | 
    zrUtil.each(option.pieces, function (piece) { 
 | 
      zrUtil.each(visualTypes, function (visualType) { 
 | 
        if (piece.hasOwnProperty(visualType)) { 
 | 
          visualTypesInPieces[visualType] = 1; 
 | 
        } 
 | 
      }); 
 | 
    }); 
 | 
    zrUtil.each(visualTypesInPieces, function (v, visualType) { 
 | 
      var exists = false; 
 | 
      zrUtil.each(this.stateList, function (state) { 
 | 
        exists = exists || has(option, state, visualType) || has(option.target, state, visualType); 
 | 
      }, this); 
 | 
      !exists && zrUtil.each(this.stateList, function (state) { 
 | 
        (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory); 
 | 
      }); 
 | 
    }, this); 
 | 
    function has(obj, state, visualType) { 
 | 
      return obj && obj[state] && obj[state].hasOwnProperty(visualType); 
 | 
    } 
 | 
    _super.prototype.completeVisualOption.apply(this, arguments); 
 | 
  }; 
 | 
  PiecewiseModel.prototype._resetSelected = function (newOption, isInit) { 
 | 
    var thisOption = this.option; 
 | 
    var pieceList = this._pieceList; 
 | 
    // Selected do not merge but all override. 
 | 
    var selected = (isInit ? thisOption : newOption).selected || {}; 
 | 
    thisOption.selected = selected; 
 | 
    // Consider 'not specified' means true. 
 | 
    zrUtil.each(pieceList, function (piece, index) { 
 | 
      var key = this.getSelectedMapKey(piece); 
 | 
      if (!selected.hasOwnProperty(key)) { 
 | 
        selected[key] = true; 
 | 
      } 
 | 
    }, this); 
 | 
    if (thisOption.selectedMode === 'single') { 
 | 
      // Ensure there is only one selected. 
 | 
      var hasSel_1 = false; 
 | 
      zrUtil.each(pieceList, function (piece, index) { 
 | 
        var key = this.getSelectedMapKey(piece); 
 | 
        if (selected[key]) { 
 | 
          hasSel_1 ? selected[key] = false : hasSel_1 = true; 
 | 
        } 
 | 
      }, this); 
 | 
    } 
 | 
    // thisOption.selectedMode === 'multiple', default: all selected. 
 | 
  }; 
 | 
  /** 
 | 
   * @public 
 | 
   */ 
 | 
  PiecewiseModel.prototype.getItemSymbol = function () { 
 | 
    return this.get('itemSymbol'); 
 | 
  }; 
 | 
  /** 
 | 
   * @public 
 | 
   */ 
 | 
  PiecewiseModel.prototype.getSelectedMapKey = function (piece) { 
 | 
    return this._mode === 'categories' ? piece.value + '' : piece.index + ''; 
 | 
  }; 
 | 
  /** 
 | 
   * @public 
 | 
   */ 
 | 
  PiecewiseModel.prototype.getPieceList = function () { 
 | 
    return this._pieceList; 
 | 
  }; 
 | 
  /** 
 | 
   * @return {string} 
 | 
   */ 
 | 
  PiecewiseModel.prototype._determineMode = function () { 
 | 
    var option = this.option; 
 | 
    return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber'; 
 | 
  }; 
 | 
  /** 
 | 
   * @override 
 | 
   */ 
 | 
  PiecewiseModel.prototype.setSelected = function (selected) { 
 | 
    this.option.selected = zrUtil.clone(selected); 
 | 
  }; 
 | 
  /** 
 | 
   * @override 
 | 
   */ 
 | 
  PiecewiseModel.prototype.getValueState = function (value) { 
 | 
    var index = VisualMapping.findPieceIndex(value, this._pieceList); 
 | 
    return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange'; 
 | 
  }; 
 | 
  /** 
 | 
   * @public 
 | 
   * @param pieceIndex piece index in visualMapModel.getPieceList() 
 | 
   */ 
 | 
  PiecewiseModel.prototype.findTargetDataIndices = function (pieceIndex) { 
 | 
    var result = []; 
 | 
    var pieceList = this._pieceList; 
 | 
    this.eachTargetSeries(function (seriesModel) { 
 | 
      var dataIndices = []; 
 | 
      var data = seriesModel.getData(); 
 | 
      data.each(this.getDataDimensionIndex(data), function (value, dataIndex) { 
 | 
        // Should always base on model pieceList, because it is order sensitive. 
 | 
        var pIdx = VisualMapping.findPieceIndex(value, pieceList); 
 | 
        pIdx === pieceIndex && dataIndices.push(dataIndex); 
 | 
      }, this); 
 | 
      result.push({ 
 | 
        seriesId: seriesModel.id, 
 | 
        dataIndex: dataIndices 
 | 
      }); 
 | 
    }, this); 
 | 
    return result; 
 | 
  }; 
 | 
  /** 
 | 
   * @private 
 | 
   * @param piece piece.value or piece.interval is required. 
 | 
   * @return  Can be Infinity or -Infinity 
 | 
   */ 
 | 
  PiecewiseModel.prototype.getRepresentValue = function (piece) { 
 | 
    var representValue; 
 | 
    if (this.isCategory()) { 
 | 
      representValue = piece.value; 
 | 
    } else { 
 | 
      if (piece.value != null) { 
 | 
        representValue = piece.value; 
 | 
      } else { 
 | 
        var pieceInterval = piece.interval || []; 
 | 
        representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2; 
 | 
      } 
 | 
    } 
 | 
    return representValue; 
 | 
  }; 
 | 
  PiecewiseModel.prototype.getVisualMeta = function (getColorVisual) { 
 | 
    // Do not support category. (category axis is ordinal, numerical) 
 | 
    if (this.isCategory()) { 
 | 
      return; 
 | 
    } 
 | 
    var stops = []; 
 | 
    var outerColors = ['', '']; 
 | 
    var visualMapModel = this; 
 | 
    function setStop(interval, valueState) { 
 | 
      var representValue = visualMapModel.getRepresentValue({ 
 | 
        interval: interval 
 | 
      }); // Not category 
 | 
      if (!valueState) { 
 | 
        valueState = visualMapModel.getValueState(representValue); 
 | 
      } 
 | 
      var color = getColorVisual(representValue, valueState); 
 | 
      if (interval[0] === -Infinity) { 
 | 
        outerColors[0] = color; 
 | 
      } else if (interval[1] === Infinity) { 
 | 
        outerColors[1] = color; 
 | 
      } else { 
 | 
        stops.push({ 
 | 
          value: interval[0], 
 | 
          color: color 
 | 
        }, { 
 | 
          value: interval[1], 
 | 
          color: color 
 | 
        }); 
 | 
      } 
 | 
    } 
 | 
    // Suplement 
 | 
    var pieceList = this._pieceList.slice(); 
 | 
    if (!pieceList.length) { 
 | 
      pieceList.push({ 
 | 
        interval: [-Infinity, Infinity] 
 | 
      }); 
 | 
    } else { 
 | 
      var edge = pieceList[0].interval[0]; 
 | 
      edge !== -Infinity && pieceList.unshift({ 
 | 
        interval: [-Infinity, edge] 
 | 
      }); 
 | 
      edge = pieceList[pieceList.length - 1].interval[1]; 
 | 
      edge !== Infinity && pieceList.push({ 
 | 
        interval: [edge, Infinity] 
 | 
      }); 
 | 
    } 
 | 
    var curr = -Infinity; 
 | 
    zrUtil.each(pieceList, function (piece) { 
 | 
      var interval = piece.interval; 
 | 
      if (interval) { 
 | 
        // Fulfill gap. 
 | 
        interval[0] > curr && setStop([curr, interval[0]], 'outOfRange'); 
 | 
        setStop(interval.slice()); 
 | 
        curr = interval[1]; 
 | 
      } 
 | 
    }, this); 
 | 
    return { 
 | 
      stops: stops, 
 | 
      outerColors: outerColors 
 | 
    }; 
 | 
  }; 
 | 
  PiecewiseModel.type = 'visualMap.piecewise'; 
 | 
  PiecewiseModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { 
 | 
    selected: null, 
 | 
    minOpen: false, 
 | 
    maxOpen: false, 
 | 
    align: 'auto', 
 | 
    itemWidth: 20, 
 | 
    itemHeight: 14, 
 | 
    itemSymbol: 'roundRect', 
 | 
    pieces: null, 
 | 
    categories: null, 
 | 
    splitNumber: 5, 
 | 
    selectedMode: 'multiple', 
 | 
    itemGap: 10, 
 | 
    hoverLink: true // Enable hover highlight. 
 | 
  }); 
 | 
  return PiecewiseModel; 
 | 
}(VisualMapModel); 
 | 
; 
 | 
/** 
 | 
 * Key is this._mode 
 | 
 * @type {Object} 
 | 
 * @this {module:echarts/component/viusalMap/PiecewiseMode} 
 | 
 */ 
 | 
var resetMethods = { 
 | 
  splitNumber: function (outPieceList) { 
 | 
    var thisOption = this.option; 
 | 
    var precision = Math.min(thisOption.precision, 20); 
 | 
    var dataExtent = this.getExtent(); 
 | 
    var splitNumber = thisOption.splitNumber; 
 | 
    splitNumber = Math.max(parseInt(splitNumber, 10), 1); 
 | 
    thisOption.splitNumber = splitNumber; 
 | 
    var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; 
 | 
    // Precision auto-adaption 
 | 
    while (+splitStep.toFixed(precision) !== splitStep && precision < 5) { 
 | 
      precision++; 
 | 
    } 
 | 
    thisOption.precision = precision; 
 | 
    splitStep = +splitStep.toFixed(precision); 
 | 
    if (thisOption.minOpen) { 
 | 
      outPieceList.push({ 
 | 
        interval: [-Infinity, dataExtent[0]], 
 | 
        close: [0, 0] 
 | 
      }); 
 | 
    } 
 | 
    for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) { 
 | 
      var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep; 
 | 
      outPieceList.push({ 
 | 
        interval: [curr, max], 
 | 
        close: [1, 1] 
 | 
      }); 
 | 
    } 
 | 
    if (thisOption.maxOpen) { 
 | 
      outPieceList.push({ 
 | 
        interval: [dataExtent[1], Infinity], 
 | 
        close: [0, 0] 
 | 
      }); 
 | 
    } 
 | 
    reformIntervals(outPieceList); 
 | 
    zrUtil.each(outPieceList, function (piece, index) { 
 | 
      piece.index = index; 
 | 
      piece.text = this.formatValueText(piece.interval); 
 | 
    }, this); 
 | 
  }, 
 | 
  categories: function (outPieceList) { 
 | 
    var thisOption = this.option; 
 | 
    zrUtil.each(thisOption.categories, function (cate) { 
 | 
      // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。 
 | 
      // 是否改一致。 
 | 
      outPieceList.push({ 
 | 
        text: this.formatValueText(cate, true), 
 | 
        value: cate 
 | 
      }); 
 | 
    }, this); 
 | 
    // See "Order Rule". 
 | 
    normalizeReverse(thisOption, outPieceList); 
 | 
  }, 
 | 
  pieces: function (outPieceList) { 
 | 
    var thisOption = this.option; 
 | 
    zrUtil.each(thisOption.pieces, function (pieceListItem, index) { 
 | 
      if (!zrUtil.isObject(pieceListItem)) { 
 | 
        pieceListItem = { 
 | 
          value: pieceListItem 
 | 
        }; 
 | 
      } 
 | 
      var item = { 
 | 
        text: '', 
 | 
        index: index 
 | 
      }; 
 | 
      if (pieceListItem.label != null) { 
 | 
        item.text = pieceListItem.label; 
 | 
      } 
 | 
      if (pieceListItem.hasOwnProperty('value')) { 
 | 
        var value = item.value = pieceListItem.value; 
 | 
        item.interval = [value, value]; 
 | 
        item.close = [1, 1]; 
 | 
      } else { 
 | 
        // `min` `max` is legacy option. 
 | 
        // `lt` `gt` `lte` `gte` is recommended. 
 | 
        var interval = item.interval = []; 
 | 
        var close_1 = item.close = [0, 0]; 
 | 
        var closeList = [1, 0, 1]; 
 | 
        var infinityList = [-Infinity, Infinity]; 
 | 
        var useMinMax = []; 
 | 
        for (var lg = 0; lg < 2; lg++) { 
 | 
          var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg]; 
 | 
          for (var i = 0; i < 3 && interval[lg] == null; i++) { 
 | 
            interval[lg] = pieceListItem[names[i]]; 
 | 
            close_1[lg] = closeList[i]; 
 | 
            useMinMax[lg] = i === 2; 
 | 
          } 
 | 
          interval[lg] == null && (interval[lg] = infinityList[lg]); 
 | 
        } 
 | 
        useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0); 
 | 
        useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0); 
 | 
        if (process.env.NODE_ENV !== 'production') { 
 | 
          if (interval[0] > interval[1]) { 
 | 
            console.warn('Piece ' + index + 'is illegal: ' + interval + ' lower bound should not greater then uppper bound.'); 
 | 
          } 
 | 
        } 
 | 
        if (interval[0] === interval[1] && close_1[0] && close_1[1]) { 
 | 
          // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}], 
 | 
          // we use value to lift the priority when min === max 
 | 
          item.value = interval[0]; 
 | 
        } 
 | 
      } 
 | 
      item.visual = VisualMapping.retrieveVisuals(pieceListItem); 
 | 
      outPieceList.push(item); 
 | 
    }, this); 
 | 
    // See "Order Rule". 
 | 
    normalizeReverse(thisOption, outPieceList); 
 | 
    // Only pieces 
 | 
    reformIntervals(outPieceList); 
 | 
    zrUtil.each(outPieceList, function (piece) { 
 | 
      var close = piece.close; 
 | 
      var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]]; 
 | 
      piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols); 
 | 
    }, this); 
 | 
  } 
 | 
}; 
 | 
function normalizeReverse(thisOption, pieceList) { 
 | 
  var inverse = thisOption.inverse; 
 | 
  if (thisOption.orient === 'vertical' ? !inverse : inverse) { 
 | 
    pieceList.reverse(); 
 | 
  } 
 | 
} 
 | 
export default PiecewiseModel; 
 |