From d9728567cb6ca61bd880741a6fb4f2e1578b00c7 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Sat, 14 Aug 2021 23:25:29 +0800 Subject: [PATCH 01/16] Feat: new selectedMode and selectable for item --- src/model/Series.ts | 32 +++++++++++++++++++++++++++++++- src/util/types.ts | 3 ++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index cf49226a2f..4f835f7636 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -500,7 +500,18 @@ class SeriesModel extends ComponentMode if (!selectedMap) { return; } + const selectedMode = this.option.selectedMode; + const data = this.getData(dataType); + if (selectedMode === 'series') { + data.each(idx => { + const nameOrId = getSelectionKey(data, idx); + selectedMap[nameOrId] = false; + this._selectedDataIndicesMap[nameOrId] = -1; + }); + return; + } + for (let i = 0; i < innerDataIndices.length; i++) { const dataIndex = innerDataIndices[i]; const nameOrId = getSelectionKey(data, dataIndex); @@ -570,10 +581,26 @@ class SeriesModel extends ComponentMode return; } - if (selectedMode === 'multiple') { + if (selectedMode === 'series') { + const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); + const self = this; + data.each(idx => { + if ((data.getItemModel(idx) as Model).get(['itemStyle', 'selectable']) === false) { + return; + } + const nameOrId = getSelectionKey(data, idx); + selectedMap[nameOrId] = true; + self._selectedDataIndicesMap[nameOrId] = data.getRawIndex(idx); + + }); + } + else if (selectedMode === 'multiple') { const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; + if ((data.getItemModel(dataIndex) as Model).get(['itemStyle', 'selectable']) === false) { + return; + } // TODO diffrent types of data share same object. const nameOrId = getSelectionKey(data, dataIndex); selectedMap[nameOrId] = true; @@ -582,6 +609,9 @@ class SeriesModel extends ComponentMode } else if (selectedMode === 'single' || selectedMode === true) { const lastDataIndex = innerDataIndices[len - 1]; + if ((data.getItemModel(lastDataIndex) as Model).get(['itemStyle', 'selectable']) === false) { + return; + } const nameOrId = getSelectionKey(data, lastDataIndex); this.option.selectedMap = { [nameOrId]: true diff --git a/src/util/types.ts b/src/util/types.ts index 82a691fee0..077ecad4cc 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -967,6 +967,7 @@ export interface ItemStyleOption extends ShadowOptionMixin, BorderOptionMixin { color?: ZRColor opacity?: number decal?: DecalObject | 'none' + selectable?: boolean } /** @@ -1654,7 +1655,7 @@ export interface SeriesOption< * key is name or index of data. */ selectedMap?: Dictionary - selectedMode?: 'single' | 'multiple' | boolean + selectedMode?: 'single' | 'multiple' | 'series' | boolean } export interface SeriesOnCartesianOptionMixin { From e5e210710c188e61e397d0ce2c4df97719ab57f5 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Sun, 15 Aug 2021 00:24:23 +0800 Subject: [PATCH 02/16] test(select): add test case for select --- test/bar2.html | 79 ++++++++++++++++++++++++++++++++++++++++++++++- test/geo-map.html | 12 +++---- 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/test/bar2.html b/test/bar2.html index a0f0e6c59d..5fa148a43c 100644 --- a/test/bar2.html +++ b/test/bar2.html @@ -52,6 +52,7 @@

Narrow grid

+
+ + \ No newline at end of file diff --git a/test/geo-map.html b/test/geo-map.html index 56f43a1f02..ff14429fff 100644 --- a/test/geo-map.html +++ b/test/geo-map.html @@ -542,7 +542,7 @@ }] }, data:[ - {name: '北京',value: Math.round(Math.random()*1000)}, + {name: '北京',value: Math.round(Math.random()*1000), itemStyle: {selectable: false}}, {name: '天津',value: Math.round(Math.random()*1000)}, {name: '上海',value: Math.round(Math.random()*1000)}, {name: '重庆',value: Math.round(Math.random()*1000)}, @@ -550,7 +550,7 @@ {name: '河南',value: Math.round(Math.random()*1000)}, {name: '云南',value: Math.round(Math.random()*1000)}, {name: '辽宁',value: Math.round(Math.random()*1000)}, - {name: '黑龙江',value: Math.round(Math.random()*1000)}, + {name: '黑龙江',value: Math.round(Math.random()*1000), itemStyle: {selectable: false}}, {name: '湖南',value: Math.round(Math.random()*1000)}, {name: '安徽',value: Math.round(Math.random()*1000)}, {name: '山东',value: Math.round(Math.random()*1000)}, @@ -562,7 +562,7 @@ {name: '广西',value: Math.round(Math.random()*1000)}, {name: '甘肃',value: Math.round(Math.random()*1000)}, {name: '山西',value: Math.round(Math.random()*1000)}, - {name: '内蒙古',value: Math.round(Math.random()*1000)}, + {name: '内蒙古',value: Math.round(Math.random()*1000), itemStyle: {selectable: false}}, {name: '陕西',value: Math.round(Math.random()*1000)}, {name: '吉林',value: Math.round(Math.random()*1000)}, {name: '福建',value: Math.round(Math.random()*1000)}, @@ -621,9 +621,9 @@ ] }); - chart.on('click', function (param) { - alert('asdf'); - }); + // chart.on('click', function (param) { + // alert('asdf'); + // }); // setTimeout(function () { // chart.setOption({ // series: [{ From 5c790208d8094888656868d82d93571ee8d5b0b9 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Wed, 5 Jan 2022 22:41:26 +0800 Subject: [PATCH 03/16] chore: move `selectable` out of `itemStyle` --- src/model/Series.ts | 6 +++--- src/util/types.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index 12ab1c3392..535b13bb0d 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -603,7 +603,7 @@ class SeriesModel extends ComponentMode const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); const self = this; data.each(idx => { - if ((data.getItemModel(idx) as Model).get(['itemStyle', 'selectable']) === false) { + if ((data.getItemModel(idx) as Model).get('selectable') === false) { return; } const nameOrId = getSelectionKey(data, idx); @@ -616,7 +616,7 @@ class SeriesModel extends ComponentMode const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; - if ((data.getItemModel(dataIndex) as Model).get(['itemStyle', 'selectable']) === false) { + if ((data.getItemModel(dataIndex) as Model).get('selectable') === false) { return; } // TODO diffrent types of data share same object. @@ -627,7 +627,7 @@ class SeriesModel extends ComponentMode } else if (selectedMode === 'single' || selectedMode === true) { const lastDataIndex = innerDataIndices[len - 1]; - if ((data.getItemModel(lastDataIndex) as Model).get(['itemStyle', 'selectable']) === false) { + if ((data.getItemModel(lastDataIndex) as Model).get('selectable') === false) { return; } const nameOrId = getSelectionKey(data, lastDataIndex); diff --git a/src/util/types.ts b/src/util/types.ts index 1f9e512bcd..a5c51ed5ac 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -618,6 +618,7 @@ export type OptionDataItemObject = { groupId?: OptionId; value?: T[] | T; selected?: boolean; + selectable?: boolean; }; // Compat number because it is usually used and not easy to // restrict it in practise. @@ -919,7 +920,6 @@ export interface ItemStyleOption extends ShadowOptionMixin, B color?: ZRColor | (TCbParams extends never ? never : ((params: TCbParams) => ZRColor)) opacity?: number decal?: DecalObject | 'none' - selectable?: boolean } /** From c0f28cc621c0e6a9c403f03a83f43c5ed1628e32 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Wed, 5 Jan 2022 22:44:10 +0800 Subject: [PATCH 04/16] chore: update test --- test/bar2.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/bar2.html b/test/bar2.html index 5fa148a43c..87cae1b0f9 100644 --- a/test/bar2.html +++ b/test/bar2.html @@ -583,9 +583,7 @@

