Skip to content

Commit

Permalink
fix(legend): fix legend action is not isolated from other legend comp…
Browse files Browse the repository at this point in the history
…onents (resolves #20128)
  • Loading branch information
plainheart committed Jul 8, 2024
1 parent 369cb03 commit 5c84ce2
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 11 deletions.
3 changes: 2 additions & 1 deletion src/component/legend/LegendView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,8 @@ class LegendView extends ComponentView {
},
onclick() {
api.dispatchAction({
type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect'
type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect',
legendId: legendModel.id
});
}
});
Expand Down
28 changes: 18 additions & 10 deletions src/component/legend/legendAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,23 @@
* under the License.
*/

// @ts-nocheck
import {curry, each, hasOwn} from 'zrender/src/core/util';
import { EChartsExtensionInstallRegisters } from '../../extension';
import { Payload } from '../../util/types';
import type GlobalModel from '../../model/Global';
import type LegendModel from './LegendModel';

import {curry, each} from 'zrender/src/core/util';
type LegendSelectMethodNames =
'select' | 'unSelect' |
'toggleSelected' | 'toggleSelected' |
'allSelect' | 'inverseSelect';

function legendSelectActionHandler(methodName, payload, ecModel) {
const selectedMap = {};
function legendSelectActionHandler(methodName: LegendSelectMethodNames, payload: Payload, ecModel: GlobalModel) {
const selectedMap: Record<string, boolean> = {};
const isToggleSelect = methodName === 'toggleSelected';
let isSelected;
// Update all legend components
ecModel.eachComponent('legend', function (legendModel) {
let isSelected: boolean;
const legendModels = ecModel.findComponents({ mainType: 'legend', query: payload }) as LegendModel[];
each(legendModels, function (legendModel: LegendModel) {
if (isToggleSelect && isSelected != null) {
// Force other legend has same selected status
// Or the first is toggled to true and other are toggled to false
Expand All @@ -49,7 +56,7 @@ function legendSelectActionHandler(methodName, payload, ecModel) {
return;
}
const isItemSelected = legendModel.isSelected(name);
if (selectedMap.hasOwnProperty(name)) {
if (hasOwn(selectedMap, name)) {
// Unselected if any legend is unselected
selectedMap[name] = selectedMap[name] && isItemSelected;
}
Expand All @@ -58,6 +65,7 @@ function legendSelectActionHandler(methodName, payload, ecModel) {
}
});
});

// Return the event explicitly
return (methodName === 'allSelect' || methodName === 'inverseSelect')
? {
Expand All @@ -69,7 +77,7 @@ function legendSelectActionHandler(methodName, payload, ecModel) {
};
}

export function installLegendAction(registers) {
export function installLegendAction(registers: EChartsExtensionInstallRegisters) {
/**
* @event legendToggleSelect
* @type {Object}
Expand Down Expand Up @@ -113,4 +121,4 @@ export function installLegendAction(registers) {
'legendUnSelect', 'legendunselected',
curry(legendSelectActionHandler, 'unSelect')
);
}
}

0 comments on commit 5c84ce2

Please sign in to comment.