|   | 
| /* | 
| * 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"; | 
| /* global document */ | 
| import * as echarts from '../../../core/echarts.js'; | 
| import * as zrUtil from 'zrender/lib/core/util.js'; | 
| import { ToolboxFeature } from '../featureManager.js'; | 
| import { addEventListener } from 'zrender/lib/core/event.js'; | 
| import { warn } from '../../../util/log.js'; | 
| /* global document */ | 
| var BLOCK_SPLITER = new Array(60).join('-'); | 
| var ITEM_SPLITER = '\t'; | 
| /** | 
|  * Group series into two types | 
|  *  1. on category axis, like line, bar | 
|  *  2. others, like scatter, pie | 
|  */ | 
| function groupSeries(ecModel) { | 
|   var seriesGroupByCategoryAxis = {}; | 
|   var otherSeries = []; | 
|   var meta = []; | 
|   ecModel.eachRawSeries(function (seriesModel) { | 
|     var coordSys = seriesModel.coordinateSystem; | 
|     if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) { | 
|       // TODO: TYPE Consider polar? Include polar may increase unecessary bundle size. | 
|       var baseAxis = coordSys.getBaseAxis(); | 
|       if (baseAxis.type === 'category') { | 
|         var key = baseAxis.dim + '_' + baseAxis.index; | 
|         if (!seriesGroupByCategoryAxis[key]) { | 
|           seriesGroupByCategoryAxis[key] = { | 
|             categoryAxis: baseAxis, | 
|             valueAxis: coordSys.getOtherAxis(baseAxis), | 
|             series: [] | 
|           }; | 
|           meta.push({ | 
|             axisDim: baseAxis.dim, | 
|             axisIndex: baseAxis.index | 
|           }); | 
|         } | 
|         seriesGroupByCategoryAxis[key].series.push(seriesModel); | 
|       } else { | 
|         otherSeries.push(seriesModel); | 
|       } | 
|     } else { | 
|       otherSeries.push(seriesModel); | 
|     } | 
|   }); | 
|   return { | 
|     seriesGroupByCategoryAxis: seriesGroupByCategoryAxis, | 
|     other: otherSeries, | 
|     meta: meta | 
|   }; | 
| } | 
| /** | 
|  * Assemble content of series on cateogory axis | 
|  * @inner | 
|  */ | 
| function assembleSeriesWithCategoryAxis(groups) { | 
|   var tables = []; | 
|   zrUtil.each(groups, function (group, key) { | 
|     var categoryAxis = group.categoryAxis; | 
|     var valueAxis = group.valueAxis; | 
|     var valueAxisDim = valueAxis.dim; | 
|     var headers = [' '].concat(zrUtil.map(group.series, function (series) { | 
|       return series.name; | 
|     })); | 
|     // @ts-ignore TODO Polar | 
|     var columns = [categoryAxis.model.getCategories()]; | 
|     zrUtil.each(group.series, function (series) { | 
|       var rawData = series.getRawData(); | 
|       columns.push(series.getRawData().mapArray(rawData.mapDimension(valueAxisDim), function (val) { | 
|         return val; | 
|       })); | 
|     }); | 
|     // Assemble table content | 
|     var lines = [headers.join(ITEM_SPLITER)]; | 
|     for (var i = 0; i < columns[0].length; i++) { | 
|       var items = []; | 
|       for (var j = 0; j < columns.length; j++) { | 
|         items.push(columns[j][i]); | 
|       } | 
|       lines.push(items.join(ITEM_SPLITER)); | 
|     } | 
|     tables.push(lines.join('\n')); | 
|   }); | 
|   return tables.join('\n\n' + BLOCK_SPLITER + '\n\n'); | 
| } | 
| /** | 
|  * Assemble content of other series | 
|  */ | 
| function assembleOtherSeries(series) { | 
|   return zrUtil.map(series, function (series) { | 
|     var data = series.getRawData(); | 
|     var lines = [series.name]; | 
|     var vals = []; | 
|     data.each(data.dimensions, function () { | 
|       var argLen = arguments.length; | 
|       var dataIndex = arguments[argLen - 1]; | 
|       var name = data.getName(dataIndex); | 
|       for (var i = 0; i < argLen - 1; i++) { | 
|         vals[i] = arguments[i]; | 
|       } | 
|       lines.push((name ? name + ITEM_SPLITER : '') + vals.join(ITEM_SPLITER)); | 
|     }); | 
|     return lines.join('\n'); | 
|   }).join('\n\n' + BLOCK_SPLITER + '\n\n'); | 
| } | 
| function getContentFromModel(ecModel) { | 
|   var result = groupSeries(ecModel); | 
|   return { | 
|     value: zrUtil.filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function (str) { | 
|       return !!str.replace(/[\n\t\s]/g, ''); | 
|     }).join('\n\n' + BLOCK_SPLITER + '\n\n'), | 
|     meta: result.meta | 
|   }; | 
| } | 
| function trim(str) { | 
|   return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); | 
| } | 
| /** | 
|  * If a block is tsv format | 
|  */ | 
| function isTSVFormat(block) { | 
|   // Simple method to find out if a block is tsv format | 
|   var firstLine = block.slice(0, block.indexOf('\n')); | 
|   if (firstLine.indexOf(ITEM_SPLITER) >= 0) { | 
|     return true; | 
|   } | 
| } | 
| var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g'); | 
| /** | 
|  * @param {string} tsv | 
|  * @return {Object} | 
|  */ | 
| function parseTSVContents(tsv) { | 
|   var tsvLines = tsv.split(/\n+/g); | 
|   var headers = trim(tsvLines.shift()).split(itemSplitRegex); | 
|   var categories = []; | 
|   var series = zrUtil.map(headers, function (header) { | 
|     return { | 
|       name: header, | 
|       data: [] | 
|     }; | 
|   }); | 
|   for (var i = 0; i < tsvLines.length; i++) { | 
|     var items = trim(tsvLines[i]).split(itemSplitRegex); | 
|     categories.push(items.shift()); | 
|     for (var j = 0; j < items.length; j++) { | 
|       series[j] && (series[j].data[i] = items[j]); | 
|     } | 
|   } | 
|   return { | 
|     series: series, | 
|     categories: categories | 
|   }; | 
| } | 
| function parseListContents(str) { | 
|   var lines = str.split(/\n+/g); | 
|   var seriesName = trim(lines.shift()); | 
|   var data = []; | 
|   for (var i = 0; i < lines.length; i++) { | 
|     // if line is empty, ignore it. | 
|     // there is a case that a user forgot to delete `\n`. | 
|     var line = trim(lines[i]); | 
|     if (!line) { | 
|       continue; | 
|     } | 
|     var items = line.split(itemSplitRegex); | 
|     var name_1 = ''; | 
|     var value = void 0; | 
|     var hasName = false; | 
|     if (isNaN(items[0])) { | 
|       // First item is name | 
|       hasName = true; | 
|       name_1 = items[0]; | 
|       items = items.slice(1); | 
|       data[i] = { | 
|         name: name_1, | 
|         value: [] | 
|       }; | 
|       value = data[i].value; | 
|     } else { | 
|       value = data[i] = []; | 
|     } | 
|     for (var j = 0; j < items.length; j++) { | 
|       value.push(+items[j]); | 
|     } | 
|     if (value.length === 1) { | 
|       hasName ? data[i].value = value[0] : data[i] = value[0]; | 
|     } | 
|   } | 
|   return { | 
|     name: seriesName, | 
|     data: data | 
|   }; | 
| } | 
| function parseContents(str, blockMetaList) { | 
|   var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); | 
|   var newOption = { | 
|     series: [] | 
|   }; | 
|   zrUtil.each(blocks, function (block, idx) { | 
|     if (isTSVFormat(block)) { | 
|       var result = parseTSVContents(block); | 
|       var blockMeta = blockMetaList[idx]; | 
|       var axisKey = blockMeta.axisDim + 'Axis'; | 
|       if (blockMeta) { | 
|         newOption[axisKey] = newOption[axisKey] || []; | 
|         newOption[axisKey][blockMeta.axisIndex] = { | 
|           data: result.categories | 
|         }; | 
|         newOption.series = newOption.series.concat(result.series); | 
|       } | 
|     } else { | 
|       var result = parseListContents(block); | 
|       newOption.series.push(result); | 
|     } | 
|   }); | 
|   return newOption; | 
| } | 
| var DataView = /** @class */function (_super) { | 
|   __extends(DataView, _super); | 
|   function DataView() { | 
|     return _super !== null && _super.apply(this, arguments) || this; | 
|   } | 
|   DataView.prototype.onclick = function (ecModel, api) { | 
|     // FIXME: better way? | 
|     setTimeout(function () { | 
|       api.dispatchAction({ | 
|         type: 'hideTip' | 
|       }); | 
|     }); | 
|     var container = api.getDom(); | 
|     var model = this.model; | 
|     if (this._dom) { | 
|       container.removeChild(this._dom); | 
|     } | 
|     var root = document.createElement('div'); | 
|     // use padding to avoid 5px whitespace | 
|     root.style.cssText = 'position:absolute;top:0;bottom:0;left:0;right:0;padding:5px'; | 
|     root.style.backgroundColor = model.get('backgroundColor') || '#fff'; | 
|     // Create elements | 
|     var header = document.createElement('h4'); | 
|     var lang = model.get('lang') || []; | 
|     header.innerHTML = lang[0] || model.get('title'); | 
|     header.style.cssText = 'margin:10px 20px'; | 
|     header.style.color = model.get('textColor'); | 
|     var viewMain = document.createElement('div'); | 
|     var textarea = document.createElement('textarea'); | 
|     viewMain.style.cssText = 'overflow:auto'; | 
|     var optionToContent = model.get('optionToContent'); | 
|     var contentToOption = model.get('contentToOption'); | 
|     var result = getContentFromModel(ecModel); | 
|     if (zrUtil.isFunction(optionToContent)) { | 
|       var htmlOrDom = optionToContent(api.getOption()); | 
|       if (zrUtil.isString(htmlOrDom)) { | 
|         viewMain.innerHTML = htmlOrDom; | 
|       } else if (zrUtil.isDom(htmlOrDom)) { | 
|         viewMain.appendChild(htmlOrDom); | 
|       } | 
|     } else { | 
|       // Use default textarea | 
|       textarea.readOnly = model.get('readOnly'); | 
|       var style = textarea.style; | 
|       // eslint-disable-next-line max-len | 
|       style.cssText = 'display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none'; | 
|       style.color = model.get('textColor'); | 
|       style.borderColor = model.get('textareaBorderColor'); | 
|       style.backgroundColor = model.get('textareaColor'); | 
|       textarea.value = result.value; | 
|       viewMain.appendChild(textarea); | 
|     } | 
|     var blockMetaList = result.meta; | 
|     var buttonContainer = document.createElement('div'); | 
|     buttonContainer.style.cssText = 'position:absolute;bottom:5px;left:0;right:0'; | 
|     // eslint-disable-next-line max-len | 
|     var buttonStyle = 'float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px'; | 
|     var closeButton = document.createElement('div'); | 
|     var refreshButton = document.createElement('div'); | 
|     buttonStyle += ';background-color:' + model.get('buttonColor'); | 
|     buttonStyle += ';color:' + model.get('buttonTextColor'); | 
|     var self = this; | 
|     function close() { | 
|       container.removeChild(root); | 
|       self._dom = null; | 
|     } | 
|     addEventListener(closeButton, 'click', close); | 
|     addEventListener(refreshButton, 'click', function () { | 
|       if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) { | 
|         if (process.env.NODE_ENV !== 'production') { | 
|           // eslint-disable-next-line | 
|           warn('It seems you have just provided one of `contentToOption` and `optionToContent` functions but missed the other one. Data change is ignored.'); | 
|         } | 
|         close(); | 
|         return; | 
|       } | 
|       var newOption; | 
|       try { | 
|         if (zrUtil.isFunction(contentToOption)) { | 
|           newOption = contentToOption(viewMain, api.getOption()); | 
|         } else { | 
|           newOption = parseContents(textarea.value, blockMetaList); | 
|         } | 
|       } catch (e) { | 
|         close(); | 
|         throw new Error('Data view format error ' + e); | 
|       } | 
|       if (newOption) { | 
|         api.dispatchAction({ | 
|           type: 'changeDataView', | 
|           newOption: newOption | 
|         }); | 
|       } | 
|       close(); | 
|     }); | 
|     closeButton.innerHTML = lang[1]; | 
|     refreshButton.innerHTML = lang[2]; | 
|     refreshButton.style.cssText = closeButton.style.cssText = buttonStyle; | 
|     !model.get('readOnly') && buttonContainer.appendChild(refreshButton); | 
|     buttonContainer.appendChild(closeButton); | 
|     root.appendChild(header); | 
|     root.appendChild(viewMain); | 
|     root.appendChild(buttonContainer); | 
|     viewMain.style.height = container.clientHeight - 80 + 'px'; | 
|     container.appendChild(root); | 
|     this._dom = root; | 
|   }; | 
|   DataView.prototype.remove = function (ecModel, api) { | 
|     this._dom && api.getDom().removeChild(this._dom); | 
|   }; | 
|   DataView.prototype.dispose = function (ecModel, api) { | 
|     this.remove(ecModel, api); | 
|   }; | 
|   DataView.getDefaultOption = function (ecModel) { | 
|     var defaultOption = { | 
|       show: true, | 
|       readOnly: false, | 
|       optionToContent: null, | 
|       contentToOption: null, | 
|       // eslint-disable-next-line | 
|       icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28', | 
|       title: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'title']), | 
|       lang: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'lang']), | 
|       backgroundColor: '#fff', | 
|       textColor: '#000', | 
|       textareaColor: '#fff', | 
|       textareaBorderColor: '#333', | 
|       buttonColor: '#c23531', | 
|       buttonTextColor: '#fff' | 
|     }; | 
|     return defaultOption; | 
|   }; | 
|   return DataView; | 
| }(ToolboxFeature); | 
| /** | 
|  * @inner | 
|  */ | 
| function tryMergeDataOption(newData, originalData) { | 
|   return zrUtil.map(newData, function (newVal, idx) { | 
|     var original = originalData && originalData[idx]; | 
|     if (zrUtil.isObject(original) && !zrUtil.isArray(original)) { | 
|       var newValIsObject = zrUtil.isObject(newVal) && !zrUtil.isArray(newVal); | 
|       if (!newValIsObject) { | 
|         newVal = { | 
|           value: newVal | 
|         }; | 
|       } | 
|       // original data has name but new data has no name | 
|       var shouldDeleteName = original.name != null && newVal.name == null; | 
|       // Original data has option | 
|       newVal = zrUtil.defaults(newVal, original); | 
|       shouldDeleteName && delete newVal.name; | 
|       return newVal; | 
|     } else { | 
|       return newVal; | 
|     } | 
|   }); | 
| } | 
| // TODO: SELF REGISTERED. | 
| echarts.registerAction({ | 
|   type: 'changeDataView', | 
|   event: 'dataViewChanged', | 
|   update: 'prepareAndUpdate' | 
| }, function (payload, ecModel) { | 
|   var newSeriesOptList = []; | 
|   zrUtil.each(payload.newOption.series, function (seriesOpt) { | 
|     var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; | 
|     if (!seriesModel) { | 
|       // New created series | 
|       // Geuss the series type | 
|       newSeriesOptList.push(zrUtil.extend({ | 
|         // Default is scatter | 
|         type: 'scatter' | 
|       }, seriesOpt)); | 
|     } else { | 
|       var originalData = seriesModel.get('data'); | 
|       newSeriesOptList.push({ | 
|         name: seriesOpt.name, | 
|         data: tryMergeDataOption(seriesOpt.data, originalData) | 
|       }); | 
|     } | 
|   }); | 
|   ecModel.mergeOption(zrUtil.defaults({ | 
|     series: newSeriesOptList | 
|   }, payload.newOption)); | 
| }); | 
| export default DataView; |