You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2020/02/19 07:15:47 UTC

[incubator-echarts] branch typescript updated: refact: Model#option can only be object. rename StageHandler

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch typescript
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git


The following commit(s) were added to refs/heads/typescript by this push:
     new 69ad6bf  refact: Model#option can only be object. rename StageHandler
69ad6bf is described below

commit 69ad6bfe6750c087922236a1ec9c758a8c1347fa
Author: pissang <bm...@gmail.com>
AuthorDate: Wed Feb 19 15:15:16 2020 +0800

    refact: Model#option can only be object. rename StageHandler
---
 src/chart/pie/PieSeries.ts | 17 +++++++++++++++--
 src/data/List.ts           |  9 ++++++---
 src/echarts.ts             | 42 ++++++++++++++++++++++++------------------
 src/model/Global.ts        |  3 +--
 src/model/Model.ts         | 25 +++++++++----------------
 src/util/graphic.ts        | 13 +++++--------
 src/util/types.ts          | 17 +++++++++--------
 7 files changed, 69 insertions(+), 57 deletions(-)

diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts
index cd300c8..f8205b2 100644
--- a/src/chart/pie/PieSeries.ts
+++ b/src/chart/pie/PieSeries.ts
@@ -44,6 +44,18 @@ interface PieLabelOption extends LabelOption {
     bleedMargin?: number
     distanceToLabelLine?: number
 }
+
+interface PieDataItem {
+    itemStyle?: ItemStyleOption
+    label?: PieLabelOption
+    labelLine?: LabelLineOption
+
+    emphasis?: {
+        itemStyle?: ItemStyleOption
+        label?: PieLabelOption
+        labelLine?: LabelLineOption
+    }
+}
 export interface PieSeriesOption extends
     SeriesOption,
     DataSelectableOptionMixin,
@@ -54,6 +66,7 @@ export interface PieSeriesOption extends
 
     roseType?: 'radius' | 'area'
 
+    // TODO: TYPE Color Callback
     itemStyle?: ItemStyleOption
     label?: PieLabelOption
     labelLine?: LabelLineOption
@@ -73,14 +86,14 @@ export interface PieSeriesOption extends
 
     emphasis?: {
         itemStyle?: ItemStyleOption
-
         label?: PieLabelOption
-
         labelLine?: LabelLineOption
     }
 
     animationType?: 'expansion' | 'scale'
     animationTypeUpdate?: 'transition' | 'expansion'
