Spaces:
Running
Running
| /* | |
| * 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 Displayable from 'zrender/src/graphic/Displayable'; | |
| import { ImageProps, ImageStyleProps } from 'zrender/src/graphic/Image'; | |
| import { PathProps, PathStyleProps } from 'zrender/src/graphic/Path'; | |
| import { ZRenderType } from 'zrender/src/zrender'; | |
| import { BarGridLayoutOptionForCustomSeries, BarGridLayoutResult } from '../../layout/barGrid'; | |
| import { | |
| AnimationOption, | |
| BlurScope, | |
| CallbackDataParams, | |
| Dictionary, | |
| DimensionLoose, | |
| ItemStyleOption, | |
| LabelOption, | |
| OptionDataValue, | |
| OrdinalRawValue, | |
| ParsedValue, | |
| SeriesDataType, | |
| SeriesEncodeOptionMixin, | |
| SeriesOnCalendarOptionMixin, | |
| SeriesOnCartesianOptionMixin, | |
| SeriesOnGeoOptionMixin, | |
| SeriesOnPolarOptionMixin, | |
| SeriesOnSingleOptionMixin, | |
| SeriesOption, | |
| TextCommonOption, | |
| ZRStyleProps | |
| } from '../../util/types'; | |
| import Element from 'zrender/src/Element'; | |
| import SeriesData, { DefaultDataVisual } from '../../data/SeriesData'; | |
| import GlobalModel from '../../model/Global'; | |
| import createSeriesData from '../helper/createSeriesData'; | |
| import { makeInner } from '../../util/model'; | |
| import { CoordinateSystem } from '../../coord/CoordinateSystem'; | |
| import SeriesModel from '../../model/Series'; | |
| import { | |
| Arc, | |
| BezierCurve, | |
| Circle, | |
| CompoundPath, | |
| Ellipse, | |
| Line, | |
| Polygon, | |
| Polyline, | |
| Rect, | |
| Ring, | |
| Sector | |
| } from '../../util/graphic'; | |
| import { TextProps, TextStyleProps } from 'zrender/src/graphic/Text'; | |
| import { GroupProps } from 'zrender/src/graphic/Group'; | |
| import { | |
| TransitionOptionMixin, | |
| TransitionBaseDuringAPI, | |
| TransitionDuringAPI | |
| } from '../../animation/customGraphicTransition'; | |
| import { TransformProp } from 'zrender/src/core/Transformable'; | |
| import { ElementKeyframeAnimationOption } from '../../animation/customGraphicKeyframeAnimation'; | |
| export type CustomExtraElementInfo = Dictionary<unknown>; | |
| // Also compat with ec4, where | |
| // `visual('color') visual('borderColor')` is supported. | |
| export const STYLE_VISUAL_TYPE = { | |
| color: 'fill', | |
| borderColor: 'stroke' | |
| } as const; | |
| export type StyleVisualProps = keyof typeof STYLE_VISUAL_TYPE; | |
| export const NON_STYLE_VISUAL_PROPS = { | |
| symbol: 1, | |
| symbolSize: 1, | |
| symbolKeepAspect: 1, | |
| legendIcon: 1, | |
| visualMeta: 1, | |
| liftZ: 1, | |
| decal: 1 | |
| } as const; | |
| export type NonStyleVisualProps = keyof typeof NON_STYLE_VISUAL_PROPS; | |
| // Do not declare "Dictionary" in ElementTransitionOptions to restrict the type check. | |
| type ShapeMorphingOption = { | |
| /** | |
| * If do shape morphing animation when type is changed. | |
| * Only available on path. | |
| */ | |
| morph?: boolean | |
| }; | |
| export interface CustomBaseElementOption extends Partial<Pick< | |
| Element, TransformProp | 'silent' | 'ignore' | 'textConfig' | |
| >> { | |
| // element type, required. | |
| type: string; | |
| id?: string; | |
| // For animation diff. | |
| name?: string; | |
| info?: CustomExtraElementInfo; | |
| // `false` means remove the textContent. | |
| textContent?: CustomTextOption | false; | |
| // `false` means remove the clipPath | |
| clipPath?: CustomBaseZRPathOption | false; | |
| // `extra` can be set in any el option for custom prop for annimation duration. | |
| extra?: Dictionary<unknown> & TransitionOptionMixin; | |
| // updateDuringAnimation | |
| during?(params: TransitionBaseDuringAPI): void; | |
| enterAnimation?: AnimationOption | |
| updateAnimation?: AnimationOption | |
| leaveAnimation?: AnimationOption | |
| }; | |
| export interface CustomDisplayableOption extends CustomBaseElementOption, Partial<Pick< | |
| Displayable, 'zlevel' | 'z' | 'z2' | 'invisible' | |
| >> { | |
| style?: ZRStyleProps; | |
| during?(params: TransitionDuringAPI): void; | |
| /** | |
| * @deprecated | |
| */ | |
| // `false` means remove emphasis trigger. | |
| styleEmphasis?: ZRStyleProps | false; | |
| emphasis?: CustomDisplayableOptionOnState; | |
| blur?: CustomDisplayableOptionOnState; | |
| select?: CustomDisplayableOptionOnState; | |
| } | |
| export interface CustomDisplayableOptionOnState extends Partial<Pick< | |
| Displayable, TransformProp | 'textConfig' | 'z2' | |
| >> { | |
| // `false` means remove emphasis trigger. | |
| style?: ZRStyleProps | false; | |
| } | |
| export interface CustomGroupOption extends CustomBaseElementOption, TransitionOptionMixin<GroupProps>{ | |
| type: 'group'; | |
| width?: number; | |
| height?: number; | |
| // @deprecated | |
| diffChildrenByName?: boolean; | |
| children: CustomElementOption[]; | |
| $mergeChildren?: false | 'byName' | 'byIndex'; | |
| keyframeAnimation?: ElementKeyframeAnimationOption<GroupProps> | ElementKeyframeAnimationOption<GroupProps>[] | |
| } | |
| export interface CustomBaseZRPathOption<T extends PathProps['shape'] = PathProps['shape']> | |
| extends CustomDisplayableOption, ShapeMorphingOption, TransitionOptionMixin<PathProps & {shape: T}> { | |
| autoBatch?: boolean; | |
| shape?: T & TransitionOptionMixin<T>; | |
| style?: PathProps['style'] & TransitionOptionMixin<PathStyleProps> | |
| during?(params: TransitionDuringAPI<PathStyleProps, T>): void; | |
| keyframeAnimation?: ElementKeyframeAnimationOption<PathProps & { shape: T }> | |
| | ElementKeyframeAnimationOption<PathProps & { shape: T }>[] | |
| } | |
| interface BuiltinShapes { | |
| circle: Partial<Circle['shape']> | |
| rect: Partial<Rect['shape']> | |
| sector: Partial<Sector['shape']> | |
| polygon: Partial<Polygon['shape']> | |
| polyline: Partial<Polyline['shape']> | |
| line: Partial<Line['shape']> | |
| arc: Partial<Arc['shape']> | |
| bezierCurve: Partial<BezierCurve['shape']> | |
| ring: Partial<Ring['shape']> | |
| ellipse: Partial<Ellipse['shape']> | |
| compoundPath: Partial<CompoundPath['shape']> | |
| } | |
| interface CustomSVGPathShapeOption { | |
| // SVG Path, like 'M0,0 L0,-20 L70,-1 L70,0 Z' | |
| pathData?: string; | |
| // "d" is the alias of `pathData` follows the SVG convention. | |
| d?: string; | |
| layout?: 'center' | 'cover'; | |
| x?: number; | |
| y?: number; | |
| width?: number; | |
| height?: number; | |
| } | |
| export interface CustomSVGPathOption extends CustomBaseZRPathOption<CustomSVGPathShapeOption> { | |
| type: 'path'; | |
| } | |
| interface CustomBuitinPathOption<T extends keyof BuiltinShapes> | |
| extends CustomBaseZRPathOption<BuiltinShapes[T]> { | |
| type: T | |
| } | |
| type CreateCustomBuitinPathOption<T extends keyof BuiltinShapes> = T extends any | |
| ? CustomBuitinPathOption<T> : never; | |
| export type CustomPathOption = CreateCustomBuitinPathOption<keyof BuiltinShapes> | |
| | CustomSVGPathOption; | |
| export interface CustomImageOptionOnState extends CustomDisplayableOptionOnState { | |
| style?: ImageStyleProps; | |
| } | |
| export interface CustomImageOption extends CustomDisplayableOption, TransitionOptionMixin<ImageProps> { | |
| type: 'image'; | |
| style?: ImageStyleProps & TransitionOptionMixin<ImageStyleProps>; | |
| emphasis?: CustomImageOptionOnState; | |
| blur?: CustomImageOptionOnState; | |
| select?: CustomImageOptionOnState; | |
| keyframeAnimation?: ElementKeyframeAnimationOption<ImageProps> | ElementKeyframeAnimationOption<ImageProps>[] | |
| } | |
| export interface CustomTextOptionOnState extends CustomDisplayableOptionOnState { | |
| style?: TextStyleProps; | |
| } | |
| export interface CustomTextOption extends CustomDisplayableOption, TransitionOptionMixin<TextProps> { | |
| type: 'text'; | |
| style?: TextStyleProps & TransitionOptionMixin<TextStyleProps>; | |
| emphasis?: CustomTextOptionOnState; | |
| blur?: CustomTextOptionOnState; | |
| select?: CustomTextOptionOnState; | |
| keyframeAnimation?: ElementKeyframeAnimationOption<TextProps> | ElementKeyframeAnimationOption<TextProps>[] | |
| } | |
| export type CustomElementOption = CustomPathOption | |
| | CustomImageOption | |
| | CustomTextOption | |
| | CustomGroupOption; | |
| // Can only set focus, blur on the root element. | |
| export type CustomRootElementOption = CustomElementOption & { | |
| focus?: 'none' | 'self' | 'series' | ArrayLike<number> | |
| blurScope?: BlurScope | |
| emphasisDisabled?: boolean | |
| }; | |
| export type CustomElementOptionOnState = CustomDisplayableOptionOnState | |
| | CustomImageOptionOnState; | |
| export interface CustomSeriesRenderItemAPI extends | |
| CustomSeriesRenderItemCoordinateSystemAPI { | |
| // Methods from ExtensionAPI. | |
| // NOTE: Not using Pick<ExtensionAPI> here because we don't want to bundle ExtensionAPI into the d.ts | |
| getWidth(): number | |
| getHeight(): number | |
| getZr(): ZRenderType | |
| getDevicePixelRatio(): number | |
| value(dim: DimensionLoose, dataIndexInside?: number): ParsedValue; | |
| ordinalRawValue(dim: DimensionLoose, dataIndexInside?: number): ParsedValue | OrdinalRawValue; | |
| /** | |
| * @deprecated | |
| */ | |
| style(userProps?: ZRStyleProps, dataIndexInside?: number): ZRStyleProps; | |
| /** | |
| * @deprecated | |
| */ | |
| styleEmphasis(userProps?: ZRStyleProps, dataIndexInside?: number): ZRStyleProps; | |
| visual<VT extends NonStyleVisualProps | StyleVisualProps>( | |
| visualType: VT, | |
| dataIndexInside?: number | |
| ): VT extends NonStyleVisualProps ? DefaultDataVisual[VT] | |
| : VT extends StyleVisualProps ? PathStyleProps[typeof STYLE_VISUAL_TYPE[VT]] | |
| : void; | |
| barLayout(opt: BarGridLayoutOptionForCustomSeries): BarGridLayoutResult; | |
| currentSeriesIndices(): number[]; | |
| font(opt: Pick<TextCommonOption, 'fontStyle' | 'fontWeight' | 'fontSize' | 'fontFamily'>): string; | |
| } | |
| export interface CustomSeriesRenderItemParamsCoordSys { | |
| type: string; | |
| // And extra params for each coordinate systems. | |
| } | |
| export interface CustomSeriesRenderItemCoordinateSystemAPI { | |
| coord( | |
| data: OptionDataValue | OptionDataValue[], | |
| clamp?: boolean | |
| ): number[]; | |
| size?( | |
| dataSize: OptionDataValue | OptionDataValue[], | |
| dataItem?: OptionDataValue | OptionDataValue[] | |
| ): number | number[]; | |
| } | |
| export type WrapEncodeDefRet = Dictionary<number[]>; | |
| export interface CustomSeriesRenderItemParams { | |
| context: Dictionary<unknown>; | |
| dataIndex: number; | |
| seriesId: string; | |
| seriesName: string; | |
| seriesIndex: number; | |
| coordSys: CustomSeriesRenderItemParamsCoordSys; | |
| encode: WrapEncodeDefRet; | |
| dataIndexInside: number; | |
| dataInsideLength: number; | |
| actionType?: string; | |
| } | |
| export type CustomSeriesRenderItemReturn = CustomRootElementOption | undefined | null; | |
| export type CustomSeriesRenderItem = ( | |
| params: CustomSeriesRenderItemParams, | |
| api: CustomSeriesRenderItemAPI | |
| ) => CustomSeriesRenderItemReturn; | |
| export interface CustomSeriesOption extends | |
| SeriesOption<unknown>, // don't support StateOption in custom series. | |
| SeriesEncodeOptionMixin, | |
| SeriesOnCartesianOptionMixin, | |
| SeriesOnPolarOptionMixin, | |
| SeriesOnSingleOptionMixin, | |
| SeriesOnGeoOptionMixin, | |
| SeriesOnCalendarOptionMixin { | |
| type?: 'custom' | |
| // If set as 'none', do not depends on coord sys. | |
| coordinateSystem?: string | 'none'; | |
| renderItem?: CustomSeriesRenderItem; | |
| /** | |
| * @deprecated | |
| */ | |
| itemStyle?: ItemStyleOption; | |
| /** | |
| * @deprecated | |
| */ | |
| label?: LabelOption; | |
| /** | |
| * @deprecated | |
| */ | |
| emphasis?: { | |
| /** | |
| * @deprecated | |
| */ | |
| itemStyle?: ItemStyleOption; | |
| /** | |
| * @deprecated | |
| */ | |
| label?: LabelOption; | |
| } | |
| // Only works on polar and cartesian2d coordinate system. | |
| clip?: boolean; | |
| } | |
| export const customInnerStore = makeInner<{ | |
| info: CustomExtraElementInfo; | |
| customPathData: string; | |
| customGraphicType: string; | |
| customImagePath: CustomImageOption['style']['image']; | |
| // customText: string; | |
| txConZ2Set: number; | |
| option: CustomElementOption; | |
| }, Element>(); | |
| export default class CustomSeriesModel extends SeriesModel<CustomSeriesOption> { | |
| static type = 'series.custom'; | |
| readonly type = CustomSeriesModel.type; | |
| static dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; | |
| // preventAutoZ = true; | |
| currentZLevel: number; | |
| currentZ: number; | |
| static defaultOption: CustomSeriesOption = { | |
| coordinateSystem: 'cartesian2d', // Can be set as 'none' | |
| // zlevel: 0, | |
| z: 2, | |
| legendHoverLink: true, | |
| // Custom series will not clip by default. | |
| // Some case will use custom series to draw label | |
| // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight | |
| clip: false | |
| // Cartesian coordinate system | |
| // xAxisIndex: 0, | |
| // yAxisIndex: 0, | |
| // Polar coordinate system | |
| // polarIndex: 0, | |
| // Geo coordinate system | |
| // geoIndex: 0, | |
| }; | |
| optionUpdated() { | |
| this.currentZLevel = this.get('zlevel', true); | |
| this.currentZ = this.get('z', true); | |
| } | |
| getInitialData(option: CustomSeriesOption, ecModel: GlobalModel): SeriesData { | |
| return createSeriesData(null, this); | |
| } | |
| getDataParams(dataIndex: number, dataType?: SeriesDataType, el?: Element): CallbackDataParams & { | |
| info: CustomExtraElementInfo | |
| } { | |
| const params = super.getDataParams(dataIndex, dataType) as ReturnType<CustomSeriesModel['getDataParams']>; | |
| el && (params.info = customInnerStore(el).info); | |
| return params; | |
| } | |
| } | |
| export type PrepareCustomInfo = (coordSys: CoordinateSystem) => { | |
| coordSys: CustomSeriesRenderItemParamsCoordSys; | |
| api: CustomSeriesRenderItemCoordinateSystemAPI | |
| }; | |