diff --git a/change/@fluentui-react-charting-f2c52d6b-db33-4e09-b29c-a8aacddd7667.json b/change/@fluentui-react-charting-f2c52d6b-db33-4e09-b29c-a8aacddd7667.json new file mode 100644 index 00000000000000..6947671a1cc7cc --- /dev/null +++ b/change/@fluentui-react-charting-f2c52d6b-db33-4e09-b29c-a8aacddd7667.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Fix wrong state narration for multiple selected legends", + "packageName": "@fluentui/react-charting", + "email": "kumarkshitij@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-charting/src/components/Legends/Legends.base.tsx b/packages/react-charting/src/components/Legends/Legends.base.tsx index dbebe31fb9b609..3a51db9758b9d1 100644 --- a/packages/react-charting/src/components/Legends/Legends.base.tsx +++ b/packages/react-charting/src/components/Legends/Legends.base.tsx @@ -17,8 +17,6 @@ import { } from './Legends.types'; import { Shape } from './shape'; -import { silceOrAppendToArray } from '../../utilities/utilities'; - const getClassNames = classNamesFunction(); // This is an internal interface used for rendering the legends with unique key @@ -40,11 +38,14 @@ export interface ILegendState { selectedLegend: string; activeLegend: string; isHoverCardVisible: boolean; - selectedLegends: string[]; + /** Set of legends selected when multiple selection is allowed */ + selectedLegends: { [key: string]: boolean }; } export class LegendsBase extends React.Component { private _hoverCardRef: HTMLDivElement; private _classNames: IProcessedStyleSet; + /** Boolean variable to check if one or more legends are selected */ + private _isLegendSelected = false; public constructor(props: ILegendsProps) { super(props); @@ -52,7 +53,7 @@ export class LegendsBase extends React.Component { selectedLegend: '', activeLegend: '', isHoverCardVisible: false, - selectedLegends: [], + selectedLegends: {}, }; } @@ -62,6 +63,7 @@ export class LegendsBase extends React.Component { theme: theme!, className, }); + this._isLegendSelected = this.state.selectedLegend !== '' || Object.keys(this.state.selectedLegends).length > 0; const dataToRender = this._generateData(); return (
@@ -161,11 +163,19 @@ export class LegendsBase extends React.Component { * @param legend ILegend */ private _canSelectMultipleLegends = (legend: ILegend): void => { - const selectedLegends = silceOrAppendToArray(this.state.selectedLegends, legend.title); - this.setState({ - //check if user selected all legends then empty it get the default behaviour - selectedLegends: selectedLegends.length === this.props.legends.length ? [] : selectedLegends, - }); + let selectedLegends = { ...this.state.selectedLegends }; + if (selectedLegends[legend.title]) { + // Delete entry for the deselected legend to make + // the number of keys equal to the number of selected legends + delete selectedLegends[legend.title]; + } else { + selectedLegends[legend.title] = true; + // Clear set if all legends are selected + if (Object.keys(selectedLegends).length === this.props.legends.length) { + selectedLegends = {}; + } + } + this.setState({ selectedLegends }); }; /** @@ -176,13 +186,9 @@ export class LegendsBase extends React.Component { private _canSelectOnlySingleLegend = (legend: ILegend): void => { if (this.state.selectedLegend === legend.title) { - this.setState({ - selectedLegend: '', - }); + this.setState({ selectedLegend: '' }); } else { - this.setState({ - selectedLegend: legend.title, - }); + this.setState({ selectedLegend: legend.title }); } }; @@ -247,7 +253,7 @@ export class LegendsBase extends React.Component { // execute similar to "_onClick" and "_onLeave" logic at HoverCard onCardHide event const onHoverCardHideHandler = () => { this.setState({ isHoverCardVisible: false }); - /** Unhighlight the focused legend in the hover card */ + // Unhighlight the focused legend in the hover card const activeOverflowItem = find(legends, (legend: ILegend) => legend.title === this.state.activeLegend); if (activeOverflowItem) { this.setState({ activeLegend: '' }); @@ -318,7 +324,7 @@ export class LegendsBase extends React.Component { opacity: data.opacity, }; const color = this._getColor(legend.title, legend.color); - const { theme, className, styles } = this.props; + const { theme, className, styles, canSelectMultipleLegends = false } = this.props; const classNames = getClassNames(styles!, { theme: theme!, className, @@ -342,7 +348,9 @@ export class LegendsBase extends React.Component { return (