Narrow grid

{ data: [130, { value: 120, - itemStyle: { - selectable: false - } + selectable: false }, 160, 180, 170, 210, 230], type: 'bar', showBackground: true, From 5327e3fcad9b00483bf314696dc52e7c97c167ad Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Thu, 6 Jan 2022 22:00:53 +0800 Subject: [PATCH 05/16] chore: `select` state add `disable` --- src/model/Series.ts | 6 +++--- src/util/types.ts | 5 +++-- test/bar2.html | 4 +++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index 535b13bb0d..bb9b3f5515 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -603,7 +603,7 @@ class SeriesModel extends ComponentMode const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); const self = this; data.each(idx => { - if ((data.getItemModel(idx) as Model).get('selectable') === false) { + if ((data.getItemModel(idx) as Model).get(['select', 'disable']) === true) { return; } const nameOrId = getSelectionKey(data, idx); @@ -616,7 +616,7 @@ class SeriesModel extends ComponentMode const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; - if ((data.getItemModel(dataIndex) as Model).get('selectable') === false) { + if ((data.getItemModel(dataIndex) as Model).get(['select', 'disable']) === true) { return; } // TODO diffrent types of data share same object. @@ -627,7 +627,7 @@ class SeriesModel extends ComponentMode } else if (selectedMode === 'single' || selectedMode === true) { const lastDataIndex = innerDataIndices[len - 1]; - if ((data.getItemModel(lastDataIndex) as Model).get('selectable') === false) { + if ((data.getItemModel(lastDataIndex) as Model).get(['select', 'disable']) === true) { return; } const nameOrId = getSelectionKey(data, lastDataIndex); diff --git a/src/util/types.ts b/src/util/types.ts index a5c51ed5ac..525abb955b 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -618,7 +618,6 @@ export type OptionDataItemObject = { groupId?: OptionId; value?: T[] | T; selected?: boolean; - selectable?: boolean; }; // Compat number because it is usually used and not easy to // restrict it in practise. @@ -1501,7 +1500,9 @@ export interface StatesOptionMixin< /** * Select states */ - select?: StateOption & StatesMixin['select'] + select?: StateOption & StatesMixin['select'] & { + disable?: boolean + } /** * Blur states. */ diff --git a/test/bar2.html b/test/bar2.html index 87cae1b0f9..6d1ae1e8eb 100644 --- a/test/bar2.html +++ b/test/bar2.html @@ -583,7 +583,9 @@

Narrow grid

{ data: [130, { value: 120, - selectable: false + select: { + disable: true + } }, 160, 180, 170, 210, 230], type: 'bar', showBackground: true, From ed947990e845445b617dd95fd65942235f53d233 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Thu, 6 Jan 2022 23:12:28 +0800 Subject: [PATCH 06/16] chore: rename `disable` to `disabled` --- src/model/Series.ts | 6 +++--- src/util/types.ts | 2 +- test/bar2.html | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index bb9b3f5515..d622931570 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -603,7 +603,7 @@ class SeriesModel extends ComponentMode const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); const self = this; data.each(idx => { - if ((data.getItemModel(idx) as Model).get(['select', 'disable']) === true) { + if ((data.getItemModel(idx) as Model).get(['select', 'disabled']) === true) { return; } const nameOrId = getSelectionKey(data, idx); @@ -616,7 +616,7 @@ class SeriesModel extends ComponentMode const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; - if ((data.getItemModel(dataIndex) as Model).get(['select', 'disable']) === true) { + if ((data.getItemModel(dataIndex) as Model).get(['select', 'disabled']) === true) { return; } // TODO diffrent types of data share same object. @@ -627,7 +627,7 @@ class SeriesModel extends ComponentMode } else if (selectedMode === 'single' || selectedMode === true) { const lastDataIndex = innerDataIndices[len - 1]; - if ((data.getItemModel(lastDataIndex) as Model).get(['select', 'disable']) === true) { + if ((data.getItemModel(lastDataIndex) as Model).get(['select', 'disabled']) === true) { return; } const nameOrId = getSelectionKey(data, lastDataIndex); diff --git a/src/util/types.ts b/src/util/types.ts index 525abb955b..26236735f7 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -1501,7 +1501,7 @@ export interface StatesOptionMixin< * Select states */ select?: StateOption & StatesMixin['select'] & { - disable?: boolean + disabled?: boolean } /** * Blur states. diff --git a/test/bar2.html b/test/bar2.html index 6d1ae1e8eb..02c5456d1b 100644 --- a/test/bar2.html +++ b/test/bar2.html @@ -584,7 +584,7 @@

Narrow grid

data: [130, { value: 120, select: { - disable: true + disabled: true } }, 160, 180, 170, 210, 230], type: 'bar', From 76518838ed8d6942708c4fe8e61dca117c046dde Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Fri, 7 Jan 2022 21:31:36 +0800 Subject: [PATCH 07/16] chore: optimize when unselect whole series --- src/model/Series.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index d622931570..a1fccb4dba 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -523,11 +523,8 @@ class SeriesModel extends ComponentMode const data = this.getData(dataType); if (selectedMode === 'series') { - data.each(idx => { - const nameOrId = getSelectionKey(data, idx); - selectedMap[nameOrId] = false; - this._selectedDataIndicesMap[nameOrId] = -1; - }); + this.option.selectedMap = {}; + this._selectedDataIndicesMap = {}; return; } From 7548d8551875cc8b0d924c51721c2e34a004d9ff Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Fri, 7 Jan 2022 22:59:29 +0800 Subject: [PATCH 08/16] chore: use `isSelectSeries` to optimize --- src/model/Series.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index a1fccb4dba..553e19e79b 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -178,7 +178,7 @@ class SeriesModel extends ComponentMode // Props about data selection // --------------------------------------- private _selectedDataIndicesMap: Dictionary = {}; - + private isSelectSeries: boolean; readonly preventUsingHoverLayer: boolean; static protoInitialize = (function () { @@ -566,6 +566,14 @@ class SeriesModel extends ComponentMode } const data = this.getData(dataType); + if ((data.getItemModel(dataIndex) as Model).get(['select', 'disabled']) === true) { + return false; + } + + if (this.isSelectSeries) { + return true; + } + const nameOrId = getSelectionKey(data, dataIndex); return selectedMap[nameOrId] || false; } @@ -597,19 +605,10 @@ class SeriesModel extends ComponentMode } if (selectedMode === 'series') { - const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); - const self = this; - data.each(idx => { - if ((data.getItemModel(idx) as Model).get(['select', 'disabled']) === true) { - return; - } - const nameOrId = getSelectionKey(data, idx); - selectedMap[nameOrId] = true; - self._selectedDataIndicesMap[nameOrId] = data.getRawIndex(idx); - - }); + this.isSelectSeries = true; } else if (selectedMode === 'multiple') { + this.isSelectSeries = false; const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; @@ -623,6 +622,7 @@ class SeriesModel extends ComponentMode } } else if (selectedMode === 'single' || selectedMode === true) { + this.isSelectSeries = false; const lastDataIndex = innerDataIndices[len - 1]; if ((data.getItemModel(lastDataIndex) as Model).get(['select', 'disabled']) === true) { return; From b1ee21f0e23612c37c4e5bd125f0bf643e53f054 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Sat, 8 Jan 2022 19:54:09 +0800 Subject: [PATCH 09/16] chore: use `selectedMap` as single source of truth --- src/model/Series.ts | 18 +++++++++++------- src/util/types.ts | 2 +- test/bar2.html | 19 ++++++++++++++++++- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index 553e19e79b..2f895f5815 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -56,6 +56,7 @@ import { defaultSeriesFormatTooltip } from '../component/tooltip/seriesFormatToo import {ECSymbol} from '../util/symbol'; import {Group} from '../util/graphic'; import {LegendIconParams} from '../component/legend/LegendModel'; +import { isString } from 'zrender/src/core/util'; const inner = modelUtil.makeInner<{ data: SeriesData @@ -178,7 +179,6 @@ class SeriesModel extends ComponentMode // Props about data selection // --------------------------------------- private _selectedDataIndicesMap: Dictionary = {}; - private isSelectSeries: boolean; readonly preventUsingHoverLayer: boolean; static protoInitialize = (function () { @@ -515,7 +515,7 @@ class SeriesModel extends ComponentMode } unselect(innerDataIndices: number[], dataType?: SeriesDataType): void { - const selectedMap = this.option.selectedMap; + const selectedMap = this.option.selectedMap as Dictionary; if (!selectedMap) { return; } @@ -570,7 +570,7 @@ class SeriesModel extends ComponentMode return false; } - if (this.isSelectSeries) { + if (selectedMap === 'all') { return true; } @@ -605,11 +605,13 @@ class SeriesModel extends ComponentMode } if (selectedMode === 'series') { - this.isSelectSeries = true; + this.option.selectedMap = 'all'; } else if (selectedMode === 'multiple') { - this.isSelectSeries = false; - const selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); + if (isString(this.option.selectedMap)) { + this.option.selectedMap = {}; + } + const selectedMap = (this.option.selectedMap || (this.option.selectedMap = {})); for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; if ((data.getItemModel(dataIndex) as Model).get(['select', 'disabled']) === true) { @@ -622,7 +624,9 @@ class SeriesModel extends ComponentMode } } else if (selectedMode === 'single' || selectedMode === true) { - this.isSelectSeries = false; + if (isString(this.option.selectedMap)) { + this.option.selectedMap = {}; + } const lastDataIndex = innerDataIndices[len - 1]; if ((data.getItemModel(lastDataIndex) as Model).get(['select', 'disabled']) === true) { return; diff --git a/src/util/types.ts b/src/util/types.ts index 26236735f7..3f374bdadc 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -1611,7 +1611,7 @@ export interface SeriesOption< * Map of selected data * key is name or index of data. */ - selectedMap?: Dictionary + selectedMap?: Dictionary | 'all' selectedMode?: 'single' | 'multiple' | 'series' | boolean } diff --git a/test/bar2.html b/test/bar2.html index 02c5456d1b..b22e43c9bb 100644 --- a/test/bar2.html +++ b/test/bar2.html @@ -575,7 +575,24 @@

Narrow grid

color: 'red' } }, - selectedMode: 'series', + selectedMode: 'single', + stack: 'all', + emphasis: {focus: 'series', blurScope: 'coordinateSystem'} + + }, + { + data: [120, 200, 150, 80, 70, 110, 130], + type: 'bar', + showBackground: true, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)' + }, + select: { + itemStyle: { + color: 'yellow' + } + }, + selectedMode: 'multiple', stack: 'all', emphasis: {focus: 'series', blurScope: 'coordinateSystem'} From 57e1451e46df847c72067f47f4e98374e2cfc0d2 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Sat, 8 Jan 2022 20:22:47 +0800 Subject: [PATCH 10/16] chore: ts error --- src/legacy/dataSelectAction.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/legacy/dataSelectAction.ts b/src/legacy/dataSelectAction.ts index e1a68c6afd..4eac10f079 100644 --- a/src/legacy/dataSelectAction.ts +++ b/src/legacy/dataSelectAction.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Payload, SelectChangedPayload } from '../util/types'; +import { Dictionary, Payload, SelectChangedPayload } from '../util/types'; import SeriesModel from '../model/Series'; import { extend, each, isArray } from 'zrender/src/core/util'; import GlobalModel from '../model/Global'; @@ -86,7 +86,7 @@ function handleSeriesLegacySelectEvents( type: legacyEventName, seriesId: seriesModel.id, name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), - selected: extend({}, seriesModel.option.selectedMap) + selected: extend({}, seriesModel.option as Dictionary) }); } } From a515e9464a9fe8d8b0f1649c1d19900af644ab56 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Sun, 9 Jan 2022 00:17:30 +0800 Subject: [PATCH 11/16] chore: enhance code --- src/legacy/dataSelectAction.ts | 5 +- src/model/Series.ts | 26 +++--- test/bar2.html | 141 +++++++++++++++++++++------------ test/geo-map.html | 6 +- test/pie.html | 2 +- 5 files changed, 112 insertions(+), 68 deletions(-) diff --git a/src/legacy/dataSelectAction.ts b/src/legacy/dataSelectAction.ts index 4eac10f079..9a543ceb51 100644 --- a/src/legacy/dataSelectAction.ts +++ b/src/legacy/dataSelectAction.ts @@ -19,7 +19,7 @@ import { Dictionary, Payload, SelectChangedPayload } from '../util/types'; import SeriesModel from '../model/Series'; -import { extend, each, isArray } from 'zrender/src/core/util'; +import { extend, each, isArray, isString } from 'zrender/src/core/util'; import GlobalModel from '../model/Global'; import { deprecateReplaceLog, deprecateLog } from '../util/log'; import Eventful from 'zrender/src/core/Eventful'; @@ -77,6 +77,7 @@ function handleSeriesLegacySelectEvents( mainType: 'series', subType: 'pie' }, function (seriesModel: SeriesModel) { const seriesIndex = seriesModel.seriesIndex; + const selectedMap = seriesModel.option.selectedMap; const selected = payload.selected; for (let i = 0; i < selected.length; i++) { if (selected[i].seriesIndex === seriesIndex) { @@ -86,7 +87,7 @@ function handleSeriesLegacySelectEvents( type: legacyEventName, seriesId: seriesModel.id, name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), - selected: extend({}, seriesModel.option as Dictionary) + selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap) }); } } diff --git a/src/model/Series.ts b/src/model/Series.ts index 2f895f5815..54ae303dd5 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -56,7 +56,7 @@ import { defaultSeriesFormatTooltip } from '../component/tooltip/seriesFormatToo import {ECSymbol} from '../util/symbol'; import {Group} from '../util/graphic'; import {LegendIconParams} from '../component/legend/LegendModel'; -import { isString } from 'zrender/src/core/util'; +import { isObject, isString } from 'zrender/src/core/util'; const inner = modelUtil.makeInner<{ data: SeriesData @@ -515,14 +515,14 @@ class SeriesModel extends ComponentMode } unselect(innerDataIndices: number[], dataType?: SeriesDataType): void { - const selectedMap = this.option.selectedMap as Dictionary; + const selectedMap = this.option.selectedMap; if (!selectedMap) { return; } const selectedMode = this.option.selectedMode; const data = this.getData(dataType); - if (selectedMode === 'series') { + if (selectedMode === 'series' || selectedMap === 'all') { this.option.selectedMap = {}; this._selectedDataIndicesMap = {}; return; @@ -547,6 +547,9 @@ class SeriesModel extends ComponentMode } getSelectedDataIndices(): number[] { + if (this.option.selectedMap === 'all') { + return [].slice.call(this.getData().getIndices()); + } const selectedDataIndicesMap = this._selectedDataIndicesMap; const nameOrIds = zrUtil.keys(selectedDataIndicesMap); const dataIndices = []; @@ -598,20 +601,21 @@ class SeriesModel extends ComponentMode } private _innerSelect(data: SeriesData, innerDataIndices: number[]) { - const selectedMode = this.option.selectedMode; + const option = this.option; + const selectedMode = option.selectedMode; const len = innerDataIndices.length; if (!selectedMode || !len) { return; } if (selectedMode === 'series') { - this.option.selectedMap = 'all'; + option.selectedMap = 'all'; } else if (selectedMode === 'multiple') { - if (isString(this.option.selectedMap)) { - this.option.selectedMap = {}; + if (!isObject(option.selectedMap)) { + option.selectedMap = {}; } - const selectedMap = (this.option.selectedMap || (this.option.selectedMap = {})); + const selectedMap = option.selectedMap; for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; if ((data.getItemModel(dataIndex) as Model).get(['select', 'disabled']) === true) { @@ -624,15 +628,15 @@ class SeriesModel extends ComponentMode } } else if (selectedMode === 'single' || selectedMode === true) { - if (isString(this.option.selectedMap)) { - this.option.selectedMap = {}; + if (isString(option.selectedMap)) { + option.selectedMap = {}; } const lastDataIndex = innerDataIndices[len - 1]; if ((data.getItemModel(lastDataIndex) as Model).get(['select', 'disabled']) === true) { return; } const nameOrId = getSelectionKey(data, lastDataIndex); - this.option.selectedMap = { + option.selectedMap = { [nameOrId]: true }; this._selectedDataIndicesMap = { diff --git a/test/bar2.html b/test/bar2.html index b22e43c9bb..c798bda76e 100644 --- a/test/bar2.html +++ b/test/bar2.html @@ -564,62 +564,63 @@

Narrow grid

}, series: [ { - data: [120, 200, 150, 80, 70, 110, 130], - type: 'bar', - showBackground: true, - backgroundStyle: { - color: 'rgba(180, 180, 180, 0.2)' - }, - select: { - itemStyle: { - color: 'red' - } - }, - selectedMode: 'single', - stack: 'all', - emphasis: {focus: 'series', blurScope: 'coordinateSystem'} + data: [120, 200, 150, 80, 70, 110, 130], + type: 'bar', + showBackground: true, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)' + }, + select: { + itemStyle: { + color: 'red' + } + }, + selectedMode: 'single', + stack: 'all', + emphasis: {focus: 'series', blurScope: 'coordinateSystem'} - }, - { - data: [120, 200, 150, 80, 70, 110, 130], - type: 'bar', - showBackground: true, - backgroundStyle: { - color: 'rgba(180, 180, 180, 0.2)' }, - select: { - itemStyle: { - color: 'yellow' - } - }, - selectedMode: 'multiple', - stack: 'all', - emphasis: {focus: 'series', blurScope: 'coordinateSystem'} - - }, - { - data: [130, { - value: 120, + { + data: [120, 200, 150, 80, 70, 110, 130], + type: 'bar', + showBackground: true, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)' + }, select: { - disabled: true - } - }, 160, 180, 170, 210, 230], - type: 'bar', - showBackground: true, - backgroundStyle: { - color: 'rgba(180, 180, 180, 0.2)' - }, - stack: 'all', - select: { - itemStyle: { - color: 'green' - } + itemStyle: { + color: 'yellow' + } + }, + selectedMode: 'single', + stack: 'all', + emphasis: {focus: 'series', blurScope: 'coordinateSystem'} + }, - emphasis: {focus: 'series', blurScope: 'coordinateSystem'}, + { + data: [130, { + value: 120, + select: { + disabled: true + } + }, 160, 180, 170, 210, 230], + type: 'bar', + showBackground: true, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)' + }, + stack: 'all', + select: { + itemStyle: { + color: 'green' + } + }, + emphasis: {focus: 'series', blurScope: 'coordinateSystem'}, - selectedMode: 'series', + selectedMode: 'single', - }] + } + ] } @@ -629,7 +630,45 @@

Narrow grid

'Select in Bar Series', 'Click on bar will turn whole series into select state, expect second item in second serie whose select has been disbale' ], - option: option + option: option, + button: [ + { + text: 'Click to update selectedMode to \'single\'', + onClick: () => { + chart.setOption({ + series: [ + { selectedMode: 'single' }, + { selectedMode: 'single' }, + { selectedMode: 'single' }, + ] + }) + } + }, + { + text: 'Click to update selectedMode \'multiple\'', + onClick: () => { + chart.setOption({ + series: [ + { selectedMode: 'multiple' }, + { selectedMode: 'multiple' }, + { selectedMode: 'multiple' }, + ] + }) + } + }, + { + text: 'Click to update selectedMode \'series\'', + onClick: () => { + chart.setOption({ + series: [ + { selectedMode: 'series' }, + { selectedMode: 'series' }, + { selectedMode: 'series' }, + ] + }) + } + }, + ] }); }); diff --git a/test/geo-map.html b/test/geo-map.html index ff14429fff..dfe1fca0c4 100644 --- a/test/geo-map.html +++ b/test/geo-map.html @@ -542,7 +542,7 @@ }] }, data:[ - {name: '北京',value: Math.round(Math.random()*1000), itemStyle: {selectable: false}}, + {name: '北京',value: Math.round(Math.random()*1000), select: {disabled: true}}, {name: '天津',value: Math.round(Math.random()*1000)}, {name: '上海',value: Math.round(Math.random()*1000)}, {name: '重庆',value: Math.round(Math.random()*1000)}, @@ -550,7 +550,7 @@ {name: '河南',value: Math.round(Math.random()*1000)}, {name: '云南',value: Math.round(Math.random()*1000)}, {name: '辽宁',value: Math.round(Math.random()*1000)}, - {name: '黑龙江',value: Math.round(Math.random()*1000), itemStyle: {selectable: false}}, + {name: '黑龙江',value: Math.round(Math.random()*1000), select: {disabled: true}}, {name: '湖南',value: Math.round(Math.random()*1000)}, {name: '安徽',value: Math.round(Math.random()*1000)}, {name: '山东',value: Math.round(Math.random()*1000)}, @@ -562,7 +562,7 @@ {name: '广西',value: Math.round(Math.random()*1000)}, {name: '甘肃',value: Math.round(Math.random()*1000)}, {name: '山西',value: Math.round(Math.random()*1000)}, - {name: '内蒙古',value: Math.round(Math.random()*1000), itemStyle: {selectable: false}}, + {name: '内蒙古',value: Math.round(Math.random()*1000), select: {disabled: true}}, {name: '陕西',value: Math.round(Math.random()*1000)}, {name: '吉林',value: Math.round(Math.random()*1000)}, {name: '福建',value: Math.round(Math.random()*1000)}, diff --git a/test/pie.html b/test/pie.html index 4a0b6718c7..10ca6440af 100644 --- a/test/pie.html +++ b/test/pie.html @@ -331,7 +331,7 @@ }, series: { type: 'pie', - selectedMode: 'multiply' + selectedMode: 'multiple' } }; From 420f62b7822922ff46d900c3f8fd96008fc819d5 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Sun, 9 Jan 2022 14:27:03 +0800 Subject: [PATCH 12/16] chore: enhance code --- src/model/Series.ts | 16 ++++++++-------- test/bar2.html | 8 +++++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index 54ae303dd5..06ac81a25b 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -29,7 +29,8 @@ import { SeriesDataType, SeriesEncodeOptionMixin, OptionEncodeValue, - ColorBy + ColorBy, + StatesOptionMixin } from '../util/types'; import ComponentModel, { ComponentModelConstructor } from './Component'; import {PaletteMixin} from './mixin/palette'; @@ -56,7 +57,6 @@ import { defaultSeriesFormatTooltip } from '../component/tooltip/seriesFormatToo import {ECSymbol} from '../util/symbol'; import {Group} from '../util/graphic'; import {LegendIconParams} from '../component/legend/LegendModel'; -import { isObject, isString } from 'zrender/src/core/util'; const inner = modelUtil.makeInner<{ data: SeriesData @@ -569,7 +569,7 @@ class SeriesModel extends ComponentMode } const data = this.getData(dataType); - if ((data.getItemModel(dataIndex) as Model).get(['select', 'disabled']) === true) { + if (data.getItemModel>(dataIndex).get(['select', 'disabled'])) { return false; } @@ -612,14 +612,14 @@ class SeriesModel extends ComponentMode option.selectedMap = 'all'; } else if (selectedMode === 'multiple') { - if (!isObject(option.selectedMap)) { + if (!zrUtil.isObject(option.selectedMap)) { option.selectedMap = {}; } const selectedMap = option.selectedMap; for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; - if ((data.getItemModel(dataIndex) as Model).get(['select', 'disabled']) === true) { - return; + if (data.getItemModel>(dataIndex).get(['select', 'disabled'])) { + continue; } // TODO diffrent types of data share same object. const nameOrId = getSelectionKey(data, dataIndex); @@ -628,11 +628,11 @@ class SeriesModel extends ComponentMode } } else if (selectedMode === 'single' || selectedMode === true) { - if (isString(option.selectedMap)) { + if (zrUtil.isString(option.selectedMap)) { option.selectedMap = {}; } const lastDataIndex = innerDataIndices[len - 1]; - if ((data.getItemModel(lastDataIndex) as Model).get(['select', 'disabled']) === true) { + if (data.getItemModel>(lastDataIndex).get(['select', 'disabled'])) { return; } const nameOrId = getSelectionKey(data, lastDataIndex); diff --git a/test/bar2.html b/test/bar2.html index c798bda76e..b7f600769e 100644 --- a/test/bar2.html +++ b/test/bar2.html @@ -603,7 +603,13 @@

