Skip to content

Commit d3131b3

Browse files
authored
FilterBuilder - Fix value formatting - T1284504 (DevExpress#30337)
1 parent 3bf49c5 commit d3131b3

File tree

2 files changed

+51
-10
lines changed
  • e2e/testcafe-devextreme/tests/filterBuilder
  • packages/devextreme/js/__internal/filter_builder

2 files changed

+51
-10
lines changed

e2e/testcafe-devextreme/tests/filterBuilder/index.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable @typescript-eslint/no-misused-promises */
22
import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
33
import FilterBuilder from 'devextreme-testcafe-models/filterBuilder';
4+
import { DataType } from 'devextreme/ui/filter_builder';
45
import { createWidget } from '../../helpers/createWidget';
56
import url from '../../helpers/getPageUrl';
67
import { fields, filter } from './data';
@@ -62,3 +63,34 @@ test('Dropdown Treeview should have no empty space', async (t) => {
6263
allowHierarchicalFields: true,
6364
});
6465
});
66+
67+
[
68+
{ dataType: 'date', value: 1740441600000 },
69+
{ dataType: 'date', value: '2025-02-25T00:00:00.000Z' },
70+
{ dataType: 'date', value: new Date('2025-02-25T00:00:00.000Z') },
71+
{ dataType: 'datetime', value: 1740441600000 },
72+
{ dataType: 'datetime', value: '2025-02-25T00:00:00.000Z' },
73+
{ dataType: 'datetime', value: new Date('2025-02-25T00:00:00.000Z') },
74+
].forEach(({ dataType, value }) => {
75+
test(`item value text should be correct for dataType: ${dataType} and valueType: ${typeof value}`, async (t) => {
76+
const filterBuilder = new FilterBuilder('#container');
77+
78+
const date = new Date(value);
79+
const dateString = date.toLocaleDateString();
80+
const timeString = date.toLocaleTimeString('en-US', { hour: 'numeric', hour12: true, minute: '2-digit' });
81+
82+
const expectedValue = dataType === 'date' ? dateString : `${dateString}, ${timeString}`;
83+
84+
await t.expect(filterBuilder.getField(0).getValueText().textContent).eql(expectedValue);
85+
}).before(async () => {
86+
await createWidget('dxFilterBuilder', {
87+
fields: [
88+
{
89+
dataField: 'field1',
90+
dataType: dataType as DataType,
91+
},
92+
],
93+
value: ['field1', '=', value],
94+
});
95+
});
96+
});

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { compileGetter } from '@js/core/utils/data';
66
import { Deferred, when } from '@js/core/utils/deferred';
77
import { extend } from '@js/core/utils/extend';
88
import { captionize } from '@js/core/utils/inflector';
9-
import { isDefined, isFunction } from '@js/core/utils/type';
9+
import { isBoolean, isDefined, isFunction } from '@js/core/utils/type';
1010
import formatHelper from '@js/format_helper';
1111
import filterUtils from '@js/ui/shared/filtering';
1212
import errors from '@js/ui/widget/ui.errors';
@@ -54,8 +54,21 @@ const FILTER_BUILDER_ITEM_TEXT_PART_CLASS = `${FILTER_BUILDER_ITEM_TEXT_CLASS}-p
5454
const FILTER_BUILDER_ITEM_TEXT_SEPARATOR_CLASS = `${FILTER_BUILDER_ITEM_TEXT_CLASS}-separator`;
5555
const FILTER_BUILDER_ITEM_TEXT_SEPARATOR_EMPTY_CLASS = `${FILTER_BUILDER_ITEM_TEXT_SEPARATOR_CLASS}-empty`;
5656

57-
function getFormattedValueText(field, value) {
57+
function getFormattedValueText(field, value): string {
5858
const fieldFormat = field.format || DEFAULT_FORMAT[field.dataType];
59+
60+
if (isBoolean(value)) {
61+
const trueText: string = field.trueText || messageLocalization.format('dxDataGrid-trueText');
62+
const falseText: string = field.falseText || messageLocalization.format('dxDataGrid-falseText');
63+
64+
return value ? trueText : falseText;
65+
}
66+
67+
if (field.dataType === 'date' || field.dataType === 'datetime') {
68+
// value can be string or number, we need to convert it to Date object
69+
return formatHelper.format(new Date(value), fieldFormat);
70+
}
71+
5972
return formatHelper.format(value, fieldFormat);
6073
}
6174

@@ -562,21 +575,16 @@ export function getCurrentLookupValueText(field, value, handler) {
562575
}
563576

564577
function getPrimitiveValueText(field, value, customOperation, target, options?) {
565-
let valueText;
566-
if (value === true) {
567-
valueText = field.trueText || messageLocalization.format('dxDataGrid-trueText');
568-
} else if (value === false) {
569-
valueText = field.falseText || messageLocalization.format('dxDataGrid-falseText');
570-
} else {
571-
valueText = getFormattedValueText(field, value);
572-
}
578+
let valueText = getFormattedValueText(field, value);
579+
573580
if (field.customizeText) {
574581
valueText = field.customizeText.call(field, {
575582
value,
576583
valueText,
577584
target,
578585
});
579586
}
587+
580588
if (customOperation && customOperation.customizeText) {
581589
valueText = customOperation.customizeText.call(customOperation, {
582590
value,
@@ -585,6 +593,7 @@ function getPrimitiveValueText(field, value, customOperation, target, options?)
585593
target,
586594
}, options);
587595
}
596+
588597
return valueText;
589598
}
590599

0 commit comments

Comments
 (0)