@@ -39,6 +39,7 @@ test.describe('filtering', () => {
3939 const filterPanel = page . locator ( SELECTORS . filterPanel ) ;
4040 await expect ( filterPanel ) . toBeVisible ( ) ;
4141 await filterPanel . getByRole ( 'combobox' ) . selectOption ( { label : 'Contains' } ) ;
42+ await expect ( filterPanel . locator ( '.reorder-button' ) ) . toHaveCount ( 0 ) ;
4243 await page . locator ( SELECTORS . filterInput ) . fill ( 'Admin' ) ;
4344
4445 await expectVisibleColumnValues ( page , 1 , [ 'Alice' , 'Cara' ] ) ;
@@ -105,6 +106,7 @@ test.describe('filtering', () => {
105106
106107 const row = filterPanel . locator ( '.multi-filter-list-row' ) . first ( ) ;
107108 await expect ( row ) . toBeVisible ( ) ;
109+ await expect ( row . locator ( ':scope > .reorder-button' ) ) . toHaveCount ( 1 ) ;
108110 await expect ( row . locator ( ':scope > .select-input' ) ) . toHaveCount ( 1 ) ;
109111 await expect ( row . locator ( ':scope > .multi-filter-list-action' ) ) . toHaveCount ( 1 ) ;
110112 await expect ( row . locator ( '.select-input .multi-filter-list-action' ) ) . toHaveCount ( 0 ) ;
@@ -129,6 +131,74 @@ test.describe('filtering', () => {
129131 expect ( isSingleRow ) . toBe ( true ) ;
130132 } ) ;
131133
134+ test ( 'reorders filter conditions with the drag handle' , async ( { page } ) => {
135+ const source : SampleRow [ ] = [
136+ { id : 501 , name : 'Alice' , role : 'Admin' , city : 'Lisbon' } ,
137+ { id : 502 , name : 'Ben' , role : 'Engineer' , city : 'Porto' } ,
138+ ] ;
139+
140+ const columns = buildColumns ( [
141+ { prop : 'id' , name : 'ID' } ,
142+ { prop : 'name' , name : 'Name' } ,
143+ { prop : 'role' , name : 'Role' , filter : true , ...withHeaderTestId ( 'reorder-filter-role' ) } ,
144+ { prop : 'city' , name : 'City' } ,
145+ ] ) ;
146+
147+ await mountGrid ( page , { columns, source, filter : true } ) ;
148+
149+ await page
150+ . getByTestId ( 'reorder-filter-role' )
151+ . locator ( SELECTORS . filterButton )
152+ . click ( ) ;
153+
154+ const filterPanel = page . locator ( SELECTORS . filterPanel ) ;
155+ const filterInputs = page . locator ( SELECTORS . filterInput ) ;
156+ await expect ( filterPanel ) . toBeVisible ( ) ;
157+ await filterPanel . getByRole ( 'combobox' ) . selectOption ( { label : 'Contains' } ) ;
158+ await filterInputs . fill ( 'Admin' ) ;
159+ await filterPanel . locator ( '#add-filter' ) . selectOption ( { label : 'Equal' } ) ;
160+ await filterInputs . nth ( 1 ) . fill ( 'Engineer' ) ;
161+
162+ await expect ( filterPanel . locator ( '.multi-filter-list-row' ) ) . toHaveCount ( 2 ) ;
163+ await expect ( filterPanel . locator ( '.select-filter' ) . nth ( 0 ) ) . toHaveValue ( 'contains' ) ;
164+ await expect ( filterPanel . locator ( '.select-filter' ) . nth ( 1 ) ) . toHaveValue ( 'eq' ) ;
165+
166+ await filterPanel . evaluate ( ( panel ) => {
167+ const rows = Array . from ( panel . querySelectorAll ( '.multi-filter-list-row' ) ) ;
168+ const sourceHandle = rows [ 1 ] . querySelector ( '.reorder-button' ) ;
169+ const targetHandle = rows [ 0 ] . querySelector ( '.reorder-button' ) ;
170+ if ( ! sourceHandle || ! targetHandle ) {
171+ throw new Error ( 'Filter reorder controls were not found' ) ;
172+ }
173+ const dataTransfer = new DataTransfer ( ) ;
174+ sourceHandle . dispatchEvent ( new DragEvent ( 'dragstart' , {
175+ bubbles : true ,
176+ cancelable : true ,
177+ dataTransfer,
178+ } ) ) ;
179+ targetHandle . dispatchEvent ( new DragEvent ( 'dragover' , {
180+ bubbles : true ,
181+ cancelable : true ,
182+ dataTransfer,
183+ } ) ) ;
184+ targetHandle . dispatchEvent ( new DragEvent ( 'drop' , {
185+ bubbles : true ,
186+ cancelable : true ,
187+ dataTransfer,
188+ } ) ) ;
189+ sourceHandle . dispatchEvent ( new DragEvent ( 'dragend' , {
190+ bubbles : true ,
191+ cancelable : true ,
192+ dataTransfer,
193+ } ) ) ;
194+ } ) ;
195+
196+ await expect ( filterPanel . locator ( '.select-filter' ) . nth ( 0 ) ) . toHaveValue ( 'eq' ) ;
197+ await expect ( filterPanel . locator ( '.select-filter' ) . nth ( 1 ) ) . toHaveValue ( 'contains' ) ;
198+ await expect ( filterInputs . nth ( 0 ) ) . toHaveValue ( 'Engineer' ) ;
199+ await expect ( filterInputs . nth ( 1 ) ) . toHaveValue ( 'Admin' ) ;
200+ } ) ;
201+
132202 test ( 'reapplies active filters after source replacement' , async ( { page } ) => {
133203 const source : SampleRow [ ] = [
134204 { id : 501 , name : 'Alice' , role : 'Admin' , city : 'Lisbon' } ,
0 commit comments