+
+    data?: number[] | PieDataItem[]
 }
 
 class PieSeries extends SeriesModel<PieSeriesOption> {
diff --git a/src/data/List.ts b/src/data/List.ts
index 7344dbe..5f8dd2e 100644
--- a/src/data/List.ts
+++ b/src/data/List.ts
@@ -36,7 +36,7 @@ import {ArrayLike, Dictionary, FunctionPropertyNames} from 'zrender/src/core/typ
 import Element from 'zrender/src/Element';
 import {
     DimensionIndex, DimensionName, ECElement, DimensionLoose, OptionDataItem,
-    ParsedDataValue, ParsedDataNumeric, OrdinalRawValueIndex, DimensionUserOuput
+    ParsedDataValue, ParsedDataNumeric, OrdinalRawValueIndex, DimensionUserOuput, ModelOption
 } from '../util/types';
 import {parseDate} from '../util/number';
 import {isDataItemOption} from '../util/model';
@@ -504,7 +504,6 @@ class List {
     }
 
     private _initDataFromProvider(start: number, end: number): void {
-        // Optimize.
         if (start >= end) {
             return;
         }
@@ -1559,7 +1558,11 @@ class List {
     // FIXME Model proxy ?
     getItemModel(idx: number): Model {
         var hostModel = this.hostModel;
-        return new Model(this.getRawDataItem(idx), hostModel, hostModel && hostModel.ecModel);
+        var dataItem = this.getRawDataItem(idx) as ModelOption;
+        if (this._rawData.pure || !isDataItemOption(dataItem)) {
+            dataItem = { value: dataItem };
+        }
+        return new Model(dataItem, hostModel, hostModel && hostModel.ecModel);
     }
 
     /**
diff --git a/src/echarts.ts b/src/echarts.ts
index 57dbdc2..4850a97 100644
--- a/src/echarts.ts
+++ b/src/echarts.ts
@@ -54,8 +54,8 @@ import {ECEventProcessor} from './util/ECEventProcessor';
 import {
     Payload, PayloadItem, ECElement, RendererType, ECEvent,
     ActionHandler, ActionInfo, OptionPreprocessor, PostUpdater,
-    LoadingEffect, LoadingEffectCreator, StageHandler,
-    StageHandlerOverallReset, VisualType, StageHandlerInput,
+    LoadingEffect, LoadingEffectCreator, StageHandlerInternal,
+    StageHandlerOverallReset, VisualType, StageHandler,
     ViewRootGroup, DimensionDefinitionLoose, ECEventData, ThemeOption,
     ECOption,
     ECUnitOption,
@@ -268,7 +268,7 @@ class ECharts {
         var api = this._api = createExtensionAPI(this);
 
         // Sort on demand
-        function prioritySortFunc(a: StageHandler, b: StageHandler): number {
+        function prioritySortFunc(a: StageHandlerInternal, b: StageHandlerInternal): number {
             return a.__prio - b.__prio;
         }
         timsort(visualFuncs, prioritySortFunc);
@@ -1873,13 +1873,13 @@ var actions: {
  */
 var eventActionMap: {[eventType: string]: string} = {};
 
-var dataProcessorFuncs: StageHandler[] = [];
+var dataProcessorFuncs: StageHandlerInternal[] = [];
 
 var optionPreprocessorFuncs: OptionPreprocessor[] = [];
 
 var postUpdateFuncs: PostUpdater[] = [];
 
-var visualFuncs: StageHandler[] = [];
+var visualFuncs: StageHandlerInternal[] = [];
 
 var themeStorage: {[themeName: string]: ThemeOption} = {};
 
@@ -2049,8 +2049,8 @@ export function registerPreprocessor(preprocessorFunc: OptionPreprocessor): void
 }
 
 export function registerProcessor(
-    priority: number | StageHandlerInput | StageHandlerOverallReset,
-    processor?: StageHandlerInput | StageHandlerOverallReset
+    priority: number | StageHandler | StageHandlerOverallReset,
+    processor?: StageHandler | StageHandlerOverallReset
 ): void {
     normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_FILTER);
 }
@@ -2138,29 +2138,35 @@ export function getCoordinateSystemDimensions(type: string): DimensionDefinition
  * Most visual encoding like color are common for different chart
  * But each chart has it's own layout algorithm
  */
-export function registerLayout(
-    priority: number | StageHandlerInput | StageHandlerOverallReset,
-    layoutTask?: StageHandlerInput | StageHandlerOverallReset
+function registerLayout(priority: number, layoutTask: StageHandler | StageHandlerOverallReset): void
+function registerLayout(layoutTask: StageHandler | StageHandlerOverallReset): void
+function registerLayout(
+    priority: number | StageHandler | StageHandlerOverallReset,
+    layoutTask?: StageHandler | StageHandlerOverallReset
 ): void {
     normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout');
 }
 
-export function registerVisual(
-    priority: number | StageHandlerInput | StageHandlerOverallReset,
-    visualTask?: StageHandlerInput | StageHandlerOverallReset
+function registerVisual(priority: number, layoutTask: StageHandler | StageHandlerOverallReset): void
+function registerVisual(layoutTask: StageHandler | StageHandlerOverallReset): void
+function registerVisual(
+    priority: number | StageHandler | StageHandlerOverallReset,
+    visualTask?: StageHandler | StageHandlerOverallReset
 ): void {
     normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual');
 }
 
+export {registerLayout, registerVisual};
+
 function normalizeRegister(
-    targetList: StageHandlerInput[],
-    priority: number | StageHandlerInput | StageHandlerOverallReset,
-    fn: StageHandlerInput | StageHandlerOverallReset,
+    targetList: StageHandler[],
+    priority: number | StageHandler | StageHandlerOverallReset,
+    fn: StageHandler | StageHandlerOverallReset,
     defaultPriority: number,
     visualType?: VisualType
 ): void {
     if (isFunction(priority) || isObject(priority)) {
-        fn = priority as (StageHandlerInput | StageHandlerOverallReset);
+        fn = priority as (StageHandler | StageHandlerOverallReset);
         priority = defaultPriority;
     }
 
@@ -2170,7 +2176,7 @@ function normalizeRegister(
         }
         // Check duplicate
         each(targetList, function (wrap) {
-            assert((wrap as StageHandler).__raw !== fn);
+            assert((wrap as StageHandlerInternal).__raw !== fn);
         });
     }
 
diff --git a/src/model/Global.ts b/src/model/Global.ts
index c127fa9..0ae4292 100644
--- a/src/model/Global.ts
+++ b/src/model/Global.ts
@@ -51,8 +51,7 @@ import {
     ThemeOption,
     ComponentOption,
     ComponentMainType,
-    ComponentSubType,
-    ColorPaletteOptionMixin
+    ComponentSubType
 } from '../util/types';
 import OptionManager from './OptionManager';
 import Scheduler from '../stream/Scheduler';
diff --git a/src/model/Model.ts b/src/model/Model.ts
index b3f73af..e9f3351 100644
--- a/src/model/Model.ts
+++ b/src/model/Model.ts
@@ -36,20 +36,12 @@ import textStyleMixin from './mixin/textStyle';
 import {LineStyleMixin} from './mixin/lineStyle';
 import {ItemStyleMixin} from './mixin/itemStyle';
 import GlobalModel from './Global';
-import { ModelOption, ECUnitOption } from '../util/types';
+import { ModelOption } from '../util/types';
 import { Dictionary } from 'zrender/src/core/types';
 
 var mixin = zrUtil.mixin;
 var inner = makeInner();
 
-// Since model.option can be not only `Dictionary` but also primary types,
-// we do this conditional type to avoid getting type 'never';
-type Key<Opt> = Opt extends ECUnitOption
-    ? keyof Opt : string;
-type Value<Opt, R> = Opt extends ECUnitOption
-    ? (R extends keyof Opt ? Opt[R] : ModelOption)
-    : ModelOption;
-
 /**
  * @alias module:echarts/model/Model
  * @constructor
@@ -121,7 +113,7 @@ class Model<Opt extends ModelOption = ModelOption> {
         path: [R, S, T], ignoreParent?: boolean
     ): Opt[R][S][T];
     // `path` can be 'xxx.yyy.zzz', so the return value type have to be `ModelOption`
-    // TODO: Type strict key check?
+    // TODO: TYPE strict key check?
     // get(path: string | string[], ignoreParent?: boolean): ModelOption;
     get(path: string | string[], ignoreParent?: boolean): ModelOption {
         if (path == null) {
@@ -140,11 +132,12 @@ class Model<Opt extends ModelOption = ModelOption> {
     ): Opt[R] {
         var option = this.option;
 
-        var val = option == null ? option : option[key];
-        var parentModel = !ignoreParent && getParent(this, key as string);
-        if (val == null && parentModel) {
-            // FIXME:TS do not know how to make it works
-            val = parentModel.getShallow(key);
+        var val: Opt[R] = option == null ? null : option[key];
+        if (val == null) {
+            var parentModel = !ignoreParent && getParent(this, key as string);
+            if (parentModel) {
+                val = (parentModel as Model<Opt>).getShallow(key);
+            }
         }
         return val;
     }
@@ -236,7 +229,7 @@ function doGet(obj: ModelOption, pathArr: string[], parentModel?: Model<Dictiona
             continue;
         }
         // obj could be number/string/... (like 0)
-        obj = (obj && typeof obj === 'object') ? obj[pathArr[i] as keyof ModelOption] : null;
+        obj = obj[pathArr[i]];
         if (obj == null) {
             break;
         }
diff --git a/src/util/graphic.ts b/src/util/graphic.ts
index 63174dc..7e18431 100644
--- a/src/util/graphic.ts
+++ b/src/util/graphic.ts
@@ -50,7 +50,7 @@ import { PatternObject } from 'zrender/src/graphic/Pattern';
 import { GradientObject } from 'zrender/src/graphic/Gradient';
 import Element, { ElementEvent } from 'zrender/src/Element';
 import Model from '../model/Model';
-import { AnimationOptionMixin, LabelOption, AnimationDelayCallbackParam } from './types';
+import { AnimationOptionMixin, LabelOption, AnimationDelayCallbackParam, DisplayState } from './types';
 import GlobalModel from '../model/Global';
 
 
@@ -77,9 +77,6 @@ const _highlightKeyMap: Dictionary<number> = {};
 
 const _customShapeMap: Dictionary<{ new(): Path }> = {};
 
-
-type AvailableStates = typeof EMPHASIS | typeof NORMAL;
-
 type ExtendShapeOpt = Parameters<typeof Path.extend>[0];
 type ExtendShapeReturn = ReturnType<typeof Path.extend>;
 
@@ -94,7 +91,7 @@ type ExtendedProps = {
     __highByOuter: number
 
     __highDownSilentOnTouch: boolean
-    __highDownOnUpdate: (fromState: AvailableStates, toState: AvailableStates) => void
+    __highDownOnUpdate: (fromState: DisplayState, toState: DisplayState) => void
 
     __highDownDispatcher: boolean
 
@@ -514,8 +511,8 @@ function traverseUpdate<T>(
     commonParam?: T
 ) {
     // If root is group, also enter updater for `highDownOnUpdate`.
-    var fromState: AvailableStates = NORMAL;
-    var toState: AvailableStates = NORMAL;
+    var fromState: DisplayState = NORMAL;
+    var toState: DisplayState = NORMAL;
     var trigger;
     // See the rule of `highDownOnUpdate` on `graphic.setAsHighDownDispatcher`.
     el.__highlighted && (fromState = EMPHASIS, trigger = true);
@@ -731,7 +728,7 @@ export function setLabelStyle(
             getFormattedLabel?: (
                 labelDataIndex: number,
                 state:
-                AvailableStates,
+                DisplayState,
                 dataType: string,
                 labelDimIndex: number
             ) => string
diff --git a/src/util/types.ts b/src/util/types.ts
index 26e983b..dc2fcc6 100644
--- a/src/util/types.ts
+++ b/src/util/types.ts
@@ -161,27 +161,28 @@ export interface PostUpdater {
 
 export type VisualType = 'layout' | 'visual';
 
-export interface StageHandlerInput {
+export interface StageHandlerOverallReset {
+    (ecModel: GlobalModel, api: ExtensionAPI, payload?: Payload): void
+}
+export interface StageHandler {
     seriesType?: string;
     createOnAllSeries?: boolean;
     performRawSeries?: boolean;
     plan?: StageHandlerPlan;
     overallReset?: StageHandlerOverallReset;
     reset?: StageHandlerReset;
+    getTargetSeries?: (ecModel: GlobalModel, api: ExtensionAPI) => HashMap<SeriesModel>;
 }
-export interface StageHandler extends StageHandlerInput {
+
+export interface StageHandlerInternal extends StageHandler {
     uid: string;
     visualType?: VisualType;
     // modifyOutputEnd?: boolean;
-    getTargetSeries: (ecModel: GlobalModel, api: ExtensionAPI) => HashMap<SeriesModel>;
     __prio: number;
-    __raw: StageHandlerInput | StageHandlerOverallReset;
+    __raw: StageHandler | StageHandlerOverallReset;
     isVisual?: boolean; // PENDING: not used
     isLayout?: boolean; // PENDING: not used
 }
-export interface StageHandlerOverallReset {
-    (ecModel: GlobalModel, api: ExtensionAPI, payload?: Payload): void
-}
 export type StageHandlerProgressParams = TaskProgressParams;
 export interface StageHandlerProgressExecutor {
     dataEach?: (data: List, idx: number) => void;
@@ -379,7 +380,7 @@ export type OptionDataItem =
 export type OptionDataPrimitive = string | number | Date;
 
 // export type ModelOption = Dictionary<any> | any[] | string | number | boolean | ((...args: any) => any);
-export type ModelOption = any;
+export type ModelOption = Dictionary<any>;
 export type ThemeOption = Dictionary<any>;
 
 export type DisplayState = 'normal' | 'emphasis';


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org