From 1db477a12002e8a21b3882efabf00bad0a0f87da Mon Sep 17 00:00:00 2001 From: "anna.shakhova" Date: Thu, 14 May 2026 11:38:40 +0200 Subject: [PATCH 1/5] Grid AI Assistant: add `customizeResponseText`, `customizeResponseTitle` to dts --- .../src/common/grids/index.ts | 3 + .../devextreme-angular/src/common/index.ts | 5 +- .../src/ui/data-grid/nested/ai-assistant.ts | 17 +++++ .../src/ui/tree-list/nested/ai-assistant.ts | 17 +++++ packages/devextreme-react/src/common/grids.ts | 3 + packages/devextreme-react/src/common/index.ts | 5 +- packages/devextreme-react/src/data-grid.ts | 4 +- packages/devextreme-react/src/tree-list.ts | 4 +- packages/devextreme-vue/src/common/grids.ts | 3 + packages/devextreme-vue/src/common/index.ts | 5 +- packages/devextreme-vue/src/data-grid.ts | 5 ++ packages/devextreme-vue/src/tree-list.ts | 5 ++ .../grid_core/ai_assistant/grid_commands.ts | 2 +- .../grids/grid_core/ai_assistant/types.ts | 7 +- packages/devextreme/js/common/grids.d.ts | 69 +++++++++++++----- packages/devextreme/ts/dx.all.d.ts | 72 +++++++++++++++---- 16 files changed, 181 insertions(+), 45 deletions(-) diff --git a/packages/devextreme-angular/src/common/grids/index.ts b/packages/devextreme-angular/src/common/grids/index.ts index 03696c47816d..d7767cbc1885 100644 --- a/packages/devextreme-angular/src/common/grids/index.ts +++ b/packages/devextreme-angular/src/common/grids/index.ts @@ -55,6 +55,9 @@ export type { Pager, PagerPageSize, PagingBase, + PredefinedCommands, + ResponseStatus, + ResponseStatusTexts, RowDragging, RowDraggingTemplateData, RowInsertedInfo, diff --git a/packages/devextreme-angular/src/common/index.ts b/packages/devextreme-angular/src/common/index.ts index 8f0cda9f4a6e..2df8634d4079 100644 --- a/packages/devextreme-angular/src/common/index.ts +++ b/packages/devextreme-angular/src/common/index.ts @@ -275,7 +275,7 @@ export namespace Export { export function Grids(): void {} export namespace Grids { export type AdaptiveDetailRowPreparingInfo = GridsModule.AdaptiveDetailRowPreparingInfo; - export type AIAssistant = GridsModule.AIAssistant; + export type AIAssistant = GridsModule.AIAssistant; export type AIAssistantRequestCreatingInfo = GridsModule.AIAssistantRequestCreatingInfo; export type AIColumnMode = GridsModule.AIColumnMode; export type AIColumnRequestCreatingInfo = GridsModule.AIColumnRequestCreatingInfo; @@ -330,6 +330,9 @@ export namespace Grids { export type Pager = GridsModule.Pager; export type PagerPageSize = GridsModule.PagerPageSize; export type PagingBase = GridsModule.PagingBase; + export type PredefinedCommands = GridsModule.PredefinedCommands; + export type ResponseStatus = GridsModule.ResponseStatus; + export type ResponseStatusTexts = GridsModule.ResponseStatusTexts; export type RowDragging, TRowData = any, TKey = any> = GridsModule.RowDragging; export type RowDraggingTemplateData = GridsModule.RowDraggingTemplateData; export type RowInsertedInfo = GridsModule.RowInsertedInfo; diff --git a/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts b/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts index bf3d005ac860..72d94da8ad8b 100644 --- a/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts +++ b/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts @@ -15,6 +15,7 @@ import { import type { AIIntegration } from 'devextreme/common/ai-integration'; +import type { ResponseStatus } from 'devextreme/common/grids'; import type { dxPopupOptions } from 'devextreme/ui/popup'; import { @@ -48,6 +49,22 @@ export class DxoDataGridAIAssistantComponent extends NestedOption implements OnD this._setOption('chat', value); } + @Input() + get customizeResponseText(): any { + return this._getOption('customizeResponseText'); + } + set customizeResponseText(value: any) { + this._setOption('customizeResponseText', value); + } + + @Input() + get customizeResponseTitle(): ((status: ResponseStatus, commandNames: Array) => string) { + return this._getOption('customizeResponseTitle'); + } + set customizeResponseTitle(value: ((status: ResponseStatus, commandNames: Array) => string)) { + this._setOption('customizeResponseTitle', value); + } + @Input() get enabled(): boolean { return this._getOption('enabled'); diff --git a/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts b/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts index 1b2722649f16..ee25ab0a350b 100644 --- a/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts +++ b/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts @@ -15,6 +15,7 @@ import { import type { AIIntegration } from 'devextreme/common/ai-integration'; +import type { ResponseStatus } from 'devextreme/common/grids'; import type { dxPopupOptions } from 'devextreme/ui/popup'; import { @@ -48,6 +49,22 @@ export class DxoTreeListAIAssistantComponent extends NestedOption implements OnD this._setOption('chat', value); } + @Input() + get customizeResponseText(): any { + return this._getOption('customizeResponseText'); + } + set customizeResponseText(value: any) { + this._setOption('customizeResponseText', value); + } + + @Input() + get customizeResponseTitle(): ((status: ResponseStatus, commandNames: Array) => string) { + return this._getOption('customizeResponseTitle'); + } + set customizeResponseTitle(value: ((status: ResponseStatus, commandNames: Array) => string)) { + this._setOption('customizeResponseTitle', value); + } + @Input() get enabled(): boolean { return this._getOption('enabled'); diff --git a/packages/devextreme-react/src/common/grids.ts b/packages/devextreme-react/src/common/grids.ts index 2cf419615368..7263e75eebbc 100644 --- a/packages/devextreme-react/src/common/grids.ts +++ b/packages/devextreme-react/src/common/grids.ts @@ -55,6 +55,9 @@ export type { Pager, PagerPageSize, PagingBase, + PredefinedCommands, + ResponseStatus, + ResponseStatusTexts, RowDragging, RowDraggingTemplateData, RowInsertedInfo, diff --git a/packages/devextreme-react/src/common/index.ts b/packages/devextreme-react/src/common/index.ts index 1c6fbe7d5a60..ef14c0390611 100644 --- a/packages/devextreme-react/src/common/index.ts +++ b/packages/devextreme-react/src/common/index.ts @@ -275,7 +275,7 @@ export namespace Export { export function Grids(): void {} export namespace Grids { export type AdaptiveDetailRowPreparingInfo = GridsModule.AdaptiveDetailRowPreparingInfo; - export type AIAssistant = GridsModule.AIAssistant; + export type AIAssistant = GridsModule.AIAssistant; export type AIAssistantRequestCreatingInfo = GridsModule.AIAssistantRequestCreatingInfo; export type AIColumnMode = GridsModule.AIColumnMode; export type AIColumnRequestCreatingInfo = GridsModule.AIColumnRequestCreatingInfo; @@ -330,6 +330,9 @@ export namespace Grids { export type Pager = GridsModule.Pager; export type PagerPageSize = GridsModule.PagerPageSize; export type PagingBase = GridsModule.PagingBase; + export type PredefinedCommands = GridsModule.PredefinedCommands; + export type ResponseStatus = GridsModule.ResponseStatus; + export type ResponseStatusTexts = GridsModule.ResponseStatusTexts; export type RowDragging, TRowData = any, TKey = any> = GridsModule.RowDragging; export type RowDraggingTemplateData = GridsModule.RowDraggingTemplateData; export type RowInsertedInfo = GridsModule.RowInsertedInfo; diff --git a/packages/devextreme-react/src/data-grid.ts b/packages/devextreme-react/src/data-grid.ts index 2a989a4eae7e..4d3f2e588751 100644 --- a/packages/devextreme-react/src/data-grid.ts +++ b/packages/devextreme-react/src/data-grid.ts @@ -10,7 +10,7 @@ import { Component as BaseComponent, IHtmlOptions, ComponentRef, NestedComponent import NestedOption from "./core/nested-option"; import type { dxDataGridColumn, AdaptiveDetailRowPreparingEvent, AIAssistantRequestCreatingEvent, AIColumnRequestCreatingEvent, CellClickEvent, CellDblClickEvent, CellPreparedEvent, ContentReadyEvent, ContextMenuPreparingEvent, DataErrorOccurredEvent, DisposingEvent, EditCanceledEvent, EditCancelingEvent, EditingStartEvent, EditorPreparedEvent, EditorPreparingEvent, ExportingEvent, FocusedCellChangingEvent, FocusedRowChangingEvent, InitializedEvent, InitNewRowEvent, KeyDownEvent, RowClickEvent, RowCollapsedEvent, RowCollapsingEvent, RowDblClickEvent, RowExpandedEvent, RowExpandingEvent, RowInsertedEvent, RowInsertingEvent, RowPreparedEvent, RowRemovedEvent, RowRemovingEvent, RowUpdatedEvent, RowUpdatingEvent, RowValidatingEvent, SavedEvent, SavingEvent, ToolbarPreparingEvent, dxDataGridRowObject, DataGridPredefinedColumnButton, ColumnButtonClickEvent, dxDataGridColumnButton, DataGridCommandColumnType, SelectionSensitivity, DataGridPredefinedToolbarItem, DataGridExportFormat, DataGridScrollMode, dxDataGridToolbarItem } from "devextreme/ui/data_grid"; -import type { DataChange, AIColumnMode, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, HeaderFilterSearchConfig, HeaderFilterTexts, SelectionColumnDisplayMode, GridsEditMode, NewRowPosition, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, GroupExpandMode, SummaryType, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; +import type { DataChange, AIColumnMode, ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, HeaderFilterSearchConfig, HeaderFilterTexts, SelectionColumnDisplayMode, GridsEditMode, NewRowPosition, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, GroupExpandMode, SummaryType, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; import type { Mode, ValidationRuleType, HorizontalAlignment, VerticalAlignment, template, TextEditorButtonLocation, ButtonStyle, ButtonType, DataType, Format as CommonFormat, SortOrder, SearchMode, ComparisonOperator, SingleMultipleOrNone, SelectAllMode, ToolbarItemLocation, ToolbarItemComponent, TextBoxPredefinedButton, TextEditorButton, LabelMode, MaskMode, EditorStyle, ValidationMessageMode, Position as CommonPosition, ValidationStatus, PositionAlignment, Direction, DisplayMode, DragDirection, DragHighlight, ScrollbarMode, TabsIconPosition, TabsStyle } from "devextreme/common"; import type { ContentReadyEvent as ButtonContentReadyEvent, DisposingEvent as ButtonDisposingEvent, InitializedEvent as ButtonInitializedEvent, dxButtonOptions, ClickEvent, OptionChangedEvent } from "devextreme/ui/button"; import type { ContentReadyEvent as TextBoxContentReadyEvent, DisposingEvent as TextBoxDisposingEvent, InitializedEvent as TextBoxInitializedEvent, KeyDownEvent as TextBoxKeyDownEvent, dxTextBoxOptions, OptionChangedEvent as TextBoxOptionChangedEvent, TextBoxType, ChangeEvent, CopyEvent, CutEvent, EnterKeyEvent, FocusInEvent, FocusOutEvent, InputEvent, KeyUpEvent, PasteEvent, ValueChangedEvent } from "devextreme/ui/text_box"; @@ -244,6 +244,8 @@ const AI = Object.assign(_componentAI, type IAIAssistantProps = React.PropsWithChildren<{ aiIntegration?: AIIntegration; chat?: Record; + customizeResponseText?: any; + customizeResponseTitle?: ((status: ResponseStatus, commandNames: Array) => string); enabled?: boolean; popup?: dxPopupOptions; title?: string; diff --git a/packages/devextreme-react/src/tree-list.ts b/packages/devextreme-react/src/tree-list.ts index 38316b42abb8..1d9479f96650 100644 --- a/packages/devextreme-react/src/tree-list.ts +++ b/packages/devextreme-react/src/tree-list.ts @@ -10,7 +10,7 @@ import { Component as BaseComponent, IHtmlOptions, ComponentRef, NestedComponent import NestedOption from "./core/nested-option"; import type { dxTreeListColumn, AdaptiveDetailRowPreparingEvent, AIAssistantRequestCreatingEvent, AIColumnRequestCreatingEvent, CellClickEvent, CellDblClickEvent, CellPreparedEvent, ContentReadyEvent, ContextMenuPreparingEvent, DataErrorOccurredEvent, DisposingEvent, EditCanceledEvent, EditCancelingEvent, EditingStartEvent, EditorPreparedEvent, EditorPreparingEvent, FocusedCellChangingEvent, FocusedRowChangingEvent, InitializedEvent, InitNewRowEvent, KeyDownEvent, NodesInitializedEvent, RowClickEvent, RowCollapsedEvent, RowCollapsingEvent, RowDblClickEvent, RowExpandedEvent, RowExpandingEvent, RowInsertedEvent, RowInsertingEvent, RowPreparedEvent, RowRemovedEvent, RowRemovingEvent, RowUpdatedEvent, RowUpdatingEvent, RowValidatingEvent, SavedEvent, SavingEvent, ToolbarPreparingEvent, dxTreeListRowObject, TreeListPredefinedColumnButton, ColumnButtonClickEvent, dxTreeListColumnButton, TreeListCommandColumnType, TreeListPredefinedToolbarItem, dxTreeListToolbarItem } from "devextreme/ui/tree_list"; -import type { DataChange, AIColumnMode, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, GridsEditMode, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, HeaderFilterSearchConfig, HeaderFilterTexts, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; +import type { DataChange, AIColumnMode, ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, GridsEditMode, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, HeaderFilterSearchConfig, HeaderFilterTexts, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; import type { ContentReadyEvent as ButtonContentReadyEvent, DisposingEvent as ButtonDisposingEvent, InitializedEvent as ButtonInitializedEvent, dxButtonOptions, ClickEvent, OptionChangedEvent } from "devextreme/ui/button"; import type { ContentReadyEvent as TextBoxContentReadyEvent, DisposingEvent as TextBoxDisposingEvent, InitializedEvent as TextBoxInitializedEvent, KeyDownEvent as TextBoxKeyDownEvent, dxTextBoxOptions, OptionChangedEvent as TextBoxOptionChangedEvent, TextBoxType, ChangeEvent, CopyEvent, CutEvent, EnterKeyEvent, FocusInEvent, FocusOutEvent, InputEvent, KeyUpEvent, PasteEvent, ValueChangedEvent } from "devextreme/ui/text_box"; import type { ContentReadyEvent as FilterBuilderContentReadyEvent, DisposingEvent as FilterBuilderDisposingEvent, EditorPreparedEvent as FilterBuilderEditorPreparedEvent, EditorPreparingEvent as FilterBuilderEditorPreparingEvent, InitializedEvent as FilterBuilderInitializedEvent, OptionChangedEvent as FilterBuilderOptionChangedEvent, dxFilterBuilderField, FieldInfo, ValueChangedEvent as FilterBuilderValueChangedEvent, FilterBuilderOperation, dxFilterBuilderCustomOperation, GroupOperation } from "devextreme/ui/filter_builder"; @@ -216,6 +216,8 @@ const AI = Object.assign(_componentAI, type IAIAssistantProps = React.PropsWithChildren<{ aiIntegration?: AIIntegration; chat?: Record; + customizeResponseText?: any; + customizeResponseTitle?: ((status: ResponseStatus, commandNames: Array) => string); enabled?: boolean; popup?: dxPopupOptions; title?: string; diff --git a/packages/devextreme-vue/src/common/grids.ts b/packages/devextreme-vue/src/common/grids.ts index 2cf419615368..7263e75eebbc 100644 --- a/packages/devextreme-vue/src/common/grids.ts +++ b/packages/devextreme-vue/src/common/grids.ts @@ -55,6 +55,9 @@ export type { Pager, PagerPageSize, PagingBase, + PredefinedCommands, + ResponseStatus, + ResponseStatusTexts, RowDragging, RowDraggingTemplateData, RowInsertedInfo, diff --git a/packages/devextreme-vue/src/common/index.ts b/packages/devextreme-vue/src/common/index.ts index 1c6fbe7d5a60..ef14c0390611 100644 --- a/packages/devextreme-vue/src/common/index.ts +++ b/packages/devextreme-vue/src/common/index.ts @@ -275,7 +275,7 @@ export namespace Export { export function Grids(): void {} export namespace Grids { export type AdaptiveDetailRowPreparingInfo = GridsModule.AdaptiveDetailRowPreparingInfo; - export type AIAssistant = GridsModule.AIAssistant; + export type AIAssistant = GridsModule.AIAssistant; export type AIAssistantRequestCreatingInfo = GridsModule.AIAssistantRequestCreatingInfo; export type AIColumnMode = GridsModule.AIColumnMode; export type AIColumnRequestCreatingInfo = GridsModule.AIColumnRequestCreatingInfo; @@ -330,6 +330,9 @@ export namespace Grids { export type Pager = GridsModule.Pager; export type PagerPageSize = GridsModule.PagerPageSize; export type PagingBase = GridsModule.PagingBase; + export type PredefinedCommands = GridsModule.PredefinedCommands; + export type ResponseStatus = GridsModule.ResponseStatus; + export type ResponseStatusTexts = GridsModule.ResponseStatusTexts; export type RowDragging, TRowData = any, TKey = any> = GridsModule.RowDragging; export type RowDraggingTemplateData = GridsModule.RowDraggingTemplateData; export type RowInsertedInfo = GridsModule.RowInsertedInfo; diff --git a/packages/devextreme-vue/src/data-grid.ts b/packages/devextreme-vue/src/data-grid.ts index 6a4958212ebb..ccdf577984f9 100644 --- a/packages/devextreme-vue/src/data-grid.ts +++ b/packages/devextreme-vue/src/data-grid.ts @@ -20,6 +20,7 @@ import { SearchPanel, Sorting, AIColumnMode, + ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, @@ -734,6 +735,8 @@ const DxAIAssistantConfig = { "update:hoveredElement": null, "update:aiIntegration": null, "update:chat": null, + "update:customizeResponseText": null, + "update:customizeResponseTitle": null, "update:enabled": null, "update:popup": null, "update:title": null, @@ -741,6 +744,8 @@ const DxAIAssistantConfig = { props: { aiIntegration: Object as PropType, chat: Object as PropType>, + customizeResponseText: {}, + customizeResponseTitle: Function as PropType<((status: ResponseStatus, commandNames: Array) => string)>, enabled: Boolean, popup: Object as PropType | Record>, title: String diff --git a/packages/devextreme-vue/src/tree-list.ts b/packages/devextreme-vue/src/tree-list.ts index b9a40953fcdf..abc1c8255659 100644 --- a/packages/devextreme-vue/src/tree-list.ts +++ b/packages/devextreme-vue/src/tree-list.ts @@ -20,6 +20,7 @@ import { SearchPanel, Sorting, AIColumnMode, + ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, @@ -723,6 +724,8 @@ const DxAIAssistantConfig = { "update:hoveredElement": null, "update:aiIntegration": null, "update:chat": null, + "update:customizeResponseText": null, + "update:customizeResponseTitle": null, "update:enabled": null, "update:popup": null, "update:title": null, @@ -730,6 +733,8 @@ const DxAIAssistantConfig = { props: { aiIntegration: Object as PropType, chat: Object as PropType>, + customizeResponseText: {}, + customizeResponseTitle: Function as PropType<((status: ResponseStatus, commandNames: Array) => string)>, enabled: Boolean, popup: Object as PropType | Record>, title: String diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts index 9dc0f0735bfc..d6b2a539eeee 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts @@ -59,7 +59,7 @@ export class GridCommands { args: Record, customizeResponseText?: CustomizeResponseText, ): void { - const customMessages = customizeResponseText?.(name, args); + const customMessages = customizeResponseText?.({ name, args }); const customMessage = customMessages?.[result.status]; if (isDefined(customMessage)) { diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts index 4952accc565b..3786a0723949 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts @@ -1,4 +1,5 @@ import type { RequestCallbacks } from '@js/common/ai-integration'; +import type { CustomizeResponseText } from '@js/common/grids'; import type { Message } from '@js/ui/chat'; import type { InternalGrid } from '@ts/grids/grid_core/m_types'; import type { z, ZodObject, ZodRawShape } from 'zod'; @@ -54,11 +55,7 @@ export interface CommandMessages { failure: string; } -// TODO: move to d.ts -export type CustomizeResponseText = ( - commandName: string, - commandArgs: Record, -) => Partial | undefined; +export { CustomizeResponseText }; // TODO: move to d.ts export type CustomizeResponseTitle = ( diff --git a/packages/devextreme/js/common/grids.d.ts b/packages/devextreme/js/common/grids.d.ts index 50bb52be6689..3b6e39eb7bc0 100644 --- a/packages/devextreme/js/common/grids.d.ts +++ b/packages/devextreme/js/common/grids.d.ts @@ -80,14 +80,53 @@ import { } from '../ui/widget/ui.widget'; import { PositionConfig } from './core/animation'; import { PagerBase } from '../ui/pagination'; -import { AIIntegration } from './ai-integration'; +import { AIIntegration, ExecuteGridAssistantCommandParams } from './ai-integration'; /** * @docid * @public * @namespace DevExpress.common.grids */ -export type AIAssistant = { +export type ResponseStatus = 'success' | 'failure'; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type ResponseStatusTexts = { + success?: string; + failure?: string; +}; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export interface PredefinedCommands { + sorting: { + dataField: string; + sortOrder: SortOrder | 'none'; + }; + clearSorting: {}; +} + +export type CommandInfo< + TCommands extends PredefinedCommands = PredefinedCommands, +> = { [K in keyof TCommands]: { name: K; args: TCommands[K] } }[keyof TCommands] + | { name: string; args: Record }; + +export type CustomizeResponseText< + TCommands extends PredefinedCommands = PredefinedCommands, +> = (command: CommandInfo) => ResponseStatusTexts; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type AIAssistant = { /** @docid */ aiIntegration?: AIIntegration; /** @@ -110,31 +149,23 @@ export type AIAssistant = { * @default 'AI Assistant' */ title?: string; -}; - -/** - * @docid - * @hidden - * @namespace DevExpress.common.grids - */ -export type AIAssistantRequestCreatingInfo = { /** * @docid - * @type object */ - context: Record; + customizeResponseTitle?: (status: ResponseStatus, commandNames: (keyof TCommands | string)[]) => string; /** * @docid - * @type object */ - responseSchema: Record; - /** - * @docid - * @type object - */ - additionalInfo?: Record; + customizeResponseText?: CustomizeResponseText; }; +/** + * @docid + * @hidden + * @namespace DevExpress.common.grids + */ +export type AIAssistantRequestCreatingInfo = Pick; + /** * @docid * @hidden diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 2072c91d8338..6b618f63a48e 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -1226,6 +1226,16 @@ declare module DevExpress.common { }; export type ButtonStyle = 'text' | 'outlined' | 'contained'; export type ButtonType = 'danger' | 'default' | 'normal' | 'success'; + /** + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type CommandInfo< + TCommands extends DevExpress.common.grids.PredefinedCommands = DevExpress.common.grids.PredefinedCommands + > = + | { + [K in keyof TCommands]: { name: K; args: TCommands[K] }; + }[keyof TCommands] + | { name: string; args: Record }; /** * [descr:CompareRule] */ @@ -1260,6 +1270,14 @@ declare module DevExpress.common { | '===' | '>' | '>='; + /** + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type CustomizeResponseText< + TCommands extends DevExpress.common.grids.PredefinedCommands = DevExpress.common.grids.PredefinedCommands + > = ( + command: CommandInfo + ) => DevExpress.common.grids.ResponseStatusTexts; /** * [descr:CustomRule] */ @@ -4625,7 +4643,9 @@ declare module DevExpress.common.grids { /** * [descr:AIAssistant] */ - export type AIAssistant = { + export type AIAssistant< + TCommands extends PredefinedCommands = PredefinedCommands + > = { /** * [descr:AIAssistant.aiIntegration] */ @@ -4646,25 +4666,26 @@ declare module DevExpress.common.grids { * [descr:AIAssistant.title] */ title?: string; - }; - /** - * [descr:AIAssistantRequestCreatingInfo] - * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. - */ - export type AIAssistantRequestCreatingInfo = { - /** - * [descr:AIAssistantRequestCreatingInfo.context] - */ - context: Record; /** - * [descr:AIAssistantRequestCreatingInfo.responseSchema] + * [descr:AIAssistant.customizeResponseTitle] */ - responseSchema: Record; + customizeResponseTitle?: ( + status: ResponseStatus, + commandNames: (keyof TCommands | string)[] + ) => string; /** - * [descr:AIAssistantRequestCreatingInfo.additionalInfo] + * [descr:AIAssistant.customizeResponseText] */ - additionalInfo?: Record; + customizeResponseText?: CustomizeResponseText; }; + /** + * [descr:AIAssistantRequestCreatingInfo] + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type AIAssistantRequestCreatingInfo = Pick< + DevExpress.aiIntegration.ExecuteGridAssistantCommandParams, + 'context' | 'responseSchema' + >; export type AIColumnMode = 'auto' | 'manual'; /** * [descr:AIColumnRequestCreatingInfo] @@ -6489,6 +6510,27 @@ declare module DevExpress.common.grids { */ pageSize?: number; } + /** + * [descr:PredefinedCommands] + */ + export interface PredefinedCommands { + sorting: { + dataField: string; + sortOrder: SortOrder | 'none'; + }; + clearSorting: {}; + } + /** + * [descr:ResponseStatus] + */ + export type ResponseStatus = 'success' | 'failure'; + /** + * [descr:ResponseStatusTexts] + */ + export type ResponseStatusTexts = { + success?: string; + failure?: string; + }; /** * [descr:RowDragging] * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. From c67951627bac91e99173c113dd6fa3098f5da89b Mon Sep 17 00:00:00 2001 From: "anna.shakhova" Date: Thu, 14 May 2026 14:32:45 +0200 Subject: [PATCH 2/5] Grid AI Assistant: extend commands for data grid types --- .../src/common/grids/index.ts | 2 + .../devextreme-angular/src/common/index.ts | 2 + .../src/ui/data-grid/index.ts | 3 + .../src/ui/data-grid/nested/ai-assistant.ts | 6 +- .../src/ui/tree-list/nested/ai-assistant.ts | 6 +- .../make-angular-metadata.ts | 2 + packages/devextreme-react/src/common/grids.ts | 2 + packages/devextreme-react/src/common/index.ts | 2 + packages/devextreme-react/src/data-grid.ts | 8 +- packages/devextreme-react/src/tree-list.ts | 4 +- packages/devextreme-vue/src/common/grids.ts | 2 + packages/devextreme-vue/src/common/index.ts | 2 + packages/devextreme-vue/src/data-grid.ts | 4 +- packages/devextreme-vue/src/tree-list.ts | 4 +- .../grids/grid_core/ai_assistant/types.ts | 4 +- packages/devextreme/js/common/grids.d.ts | 26 +++++-- packages/devextreme/js/ui/data_grid.d.ts | 44 ++++++++++- .../devextreme/js/ui/data_grid_types.d.ts | 5 +- packages/devextreme/js/ui/tree_list.d.ts | 3 + .../devextreme/js/ui/tree_list_types.d.ts | 3 + packages/devextreme/ts/dx.all.d.ts | 78 +++++++++++++------ 21 files changed, 161 insertions(+), 51 deletions(-) diff --git a/packages/devextreme-angular/src/common/grids/index.ts b/packages/devextreme-angular/src/common/grids/index.ts index d7767cbc1885..ffc8b206b7f2 100644 --- a/packages/devextreme-angular/src/common/grids/index.ts +++ b/packages/devextreme-angular/src/common/grids/index.ts @@ -21,6 +21,7 @@ export type { ColumnHeaderFilterSearchConfig, ColumnLookup, ColumnResizeMode, + CommandInfo, DataChange, DataChangeInfo, DataChangeType, @@ -55,6 +56,7 @@ export type { Pager, PagerPageSize, PagingBase, + PredefinedCommandNames, PredefinedCommands, ResponseStatus, ResponseStatusTexts, diff --git a/packages/devextreme-angular/src/common/index.ts b/packages/devextreme-angular/src/common/index.ts index 2df8634d4079..2614ad5c9144 100644 --- a/packages/devextreme-angular/src/common/index.ts +++ b/packages/devextreme-angular/src/common/index.ts @@ -296,6 +296,7 @@ export namespace Grids { export type ColumnHeaderFilterSearchConfig = GridsModule.ColumnHeaderFilterSearchConfig; export type ColumnLookup = GridsModule.ColumnLookup; export type ColumnResizeMode = GridsModule.ColumnResizeMode; + export type CommandInfo = GridsModule.CommandInfo; export type DataChange = GridsModule.DataChange; export type DataChangeInfo = GridsModule.DataChangeInfo; export type DataChangeType = GridsModule.DataChangeType; @@ -330,6 +331,7 @@ export namespace Grids { export type Pager = GridsModule.Pager; export type PagerPageSize = GridsModule.PagerPageSize; export type PagingBase = GridsModule.PagingBase; + export type PredefinedCommandNames = GridsModule.PredefinedCommandNames; export type PredefinedCommands = GridsModule.PredefinedCommands; export type ResponseStatus = GridsModule.ResponseStatus; export type ResponseStatusTexts = GridsModule.ResponseStatusTexts; diff --git a/packages/devextreme-angular/src/ui/data-grid/index.ts b/packages/devextreme-angular/src/ui/data-grid/index.ts index 3bb0dc063bfe..2fd0024629bb 100644 --- a/packages/devextreme-angular/src/ui/data-grid/index.ts +++ b/packages/devextreme-angular/src/ui/data-grid/index.ts @@ -344,7 +344,10 @@ export class DxDataGridComponent extends DxComponent } + /** + * [descr:dxDataGridOptions.aiAssistant] + */ @Input() get aiAssistant(): AIAssistant { return this._getOption('aiAssistant'); diff --git a/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts b/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts index 72d94da8ad8b..4b0b7f989dba 100644 --- a/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts +++ b/packages/devextreme-angular/src/ui/data-grid/nested/ai-assistant.ts @@ -15,7 +15,7 @@ import { import type { AIIntegration } from 'devextreme/common/ai-integration'; -import type { ResponseStatus } from 'devextreme/common/grids'; +import type { CommandInfo, ResponseStatusTexts, ResponseStatus } from 'devextreme/common/grids'; import type { dxPopupOptions } from 'devextreme/ui/popup'; import { @@ -50,10 +50,10 @@ export class DxoDataGridAIAssistantComponent extends NestedOption implements OnD } @Input() - get customizeResponseText(): any { + get customizeResponseText(): ((command: CommandInfo) => ResponseStatusTexts) { return this._getOption('customizeResponseText'); } - set customizeResponseText(value: any) { + set customizeResponseText(value: ((command: CommandInfo) => ResponseStatusTexts)) { this._setOption('customizeResponseText', value); } diff --git a/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts b/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts index ee25ab0a350b..0058780ef257 100644 --- a/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts +++ b/packages/devextreme-angular/src/ui/tree-list/nested/ai-assistant.ts @@ -15,7 +15,7 @@ import { import type { AIIntegration } from 'devextreme/common/ai-integration'; -import type { ResponseStatus } from 'devextreme/common/grids'; +import type { CommandInfo, ResponseStatusTexts, ResponseStatus } from 'devextreme/common/grids'; import type { dxPopupOptions } from 'devextreme/ui/popup'; import { @@ -50,10 +50,10 @@ export class DxoTreeListAIAssistantComponent extends NestedOption implements OnD } @Input() - get customizeResponseText(): any { + get customizeResponseText(): ((command: CommandInfo) => ResponseStatusTexts) { return this._getOption('customizeResponseText'); } - set customizeResponseText(value: any) { + set customizeResponseText(value: ((command: CommandInfo) => ResponseStatusTexts)) { this._setOption('customizeResponseText', value); } diff --git a/packages/devextreme-metadata/make-angular-metadata.ts b/packages/devextreme-metadata/make-angular-metadata.ts index e485f2b84f48..439724a65439 100644 --- a/packages/devextreme-metadata/make-angular-metadata.ts +++ b/packages/devextreme-metadata/make-angular-metadata.ts @@ -3,6 +3,7 @@ import { cleanArtifacts, types } from './common'; import { commonSmdCollectionItems } from './common/smd'; import { NG_SMD_FILE, PATHS } from './common/paths'; import { replaceTypesMutations } from './common-smd-mutations'; +import { dxDataGridOptions } from 'devextreme/js/ui/data_grid'; cleanArtifacts(NG_SMD_FILE, 'NgSmdGenerator.cfg.json'); @@ -48,6 +49,7 @@ Ng.makeMetadata({ removeMembers(/\/grids:ColumnBase.ai/), removeMembers(/\/grids:GridBaseOptions.aiAssistant/), + removeMembers(/\/grids:AIAssistant/), removeMembers(/\/calendar:dxCalendarOptions.todayButtonText/), removeMembers(/\/card_view:/), removeMembers(/\/chat:TextMessage.attachments/), diff --git a/packages/devextreme-react/src/common/grids.ts b/packages/devextreme-react/src/common/grids.ts index 7263e75eebbc..f7828733db6e 100644 --- a/packages/devextreme-react/src/common/grids.ts +++ b/packages/devextreme-react/src/common/grids.ts @@ -21,6 +21,7 @@ export type { ColumnHeaderFilterSearchConfig, ColumnLookup, ColumnResizeMode, + CommandInfo, DataChange, DataChangeInfo, DataChangeType, @@ -55,6 +56,7 @@ export type { Pager, PagerPageSize, PagingBase, + PredefinedCommandNames, PredefinedCommands, ResponseStatus, ResponseStatusTexts, diff --git a/packages/devextreme-react/src/common/index.ts b/packages/devextreme-react/src/common/index.ts index ef14c0390611..8f913f434f06 100644 --- a/packages/devextreme-react/src/common/index.ts +++ b/packages/devextreme-react/src/common/index.ts @@ -296,6 +296,7 @@ export namespace Grids { export type ColumnHeaderFilterSearchConfig = GridsModule.ColumnHeaderFilterSearchConfig; export type ColumnLookup = GridsModule.ColumnLookup; export type ColumnResizeMode = GridsModule.ColumnResizeMode; + export type CommandInfo = GridsModule.CommandInfo; export type DataChange = GridsModule.DataChange; export type DataChangeInfo = GridsModule.DataChangeInfo; export type DataChangeType = GridsModule.DataChangeType; @@ -330,6 +331,7 @@ export namespace Grids { export type Pager = GridsModule.Pager; export type PagerPageSize = GridsModule.PagerPageSize; export type PagingBase = GridsModule.PagingBase; + export type PredefinedCommandNames = GridsModule.PredefinedCommandNames; export type PredefinedCommands = GridsModule.PredefinedCommands; export type ResponseStatus = GridsModule.ResponseStatus; export type ResponseStatusTexts = GridsModule.ResponseStatusTexts; diff --git a/packages/devextreme-react/src/data-grid.ts b/packages/devextreme-react/src/data-grid.ts index 4d3f2e588751..a48623591c38 100644 --- a/packages/devextreme-react/src/data-grid.ts +++ b/packages/devextreme-react/src/data-grid.ts @@ -10,7 +10,7 @@ import { Component as BaseComponent, IHtmlOptions, ComponentRef, NestedComponent import NestedOption from "./core/nested-option"; import type { dxDataGridColumn, AdaptiveDetailRowPreparingEvent, AIAssistantRequestCreatingEvent, AIColumnRequestCreatingEvent, CellClickEvent, CellDblClickEvent, CellPreparedEvent, ContentReadyEvent, ContextMenuPreparingEvent, DataErrorOccurredEvent, DisposingEvent, EditCanceledEvent, EditCancelingEvent, EditingStartEvent, EditorPreparedEvent, EditorPreparingEvent, ExportingEvent, FocusedCellChangingEvent, FocusedRowChangingEvent, InitializedEvent, InitNewRowEvent, KeyDownEvent, RowClickEvent, RowCollapsedEvent, RowCollapsingEvent, RowDblClickEvent, RowExpandedEvent, RowExpandingEvent, RowInsertedEvent, RowInsertingEvent, RowPreparedEvent, RowRemovedEvent, RowRemovingEvent, RowUpdatedEvent, RowUpdatingEvent, RowValidatingEvent, SavedEvent, SavingEvent, ToolbarPreparingEvent, dxDataGridRowObject, DataGridPredefinedColumnButton, ColumnButtonClickEvent, dxDataGridColumnButton, DataGridCommandColumnType, SelectionSensitivity, DataGridPredefinedToolbarItem, DataGridExportFormat, DataGridScrollMode, dxDataGridToolbarItem } from "devextreme/ui/data_grid"; -import type { DataChange, AIColumnMode, ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, HeaderFilterSearchConfig, HeaderFilterTexts, SelectionColumnDisplayMode, GridsEditMode, NewRowPosition, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, GroupExpandMode, SummaryType, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; +import type { DataChange, AIColumnMode, CommandInfo, ResponseStatusTexts, ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, HeaderFilterSearchConfig, HeaderFilterTexts, SelectionColumnDisplayMode, GridsEditMode, NewRowPosition, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, GroupExpandMode, SummaryType, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; import type { Mode, ValidationRuleType, HorizontalAlignment, VerticalAlignment, template, TextEditorButtonLocation, ButtonStyle, ButtonType, DataType, Format as CommonFormat, SortOrder, SearchMode, ComparisonOperator, SingleMultipleOrNone, SelectAllMode, ToolbarItemLocation, ToolbarItemComponent, TextBoxPredefinedButton, TextEditorButton, LabelMode, MaskMode, EditorStyle, ValidationMessageMode, Position as CommonPosition, ValidationStatus, PositionAlignment, Direction, DisplayMode, DragDirection, DragHighlight, ScrollbarMode, TabsIconPosition, TabsStyle } from "devextreme/common"; import type { ContentReadyEvent as ButtonContentReadyEvent, DisposingEvent as ButtonDisposingEvent, InitializedEvent as ButtonInitializedEvent, dxButtonOptions, ClickEvent, OptionChangedEvent } from "devextreme/ui/button"; import type { ContentReadyEvent as TextBoxContentReadyEvent, DisposingEvent as TextBoxDisposingEvent, InitializedEvent as TextBoxInitializedEvent, KeyDownEvent as TextBoxKeyDownEvent, dxTextBoxOptions, OptionChangedEvent as TextBoxOptionChangedEvent, TextBoxType, ChangeEvent, CopyEvent, CutEvent, EnterKeyEvent, FocusInEvent, FocusOutEvent, InputEvent, KeyUpEvent, PasteEvent, ValueChangedEvent } from "devextreme/ui/text_box"; @@ -131,7 +131,7 @@ const DataGrid = memo( } ), []); - const subscribableOptions = useMemo(() => (["columns","editing","editing.changes","editing.editColumnName","editing.editRowKey","filterValue","focusedColumnIndex","focusedRowIndex","focusedRowKey","groupPanel","groupPanel.visible","paging","paging.pageIndex","paging.pageSize","selectedRowKeys","selectionFilter","filterBuilder.value","filterBuilderPopup.height","filterBuilderPopup.position","filterBuilderPopup.visible","filterBuilderPopup.width","filterPanel.filterEnabled","editing.form.formData","editing.popup.height","aIAssistant.popup.height","editing.popup.position","aIAssistant.popup.position","editing.popup.visible","aIAssistant.popup.visible","editing.popup.width","aIAssistant.popup.width","searchPanel.text"]), []); + const subscribableOptions = useMemo(() => (["columns","editing","editing.changes","editing.editColumnName","editing.editRowKey","filterValue","focusedColumnIndex","focusedRowIndex","focusedRowKey","groupPanel","groupPanel.visible","paging","paging.pageIndex","paging.pageSize","selectedRowKeys","selectionFilter","filterBuilder.value","filterBuilderPopup.height","filterBuilderPopup.position","filterBuilderPopup.visible","filterBuilderPopup.width","filterPanel.filterEnabled","editing.form.formData","aIAssistant.popup.height","editing.popup.height","aIAssistant.popup.position","editing.popup.position","aIAssistant.popup.visible","editing.popup.visible","aIAssistant.popup.width","editing.popup.width","searchPanel.text"]), []); const independentEvents = useMemo(() => (["onAdaptiveDetailRowPreparing","onAIAssistantRequestCreating","onAIColumnRequestCreating","onCellClick","onCellDblClick","onCellPrepared","onContentReady","onContextMenuPreparing","onDataErrorOccurred","onDisposing","onEditCanceled","onEditCanceling","onEditingStart","onEditorPrepared","onEditorPreparing","onExporting","onFocusedCellChanging","onFocusedRowChanging","onInitialized","onInitNewRow","onKeyDown","onRowClick","onRowCollapsed","onRowCollapsing","onRowDblClick","onRowExpanded","onRowExpanding","onRowInserted","onRowInserting","onRowPrepared","onRowRemoved","onRowRemoving","onRowUpdated","onRowUpdating","onRowValidating","onSaved","onSaving","onToolbarPreparing"]), []); const defaults = useMemo(() => ({ @@ -244,7 +244,7 @@ const AI = Object.assign(_componentAI, type IAIAssistantProps = React.PropsWithChildren<{ aiIntegration?: AIIntegration; chat?: Record; - customizeResponseText?: any; + customizeResponseText?: ((command: CommandInfo) => ResponseStatusTexts); customizeResponseTitle?: ((status: ResponseStatus, commandNames: Array) => string); enabled?: boolean; popup?: dxPopupOptions; @@ -2847,8 +2847,8 @@ const PatternRule = Object.assign | { diff --git a/packages/devextreme-react/src/tree-list.ts b/packages/devextreme-react/src/tree-list.ts index 1d9479f96650..25f39e2e97da 100644 --- a/packages/devextreme-react/src/tree-list.ts +++ b/packages/devextreme-react/src/tree-list.ts @@ -10,7 +10,7 @@ import { Component as BaseComponent, IHtmlOptions, ComponentRef, NestedComponent import NestedOption from "./core/nested-option"; import type { dxTreeListColumn, AdaptiveDetailRowPreparingEvent, AIAssistantRequestCreatingEvent, AIColumnRequestCreatingEvent, CellClickEvent, CellDblClickEvent, CellPreparedEvent, ContentReadyEvent, ContextMenuPreparingEvent, DataErrorOccurredEvent, DisposingEvent, EditCanceledEvent, EditCancelingEvent, EditingStartEvent, EditorPreparedEvent, EditorPreparingEvent, FocusedCellChangingEvent, FocusedRowChangingEvent, InitializedEvent, InitNewRowEvent, KeyDownEvent, NodesInitializedEvent, RowClickEvent, RowCollapsedEvent, RowCollapsingEvent, RowDblClickEvent, RowExpandedEvent, RowExpandingEvent, RowInsertedEvent, RowInsertingEvent, RowPreparedEvent, RowRemovedEvent, RowRemovingEvent, RowUpdatedEvent, RowUpdatingEvent, RowValidatingEvent, SavedEvent, SavingEvent, ToolbarPreparingEvent, dxTreeListRowObject, TreeListPredefinedColumnButton, ColumnButtonClickEvent, dxTreeListColumnButton, TreeListCommandColumnType, TreeListPredefinedToolbarItem, dxTreeListToolbarItem } from "devextreme/ui/tree_list"; -import type { DataChange, AIColumnMode, ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, GridsEditMode, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, HeaderFilterSearchConfig, HeaderFilterTexts, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; +import type { DataChange, AIColumnMode, CommandInfo, ResponseStatusTexts, ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, FilterType, FixedPosition, ColumnHeaderFilter as GridsColumnHeaderFilter, SelectedFilterOperation, ColumnChooserMode, ColumnChooserSearchConfig, ColumnChooserSelectionConfig, HeaderFilterGroupInterval, ColumnHeaderFilterSearchConfig, GridsEditMode, GridsEditRefreshMode, StartEditAction, FilterPanel as GridsFilterPanel, FilterPanelTexts as GridsFilterPanelTexts, ApplyFilterMode, HeaderFilterSearchConfig, HeaderFilterTexts, EnterKeyAction, EnterKeyDirection, PagerPageSize, GridBase, DataRenderMode, StateStoreType } from "devextreme/common/grids"; import type { ContentReadyEvent as ButtonContentReadyEvent, DisposingEvent as ButtonDisposingEvent, InitializedEvent as ButtonInitializedEvent, dxButtonOptions, ClickEvent, OptionChangedEvent } from "devextreme/ui/button"; import type { ContentReadyEvent as TextBoxContentReadyEvent, DisposingEvent as TextBoxDisposingEvent, InitializedEvent as TextBoxInitializedEvent, KeyDownEvent as TextBoxKeyDownEvent, dxTextBoxOptions, OptionChangedEvent as TextBoxOptionChangedEvent, TextBoxType, ChangeEvent, CopyEvent, CutEvent, EnterKeyEvent, FocusInEvent, FocusOutEvent, InputEvent, KeyUpEvent, PasteEvent, ValueChangedEvent } from "devextreme/ui/text_box"; import type { ContentReadyEvent as FilterBuilderContentReadyEvent, DisposingEvent as FilterBuilderDisposingEvent, EditorPreparedEvent as FilterBuilderEditorPreparedEvent, EditorPreparingEvent as FilterBuilderEditorPreparingEvent, InitializedEvent as FilterBuilderInitializedEvent, OptionChangedEvent as FilterBuilderOptionChangedEvent, dxFilterBuilderField, FieldInfo, ValueChangedEvent as FilterBuilderValueChangedEvent, FilterBuilderOperation, dxFilterBuilderCustomOperation, GroupOperation } from "devextreme/ui/filter_builder"; @@ -216,7 +216,7 @@ const AI = Object.assign(_componentAI, type IAIAssistantProps = React.PropsWithChildren<{ aiIntegration?: AIIntegration; chat?: Record; - customizeResponseText?: any; + customizeResponseText?: ((command: CommandInfo) => ResponseStatusTexts); customizeResponseTitle?: ((status: ResponseStatus, commandNames: Array) => string); enabled?: boolean; popup?: dxPopupOptions; diff --git a/packages/devextreme-vue/src/common/grids.ts b/packages/devextreme-vue/src/common/grids.ts index 7263e75eebbc..f7828733db6e 100644 --- a/packages/devextreme-vue/src/common/grids.ts +++ b/packages/devextreme-vue/src/common/grids.ts @@ -21,6 +21,7 @@ export type { ColumnHeaderFilterSearchConfig, ColumnLookup, ColumnResizeMode, + CommandInfo, DataChange, DataChangeInfo, DataChangeType, @@ -55,6 +56,7 @@ export type { Pager, PagerPageSize, PagingBase, + PredefinedCommandNames, PredefinedCommands, ResponseStatus, ResponseStatusTexts, diff --git a/packages/devextreme-vue/src/common/index.ts b/packages/devextreme-vue/src/common/index.ts index ef14c0390611..8f913f434f06 100644 --- a/packages/devextreme-vue/src/common/index.ts +++ b/packages/devextreme-vue/src/common/index.ts @@ -296,6 +296,7 @@ export namespace Grids { export type ColumnHeaderFilterSearchConfig = GridsModule.ColumnHeaderFilterSearchConfig; export type ColumnLookup = GridsModule.ColumnLookup; export type ColumnResizeMode = GridsModule.ColumnResizeMode; + export type CommandInfo = GridsModule.CommandInfo; export type DataChange = GridsModule.DataChange; export type DataChangeInfo = GridsModule.DataChangeInfo; export type DataChangeType = GridsModule.DataChangeType; @@ -330,6 +331,7 @@ export namespace Grids { export type Pager = GridsModule.Pager; export type PagerPageSize = GridsModule.PagerPageSize; export type PagingBase = GridsModule.PagingBase; + export type PredefinedCommandNames = GridsModule.PredefinedCommandNames; export type PredefinedCommands = GridsModule.PredefinedCommands; export type ResponseStatus = GridsModule.ResponseStatus; export type ResponseStatusTexts = GridsModule.ResponseStatusTexts; diff --git a/packages/devextreme-vue/src/data-grid.ts b/packages/devextreme-vue/src/data-grid.ts index ccdf577984f9..ca6626cf5e2e 100644 --- a/packages/devextreme-vue/src/data-grid.ts +++ b/packages/devextreme-vue/src/data-grid.ts @@ -20,6 +20,8 @@ import { SearchPanel, Sorting, AIColumnMode, + CommandInfo, + ResponseStatusTexts, ResponseStatus, DataChangeType, ColumnAIOptions, @@ -744,7 +746,7 @@ const DxAIAssistantConfig = { props: { aiIntegration: Object as PropType, chat: Object as PropType>, - customizeResponseText: {}, + customizeResponseText: Function as PropType<((command: CommandInfo) => ResponseStatusTexts)>, customizeResponseTitle: Function as PropType<((status: ResponseStatus, commandNames: Array) => string)>, enabled: Boolean, popup: Object as PropType | Record>, diff --git a/packages/devextreme-vue/src/tree-list.ts b/packages/devextreme-vue/src/tree-list.ts index abc1c8255659..a411b5c757d7 100644 --- a/packages/devextreme-vue/src/tree-list.ts +++ b/packages/devextreme-vue/src/tree-list.ts @@ -20,6 +20,8 @@ import { SearchPanel, Sorting, AIColumnMode, + CommandInfo, + ResponseStatusTexts, ResponseStatus, DataChangeType, ColumnAIOptions, @@ -733,7 +735,7 @@ const DxAIAssistantConfig = { props: { aiIntegration: Object as PropType, chat: Object as PropType>, - customizeResponseText: {}, + customizeResponseText: Function as PropType<((command: CommandInfo) => ResponseStatusTexts)>, customizeResponseTitle: Function as PropType<((status: ResponseStatus, commandNames: Array) => string)>, enabled: Boolean, popup: Object as PropType | Record>, diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts index 3786a0723949..c73c7249db9b 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts @@ -1,5 +1,5 @@ import type { RequestCallbacks } from '@js/common/ai-integration'; -import type { CustomizeResponseText } from '@js/common/grids'; +import type { AIAssistant } from '@js/common/grids'; import type { Message } from '@js/ui/chat'; import type { InternalGrid } from '@ts/grids/grid_core/m_types'; import type { z, ZodObject, ZodRawShape } from 'zod'; @@ -55,7 +55,7 @@ export interface CommandMessages { failure: string; } -export { CustomizeResponseText }; +export type CustomizeResponseText = AIAssistant['customizeResponseText']; // TODO: move to d.ts export type CustomizeResponseTitle = ( diff --git a/packages/devextreme/js/common/grids.d.ts b/packages/devextreme/js/common/grids.d.ts index 3b6e39eb7bc0..2a114190a804 100644 --- a/packages/devextreme/js/common/grids.d.ts +++ b/packages/devextreme/js/common/grids.d.ts @@ -100,30 +100,38 @@ export type ResponseStatusTexts = { }; /** - * @docid + * @docid GridBasePredefinedCommands * @public * @namespace DevExpress.common.grids */ -export interface PredefinedCommands { +export type PredefinedCommands = { sorting: { dataField: string; sortOrder: SortOrder | 'none'; }; clearSorting: {}; -} +}; +/** + * @docid + * @namespace DevExpress.common.grids + */ export type CommandInfo< TCommands extends PredefinedCommands = PredefinedCommands, > = { [K in keyof TCommands]: { name: K; args: TCommands[K] } }[keyof TCommands] | { name: string; args: Record }; -export type CustomizeResponseText< - TCommands extends PredefinedCommands = PredefinedCommands, -> = (command: CommandInfo) => ResponseStatusTexts; +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type PredefinedCommandNames = keyof PredefinedCommands; /** * @docid * @public + * @type object * @namespace DevExpress.common.grids */ export type AIAssistant = { @@ -152,11 +160,13 @@ export type AIAssistant string; + customizeResponseTitle?: (status: ResponseStatus, commandNames: (keyof TCommands)[]) => string; /** * @docid + * @type_function_param1 command:CommandInfo + * @type_function_return ResponseStatusTexts */ - customizeResponseText?: CustomizeResponseText; + customizeResponseText?: (command: CommandInfo) => ResponseStatusTexts; }; /** diff --git a/packages/devextreme/js/ui/data_grid.d.ts b/packages/devextreme/js/ui/data_grid.d.ts index 45ebe3c527b7..db9e66103bc3 100644 --- a/packages/devextreme/js/ui/data_grid.d.ts +++ b/packages/devextreme/js/ui/data_grid.d.ts @@ -82,6 +82,10 @@ import { ToolbarPreparingInfo, AIColumnRequestCreatingInfo, AIAssistantRequestCreatingInfo, + AIAssistant as BaseAIAssistant, + PredefinedCommands as BasePredefinedCommands, + CommandInfo as BaseCommandInfo, + ResponseStatusTexts, } from '../common/grids'; export { @@ -101,7 +105,6 @@ export { } from '../common'; export { - AIAssistant, ApplyFilterMode, ColumnChooser, ColumnChooserMode, @@ -146,6 +149,7 @@ export { StateStoreType, StateStoring, SummaryType, + ResponseStatusTexts, } from '../common/grids'; export { @@ -1170,7 +1174,7 @@ export type DataRowTemplateData = { readonly isExpanded?: boolean; }; -type OverriddenKeys = 'columns' | 'customizeColumns' | 'dataRowTemplate' | 'editing' | 'export' | 'grouping' | 'groupPanel' | 'keyExpr' | 'masterDetail' | 'onCellClick' | 'onCellDblClick' | 'onCellHoverChanged' | 'onCellPrepared' | 'onContextMenuPreparing' | 'onEditingStart' | 'onEditorPrepared' | 'onEditorPreparing' | 'onExporting' | 'onFocusedCellChanged' | 'onFocusedCellChanging' | 'onFocusedRowChanged' | 'onFocusedRowChanging' | 'onRowClick' | 'onRowDblClick' | 'onRowPrepared' | 'remoteOperations' | 'rowTemplate' | 'scrolling' | 'selection' | 'selectionFilter' | 'sortByGroupSummaryInfo' | 'summary' | 'toolbar'; +type OverriddenKeys = 'columns' | 'customizeColumns' | 'dataRowTemplate' | 'editing' | 'export' | 'grouping' | 'groupPanel' | 'keyExpr' | 'masterDetail' | 'onCellClick' | 'onCellDblClick' | 'onCellHoverChanged' | 'onCellPrepared' | 'onContextMenuPreparing' | 'onEditingStart' | 'onEditorPrepared' | 'onEditorPreparing' | 'onExporting' | 'onFocusedCellChanged' | 'onFocusedCellChanging' | 'onFocusedRowChanged' | 'onFocusedRowChanging' | 'onRowClick' | 'onRowDblClick' | 'onRowPrepared' | 'remoteOperations' | 'rowTemplate' | 'scrolling' | 'selection' | 'selectionFilter' | 'sortByGroupSummaryInfo' | 'summary' | 'toolbar' | 'aiAssistant'; /** * @deprecated use Properties instead @@ -1180,6 +1184,11 @@ type OverriddenKeys = 'columns' | 'customizeColumns' | 'dataRowTemplate' | 'edit * @type object */ export type dxDataGridOptions = Omit, TRowData, TKey>, OverriddenKeys> & { + /** + * @docid + * @public + */ + aiAssistant?: AIAssistant; /** * @docid * @type Array @@ -1932,6 +1941,37 @@ export type Toolbar = { disabled?: boolean; }; +/** + * @docid + * @public + * @inherits GridBasePredefinedCommands + */ +export type PredefinedCommands = BasePredefinedCommands & { + grouping: { + dataField: string; + groupIndex: number; + }; + clearGrouping: {}; +}; + +/** + * @docid + * @hidden + */ +export type GridCommandInfo = BaseCommandInfo; + +/** + * @docid + * @public + */ +export type PredefinedCommandNames = keyof PredefinedCommands; + +/** + * @docid + * @public + */ +export type AIAssistant = BaseAIAssistant; + /** * @namespace DevExpress.ui * @deprecated Use Editing instead diff --git a/packages/devextreme/js/ui/data_grid_types.d.ts b/packages/devextreme/js/ui/data_grid_types.d.ts index fcf7ed3db4b7..00f34a368799 100644 --- a/packages/devextreme/js/ui/data_grid_types.d.ts +++ b/packages/devextreme/js/ui/data_grid_types.d.ts @@ -12,7 +12,6 @@ export { Sortable, SortOrder, ToolbarItemLocation, - AIAssistant, ApplyFilterMode, ColumnChooser, ColumnChooserMode, @@ -57,6 +56,7 @@ export { StateStoreType, StateStoring, SummaryType, + ResponseStatusTexts, DataGridCommandColumnType, DataGridExportFormat, DataGridScrollMode, @@ -142,6 +142,9 @@ export { SummaryTexts, ToolbarItem, Toolbar, + PredefinedCommands, + PredefinedCommandNames, + AIAssistant, Editing, EditingTexts, Scrolling, diff --git a/packages/devextreme/js/ui/tree_list.d.ts b/packages/devextreme/js/ui/tree_list.d.ts index aa9da9125d22..729ca280ca8c 100644 --- a/packages/devextreme/js/ui/tree_list.d.ts +++ b/packages/devextreme/js/ui/tree_list.d.ts @@ -116,6 +116,9 @@ export { export { AIAssistant, + PredefinedCommands, + PredefinedCommandNames, + ResponseStatusTexts, ApplyFilterMode, ColumnChooser, ColumnChooserMode, diff --git a/packages/devextreme/js/ui/tree_list_types.d.ts b/packages/devextreme/js/ui/tree_list_types.d.ts index 1ea95a61a974..e3b56e4caa4a 100644 --- a/packages/devextreme/js/ui/tree_list_types.d.ts +++ b/packages/devextreme/js/ui/tree_list_types.d.ts @@ -2,6 +2,9 @@ export { DisplayMode, SearchMode, AIAssistant, + PredefinedCommands, + PredefinedCommandNames, + ResponseStatusTexts, ApplyFilterMode, ColumnChooser, ColumnChooserMode, diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 6b618f63a48e..408a6205759b 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -1226,16 +1226,6 @@ declare module DevExpress.common { }; export type ButtonStyle = 'text' | 'outlined' | 'contained'; export type ButtonType = 'danger' | 'default' | 'normal' | 'success'; - /** - * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. - */ - export type CommandInfo< - TCommands extends DevExpress.common.grids.PredefinedCommands = DevExpress.common.grids.PredefinedCommands - > = - | { - [K in keyof TCommands]: { name: K; args: TCommands[K] }; - }[keyof TCommands] - | { name: string; args: Record }; /** * [descr:CompareRule] */ @@ -1270,14 +1260,6 @@ declare module DevExpress.common { | '===' | '>' | '>='; - /** - * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. - */ - export type CustomizeResponseText< - TCommands extends DevExpress.common.grids.PredefinedCommands = DevExpress.common.grids.PredefinedCommands - > = ( - command: CommandInfo - ) => DevExpress.common.grids.ResponseStatusTexts; /** * [descr:CustomRule] */ @@ -4671,12 +4653,14 @@ declare module DevExpress.common.grids { */ customizeResponseTitle?: ( status: ResponseStatus, - commandNames: (keyof TCommands | string)[] + commandNames: (keyof TCommands)[] ) => string; /** * [descr:AIAssistant.customizeResponseText] */ - customizeResponseText?: CustomizeResponseText; + customizeResponseText?: ( + command: CommandInfo + ) => ResponseStatusTexts; }; /** * [descr:AIAssistantRequestCreatingInfo] @@ -5257,6 +5241,17 @@ declare module DevExpress.common.grids { calculateCellValue?: (rowData: any) => any; }; export type ColumnResizeMode = 'nextColumn' | 'widget'; + /** + * [descr:CommandInfo] + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type CommandInfo< + TCommands extends PredefinedCommands = PredefinedCommands + > = + | { + [K in keyof TCommands]: { name: K; args: TCommands[K] }; + }[keyof TCommands] + | { name: string; args: Record }; /** * [descr:DataChange] */ @@ -6511,15 +6506,19 @@ declare module DevExpress.common.grids { pageSize?: number; } /** - * [descr:PredefinedCommands] + * [descr:PredefinedCommandNames] */ - export interface PredefinedCommands { + export type PredefinedCommandNames = keyof PredefinedCommands; + /** + * [descr:GridBasePredefinedCommands] + */ + export type PredefinedCommands = { sorting: { dataField: string; sortOrder: SortOrder | 'none'; }; clearSorting: {}; - } + }; /** * [descr:ResponseStatus] */ @@ -12429,6 +12428,11 @@ declare module DevExpress.ui { TKey = any > = DevExpress.common.core.events.EventInfo> & DevExpress.common.grids.AdaptiveDetailRowPreparingInfo; + /** + * [descr:AIAssistant] + */ + export type AIAssistant = + DevExpress.common.grids.AIAssistant; /** * [descr:_ui_data_grid_AIAssistantRequestCreatingEvent] */ @@ -13366,6 +13370,12 @@ declare module DevExpress.ui { */ readonly rows: Array>; }; + /** + * [descr:GridCommandInfo] + * @deprecated Attention! This type is for internal purposes only. If you used it previously, please submit a ticket to our {@link https://supportcenter.devexpress.com/ticket/create Support Center}. We will check if there is an alternative solution. + */ + export type GridCommandInfo = + DevExpress.common.grids.CommandInfo; /** * [descr:GroupData] */ @@ -13563,8 +13573,24 @@ declare module DevExpress.ui { | 'selectionFilter' | 'sortByGroupSummaryInfo' | 'summary' - | 'toolbar'; + | 'toolbar' + | 'aiAssistant'; export type Paging = DevExpress.common.grids.PagingBase; + /** + * [descr:PredefinedCommandNames] + */ + export type PredefinedCommandNames = keyof PredefinedCommands; + /** + * [descr:PredefinedCommands] + */ + export type PredefinedCommands = + DevExpress.common.grids.PredefinedCommands & { + grouping: { + dataField: string; + groupIndex: number; + }; + clearGrouping: {}; + }; export type Properties = dxDataGridOptions< TRowData, TKey @@ -14343,6 +14369,10 @@ declare module DevExpress.ui { >, DevExpress.ui.dxDataGrid.OverriddenKeys > & { + /** + * [descr:dxDataGridOptions.aiAssistant] + */ + aiAssistant?: DevExpress.ui.dxDataGrid.AIAssistant; /** * [descr:dxDataGridOptions.columns] */ From e3e6db79a37178ca80ba16886ce0da4381fc0e58 Mon Sep 17 00:00:00 2001 From: "anna.shakhova" Date: Thu, 14 May 2026 14:50:14 +0200 Subject: [PATCH 3/5] rebase --- .../grid_core/ai_assistant/ai_assistant_controller.ts | 9 ++++----- .../js/__internal/grids/grid_core/ai_assistant/types.ts | 7 +------ packages/devextreme/js/common/grids.d.ts | 2 +- packages/devextreme/ts/dx.all.d.ts | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts index e35eb20bec68..32baac9542c6 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts @@ -4,6 +4,7 @@ import type { } from '@js/common/ai-integration'; import messageLocalization from '@js/common/core/localization/message'; import { ArrayStore } from '@js/common/data'; +import type { ResponseStatus } from '@js/common/grids'; import Guid from '@js/core/guid'; import { captionize } from '@js/core/utils/inflector'; import { isFunction, isString } from '@js/core/utils/type'; @@ -19,8 +20,6 @@ import { GridCommands } from './grid_commands'; import type { AIMessage, CommandResult, - CustomizeResponseText, - CustomizeResponseTitle, GridCommand, } from './types'; import { getMessageStatus, isAIMessage } from './utils'; @@ -39,7 +38,7 @@ export class AIAssistantController extends Controller { commandNames: string[], ): string { // TODO: remove type description, it should be got from d.ts - const customizeResponseTitle = this.option('aiAssistant.customizeResponseTitle') as CustomizeResponseTitle | undefined; + const customizeResponseTitle = this.option('aiAssistant.customizeResponseTitle'); if (!commandNames.length) { return messageLocalization.format('dxDataGrid-aiAssistantErrorMessage'); @@ -47,7 +46,7 @@ export class AIAssistantController extends Controller { if (customizeResponseTitle && isFunction(customizeResponseTitle)) { // TODO: add type description to d.ts - return customizeResponseTitle(status, commandNames); + return customizeResponseTitle(status as ResponseStatus, commandNames); } if (commandNames.length === 1) { @@ -94,7 +93,7 @@ export class AIAssistantController extends Controller { } // TODO: add type description to d.ts - const customizeResponseText = this.option('aiAssistant.customizeResponseText') as CustomizeResponseText | undefined; + const customizeResponseText = this.option('aiAssistant.customizeResponseText'); return this.gridCommands?.executeCommands(response.actions, customizeResponseText) ?? Promise.reject(new Error('Grid commands not initialized')); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts index c73c7249db9b..cbf8867bb863 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts @@ -56,12 +56,7 @@ export interface CommandMessages { } export type CustomizeResponseText = AIAssistant['customizeResponseText']; - -// TODO: move to d.ts -export type CustomizeResponseTitle = ( - status: MessageStatus, - commandNames: string[], -) => string; +export type CustomizeResponseTitle = AIAssistant['customizeResponseTitle']; export type AIAssistantRequestCallbacks = RequestCallbacks & { onAbort?: () => void; diff --git a/packages/devextreme/js/common/grids.d.ts b/packages/devextreme/js/common/grids.d.ts index 2a114190a804..6aed45362ed5 100644 --- a/packages/devextreme/js/common/grids.d.ts +++ b/packages/devextreme/js/common/grids.d.ts @@ -160,7 +160,7 @@ export type AIAssistant string; + customizeResponseTitle?: (status: ResponseStatus, commandNames: (keyof TCommands | string)[]) => string; /** * @docid * @type_function_param1 command:CommandInfo diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 408a6205759b..9d5f92807830 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -4653,7 +4653,7 @@ declare module DevExpress.common.grids { */ customizeResponseTitle?: ( status: ResponseStatus, - commandNames: (keyof TCommands)[] + commandNames: (keyof TCommands | string)[] ) => string; /** * [descr:AIAssistant.customizeResponseText] @@ -4668,7 +4668,7 @@ declare module DevExpress.common.grids { */ export type AIAssistantRequestCreatingInfo = Pick< DevExpress.aiIntegration.ExecuteGridAssistantCommandParams, - 'context' | 'responseSchema' + 'context' | 'responseSchema' | 'additionalInfo' >; export type AIColumnMode = 'auto' | 'manual'; /** From 2a8c8c992332965d7bce7ff1b2dca2b0ec693e21 Mon Sep 17 00:00:00 2001 From: "anna.shakhova" Date: Thu, 14 May 2026 16:25:49 +0200 Subject: [PATCH 4/5] remove string commandName from types --- ...t_integration_controller.integration.test.ts | 3 +-- .../__tests__/grid_commands.test.ts | 12 ++++++------ .../ai_assistant/ai_assistant_controller.ts | 17 +++++++---------- .../grid_core/ai_assistant/grid_commands.ts | 12 ++++++++---- .../grids/grid_core/ai_assistant/types.ts | 7 +------ .../grids/grid_core/ai_assistant/utils.ts | 9 +++++---- packages/devextreme/js/common/grids.d.ts | 5 ++--- packages/devextreme/ts/dx.all.d.ts | 10 ++++------ 8 files changed, 34 insertions(+), 41 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_integration_controller.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_integration_controller.integration.test.ts index 72af1f8a0778..11a637eb676e 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_integration_controller.integration.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_integration_controller.integration.test.ts @@ -78,8 +78,7 @@ const createController = async ( { dataField: 'name', caption: 'Name', dataType: 'string' }, ], ...options, - // TODO: remove when d.ts is ready - } as unknown as Properties); + }); const controller = new AIAssistantIntegrationController(instance); controller.init(); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/grid_commands.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/grid_commands.test.ts index e10bb06864e3..f90aa5b42616 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/grid_commands.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/grid_commands.test.ts @@ -961,7 +961,7 @@ describe('GridCommands', () => { }); it('should call customizeResponseText once per executed command with correct args', async () => { - const customizeSpy = jest.fn(() => undefined); + const customizeSpy = jest.fn(() => ({})); const command = createMockCommand('test'); const gridCommands = new GridCommands(createMockComponent(), [command]); @@ -974,8 +974,8 @@ describe('GridCommands', () => { ); expect(customizeSpy).toHaveBeenCalledTimes(2); - expect(customizeSpy).toHaveBeenNthCalledWith(1, 'test', { key: 'val1' }); - expect(customizeSpy).toHaveBeenNthCalledWith(2, 'test', { key: 'val2' }); + expect(customizeSpy).toHaveBeenNthCalledWith(1, { name: 'test', args: { key: 'val1' } }); + expect(customizeSpy).toHaveBeenNthCalledWith(2, { name: 'test', args: { key: 'val2' } }); }); it('should replace both messages when returning { success, failure }', async () => { @@ -1044,7 +1044,7 @@ describe('GridCommands', () => { }); it('should leave default message when customizeResponseText returns undefined', async () => { - const customizeResponseText: CustomizeResponseText = () => undefined; + const customizeResponseText: CustomizeResponseText = () => ({}); const command = createMockCommand('test', { execute: (_comp, { success }) => async () => success('original'), @@ -1086,12 +1086,12 @@ describe('GridCommands', () => { ); expect(customizeSpy).toHaveBeenCalledTimes(1); - expect(customizeSpy).toHaveBeenCalledWith('abort', {}); + expect(customizeSpy).toHaveBeenCalledWith({ name: 'abort', args: {} }); expect(results[1].status).toBe('aborted'); }); it('should not call customizeResponseText when no commands are executed', async () => { - const customizeSpy = jest.fn(() => undefined); + const customizeSpy = jest.fn(() => ({})); const gridCommands = new GridCommands(createMockComponent(), []); await gridCommands.executeCommands([], customizeSpy); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts index 32baac9542c6..d3fd3ad83d46 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts @@ -4,7 +4,7 @@ import type { } from '@js/common/ai-integration'; import messageLocalization from '@js/common/core/localization/message'; import { ArrayStore } from '@js/common/data'; -import type { ResponseStatus } from '@js/common/grids'; +import type { PredefinedCommandNames, ResponseStatus } from '@js/common/grids'; import Guid from '@js/core/guid'; import { captionize } from '@js/core/utils/inflector'; import { isFunction, isString } from '@js/core/utils/type'; @@ -34,10 +34,9 @@ export class AIAssistantController extends Controller { private processing = false; private getCustomizedResponseTitle( - status: MessageStatus, - commandNames: string[], + status: ResponseStatus, + commandNames: PredefinedCommandNames[], ): string { - // TODO: remove type description, it should be got from d.ts const customizeResponseTitle = this.option('aiAssistant.customizeResponseTitle'); if (!commandNames.length) { @@ -45,8 +44,7 @@ export class AIAssistantController extends Controller { } if (customizeResponseTitle && isFunction(customizeResponseTitle)) { - // TODO: add type description to d.ts - return customizeResponseTitle(status as ResponseStatus, commandNames); + return customizeResponseTitle(status, commandNames); } if (commandNames.length === 1) { @@ -59,8 +57,8 @@ export class AIAssistantController extends Controller { ].join(' and '); } - private getCommandNames(actions: ExecuteGridAssistantAction[]): string[] { - const commandNames = actions.map(({ name }) => name); + private getCommandNames(actions: ExecuteGridAssistantAction[]): PredefinedCommandNames[] { + const commandNames = actions.map(({ name }) => name as PredefinedCommandNames); const uniqueCommandNameSet = new Set(commandNames); return Array.from(uniqueCommandNameSet); @@ -92,7 +90,6 @@ export class AIAssistantController extends Controller { return Promise.reject(new Error('Received invalid commands')); } - // TODO: add type description to d.ts const customizeResponseText = this.option('aiAssistant.customizeResponseText'); return this.gridCommands?.executeCommands(response.actions, customizeResponseText) @@ -127,7 +124,7 @@ export class AIAssistantController extends Controller { private completeAIMessage( messageId: string, commands: CommandResult[], - commandNames: string[], + commandNames: PredefinedCommandNames[], ): void { const messageStatus = getMessageStatus(commands); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts index d6b2a539eeee..15b6265be221 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/grid_commands.ts @@ -1,5 +1,6 @@ import type { ExecuteGridAssistantAction } from '@js/common/ai-integration'; import messageLocalization from '@js/common/core/localization/message'; +import type { CommandInfo } from '@js/common/grids'; import { isDefined, isObject } from '@js/core/utils/type'; import { logger } from '@ts/core/utils/m_console'; import { @@ -55,11 +56,10 @@ export class GridCommands { private static applyCustomizedResponseText( result: CommandResult, - name: string, - args: Record, + command: CommandInfo, customizeResponseText?: CustomizeResponseText, ): void { - const customMessages = customizeResponseText?.({ name, args }); + const customMessages = customizeResponseText?.(command); const customMessage = customMessages?.[result.status]; if (isDefined(customMessage)) { @@ -191,7 +191,11 @@ export class GridCommands { // eslint-disable-next-line no-await-in-loop const result = await this.executeCommand(command, args, callbacks); - GridCommands.applyCustomizedResponseText(result, name, args, customizeResponseText); + GridCommands.applyCustomizedResponseText( + result, + { name, args } as CommandInfo, + customizeResponseText, + ); results.push(result); } } finally { diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts index cbf8867bb863..c18119073614 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts @@ -50,12 +50,7 @@ export interface GridCommand< ) => CommandExecutor>; } -export interface CommandMessages { - success: string; - failure: string; -} - -export type CustomizeResponseText = AIAssistant['customizeResponseText']; +export type CustomizeResponseText = NonNullable; export type CustomizeResponseTitle = AIAssistant['customizeResponseTitle']; export type AIAssistantRequestCallbacks = RequestCallbacks & { diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/utils.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/utils.ts index ccf7c7bf5a3d..8c72796ca277 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/utils.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/utils.ts @@ -1,7 +1,8 @@ +import type { ResponseStatus } from '@js/common/grids'; import { isObject } from '@js/core/utils/type'; import type { Message } from '@js/ui/chat'; -import { AI_ASSISTANT_AUTHOR_ID, MessageStatus } from './const'; +import { AI_ASSISTANT_AUTHOR_ID } from './const'; import type { AIMessage, CommandResult } from './types'; export const isAIMessage = ( @@ -28,10 +29,10 @@ export const hasAbortedCommands = ( commands: CommandResult[] | undefined, ): boolean => !!commands?.some(({ status }) => status === 'aborted'); -export const getMessageStatus = (commands: CommandResult[]): MessageStatus => { +export const getMessageStatus = (commands: CommandResult[]): ResponseStatus => { if (hasCommandErrors(commands) || hasAbortedCommands(commands)) { - return MessageStatus.Failure; + return 'failure'; } - return MessageStatus.Success; + return 'success'; }; diff --git a/packages/devextreme/js/common/grids.d.ts b/packages/devextreme/js/common/grids.d.ts index 6aed45362ed5..e0054d145ff0 100644 --- a/packages/devextreme/js/common/grids.d.ts +++ b/packages/devextreme/js/common/grids.d.ts @@ -118,8 +118,7 @@ export type PredefinedCommands = { */ export type CommandInfo< TCommands extends PredefinedCommands = PredefinedCommands, -> = { [K in keyof TCommands]: { name: K; args: TCommands[K] } }[keyof TCommands] - | { name: string; args: Record }; +> = { [K in keyof TCommands]: { name: K; args: TCommands[K] } }[keyof TCommands]; /** * @docid @@ -160,7 +159,7 @@ export type AIAssistant string; + customizeResponseTitle?: (status: ResponseStatus, commandNames: (keyof TCommands)[]) => string; /** * @docid * @type_function_param1 command:CommandInfo diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 9d5f92807830..f502c536f965 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -4653,7 +4653,7 @@ declare module DevExpress.common.grids { */ customizeResponseTitle?: ( status: ResponseStatus, - commandNames: (keyof TCommands | string)[] + commandNames: (keyof TCommands)[] ) => string; /** * [descr:AIAssistant.customizeResponseText] @@ -5247,11 +5247,9 @@ declare module DevExpress.common.grids { */ export type CommandInfo< TCommands extends PredefinedCommands = PredefinedCommands - > = - | { - [K in keyof TCommands]: { name: K; args: TCommands[K] }; - }[keyof TCommands] - | { name: string; args: Record }; + > = { + [K in keyof TCommands]: { name: K; args: TCommands[K] }; + }[keyof TCommands]; /** * [descr:DataChange] */ From 4565eec9b61a4ae9caf8024fa3a8824011b505b9 Mon Sep 17 00:00:00 2001 From: "anna.shakhova" Date: Thu, 14 May 2026 16:29:06 +0200 Subject: [PATCH 5/5] remove string commandName from types --- .../grid_core/ai_assistant/__tests__/utils.test.ts | 12 ++++++------ .../__internal/grids/grid_core/ai_assistant/types.ts | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/utils.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/utils.test.ts index 7b59661006b3..68a0cfcbaba6 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/utils.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/utils.test.ts @@ -3,7 +3,7 @@ import { } from '@jest/globals'; import type { Message } from '@js/ui/chat'; -import { AI_ASSISTANT_AUTHOR_ID, MessageStatus } from '../const'; +import { AI_ASSISTANT_AUTHOR_ID } from '../const'; import { getMessageStatus, hasAbortedCommands, @@ -183,7 +183,7 @@ describe('getMessageStatus', () => { { status: 'success' as const, message: 'Filtered' }, ]; - expect(getMessageStatus(commands)).toBe(MessageStatus.Success); + expect(getMessageStatus(commands)).toBe('success'); }); it('should return Failure when commands contain errors', () => { @@ -192,7 +192,7 @@ describe('getMessageStatus', () => { { status: 'failure' as const, message: 'Failed to filter' }, ]; - expect(getMessageStatus(commands)).toBe(MessageStatus.Failure); + expect(getMessageStatus(commands)).toBe('failure'); }); it('should return Failure when commands contain aborted items', () => { @@ -201,7 +201,7 @@ describe('getMessageStatus', () => { { status: 'aborted' as const, message: 'Filter was aborted' }, ]; - expect(getMessageStatus(commands)).toBe(MessageStatus.Failure); + expect(getMessageStatus(commands)).toBe('failure'); }); it('should return Failure when commands contain both errors and aborted items', () => { @@ -210,10 +210,10 @@ describe('getMessageStatus', () => { { status: 'aborted' as const, message: 'Aborted' }, ]; - expect(getMessageStatus(commands)).toBe(MessageStatus.Failure); + expect(getMessageStatus(commands)).toBe('failure'); }); it('should return Success when commands array is empty', () => { - expect(getMessageStatus([])).toBe(MessageStatus.Success); + expect(getMessageStatus([])).toBe('success'); }); }); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts index c18119073614..3be8c4e467ae 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/types.ts @@ -51,7 +51,6 @@ export interface GridCommand< } export type CustomizeResponseText = NonNullable; -export type CustomizeResponseTitle = AIAssistant['customizeResponseTitle']; export type AIAssistantRequestCallbacks = RequestCallbacks & { onAbort?: () => void;