Skip to content

Commit f992043

Browse files
DataGrid - Selected (Blanks) in the header filter should be applied if the Filter Row and Filter Panel is visible (T1257261) (#28599)
1 parent 3486cf5 commit f992043

File tree

3 files changed

+91
-3
lines changed

3 files changed

+91
-3
lines changed

packages/devextreme/js/__internal/grids/grid_core/filter/m_filter_sync.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,13 @@ const updateFilterRowCondition = function (columnsController, column, condition)
122122
const filterValue = condition?.[2];
123123
const filterOperations = column.filterOperations || column.defaultFilterOperations;
124124

125-
if ((!filterOperations || filterOperations.indexOf(selectedFilterOperation) >= 0 || selectedFilterOperation === column.defaultFilterOperation)
126-
&& FILTER_ROW_OPERATIONS.includes(selectedFilterOperation) && filterValue !== null) {
127-
if (selectedFilterOperation === column.defaultFilterOperation && !isDefined(column.selectedFilterOperation)) {
125+
const selectedOperationExists = !filterOperations || filterOperations.indexOf(selectedFilterOperation) >= 0;
126+
const defaultOperationSelected = selectedFilterOperation === column.defaultFilterOperation;
127+
const builtInOperationSelected = FILTER_ROW_OPERATIONS.includes(selectedFilterOperation);
128+
const filterValueNotNullOrEmpty = filterValue !== null && filterValue !== '';
129+
130+
if ((selectedOperationExists || defaultOperationSelected) && builtInOperationSelected && filterValueNotNullOrEmpty) {
131+
if (defaultOperationSelected && !isDefined(column.selectedFilterOperation)) {
128132
selectedFilterOperation = column.selectedFilterOperation;
129133
}
130134
filterRowOptions = {

packages/devextreme/testing/testcafe/tests/dataGrid/filterRow/filterRow.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,49 @@ import { getNumberData } from '../helpers/generateDataSourceData';
99
fixture.disablePageReloads`FilterRow`
1010
.page(url(__dirname, '../../container.html'));
1111

12+
test('Filter should reset if the filter row editor text is cleared (T1257261)', async (t) => {
13+
const dataGrid = new DataGrid('#container');
14+
const filterEditor = dataGrid.getFilterEditor(1, FilterTextBox);
15+
const filterPanelText = dataGrid.getFilterPanel().getFilterText();
16+
17+
await t
18+
// assert
19+
.expect(filterPanelText.element.textContent)
20+
.eql('[Text] Equals \'i\'')
21+
// act
22+
.click(filterEditor.input)
23+
.pressKey('backspace')
24+
.wait(100) // updateValueTimeout
25+
// assert
26+
.expect(filterPanelText.element.textContent)
27+
.eql('Create Filter')
28+
// act
29+
.click(dataGrid.element)
30+
// assert
31+
.expect(filterPanelText.element.textContent)
32+
.eql('Create Filter');
33+
}).before(async () => createWidget('dxDataGrid', {
34+
dataSource: [
35+
{ ID: 1, Text: 'Item 1' },
36+
{ ID: 2, Text: '' },
37+
{ ID: 3, Text: 'Item 3' },
38+
],
39+
keyExpr: 'ID',
40+
showBorders: true,
41+
remoteOperations: true,
42+
headerFilter: { visible: true },
43+
filterRow: { visible: true },
44+
filterPanel: { visible: true },
45+
filterValue: ['Text', '=', 'i'],
46+
columns: ['ID', {
47+
dataField: 'Text',
48+
selectedFilterOperation: '=',
49+
}],
50+
onEditorPreparing(e: any) {
51+
e.updateValueTimeout = 100;
52+
},
53+
}));
54+
1255
test('Filter row\'s height should be adjusted by content (T1072609)', async (t) => {
1356
const dataGrid = new DataGrid('#container');
1457
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);

packages/devextreme/testing/testcafe/tests/dataGrid/headerFilter/headerFilter.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,47 @@ fixture.disablePageReloads`Header Filter`
1010

1111
const GRID_CONTAINER = '#container';
1212

13+
test('Data should be filtered if (Blank) is selected in the header filter (T1257261)', async (t) => {
14+
const result: string[] = [];
15+
const dataGrid = new DataGrid(GRID_CONTAINER);
16+
const headerCell = dataGrid.getHeaders().getHeaderRow(0).getHeaderCell(1);
17+
const dataCell = dataGrid.getDataRow(0).getDataCell(0);
18+
const filterIconElement = headerCell.getFilterIcon();
19+
const headerFilter = new HeaderFilter();
20+
const buttons = headerFilter.getButtons();
21+
const list = headerFilter.getList();
22+
23+
await t
24+
.click(filterIconElement)
25+
.click(list.getItem(1).element) // Select second item with value 'Item 1'
26+
.click(buttons.nth(0)); // Click OK
27+
28+
result[0] = await dataCell.element().innerText;
29+
30+
await t
31+
.click(filterIconElement)
32+
.click(list.getItem(1).element) // Deselect second item with value 'Item 1'
33+
.click(list.getItem(0).element) // Select second item with value '(Blanks)'
34+
.click(buttons.nth(0)); // Click OK
35+
36+
result[1] = await dataCell.element().innerText;
37+
38+
await t.expect(result[0]).eql('1')
39+
.expect(result[1]).eql('2');
40+
}).before(async () => createWidget('dxDataGrid', {
41+
dataSource: [
42+
{ ID: 1, Text: 'Item 1' },
43+
{ ID: 2, Text: '' },
44+
{ ID: 3, Text: 'Item 3' },
45+
],
46+
keyExpr: 'ID',
47+
showBorders: true,
48+
remoteOperations: true,
49+
headerFilter: { visible: true },
50+
filterRow: { visible: true },
51+
filterPanel: { visible: true },
52+
}));
53+
1354
test('HeaderFilter icon should be grayed out after the clearFilter call (T1193648)', async (t) => {
1455
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
1556
const dataGrid = new DataGrid(GRID_CONTAINER);

0 commit comments

Comments
 (0)