@@ -77,6 +77,20 @@ const filterStringFieldConfig = {
77
77
] ,
78
78
} ;
79
79
80
+ const filterIntegerFieldConfig = {
81
+ name : 'post' ,
82
+ collection : 'posts' ,
83
+ display_fields : [ 'title' , 'slug' ] ,
84
+ search_fields : [ 'title' , 'body' ] ,
85
+ value_field : 'title' ,
86
+ filters : [
87
+ {
88
+ field : 'num' ,
89
+ values : [ 1 , 5 , 9 ] ,
90
+ } ,
91
+ ] ,
92
+ } ;
93
+
80
94
const multipleFiltersFieldConfig = {
81
95
name : 'post' ,
82
96
collection : 'posts' ,
@@ -109,13 +123,28 @@ const emptyFilterFieldConfig = {
109
123
] ,
110
124
} ;
111
125
126
+ const nestedFilterFieldConfig = {
127
+ name : 'post' ,
128
+ collection : 'posts' ,
129
+ display_fields : [ 'title' , 'slug' ] ,
130
+ search_fields : [ 'title' , 'body' ] ,
131
+ value_field : 'title' ,
132
+ filters : [
133
+ {
134
+ field : 'deeply.nested.post.field' ,
135
+ values : [ 'Deeply nested field' ] ,
136
+ } ,
137
+ ] ,
138
+ } ;
139
+
112
140
function generateHits ( length ) {
113
141
const hits = Array . from ( { length } , ( val , idx ) => {
114
142
const title = `Post # ${ idx + 1 } ` ;
115
143
const slug = `post-number-${ idx + 1 } ` ;
116
144
const draft = idx % 2 === 0 ;
145
+ const num = idx + 1 ;
117
146
const path = `posts/${ slug } .md` ;
118
- return { collection : 'posts' , data : { title, slug, draft } , slug, path } ;
147
+ return { collection : 'posts' , data : { title, slug, draft, num } , slug, path } ;
119
148
} ) ;
120
149
121
150
return [
@@ -338,7 +367,9 @@ describe('Relation widget', () => {
338
367
const value = 'Post # 1' ;
339
368
const label = 'Post # 1 post-number-1' ;
340
369
const metadata = {
341
- post : { posts : { 'Post # 1' : { title : 'Post # 1' , draft : true , slug : 'post-number-1' } } } ,
370
+ post : {
371
+ posts : { 'Post # 1' : { title : 'Post # 1' , draft : true , num : 1 , slug : 'post-number-1' } } ,
372
+ } ,
342
373
} ;
343
374
344
375
fireEvent . keyDown ( input , { key : 'ArrowDown' } ) ;
@@ -356,7 +387,9 @@ describe('Relation widget', () => {
356
387
const { getByText, onChangeSpy, setQueryHitsSpy } = setup ( { field, value } ) ;
357
388
const label = 'Post # 1 post-number-1' ;
358
389
const metadata = {
359
- post : { posts : { 'Post # 1' : { title : 'Post # 1' , draft : true , slug : 'post-number-1' } } } ,
390
+ post : {
391
+ posts : { 'Post # 1' : { title : 'Post # 1' , draft : true , num : 1 , slug : 'post-number-1' } } ,
392
+ } ,
360
393
} ;
361
394
362
395
setQueryHitsSpy ( generateHits ( 1 ) ) ;
@@ -405,7 +438,9 @@ describe('Relation widget', () => {
405
438
const label = 'post-number-1 post-number-1 md' ;
406
439
const metadata = {
407
440
post : {
408
- posts : { 'post-number-1' : { title : 'Post # 1' , draft : true , slug : 'post-number-1' } } ,
441
+ posts : {
442
+ 'post-number-1' : { title : 'Post # 1' , draft : true , num : 1 , slug : 'post-number-1' } ,
443
+ } ,
409
444
} ,
410
445
} ;
411
446
@@ -462,10 +497,14 @@ describe('Relation widget', () => {
462
497
const field = fromJS ( { ...fieldConfig , multiple : true } ) ;
463
498
const { getByText, input, onChangeSpy } = setup ( { field } ) ;
464
499
const metadata1 = {
465
- post : { posts : { 'Post # 1' : { title : 'Post # 1' , draft : true , slug : 'post-number-1' } } } ,
500
+ post : {
501
+ posts : { 'Post # 1' : { title : 'Post # 1' , draft : true , num : 1 , slug : 'post-number-1' } } ,
502
+ } ,
466
503
} ;
467
504
const metadata2 = {
468
- post : { posts : { 'Post # 2' : { title : 'Post # 2' , draft : false , slug : 'post-number-2' } } } ,
505
+ post : {
506
+ posts : { 'Post # 2' : { title : 'Post # 2' , draft : false , num : 2 , slug : 'post-number-2' } } ,
507
+ } ,
469
508
} ;
470
509
471
510
fireEvent . keyDown ( input , { key : 'ArrowDown' } ) ;
@@ -593,6 +632,29 @@ describe('Relation widget', () => {
593
632
} ) ;
594
633
} ) ;
595
634
635
+ it ( 'should list 3 option hits on initial load using a filter on integer value' , async ( ) => {
636
+ const field = fromJS ( filterIntegerFieldConfig ) ;
637
+ const { getAllByText, input } = setup ( { field } ) ;
638
+ const expectedOptions = [
639
+ 'Post # 1 post-number-1' ,
640
+ 'Post # 5 post-number-5' ,
641
+ 'Post # 9 post-number-9' ,
642
+ ] ;
643
+ fireEvent . keyDown ( input , { key : 'ArrowDown' } ) ;
644
+
645
+ await waitFor ( ( ) => {
646
+ const displayedOptions = getAllByText ( / ^ P o s t # ( \d { 1 , 2 } ) p o s t - n u m b e r - \1$ / ) ;
647
+ expect ( displayedOptions ) . toHaveLength ( expectedOptions . length ) ;
648
+ for ( let i = 0 ; i < expectedOptions . length ; i ++ ) {
649
+ const expectedOption = expectedOptions [ i ] ;
650
+ const optionFound = displayedOptions . some (
651
+ option => option . textContent === expectedOption ,
652
+ ) ;
653
+ expect ( optionFound ) . toBe ( true ) ;
654
+ }
655
+ } ) ;
656
+ } ) ;
657
+
596
658
it ( 'should list 4 option hits on initial load using multiple filters' , async ( ) => {
597
659
const field = fromJS ( multipleFiltersFieldConfig ) ;
598
660
const { getAllByText, input } = setup ( { field } ) ;
@@ -626,5 +688,16 @@ describe('Relation widget', () => {
626
688
expect ( ( ) => getAllByText ( / ^ P o s t # ( \d { 1 , 2 } ) p o s t - n u m b e r - \1$ / ) ) . toThrow ( Error ) ;
627
689
} ) ;
628
690
} ) ;
691
+
692
+ it ( 'should list 1 option hit on initial load on nested filter field' , async ( ) => {
693
+ const field = fromJS ( nestedFilterFieldConfig ) ;
694
+ const { getAllByText, input } = setup ( { field } ) ;
695
+ fireEvent . keyDown ( input , { key : 'ArrowDown' } ) ;
696
+
697
+ await waitFor ( ( ) => {
698
+ expect ( ( ) => getAllByText ( / ^ P o s t # ( \d { 1 , 2 } ) p o s t - n u m b e r - \1$ / ) ) . toThrow ( Error ) ;
699
+ expect ( getAllByText ( 'Deeply nested post post-deeply-nested' ) ) . toHaveLength ( 1 ) ;
700
+ } ) ;
701
+ } ) ;
629
702
} ) ;
630
703
} ) ;
0 commit comments