|  | /* | 
|  | * 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 * as zrUtil from 'zrender/src/core/util'; | 
|  | import axisDefault from '../axisDefault'; | 
|  | import Model from '../../model/Model'; | 
|  | import {AxisModelCommonMixin} from '../axisModelCommonMixin'; | 
|  | import ComponentModel from '../../model/Component'; | 
|  | import { | 
|  | ComponentOption, | 
|  | CircleLayoutOptionMixin, | 
|  | LabelOption, | 
|  | ColorString | 
|  | } from '../../util/types'; | 
|  | import { AxisBaseOption, CategoryAxisBaseOption, ValueAxisBaseOption } from '../axisCommonTypes'; | 
|  | import { AxisBaseModel } from '../AxisBaseModel'; | 
|  | import Radar from './Radar'; | 
|  | import {CoordinateSystemHostModel} from '../../coord/CoordinateSystem'; | 
|  |  | 
|  | const valueAxisDefault = axisDefault.value; | 
|  |  | 
|  | function defaultsShow(opt: object, show: boolean) { | 
|  | return zrUtil.defaults({ | 
|  | show: show | 
|  | }, opt); | 
|  | } | 
|  |  | 
|  | export interface RadarIndicatorOption { | 
|  | name?: string | 
|  | /** | 
|  | * @deprecated Use `name` instead. | 
|  | */ | 
|  | text?: string | 
|  | min?: number | 
|  | max?: number | 
|  | color?: ColorString | 
|  |  | 
|  | axisType?: 'value' | 'log' | 
|  | } | 
|  |  | 
|  | export interface RadarOption extends ComponentOption, CircleLayoutOptionMixin { | 
|  | mainType?: 'radar' | 
|  |  | 
|  | startAngle?: number | 
|  |  | 
|  | shape?: 'polygon' | 'circle' | 
|  |  | 
|  | // TODO. axisType seems to have issue. | 
|  | // axisType?: 'value' | 'log' | 
|  |  | 
|  | axisLine?: AxisBaseOption['axisLine'] | 
|  | axisTick?: AxisBaseOption['axisTick'] | 
|  | axisLabel?: AxisBaseOption['axisLabel'] | 
|  | splitLine?: AxisBaseOption['splitLine'] | 
|  | splitArea?: AxisBaseOption['splitArea'] | 
|  |  | 
|  | // TODO Use axisName? | 
|  | axisName?: { | 
|  | show?: boolean | 
|  | formatter?: string | ((name?: string, indicatorOpt?: InnerIndicatorAxisOption) => string) | 
|  | } & LabelOption | 
|  | axisNameGap?: number | 
|  |  | 
|  | triggerEvent?: boolean | 
|  |  | 
|  | scale?: boolean | 
|  | splitNumber?: number | 
|  |  | 
|  | boundaryGap?: CategoryAxisBaseOption['boundaryGap'] | 
|  | | ValueAxisBaseOption['boundaryGap'] | 
|  |  | 
|  | indicator?: RadarIndicatorOption[] | 
|  | } | 
|  |  | 
|  | export type InnerIndicatorAxisOption = AxisBaseOption & { | 
|  | // TODO Use type? | 
|  | // axisType?: 'value' | 'log' | 
|  | showName?: boolean | 
|  | }; | 
|  |  | 
|  | class RadarModel extends ComponentModel<RadarOption> implements CoordinateSystemHostModel { | 
|  | static readonly type = 'radar'; | 
|  | readonly type = RadarModel.type; | 
|  |  | 
|  | coordinateSystem: Radar; | 
|  |  | 
|  | private _indicatorModels: AxisBaseModel<InnerIndicatorAxisOption>[]; | 
|  |  | 
|  | optionUpdated() { | 
|  | const boundaryGap = this.get('boundaryGap'); | 
|  | const splitNumber = this.get('splitNumber'); | 
|  | const scale = this.get('scale'); | 
|  | const axisLine = this.get('axisLine'); | 
|  | const axisTick = this.get('axisTick'); | 
|  | // let axisType = this.get('axisType'); | 
|  | const axisLabel = this.get('axisLabel'); | 
|  | const nameTextStyle = this.get('axisName'); | 
|  | const showName = this.get(['axisName', 'show']); | 
|  | const nameFormatter = this.get(['axisName', 'formatter']); | 
|  | const nameGap = this.get('axisNameGap'); | 
|  | const triggerEvent = this.get('triggerEvent'); | 
|  |  | 
|  | const indicatorModels = zrUtil.map(this.get('indicator') || [], function (indicatorOpt) { | 
|  | // PENDING | 
|  | if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) { | 
|  | indicatorOpt.min = 0; | 
|  | } | 
|  | else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) { | 
|  | indicatorOpt.max = 0; | 
|  | } | 
|  | let iNameTextStyle = nameTextStyle; | 
|  | if (indicatorOpt.color != null) { | 
|  | iNameTextStyle = zrUtil.defaults({ | 
|  | color: indicatorOpt.color | 
|  | }, nameTextStyle); | 
|  | } | 
|  | // Use same configuration | 
|  | const innerIndicatorOpt: InnerIndicatorAxisOption = zrUtil.merge(zrUtil.clone(indicatorOpt), { | 
|  | boundaryGap: boundaryGap, | 
|  | splitNumber: splitNumber, | 
|  | scale: scale, | 
|  | axisLine: axisLine, | 
|  | axisTick: axisTick, | 
|  | // axisType: axisType, | 
|  | axisLabel: axisLabel, | 
|  | // Compatible with 2 and use text | 
|  | name: indicatorOpt.text, | 
|  | showName: showName, | 
|  | nameLocation: 'end', | 
|  | nameGap: nameGap, | 
|  | // min: 0, | 
|  | nameTextStyle: iNameTextStyle, | 
|  | triggerEvent: triggerEvent | 
|  | } as InnerIndicatorAxisOption, false); | 
|  | if (zrUtil.isString(nameFormatter)) { | 
|  | const indName = innerIndicatorOpt.name; | 
|  | innerIndicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : ''); | 
|  | } | 
|  | else if (zrUtil.isFunction(nameFormatter)) { | 
|  | innerIndicatorOpt.name = nameFormatter( | 
|  | innerIndicatorOpt.name, innerIndicatorOpt | 
|  | ); | 
|  | } | 
|  |  | 
|  | const model = new Model(innerIndicatorOpt, null, this.ecModel) as AxisBaseModel<InnerIndicatorAxisOption>; | 
|  | zrUtil.mixin(model, AxisModelCommonMixin.prototype); | 
|  | // For triggerEvent. | 
|  | model.mainType = 'radar'; | 
|  | model.componentIndex = this.componentIndex; | 
|  |  | 
|  | return model; | 
|  | }, this); | 
|  |  | 
|  | this._indicatorModels = indicatorModels; | 
|  | } | 
|  |  | 
|  | getIndicatorModels() { | 
|  | return this._indicatorModels; | 
|  | } | 
|  |  | 
|  | static defaultOption: RadarOption = { | 
|  |  | 
|  | // zlevel: 0, | 
|  |  | 
|  | z: 0, | 
|  |  | 
|  | center: ['50%', '50%'], | 
|  |  | 
|  | radius: '75%', | 
|  |  | 
|  | startAngle: 90, | 
|  |  | 
|  | axisName: { | 
|  | show: true | 
|  | // formatter: null | 
|  | // textStyle: {} | 
|  | }, | 
|  |  | 
|  | boundaryGap: [0, 0], | 
|  |  | 
|  | splitNumber: 5, | 
|  |  | 
|  | axisNameGap: 15, | 
|  |  | 
|  | scale: false, | 
|  |  | 
|  | // Polygon or circle | 
|  | shape: 'polygon', | 
|  |  | 
|  | axisLine: zrUtil.merge( | 
|  | { | 
|  | lineStyle: { | 
|  | color: '#bbb' | 
|  | } | 
|  | }, | 
|  | valueAxisDefault.axisLine | 
|  | ), | 
|  | axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), | 
|  | axisTick: defaultsShow(valueAxisDefault.axisTick, false), | 
|  | // axisType: 'value', | 
|  | splitLine: defaultsShow(valueAxisDefault.splitLine, true), | 
|  | splitArea: defaultsShow(valueAxisDefault.splitArea, true), | 
|  |  | 
|  | // {text, min, max} | 
|  | indicator: [] | 
|  | }; | 
|  | } | 
|  |  | 
|  | export default RadarModel; |