@@ -1226,65 +1226,107 @@ export class BaseChart<T extends IChartSpec> extends CompilableBase implements I
1226
1226
} ) ;
1227
1227
}
1228
1228
1229
- protected _setStateInDatum (
1230
- stateKey : string ,
1231
- checkReverse : boolean ,
1229
+ filterGraphicsByDatum (
1232
1230
datum : MaybeArray < Datum > | null ,
1233
- filter ?: ( series : ISeries , mark : IMark ) => boolean ,
1234
- region ?: IRegionQuerier
1231
+ opt : {
1232
+ filter ?: ( series : ISeries , mark : IMark ) => boolean ;
1233
+ region ?: IRegionQuerier ;
1234
+ getDatum ?: ( el : IElement , mark : IMark , s : ISeries , r : IRegion ) => Datum ;
1235
+ callback ?: ( el : IElement , mark : IMark , s : ISeries , r : IRegion ) => void ;
1236
+ regionCallback ?: ( pickElements : IElement [ ] , r : IRegion ) => void ;
1237
+ } = { }
1235
1238
) {
1236
1239
datum = datum ? array ( datum ) : null ;
1237
- const keys = ! datum ? null : Object . keys ( datum [ 0 ] ) ;
1238
- this . getRegionsInQuerier ( region ) . forEach ( r => {
1239
- if ( ! datum ) {
1240
- r . interaction . clearEventElement ( stateKey , true ) ;
1241
- return ;
1242
- }
1243
- r . getSeries ( ) . forEach ( s => {
1244
- s . getMarks ( ) . forEach ( m => {
1245
- if ( ! m . getProduct ( ) ) {
1246
- return ;
1247
- }
1248
- if ( ! filter || ( isFunction ( filter ) && filter ( s , m ) ) ) {
1249
- const isCollect = m . getProduct ( ) . isCollectionMark ( ) ;
1250
- const elements = m . getProduct ( ) . elements ;
1251
- let pickElements = [ ] as IElement [ ] ;
1252
- if ( isCollect ) {
1253
- pickElements = elements . filter ( e => {
1254
- const elDatum = e . getDatum ( ) ;
1255
- // eslint-disable-next-line max-nested-callbacks, eqeqeq
1256
- ( datum as Datum [ ] ) . every ( ( d , index ) => keys . every ( k => d [ k ] == elDatum [ index ] [ k ] ) ) ;
1257
- } ) ;
1258
- } else {
1259
- if ( datum . length > 1 ) {
1260
- const datumTemp = ( datum as Datum [ ] ) . slice ( ) ;
1261
- pickElements = elements . filter ( e => {
1262
- if ( datumTemp . length === 0 ) {
1263
- return false ;
1264
- }
1265
- const elDatum = e . getDatum ( ) ;
1266
- // eslint-disable-next-line max-nested-callbacks, eqeqeq
1267
- const index = datumTemp . findIndex ( d => keys . every ( k => d [ k ] == elDatum [ k ] ) ) ;
1268
- if ( index >= 0 ) {
1269
- datumTemp . splice ( index , 1 ) ;
1270
- return true ;
1240
+ const keys = ! datum ? null : Object . keys ( ( datum as Datum [ ] ) [ 0 ] ) ;
1241
+ const allElements = [ ] as IElement [ ] ;
1242
+ const getDatumOfElement = opt . getDatum ?? ( ( el : IElement ) => el . getDatum ( ) ) ;
1243
+
1244
+ this . getRegionsInQuerier ( opt . region ) . forEach ( r => {
1245
+ const pickElements = [ ] as IElement [ ] ;
1246
+ datum &&
1247
+ r . getSeries ( ) . forEach ( s => {
1248
+ s . getMarks ( ) . forEach ( m => {
1249
+ if ( ! m . getProduct ( ) ) {
1250
+ return ;
1251
+ }
1252
+ if ( ! opt . filter || ( isFunction ( opt . filter ) && opt . filter ( s , m ) ) ) {
1253
+ const isCollect = m . getProduct ( ) . isCollectionMark ( ) ;
1254
+ const elements = m . getProduct ( ) . elements ;
1255
+ if ( isCollect ) {
1256
+ elements . filter ( e => {
1257
+ const elDatum = getDatumOfElement ( e , m , s , r ) ;
1258
+ const isPick =
1259
+ // eslint-disable-next-line max-nested-callbacks, eqeqeq
1260
+ elDatum && ( datum as Datum [ ] ) . every ( ( d , index ) => keys . every ( k => d [ k ] == elDatum [ index ] [ k ] ) ) ;
1261
+
1262
+ if ( isPick ) {
1263
+ pickElements . push ( e ) ;
1264
+ allElements . push ( e ) ;
1265
+ opt . callback && opt . callback ( e , m , s , r ) ;
1271
1266
}
1272
- return false ;
1273
1267
} ) ;
1274
1268
} else {
1275
- // eslint-disable-next-line eqeqeq
1276
- const el = elements . find ( e => keys . every ( k => datum [ 0 ] [ k ] == e . getDatum ( ) [ k ] ) ) ;
1277
- el && ( pickElements = [ el ] ) ;
1269
+ if ( datum . length > 1 ) {
1270
+ const datumTemp = ( datum as Datum [ ] ) . slice ( ) ;
1271
+
1272
+ elements . forEach ( e => {
1273
+ const elDatum = getDatumOfElement ( e , m , s , r ) ;
1274
+ // eslint-disable-next-line max-nested-callbacks, eqeqeq
1275
+ const index = elDatum && datumTemp . findIndex ( d => keys . every ( k => d [ k ] == elDatum [ k ] ) ) ;
1276
+ if ( index >= 0 ) {
1277
+ datumTemp . splice ( index , 1 ) ;
1278
+
1279
+ pickElements . push ( e ) ;
1280
+ allElements . push ( e ) ;
1281
+ opt . callback && opt . callback ( e , m , s , r ) ;
1282
+ }
1283
+ } ) ;
1284
+ } else {
1285
+ const el = elements . find ( e => {
1286
+ const elDatum = getDatumOfElement ( e , m , s , r ) ;
1287
+ // eslint-disable-next-line eqeqeq
1288
+ return elDatum && keys . every ( k => ( datum as Datum [ ] ) [ 0 ] [ k ] == elDatum [ k ] ) ;
1289
+ } ) ;
1290
+
1291
+ if ( el ) {
1292
+ pickElements . push ( el ) ;
1293
+ allElements . push ( el ) ;
1294
+ opt . callback && opt . callback ( el , m , s , r ) ;
1295
+ }
1296
+ }
1278
1297
}
1279
1298
}
1280
- pickElements . forEach ( element => {
1281
- r . interaction . startInteraction ( stateKey , element ) ;
1282
- } ) ;
1283
- }
1299
+ } ) ;
1284
1300
} ) ;
1285
- } ) ;
1286
- if ( checkReverse ) {
1287
- r . interaction . reverseEventElement ( stateKey ) ;
1301
+
1302
+ opt . regionCallback && opt . regionCallback ( pickElements , r ) ;
1303
+ } ) ;
1304
+
1305
+ return allElements ;
1306
+ }
1307
+
1308
+ protected _setStateInDatum (
1309
+ stateKey : string ,
1310
+ checkReverse : boolean ,
1311
+ datum : MaybeArray < Datum > | null ,
1312
+ filter ?: ( series : ISeries , mark : IMark ) => boolean ,
1313
+ region ?: IRegionQuerier
1314
+ ) {
1315
+ this . filterGraphicsByDatum ( datum , {
1316
+ filter,
1317
+ region,
1318
+ regionCallback : ( elements , r ) => {
1319
+ if ( ! datum ) {
1320
+ r . interaction . clearEventElement ( stateKey , true ) ;
1321
+ } else if ( elements . length ) {
1322
+ elements . forEach ( e => {
1323
+ r . interaction . startInteraction ( stateKey , e ) ;
1324
+ } ) ;
1325
+
1326
+ if ( checkReverse ) {
1327
+ r . interaction . reverseEventElement ( stateKey ) ;
1328
+ }
1329
+ }
1288
1330
}
1289
1331
} ) ;
1290
1332
}
0 commit comments