From d05f5b0bed0f5c2104eb34e29528a6d03650bcfe Mon Sep 17 00:00:00 2001 From: Vladimir Bushmanov Date: Mon, 27 Jan 2025 09:28:03 +0100 Subject: [PATCH] T1272535: DataGrid - fix base sensitivity search in lookup column (#28751) Co-authored-by: CORP\vladimir.bushmanov --- .../tests/dataGrid/searchPanel.ts | 41 +++++++++++++++++++ .../grids/grid_core/search/m_search.ts | 31 +++++++++++--- packages/devextreme/js/data/data_source.d.ts | 20 +++++---- packages/devextreme/ts/dx.all.d.ts | 1 + 4 files changed, 78 insertions(+), 15 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/searchPanel.ts b/e2e/testcafe-devextreme/tests/dataGrid/searchPanel.ts index d9c657469f93..089a207a5e38 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/searchPanel.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/searchPanel.ts @@ -51,3 +51,44 @@ safeSizeTest('searchPanel has correct view inside masterDetail', async (t) => { }, }); }).after(async () => { await changeTheme(Themes.genericLight); }); + +// T1272535 +safeSizeTest('Base sensitivity search should accept rows with accent letters in lookup columns', async (t) => { + const dataGrid = new DataGrid('#container'); + + await t + .click(dataGrid.getSearchBox().input) + .pressKey('a'); + + await t.expect(dataGrid.dataRows.count).eql(2); + await t.expect(dataGrid.dataRows.withText('another').exists).ok(); + await t.expect(dataGrid.dataRows.withText('ánother').exists).ok(); +}, [800, 800]).before(async () => createWidget('dxDataGrid', { + dataSource: { + store: [ + { id: 1, text: 'tešt', lookup: 1 }, + { id: 2, text: 'test', lookup: 2 }, + { id: 3, text: 'chest', lookup: 3 }, + ], + langParams: { + locale: 'en-US', + collatorOptions: { + sensitivity: 'base', + }, + }, + }, + keyExpr: 'id', + searchPanel: { visible: true }, + columns: ['id', 'text', { + dataField: 'lookup', + lookup: { + dataSource: [ + { id: 1, text: 'another' }, + { id: 2, text: 'ánother' }, + { id: 3, text: 'other' }, + ], + valueExpr: 'id', + displayExpr: 'text', + }, + }], +})); diff --git a/packages/devextreme/js/__internal/grids/grid_core/search/m_search.ts b/packages/devextreme/js/__internal/grids/grid_core/search/m_search.ts index 39d39f9d65d9..30d0a86685fb 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/search/m_search.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/search/m_search.ts @@ -1,6 +1,7 @@ /* eslint-disable max-classes-per-file */ /* eslint-disable @typescript-eslint/method-signature-style */ import messageLocalization from '@js/common/core/localization/message'; +import type { LangParams } from '@js/common/data'; import dataQuery from '@js/common/data/query'; import domAdapter from '@js/core/dom_adapter'; import $ from '@js/core/renderer'; @@ -56,8 +57,11 @@ const dataController = ( } protected _calculateAdditionalFilter(): Filter { + const dataSource = this._dataController?.getDataSource?.(); + const langParams = dataSource?.loadOptions?.()?.langParams; + const filter = super._calculateAdditionalFilter(); - const searchFilter = this.calculateSearchFilter(this.option('searchPanel.text')); + const searchFilter = this.calculateSearchFilter(this.option('searchPanel.text'), langParams); return gridCoreUtils.combineFilters([filter, searchFilter]); } @@ -66,8 +70,7 @@ const dataController = ( this.option('searchPanel.text', text); } - private calculateSearchFilter(text: string | undefined): Filter { - let i; + private calculateSearchFilter(text: string | undefined, langParams?: LangParams): Filter { let column; const columns = this._columnsController.getColumns(); const searchVisibleColumnsOnly = this.option('searchPanel.searchVisibleColumnsOnly'); @@ -87,7 +90,7 @@ const dataController = ( } } - for (i = 0; i < columns.length; i++) { + for (let i = 0; i < columns.length; i++) { column = columns[i]; if (searchVisibleColumnsOnly && !column.visible) continue; @@ -95,9 +98,25 @@ const dataController = ( if (allowSearch(column) && column.calculateFilterExpression) { lookup = column.lookup; const filterValue = parseValue(column, text); - if (lookup && lookup.items) { + + if (lookup?.items) { // @ts-expect-error - dataQuery(lookup.items).filter(column.createFilterExpression.call({ dataField: lookup.displayExpr, dataType: lookup.dataType, calculateFilterExpression: column.calculateFilterExpression }, filterValue, null, 'search')).enumerate().done(onQueryDone); + dataQuery(lookup.items, { langParams }) + // @ts-expect-error + .filter( + column.createFilterExpression.call( + { + dataField: lookup.displayExpr, + dataType: lookup.dataType, + calculateFilterExpression: column.calculateFilterExpression, + }, + filterValue, + null, + 'search', + ), + ) + .enumerate() + .done(onQueryDone); } else if (filterValue !== undefined) { filters.push(column.createFilterExpression(filterValue, null, 'search')); } diff --git a/packages/devextreme/js/data/data_source.d.ts b/packages/devextreme/js/data/data_source.d.ts index 3adcca7fb4b5..d80f91ca37fb 100644 --- a/packages/devextreme/js/data/data_source.d.ts +++ b/packages/devextreme/js/data/data_source.d.ts @@ -1,13 +1,14 @@ import { - DataSource, - DataSourceOptions, - FilterDescriptor, - GroupDescriptor, - SearchOperation, - SelectDescriptor, - SortDescriptor, - Store, - StoreOptions, + DataSource, + DataSourceOptions, + FilterDescriptor, + GroupDescriptor, + LangParams, + SearchOperation, + SelectDescriptor, + SortDescriptor, + Store, + StoreOptions, } from '../common/data'; export { @@ -40,6 +41,7 @@ export interface DataSourceOptionsStub< expand?: Array | string; filter?: FilterDescriptor | Array; group?: GroupDescriptor | Array>; + langParams?: LangParams; map?: ((dataItem: TStoreItem) => TMappedItem); onChanged?: ((e: { readonly changes?: Array }) => void); onLoadError?: ((error: { readonly message?: string }) => void); diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 3c9672dc6390..86fd59dd780b 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -6882,6 +6882,7 @@ declare module DevExpress.data { group?: | DevExpress.common.data.GroupDescriptor | Array>; + langParams?: DevExpress.common.data.LangParams; map?: (dataItem: TStoreItem) => TMappedItem; onChanged?: (e: { readonly changes?: Array }) => void; onLoadError?: (error: { readonly message?: string }) => void;