|   | 
| /* | 
| * 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 { parse, stringify } from 'zrender/lib/tool/color.js'; | 
| import * as graphic from '../../util/graphic.js'; | 
| import { enableHoverEmphasis } from '../../util/states.js'; | 
| import { setLabelStyle, createTextStyle } from '../../label/labelStyle.js'; | 
| import { makeBackground } from '../helper/listComponent.js'; | 
| import * as layoutUtil from '../../util/layout.js'; | 
| import ComponentView from '../../view/Component.js'; | 
| import { createSymbol } from '../../util/symbol.js'; | 
| import { createOrUpdatePatternFromDecal } from '../../util/decal.js'; | 
| import { getECData } from '../../util/innerStore.js'; | 
| var curry = zrUtil.curry; | 
| var each = zrUtil.each; | 
| var Group = graphic.Group; | 
| var LegendView = /** @class */function (_super) { | 
|   __extends(LegendView, _super); | 
|   function LegendView() { | 
|     var _this = _super !== null && _super.apply(this, arguments) || this; | 
|     _this.type = LegendView.type; | 
|     _this.newlineDisabled = false; | 
|     return _this; | 
|   } | 
|   LegendView.prototype.init = function () { | 
|     this.group.add(this._contentGroup = new Group()); | 
|     this.group.add(this._selectorGroup = new Group()); | 
|     this._isFirstRender = true; | 
|   }; | 
|   /** | 
|    * @protected | 
|    */ | 
|   LegendView.prototype.getContentGroup = function () { | 
|     return this._contentGroup; | 
|   }; | 
|   /** | 
|    * @protected | 
|    */ | 
|   LegendView.prototype.getSelectorGroup = function () { | 
|     return this._selectorGroup; | 
|   }; | 
|   /** | 
|    * @override | 
|    */ | 
|   LegendView.prototype.render = function (legendModel, ecModel, api) { | 
|     var isFirstRender = this._isFirstRender; | 
|     this._isFirstRender = false; | 
|     this.resetInner(); | 
|     if (!legendModel.get('show', true)) { | 
|       return; | 
|     } | 
|     var itemAlign = legendModel.get('align'); | 
|     var orient = legendModel.get('orient'); | 
|     if (!itemAlign || itemAlign === 'auto') { | 
|       itemAlign = legendModel.get('left') === 'right' && orient === 'vertical' ? 'right' : 'left'; | 
|     } | 
|     // selector has been normalized to an array in model | 
|     var selector = legendModel.get('selector', true); | 
|     var selectorPosition = legendModel.get('selectorPosition', true); | 
|     if (selector && (!selectorPosition || selectorPosition === 'auto')) { | 
|       selectorPosition = orient === 'horizontal' ? 'end' : 'start'; | 
|     } | 
|     this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); | 
|     // Perform layout. | 
|     var positionInfo = legendModel.getBoxLayoutParams(); | 
|     var viewportSize = { | 
|       width: api.getWidth(), | 
|       height: api.getHeight() | 
|     }; | 
|     var padding = legendModel.get('padding'); | 
|     var maxSize = layoutUtil.getLayoutRect(positionInfo, viewportSize, padding); | 
|     var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition); | 
|     // Place mainGroup, based on the calculated `mainRect`. | 
|     var layoutRect = layoutUtil.getLayoutRect(zrUtil.defaults({ | 
|       width: mainRect.width, | 
|       height: mainRect.height | 
|     }, positionInfo), viewportSize, padding); | 
|     this.group.x = layoutRect.x - mainRect.x; | 
|     this.group.y = layoutRect.y - mainRect.y; | 
|     this.group.markRedraw(); | 
|     // Render background after group is layout. | 
|     this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel)); | 
|   }; | 
|   LegendView.prototype.resetInner = function () { | 
|     this.getContentGroup().removeAll(); | 
|     this._backgroundEl && this.group.remove(this._backgroundEl); | 
|     this.getSelectorGroup().removeAll(); | 
|   }; | 
|   LegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { | 
|     var contentGroup = this.getContentGroup(); | 
|     var legendDrawnMap = zrUtil.createHashMap(); | 
|     var selectMode = legendModel.get('selectedMode'); | 
|     var excludeSeriesId = []; | 
|     ecModel.eachRawSeries(function (seriesModel) { | 
|       !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id); | 
|     }); | 
|     each(legendModel.getData(), function (legendItemModel, dataIndex) { | 
|       var name = legendItemModel.get('name'); | 
|       // Use empty string or \n as a newline string | 
|       if (!this.newlineDisabled && (name === '' || name === '\n')) { | 
|         var g = new Group(); | 
|         // @ts-ignore | 
|         g.newline = true; | 
|         contentGroup.add(g); | 
|         return; | 
|       } | 
|       // Representitive series. | 
|       var seriesModel = ecModel.getSeriesByName(name)[0]; | 
|       if (legendDrawnMap.get(name)) { | 
|         // Have been drawn | 
|         return; | 
|       } | 
|       // Legend to control series. | 
|       if (seriesModel) { | 
|         var data = seriesModel.getData(); | 
|         var lineVisualStyle = data.getVisual('legendLineStyle') || {}; | 
|         var legendIcon = data.getVisual('legendIcon'); | 
|         /** | 
|          * `data.getVisual('style')` may be the color from the register | 
|          * in series. For example, for line series, | 
|          */ | 
|         var style = data.getVisual('style'); | 
|         var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api); | 
|         itemGroup.on('click', curry(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId)); | 
|         if (ecModel.ssr) { | 
|           itemGroup.eachChild(function (child) { | 
|             var ecData = getECData(child); | 
|             ecData.seriesIndex = seriesModel.seriesIndex; | 
|             ecData.dataIndex = dataIndex; | 
|             ecData.ssrType = 'legend'; | 
|           }); | 
|         } | 
|         legendDrawnMap.set(name, true); | 
|       } else { | 
|         // Legend to control data. In pie and funnel. | 
|         ecModel.eachRawSeries(function (seriesModel) { | 
|           // In case multiple series has same data name | 
|           if (legendDrawnMap.get(name)) { | 
|             return; | 
|           } | 
|           if (seriesModel.legendVisualProvider) { | 
|             var provider = seriesModel.legendVisualProvider; | 
|             if (!provider.containName(name)) { | 
|               return; | 
|             } | 
|             var idx = provider.indexOfName(name); | 
|             var style = provider.getItemVisual(idx, 'style'); | 
|             var legendIcon = provider.getItemVisual(idx, 'legendIcon'); | 
|             var colorArr = parse(style.fill); | 
|             // Color may be set to transparent in visualMap when data is out of range. | 
|             // Do not show nothing. | 
|             if (colorArr && colorArr[3] === 0) { | 
|               colorArr[3] = 0.2; | 
|               // TODO color is set to 0, 0, 0, 0. Should show correct RGBA | 
|               style = zrUtil.extend(zrUtil.extend({}, style), { | 
|                 fill: stringify(colorArr, 'rgba') | 
|               }); | 
|             } | 
|             var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode, api); | 
|             // FIXME: consider different series has items with the same name. | 
|             itemGroup.on('click', curry(dispatchSelectAction, null, name, api, excludeSeriesId)) | 
|             // Should not specify the series name, consider legend controls | 
|             // more than one pie series. | 
|             .on('mouseover', curry(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry(dispatchDownplayAction, null, name, api, excludeSeriesId)); | 
|             if (ecModel.ssr) { | 
|               itemGroup.eachChild(function (child) { | 
|                 var ecData = getECData(child); | 
|                 ecData.seriesIndex = seriesModel.seriesIndex; | 
|                 ecData.dataIndex = dataIndex; | 
|                 ecData.ssrType = 'legend'; | 
|               }); | 
|             } | 
|             legendDrawnMap.set(name, true); | 
|           } | 
|         }, this); | 
|       } | 
|       if (process.env.NODE_ENV !== 'production') { | 
|         if (!legendDrawnMap.get(name)) { | 
|           console.warn(name + ' series not exists. Legend data should be same with series name or data name.'); | 
|         } | 
|       } | 
|     }, this); | 
|     if (selector) { | 
|       this._createSelector(selector, legendModel, api, orient, selectorPosition); | 
|     } | 
|   }; | 
|   LegendView.prototype._createSelector = function (selector, legendModel, api, orient, selectorPosition) { | 
|     var selectorGroup = this.getSelectorGroup(); | 
|     each(selector, function createSelectorButton(selectorItem) { | 
|       var type = selectorItem.type; | 
|       var labelText = new graphic.Text({ | 
|         style: { | 
|           x: 0, | 
|           y: 0, | 
|           align: 'center', | 
|           verticalAlign: 'middle' | 
|         }, | 
|         onclick: function () { | 
|           api.dispatchAction({ | 
|             type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect', | 
|             legendId: legendModel.id | 
|           }); | 
|         } | 
|       }); | 
|       selectorGroup.add(labelText); | 
|       var labelModel = legendModel.getModel('selectorLabel'); | 
|       var emphasisLabelModel = legendModel.getModel(['emphasis', 'selectorLabel']); | 
|       setLabelStyle(labelText, { | 
|         normal: labelModel, | 
|         emphasis: emphasisLabelModel | 
|       }, { | 
|         defaultText: selectorItem.title | 
|       }); | 
|       enableHoverEmphasis(labelText); | 
|     }); | 
|   }; | 
|   LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) { | 
|     var drawType = seriesModel.visualDrawType; | 
|     var itemWidth = legendModel.get('itemWidth'); | 
|     var itemHeight = legendModel.get('itemHeight'); | 
|     var isSelected = legendModel.isSelected(name); | 
|     var iconRotate = legendItemModel.get('symbolRotate'); | 
|     var symbolKeepAspect = legendItemModel.get('symbolKeepAspect'); | 
|     var legendIconType = legendItemModel.get('icon'); | 
|     legendIcon = legendIconType || legendIcon || 'roundRect'; | 
|     var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api); | 
|     var itemGroup = new Group(); | 
|     var textStyleModel = legendItemModel.getModel('textStyle'); | 
|     if (zrUtil.isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === 'inherit')) { | 
|       // Series has specific way to define legend icon | 
|       itemGroup.add(seriesModel.getLegendIcon({ | 
|         itemWidth: itemWidth, | 
|         itemHeight: itemHeight, | 
|         icon: legendIcon, | 
|         iconRotate: iconRotate, | 
|         itemStyle: style.itemStyle, | 
|         lineStyle: style.lineStyle, | 
|         symbolKeepAspect: symbolKeepAspect | 
|       })); | 
|     } else { | 
|       // Use default legend icon policy for most series | 
|       var rotate = legendIconType === 'inherit' && seriesModel.getData().getVisual('symbol') ? iconRotate === 'inherit' ? seriesModel.getData().getVisual('symbolRotate') : iconRotate : 0; // No rotation for no icon | 
|       itemGroup.add(getDefaultLegendIcon({ | 
|         itemWidth: itemWidth, | 
|         itemHeight: itemHeight, | 
|         icon: legendIcon, | 
|         iconRotate: rotate, | 
|         itemStyle: style.itemStyle, | 
|         lineStyle: style.lineStyle, | 
|         symbolKeepAspect: symbolKeepAspect | 
|       })); | 
|     } | 
|     var textX = itemAlign === 'left' ? itemWidth + 5 : -5; | 
|     var textAlign = itemAlign; | 
|     var formatter = legendModel.get('formatter'); | 
|     var content = name; | 
|     if (zrUtil.isString(formatter) && formatter) { | 
|       content = formatter.replace('{name}', name != null ? name : ''); | 
|     } else if (zrUtil.isFunction(formatter)) { | 
|       content = formatter(name); | 
|     } | 
|     var textColor = isSelected ? textStyleModel.getTextColor() : legendItemModel.get('inactiveColor'); | 
|     itemGroup.add(new graphic.Text({ | 
|       style: createTextStyle(textStyleModel, { | 
|         text: content, | 
|         x: textX, | 
|         y: itemHeight / 2, | 
|         fill: textColor, | 
|         align: textAlign, | 
|         verticalAlign: 'middle' | 
|       }, { | 
|         inheritColor: textColor | 
|       }) | 
|     })); | 
|     // Add a invisible rect to increase the area of mouse hover | 
|     var hitRect = new graphic.Rect({ | 
|       shape: itemGroup.getBoundingRect(), | 
|       style: { | 
|         // Cannot use 'invisible' because SVG SSR will miss the node | 
|         fill: 'transparent' | 
|       } | 
|     }); | 
|     var tooltipModel = legendItemModel.getModel('tooltip'); | 
|     if (tooltipModel.get('show')) { | 
|       graphic.setTooltipConfig({ | 
|         el: hitRect, | 
|         componentModel: legendModel, | 
|         itemName: name, | 
|         itemTooltipOption: tooltipModel.option | 
|       }); | 
|     } | 
|     itemGroup.add(hitRect); | 
|     itemGroup.eachChild(function (child) { | 
|       child.silent = true; | 
|     }); | 
|     hitRect.silent = !selectMode; | 
|     this.getContentGroup().add(itemGroup); | 
|     enableHoverEmphasis(itemGroup); | 
|     // @ts-ignore | 
|     itemGroup.__legendDataIndex = dataIndex; | 
|     return itemGroup; | 
|   }; | 
|   LegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { | 
|     var contentGroup = this.getContentGroup(); | 
|     var selectorGroup = this.getSelectorGroup(); | 
|     // Place items in contentGroup. | 
|     layoutUtil.box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height); | 
|     var contentRect = contentGroup.getBoundingRect(); | 
|     var contentPos = [-contentRect.x, -contentRect.y]; | 
|     selectorGroup.markRedraw(); | 
|     contentGroup.markRedraw(); | 
|     if (selector) { | 
|       // Place buttons in selectorGroup | 
|       layoutUtil.box( | 
|       // Buttons in selectorGroup always layout horizontally | 
|       'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); | 
|       var selectorRect = selectorGroup.getBoundingRect(); | 
|       var selectorPos = [-selectorRect.x, -selectorRect.y]; | 
|       var selectorButtonGap = legendModel.get('selectorButtonGap', true); | 
|       var orientIdx = legendModel.getOrient().index; | 
|       var wh = orientIdx === 0 ? 'width' : 'height'; | 
|       var hw = orientIdx === 0 ? 'height' : 'width'; | 
|       var yx = orientIdx === 0 ? 'y' : 'x'; | 
|       if (selectorPosition === 'end') { | 
|         selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap; | 
|       } else { | 
|         contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; | 
|       } | 
|       // Always align selector to content as 'middle' | 
|       selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; | 
|       selectorGroup.x = selectorPos[0]; | 
|       selectorGroup.y = selectorPos[1]; | 
|       contentGroup.x = contentPos[0]; | 
|       contentGroup.y = contentPos[1]; | 
|       var mainRect = { | 
|         x: 0, | 
|         y: 0 | 
|       }; | 
|       mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh]; | 
|       mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]); | 
|       mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]); | 
|       return mainRect; | 
|     } else { | 
|       contentGroup.x = contentPos[0]; | 
|       contentGroup.y = contentPos[1]; | 
|       return this.group.getBoundingRect(); | 
|     } | 
|   }; | 
|   /** | 
|    * @protected | 
|    */ | 
|   LegendView.prototype.remove = function () { | 
|     this.getContentGroup().removeAll(); | 
|     this._isFirstRender = true; | 
|   }; | 
|   LegendView.type = 'legend.plain'; | 
|   return LegendView; | 
| }(ComponentView); | 
| function getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) { | 
|   /** | 
|    * Use series style if is inherit; | 
|    * elsewise, use legend style | 
|    */ | 
|   function handleCommonProps(style, visualStyle) { | 
|     // If lineStyle.width is 'auto', it is set to be 2 if series has border | 
|     if (style.lineWidth === 'auto') { | 
|       style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0; | 
|     } | 
|     each(style, function (propVal, propName) { | 
|       style[propName] === 'inherit' && (style[propName] = visualStyle[propName]); | 
|     }); | 
|   } | 
|   // itemStyle | 
|   var itemStyleModel = legendItemModel.getModel('itemStyle'); | 
|   var itemStyle = itemStyleModel.getItemStyle(); | 
|   var iconBrushType = iconType.lastIndexOf('empty', 0) === 0 ? 'fill' : 'stroke'; | 
|   var decalStyle = itemStyleModel.getShallow('decal'); | 
|   itemStyle.decal = !decalStyle || decalStyle === 'inherit' ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api); | 
|   if (itemStyle.fill === 'inherit') { | 
|     /** | 
|      * Series with visualDrawType as 'stroke' should have | 
|      * series stroke as legend fill | 
|      */ | 
|     itemStyle.fill = itemVisualStyle[drawType]; | 
|   } | 
|   if (itemStyle.stroke === 'inherit') { | 
|     /** | 
|      * icon type with "emptyXXX" should use fill color | 
|      * in visual style | 
|      */ | 
|     itemStyle.stroke = itemVisualStyle[iconBrushType]; | 
|   } | 
|   if (itemStyle.opacity === 'inherit') { | 
|     /** | 
|      * Use lineStyle.opacity if drawType is stroke | 
|      */ | 
|     itemStyle.opacity = (drawType === 'fill' ? itemVisualStyle : lineVisualStyle).opacity; | 
|   } | 
|   handleCommonProps(itemStyle, itemVisualStyle); | 
|   // lineStyle | 
|   var legendLineModel = legendItemModel.getModel('lineStyle'); | 
|   var lineStyle = legendLineModel.getLineStyle(); | 
|   handleCommonProps(lineStyle, lineVisualStyle); | 
|   // Fix auto color to real color | 
|   itemStyle.fill === 'auto' && (itemStyle.fill = itemVisualStyle.fill); | 
|   itemStyle.stroke === 'auto' && (itemStyle.stroke = itemVisualStyle.fill); | 
|   lineStyle.stroke === 'auto' && (lineStyle.stroke = itemVisualStyle.fill); | 
|   if (!isSelected) { | 
|     var borderWidth = legendItemModel.get('inactiveBorderWidth'); | 
|     /** | 
|      * Since stroke is set to be inactiveBorderColor, it may occur that | 
|      * there is no border in series but border in legend, so we need to | 
|      * use border only when series has border if is set to be auto | 
|      */ | 
|     var visualHasBorder = itemStyle[iconBrushType]; | 
|     itemStyle.lineWidth = borderWidth === 'auto' ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth; | 
|     itemStyle.fill = legendItemModel.get('inactiveColor'); | 
|     itemStyle.stroke = legendItemModel.get('inactiveBorderColor'); | 
|     lineStyle.stroke = legendLineModel.get('inactiveColor'); | 
|     lineStyle.lineWidth = legendLineModel.get('inactiveWidth'); | 
|   } | 
|   return { | 
|     itemStyle: itemStyle, | 
|     lineStyle: lineStyle | 
|   }; | 
| } | 
| function getDefaultLegendIcon(opt) { | 
|   var symboType = opt.icon || 'roundRect'; | 
|   var icon = createSymbol(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect); | 
|   icon.setStyle(opt.itemStyle); | 
|   icon.rotation = (opt.iconRotate || 0) * Math.PI / 180; | 
|   icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); | 
|   if (symboType.indexOf('empty') > -1) { | 
|     icon.style.stroke = icon.style.fill; | 
|     icon.style.fill = '#fff'; | 
|     icon.style.lineWidth = 2; | 
|   } | 
|   return icon; | 
| } | 
| function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) { | 
|   // downplay before unselect | 
|   dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId); | 
|   api.dispatchAction({ | 
|     type: 'legendToggleSelect', | 
|     name: seriesName != null ? seriesName : dataName | 
|   }); | 
|   // highlight after select | 
|   // TODO highlight immediately may cause animation loss. | 
|   dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); | 
| } | 
| function isUseHoverLayer(api) { | 
|   var list = api.getZr().storage.getDisplayList(); | 
|   var emphasisState; | 
|   var i = 0; | 
|   var len = list.length; | 
|   while (i < len && !(emphasisState = list[i].states.emphasis)) { | 
|     i++; | 
|   } | 
|   return emphasisState && emphasisState.hoverLayer; | 
| } | 
| function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) { | 
|   // If element hover will move to a hoverLayer. | 
|   if (!isUseHoverLayer(api)) { | 
|     api.dispatchAction({ | 
|       type: 'highlight', | 
|       seriesName: seriesName, | 
|       name: dataName, | 
|       excludeSeriesId: excludeSeriesId | 
|     }); | 
|   } | 
| } | 
| function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) { | 
|   // If element hover will move to a hoverLayer. | 
|   if (!isUseHoverLayer(api)) { | 
|     api.dispatchAction({ | 
|       type: 'downplay', | 
|       seriesName: seriesName, | 
|       name: dataName, | 
|       excludeSeriesId: excludeSeriesId | 
|     }); | 
|   } | 
| } | 
| export default LegendView; |