Skip to content

Commit 03ae077

Browse files
authored
CardView - computed columns fixes (#30123)
1 parent 03898e2 commit 03ae077

File tree

29 files changed

+347
-42
lines changed

29 files changed

+347
-42
lines changed

apps/demos/Demos/CardView/Overview/Angular/app/app.component.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
<dxi-card-view-column
2525
caption="Full Name"
2626
[calculateFieldValue]="calculateFullName"
27+
[allowFiltering]="true"
28+
[allowSorting]="true"
2729
></dxi-card-view-column>
2830
<dxi-card-view-column
2931
caption="Position"
@@ -38,6 +40,8 @@
3840
<dxi-card-view-column
3941
caption="Address"
4042
[calculateFieldValue]="calculateAddress"
43+
[allowFiltering]="true"
44+
[allowSorting]="true"
4145
></dxi-card-view-column>
4246

4347
<div

apps/demos/Demos/CardView/Overview/React/App.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ function App() {
107107
/>
108108
<Column
109109
caption="Full Name"
110+
allowFiltering={true}
111+
allowSorting={true}
110112
calculateFieldValue={calculateFullName}
111113
/>
112114
<Column
@@ -125,6 +127,8 @@ function App() {
125127
/>
126128
<Column
127129
caption="Address"
130+
allowFiltering={true}
131+
allowSorting={true}
128132
calculateFieldValue={calculateAddress}
129133
/>
130134
</CardView>

apps/demos/Demos/CardView/Overview/ReactJs/App.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ function App() {
101101
/>
102102
<Column
103103
caption="Full Name"
104+
allowFiltering={true}
105+
allowSorting={true}
104106
calculateFieldValue={calculateFullName}
105107
/>
106108
<Column
@@ -115,6 +117,8 @@ function App() {
115117
/>
116118
<Column
117119
caption="Address"
120+
allowFiltering={true}
121+
allowSorting={true}
118122
calculateFieldValue={calculateAddress}
119123
/>
120124
</CardView>

apps/demos/Demos/CardView/Overview/Vue/App.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
/>
2929
<DxColumn
3030
caption="Full Name"
31+
:allow-filtering="true"
32+
:allow-sorting="true"
3133
:calculate-field-value="calculateFullName"
3234
/>
3335
<DxColumn
@@ -46,6 +48,8 @@
4648
/>
4749
<DxColumn
4850
caption="Address"
51+
:allow-filtering="true"
52+
:allow-sorting="true"
4953
:calculate-field-value="calculateAddress"
5054
/>
5155
<template

apps/demos/Demos/CardView/Overview/jQuery/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ $(() => {
3232
},
3333
{
3434
caption: 'Full Name',
35+
allowFiltering: true,
36+
allowSorting: true,
3537
calculateFieldValue({ First_Name, Last_Name }) {
3638
return `${First_Name} ${Last_Name}`;
3739
},
@@ -52,6 +54,8 @@ $(() => {
5254
},
5355
{
5456
caption: 'Address',
57+
allowFiltering: true,
58+
allowSorting: true,
5559
calculateFieldValue({ State, City }) {
5660
return `${City}, ${State}`;
5761
}

e2e/testcafe-devextreme/tests/cardView/headerFilter/api.functional.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ test('getCombinedFilter API', async (t) => {
7171
}).before(async () => {
7272
await createWidget('dxCardView', {
7373
...baseConfig,
74+
remoteOperations: true, // NOTE: for more easy match of selector. If local, selector is func
7475
});
7576
});
7677

e2e/testcafe-devextreme/tests/cardView/headerFilter/common.functional.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ test('Filtering should work when a custom data source is specified as an array o
500500
}).before(async () => {
501501
await createWidget('dxCardView', {
502502
...baseConfig,
503+
remoteOperations: true, // NOTE: for more easy match of selector. If local, selector is func
503504
columns: [
504505
{
505506
dataField: 'id',
@@ -523,6 +524,54 @@ test('Filtering should work when a custom data source is specified as an array o
523524
});
524525
});
525526

527+
test('Filtering should work with computed column', async (t) => {
528+
const cardView = new CardView('#container');
529+
530+
await t.click(cardView.getHeaderPanel().getHeaderItem(0).getFilterIcon());
531+
532+
await t
533+
.expect(cardView.getHeaderFilterList().getItems().count)
534+
.eql(4);
535+
536+
await t
537+
.click(cardView.getHeaderFilterList().getItem(0).element)
538+
.click(cardView.getHeaderFilterPopup().getOkButton().element);
539+
540+
await t
541+
.expect(cardView.getCards().count)
542+
.eql(1)
543+
.expect(cardView.getCard(0).getFieldValueCell('Computed').textContent)
544+
.eql('str_0');
545+
546+
await t.click(cardView.getHeaderPanel().getHeaderItem(0).getFilterIcon());
547+
await t
548+
.click(cardView.getHeaderFilterList().getItem(2).element)
549+
.click(cardView.getHeaderFilterPopup().getOkButton().element);
550+
551+
await t
552+
.expect(cardView.getCards().count)
553+
.eql(2)
554+
.expect(cardView.getCard(0).getFieldValueCell('Computed').textContent)
555+
.eql('str_0')
556+
.expect(cardView.getCard(1).getFieldValueCell('Computed').textContent)
557+
.eql('str_2');
558+
}).before(async () => {
559+
await createWidget('dxCardView', {
560+
dataSource: [
561+
{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 },
562+
],
563+
keyExpr: 'id',
564+
headerFilter: { visible: true },
565+
columns: [
566+
{
567+
caption: 'Computed',
568+
allowFiltering: true,
569+
calculateFieldValue: ({ id }) => `str_${id}`,
570+
},
571+
],
572+
});
573+
});
574+
526575
test('The item\'s selection state should be correct when a custom data source is specified as an array of filter expressions', async (t) => {
527576
// arrange
528577
const cardView = new CardView('#container');
@@ -551,6 +600,7 @@ test('The item\'s selection state should be correct when a custom data source is
551600
}).before(async () => {
552601
await createWidget('dxCardView', {
553602
...baseConfig,
603+
remoteOperations: true, // NOTE: for more easy match of selector. If local, selector is func
554604
columns: [
555605
{
556606
dataField: 'id',

e2e/testcafe-devextreme/tests/cardView/headerFilter/local.functional.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ test('list should contain all values from computed column', async (t) => {
110110
columns: [
111111
{
112112
caption: 'Computed',
113+
allowFiltering: true,
113114
calculateFieldValue: (data) => `${data.A}_${data.B}`,
114115
},
115116
],

e2e/testcafe-devextreme/tests/cardView/sorting/behavior.functional.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,41 @@ const CLEAR_SORTING_MENUITEM_INDEX = 2;
474474
});
475475
});
476476
});
477+
478+
test('Sorting should work with computed columns', async (t) => {
479+
const cardView = new CardView('#container');
480+
const headerItem = cardView.getHeaders().getHeaderItemByText('Computed');
481+
482+
await t.click(headerItem.element);
483+
484+
const getCardTexts = async () => {
485+
await t.expect(cardView.getCards().count).eql(4);
486+
487+
return [
488+
await cardView.getCard(0).getFieldValueCell('Computed').textContent,
489+
await cardView.getCard(1).getFieldValueCell('Computed').textContent,
490+
await cardView.getCard(2).getFieldValueCell('Computed').textContent,
491+
await cardView.getCard(3).getFieldValueCell('Computed').textContent,
492+
];
493+
};
494+
495+
await t.expect(await getCardTexts()).eql(['str_0', 'str_1', 'str_2', 'str_3']);
496+
497+
await t.click(headerItem.element);
498+
499+
await t.expect(await getCardTexts()).eql(['str_3', 'str_2', 'str_1', 'str_0']);
500+
}).before(async () => {
501+
await createWidget('dxCardView', {
502+
dataSource: [
503+
{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 },
504+
],
505+
keyExpr: 'id',
506+
columns: [
507+
{
508+
caption: 'Computed',
509+
allowSorting: true,
510+
calculateFieldValue: ({ id }) => `str_${id}`,
511+
},
512+
],
513+
});
514+
});

packages/devextreme/js/__internal/grids/new/grid_core/columns_controller/__snapshots__/columns_controller.test.ts.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ exports[`ColumnsController columns should contain processed column configs 1`] =
3939
},
4040
"headerItemTemplate": undefined,
4141
"name": "a",
42+
"selector": [Function],
4243
"setFieldValue": [Function],
4344
"showInColumnChooser": true,
4445
"trueText": "true",
@@ -83,6 +84,7 @@ exports[`ColumnsController columns should contain processed column configs 1`] =
8384
},
8485
"headerItemTemplate": undefined,
8586
"name": "b",
87+
"selector": [Function],
8688
"setFieldValue": [Function],
8789
"showInColumnChooser": true,
8890
"trueText": "true",
@@ -127,6 +129,7 @@ exports[`ColumnsController columns should contain processed column configs 1`] =
127129
},
128130
"headerItemTemplate": undefined,
129131
"name": "c",
132+
"selector": [Function],
130133
"setFieldValue": [Function],
131134
"showInColumnChooser": true,
132135
"trueText": "true",

0 commit comments

Comments
 (0)