| /* |
| * 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; |