| /* | |
| * 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 SeriesModel from '../../model/Series'; | |
| import createSeriesDataSimply from '../helper/createSeriesDataSimply'; | |
| import * as zrUtil from 'zrender/src/core/util'; | |
| import LegendVisualProvider from '../../visual/LegendVisualProvider'; | |
| import { | |
| SeriesOption, | |
| LineStyleOption, | |
| SeriesLabelOption, | |
| SymbolOptionMixin, | |
| ItemStyleOption, | |
| AreaStyleOption, | |
| OptionDataValue, | |
| StatesOptionMixin, | |
| OptionDataItemObject, | |
| SeriesEncodeOptionMixin, | |
| CallbackDataParams, | |
| DefaultStatesMixinEmphasis | |
| } from '../../util/types'; | |
| import GlobalModel from '../../model/Global'; | |
| import SeriesData from '../../data/SeriesData'; | |
| import Radar from '../../coord/radar/Radar'; | |
| import { | |
| createTooltipMarkup, retrieveVisualColorForTooltipMarker | |
| } from '../../component/tooltip/tooltipMarkup'; | |
| type RadarSeriesDataValue = OptionDataValue[]; | |
| interface RadarStatesMixin { | |
| emphasis?: DefaultStatesMixinEmphasis | |
| } | |
| export interface RadarSeriesStateOption<TCbParams = never> { | |
| lineStyle?: LineStyleOption | |
| areaStyle?: AreaStyleOption | |
| label?: SeriesLabelOption | |
| itemStyle?: ItemStyleOption<TCbParams> | |
| } | |
| export interface RadarSeriesDataItemOption extends SymbolOptionMixin, | |
| RadarSeriesStateOption<CallbackDataParams>, | |
| StatesOptionMixin<RadarSeriesStateOption<CallbackDataParams>, RadarStatesMixin>, | |
| OptionDataItemObject<RadarSeriesDataValue> { | |
| } | |
| export interface RadarSeriesOption | |
| extends SeriesOption<RadarSeriesStateOption, RadarStatesMixin>, | |
| RadarSeriesStateOption, | |
| SymbolOptionMixin<CallbackDataParams>, SeriesEncodeOptionMixin { | |
| type?: 'radar' | |
| coordinateSystem?: 'radar' | |
| radarIndex?: number | |
| radarId?: string | |
| data?: (RadarSeriesDataItemOption | RadarSeriesDataValue)[] | |
| } | |
| class RadarSeriesModel extends SeriesModel<RadarSeriesOption> { | |
| static readonly type = 'series.radar'; | |
| readonly type = RadarSeriesModel.type; | |
| static dependencies = ['radar']; | |
| coordinateSystem: Radar; | |
| hasSymbolVisual = true; | |
| // Overwrite | |
| init(option: RadarSeriesOption) { | |
| super.init.apply(this, arguments as any); | |
| // Enable legend selection for each data item | |
| // Use a function instead of direct access because data reference may changed | |
| this.legendVisualProvider = new LegendVisualProvider( | |
| zrUtil.bind(this.getData, this), zrUtil.bind(this.getRawData, this) | |
| ); | |
| } | |
| getInitialData(option: RadarSeriesOption, ecModel: GlobalModel): SeriesData { | |
| return createSeriesDataSimply(this, { | |
| generateCoord: 'indicator_', | |
| generateCoordCount: Infinity | |
| }); | |
| } | |
| formatTooltip( | |
| dataIndex: number, | |
| multipleSeries?: boolean, | |
| dataType?: string | |
| ) { | |
| const data = this.getData(); | |
| const coordSys = this.coordinateSystem; | |
| const indicatorAxes = coordSys.getIndicatorAxes(); | |
| const name = this.getData().getName(dataIndex); | |
| const nameToDisplay = name === '' ? this.name : name; | |
| const markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex); | |
| return createTooltipMarkup('section', { | |
| header: nameToDisplay, | |
| sortBlocks: true, | |
| blocks: zrUtil.map(indicatorAxes, axis => { | |
| const val = data.get(data.mapDimension(axis.dim), dataIndex); | |
| return createTooltipMarkup('nameValue', { | |
| markerType: 'subItem', | |
| markerColor: markerColor, | |
| name: axis.name, | |
| value: val, | |
| sortParam: val | |
| }); | |
| }) | |
| }); | |
| } | |
| getTooltipPosition(dataIndex: number) { | |
| if (dataIndex != null) { | |
| const data = this.getData(); | |
| const coordSys = this.coordinateSystem; | |
| const values = data.getValues( | |
| zrUtil.map(coordSys.dimensions, function (dim) { | |
| return data.mapDimension(dim); | |
| }), dataIndex | |
| ); | |
| for (let i = 0, len = values.length; i < len; i++) { | |
| if (!isNaN(values[i] as number)) { | |
| const indicatorAxes = coordSys.getIndicatorAxes(); | |
| return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i); | |
| } | |
| } | |
| } | |
| } | |
| static defaultOption: RadarSeriesOption = { | |
| // zlevel: 0, | |
| z: 2, | |
| colorBy: 'data', | |
| coordinateSystem: 'radar', | |
| legendHoverLink: true, | |
| radarIndex: 0, | |
| lineStyle: { | |
| width: 2, | |
| type: 'solid', | |
| join: 'round' | |
| }, | |
| label: { | |
| position: 'top' | |
| }, | |
| // areaStyle: { | |
| // }, | |
| // itemStyle: {} | |
| symbolSize: 8 | |
| // symbolRotate: null | |
| }; | |
| } | |
| export default RadarSeriesModel; |