|  | /* | 
|  | * 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 createSeriesData from '../helper/createSeriesData'; | 
|  | import SeriesModel from '../../model/Series'; | 
|  | import { | 
|  | SeriesOnCartesianOptionMixin, | 
|  | SeriesOption, | 
|  | SeriesOnPolarOptionMixin, | 
|  | SeriesStackOptionMixin, | 
|  | SeriesLabelOption, | 
|  | LineStyleOption, | 
|  | ItemStyleOption, | 
|  | AreaStyleOption, | 
|  | OptionDataValue, | 
|  | SymbolOptionMixin, | 
|  | SeriesSamplingOptionMixin, | 
|  | StatesOptionMixin, | 
|  | SeriesEncodeOptionMixin, | 
|  | CallbackDataParams, | 
|  | DefaultEmphasisFocus | 
|  | } from '../../util/types'; | 
|  | import SeriesData from '../../data/SeriesData'; | 
|  | import type Cartesian2D from '../../coord/cartesian/Cartesian2D'; | 
|  | import type Polar from '../../coord/polar/Polar'; | 
|  | import {createSymbol, ECSymbol} from '../../util/symbol'; | 
|  | import {Group} from '../../util/graphic'; | 
|  | import {LegendIconParams} from '../../component/legend/LegendModel'; | 
|  |  | 
|  | type LineDataValue = OptionDataValue | OptionDataValue[]; | 
|  |  | 
|  | interface LineStateOptionMixin { | 
|  | emphasis?: { | 
|  | focus?: DefaultEmphasisFocus | 
|  | scale?: boolean | number | 
|  | } | 
|  | } | 
|  |  | 
|  | export interface LineStateOption<TCbParams = never> { | 
|  | itemStyle?: ItemStyleOption<TCbParams> | 
|  | label?: SeriesLabelOption | 
|  | endLabel?: LineEndLabelOption | 
|  | } | 
|  |  | 
|  | export interface LineDataItemOption extends SymbolOptionMixin, | 
|  | LineStateOption, StatesOptionMixin<LineStateOption, LineStateOptionMixin> { | 
|  | name?: string | 
|  |  | 
|  | value?: LineDataValue | 
|  | } | 
|  |  | 
|  | export interface LineEndLabelOption extends SeriesLabelOption { | 
|  | valueAnimation?: boolean | 
|  | } | 
|  |  | 
|  |  | 
|  | export interface LineSeriesOption extends SeriesOption<LineStateOption<CallbackDataParams>, LineStateOptionMixin & { | 
|  | emphasis?: { | 
|  | lineStyle?: Omit<LineStyleOption, 'width'> & { | 
|  | width?: LineStyleOption['width'] | 'bolder' | 
|  | } | 
|  | areaStyle?: AreaStyleOption | 
|  | } | 
|  | blur?: { | 
|  | lineStyle?: LineStyleOption | 
|  | areaStyle?: AreaStyleOption | 
|  | } | 
|  | }>, LineStateOption<CallbackDataParams>, | 
|  | SeriesOnCartesianOptionMixin, | 
|  | SeriesOnPolarOptionMixin, | 
|  | SeriesStackOptionMixin, | 
|  | SeriesSamplingOptionMixin, | 
|  | SymbolOptionMixin<CallbackDataParams>, | 
|  | SeriesEncodeOptionMixin { | 
|  | type?: 'line' | 
|  |  | 
|  | coordinateSystem?: 'cartesian2d' | 'polar' | 
|  |  | 
|  | // If clip the overflow value | 
|  | clip?: boolean | 
|  |  | 
|  | label?: SeriesLabelOption | 
|  | endLabel?: LineEndLabelOption | 
|  |  | 
|  | lineStyle?: LineStyleOption | 
|  |  | 
|  | areaStyle?: AreaStyleOption & { | 
|  | origin?: 'auto' | 'start' | 'end' | number | 
|  | } | 
|  |  | 
|  | step?: false | 'start' | 'end' | 'middle' | 
|  |  | 
|  | smooth?: boolean | number | 
|  |  | 
|  | smoothMonotone?: 'x' | 'y' | 'none' | 
|  |  | 
|  | connectNulls?: boolean | 
|  |  | 
|  | showSymbol?: boolean | 
|  | // false | 'auto': follow the label interval strategy. | 
|  | // true: show all symbols. | 
|  | showAllSymbol?: 'auto' | boolean | 
|  |  | 
|  | data?: (LineDataValue | LineDataItemOption)[] | 
|  |  | 
|  | triggerLineEvent?: boolean | 
|  | } | 
|  |  | 
|  | class LineSeriesModel extends SeriesModel<LineSeriesOption> { | 
|  | static readonly type = 'series.line'; | 
|  | type = LineSeriesModel.type; | 
|  |  | 
|  | static readonly dependencies = ['grid', 'polar']; | 
|  |  | 
|  | coordinateSystem: Cartesian2D | Polar; | 
|  |  | 
|  | hasSymbolVisual = true; | 
|  |  | 
|  | getInitialData(option: LineSeriesOption): SeriesData { | 
|  | if (__DEV__) { | 
|  | const coordSys = option.coordinateSystem; | 
|  | if (coordSys !== 'polar' && coordSys !== 'cartesian2d') { | 
|  | throw new Error('Line not support coordinateSystem besides cartesian and polar'); | 
|  | } | 
|  | } | 
|  | return createSeriesData(null, this, { | 
|  | useEncodeDefaulter: true | 
|  | }); | 
|  | } | 
|  |  | 
|  | static defaultOption: LineSeriesOption = { | 
|  | // zlevel: 0, | 
|  | z: 3, | 
|  | coordinateSystem: 'cartesian2d', | 
|  | legendHoverLink: true, | 
|  |  | 
|  | clip: true, | 
|  |  | 
|  | label: { | 
|  | position: 'top' | 
|  | }, | 
|  |  | 
|  | // itemStyle: { | 
|  | // }, | 
|  |  | 
|  | endLabel: { | 
|  | show: false, | 
|  | valueAnimation: true, | 
|  | distance: 8 | 
|  | }, | 
|  |  | 
|  | lineStyle: { | 
|  | width: 2, | 
|  | type: 'solid' | 
|  | }, | 
|  |  | 
|  | emphasis: { | 
|  | scale: true | 
|  | }, | 
|  | // areaStyle: { | 
|  | // origin of areaStyle. Valid values: | 
|  | // `'auto'/null/undefined`: from axisLine to data | 
|  | // `'start'`: from min to data | 
|  | // `'end'`: from data to max | 
|  | // origin: 'auto' | 
|  | // }, | 
|  | // false, 'start', 'end', 'middle' | 
|  | step: false, | 
|  |  | 
|  | // Disabled if step is true | 
|  | smooth: false, | 
|  | smoothMonotone: null, | 
|  | symbol: 'emptyCircle', | 
|  | symbolSize: 4, | 
|  | symbolRotate: null, | 
|  |  | 
|  | showSymbol: true, | 
|  | // `false`: follow the label interval strategy. | 
|  | // `true`: show all symbols. | 
|  | // `'auto'`: If possible, show all symbols, otherwise | 
|  | //           follow the label interval strategy. | 
|  | showAllSymbol: 'auto', | 
|  |  | 
|  | // Whether to connect break point. | 
|  | connectNulls: false, | 
|  |  | 
|  | // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'. | 
|  | sampling: 'none', | 
|  |  | 
|  | animationEasing: 'linear', | 
|  |  | 
|  | // Disable progressive | 
|  | progressive: 0, | 
|  | hoverLayerThreshold: Infinity, | 
|  |  | 
|  | universalTransition: { | 
|  | divideShape: 'clone' | 
|  | }, | 
|  |  | 
|  | triggerLineEvent: false | 
|  | }; | 
|  |  | 
|  | getLegendIcon(opt: LegendIconParams): ECSymbol | Group { | 
|  | const group = new Group(); | 
|  |  | 
|  | const line = createSymbol( | 
|  | 'line', | 
|  | 0, | 
|  | opt.itemHeight / 2, | 
|  | opt.itemWidth, | 
|  | 0, | 
|  | opt.lineStyle.stroke, | 
|  | false | 
|  | ); | 
|  | group.add(line); | 
|  | line.setStyle(opt.lineStyle); | 
|  |  | 
|  | const visualType = this.getData().getVisual('symbol'); | 
|  | const visualRotate = this.getData().getVisual('symbolRotate'); | 
|  | const symbolType = visualType === 'none' ? 'circle' : visualType; | 
|  |  | 
|  | // Symbol size is 80% when there is a line | 
|  | const size = opt.itemHeight * 0.8; | 
|  | const symbol = createSymbol( | 
|  | symbolType, | 
|  | (opt.itemWidth - size) / 2, | 
|  | (opt.itemHeight - size) / 2, | 
|  | size, | 
|  | size, | 
|  | opt.itemStyle.fill | 
|  | ); | 
|  | group.add(symbol); | 
|  |  | 
|  | symbol.setStyle(opt.itemStyle); | 
|  |  | 
|  | const symbolRotate = opt.iconRotate === 'inherit' | 
|  | ? visualRotate | 
|  | : (opt.iconRotate || 0); | 
|  | symbol.rotation = symbolRotate * Math.PI / 180; | 
|  | symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); | 
|  |  | 
|  | if (symbolType.indexOf('empty') > -1) { | 
|  | symbol.style.stroke = symbol.style.fill; | 
|  | symbol.style.fill = '#fff'; | 
|  | symbol.style.lineWidth = 2; | 
|  | } | 
|  |  | 
|  | return group; | 
|  | } | 
|  | } | 
|  |  | 
|  | export default LineSeriesModel; |