@@ -235,4 +235,59 @@ describe('TableFilter', () => {
235235 ] ,
236236 } )
237237 } )
238+
239+ it ( 'preserves an OR boundary when its first rule is cleared' , ( ) => {
240+ const onChange = vi . fn ( )
241+ renderFilter ( onChange , {
242+ any : [
243+ { all : [ { field : 'col-name' , op : 'eq' , value : 'Ada' } ] } ,
244+ {
245+ all : [
246+ { field : 'col-name' , op : 'eq' , value : 'Grace' } ,
247+ { field : 'col-name' , op : 'eq' , value : 'Linus' } ,
248+ ] ,
249+ } ,
250+ ] ,
251+ } )
252+
253+ const inputs = container . querySelectorAll < HTMLInputElement > (
254+ 'input[placeholder="Enter a value"]'
255+ )
256+ act ( ( ) => typeInto ( inputs [ 1 ] , '' ) )
257+ act ( ( ) => inputs [ 1 ] ?. dispatchEvent ( new FocusEvent ( 'focusout' , { bubbles : true } ) ) )
258+
259+ expect ( onChange ) . toHaveBeenCalledWith ( {
260+ any : [
261+ { all : [ { field : 'col-name' , op : 'eq' , value : 'Ada' } ] } ,
262+ { all : [ { field : 'col-name' , op : 'eq' , value : 'Linus' } ] } ,
263+ ] ,
264+ } )
265+ } )
266+
267+ it ( 'preserves an OR boundary when its first rule is removed' , ( ) => {
268+ const onChange = vi . fn ( )
269+ renderFilter ( onChange , {
270+ any : [
271+ { all : [ { field : 'col-name' , op : 'eq' , value : 'Ada' } ] } ,
272+ {
273+ all : [
274+ { field : 'col-name' , op : 'eq' , value : 'Grace' } ,
275+ { field : 'col-name' , op : 'eq' , value : 'Linus' } ,
276+ ] ,
277+ } ,
278+ ] ,
279+ } )
280+
281+ const removeButtons = container . querySelectorAll < HTMLButtonElement > (
282+ 'button[aria-label="Remove filter"]'
283+ )
284+ act ( ( ) => removeButtons [ 1 ] ?. click ( ) )
285+
286+ expect ( onChange ) . toHaveBeenCalledWith ( {
287+ any : [
288+ { all : [ { field : 'col-name' , op : 'eq' , value : 'Ada' } ] } ,
289+ { all : [ { field : 'col-name' , op : 'eq' , value : 'Linus' } ] } ,
290+ ] ,
291+ } )
292+ } )
238293} )
0 commit comments