@@ -391,3 +391,89 @@ test('does not filter columns with GlobalFilter if marked disableGlobalFilter',
391391 . map ( row => Array . from ( row . children ) [ 0 ] . textContent )
392392 ) . toEqual ( [ 'firstName: tanner' , 'firstName: derek' , 'firstName: jaylen' ] )
393393} )
394+
395+ test ( 'test custom filter type' , ( ) => {
396+ const columns = [
397+ {
398+ Header : 'Name' ,
399+ columns : [
400+ {
401+ Header : 'First Name' ,
402+ accessor : 'firstName' ,
403+ disableFilters : true ,
404+ } ,
405+ {
406+ Header : 'Last Name' ,
407+ accessor : 'lastName' ,
408+ disableFilters : true ,
409+ } ,
410+ ] ,
411+ } ,
412+ {
413+ Header : 'Status' ,
414+ columns : [
415+ {
416+ Header : 'In Relationship' ,
417+ id : 'inRelationship' ,
418+ accessor : ( { status} ) => status === 'In Relationship' ,
419+ Filter : ( { column : { filterValue, setFilter} } ) => {
420+ const onClick = ( ) => {
421+ if ( typeof filterValue === 'undefined' ) {
422+ setFilter ( false ) ;
423+ } else {
424+ setFilter ( undefined ) ;
425+ }
426+ }
427+
428+ return < button onClick = { onClick } >
429+ { typeof filterValue === 'undefined' ? 'Any status' : 'Single' }
430+ </ button >
431+
432+ } ,
433+ // could use 'exact' filter type, but we want to use a custom filter method for this test
434+ filter : function strictEquals ( rows , id , filterValue ) {
435+ return rows . filter ( row => {
436+ const rowValue = row . values [ id ] ;
437+ return rowValue === filterValue ;
438+ } )
439+ }
440+ }
441+ ]
442+ }
443+ ]
444+
445+ const rendered = render ( < App columns = { columns } /> )
446+
447+ // check button cycles through states undefined -> false -> undefined
448+
449+ const filterButton = rendered . getByText ( 'Any status' )
450+
451+ fireEvent . click ( filterButton , { } ) ;
452+ let nextButtonState = rendered . getByText ( 'Single' )
453+ expect ( nextButtonState ) . toEqual ( filterButton ) ;
454+ expect (
455+ rendered
456+ . queryAllByRole ( 'row' )
457+ . slice ( 3 )
458+ . map ( row => Array . from ( row . children ) [ 0 ] . textContent )
459+ ) . toEqual ( [
460+ 'firstName: derek' ,
461+ 'firstName: joe' ,
462+ ] )
463+
464+ fireEvent . click ( filterButton , { } ) ;
465+ nextButtonState = rendered . getByText ( 'Any status' )
466+ expect ( nextButtonState ) . toEqual ( filterButton ) ;
467+ expect (
468+ rendered
469+ . queryAllByRole ( 'row' )
470+ . slice ( 3 )
471+ . map ( row => Array . from ( row . children ) [ 0 ] . textContent )
472+ ) . toEqual ( [
473+ 'firstName: tanner' ,
474+ 'firstName: derek' ,
475+ 'firstName: joe' ,
476+ 'firstName: jaylen' ,
477+ ] )
478+
479+ } )
0 commit comments