Skip to content

Commit ff53976

Browse files
authored
FilterBuilder - First field uses the dataField property while subsequent fields use the name property in the filter value (T1253754) (#28353)
1 parent 1a1185d commit ff53976

File tree

3 files changed

+132
-2
lines changed

3 files changed

+132
-2
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import FilterBuilder from 'devextreme-testcafe-models/filterBuilder';
2+
import { createWidget } from '../../helpers/createWidget';
3+
import url from '../../helpers/getPageUrl';
4+
5+
fixture`FilterBuilder - Field naming`
6+
.page(url(__dirname, '../container.html'));
7+
8+
// T1253754
9+
test('FilterBuilder - First field uses the dataField property while subsequent fields use the name property in the filter value', async (t) => {
10+
const filterBuilder = new FilterBuilder('#container');
11+
12+
const expectedValues = [
13+
[
14+
['name1', '<>', 0],
15+
'and',
16+
['name1', 'contains', 'A'],
17+
],
18+
[
19+
['name1', '<>', 0],
20+
'and',
21+
['name2', 'contains', 'A'],
22+
],
23+
];
24+
await t
25+
.click(filterBuilder.getAddButton())
26+
.expect(FilterBuilder.getPopupTreeView().visible).ok()
27+
.click(FilterBuilder.getPopupTreeViewNode(0))
28+
.click(filterBuilder.getField(1, 'itemValue').element)
29+
.pressKey('A enter');
30+
31+
await t
32+
.expect(await filterBuilder.option('value'))
33+
.eql(expectedValues[0]);
34+
35+
await t
36+
.click(filterBuilder.getField(1, 'item').element)
37+
.expect(FilterBuilder.getPopupTreeView().visible).ok()
38+
.click(FilterBuilder.getPopupTreeViewNode(1))
39+
.click(filterBuilder.getField(1, 'itemValue').element)
40+
.pressKey('A enter');
41+
42+
await t
43+
.expect(await filterBuilder.option('value'))
44+
.eql(expectedValues[1]);
45+
})
46+
.before(async () => {
47+
await createWidget('dxFilterBuilder', {
48+
value: [
49+
['dataField1', '<>', 0],
50+
],
51+
fields: [
52+
{ dataField: 'dataField1', name: 'name1' },
53+
{ dataField: 'dataField2', name: 'name2' },
54+
],
55+
});
56+
});

packages/devextreme/js/__internal/filter_builder/m_filter_builder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ class FilterBuilder extends Widget<any> {
485485
const getFullCaption = function (item, items) {
486486
return allowHierarchicalFields ? getCaptionWithParents(item, items) : item.caption;
487487
};
488+
condition[0] = item.name || item.dataField;
488489

489490
const $fieldButton = this._createButtonWithMenu({
490491
caption: getFullCaption(item, items),

packages/testcafe-models/filterBuilder/index.ts

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
1-
import { Selector } from 'testcafe';
1+
import { ClientFunction, Selector } from 'testcafe';
22
import type { WidgetName } from '../types';
33
import Widget from '../internal/widget';
44
import Field from './field';
55

6-
type FieldType = 'item' | 'groupOperation' | 'itemOperation' | 'itemAction';
6+
type FieldType = 'item' | 'groupOperation' | 'itemOperation' | 'itemAction' | 'itemValue';
77
const CLASS = {
8+
root: 'dx-filterbuilder',
9+
group: 'dx-filterbuilder-group',
10+
groupItem: 'dx-filterbuilder-group-item',
11+
addButton: 'dx-icon-plus',
12+
removeButton: 'dx-icon-remove',
813
item: 'dx-filterbuilder-item-field',
914
popupContent: 'dx-popup-content',
1015
treeView: 'dx-treeview',
1116
treeViewLeaf: 'dx-treeview-node-is-leaf',
1217
groupOperation: 'dx-filterbuilder-group-operation',
1318
itemOperation: 'dx-filterbuilder-item-operation',
19+
itemValue: 'dx-filterbuilder-item-value-text',
1420
itemAction: 'dx-filterbuilder-action',
1521
};
1622

@@ -31,4 +37,71 @@ export default class FilterBuilder extends Widget {
3137
const fields = this.element.find(`.${cssClass}`);
3238
return new Field(fields.nth(index));
3339
}
40+
41+
getRootElement(): Selector {
42+
return this.element.find(`.${CLASS.root}`);
43+
}
44+
45+
getGroupByLevel(level): Selector {
46+
return this.element.find(`.${CLASS.group}`).nth(level - 1);
47+
}
48+
49+
getGroupItem(level?): Selector {
50+
if(level) {
51+
return this.getGroupByLevel(level).find(`.${CLASS.groupItem}`);
52+
}
53+
return this.element.find(`.${CLASS.groupItem}`);
54+
}
55+
56+
getOperationButton(level?): Selector {
57+
if(level) {
58+
return this.getGroupByLevel(level).find(`.${CLASS.groupOperation}`);
59+
}
60+
return this.element.find(`.${CLASS.groupOperation}`);
61+
}
62+
63+
getAddButton(level?): Selector {
64+
if(level) {
65+
return this.getGroupByLevel(level).find(`.${CLASS.addButton}`);
66+
}
67+
return this.element.find(`.${CLASS.addButton}`);
68+
}
69+
70+
getRemoveButton(index?): Selector {
71+
if(index) {
72+
return this.element.find(`.${CLASS.removeButton}`).nth(index);
73+
}
74+
return this.element.find(`.${CLASS.removeButton}`);
75+
}
76+
77+
getItem(item, index?) {
78+
var className;
79+
switch(item) {
80+
case 'operation':
81+
className = CLASS.itemOperation;
82+
break;
83+
case 'field':
84+
className = CLASS.item;
85+
break;
86+
case 'value':
87+
className = CLASS.itemValue;
88+
break;
89+
default:
90+
throw new Error(`Unsupported class name: ${className}`);
91+
}
92+
93+
if(index) {
94+
return this.element.find(`.${className}`).nth(index);
95+
}
96+
return this.element.find(`.${className}`);
97+
}
98+
99+
isReady(): Promise<boolean> {
100+
const { getInstance } = this;
101+
102+
return ClientFunction(
103+
() => (getInstance() as any).isReady(),
104+
{ dependencies: { getInstance } },
105+
)();
106+
}
34107
}

0 commit comments

Comments
 (0)