|   | 
| /* | 
| * 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 env from 'zrender/lib/core/env.js'; | 
| import * as modelUtil from '../util/model.js'; | 
| import ComponentModel from './Component.js'; | 
| import { PaletteMixin } from './mixin/palette.js'; | 
| import { DataFormatMixin } from '../model/mixin/dataFormat.js'; | 
| import { getLayoutParams, mergeLayoutParam, fetchLayoutMode } from '../util/layout.js'; | 
| import { createTask } from '../core/task.js'; | 
| import { mountExtend } from '../util/clazz.js'; | 
| import { SourceManager } from '../data/helper/sourceManager.js'; | 
| import { defaultSeriesFormatTooltip } from '../component/tooltip/seriesFormatTooltip.js'; | 
| var inner = modelUtil.makeInner(); | 
| function getSelectionKey(data, dataIndex) { | 
|   return data.getName(dataIndex) || data.getId(dataIndex); | 
| } | 
| export var SERIES_UNIVERSAL_TRANSITION_PROP = '__universalTransitionEnabled'; | 
| var SeriesModel = /** @class */function (_super) { | 
|   __extends(SeriesModel, _super); | 
|   function SeriesModel() { | 
|     // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`, | 
|     // the class members must not be initialized in constructor or declaration place. | 
|     // Otherwise there is bad case: | 
|     //   class A {xxx = 1;} | 
|     //   enableClassExtend(A); | 
|     //   class B extends A {} | 
|     //   var C = B.extend({xxx: 5}); | 
|     //   var c = new C(); | 
|     //   console.log(c.xxx); // expect 5 but always 1. | 
|     var _this = _super !== null && _super.apply(this, arguments) || this; | 
|     // --------------------------------------- | 
|     // Props about data selection | 
|     // --------------------------------------- | 
|     _this._selectedDataIndicesMap = {}; | 
|     return _this; | 
|   } | 
|   SeriesModel.prototype.init = function (option, parentModel, ecModel) { | 
|     this.seriesIndex = this.componentIndex; | 
|     this.dataTask = createTask({ | 
|       count: dataTaskCount, | 
|       reset: dataTaskReset | 
|     }); | 
|     this.dataTask.context = { | 
|       model: this | 
|     }; | 
|     this.mergeDefaultAndTheme(option, ecModel); | 
|     var sourceManager = inner(this).sourceManager = new SourceManager(this); | 
|     sourceManager.prepareSource(); | 
|     var data = this.getInitialData(option, ecModel); | 
|     wrapData(data, this); | 
|     this.dataTask.context.data = data; | 
|     if (process.env.NODE_ENV !== 'production') { | 
|       zrUtil.assert(data, 'getInitialData returned invalid data.'); | 
|     } | 
|     inner(this).dataBeforeProcessed = data; | 
|     // If we reverse the order (make data firstly, and then make | 
|     // dataBeforeProcessed by cloneShallow), cloneShallow will | 
|     // cause data.graph.data !== data when using | 
|     // module:echarts/data/Graph or module:echarts/data/Tree. | 
|     // See module:echarts/data/helper/linkSeriesData | 
|     // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model | 
|     // init or merge stage, because the data can be restored. So we do not `restoreData` | 
|     // and `setData` here, which forbids calling `seriesModel.getData()` in this stage. | 
|     // Call `seriesModel.getRawData()` instead. | 
|     // this.restoreData(); | 
|     autoSeriesName(this); | 
|     this._initSelectedMapFromData(data); | 
|   }; | 
|   /** | 
|    * Util for merge default and theme to option | 
|    */ | 
|   SeriesModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { | 
|     var layoutMode = fetchLayoutMode(this); | 
|     var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; | 
|     // Backward compat: using subType on theme. | 
|     // But if name duplicate between series subType | 
|     // (for example: parallel) add component mainType, | 
|     // add suffix 'Series'. | 
|     var themeSubType = this.subType; | 
|     if (ComponentModel.hasClass(themeSubType)) { | 
|       themeSubType += 'Series'; | 
|     } | 
|     zrUtil.merge(option, ecModel.getTheme().get(this.subType)); | 
|     zrUtil.merge(option, this.getDefaultOption()); | 
|     // Default label emphasis `show` | 
|     modelUtil.defaultEmphasis(option, 'label', ['show']); | 
|     this.fillDataTextStyle(option.data); | 
|     if (layoutMode) { | 
|       mergeLayoutParam(option, inputPositionParams, layoutMode); | 
|     } | 
|   }; | 
|   SeriesModel.prototype.mergeOption = function (newSeriesOption, ecModel) { | 
|     // this.settingTask.dirty(); | 
|     newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true); | 
|     this.fillDataTextStyle(newSeriesOption.data); | 
|     var layoutMode = fetchLayoutMode(this); | 
|     if (layoutMode) { | 
|       mergeLayoutParam(this.option, newSeriesOption, layoutMode); | 
|     } | 
|     var sourceManager = inner(this).sourceManager; | 
|     sourceManager.dirty(); | 
|     sourceManager.prepareSource(); | 
|     var data = this.getInitialData(newSeriesOption, ecModel); | 
|     wrapData(data, this); | 
|     this.dataTask.dirty(); | 
|     this.dataTask.context.data = data; | 
|     inner(this).dataBeforeProcessed = data; | 
|     autoSeriesName(this); | 
|     this._initSelectedMapFromData(data); | 
|   }; | 
|   SeriesModel.prototype.fillDataTextStyle = function (data) { | 
|     // Default data label emphasis `show` | 
|     // FIXME Tree structure data ? | 
|     // FIXME Performance ? | 
|     if (data && !zrUtil.isTypedArray(data)) { | 
|       var props = ['show']; | 
|       for (var i = 0; i < data.length; i++) { | 
|         if (data[i] && data[i].label) { | 
|           modelUtil.defaultEmphasis(data[i], 'label', props); | 
|         } | 
|       } | 
|     } | 
|   }; | 
|   /** | 
|    * Init a data structure from data related option in series | 
|    * Must be overridden. | 
|    */ | 
|   SeriesModel.prototype.getInitialData = function (option, ecModel) { | 
|     return; | 
|   }; | 
|   /** | 
|    * Append data to list | 
|    */ | 
|   SeriesModel.prototype.appendData = function (params) { | 
|     // FIXME ??? | 
|     // (1) If data from dataset, forbidden append. | 
|     // (2) support append data of dataset. | 
|     var data = this.getRawData(); | 
|     data.appendData(params.data); | 
|   }; | 
|   /** | 
|    * Consider some method like `filter`, `map` need make new data, | 
|    * We should make sure that `seriesModel.getData()` get correct | 
|    * data in the stream procedure. So we fetch data from upstream | 
|    * each time `task.perform` called. | 
|    */ | 
|   SeriesModel.prototype.getData = function (dataType) { | 
|     var task = getCurrentTask(this); | 
|     if (task) { | 
|       var data = task.context.data; | 
|       return dataType == null || !data.getLinkedData ? data : data.getLinkedData(dataType); | 
|     } else { | 
|       // When series is not alive (that may happen when click toolbox | 
|       // restore or setOption with not merge mode), series data may | 
|       // be still need to judge animation or something when graphic | 
|       // elements want to know whether fade out. | 
|       return inner(this).data; | 
|     } | 
|   }; | 
|   SeriesModel.prototype.getAllData = function () { | 
|     var mainData = this.getData(); | 
|     return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{ | 
|       data: mainData | 
|     }]; | 
|   }; | 
|   SeriesModel.prototype.setData = function (data) { | 
|     var task = getCurrentTask(this); | 
|     if (task) { | 
|       var context = task.context; | 
|       // Consider case: filter, data sample. | 
|       // FIXME:TS never used, so comment it | 
|       // if (context.data !== data && task.modifyOutputEnd) { | 
|       //     task.setOutputEnd(data.count()); | 
|       // } | 
|       context.outputData = data; | 
|       // Caution: setData should update context.data, | 
|       // Because getData may be called multiply in a | 
|       // single stage and expect to get the data just | 
|       // set. (For example, AxisProxy, x y both call | 
|       // getData and setDate sequentially). | 
|       // So the context.data should be fetched from | 
|       // upstream each time when a stage starts to be | 
|       // performed. | 
|       if (task !== this.dataTask) { | 
|         context.data = data; | 
|       } | 
|     } | 
|     inner(this).data = data; | 
|   }; | 
|   SeriesModel.prototype.getEncode = function () { | 
|     var encode = this.get('encode', true); | 
|     if (encode) { | 
|       return zrUtil.createHashMap(encode); | 
|     } | 
|   }; | 
|   SeriesModel.prototype.getSourceManager = function () { | 
|     return inner(this).sourceManager; | 
|   }; | 
|   SeriesModel.prototype.getSource = function () { | 
|     return this.getSourceManager().getSource(); | 
|   }; | 
|   /** | 
|    * Get data before processed | 
|    */ | 
|   SeriesModel.prototype.getRawData = function () { | 
|     return inner(this).dataBeforeProcessed; | 
|   }; | 
|   SeriesModel.prototype.getColorBy = function () { | 
|     var colorBy = this.get('colorBy'); | 
|     return colorBy || 'series'; | 
|   }; | 
|   SeriesModel.prototype.isColorBySeries = function () { | 
|     return this.getColorBy() === 'series'; | 
|   }; | 
|   /** | 
|    * Get base axis if has coordinate system and has axis. | 
|    * By default use coordSys.getBaseAxis(); | 
|    * Can be overridden for some chart. | 
|    * @return {type} description | 
|    */ | 
|   SeriesModel.prototype.getBaseAxis = function () { | 
|     var coordSys = this.coordinateSystem; | 
|     // @ts-ignore | 
|     return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); | 
|   }; | 
|   /** | 
|    * Default tooltip formatter | 
|    * | 
|    * @param dataIndex | 
|    * @param multipleSeries | 
|    * @param dataType | 
|    * @param renderMode valid values: 'html'(by default) and 'richText'. | 
|    *        'html' is used for rendering tooltip in extra DOM form, and the result | 
|    *        string is used as DOM HTML content. | 
|    *        'richText' is used for rendering tooltip in rich text form, for those where | 
|    *        DOM operation is not supported. | 
|    * @return formatted tooltip with `html` and `markers` | 
|    *        Notice: The override method can also return string | 
|    */ | 
|   SeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { | 
|     return defaultSeriesFormatTooltip({ | 
|       series: this, | 
|       dataIndex: dataIndex, | 
|       multipleSeries: multipleSeries | 
|     }); | 
|   }; | 
|   SeriesModel.prototype.isAnimationEnabled = function () { | 
|     var ecModel = this.ecModel; | 
|     // Disable animation if using echarts in node but not give ssr flag. | 
|     // In ssr mode, renderToString will generate svg with css animation. | 
|     if (env.node && !(ecModel && ecModel.ssr)) { | 
|       return false; | 
|     } | 
|     var animationEnabled = this.getShallow('animation'); | 
|     if (animationEnabled) { | 
|       if (this.getData().count() > this.getShallow('animationThreshold')) { | 
|         animationEnabled = false; | 
|       } | 
|     } | 
|     return !!animationEnabled; | 
|   }; | 
|   SeriesModel.prototype.restoreData = function () { | 
|     this.dataTask.dirty(); | 
|   }; | 
|   SeriesModel.prototype.getColorFromPalette = function (name, scope, requestColorNum) { | 
|     var ecModel = this.ecModel; | 
|     // PENDING | 
|     var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum); | 
|     if (!color) { | 
|       color = ecModel.getColorFromPalette(name, scope, requestColorNum); | 
|     } | 
|     return color; | 
|   }; | 
|   /** | 
|    * Use `data.mapDimensionsAll(coordDim)` instead. | 
|    * @deprecated | 
|    */ | 
|   SeriesModel.prototype.coordDimToDataDim = function (coordDim) { | 
|     return this.getRawData().mapDimensionsAll(coordDim); | 
|   }; | 
|   /** | 
|    * Get progressive rendering count each step | 
|    */ | 
|   SeriesModel.prototype.getProgressive = function () { | 
|     return this.get('progressive'); | 
|   }; | 
|   /** | 
|    * Get progressive rendering count each step | 
|    */ | 
|   SeriesModel.prototype.getProgressiveThreshold = function () { | 
|     return this.get('progressiveThreshold'); | 
|   }; | 
|   // PENGING If selectedMode is null ? | 
|   SeriesModel.prototype.select = function (innerDataIndices, dataType) { | 
|     this._innerSelect(this.getData(dataType), innerDataIndices); | 
|   }; | 
|   SeriesModel.prototype.unselect = function (innerDataIndices, dataType) { | 
|     var selectedMap = this.option.selectedMap; | 
|     if (!selectedMap) { | 
|       return; | 
|     } | 
|     var selectedMode = this.option.selectedMode; | 
|     var data = this.getData(dataType); | 
|     if (selectedMode === 'series' || selectedMap === 'all') { | 
|       this.option.selectedMap = {}; | 
|       this._selectedDataIndicesMap = {}; | 
|       return; | 
|     } | 
|     for (var i = 0; i < innerDataIndices.length; i++) { | 
|       var dataIndex = innerDataIndices[i]; | 
|       var nameOrId = getSelectionKey(data, dataIndex); | 
|       selectedMap[nameOrId] = false; | 
|       this._selectedDataIndicesMap[nameOrId] = -1; | 
|     } | 
|   }; | 
|   SeriesModel.prototype.toggleSelect = function (innerDataIndices, dataType) { | 
|     var tmpArr = []; | 
|     for (var i = 0; i < innerDataIndices.length; i++) { | 
|       tmpArr[0] = innerDataIndices[i]; | 
|       this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType); | 
|     } | 
|   }; | 
|   SeriesModel.prototype.getSelectedDataIndices = function () { | 
|     if (this.option.selectedMap === 'all') { | 
|       return [].slice.call(this.getData().getIndices()); | 
|     } | 
|     var selectedDataIndicesMap = this._selectedDataIndicesMap; | 
|     var nameOrIds = zrUtil.keys(selectedDataIndicesMap); | 
|     var dataIndices = []; | 
|     for (var i = 0; i < nameOrIds.length; i++) { | 
|       var dataIndex = selectedDataIndicesMap[nameOrIds[i]]; | 
|       if (dataIndex >= 0) { | 
|         dataIndices.push(dataIndex); | 
|       } | 
|     } | 
|     return dataIndices; | 
|   }; | 
|   SeriesModel.prototype.isSelected = function (dataIndex, dataType) { | 
|     var selectedMap = this.option.selectedMap; | 
|     if (!selectedMap) { | 
|       return false; | 
|     } | 
|     var data = this.getData(dataType); | 
|     return (selectedMap === 'all' || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(['select', 'disabled']); | 
|   }; | 
|   SeriesModel.prototype.isUniversalTransitionEnabled = function () { | 
|     if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) { | 
|       return true; | 
|     } | 
|     var universalTransitionOpt = this.option.universalTransition; | 
|     // Quick reject | 
|     if (!universalTransitionOpt) { | 
|       return false; | 
|     } | 
|     if (universalTransitionOpt === true) { | 
|       return true; | 
|     } | 
|     // Can be simply 'universalTransition: true' | 
|     return universalTransitionOpt && universalTransitionOpt.enabled; | 
|   }; | 
|   SeriesModel.prototype._innerSelect = function (data, innerDataIndices) { | 
|     var _a, _b; | 
|     var option = this.option; | 
|     var selectedMode = option.selectedMode; | 
|     var len = innerDataIndices.length; | 
|     if (!selectedMode || !len) { | 
|       return; | 
|     } | 
|     if (selectedMode === 'series') { | 
|       option.selectedMap = 'all'; | 
|     } else if (selectedMode === 'multiple') { | 
|       if (!zrUtil.isObject(option.selectedMap)) { | 
|         option.selectedMap = {}; | 
|       } | 
|       var selectedMap = option.selectedMap; | 
|       for (var i = 0; i < len; i++) { | 
|         var dataIndex = innerDataIndices[i]; | 
|         // TODO different types of data share same object. | 
|         var nameOrId = getSelectionKey(data, dataIndex); | 
|         selectedMap[nameOrId] = true; | 
|         this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); | 
|       } | 
|     } else if (selectedMode === 'single' || selectedMode === true) { | 
|       var lastDataIndex = innerDataIndices[len - 1]; | 
|       var nameOrId = getSelectionKey(data, lastDataIndex); | 
|       option.selectedMap = (_a = {}, _a[nameOrId] = true, _a); | 
|       this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b); | 
|     } | 
|   }; | 
|   SeriesModel.prototype._initSelectedMapFromData = function (data) { | 
|     // Ignore select info in data if selectedMap exists. | 
|     // NOTE It's only for legacy usage. edge data is not supported. | 
|     if (this.option.selectedMap) { | 
|       return; | 
|     } | 
|     var dataIndices = []; | 
|     if (data.hasItemOption) { | 
|       data.each(function (idx) { | 
|         var rawItem = data.getRawDataItem(idx); | 
|         if (rawItem && rawItem.selected) { | 
|           dataIndices.push(idx); | 
|         } | 
|       }); | 
|     } | 
|     if (dataIndices.length > 0) { | 
|       this._innerSelect(data, dataIndices); | 
|     } | 
|   }; | 
|   // /** | 
|   //  * @see {module:echarts/stream/Scheduler} | 
|   //  */ | 
|   // abstract pipeTask: null | 
|   SeriesModel.registerClass = function (clz) { | 
|     return ComponentModel.registerClass(clz); | 
|   }; | 
|   SeriesModel.protoInitialize = function () { | 
|     var proto = SeriesModel.prototype; | 
|     proto.type = 'series.__base__'; | 
|     proto.seriesIndex = 0; | 
|     proto.ignoreStyleOnData = false; | 
|     proto.hasSymbolVisual = false; | 
|     proto.defaultSymbol = 'circle'; | 
|     // Make sure the values can be accessed! | 
|     proto.visualStyleAccessPath = 'itemStyle'; | 
|     proto.visualDrawType = 'fill'; | 
|   }(); | 
|   return SeriesModel; | 
| }(ComponentModel); | 
| zrUtil.mixin(SeriesModel, DataFormatMixin); | 
| zrUtil.mixin(SeriesModel, PaletteMixin); | 
| mountExtend(SeriesModel, ComponentModel); | 
| /** | 
|  * MUST be called after `prepareSource` called | 
|  * Here we need to make auto series, especially for auto legend. But we | 
|  * do not modify series.name in option to avoid side effects. | 
|  */ | 
| function autoSeriesName(seriesModel) { | 
|   // User specified name has higher priority, otherwise it may cause | 
|   // series can not be queried unexpectedly. | 
|   var name = seriesModel.name; | 
|   if (!modelUtil.isNameSpecified(seriesModel)) { | 
|     seriesModel.name = getSeriesAutoName(seriesModel) || name; | 
|   } | 
| } | 
| function getSeriesAutoName(seriesModel) { | 
|   var data = seriesModel.getRawData(); | 
|   var dataDims = data.mapDimensionsAll('seriesName'); | 
|   var nameArr = []; | 
|   zrUtil.each(dataDims, function (dataDim) { | 
|     var dimInfo = data.getDimensionInfo(dataDim); | 
|     dimInfo.displayName && nameArr.push(dimInfo.displayName); | 
|   }); | 
|   return nameArr.join(' '); | 
| } | 
| function dataTaskCount(context) { | 
|   return context.model.getRawData().count(); | 
| } | 
| function dataTaskReset(context) { | 
|   var seriesModel = context.model; | 
|   seriesModel.setData(seriesModel.getRawData().cloneShallow()); | 
|   return dataTaskProgress; | 
| } | 
| function dataTaskProgress(param, context) { | 
|   // Avoid repeat cloneShallow when data just created in reset. | 
|   if (context.outputData && param.end > context.outputData.count()) { | 
|     context.model.getRawData().cloneShallow(context.outputData); | 
|   } | 
| } | 
| // TODO refactor | 
| function wrapData(data, seriesModel) { | 
|   zrUtil.each(zrUtil.concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function (methodName) { | 
|     data.wrapMethod(methodName, zrUtil.curry(onDataChange, seriesModel)); | 
|   }); | 
| } | 
| function onDataChange(seriesModel, newList) { | 
|   var task = getCurrentTask(seriesModel); | 
|   if (task) { | 
|     // Consider case: filter, selectRange | 
|     task.setOutputEnd((newList || this).count()); | 
|   } | 
|   return newList; | 
| } | 
| function getCurrentTask(seriesModel) { | 
|   var scheduler = (seriesModel.ecModel || {}).scheduler; | 
|   var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); | 
|   if (pipeline) { | 
|     // When pipline finished, the currrentTask keep the last | 
|     // task (renderTask). | 
|     var task = pipeline.currentTask; | 
|     if (task) { | 
|       var agentStubMap = task.agentStubMap; | 
|       if (agentStubMap) { | 
|         task = agentStubMap.get(seriesModel.uid); | 
|       } | 
|     } | 
|     return task; | 
|   } | 
| } | 
| export default SeriesModel; |