diff --git a/packages/devextreme-angular/src/common/grids/index.ts b/packages/devextreme-angular/src/common/grids/index.ts index 03696c47816d..cc9f2595b51f 100644 --- a/packages/devextreme-angular/src/common/grids/index.ts +++ b/packages/devextreme-angular/src/common/grids/index.ts @@ -6,6 +6,7 @@ export type { AIColumnRequestCreatingInfo, ApplyChangesMode, ApplyFilterMode, + BasicFilterExprObj, ColumnAIOptions, ColumnBase, ColumnButtonBase, @@ -21,6 +22,9 @@ export type { ColumnHeaderFilterSearchConfig, ColumnLookup, ColumnResizeMode, + CombinedFilterExprObj, + CommandInfo, + CompositeKeyPair, DataChange, DataChangeInfo, DataChangeType, @@ -30,6 +34,7 @@ export type { EditingTextsBase, EnterKeyAction, EnterKeyDirection, + FilterExprObj, FilterOperation, FilterPanel, FilterPanelTexts, @@ -50,11 +55,16 @@ export type { KeyboardNavigation, KeyDownInfo, LoadPanel, + NegatedFilterExprObj, NewRowInfo, NewRowPosition, Pager, PagerPageSize, PagingBase, + PredefinedCommandNames, + 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..6267639283ab 100644 --- a/packages/devextreme-angular/src/common/index.ts +++ b/packages/devextreme-angular/src/common/index.ts @@ -275,12 +275,13 @@ 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; export type ApplyChangesMode = GridsModule.ApplyChangesMode; export type ApplyFilterMode = GridsModule.ApplyFilterMode; + export type BasicFilterExprObj = GridsModule.BasicFilterExprObj; export type ColumnAIOptions = GridsModule.ColumnAIOptions; export type ColumnBase = GridsModule.ColumnBase; export type ColumnButtonBase = GridsModule.ColumnButtonBase; @@ -296,6 +297,9 @@ export namespace Grids { export type ColumnHeaderFilterSearchConfig = GridsModule.ColumnHeaderFilterSearchConfig; export type ColumnLookup = GridsModule.ColumnLookup; export type ColumnResizeMode = GridsModule.ColumnResizeMode; + export type CombinedFilterExprObj = GridsModule.CombinedFilterExprObj; + export type CommandInfo = GridsModule.CommandInfo; + export type CompositeKeyPair = GridsModule.CompositeKeyPair; export type DataChange = GridsModule.DataChange; export type DataChangeInfo = GridsModule.DataChangeInfo; export type DataChangeType = GridsModule.DataChangeType; @@ -305,6 +309,7 @@ export namespace Grids { export type EditingTextsBase = GridsModule.EditingTextsBase; export type EnterKeyAction = GridsModule.EnterKeyAction; export type EnterKeyDirection = GridsModule.EnterKeyDirection; + export type FilterExprObj = GridsModule.FilterExprObj; export type FilterOperation = GridsModule.FilterOperation; export type FilterPanel = GridsModule.FilterPanel; export type FilterPanelTexts = GridsModule.FilterPanelTexts; @@ -325,11 +330,16 @@ export namespace Grids { export type KeyboardNavigation = GridsModule.KeyboardNavigation; export type KeyDownInfo = GridsModule.KeyDownInfo; export type LoadPanel = GridsModule.LoadPanel; + export type NegatedFilterExprObj = GridsModule.NegatedFilterExprObj; export type NewRowInfo = GridsModule.NewRowInfo; export type NewRowPosition = GridsModule.NewRowPosition; 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; 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/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 bf3d005ac860..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,6 +15,7 @@ import { import type { AIIntegration } from 'devextreme/common/ai-integration'; +import type { CommandInfo, ResponseStatusTexts, 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(): ((command: CommandInfo) => ResponseStatusTexts) { + return this._getOption('customizeResponseText'); + } + set customizeResponseText(value: ((command: CommandInfo) => ResponseStatusTexts)) { + 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..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,6 +15,7 @@ import { import type { AIIntegration } from 'devextreme/common/ai-integration'; +import type { CommandInfo, ResponseStatusTexts, 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(): ((command: CommandInfo) => ResponseStatusTexts) { + return this._getOption('customizeResponseText'); + } + set customizeResponseText(value: ((command: CommandInfo) => ResponseStatusTexts)) { + 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-metadata/make-angular-metadata.ts b/packages/devextreme-metadata/make-angular-metadata.ts index e485f2b84f48..8c54818cd81a 100644 --- a/packages/devextreme-metadata/make-angular-metadata.ts +++ b/packages/devextreme-metadata/make-angular-metadata.ts @@ -48,6 +48,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 2cf419615368..f1df9258b1ea 100644 --- a/packages/devextreme-react/src/common/grids.ts +++ b/packages/devextreme-react/src/common/grids.ts @@ -6,6 +6,7 @@ export type { AIColumnRequestCreatingInfo, ApplyChangesMode, ApplyFilterMode, + BasicFilterExprObj, ColumnAIOptions, ColumnBase, ColumnButtonBase, @@ -21,6 +22,9 @@ export type { ColumnHeaderFilterSearchConfig, ColumnLookup, ColumnResizeMode, + CombinedFilterExprObj, + CommandInfo, + CompositeKeyPair, DataChange, DataChangeInfo, DataChangeType, @@ -30,6 +34,7 @@ export type { EditingTextsBase, EnterKeyAction, EnterKeyDirection, + FilterExprObj, FilterOperation, FilterPanel, FilterPanelTexts, @@ -50,11 +55,16 @@ export type { KeyboardNavigation, KeyDownInfo, LoadPanel, + NegatedFilterExprObj, NewRowInfo, NewRowPosition, Pager, PagerPageSize, PagingBase, + PredefinedCommandNames, + 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..cb837f030608 100644 --- a/packages/devextreme-react/src/common/index.ts +++ b/packages/devextreme-react/src/common/index.ts @@ -275,12 +275,13 @@ 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; export type ApplyChangesMode = GridsModule.ApplyChangesMode; export type ApplyFilterMode = GridsModule.ApplyFilterMode; + export type BasicFilterExprObj = GridsModule.BasicFilterExprObj; export type ColumnAIOptions = GridsModule.ColumnAIOptions; export type ColumnBase = GridsModule.ColumnBase; export type ColumnButtonBase = GridsModule.ColumnButtonBase; @@ -296,6 +297,9 @@ export namespace Grids { export type ColumnHeaderFilterSearchConfig = GridsModule.ColumnHeaderFilterSearchConfig; export type ColumnLookup = GridsModule.ColumnLookup; export type ColumnResizeMode = GridsModule.ColumnResizeMode; + export type CombinedFilterExprObj = GridsModule.CombinedFilterExprObj; + export type CommandInfo = GridsModule.CommandInfo; + export type CompositeKeyPair = GridsModule.CompositeKeyPair; export type DataChange = GridsModule.DataChange; export type DataChangeInfo = GridsModule.DataChangeInfo; export type DataChangeType = GridsModule.DataChangeType; @@ -305,6 +309,7 @@ export namespace Grids { export type EditingTextsBase = GridsModule.EditingTextsBase; export type EnterKeyAction = GridsModule.EnterKeyAction; export type EnterKeyDirection = GridsModule.EnterKeyDirection; + export type FilterExprObj = GridsModule.FilterExprObj; export type FilterOperation = GridsModule.FilterOperation; export type FilterPanel = GridsModule.FilterPanel; export type FilterPanelTexts = GridsModule.FilterPanelTexts; @@ -325,11 +330,16 @@ export namespace Grids { export type KeyboardNavigation = GridsModule.KeyboardNavigation; export type KeyDownInfo = GridsModule.KeyDownInfo; export type LoadPanel = GridsModule.LoadPanel; + export type NegatedFilterExprObj = GridsModule.NegatedFilterExprObj; export type NewRowInfo = GridsModule.NewRowInfo; export type NewRowPosition = GridsModule.NewRowPosition; 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; 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..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, 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,6 +244,8 @@ const AI = Object.assign(_componentAI, type IAIAssistantProps = React.PropsWithChildren<{ aiIntegration?: AIIntegration; chat?: Record; + customizeResponseText?: ((command: CommandInfo) => ResponseStatusTexts); + customizeResponseTitle?: ((status: ResponseStatus, commandNames: Array) => string); enabled?: boolean; popup?: dxPopupOptions; title?: string; @@ -2845,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 38316b42abb8..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, 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,6 +216,8 @@ const AI = Object.assign(_componentAI, type IAIAssistantProps = React.PropsWithChildren<{ aiIntegration?: AIIntegration; chat?: Record; + customizeResponseText?: ((command: CommandInfo) => ResponseStatusTexts); + 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..f1df9258b1ea 100644 --- a/packages/devextreme-vue/src/common/grids.ts +++ b/packages/devextreme-vue/src/common/grids.ts @@ -6,6 +6,7 @@ export type { AIColumnRequestCreatingInfo, ApplyChangesMode, ApplyFilterMode, + BasicFilterExprObj, ColumnAIOptions, ColumnBase, ColumnButtonBase, @@ -21,6 +22,9 @@ export type { ColumnHeaderFilterSearchConfig, ColumnLookup, ColumnResizeMode, + CombinedFilterExprObj, + CommandInfo, + CompositeKeyPair, DataChange, DataChangeInfo, DataChangeType, @@ -30,6 +34,7 @@ export type { EditingTextsBase, EnterKeyAction, EnterKeyDirection, + FilterExprObj, FilterOperation, FilterPanel, FilterPanelTexts, @@ -50,11 +55,16 @@ export type { KeyboardNavigation, KeyDownInfo, LoadPanel, + NegatedFilterExprObj, NewRowInfo, NewRowPosition, Pager, PagerPageSize, PagingBase, + PredefinedCommandNames, + 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..cb837f030608 100644 --- a/packages/devextreme-vue/src/common/index.ts +++ b/packages/devextreme-vue/src/common/index.ts @@ -275,12 +275,13 @@ 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; export type ApplyChangesMode = GridsModule.ApplyChangesMode; export type ApplyFilterMode = GridsModule.ApplyFilterMode; + export type BasicFilterExprObj = GridsModule.BasicFilterExprObj; export type ColumnAIOptions = GridsModule.ColumnAIOptions; export type ColumnBase = GridsModule.ColumnBase; export type ColumnButtonBase = GridsModule.ColumnButtonBase; @@ -296,6 +297,9 @@ export namespace Grids { export type ColumnHeaderFilterSearchConfig = GridsModule.ColumnHeaderFilterSearchConfig; export type ColumnLookup = GridsModule.ColumnLookup; export type ColumnResizeMode = GridsModule.ColumnResizeMode; + export type CombinedFilterExprObj = GridsModule.CombinedFilterExprObj; + export type CommandInfo = GridsModule.CommandInfo; + export type CompositeKeyPair = GridsModule.CompositeKeyPair; export type DataChange = GridsModule.DataChange; export type DataChangeInfo = GridsModule.DataChangeInfo; export type DataChangeType = GridsModule.DataChangeType; @@ -305,6 +309,7 @@ export namespace Grids { export type EditingTextsBase = GridsModule.EditingTextsBase; export type EnterKeyAction = GridsModule.EnterKeyAction; export type EnterKeyDirection = GridsModule.EnterKeyDirection; + export type FilterExprObj = GridsModule.FilterExprObj; export type FilterOperation = GridsModule.FilterOperation; export type FilterPanel = GridsModule.FilterPanel; export type FilterPanelTexts = GridsModule.FilterPanelTexts; @@ -325,11 +330,16 @@ export namespace Grids { export type KeyboardNavigation = GridsModule.KeyboardNavigation; export type KeyDownInfo = GridsModule.KeyDownInfo; export type LoadPanel = GridsModule.LoadPanel; + export type NegatedFilterExprObj = GridsModule.NegatedFilterExprObj; export type NewRowInfo = GridsModule.NewRowInfo; export type NewRowPosition = GridsModule.NewRowPosition; 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; 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..ca6626cf5e2e 100644 --- a/packages/devextreme-vue/src/data-grid.ts +++ b/packages/devextreme-vue/src/data-grid.ts @@ -20,6 +20,9 @@ import { SearchPanel, Sorting, AIColumnMode, + CommandInfo, + ResponseStatusTexts, + ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, @@ -734,6 +737,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 +746,8 @@ const DxAIAssistantConfig = { props: { aiIntegration: Object as PropType, chat: Object as PropType>, + customizeResponseText: Function as PropType<((command: CommandInfo) => ResponseStatusTexts)>, + 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..a411b5c757d7 100644 --- a/packages/devextreme-vue/src/tree-list.ts +++ b/packages/devextreme-vue/src/tree-list.ts @@ -20,6 +20,9 @@ import { SearchPanel, Sorting, AIColumnMode, + CommandInfo, + ResponseStatusTexts, + ResponseStatus, DataChangeType, ColumnAIOptions, FilterOperation, @@ -723,6 +726,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 +735,8 @@ const DxAIAssistantConfig = { props: { aiIntegration: Object as PropType, chat: Object as PropType>, + customizeResponseText: Function as PropType<((command: CommandInfo) => ResponseStatusTexts)>, + 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/__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 fa5ee6123755..6e75f77f5b45 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 @@ -873,7 +873,7 @@ describe('AIAssistantIntegrationController', () => { { dataField: 'name', caption: 'Name', dataType: 'string' }, ], aiIntegration, - } as unknown as Properties); + } 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 7e371b76287b..fce7f97fab3c 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 @@ -261,7 +261,7 @@ describe('GridCommands', () => { const command = createMockCommand('test'); const gridCommands = new GridCommands(createMockComponent(), [command]); - const schema = gridCommands.buildResponseSchema() as Record; + const schema = gridCommands.buildResponseSchema(); expect(schema.anyOf).toBeUndefined(); expect(schema.oneOf).toBeUndefined(); @@ -338,7 +338,7 @@ describe('GridCommands', () => { }); const gridCommands = new GridCommands(createMockComponent(), [command]); - const schema = gridCommands.buildResponseSchema() as Record; + const schema = gridCommands.buildResponseSchema(); // $defs should exist at root level expect(schema.$defs).toBeDefined(); @@ -380,7 +380,7 @@ describe('GridCommands', () => { }); const gridCommands = new GridCommands(createMockComponent(), [command]); - const schema = gridCommands.buildResponseSchema() as Record; + const schema = gridCommands.buildResponseSchema(); expect(schema.$defs).toBeUndefined(); }); @@ -1046,7 +1046,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]); @@ -1059,8 +1059,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 () => { @@ -1128,8 +1128,8 @@ describe('GridCommands', () => { expect(results[0].message).toBe('default success'); }); - it('should leave default message when customizeResponseText returns undefined', async () => { - const customizeResponseText: CustomizeResponseText = () => undefined; + it('should leave default message when customizeResponseText returns empty object', async () => { + const customizeResponseText: CustomizeResponseText = () => ({}); const command = createMockCommand('test', { execute: (_comp, { success }) => (): Promise => Promise.resolve(success('original')), @@ -1171,12 +1171,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/__tests__/utils.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/utils.test.ts index 7529fb0e96d9..6f75da2cbce8 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 @@ -1,9 +1,7 @@ -import { - describe, expect, it, -} from '@jest/globals'; +import { describe, expect, it } 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 type { JsonSchema } from '../types'; import { expandTypeArraysToAnyOf, @@ -224,7 +222,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', () => { @@ -233,7 +231,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', () => { @@ -242,7 +240,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', () => { @@ -251,11 +249,11 @@ 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/ai_assistant_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_controller.ts index b0659b70718b..a9d0356b16bb 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 { 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'; @@ -18,8 +19,6 @@ import { GridCommands } from './grid_commands'; import type { AIMessage, CommandResult, - CustomizeResponseText, - CustomizeResponseTitle, GridCommand, } from './types'; import { getMessageStatus, isAIMessage } from './utils'; @@ -34,18 +33,16 @@ 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') as CustomizeResponseTitle | undefined; + const customizeResponseTitle = this.option('aiAssistant.customizeResponseTitle'); if (!commandNames.length) { return messageLocalization.format('dxDataGrid-aiAssistantErrorMessage'); } if (customizeResponseTitle && isFunction(customizeResponseTitle)) { - // TODO: add type description to d.ts return customizeResponseTitle(status, commandNames); } @@ -59,8 +56,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,8 +89,7 @@ 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') as CustomizeResponseText | undefined; + const customizeResponseText = this.option('aiAssistant.customizeResponseText'); return this.gridCommands?.executeCommands(response.actions, customizeResponseText) ?? Promise.reject(new Error('Grid commands not initialized')); @@ -127,7 +123,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/commands/utils.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/commands/utils.ts index 54a407b3af44..cb5b7bd84923 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/commands/utils.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/commands/utils.ts @@ -1,10 +1,9 @@ +import type { CompositeKeyPair } from '@js/common/grids'; import { isString } from '@js/core/utils/type'; import { z } from 'zod'; type RowKey = string | number | Record; -interface CompositeKeyPair { field: string; value: string | number } - export const compositeKeyPairSchema = z.object({ field: z.string(), value: z.union([z.string(), z.number()]), 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 083bad20d2d8..7068dc7c34e2 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 { @@ -57,11 +58,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)) { @@ -224,7 +224,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 ef2fe8a5f48b..673fad51aa1f 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,12 +1,12 @@ -import type { RequestCallbacks } from '@js/common/ai-integration'; +import type { ExecuteGridAssistantCommandParams, RequestCallbacks } from '@js/common/ai-integration'; +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'; import type { MessageStatus } from './const'; -/** JSON Schema object sent to the LLM. */ -export type JsonSchema = Record; +export type JsonSchema = ExecuteGridAssistantCommandParams['responseSchema']; export interface ResponseSchemaBranch { commandName: string; @@ -60,22 +60,7 @@ export interface GridCommand< ) => CommandExecutor>; } -export interface CommandMessages { - success: string; - failure: string; -} - -// TODO: move to d.ts -export type CustomizeResponseText = ( - commandName: string, - commandArgs: Record, -) => Partial | undefined; - -// TODO: move to d.ts -export type CustomizeResponseTitle = ( - status: MessageStatus, - commandNames: string[], -) => string; +export type CustomizeResponseText = NonNullable; export type AIAssistantRequestCallbacks = RequestCallbacks & { onAbort?: () => void; 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 acf42b829d3d..b265de1c2fc4 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, JsonSchema } from './types'; export const isAIMessage = ( @@ -33,12 +34,12 @@ 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 50bb52be6689..651038ff6077 100644 --- a/packages/devextreme/js/common/grids.d.ts +++ b/packages/devextreme/js/common/grids.d.ts @@ -29,6 +29,7 @@ import { import { DataSource, DataSourceOptions, + SearchOperation, } from './data'; import { DataSourceLike } from '../data/data_source'; @@ -80,14 +81,160 @@ 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 type BasicFilterExprObj = { + type: 'basic'; + field: string; + operator: SearchOperation; + value: string | number | boolean | null; +}; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type CombinedFilterExprObj = { + type: 'combined'; + left: FilterExprObj; + combiner: 'and' | 'or'; + right: FilterExprObj; +}; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type NegatedFilterExprObj = { + type: 'negated'; + expression: FilterExprObj; +}; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type FilterExprObj = BasicFilterExprObj | CombinedFilterExprObj | NegatedFilterExprObj; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type CompositeKeyPair = { + field: string; + value: string | number; +}; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type PredefinedCommands = { + columnsVisibility: { + dataField: string; + visible: boolean; + }; + columnsReorder: { + dataField: string; + visibleIndex: boolean; + }; + columnsPinning: { + dataField: string; + fixed: boolean; + fixedPosition?: 'left' | 'right'; + }; + columnsResize: { + dataField: string; + width: number | string; + }; + filterValue: { + expression: FilterExprObj | null; + }; + clearFilter: {}; + focusRowByKey: { + key: string | number | Array; + }; + focusRowByIndex: { + index: number; + }; + paging: { + enabled: boolean; + }; + pageSize: { + pageSize: number; + }; + pageIndex: { + pageIndex: number; + }; + searching: { + text: string; + }; + selectByKeys: { + keys: Array>; + preserve: boolean; + }; + selectByIndexes: { + indexes: number[] + }; + selectAll: {}; + deselectAll: {}; + clearSelection: {}; + sorting: { + dataField: string; + sortOrder: SortOrder | 'none'; + }; + clearSorting: {}; +}; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type CommandInfo< + TCommands extends PredefinedCommands = PredefinedCommands, +> = { [K in keyof TCommands]: { name: K; args: TCommands[K] } }[keyof TCommands]; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type PredefinedCommandNames = keyof PredefinedCommands; + +/** + * @docid + * @public + * @namespace DevExpress.common.grids + */ +export type AIAssistant = { /** @docid */ aiIntegration?: AIIntegration; /** @@ -110,31 +257,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; /** * @docid - * @type object - */ - responseSchema: Record; - /** - * @docid - * @type object */ - additionalInfo?: Record; + customizeResponseText?: (command: CommandInfo) => ResponseStatusTexts; }; +/** + * @docid + * @hidden + * @namespace DevExpress.common.grids + */ +export type AIAssistantRequestCreatingInfo = Pick; + /** * @docid * @hidden diff --git a/packages/devextreme/js/ui/data_grid.d.ts b/packages/devextreme/js/ui/data_grid.d.ts index 45ebe3c527b7..5c22fc1fae81 100644 --- a/packages/devextreme/js/ui/data_grid.d.ts +++ b/packages/devextreme/js/ui/data_grid.d.ts @@ -82,6 +82,9 @@ import { ToolbarPreparingInfo, AIColumnRequestCreatingInfo, AIAssistantRequestCreatingInfo, + AIAssistant as BaseAIAssistant, + PredefinedCommands, + CommandInfo, } from '../common/grids'; export { @@ -101,7 +104,6 @@ export { } from '../common'; export { - AIAssistant, ApplyFilterMode, ColumnChooser, ColumnChooserMode, @@ -146,6 +148,7 @@ export { StateStoreType, StateStoring, SummaryType, + ResponseStatusTexts, } from '../common/grids'; export { @@ -1170,7 +1173,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 = 'aiAssistant' | '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'; /** * @deprecated use Properties instead @@ -1180,6 +1183,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 +1940,61 @@ export type Toolbar = { disabled?: boolean; }; +/** + * @docid + * @public + */ +export type SummaryCommandTotalItem = Pick & { + column: string; + summaryType: SummaryType; +}; + +/** + * @docid + * @public + */ +export type SummaryCommandGroupItem = Pick & { + column: string; + summaryType: SummaryType; +}; + +/** + * @docid + * @public + * @inherits PredefinedCommands + */ +export type DataGridPredefinedCommands = PredefinedCommands & { + grouping: { + dataField: string; + groupIndex: number; + }; + clearGrouping: {}; + summary: { + totalItems: Array; + groupItems: Array; + + }; + clearSummary: {}; +}; + +/** + * @docid + * @public + */ +export type DataGridCommandInfo = CommandInfo; + +/** + * @docid + * @public + */ +export type DataGridPredefinedCommandNames = keyof DataGridPredefinedCommands; + +/** + * @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..a50cb5dad7f0 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,12 @@ export { SummaryTexts, ToolbarItem, Toolbar, + SummaryCommandTotalItem, + SummaryCommandGroupItem, + DataGridPredefinedCommands, + DataGridCommandInfo, + DataGridPredefinedCommandNames, + 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 3374ac0af524..640f15b5583d 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 308ad89a0370..a8cbe5c0c36b 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 3c8f3a506f4b..abd4a55bd987 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -4625,7 +4625,9 @@ declare module DevExpress.common.grids { /** * [descr:AIAssistant] */ - export type AIAssistant = { + export type AIAssistant< + TCommands extends PredefinedCommands = PredefinedCommands + > = { /** * [descr:AIAssistant.aiIntegration] */ @@ -4646,25 +4648,28 @@ 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; /** - * [descr:AIAssistantRequestCreatingInfo.additionalInfo] + * [descr:AIAssistant.customizeResponseText] */ - additionalInfo?: Record; + customizeResponseText?: ( + command: CommandInfo + ) => ResponseStatusTexts; }; + /** + * [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' | 'additionalInfo' + >; export type AIColumnMode = 'auto' | 'manual'; /** * [descr:AIColumnRequestCreatingInfo] @@ -4694,6 +4699,15 @@ declare module DevExpress.common.grids { }; export type ApplyChangesMode = 'instantly' | 'onDemand'; export type ApplyFilterMode = 'auto' | 'onClick'; + /** + * [descr:BasicFilterExprObj] + */ + export type BasicFilterExprObj = { + type: 'basic'; + field: string; + operator: DevExpress.common.data.SearchOperation; + value: string | number | boolean | null; + }; /** * [descr:ColumnAIOptions] */ @@ -5236,6 +5250,30 @@ declare module DevExpress.common.grids { calculateCellValue?: (rowData: any) => any; }; export type ColumnResizeMode = 'nextColumn' | 'widget'; + /** + * [descr:CombinedFilterExprObj] + */ + export type CombinedFilterExprObj = { + type: 'combined'; + left: FilterExprObj; + combiner: 'and' | 'or'; + right: FilterExprObj; + }; + /** + * [descr:CommandInfo] + */ + export type CommandInfo< + TCommands extends PredefinedCommands = PredefinedCommands + > = { + [K in keyof TCommands]: { name: K; args: TCommands[K] }; + }[keyof TCommands]; + /** + * [descr:CompositeKeyPair] + */ + export type CompositeKeyPair = { + field: string; + value: string | number; + }; /** * [descr:DataChange] */ @@ -5411,6 +5449,13 @@ declare module DevExpress.common.grids { } export type EnterKeyAction = 'startEdit' | 'moveFocus'; export type EnterKeyDirection = 'none' | 'column' | 'row'; + /** + * [descr:FilterExprObj] + */ + export type FilterExprObj = + | BasicFilterExprObj + | CombinedFilterExprObj + | NegatedFilterExprObj; export type FilterOperation = | '=' | '<>' @@ -6435,6 +6480,13 @@ declare module DevExpress.common.grids { */ width?: number | string; }; + /** + * [descr:NegatedFilterExprObj] + */ + export type NegatedFilterExprObj = { + type: 'negated'; + expression: FilterExprObj; + }; /** * [descr:NewRowInfo] * @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. @@ -6489,6 +6541,80 @@ declare module DevExpress.common.grids { */ pageSize?: number; } + /** + * [descr:PredefinedCommandNames] + */ + export type PredefinedCommandNames = keyof PredefinedCommands; + /** + * [descr:PredefinedCommands] + */ + export type PredefinedCommands = { + columnsVisibility: { + dataField: string; + visible: boolean; + }; + columnsReorder: { + dataField: string; + visibleIndex: boolean; + }; + columnsPinning: { + dataField: string; + fixed: boolean; + fixedPosition?: 'left' | 'right'; + }; + columnsResize: { + dataField: string; + width: number | string; + }; + filterValue: { + expression: FilterExprObj | null; + }; + clearFilter: {}; + focusRowByKey: { + key: string | number | Array; + }; + focusRowByIndex: { + index: number; + }; + paging: { + enabled: boolean; + }; + pageSize: { + pageSize: number; + }; + pageIndex: { + pageIndex: number; + }; + searching: { + text: string; + }; + selectByKeys: { + keys: Array>; + preserve: boolean; + }; + selectByIndexes: { + indexes: number[]; + }; + selectAll: {}; + deselectAll: {}; + clearSelection: {}; + 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. @@ -12387,6 +12513,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] */ @@ -12804,6 +12935,11 @@ declare module DevExpress.ui { | 'groupExpand' | 'selection' | 'drag'; + /** + * [descr:DataGridCommandInfo] + */ + export type DataGridCommandInfo = + DevExpress.common.grids.CommandInfo; export type DataGridExportFormat = 'pdf' | 'xlsx'; export type DataGridPredefinedColumnButton = | 'cancel' @@ -12811,6 +12947,27 @@ declare module DevExpress.ui { | 'edit' | 'save' | 'undelete'; + /** + * [descr:DataGridPredefinedCommandNames] + */ + export type DataGridPredefinedCommandNames = + keyof DataGridPredefinedCommands; + /** + * [descr:DataGridPredefinedCommands] + */ + export type DataGridPredefinedCommands = + DevExpress.common.grids.PredefinedCommands & { + grouping: { + dataField: string; + groupIndex: number; + }; + clearGrouping: {}; + summary: { + totalItems: Array; + groupItems: Array; + }; + clearSummary: {}; + }; export type DataGridPredefinedToolbarItem = | 'addRowButton' | 'applyFilterButton' @@ -13489,6 +13646,7 @@ declare module DevExpress.ui { * @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. */ type OverriddenKeys = + | 'aiAssistant' | 'columns' | 'customizeColumns' | 'dataRowTemplate' @@ -13998,6 +14156,26 @@ declare module DevExpress.ui { */ totalItems?: Array | undefined; }; + /** + * [descr:SummaryCommandGroupItem] + */ + export type SummaryCommandGroupItem = Pick< + SummaryGroupItem, + 'showInColumn' | 'displayFormat' | 'showInGroupFooter' | 'alignByColumn' + > & { + column: string; + summaryType: DevExpress.common.grids.SummaryType; + }; + /** + * [descr:SummaryCommandTotalItem] + */ + export type SummaryCommandTotalItem = Pick< + SummaryTotalItem, + 'showInColumn' | 'displayFormat' + > & { + column: string; + summaryType: DevExpress.common.grids.SummaryType; + }; /** * [descr:SummaryGroupItem] */ @@ -14301,6 +14479,10 @@ declare module DevExpress.ui { >, DevExpress.ui.dxDataGrid.OverriddenKeys > & { + /** + * [descr:dxDataGridOptions.aiAssistant] + */ + aiAssistant?: DevExpress.ui.dxDataGrid.AIAssistant; /** * [descr:dxDataGridOptions.columns] */