@@ -207,14 +207,17 @@ const filterValidators = {
207
207
208
208
/**
209
209
* Default validate filter function
210
- * @param dataset
210
+ * @param datasets
211
+ * @param datasetId
211
212
* @param filter
212
213
* @return - {filter, dataset}
213
214
*/
214
215
export function validateFilter < K extends KeplerTableModel < K , L > , L > (
215
- dataset : K ,
216
+ datasets : Record < string , K > ,
217
+ datasetId : string ,
216
218
filter : ParsedFilter
217
219
) : { filter : Filter | null ; dataset : K } {
220
+ const dataset = datasets [ datasetId ] ;
218
221
// match filter.dataId
219
222
const failed = { dataset, filter : null } ;
220
223
const filterDataId = toArray ( filter . dataId ) ;
@@ -235,7 +238,8 @@ export function validateFilter<K extends KeplerTableModel<K, L>, L>(
235
238
const fieldName = initializeFilter . name [ filterDatasetIndex ] ;
236
239
const { filter : updatedFilter , dataset : updatedDataset } = applyFilterFieldName (
237
240
initializeFilter ,
238
- dataset ,
241
+ datasets ,
242
+ datasetId ,
239
243
fieldName ,
240
244
filterDatasetIndex ,
241
245
{ mergeDomain : true }
@@ -262,19 +266,21 @@ export function validateFilter<K extends KeplerTableModel<K, L>, L>(
262
266
/**
263
267
* Validate saved filter config with new data
264
268
*
265
- * @param dataset
269
+ * @param datasets
270
+ * @param datasetId
266
271
* @param filter - filter to be validate
267
272
* @param layers - layers
268
273
* @return validated filter
269
274
*/
270
275
export function validateFilterWithData < K extends KeplerTableModel < K , L > , L > (
271
- dataset : K ,
276
+ datasets : Record < string , K > ,
277
+ datasetId : string ,
272
278
filter : ParsedFilter ,
273
279
layers : L [ ]
274
280
) : { filter : Filter ; dataset : K } {
275
281
return filter . type && Object . prototype . hasOwnProperty . call ( filterValidators , filter . type )
276
- ? filterValidators [ filter . type ] ( dataset , filter , layers )
277
- : validateFilter ( dataset , filter ) ;
282
+ ? filterValidators [ filter . type ] ( datasets [ datasetId ] , filter , layers )
283
+ : validateFilter ( datasets , datasetId , filter ) ;
278
284
}
279
285
280
286
/**
@@ -913,15 +919,17 @@ export function applyFiltersToDatasets<
913
919
/**
914
920
* Applies a new field name value to filter and update both filter and dataset
915
921
* @param filter - to be applied the new field name on
916
- * @param dataset - dataset the field belongs to
922
+ * @param datasets - All datasets
923
+ * @param datasetId - Id of the dataset the field belongs to
917
924
* @param fieldName - field.name
918
925
* @param filterDatasetIndex - field.name
919
926
* @param option
920
927
* @return - {filter, datasets}
921
928
*/
922
929
export function applyFilterFieldName < K extends KeplerTableModel < K , L > , L > (
923
930
filter : Filter ,
924
- dataset : K ,
931
+ datasets : Record < string , K > ,
932
+ datasetId : string ,
925
933
fieldName : string ,
926
934
filterDatasetIndex = 0 ,
927
935
option ?: { mergeDomain : boolean }
@@ -935,9 +943,10 @@ export function applyFilterFieldName<K extends KeplerTableModel<K, L>, L>(
935
943
? option . mergeDomain
936
944
: false ;
937
945
938
- const fieldIndex = dataset . getColumnFieldIdx ( fieldName ) ;
946
+ const dataset = datasets [ datasetId ] ;
947
+ const fieldIndex = dataset ?. getColumnFieldIdx ( fieldName ) ;
939
948
// if no field with same name is found, move to the next datasets
940
- if ( fieldIndex === - 1 ) {
949
+ if ( ! dataset || fieldIndex === - 1 ) {
941
950
// throw new Error(`fieldIndex not found. Dataset must contain a property with name: ${fieldName}`);
942
951
return { filter : null , dataset} ;
943
952
}
@@ -946,7 +955,8 @@ export function applyFilterFieldName<K extends KeplerTableModel<K, L>, L>(
946
955
const filterProps = dataset . getColumnFilterProps ( fieldName ) ;
947
956
948
957
let newFilter = {
949
- ...( mergeDomain ? mergeFilterDomainStep ( filter , filterProps ) : { ...filter , ...filterProps } ) ,
958
+ ...filter ,
959
+ ...filterProps ,
950
960
name : Object . assign ( [ ...toArray ( filter . name ) ] , { [ filterDatasetIndex ] : fieldName } ) ,
951
961
fieldIdx : Object . assign ( [ ...toArray ( filter . fieldIdx ) ] , {
952
962
[ filterDatasetIndex ] : fieldIndex
@@ -955,6 +965,18 @@ export function applyFilterFieldName<K extends KeplerTableModel<K, L>, L>(
955
965
...( filter . plotType ? { plotType : filter . plotType } : { } )
956
966
} ;
957
967
968
+ if ( mergeDomain ) {
969
+ const domainSteps : ( Filter & { step ?: number } ) | null =
970
+ mergeFilterDomain ( newFilter , datasets ) ?? ( { } as Filter ) ;
971
+ if ( domainSteps ) {
972
+ const { domain, step} = domainSteps ;
973
+ newFilter . domain = domain ;
974
+ if ( newFilter . step !== step ) {
975
+ newFilter . step = step ;
976
+ }
977
+ }
978
+ }
979
+
958
980
// TODO: if we don't set filter value in filterProps, we don't need to do this
959
981
if ( filterDatasetIndex > 0 ) {
960
982
// don't reset the filter value if we are just adding a synced dataset
@@ -970,12 +992,31 @@ export function applyFilterFieldName<K extends KeplerTableModel<K, L>, L>(
970
992
} ;
971
993
}
972
994
995
+ /**
996
+ * Merge the domains of a filter in case it applies to multiple datasets
997
+ */
998
+ export function mergeFilterDomain (
999
+ filter : Filter ,
1000
+ datasets : Record < string , KeplerTableModel < any , any > >
1001
+ ) : ( Filter & { step ?: number } ) | null {
1002
+ let domainSteps : ( Filter & { step ?: number } ) | null = null ;
1003
+ if ( ! filter ?. dataId ?. length ) {
1004
+ return filter ;
1005
+ }
1006
+ filter . dataId . forEach ( ( filterDataId , idx ) => {
1007
+ const dataset = datasets [ filterDataId ] ;
1008
+ const filterProps = dataset . getColumnFilterProps ( filter . name [ idx ] ) ;
1009
+ domainSteps = mergeFilterDomainStep ( domainSteps ?? ( { } as Filter ) , filterProps ) ;
1010
+ } ) ;
1011
+ return domainSteps ;
1012
+ }
1013
+
973
1014
/**
974
1015
* Merge one filter with other filter prop domain
975
1016
*/
976
1017
/* eslint-disable complexity */
977
1018
export function mergeFilterDomainStep (
978
- filter : Filter ,
1019
+ filter : Filter | null ,
979
1020
filterProps ?: Partial < Filter >
980
1021
) : ( Filter & { step ?: number } ) | null {
981
1022
if ( ! filter ) {
@@ -1134,7 +1175,12 @@ export function validateFiltersUpdateDatasets<
1134
1175
const toValidate = acc . validatedFilter || filterToValidate ;
1135
1176
1136
1177
const { filter : updatedFilter , dataset : updatedDataset } = validateFilterWithData (
1137
- acc . augmentedDatasets [ datasetId ] || dataset ,
1178
+ {
1179
+ ...updatedDatasets ,
1180
+ ...acc . augmentedDatasets ,
1181
+ [ datasetId ] : acc . augmentedDatasets [ datasetId ] || dataset
1182
+ } ,
1183
+ datasetId ,
1138
1184
toValidate ,
1139
1185
datasetLayers
1140
1186
) ;
0 commit comments