diff --git a/src/component/gridSimple.ts b/src/component/gridSimple.ts index a19392f0453247105034031624d207468bdd1312..3e252699db4a250685e4d7720f3ce9ed5b8ec702 100644 --- a/src/component/gridSimple.ts +++ b/src/component/gridSimple.ts @@ -24,6 +24,7 @@ import * as zrUtil from 'zrender/src/core/util'; import * as graphic from '../util/graphic'; import '../coord/cartesian/Grid'; +import '../coord/cartesian/GridModel'; import './axis'; // Grid view diff --git a/src/component/legend.ts b/src/component/legend.ts index 28d35beb3fe81c2dccb52276d22ad5ddab3c47ad..b5d10c971ea6e89bfa54a91c7afe287b3799cbdf 100644 --- a/src/component/legend.ts +++ b/src/component/legend.ts @@ -26,12 +26,12 @@ import './legend/legendAction'; import './legend/LegendView'; import legendFilter from './legend/legendFilter'; -import Component, { ComponentModelConstructor } from '../model/Component'; +import Component from '../model/Component'; // Series Filter echarts.registerProcessor(echarts.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter); -(Component as ComponentModelConstructor).registerSubTypeDefaulter('legend', function () { +Component.registerSubTypeDefaulter('legend', function () { // Default 'plain' when no type specified. return 'plain'; }); diff --git a/src/component/tooltip/TooltipHTMLContent.ts b/src/component/tooltip/TooltipHTMLContent.ts index 879fdcca95340a033ca1bd8cae4eed19dafcecb3..e88f773cda7d025573b8e70ef9e5eab557f68047 100644 --- a/src/component/tooltip/TooltipHTMLContent.ts +++ b/src/component/tooltip/TooltipHTMLContent.ts @@ -28,6 +28,8 @@ import { ZRenderType } from 'zrender/src/zrender'; import { TooltipOption } from './TooltipModel'; import Model from '../../model/Model'; import { ZRRawEvent } from 'zrender/src/core/types'; +import CanvasPainter from 'zrender/src/canvas/Painter'; +import SVGPainter from 'zrender/src/svg/Painter'; var each = zrUtil.each; var toCamelCase = formatUtil.toCamelCase; @@ -134,7 +136,7 @@ function makeStyleCoord(out: number[], zr: ZRenderType, appendToBody: boolean, z // xy should be based on canvas root. But tooltipContent is // the sibling of canvas root. So padding of ec container // should be considered here. - var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset(); + var viewportRootOffset = zrPainter && (zrPainter as CanvasPainter | SVGPainter).getViewportRootOffset(); if (viewportRootOffset) { out[0] += viewportRootOffset.offsetLeft; out[1] += viewportRootOffset.offsetTop; diff --git a/src/component/visualMap/typeDefaulter.ts b/src/component/visualMap/typeDefaulter.ts index 0576b92b7e24be4f6b121ba062a860a1ddd6c2ad..6331c5520e97d5e5f3a2716484bcc16ed9202868 100644 --- a/src/component/visualMap/typeDefaulter.ts +++ b/src/component/visualMap/typeDefaulter.ts @@ -17,12 +17,12 @@ * under the License. */ -import Component, { ComponentModelConstructor } from '../../model/Component'; +import Component from '../../model/Component'; import {VisualMapOption} from './VisualMapModel'; import {PiecewiseVisualMapOption} from './PiecewiseModel'; import {ContinousVisualMapOption} from './ContinuousModel'; -(Component as ComponentModelConstructor).registerSubTypeDefaulter( +Component.registerSubTypeDefaulter( 'visualMap', function (option: VisualMapOption) { // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used. return ( diff --git a/src/coord/CoordinateSystem.ts b/src/coord/CoordinateSystem.ts index fbb62d8ea020344895b433b3935e1dbc46c93127..18daac87702bb5840b7442d53f1cdcba166c9add 100644 --- a/src/coord/CoordinateSystem.ts +++ b/src/coord/CoordinateSystem.ts @@ -52,7 +52,7 @@ export interface CoordinateSystemMaster { model?: Model; - update(ecModel: GlobalModel, api: ExtensionAPI): void; + update?: (ecModel: GlobalModel, api: ExtensionAPI) => void; // This methods is also responsible for determine whether this // coodinate system is applicable to the given `finder`. diff --git a/src/coord/axisCommonTypes.ts b/src/coord/axisCommonTypes.ts index 6d91988de3a771f3f415bdea51fbd697d18868b7..b20355cddfd2bec71defee8cdb718a2459020bd9 100644 --- a/src/coord/axisCommonTypes.ts +++ b/src/coord/axisCommonTypes.ts @@ -24,7 +24,9 @@ import { import { Dictionary } from 'zrender/src/core/types'; -export type OptionAxisType = 'category' | 'value' | 'time' | 'log'; +export var AXIS_TYPES = {value: 1, category: 1, time: 1, log: 1} as const; +export type OptionAxisType = keyof typeof AXIS_TYPES; + export interface AxisBaseOption extends ComponentOption { type?: OptionAxisType; diff --git a/src/coord/axisDefault.ts b/src/coord/axisDefault.ts index 7e64418c6e0d008401642b1bc6d88dc2b3d0d2fb..f477ee3b92564c2729e6fd05771ff0a2e585493a 100644 --- a/src/coord/axisDefault.ts +++ b/src/coord/axisDefault.ts @@ -174,8 +174,8 @@ var logAxis: AxisBaseOption = zrUtil.defaults({ export default { - categoryAxis: categoryAxis, - valueAxis: valueAxis, - timeAxis: timeAxis, - logAxis: logAxis + category: categoryAxis, + value: valueAxis, + time: timeAxis, + log: logAxis }; diff --git a/src/coord/axisModelCreator.ts b/src/coord/axisModelCreator.ts index 978394c814fd100440ac55163e22653ca7cb1237..fa624121ce8c73b778b59ee5b9b1fae62faa071d 100644 --- a/src/coord/axisModelCreator.ts +++ b/src/coord/axisModelCreator.ts @@ -17,8 +17,6 @@ * under the License. */ -// @ts-nocheck - import * as zrUtil from 'zrender/src/core/util'; import axisDefault from './axisDefault'; import ComponentModel from '../model/Component'; @@ -28,95 +26,100 @@ import { fetchLayoutMode } from '../util/layout'; import OrdinalMeta from '../data/OrdinalMeta'; -import { DimensionName, ComponentOption } from '../util/types'; -import { OptionAxisType } from './axisCommonTypes'; +import { DimensionName, BoxLayoutOptionMixin, OrdinalRawValue } from '../util/types'; +import { AxisBaseOption, AXIS_TYPES } from './axisCommonTypes'; +import GlobalModel from '../model/Global'; -// FIXME axisType is fixed ? -var AXIS_TYPES = ['value', 'category', 'time', 'log']; +type Constructor = new (...args: any[]) => T; /** * Generate sub axis model class - * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' - * @param {module:echarts/model/Component} BaseAxisModelClass - * @param {Function} axisTypeDefaulter - * @param {Object} [extraDefaultOption] + * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ... */ -export default function ( +export default function < + AxisOptionT extends AxisBaseOption, + AxisModelCtor extends Constructor> +>( axisName: DimensionName, - BaseAxisModelClass, - axisTypeDefaulter: (axisDim: DimensionName, option: ComponentOption) => OptionAxisType, - extraDefaultOption?: ComponentOption + BaseAxisModelClass: AxisModelCtor, + extraDefaultOption?: AxisOptionT ) { - zrUtil.each(AXIS_TYPES, function (axisType) { + zrUtil.each(AXIS_TYPES, function (v, axisType) { - BaseAxisModelClass.extend({ + var defaultOption = zrUtil.merge( + zrUtil.merge({}, axisDefault[axisType], true), + extraDefaultOption, true + ); - /** - * @readOnly - */ - type: axisName + 'Axis.' + axisType, + class AxisModel extends BaseAxisModelClass { + + static type = axisName + 'Axis.' + axisType; + type = axisName + 'Axis.' + axisType; + + static defaultOption = defaultOption; + + private __ordinalMeta: OrdinalMeta; - mergeDefaultAndTheme: function (option, ecModel) { + constructor(...args: any[]) { + super(...args); + } + + mergeDefaultAndTheme(option: AxisOptionT, ecModel: GlobalModel): void { var layoutMode = fetchLayoutMode(this); var inputPositionParams = layoutMode - ? getLayoutParams(option) : {}; + ? getLayoutParams(option as BoxLayoutOptionMixin) : {}; var themeModel = ecModel.getTheme(); zrUtil.merge(option, themeModel.get(axisType + 'Axis')); zrUtil.merge(option, this.getDefaultOption()); - option.type = axisTypeDefaulter(axisName, option); + option.type = getAxisType(option); if (layoutMode) { - mergeLayoutParam(option, inputPositionParams, layoutMode); + mergeLayoutParam(option as BoxLayoutOptionMixin, inputPositionParams, layoutMode); } - }, + } - /** - * @override - */ - optionUpdated: function () { + optionUpdated(): void { var thisOption = this.option; if (thisOption.type === 'category') { this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); } - }, + } /** * Should not be called before all of 'getInitailData' finished. * Because categories are collected during initializing data. */ - getCategories: function (rawData) { + getCategories(rawData: boolean): OrdinalRawValue[] | AxisBaseOption['data'] { var option = this.option; // FIXME // warning if called before all of 'getInitailData' finished. if (option.type === 'category') { if (rawData) { - return option.data; + return option.data as AxisBaseOption['data']; } return this.__ordinalMeta.categories; } - }, + } - getOrdinalMeta: function () { + getOrdinalMeta(): OrdinalMeta { return this.__ordinalMeta; - }, - - defaultOption: zrUtil.mergeAll( - [ - {}, - axisDefault[axisType + 'Axis'], - extraDefaultOption - ], - true - ) - }); + } + } + + ComponentModel.registerClass(AxisModel); }); ComponentModel.registerSubTypeDefaulter( axisName + 'Axis', - zrUtil.curry(axisTypeDefaulter, axisName) + getAxisType ); } + +function getAxisType(option: AxisBaseOption) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); +} diff --git a/src/coord/cartesian/AxisModel.ts b/src/coord/cartesian/AxisModel.ts index d038337d5674e59dc95919631b6f6e4fb801e7ea..890a51c54dc867685dba002e543471e6aec7cfda 100644 --- a/src/coord/cartesian/AxisModel.ts +++ b/src/coord/cartesian/AxisModel.ts @@ -22,7 +22,6 @@ import ComponentModel from '../../model/Component'; import axisModelCreator from '../axisModelCreator'; import {AxisModelCommonMixin} from '../axisModelCommonMixin'; import Axis2D from './Axis2D'; -import { DimensionName } from '../../util/types'; import { AxisBaseOption } from '../axisCommonTypes'; import GridModel from './GridModel'; @@ -69,11 +68,6 @@ class AxisModel extends ComponentModel { ComponentModel.registerClass(AxisModel); -function getAxisType(axisDim: DimensionName, option: CartesianAxisOption) { - // Default axis with data is category axis - return option.type || (option.data ? 'category' : 'value'); -} - interface AxisModel extends AxisModelCommonMixin {} zrUtil.mixin(AxisModel, AxisModelCommonMixin); @@ -83,7 +77,7 @@ var extraOption: CartesianAxisOption = { offset: 0 }; -axisModelCreator('x', AxisModel, getAxisType, extraOption); -axisModelCreator('y', AxisModel, getAxisType, extraOption); +axisModelCreator('x', AxisModel, extraOption); +axisModelCreator('y', AxisModel, extraOption); export default AxisModel; diff --git a/src/coord/cartesian/GridModel.ts b/src/coord/cartesian/GridModel.ts index 1a3106286c54f66f650c181aaee7e45f8b68fa29..e57ce5d3bc1009749680b198c792c82819ce5967 100644 --- a/src/coord/cartesian/GridModel.ts +++ b/src/coord/cartesian/GridModel.ts @@ -37,7 +37,7 @@ interface GridOption extends ComponentOption, BoxLayoutOptionMixin, ShadowOption tooltop?: any; // FIXME:TS add this tooltip type } -export default class extends ComponentModel implements CoordinateSystemHostModel { +class GridModel extends ComponentModel implements CoordinateSystemHostModel { static type = 'grid'; @@ -63,5 +63,8 @@ export default class extends ComponentModel implements CoordinateSys borderWidth: 1, borderColor: '#ccc' } +} + +ComponentModel.registerClass(GridModel); -} \ No newline at end of file +export default GridModel; diff --git a/src/coord/parallel/AxisModel.ts b/src/coord/parallel/AxisModel.ts index 1cfe63949fa74ee7cf99e9316f36c693987fd31e..da707a982301870d91318f62f23a706f23afa548 100644 --- a/src/coord/parallel/AxisModel.ts +++ b/src/coord/parallel/AxisModel.ts @@ -142,10 +142,6 @@ var defaultOption = { zrUtil.mixin(AxisModel, AxisModelCommonMixin); -function getAxisType(axisName, option) { - return option.type || (option.data ? 'category' : 'value'); -} - -axisModelCreator('parallel', AxisModel, getAxisType, defaultOption); +axisModelCreator('parallel', AxisModel, defaultOption); export default AxisModel; \ No newline at end of file diff --git a/src/coord/polar/AxisModel.ts b/src/coord/polar/AxisModel.ts index a6f744df724c544ed40d18748429dfa0ccdcf155..7169112c9c62f57dee32b813138eeb83ef461661 100644 --- a/src/coord/polar/AxisModel.ts +++ b/src/coord/polar/AxisModel.ts @@ -71,10 +71,5 @@ var polarAxisDefaultExtendedOption = { } }; -function getAxisType(axisDim, option) { - // Default axis with data is category axis - return option.type || (option.data ? 'category' : 'value'); -} - -axisModelCreator('angle', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.angle); -axisModelCreator('radius', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.radius); +axisModelCreator('angle', PolarAxisModel, polarAxisDefaultExtendedOption.angle); +axisModelCreator('radius', PolarAxisModel, polarAxisDefaultExtendedOption.radius); diff --git a/src/coord/radar/RadarModel.ts b/src/coord/radar/RadarModel.ts index 9b0fe350bd3c3fa90cf6640a7eed1ee78d9ce91f..de7b215ad3cc5d402b5642333f60c5947905410a 100644 --- a/src/coord/radar/RadarModel.ts +++ b/src/coord/radar/RadarModel.ts @@ -25,7 +25,7 @@ import axisDefault from '../axisDefault'; import Model from '../../model/Model'; import {AxisModelCommonMixin} from '../axisModelCommonMixin'; -var valueAxisDefault = axisDefault.valueAxis; +var valueAxisDefault = axisDefault.value; function defaultsShow(opt, show) { return zrUtil.defaults({ diff --git a/src/coord/single/AxisModel.ts b/src/coord/single/AxisModel.ts index b8b36b5f41da684be47e0d357670a16a092de270..75b235cd16355f7b62cd5c68128077121ce51513 100644 --- a/src/coord/single/AxisModel.ts +++ b/src/coord/single/AxisModel.ts @@ -99,12 +99,8 @@ var defaultOption = { } }; -function getAxisType(axisName, option) { - return option.type || (option.data ? 'category' : 'value'); -} - zrUtil.mixin(AxisModel, {AxisModelCommonMixin}); -axisModelCreator('single', AxisModel, getAxisType, defaultOption); +axisModelCreator('single', AxisModel, defaultOption); export default AxisModel; \ No newline at end of file diff --git a/src/helper.ts b/src/helper.ts index d1d27669d28c727e070384b62e250f3eaab23bdc..1d03dfc358c2b2a7542b4182bdb5958409011955 100644 --- a/src/helper.ts +++ b/src/helper.ts @@ -76,13 +76,21 @@ export {createSymbol} from './util/symbol'; /** * Create scale * @param {Array.} dataExtent - * @param {Object|module:echarts/Model} option + * @param {Object|module:echarts/Model} option If `optoin.type` + * is secified, it can only be `'value'` currently. */ export function createScale(dataExtent, option) { var axisModel = option; if (!Model.isInstance(option)) { axisModel = new Model(option); - zrUtil.mixin(axisModel, AxisModelCommonMixin); + // FIXME + // Currently AxisModelCommonMixin has nothing to do with the + // the requirements of `axisHelper.createScaleByModel`. For + // example the method `getCategories` and `getOrdinalMeta` + // are required for `'category'` axis, and ecModel are required + // for `'time'` axis. But occationally echarts-gl happened + // to only use `'value'` axis. + // zrUtil.mixin(axisModel, AxisModelCommonMixin); } var scale = axisHelper.createScaleByModel(axisModel); diff --git a/src/model/Component.ts b/src/model/Component.ts index 73c2ed7eb8bef068412f1487a6f72fe2153fd7da..9c1ca02404424afd907322abbd19c2a73fe5426f 100644 --- a/src/model/Component.ts +++ b/src/model/Component.ts @@ -286,6 +286,8 @@ class ComponentModel extends Mode } static registerClass: ClassManager['registerClass']; + + static registerSubTypeDefaulter: componentUtil.SubTypeDefaulterManager['registerSubTypeDefaulter']; } // Reset ComponentModel.extend, add preConstruct.