Skip to content

Commit 84325e9

Browse files
fix using global format in header fiter in dataGrid
1 parent ca5abee commit 84325e9

2 files changed

Lines changed: 83 additions & 11 deletions

File tree

packages/devextreme/js/__internal/ui/number_box/m_number_box.mask.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
isDefined, isFunction, isNumeric, isString,
1313
} from '@js/core/utils/type';
1414
import type { Properties } from '@js/ui/number_box';
15+
import { getGlobalFormatByDataType } from '@ts/core/m_global_format_config';
1516

1617
import NumberBoxBase from './m_number_box.base';
1718
import {
@@ -92,9 +93,18 @@ class NumberBoxMask extends NumberBoxBase<NumberBoxMaskProperties> {
9293
};
9394
}
9495

96+
_getEffectiveFormatOption() {
97+
const format = this.option('format');
98+
return isDefined(format)
99+
? format
100+
: getGlobalFormatByDataType('number');
101+
}
102+
95103
_getTextSeparatorIndex(text) {
96104
const decimalSeparator = number.getDecimalSeparator();
97-
const realSeparatorOccurrenceIndex = getRealSeparatorIndex(this.option('format')).occurrence;
105+
const formatPattern = this._getFormatPattern();
106+
const patternString = isString(formatPattern) ? formatPattern : '';
107+
const realSeparatorOccurrenceIndex = getRealSeparatorIndex(patternString).occurrence;
98108
return getNthOccurrence(text, decimalSeparator, realSeparatorOccurrenceIndex);
99109
}
100110

@@ -336,10 +346,8 @@ class NumberBoxMask extends NumberBoxBase<NumberBoxMaskProperties> {
336346
}
337347

338348
_parse(text, format) {
339-
const formatOption = this.option('format');
340-
// @ts-expect-error ts-error
349+
const formatOption = this._getEffectiveFormatOption();
341350
const isCustomParser = isFunction(formatOption.parser);
342-
// @ts-expect-error ts-error
343351
const parser = isCustomParser ? formatOption.parser : number.parse;
344352
let integerPartStartIndex = 0;
345353

@@ -361,8 +369,7 @@ class NumberBoxMask extends NumberBoxBase<NumberBoxMaskProperties> {
361369
}
362370

363371
_format(value, format) {
364-
const formatOption = this.option('format');
365-
// @ts-expect-error ts-error
372+
const formatOption = this._getEffectiveFormatOption();
366373
const customFormatter = formatOption?.formatter || formatOption;
367374
const formatter = isFunction(customFormatter) ? customFormatter : number.format;
368375

@@ -380,11 +387,9 @@ class NumberBoxMask extends NumberBoxBase<NumberBoxMaskProperties> {
380387
}
381388

382389
_updateFormat(): void {
383-
const { format } = this.option();
384-
// @ts-expect-error ts-error
390+
const format = this._getEffectiveFormatOption();
385391
const isCustomParser = isFunction(format?.parser);
386392
const isLDMLPattern = isString(format) && (format.includes('0') || format.includes('#'));
387-
// @ts-expect-error ts-error
388393
const isExponentialFormat = format === 'exponential' || format?.type === 'exponential';
389394
const shouldUseFormatAsIs = isCustomParser || isLDMLPattern || isExponentialFormat;
390395

@@ -568,8 +573,7 @@ class NumberBoxMask extends NumberBoxBase<NumberBoxMaskProperties> {
568573

569574
_useMaskBehavior(): boolean {
570575
const { useMaskBehavior } = this.option();
571-
// @ts-expect-error ts-error
572-
return !!this.option('format') && useMaskBehavior;
576+
return !!this._getEffectiveFormatOption() && !!useMaskBehavior;
573577
}
574578

575579
_renderInputType(): void {

packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/headerFilter.tests.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import viewPortUtils from 'core/utils/view_port';
1717
import fx from 'common/core/animation/fx';
1818
import messageLocalization from 'common/core/localization/message';
1919
import dateSerialization from 'core/utils/date_serialization';
20+
import config from 'core/config';
2021
import { ListSearchBoxWrapper } from '../../helpers/wrappers/searchBoxWrappers.js';
2122

2223
const TREEVIEW_ITEM_CLASS = 'dx-treeview-item';
@@ -2751,6 +2752,73 @@ QUnit.module('Header Filter with real columnsController', {
27512752
assert.deepEqual(items[0].data, { Test2: 'value1' }, 'data of the first item');
27522753
});
27532754

2755+
QUnit.test('Blank item text should not be formatted by global numberFormat', function(assert) {
2756+
// arrange
2757+
const that = this;
2758+
const testElement = $('#container');
2759+
const savedConfig = { ...config() };
2760+
2761+
try {
2762+
config({
2763+
...config(),
2764+
numberFormat: '+#'
2765+
});
2766+
that.options.dataSource = [{ Test2: 'value1' }, { Test1: 6, Test2: 'value2' }];
2767+
that.options.columns[0] = { dataField: 'Test1', dataType: 'number', allowHeaderFiltering: true };
2768+
that.setupDataGrid();
2769+
that.columnHeadersView.render(testElement);
2770+
that.headerFilterView.render(testElement);
2771+
2772+
// act
2773+
that.headerFilterController.showHeaderFilterMenu(0);
2774+
const $popupContent = that.headerFilterView.getPopupContainer().$content();
2775+
2776+
// assert
2777+
assert.strictEqual($popupContent.find('.dx-list-item').first().text(), '(Blanks)', 'empty text item');
2778+
} finally {
2779+
config(savedConfig);
2780+
}
2781+
});
2782+
2783+
QUnit.test('Filtering by empty string in number column with global numberFormat', function(assert) {
2784+
// arrange
2785+
const that = this;
2786+
let items;
2787+
const testElement = $('#container');
2788+
const savedConfig = { ...config() };
2789+
2790+
try {
2791+
config({
2792+
...config(),
2793+
numberFormat: '+#'
2794+
});
2795+
2796+
that.options.dataSource = [{ Test1: '', Test2: 'value1' }, { Test1: 6, Test2: 'value2' }];
2797+
that.options.columns[0] = { dataField: 'Test1', dataType: 'number', allowHeaderFiltering: true };
2798+
that.setupDataGrid();
2799+
that.columnHeadersView.render(testElement);
2800+
that.headerFilterView.render(testElement);
2801+
2802+
// act
2803+
that.headerFilterController.showHeaderFilterMenu(0);
2804+
const $popupContent = that.headerFilterView.getPopupContainer().$content();
2805+
2806+
// assert
2807+
assert.strictEqual($popupContent.find('.dx-list-item').first().text(), '(Blanks)', 'empty text item');
2808+
2809+
// act
2810+
$($popupContent.parent().find('.dx-list-item').first()).trigger('dxclick');
2811+
$($popupContent.parent().find('.dx-button').first()).trigger('dxclick');
2812+
2813+
// assert
2814+
items = that.dataController.items();
2815+
assert.equal(items.length, 1, 'count items');
2816+
assert.deepEqual(items[0].data, { Test1: '', Test2: 'value1' }, 'data of the first item');
2817+
} finally {
2818+
config(savedConfig);
2819+
}
2820+
});
2821+
27542822
// T372825
27552823
QUnit.test('Filtering by empty string', function(assert) {
27562824
// arrange

0 commit comments

Comments
 (0)