Narrow grid

select: { disabled: true } - }, 160, 180, 170, 210, 230], + }, 160, { + value: 120, + selected: true + }, 170, { + value: 210, + selected: true + }, 230], type: 'bar', showBackground: true, backgroundStyle: { From 20a7e135810808748592630d89ec817c86d178de Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Mon, 10 Jan 2022 22:02:35 +0800 Subject: [PATCH 13/16] chore: check `select.disabled` only in `isSelected` --- src/model/Series.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index 06ac81a25b..6d02c51c55 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -618,9 +618,6 @@ class SeriesModel extends ComponentMode const selectedMap = option.selectedMap; for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; - if (data.getItemModel>(dataIndex).get(['select', 'disabled'])) { - continue; - } // TODO diffrent types of data share same object. const nameOrId = getSelectionKey(data, dataIndex); selectedMap[nameOrId] = true; @@ -632,9 +629,6 @@ class SeriesModel extends ComponentMode option.selectedMap = {}; } const lastDataIndex = innerDataIndices[len - 1]; - if (data.getItemModel>(lastDataIndex).get(['select', 'disabled'])) { - return; - } const nameOrId = getSelectionKey(data, lastDataIndex); option.selectedMap = { [nameOrId]: true From 954cab7efacad64c27b7882a8cb444af39fc0a84 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Mon, 10 Jan 2022 23:51:07 +0800 Subject: [PATCH 14/16] chore: reduce `getItemModel` --- src/model/Series.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index 6d02c51c55..bb375364d8 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -569,16 +569,22 @@ class SeriesModel extends ComponentMode } const data = this.getData(dataType); - if (data.getItemModel>(dataIndex).get(['select', 'disabled'])) { - return false; - } - + if (selectedMap === 'all') { - return true; + return !data.getItemModel>(dataIndex).get(['select', 'disabled']); } const nameOrId = getSelectionKey(data, dataIndex); - return selectedMap[nameOrId] || false; + + if (selectedMap[nameOrId] != null) { + if (data.getItemModel>(dataIndex).get(['select', 'disabled'])) { + return !selectedMap[nameOrId]; + } + + return selectedMap[nameOrId]; + } + + return false; } isUniversalTransitionEnabled(): boolean { From b2283bd82135679d86b65c02a8773b734ee8bd34 Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Tue, 11 Jan 2022 21:54:07 +0800 Subject: [PATCH 15/16] chore: optimize code --- src/model/Series.ts | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index bb375364d8..6c9a69faa1 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -569,22 +569,9 @@ class SeriesModel extends ComponentMode } const data = this.getData(dataType); - - if (selectedMap === 'all') { - return !data.getItemModel>(dataIndex).get(['select', 'disabled']); - } - - const nameOrId = getSelectionKey(data, dataIndex); - - if (selectedMap[nameOrId] != null) { - if (data.getItemModel>(dataIndex).get(['select', 'disabled'])) { - return !selectedMap[nameOrId]; - } - - return selectedMap[nameOrId]; - } - return false; + return (selectedMap === 'all' || selectedMap[getSelectionKey(data, dataIndex)]) + && !data.getItemModel>(dataIndex).get(['select', 'disabled']) } isUniversalTransitionEnabled(): boolean { From df724c665fe76cdfca52bfd95b508cc5658e815d Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Wed, 12 Jan 2022 22:03:55 +0800 Subject: [PATCH 16/16] fix: remove useless code --- src/model/Series.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/model/Series.ts b/src/model/Series.ts index 6c9a69faa1..dc97df40c5 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -618,9 +618,6 @@ class SeriesModel extends ComponentMode } } else if (selectedMode === 'single' || selectedMode === true) { - if (zrUtil.isString(option.selectedMap)) { - option.selectedMap = {}; - } const lastDataIndex = innerDataIndices[len - 1]; const nameOrId = getSelectionKey(data, lastDataIndex); option.selectedMap = {