From d07796e239e4e14a094bb18152d4ee8856f42d1d Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 1 Oct 2026 11:07:31 +0800 Subject: [PATCH 1/5] T-1 --- ..._controller.ts => ai_column_controller.ts} | 21 ++++++-- .../m_ai_prompt_editor_view_controller.ts | 2 +- .../grids/grid_core/ai_column/index.ts | 6 +-- ...{m_ai_column_view.ts => ai_column_view.ts} | 19 ++++--- ...ditor_view.ts => ai_prompt_editor_view.ts} | 4 +- .../views/m_ai_prompt_editor_view.test.ts | 2 +- .../column_headers/m_column_headers.ts | 3 +- .../grids/grid_core/focus/focus_utils.ts | 50 +++++++++++++++++++ .../grids/grid_core/focus/m_focus.ts | 4 +- .../grids/grid_core/focus/m_focus_utils.ts | 33 ------------ .../js/__internal/grids/grid_core/m_types.ts | 4 +- ...t.ts => master_detail.integration.test.ts} | 2 + .../grids/grid_core/views/m_columns_view.ts | 3 +- .../__internal/grids/grid_core/views/types.ts | 15 ++++++ 14 files changed, 112 insertions(+), 56 deletions(-) rename packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/{m_ai_column_controller.ts => ai_column_controller.ts} (96%) rename packages/devextreme/js/__internal/grids/grid_core/ai_column/views/{m_ai_column_view.ts => ai_column_view.ts} (89%) rename packages/devextreme/js/__internal/grids/grid_core/ai_column/views/{m_ai_prompt_editor_view.ts => ai_prompt_editor_view.ts} (97%) create mode 100644 packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts delete mode 100644 packages/devextreme/js/__internal/grids/grid_core/focus/m_focus_utils.ts rename packages/devextreme/js/__internal/grids/grid_core/master_detail/{m_master_detail.integration.test.ts => master_detail.integration.test.ts} (92%) diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts similarity index 96% rename from packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_controller.ts rename to packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts index 2328ef50f36b..4111c2356e2a 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts @@ -16,6 +16,17 @@ import type { InternalRequestCallbacks } from '../types'; import { getAICommandColumnDefaultOptions, isAIColumnAutoMode, isPromptOption } from '../utils'; import { AIColumnIntegrationController } from './m_ai_column_integration_controller'; +const getDefaultCellValue = ( + column: Column, + cellValue: string | undefined, +): string | null => { + if (cellValue === undefined) { + return column.ai?.emptyText ?? null; + } + + return column.ai?.noDataText ?? null; +}; + export class AIColumnController extends Controller { private dataController!: DataController; @@ -68,15 +79,17 @@ export class AIColumnController extends Controller { } private addAICommandColumn(): void { - const that = this; - const { dataSourceController, aiColumnIntegrationController } = this; + const { + dataSourceController, + aiColumnIntegrationController, + } = this; this.columnsController.addCommandColumn({ ...getAICommandColumnDefaultOptions(), calculateCellValue(data: RawItemData) { const key = dataSourceController.keyOf(data); const cellValue = aiColumnIntegrationController.getAIColumnText(this.name, key); - const defaultValue = that.getDefaultCellValue(this, cellValue); + const defaultValue = getDefaultCellValue(this, cellValue); // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing return cellValue || defaultValue; @@ -282,7 +295,7 @@ export class AIColumnController extends Controller { // API methods - public publicMethods() { + public publicMethods(): string[] { return [ 'abortAIColumnRequest', 'sendAIColumnRequest', diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_prompt_editor_view_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_prompt_editor_view_controller.ts index 917232df34c0..e15ee024f242 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_prompt_editor_view_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_prompt_editor_view_controller.ts @@ -1,7 +1,7 @@ import type { Column } from '@ts/grids/grid_core/columns_controller/types'; import { ViewController } from '../../m_modules'; -import type { AIPromptEditorView } from '../views/m_ai_prompt_editor_view'; +import type { AIPromptEditorView } from '../views/ai_prompt_editor_view'; export class AIPromptEditorViewController extends ViewController { private aiPromptEditorView!: AIPromptEditorView; diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts index bbb95345a557..7952ede441dc 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts @@ -1,4 +1,4 @@ -export { AIColumnController } from './controllers/m_ai_column_controller'; +export { AIColumnController } from './controllers/ai_column_controller'; export { AIPromptEditorViewController } from './controllers/m_ai_prompt_editor_view_controller'; -export { columnHeadersViewExtender } from './views/m_ai_column_view'; -export { AIPromptEditorView } from './views/m_ai_prompt_editor_view'; +export { columnHeadersViewExtender } from './views/ai_column_view'; +export { AIPromptEditorView } from './views/ai_prompt_editor_view'; diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_column_view.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_column_view.ts similarity index 89% rename from packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_column_view.ts rename to packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_column_view.ts index 54d4a0983e35..ff589517e46b 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_column_view.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_column_view.ts @@ -8,8 +8,9 @@ import type { Column } from '@ts/grids/grid_core/columns_controller/types'; import type { ColumnHeadersView } from '../../column_headers/m_column_headers'; import type { ColumnsResizerViewController } from '../../columns_resizing_reordering/m_columns_resizing_reordering'; import type { ModuleType } from '../../m_types'; +import type { ColumnViewTemplate } from '../../views/types'; import { AI_COLUMN_NAME, CLASSES, ICON_NAMES } from '../const'; -import type { AIColumnController } from '../controllers/m_ai_column_controller'; +import type { AIColumnController } from '../controllers/ai_column_controller'; import type { AIPromptEditorViewController } from '../controllers/m_ai_prompt_editor_view_controller'; import { createAIHeaderContainer, createChatSparkleOutlineIcon } from '../dom'; import { @@ -20,7 +21,7 @@ import { export const columnHeadersViewExtender = ( Base: ModuleType, -) => class AIColumnHeadersViewExtender extends Base { +): ModuleType => class AIColumnHeadersViewExtender extends Base { private aiColumnController!: AIColumnController; private aiPromptEditorController!: AIPromptEditorViewController; @@ -29,7 +30,9 @@ export const columnHeadersViewExtender = ( private activeDropDownButtonInstance!: DropDownButton | null; - private aiColumnOptionChangedHandler!: (column: Column, optionName: string, value: unknown) => void; + private aiColumnOptionChangedHandler!: ( + column: Column, optionName: string, value: unknown, + ) => void; private getDropDownButtonItems(column: Column): Item[] { return [ @@ -75,6 +78,7 @@ export const columnHeadersViewExtender = ( // eslint-disable-next-line default-case switch (actionName) { case 'autoFill': + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.aiPromptEditorController.show($container[0], column); break; case 'regenerate': @@ -138,16 +142,17 @@ export const columnHeadersViewExtender = ( super.getHeaderDefaultTemplate($container, options); } - protected _processTemplate(template, options) { + protected _processTemplate(template, options): ColumnViewTemplate { const renderingTemplate = super._processTemplate(template, options); + const { column } = options; const needToRenderHeaderDropDownButton = isAIColumnHeader(options.column, options.rowType) && isHeaderDropDownButtonVisible(options.column); if (renderingTemplate && needToRenderHeaderDropDownButton) { return { - render: (args) => { + render: (args): void => { renderingTemplate.render(args); - this.renderHeaderDropDownButton(args.model.column, $(args.container)); + this.renderHeaderDropDownButton(column, $(args.container)); }, }; } @@ -180,7 +185,9 @@ export const columnHeadersViewExtender = ( * when the cell resize is initiated. * Calling this method is necessary to fix bug T252661. */ + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.activeDropDownButtonInstance?.close(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.aiPromptEditorController.hide(); }); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_prompt_editor_view.ts similarity index 97% rename from packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.ts rename to packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_prompt_editor_view.ts index 9309f4ed8b3d..d81e1ce30188 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_prompt_editor_view.ts @@ -8,7 +8,7 @@ import type { ColumnsController } from '../../columns_controller/m_columns_contr import { getColumnHeaderCellSelector } from '../../columns_controller/m_columns_controller_utils'; import { View } from '../../m_modules'; import { AI_COLUMN_NAME } from '../const'; -import type { AIColumnController } from '../controllers/m_ai_column_controller'; +import type { AIColumnController } from '../controllers/ai_column_controller'; import { isAIColumnAutoMode, isEditorOptions, @@ -85,7 +85,7 @@ export class AIPromptEditorView extends View { } } - private ensureAIPromptEditorVisibility() { + private ensureAIPromptEditorVisibility(): void { const aiColumns = this.aiColumnController.getAIColumns(); const aiColumnsWithVisiblePopup = aiColumns.filter((column) => column.ai?.popup?.visible); if (aiColumnsWithVisiblePopup.length > 0) { diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.test.ts index 545a6e9038f3..930456862bf5 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.test.ts @@ -16,7 +16,7 @@ import { AIPromptEditorModel } from '@ts/grids/grid_core/__tests__/__mock__/mode import type { Column } from '@ts/grids/grid_core/columns_controller/types'; import { AIPromptEditor } from '../../ai_prompt_editor/ai_prompt_editor'; -import { AIPromptEditorView } from './m_ai_prompt_editor_view'; +import { AIPromptEditorView } from './ai_prompt_editor_view'; jest.mock('../../ai_prompt_editor/ai_prompt_editor', (): any => { const original = jest.requireActual('../../ai_prompt_editor/ai_prompt_editor'); diff --git a/packages/devextreme/js/__internal/grids/grid_core/column_headers/m_column_headers.ts b/packages/devextreme/js/__internal/grids/grid_core/column_headers/m_column_headers.ts index 5dca9395492f..197b3b2f753b 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/column_headers/m_column_headers.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/column_headers/m_column_headers.ts @@ -16,6 +16,7 @@ import { CLASSES as REORDERING_CLASSES } from '../columns_resizing_reordering/co import type { HeadersKeyboardNavigationController } from '../keyboard_navigation/m_headers_keyboard_navigation'; import { registerKeyboardAction } from '../m_accessibility'; import { ColumnsView } from '../views/m_columns_view'; +import type { ColumnViewTemplate } from '../views/types'; import { CLASSES } from './const'; const HEADERS_CLASS = 'headers'; @@ -197,7 +198,7 @@ export class ColumnHeadersView extends ColumnContextMenuMixin(ColumnsView) { }; } - protected _processTemplate(template, options) { + protected _processTemplate(template, options): ColumnViewTemplate { const that = this; let resultTemplate; const { column } = options; diff --git a/packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts b/packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts new file mode 100644 index 000000000000..c8c5e3bd6e7e --- /dev/null +++ b/packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts @@ -0,0 +1,50 @@ +import dateSerialization from '@js/core/utils/date_serialization'; +import { isDate } from '@js/core/utils/type'; +import type { OrderingDescriptor } from '@js/data/data.types'; + +import type { RawItemData } from '../data_source_adapter/types'; + +type ValueGetter = (data: RawItemData) => unknown; + +interface SortFilterValueOptions { + isRemoteFiltering: boolean; + dateSerializationFormat: string | undefined; + getSelector: (selector: string) => ValueGetter | undefined; +} + +interface SortFilterValue { + getter: ValueGetter; + rawValue: unknown; + safeValue: unknown; +} + +// TODO Vinogradov: Move it to ts and cover with unit tests. +const getSortFilterValue = ( + sortInfo: OrderingDescriptor, + rowData: RawItemData, + { + isRemoteFiltering, + dateSerializationFormat, + getSelector, + }: SortFilterValueOptions, +): SortFilterValue => { + const { selector } = sortInfo; + const getter: ValueGetter = typeof selector === 'function' + ? selector + : getSelector(selector) ?? ((data): unknown => data[selector]); + const rawValue = getter(rowData); + + const safeValue = isRemoteFiltering && isDate(rawValue) + ? dateSerialization.serializeDate(rawValue, dateSerializationFormat) + : rawValue; + + return { + getter, + rawValue, + safeValue, + }; +}; + +export const UiGridCoreFocusUtils = { + getSortFilterValue, +}; diff --git a/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts b/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts index 754449697f86..d551189b5924 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus.ts @@ -22,7 +22,7 @@ import gridCoreUtils from '../m_utils'; import type { RowsView } from '../views/m_rows_view'; import type { VirtualScrollingDataControllerExtension } from '../virtual_scrolling/index'; import type { FocusDataSourceControllerExtension } from './extenders/focus_data_source_controller'; -import { UiGridCoreFocusUtils } from './m_focus_utils'; +import { UiGridCoreFocusUtils } from './focus_utils'; import type { FocusDataControllerExtension } from './types'; const ROW_FOCUSED_CLASS = 'dx-row-focused'; @@ -824,7 +824,7 @@ export const focusDataControllerExtender = ( private _generateOperationFilterByKey(key, rowData, useGroup) { const dateSerializationFormat = this.option('dateSerializationFormat'); const remoteOperations = this.dataSourceController.remoteOperations(); - const isRemoteFiltering = remoteOperations.filtering; + const isRemoteFiltering = Boolean(remoteOperations.filtering); const isRemoteSorting = remoteOperations.sorting; let filter = this._generateFilterByKey(key, '<'); diff --git a/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus_utils.ts b/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus_utils.ts deleted file mode 100644 index a8ca40d74d0b..000000000000 --- a/packages/devextreme/js/__internal/grids/grid_core/focus/m_focus_utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import dateSerialization from '@js/core/utils/date_serialization'; -import { isDate, isFunction } from '@js/core/utils/type'; - -// TODO Vinogradov: Move it to ts and cover with unit tests. -const getSortFilterValue = ( - sortInfo, - rowData, - { - isRemoteFiltering, - dateSerializationFormat, - getSelector, - }, -) => { - const { selector } = sortInfo; - const getter = isFunction(selector) - ? selector - : getSelector(selector); - - const rawValue = getter ? getter(rowData) : rowData[selector]; - const safeValue = isRemoteFiltering && isDate(rawValue) - ? dateSerialization.serializeDate(rawValue, dateSerializationFormat) - : rawValue; - - return { - getter, - rawValue, - safeValue, - }; -}; - -export const UiGridCoreFocusUtils = { - getSortFilterValue, -}; diff --git a/packages/devextreme/js/__internal/grids/grid_core/m_types.ts b/packages/devextreme/js/__internal/grids/grid_core/m_types.ts index aa81da74f7f2..cfbfd4b29752 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/m_types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/m_types.ts @@ -230,7 +230,7 @@ export interface Controllers { synchronizeScrolling: import('./views/m_grid_view').SynchronizeScrollingController; tablePosition: import('./columns_resizing_reordering/m_columns_resizing_reordering').TablePositionViewController; toastViewController: import('./toast/m_toast_controller').ToastViewController; - aiColumn: import('./ai_column/controllers/m_ai_column_controller').AIColumnController; + aiColumn: import('./ai_column/controllers/ai_column_controller').AIColumnController; aiPromptEditor: import('./ai_column/controllers/m_ai_prompt_editor_view_controller').AIPromptEditorViewController; aiAssistant: import('./ai_assistant/ai_assistant_controller').AIAssistantController; aiAssistantViewController: import('./ai_assistant/ai_assistant_view_controller').AIAssistantViewController; @@ -257,7 +257,7 @@ export interface Views { filterBuilderView: import('./filter_builder/m_filter_builder').FilterBuilderView; filterPanelView: import('./filter_panel/m_filter_panel').FilterPanelView; toastView: import('./toast/m_toast_view').ToastView; - aiPromptEditorView: import('./ai_column/views/m_ai_prompt_editor_view').AIPromptEditorView; + aiPromptEditorView: import('./ai_column/views/ai_prompt_editor_view').AIPromptEditorView; aiAssistantView: import('./ai_assistant/ai_assistant_view').AIAssistantView; } diff --git a/packages/devextreme/js/__internal/grids/grid_core/master_detail/m_master_detail.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/master_detail/master_detail.integration.test.ts similarity index 92% rename from packages/devextreme/js/__internal/grids/grid_core/master_detail/m_master_detail.integration.test.ts rename to packages/devextreme/js/__internal/grids/grid_core/master_detail/master_detail.integration.test.ts index 4b681f5a204d..80fc32afd352 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/master_detail/m_master_detail.integration.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/master_detail/master_detail.integration.test.ts @@ -19,6 +19,7 @@ describe('GridCore master_detail', () => { describe('master detail container', () => { it('container is td element', async () => { + // eslint-disable-next-line @typescript-eslint/init-declarations let containerElement: HTMLElement | undefined; await createDataGrid({ @@ -38,6 +39,7 @@ describe('GridCore master_detail', () => { }); it('container is div element when sticky columns enabled', async () => { + // eslint-disable-next-line @typescript-eslint/init-declarations let containerElement: HTMLElement | undefined; await createDataGrid({ diff --git a/packages/devextreme/js/__internal/grids/grid_core/views/m_columns_view.ts b/packages/devextreme/js/__internal/grids/grid_core/views/m_columns_view.ts index 9b0e0569b24b..54748aa2ca25 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/views/m_columns_view.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/views/m_columns_view.ts @@ -40,6 +40,7 @@ import type { DataController } from '../data_controller/data_controller'; import modules from '../m_modules'; import gridCoreUtils from '../m_utils'; import { CLASSES } from './const'; +import type { ColumnViewTemplate } from './types'; const SCROLL_CONTAINER_CLASS = 'scroll-container'; const SCROLLABLE_SIMULATED_CLASS = 'scrollable-simulated'; @@ -604,7 +605,7 @@ export class ColumnsView extends ColumnStateMixin(modules.View) { } } - protected _processTemplate(template, options?) { + protected _processTemplate(template, options?): ColumnViewTemplate { const that = this; let renderingTemplate; diff --git a/packages/devextreme/js/__internal/grids/grid_core/views/types.ts b/packages/devextreme/js/__internal/grids/grid_core/views/types.ts index 485c13a4f5ed..a7688501498e 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/views/types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/views/types.ts @@ -1,3 +1,5 @@ +import type { dxElementWrapper } from '@js/core/renderer'; +import type { DeferredObj } from '@js/core/utils/deferred'; import type { ScrollEventInfo } from '@js/ui/scroll_view/ui.scrollable'; import type dxScrollable from '@js/ui/scroll_view/ui.scrollable'; @@ -8,3 +10,16 @@ export type RowsViewScrollEvent = Partial> & { }; export type ColumnWidth = number | string | undefined; + +export interface ColumnViewTemplateOptions { + container: dxElementWrapper; + model: unknown; + deferred?: DeferredObj; + onRendered?: () => void; + change?: unknown; +} + +export interface ColumnViewTemplate { + allowRenderToDetachedContainer?: boolean; + render: (options: ColumnViewTemplateOptions) => void; +} From f57b38801bf151d04773d8f9d50e5afaf573db7a Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 1 Oct 2026 11:11:07 +0800 Subject: [PATCH 2/5] PR-3 --- .../__internal/grids/data_grid/module_not_extended/toast.ts | 4 ++-- ...mn_cache_controller.ts => ai_column_cache_controller.ts} | 0 .../grid_core/ai_column/controllers/ai_column_controller.ts | 2 +- ...on_controller.ts => ai_column_integration_controller.ts} | 2 +- ...ew_controller.ts => ai_prompt_editor_view_controller.ts} | 0 .../js/__internal/grids/grid_core/ai_column/index.ts | 2 +- .../grids/grid_core/ai_column/views/ai_column_view.ts | 2 +- ...pt_editor_view.test.ts => ai_prompt_editor_view.test.ts} | 0 .../error_handling/error_handling_view_controller.ts | 2 +- .../devextreme/js/__internal/grids/grid_core/m_types.ts | 6 +++--- .../toast/{m_toast_controller.ts => toast_controller.ts} | 2 +- .../grid_core/toast/{m_toast_view.ts => toast_view.ts} | 0 .../__internal/grids/tree_list/module_not_extended/toast.ts | 4 ++-- 13 files changed, 13 insertions(+), 13 deletions(-) rename packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/{m_ai_column_cache_controller.ts => ai_column_cache_controller.ts} (100%) rename packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/{m_ai_column_integration_controller.ts => ai_column_integration_controller.ts} (98%) rename packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/{m_ai_prompt_editor_view_controller.ts => ai_prompt_editor_view_controller.ts} (100%) rename packages/devextreme/js/__internal/grids/grid_core/ai_column/views/{m_ai_prompt_editor_view.test.ts => ai_prompt_editor_view.test.ts} (100%) rename packages/devextreme/js/__internal/grids/grid_core/toast/{m_toast_controller.ts => toast_controller.ts} (92%) rename packages/devextreme/js/__internal/grids/grid_core/toast/{m_toast_view.ts => toast_view.ts} (100%) diff --git a/packages/devextreme/js/__internal/grids/data_grid/module_not_extended/toast.ts b/packages/devextreme/js/__internal/grids/data_grid/module_not_extended/toast.ts index c3360325a447..2234997a6104 100644 --- a/packages/devextreme/js/__internal/grids/data_grid/module_not_extended/toast.ts +++ b/packages/devextreme/js/__internal/grids/data_grid/module_not_extended/toast.ts @@ -1,5 +1,5 @@ -import { ToastViewController } from '@ts/grids/grid_core/toast/m_toast_controller'; -import { ToastView } from '@ts/grids/grid_core/toast/m_toast_view'; +import { ToastViewController } from '@ts/grids/grid_core/toast/toast_controller'; +import { ToastView } from '@ts/grids/grid_core/toast/toast_view'; import gridCore from '../m_core'; diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_cache_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_cache_controller.ts similarity index 100% rename from packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_cache_controller.ts rename to packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_cache_controller.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts index 4111c2356e2a..8eb34098be79 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts @@ -14,7 +14,7 @@ import type { RowKey } from '../../m_types'; import gridCoreUtils from '../../m_utils'; import type { InternalRequestCallbacks } from '../types'; import { getAICommandColumnDefaultOptions, isAIColumnAutoMode, isPromptOption } from '../utils'; -import { AIColumnIntegrationController } from './m_ai_column_integration_controller'; +import { AIColumnIntegrationController } from './ai_column_integration_controller'; const getDefaultCellValue = ( column: Column, diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_integration_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_integration_controller.ts similarity index 98% rename from packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_integration_controller.ts rename to packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_integration_controller.ts index a82985bf1c18..b471477b4125 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_column_integration_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_integration_controller.ts @@ -15,7 +15,7 @@ import { Controller } from '../../m_modules'; import type { RowKey } from '../../m_types'; import type { InternalRequestCallbacks } from '../types'; import { getDataFromRowItems, isKeyMissingInData, reduceDataCachedKeys } from '../utils'; -import { AIColumnCacheController } from './m_ai_column_cache_controller'; +import { AIColumnCacheController } from './ai_column_cache_controller'; export class AIColumnIntegrationController extends Controller { private aborts: Record void) | undefined> = { }; diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_prompt_editor_view_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_prompt_editor_view_controller.ts similarity index 100% rename from packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/m_ai_prompt_editor_view_controller.ts rename to packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_prompt_editor_view_controller.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts index 7952ede441dc..f00a4c6f6211 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/index.ts @@ -1,4 +1,4 @@ export { AIColumnController } from './controllers/ai_column_controller'; -export { AIPromptEditorViewController } from './controllers/m_ai_prompt_editor_view_controller'; +export { AIPromptEditorViewController } from './controllers/ai_prompt_editor_view_controller'; export { columnHeadersViewExtender } from './views/ai_column_view'; export { AIPromptEditorView } from './views/ai_prompt_editor_view'; diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_column_view.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_column_view.ts index ff589517e46b..127c951109d3 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_column_view.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_column_view.ts @@ -11,7 +11,7 @@ import type { ModuleType } from '../../m_types'; import type { ColumnViewTemplate } from '../../views/types'; import { AI_COLUMN_NAME, CLASSES, ICON_NAMES } from '../const'; import type { AIColumnController } from '../controllers/ai_column_controller'; -import type { AIPromptEditorViewController } from '../controllers/m_ai_prompt_editor_view_controller'; +import type { AIPromptEditorViewController } from '../controllers/ai_prompt_editor_view_controller'; import { createAIHeaderContainer, createChatSparkleOutlineIcon } from '../dom'; import { isAIColumnHeader, diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_prompt_editor_view.test.ts similarity index 100% rename from packages/devextreme/js/__internal/grids/grid_core/ai_column/views/m_ai_prompt_editor_view.test.ts rename to packages/devextreme/js/__internal/grids/grid_core/ai_column/views/ai_prompt_editor_view.test.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/error_handling/error_handling_view_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/error_handling/error_handling_view_controller.ts index 1fe00c811a8e..e91d834088ed 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/error_handling/error_handling_view_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/error_handling/error_handling_view_controller.ts @@ -11,7 +11,7 @@ import type { DataChange } from '@ts/grids/grid_core/data_controller/types'; import type { EditingController } from '@ts/grids/grid_core/editing/m_editing'; import modules from '@ts/grids/grid_core/m_modules'; import type { OptionChanged } from '@ts/grids/grid_core/m_types'; -import type { ToastViewController } from '@ts/grids/grid_core/toast/m_toast_controller'; +import type { ToastViewController } from '@ts/grids/grid_core/toast/toast_controller'; import type { ResizingController } from '@ts/grids/grid_core/views/m_grid_view'; import type { RowsView } from '@ts/grids/grid_core/views/m_rows_view'; diff --git a/packages/devextreme/js/__internal/grids/grid_core/m_types.ts b/packages/devextreme/js/__internal/grids/grid_core/m_types.ts index cfbfd4b29752..dfc1a8ad1fbf 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/m_types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/m_types.ts @@ -229,9 +229,9 @@ export interface Controllers { stateStoring: import('./state_storing/state_storing_controller_core').StateStoringController; synchronizeScrolling: import('./views/m_grid_view').SynchronizeScrollingController; tablePosition: import('./columns_resizing_reordering/m_columns_resizing_reordering').TablePositionViewController; - toastViewController: import('./toast/m_toast_controller').ToastViewController; + toastViewController: import('./toast/toast_controller').ToastViewController; aiColumn: import('./ai_column/controllers/ai_column_controller').AIColumnController; - aiPromptEditor: import('./ai_column/controllers/m_ai_prompt_editor_view_controller').AIPromptEditorViewController; + aiPromptEditor: import('./ai_column/controllers/ai_prompt_editor_view_controller').AIPromptEditorViewController; aiAssistant: import('./ai_assistant/ai_assistant_controller').AIAssistantController; aiAssistantViewController: import('./ai_assistant/ai_assistant_view_controller').AIAssistantViewController; } @@ -256,7 +256,7 @@ export interface Views { gridView: import('./views/m_grid_view').GridView; filterBuilderView: import('./filter_builder/m_filter_builder').FilterBuilderView; filterPanelView: import('./filter_panel/m_filter_panel').FilterPanelView; - toastView: import('./toast/m_toast_view').ToastView; + toastView: import('./toast/toast_view').ToastView; aiPromptEditorView: import('./ai_column/views/ai_prompt_editor_view').AIPromptEditorView; aiAssistantView: import('./ai_assistant/ai_assistant_view').AIAssistantView; } diff --git a/packages/devextreme/js/__internal/grids/grid_core/toast/m_toast_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/toast/toast_controller.ts similarity index 92% rename from packages/devextreme/js/__internal/grids/grid_core/toast/m_toast_controller.ts rename to packages/devextreme/js/__internal/grids/grid_core/toast/toast_controller.ts index 1f8e85878061..7c47bcdda1df 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/toast/m_toast_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/toast/toast_controller.ts @@ -1,7 +1,7 @@ import type { Properties as ToastProperties } from '@js/ui/toast'; import { ViewController } from '../m_modules'; -import type { ToastView } from './m_toast_view'; +import type { ToastView } from './toast_view'; export class ToastViewController extends ViewController { private _toastView: ToastView | null = null; diff --git a/packages/devextreme/js/__internal/grids/grid_core/toast/m_toast_view.ts b/packages/devextreme/js/__internal/grids/grid_core/toast/toast_view.ts similarity index 100% rename from packages/devextreme/js/__internal/grids/grid_core/toast/m_toast_view.ts rename to packages/devextreme/js/__internal/grids/grid_core/toast/toast_view.ts diff --git a/packages/devextreme/js/__internal/grids/tree_list/module_not_extended/toast.ts b/packages/devextreme/js/__internal/grids/tree_list/module_not_extended/toast.ts index 628ca0c8051d..79d10e390a30 100644 --- a/packages/devextreme/js/__internal/grids/tree_list/module_not_extended/toast.ts +++ b/packages/devextreme/js/__internal/grids/tree_list/module_not_extended/toast.ts @@ -1,5 +1,5 @@ -import { ToastViewController } from '@ts/grids/grid_core/toast/m_toast_controller'; -import { ToastView } from '@ts/grids/grid_core/toast/m_toast_view'; +import { ToastViewController } from '@ts/grids/grid_core/toast/toast_controller'; +import { ToastView } from '@ts/grids/grid_core/toast/toast_view'; import gridCore from '../m_core'; From 3a227fdd7a63dab76c6d5bb33303d7a913f99009 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 1 Oct 2026 11:13:02 +0800 Subject: [PATCH 3/5] PR-4 --- .../filter_sync/extenders/filter_sync_data_controller.ts | 2 +- .../filter_sync/{m_filter_sync.ts => filter_sync.ts} | 0 .../grids/grid_core/filter_sync/filter_sync_module.ts | 2 +- ..._column_focus_dispatcher.ts => column_focus_dispatcher.ts} | 0 .../keyboard_navigation/m_column_keyboard_navigation_core.ts | 2 +- .../keyboard_navigation/m_headers_keyboard_navigation.ts | 2 +- packages/devextreme/js/__internal/grids/grid_core/m_types.ts | 4 ++-- .../grids/grid_core/state_storing/state_storing_controller.ts | 2 +- 8 files changed, 7 insertions(+), 7 deletions(-) rename packages/devextreme/js/__internal/grids/grid_core/filter_sync/{m_filter_sync.ts => filter_sync.ts} (100%) rename packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/{m_column_focus_dispatcher.ts => column_focus_dispatcher.ts} (100%) diff --git a/packages/devextreme/js/__internal/grids/grid_core/filter_sync/extenders/filter_sync_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/filter_sync/extenders/filter_sync_data_controller.ts index 63ae555ae37d..6a7f2055129c 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/filter_sync/extenders/filter_sync_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/filter_sync/extenders/filter_sync_data_controller.ts @@ -1,7 +1,7 @@ import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred } from '@js/core/utils/deferred'; import type { DataController } from '@ts/grids/grid_core/data_controller/data_controller'; -import type { FilterSyncController } from '@ts/grids/grid_core/filter_sync/m_filter_sync'; +import type { FilterSyncController } from '@ts/grids/grid_core/filter_sync/filter_sync'; import type { ModuleType, OptionChanged } from '@ts/grids/grid_core/m_types'; export const filterSyncDataControllerExtender = ( diff --git a/packages/devextreme/js/__internal/grids/grid_core/filter_sync/m_filter_sync.ts b/packages/devextreme/js/__internal/grids/grid_core/filter_sync/filter_sync.ts similarity index 100% rename from packages/devextreme/js/__internal/grids/grid_core/filter_sync/m_filter_sync.ts rename to packages/devextreme/js/__internal/grids/grid_core/filter_sync/filter_sync.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/filter_sync/filter_sync_module.ts b/packages/devextreme/js/__internal/grids/grid_core/filter_sync/filter_sync_module.ts index dc3ee7dd096f..409da206157d 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/filter_sync/filter_sync_module.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/filter_sync/filter_sync_module.ts @@ -2,7 +2,7 @@ import type { InternalGridOptions } from '@ts/grids/grid_core/m_types'; import { filterSyncColumnHeadersViewExtender } from './extenders/filter_sync_column_headers_view'; import { filterSyncDataControllerExtender } from './extenders/filter_sync_data_controller'; -import { FilterSyncController } from './m_filter_sync'; +import { FilterSyncController } from './filter_sync'; export const filterSyncModule = { defaultOptions(): Pick { diff --git a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_column_focus_dispatcher.ts b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/column_focus_dispatcher.ts similarity index 100% rename from packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_column_focus_dispatcher.ts rename to packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/column_focus_dispatcher.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_column_keyboard_navigation_core.ts b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_column_keyboard_navigation_core.ts index 8d02ff6c4998..fc217d37ea71 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_column_keyboard_navigation_core.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_column_keyboard_navigation_core.ts @@ -1,8 +1,8 @@ import { isDefined, isEmptyObject } from '@js/core/utils/type'; import type { Column } from '@ts/grids/grid_core/columns_controller/types'; +import type { ColumnFocusDispatcher } from './column_focus_dispatcher'; import { Direction } from './const'; -import type { ColumnFocusDispatcher } from './m_column_focus_dispatcher'; import { KeyboardNavigationController as KeyboardNavigationControllerCore } from './m_keyboard_navigation_core'; export class ColumnKeyboardNavigationController extends KeyboardNavigationControllerCore { diff --git a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_headers_keyboard_navigation.ts b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_headers_keyboard_navigation.ts index 9ceff9618e61..f5ff04dee6c1 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_headers_keyboard_navigation.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_headers_keyboard_navigation.ts @@ -11,8 +11,8 @@ import type { Views } from '../m_types'; import { StickyPosition } from '../sticky_columns/const'; import { GridCoreStickyColumnsDom } from '../sticky_columns/dom'; import { getColumnFixedPosition } from '../sticky_columns/utils'; +import { ColumnFocusDispatcher } from './column_focus_dispatcher'; import { Direction } from './const'; -import { ColumnFocusDispatcher } from './m_column_focus_dispatcher'; import { ColumnKeyboardNavigationController } from './m_column_keyboard_navigation_core'; export class HeadersKeyboardNavigationController extends ColumnKeyboardNavigationController { diff --git a/packages/devextreme/js/__internal/grids/grid_core/m_types.ts b/packages/devextreme/js/__internal/grids/grid_core/m_types.ts index dfc1a8ad1fbf..d1b2fd738230 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/m_types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/m_types.ts @@ -214,12 +214,12 @@ export interface Controllers { errorHandling: import('./error_handling/error_handling_view_controller').ErrorHandlingViewController; export: import('../data_grid/export/m_export').ExportController; filter: import('./filter/filter_controller').FilterController; - filterSync: import('./filter_sync/m_filter_sync').FilterSyncController; + filterSync: import('./filter_sync/filter_sync').FilterSyncController; filterBuilder: import('./filter_builder/m_filter_builder').FilterBuilderController; focus: import('./focus/m_focus').FocusController; headerFilter: import('./header_filter/m_header_filter').HeaderFilterController; keyboardNavigation: import('./keyboard_navigation/m_keyboard_navigation').KeyboardNavigationController; - columnFocusDispatcher: import('./keyboard_navigation/m_column_focus_dispatcher').ColumnFocusDispatcher; + columnFocusDispatcher: import('./keyboard_navigation/column_focus_dispatcher').ColumnFocusDispatcher; headersKeyboardNavigation: import('./keyboard_navigation/m_headers_keyboard_navigation').HeadersKeyboardNavigationController; groupPanelKeyboardNavigation: import('../data_grid/keyboard_navigation/m_group_panel_keyboard_navigation').GroupPanelKeyboardNavigationController; resizing: import('./views/m_grid_view').ResizingController; diff --git a/packages/devextreme/js/__internal/grids/grid_core/state_storing/state_storing_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/state_storing/state_storing_controller.ts index 6cd4058632c7..9bba7a7fcbdc 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/state_storing/state_storing_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/state_storing/state_storing_controller.ts @@ -2,7 +2,7 @@ import { equalByValue, getKeyHash } from '@js/core/utils/common'; import { isDefined } from '@js/core/utils/type'; import { extend } from '@ts/core/utils/m_extend'; import type { DataController } from '@ts/grids/grid_core/data_controller/data_controller'; -import type { FilterSyncController } from '@ts/grids/grid_core/filter_sync/m_filter_sync'; +import type { FilterSyncController } from '@ts/grids/grid_core/filter_sync/filter_sync'; import type { InternalGridOptions } from '@ts/grids/grid_core/m_types'; import type { StateStoringDataControllerExtension } from './extenders/state_storing_data_controller'; From c205f2c9f8ad35cc0f52a56fdb2744060e717895 Mon Sep 17 00:00:00 2001 From: Eldar Iusupzhanov Date: Thu, 1 Oct 2026 11:34:37 +0800 Subject: [PATCH 4/5] copilot review --- .../ai_column/controllers/ai_column_controller.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts index 8eb34098be79..297b41f63461 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_column/controllers/ai_column_controller.ts @@ -64,14 +64,6 @@ export class AIColumnController extends Controller { public aiRequestRejected!: Callback; - private getDefaultCellValue(column: Column, cellValue: string | undefined): string | null { - if (cellValue === undefined) { - return column.ai?.emptyText ?? null; - } - - return column.ai?.noDataText ?? null; - } - private _endCustomLoadingIfNoPendingRequests(): void { if (!this.aiColumnIntegrationController.isAnyRequestAwaitingCompletion()) { this.dataController.endCustomLoading(); From 15e68a1365e87208725f64c739f26874fe6bfa79 Mon Sep 17 00:00:00 2001 From: "anna.shakhova" <68295572+anna-shakhova@users.noreply.github.com> Date: Thu, 1 Oct 2026 08:51:41 +0200 Subject: [PATCH 5/5] extract focus types --- .../grids/grid_core/focus/focus_utils.ts | 15 +-------------- .../js/__internal/grids/grid_core/focus/types.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts b/packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts index c8c5e3bd6e7e..c6ecaef8b274 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/focus/focus_utils.ts @@ -3,20 +3,7 @@ import { isDate } from '@js/core/utils/type'; import type { OrderingDescriptor } from '@js/data/data.types'; import type { RawItemData } from '../data_source_adapter/types'; - -type ValueGetter = (data: RawItemData) => unknown; - -interface SortFilterValueOptions { - isRemoteFiltering: boolean; - dateSerializationFormat: string | undefined; - getSelector: (selector: string) => ValueGetter | undefined; -} - -interface SortFilterValue { - getter: ValueGetter; - rawValue: unknown; - safeValue: unknown; -} +import type { SortFilterValue, SortFilterValueOptions, ValueGetter } from './types'; // TODO Vinogradov: Move it to ts and cover with unit tests. const getSortFilterValue = ( diff --git a/packages/devextreme/js/__internal/grids/grid_core/focus/types.ts b/packages/devextreme/js/__internal/grids/grid_core/focus/types.ts index 016e6bae7052..eb316648657e 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/focus/types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/focus/types.ts @@ -1,9 +1,24 @@ import type { Callback } from '@js/core/utils/callbacks'; import type { DataChange } from '../data_controller/types'; +import type { RawItemData } from '../data_source_adapter/types'; export interface FocusDataControllerExtension { _updatePageIndexes: () => void; afterChanged: Callback<[DataChange]>; getLastChange: () => DataChange | undefined; } + +export type ValueGetter = (data: RawItemData) => unknown; + +export interface SortFilterValueOptions { + isRemoteFiltering: boolean; + dateSerializationFormat: string | undefined; + getSelector: (selector: string) => ValueGetter | undefined; +} + +export interface SortFilterValue { + getter: ValueGetter; + rawValue: unknown; + safeValue: unknown; +}