| 
/* 
 | 
* 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 { each, createHashMap, merge, assert } from 'zrender/lib/core/util.js'; 
 | 
import ComponentModel from '../../model/Component.js'; 
 | 
import { getAxisMainType, DATA_ZOOM_AXIS_DIMENSIONS } from './helper.js'; 
 | 
import { MULTIPLE_REFERRING, SINGLE_REFERRING } from '../../util/model.js'; 
 | 
var DataZoomAxisInfo = /** @class */function () { 
 | 
  function DataZoomAxisInfo() { 
 | 
    this.indexList = []; 
 | 
    this.indexMap = []; 
 | 
  } 
 | 
  DataZoomAxisInfo.prototype.add = function (axisCmptIdx) { 
 | 
    // Remove duplication. 
 | 
    if (!this.indexMap[axisCmptIdx]) { 
 | 
      this.indexList.push(axisCmptIdx); 
 | 
      this.indexMap[axisCmptIdx] = true; 
 | 
    } 
 | 
  }; 
 | 
  return DataZoomAxisInfo; 
 | 
}(); 
 | 
var DataZoomModel = /** @class */function (_super) { 
 | 
  __extends(DataZoomModel, _super); 
 | 
  function DataZoomModel() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = DataZoomModel.type; 
 | 
    _this._autoThrottle = true; 
 | 
    _this._noTarget = true; 
 | 
    /** 
 | 
     * It is `[rangeModeForMin, rangeModeForMax]`. 
 | 
     * The optional values for `rangeMode`: 
 | 
     * + `'value'` mode: the axis extent will always be determined by 
 | 
     *     `dataZoom.startValue` and `dataZoom.endValue`, despite 
 | 
     *     how data like and how `axis.min` and `axis.max` are. 
 | 
     * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`, 
 | 
     *     where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`, 
 | 
     *     and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`. 
 | 
     *     Axis extent will be determined by the result of the percent of `[dMin, dMax]`. 
 | 
     * 
 | 
     * For example, when users are using dynamic data (update data periodically via `setOption`), 
 | 
     * if in `'value`' mode, the window will be kept in a fixed value range despite how 
 | 
     * data are appended, while if in `'percent'` mode, whe window range will be changed alone with 
 | 
     * the appended data (suppose `axis.min` and `axis.max` are not specified). 
 | 
     */ 
 | 
    _this._rangePropMode = ['percent', 'percent']; 
 | 
    return _this; 
 | 
  } 
 | 
  DataZoomModel.prototype.init = function (option, parentModel, ecModel) { 
 | 
    var inputRawOption = retrieveRawOption(option); 
 | 
    /** 
 | 
     * Suppose a "main process" start at the point that model prepared (that is, 
 | 
     * model initialized or merged or method called in `action`). 
 | 
     * We should keep the `main process` idempotent, that is, given a set of values 
 | 
     * on `option`, we get the same result. 
 | 
     * 
 | 
     * But sometimes, values on `option` will be updated for providing users 
 | 
     * a "final calculated value" (`dataZoomProcessor` will do that). Those value 
 | 
     * should not be the base/input of the `main process`. 
 | 
     * 
 | 
     * So in that case we should save and keep the input of the `main process` 
 | 
     * separately, called `settledOption`. 
 | 
     * 
 | 
     * For example, consider the case: 
 | 
     * (Step_1) brush zoom the grid by `toolbox.dataZoom`, 
 | 
     *     where the original input `option.startValue`, `option.endValue` are earsed by 
 | 
     *     calculated value. 
 | 
     * (Step)2) click the legend to hide and show a series, 
 | 
     *     where the new range is calculated by the earsed `startValue` and `endValue`, 
 | 
     *     which brings incorrect result. 
 | 
     */ 
 | 
    this.settledOption = inputRawOption; 
 | 
    this.mergeDefaultAndTheme(option, ecModel); 
 | 
    this._doInit(inputRawOption); 
 | 
  }; 
 | 
  DataZoomModel.prototype.mergeOption = function (newOption) { 
 | 
    var inputRawOption = retrieveRawOption(newOption); 
 | 
    // FIX #2591 
 | 
    merge(this.option, newOption, true); 
 | 
    merge(this.settledOption, inputRawOption, true); 
 | 
    this._doInit(inputRawOption); 
 | 
  }; 
 | 
  DataZoomModel.prototype._doInit = function (inputRawOption) { 
 | 
    var thisOption = this.option; 
 | 
    this._setDefaultThrottle(inputRawOption); 
 | 
    this._updateRangeUse(inputRawOption); 
 | 
    var settledOption = this.settledOption; 
 | 
    each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { 
 | 
      // start/end has higher priority over startValue/endValue if they 
 | 
      // both set, but we should make chart.setOption({endValue: 1000}) 
 | 
      // effective, rather than chart.setOption({endValue: 1000, end: null}). 
 | 
      if (this._rangePropMode[index] === 'value') { 
 | 
        thisOption[names[0]] = settledOption[names[0]] = null; 
 | 
      } 
 | 
      // Otherwise do nothing and use the merge result. 
 | 
    }, this); 
 | 
    this._resetTarget(); 
 | 
  }; 
 | 
  DataZoomModel.prototype._resetTarget = function () { 
 | 
    var optionOrient = this.get('orient', true); 
 | 
    var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap(); 
 | 
    var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap); 
 | 
    if (hasAxisSpecified) { 
 | 
      this._orient = optionOrient || this._makeAutoOrientByTargetAxis(); 
 | 
    } else { 
 | 
      this._orient = optionOrient || 'horizontal'; 
 | 
      this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient); 
 | 
    } 
 | 
    this._noTarget = true; 
 | 
    targetAxisIndexMap.each(function (axisInfo) { 
 | 
      if (axisInfo.indexList.length) { 
 | 
        this._noTarget = false; 
 | 
      } 
 | 
    }, this); 
 | 
  }; 
 | 
  DataZoomModel.prototype._fillSpecifiedTargetAxis = function (targetAxisIndexMap) { 
 | 
    var hasAxisSpecified = false; 
 | 
    each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { 
 | 
      var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING); 
 | 
      // When user set axisIndex as a empty array, we think that user specify axisIndex 
 | 
      // but do not want use auto mode. Because empty array may be encountered when 
 | 
      // some error occurred. 
 | 
      if (!refering.specified) { 
 | 
        return; 
 | 
      } 
 | 
      hasAxisSpecified = true; 
 | 
      var axisInfo = new DataZoomAxisInfo(); 
 | 
      each(refering.models, function (axisModel) { 
 | 
        axisInfo.add(axisModel.componentIndex); 
 | 
      }); 
 | 
      targetAxisIndexMap.set(axisDim, axisInfo); 
 | 
    }, this); 
 | 
    return hasAxisSpecified; 
 | 
  }; 
 | 
  DataZoomModel.prototype._fillAutoTargetAxisByOrient = function (targetAxisIndexMap, orient) { 
 | 
    var ecModel = this.ecModel; 
 | 
    var needAuto = true; 
 | 
    // Find axis that parallel to dataZoom as default. 
 | 
    if (needAuto) { 
 | 
      var axisDim = orient === 'vertical' ? 'y' : 'x'; 
 | 
      var axisModels = ecModel.findComponents({ 
 | 
        mainType: axisDim + 'Axis' 
 | 
      }); 
 | 
      setParallelAxis(axisModels, axisDim); 
 | 
    } 
 | 
    // Find axis that parallel to dataZoom as default. 
 | 
    if (needAuto) { 
 | 
      var axisModels = ecModel.findComponents({ 
 | 
        mainType: 'singleAxis', 
 | 
        filter: function (axisModel) { 
 | 
          return axisModel.get('orient', true) === orient; 
 | 
        } 
 | 
      }); 
 | 
      setParallelAxis(axisModels, 'single'); 
 | 
    } 
 | 
    function setParallelAxis(axisModels, axisDim) { 
 | 
      // At least use the first parallel axis as the target axis. 
 | 
      var axisModel = axisModels[0]; 
 | 
      if (!axisModel) { 
 | 
        return; 
 | 
      } 
 | 
      var axisInfo = new DataZoomAxisInfo(); 
 | 
      axisInfo.add(axisModel.componentIndex); 
 | 
      targetAxisIndexMap.set(axisDim, axisInfo); 
 | 
      needAuto = false; 
 | 
      // Find parallel axes in the same grid. 
 | 
      if (axisDim === 'x' || axisDim === 'y') { 
 | 
        var gridModel_1 = axisModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]; 
 | 
        gridModel_1 && each(axisModels, function (axModel) { 
 | 
          if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]) { 
 | 
            axisInfo.add(axModel.componentIndex); 
 | 
          } 
 | 
        }); 
 | 
      } 
 | 
    } 
 | 
    if (needAuto) { 
 | 
      // If no parallel axis, find the first category axis as default. (Also consider polar). 
 | 
      each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { 
 | 
        if (!needAuto) { 
 | 
          return; 
 | 
        } 
 | 
        var axisModels = ecModel.findComponents({ 
 | 
          mainType: getAxisMainType(axisDim), 
 | 
          filter: function (axisModel) { 
 | 
            return axisModel.get('type', true) === 'category'; 
 | 
          } 
 | 
        }); 
 | 
        if (axisModels[0]) { 
 | 
          var axisInfo = new DataZoomAxisInfo(); 
 | 
          axisInfo.add(axisModels[0].componentIndex); 
 | 
          targetAxisIndexMap.set(axisDim, axisInfo); 
 | 
          needAuto = false; 
 | 
        } 
 | 
      }, this); 
 | 
    } 
 | 
  }; 
 | 
  DataZoomModel.prototype._makeAutoOrientByTargetAxis = function () { 
 | 
    var dim; 
 | 
    // Find the first axis 
 | 
    this.eachTargetAxis(function (axisDim) { 
 | 
      !dim && (dim = axisDim); 
 | 
    }, this); 
 | 
    return dim === 'y' ? 'vertical' : 'horizontal'; 
 | 
  }; 
 | 
  DataZoomModel.prototype._setDefaultThrottle = function (inputRawOption) { 
 | 
    // When first time user set throttle, auto throttle ends. 
 | 
    if (inputRawOption.hasOwnProperty('throttle')) { 
 | 
      this._autoThrottle = false; 
 | 
    } 
 | 
    if (this._autoThrottle) { 
 | 
      var globalOption = this.ecModel.option; 
 | 
      this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20; 
 | 
    } 
 | 
  }; 
 | 
  DataZoomModel.prototype._updateRangeUse = function (inputRawOption) { 
 | 
    var rangePropMode = this._rangePropMode; 
 | 
    var rangeModeInOption = this.get('rangeMode'); 
 | 
    each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { 
 | 
      var percentSpecified = inputRawOption[names[0]] != null; 
 | 
      var valueSpecified = inputRawOption[names[1]] != null; 
 | 
      if (percentSpecified && !valueSpecified) { 
 | 
        rangePropMode[index] = 'percent'; 
 | 
      } else if (!percentSpecified && valueSpecified) { 
 | 
        rangePropMode[index] = 'value'; 
 | 
      } else if (rangeModeInOption) { 
 | 
        rangePropMode[index] = rangeModeInOption[index]; 
 | 
      } else if (percentSpecified) { 
 | 
        // percentSpecified && valueSpecified 
 | 
        rangePropMode[index] = 'percent'; 
 | 
      } 
 | 
      // else remain its original setting. 
 | 
    }); 
 | 
  }; 
 | 
  DataZoomModel.prototype.noTarget = function () { 
 | 
    return this._noTarget; 
 | 
  }; 
 | 
  DataZoomModel.prototype.getFirstTargetAxisModel = function () { 
 | 
    var firstAxisModel; 
 | 
    this.eachTargetAxis(function (axisDim, axisIndex) { 
 | 
      if (firstAxisModel == null) { 
 | 
        firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); 
 | 
      } 
 | 
    }, this); 
 | 
    return firstAxisModel; 
 | 
  }; 
 | 
  /** 
 | 
   * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel 
 | 
   */ 
 | 
  DataZoomModel.prototype.eachTargetAxis = function (callback, context) { 
 | 
    this._targetAxisInfoMap.each(function (axisInfo, axisDim) { 
 | 
      each(axisInfo.indexList, function (axisIndex) { 
 | 
        callback.call(context, axisDim, axisIndex); 
 | 
      }); 
 | 
    }); 
 | 
  }; 
 | 
  /** 
 | 
   * @return If not found, return null/undefined. 
 | 
   */ 
 | 
  DataZoomModel.prototype.getAxisProxy = function (axisDim, axisIndex) { 
 | 
    var axisModel = this.getAxisModel(axisDim, axisIndex); 
 | 
    if (axisModel) { 
 | 
      return axisModel.__dzAxisProxy; 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @return If not found, return null/undefined. 
 | 
   */ 
 | 
  DataZoomModel.prototype.getAxisModel = function (axisDim, axisIndex) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      assert(axisDim && axisIndex != null); 
 | 
    } 
 | 
    var axisInfo = this._targetAxisInfoMap.get(axisDim); 
 | 
    if (axisInfo && axisInfo.indexMap[axisIndex]) { 
 | 
      return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * If not specified, set to undefined. 
 | 
   */ 
 | 
  DataZoomModel.prototype.setRawRange = function (opt) { 
 | 
    var thisOption = this.option; 
 | 
    var settledOption = this.settledOption; 
 | 
    each([['start', 'startValue'], ['end', 'endValue']], function (names) { 
 | 
      // Consider the pair <start, startValue>: 
 | 
      // If one has value and the other one is `null/undefined`, we both set them 
 | 
      // to `settledOption`. This strategy enables the feature to clear the original 
 | 
      // value in `settledOption` to `null/undefined`. 
 | 
      // But if both of them are `null/undefined`, we do not set them to `settledOption` 
 | 
      // and keep `settledOption` with the original value. This strategy enables users to 
 | 
      // only set <end or endValue> but not set <start or startValue> when calling 
 | 
      // `dispatchAction`. 
 | 
      // The pair <end, endValue> is treated in the same way. 
 | 
      if (opt[names[0]] != null || opt[names[1]] != null) { 
 | 
        thisOption[names[0]] = settledOption[names[0]] = opt[names[0]]; 
 | 
        thisOption[names[1]] = settledOption[names[1]] = opt[names[1]]; 
 | 
      } 
 | 
    }, this); 
 | 
    this._updateRangeUse(opt); 
 | 
  }; 
 | 
  DataZoomModel.prototype.setCalculatedRange = function (opt) { 
 | 
    var option = this.option; 
 | 
    each(['start', 'startValue', 'end', 'endValue'], function (name) { 
 | 
      option[name] = opt[name]; 
 | 
    }); 
 | 
  }; 
 | 
  DataZoomModel.prototype.getPercentRange = function () { 
 | 
    var axisProxy = this.findRepresentativeAxisProxy(); 
 | 
    if (axisProxy) { 
 | 
      return axisProxy.getDataPercentWindow(); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); 
 | 
   * 
 | 
   * @return [startValue, endValue] value can only be '-' or finite number. 
 | 
   */ 
 | 
  DataZoomModel.prototype.getValueRange = function (axisDim, axisIndex) { 
 | 
    if (axisDim == null && axisIndex == null) { 
 | 
      var axisProxy = this.findRepresentativeAxisProxy(); 
 | 
      if (axisProxy) { 
 | 
        return axisProxy.getDataValueWindow(); 
 | 
      } 
 | 
    } else { 
 | 
      return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow(); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @param axisModel If axisModel given, find axisProxy 
 | 
   *      corresponding to the axisModel 
 | 
   */ 
 | 
  DataZoomModel.prototype.findRepresentativeAxisProxy = function (axisModel) { 
 | 
    if (axisModel) { 
 | 
      return axisModel.__dzAxisProxy; 
 | 
    } 
 | 
    // Find the first hosted axisProxy 
 | 
    var firstProxy; 
 | 
    var axisDimList = this._targetAxisInfoMap.keys(); 
 | 
    for (var i = 0; i < axisDimList.length; i++) { 
 | 
      var axisDim = axisDimList[i]; 
 | 
      var axisInfo = this._targetAxisInfoMap.get(axisDim); 
 | 
      for (var j = 0; j < axisInfo.indexList.length; j++) { 
 | 
        var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]); 
 | 
        if (proxy.hostedBy(this)) { 
 | 
          return proxy; 
 | 
        } 
 | 
        if (!firstProxy) { 
 | 
          firstProxy = proxy; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    // If no hosted proxy found, still need to return a proxy. 
 | 
    // This case always happens in toolbox dataZoom, where axes are all hosted by 
 | 
    // other dataZooms. 
 | 
    return firstProxy; 
 | 
  }; 
 | 
  DataZoomModel.prototype.getRangePropMode = function () { 
 | 
    return this._rangePropMode.slice(); 
 | 
  }; 
 | 
  DataZoomModel.prototype.getOrient = function () { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      // Should not be called before initialized. 
 | 
      assert(this._orient); 
 | 
    } 
 | 
    return this._orient; 
 | 
  }; 
 | 
  DataZoomModel.type = 'dataZoom'; 
 | 
  DataZoomModel.dependencies = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series', 'toolbox']; 
 | 
  DataZoomModel.defaultOption = { 
 | 
    // zlevel: 0, 
 | 
    z: 4, 
 | 
    filterMode: 'filter', 
 | 
    start: 0, 
 | 
    end: 100 
 | 
  }; 
 | 
  return DataZoomModel; 
 | 
}(ComponentModel); 
 | 
/** 
 | 
 * Retrieve those raw params from option, which will be cached separately, 
 | 
 * because they will be overwritten by normalized/calculated values in the main 
 | 
 * process. 
 | 
 */ 
 | 
function retrieveRawOption(option) { 
 | 
  var ret = {}; 
 | 
  each(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) { 
 | 
    option.hasOwnProperty(name) && (ret[name] = option[name]); 
 | 
  }); 
 | 
  return ret; 
 | 
} 
 | 
export default DataZoomModel; 
 |