@@ -53,6 +53,7 @@ export interface VisLegendState {
5353 open : boolean ;
5454 labels : any [ ] ;
5555 tableAggs : any [ ] ;
56+ filterableLabels : Set < string > ;
5657 selectedLabel : string | null ;
5758}
5859
@@ -68,6 +69,7 @@ export class VisLegend extends PureComponent<VisLegendProps, VisLegendState> {
6869 open,
6970 labels : [ ] ,
7071 tableAggs : [ ] ,
72+ filterableLabels : new Set ( ) ,
7173 selectedLabel : null ,
7274 } ;
7375 }
@@ -133,40 +135,43 @@ export class VisLegend extends PureComponent<VisLegendProps, VisLegendState> {
133135 } ) ) ;
134136 } ;
135137
136- // Most of these functions were moved directly from the old Legend class. Not a fan of this.
137- setLabels = ( data : any , type : string ) : Promise < void > =>
138+ setFilterableLabels = ( items : LegendItem [ ] ) : Promise < void > =>
138139 new Promise ( async resolve => {
139- let labels = [ ] ;
140- if ( CUSTOM_LEGEND_VIS_TYPES . includes ( type ) ) {
141- const legendLabels = this . props . vislibVis . getLegendLabels ( ) ;
142- if ( legendLabels ) {
143- labels = map ( legendLabels , label => {
144- return { label } ;
145- } ) ;
140+ const filterableLabels = new Set < string > ( ) ;
141+ items . forEach ( async item => {
142+ const canFilter = await this . canFilter ( item ) ;
143+ if ( canFilter ) {
144+ filterableLabels . add ( item . label ) ;
146145 }
147- } else {
148- if ( ! data ) return [ ] ;
149- data = data . columns || data . rows || [ data ] ;
146+ } ) ;
147+
148+ this . setState ( { filterableLabels } , resolve ) ;
149+ } ) ;
150150
151- labels = type === 'pie' ? getPieNames ( data ) : this . getSeriesLabels ( data ) ;
151+ setLabels = ( data : any , type : string ) => {
152+ let labels = [ ] ;
153+ if ( CUSTOM_LEGEND_VIS_TYPES . includes ( type ) ) {
154+ const legendLabels = this . props . vislibVis . getLegendLabels ( ) ;
155+ if ( legendLabels ) {
156+ labels = map ( legendLabels , label => {
157+ return { label } ;
158+ } ) ;
152159 }
160+ } else {
161+ if ( ! data ) return [ ] ;
162+ data = data . columns || data . rows || [ data ] ;
153163
154- const labelsConfig = await Promise . all (
155- labels . map ( async label => ( {
156- ...label ,
157- canFilter : await this . canFilter ( label ) ,
158- } ) )
159- ) ;
160-
161- this . setState (
162- {
163- labels : labelsConfig ,
164- } ,
165- resolve
166- ) ;
164+ labels = type === 'pie' ? getPieNames ( data ) : this . getSeriesLabels ( data ) ;
165+ }
166+
167+ this . setFilterableLabels ( labels ) ;
168+
169+ this . setState ( {
170+ labels,
167171 } ) ;
172+ } ;
168173
169- refresh = async ( ) => {
174+ refresh = ( ) => {
170175 const vislibVis = this . props . vislibVis ;
171176 if ( ! vislibVis || ! vislibVis . visConfig ) {
172177 this . setState ( {
@@ -193,7 +198,7 @@ export class VisLegend extends PureComponent<VisLegendProps, VisLegendState> {
193198 }
194199
195200 this . setState ( { tableAggs : getTableAggs ( this . props . vis ) } ) ;
196- await this . setLabels ( this . props . visData , vislibVis . visConfigArgs . type ) ;
201+ this . setLabels ( this . props . visData , vislibVis . visConfigArgs . type ) ;
197202 } ;
198203
199204 highlight = ( event : BaseSyntheticEvent ) => {
@@ -241,7 +246,7 @@ export class VisLegend extends PureComponent<VisLegendProps, VisLegendState> {
241246 key = { item . label }
242247 anchorPosition = { anchorPosition }
243248 selected = { this . state . selectedLabel === item . label }
244- canFilter = { item . canFilter }
249+ canFilter = { this . state . filterableLabels . has ( item . label ) }
245250 onFilter = { this . filter }
246251 onSelect = { this . toggleDetails }
247252 legendId = { this . legendId }
0 commit comments