From 8a7960c9822bfac4eb9b0eb6a2b35e99425bcd1a Mon Sep 17 00:00:00 2001 From: Alyar <> Date: Fri, 15 May 2026 21:27:57 +0400 Subject: [PATCH] DataGrid - AI Assistant: Add abort confirmation dialog --- .../scss/widgets/base/gridBase/_index.scss | 4 + .../widgets/base/gridBase/_variables.scss | 1 + .../__tests__/ai_assistant_controller.test.ts | 69 +++++++++ .../__tests__/ai_assistant_view.test.ts | 102 ++++++++++++- ...istant_view_controller.integration.test.ts | 13 +- .../ai_assistant/__tests__/utils.test.ts | 144 +++++++++++++++++- .../ai_assistant/ai_assistant_controller.ts | 4 + .../ai_assistant/ai_assistant_view.ts | 40 +++-- .../grids/grid_core/ai_assistant/const.ts | 3 + .../grids/grid_core/ai_assistant/utils.ts | 71 ++++++++- .../devextreme/js/__internal/ui/dialog.ts | 4 +- .../js/localization/messages/ar.json | 1 + .../js/localization/messages/bg.json | 1 + .../js/localization/messages/ca.json | 1 + .../js/localization/messages/cs.json | 1 + .../js/localization/messages/da.json | 1 + .../js/localization/messages/de.json | 1 + .../js/localization/messages/el.json | 1 + .../js/localization/messages/en.json | 1 + .../js/localization/messages/es.json | 1 + .../js/localization/messages/fa.json | 1 + .../js/localization/messages/fi.json | 1 + .../js/localization/messages/fr.json | 1 + .../js/localization/messages/hu.json | 1 + .../js/localization/messages/it.json | 1 + .../js/localization/messages/ja.json | 1 + .../js/localization/messages/ko.json | 1 + .../js/localization/messages/lt.json | 1 + .../js/localization/messages/lv.json | 1 + .../js/localization/messages/nb.json | 1 + .../js/localization/messages/nl.json | 1 + .../js/localization/messages/pl.json | 1 + .../js/localization/messages/pt.json | 1 + .../js/localization/messages/ro.json | 1 + .../js/localization/messages/ru.json | 1 + .../js/localization/messages/sl.json | 1 + .../js/localization/messages/sv.json | 1 + .../js/localization/messages/tr.json | 1 + .../js/localization/messages/uk.json | 1 + .../js/localization/messages/vi.json | 1 + .../js/localization/messages/zh-tw.json | 1 + .../js/localization/messages/zh.json | 1 + 42 files changed, 461 insertions(+), 25 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/base/gridBase/_index.scss b/packages/devextreme-scss/scss/widgets/base/gridBase/_index.scss index 3c47c93296c4..9c1549400de5 100644 --- a/packages/devextreme-scss/scss/widgets/base/gridBase/_index.scss +++ b/packages/devextreme-scss/scss/widgets/base/gridBase/_index.scss @@ -1041,4 +1041,8 @@ left: 0; transform: translateY(-50%); } + + .dx-#{$widget-name}-ai-assistant-confirm-dialog .dx-dialog-button { + width: $grid-ai-assistant-confirm-dialog-button-width; + } } diff --git a/packages/devextreme-scss/scss/widgets/base/gridBase/_variables.scss b/packages/devextreme-scss/scss/widgets/base/gridBase/_variables.scss index 36ac6ad2369e..c1b6172d3926 100644 --- a/packages/devextreme-scss/scss/widgets/base/gridBase/_variables.scss +++ b/packages/devextreme-scss/scss/widgets/base/gridBase/_variables.scss @@ -10,3 +10,4 @@ $grid-column-header-indicator-width: 14px; $grid-text-content-margin: 3px; $grid-sort-index-width: 12px; $grid-sort-index-offset: 3px; +$grid-ai-assistant-confirm-dialog-button-width: 50px; diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_controller.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_controller.test.ts index 2a4d40740490..055bcd16fb57 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_controller.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_controller.test.ts @@ -99,6 +99,75 @@ describe('AIAssistantController', () => { }); }); + describe('isProcessing', () => { + it('should return false initially', () => { + const controller = createController(); + + expect(controller.isProcessing()).toBe(false); + }); + + it('should return true while request is processing', () => { + const controller = createController(); + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + controller.sendRequestToAI({ + author: { id: 'user', name: 'User' }, + text: 'Sort by name', + timestamp: '2026-04-16T10:00:00.000Z', + } as Message); + + expect(controller.isProcessing()).toBe(true); + }); + + it('should return false after request completes successfully', async () => { + const controller = createController(); + + const promise = controller.sendRequestToAI({ + author: { id: 'user', name: 'User' }, + text: 'Sort by name', + timestamp: '2026-04-16T10:00:00.000Z', + } as Message); + + const actions = [{ name: 'sort', args: { column: 'Name' } }]; + sendRequestCallbacks.onComplete?.({ actions }); + await promise; + + expect(controller.isProcessing()).toBe(false); + }); + + it('should return false after request fails', async () => { + const controller = createController(); + + const promise = controller.sendRequestToAI({ + author: { id: 'user', name: 'User' }, + text: 'Sort by name', + timestamp: '2026-04-16T10:00:00.000Z', + } as Message); + promise.catch(() => {}); + + sendRequestCallbacks.onError?.(new Error('Network error')); + await expect(promise).rejects.toThrow('Network error'); + + expect(controller.isProcessing()).toBe(false); + }); + + it('should return false after request is aborted', async () => { + const controller = createController(); + + const promise = controller.sendRequestToAI({ + author: { id: 'user', name: 'User' }, + text: 'Sort by name', + timestamp: '2026-04-16T10:00:00.000Z', + } as Message); + promise.catch(() => {}); + + controller.abortRequest(); + await expect(promise).rejects.toThrow(); + + expect(controller.isProcessing()).toBe(false); + }); + }); + describe('sendRequestToAI', () => { it('should create pending message in store', async () => { const controller = createController(); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view.test.ts index 46eb167bd1b1..a13306b6656a 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view.test.ts @@ -16,6 +16,16 @@ import wrapInstanceWithMocks from '@ts/grids/grid_core/__tests__/__mock__/helper import { AIChat } from '../../ai_chat/ai_chat'; import type { AIChatOptions } from '../../ai_chat/types'; import { AIAssistantView } from '../ai_assistant_view'; +import { createConfirmDialog } from '../utils'; + +jest.mock('../utils', (): any => { + const original = jest.requireActual('../utils'); + + return { + ...original, + createConfirmDialog: jest.fn(), + }; +}); jest.mock('../../ai_chat/ai_chat', (): any => { const original = jest.requireActual('../../ai_chat/ai_chat'); @@ -40,6 +50,7 @@ const mockAIAssistantController = { getMessageStore: jest.fn().mockReturnValue(mockMessageStore), sendRequestToAI: jest.fn(), abortRequest: jest.fn(), + isProcessing: jest.fn().mockReturnValue(false), }; const createAIAssistantView = ({ @@ -75,6 +86,7 @@ const createAIAssistantView = ({ }; const mockComponent = { + NAME: 'dxDataGrid', element: (): any => $container.get(0), _createComponent: createComponentMock, _controllers: { @@ -301,14 +313,98 @@ describe('AIAssistantView', () => { }); }); - describe('onHidden', () => { - it('should call abortRequest on controller when popup onHidden is triggered', () => { + describe('onHiding', () => { + it('should not cancel hiding when controller is not processing', () => { + mockAIAssistantController.isProcessing.mockReturnValue(false); createAIAssistantView(); const aiChatConfig = (AIChat as jest.Mock).mock.calls[0][0] as AIChatOptions; - aiChatConfig.popupOptions?.onHidden?.({} as any); + const event = { cancel: false, component: { hide: jest.fn() } }; + + aiChatConfig.popupOptions?.onHiding?.(event as any); + + expect(event.cancel).toBe(false); + expect(createConfirmDialog).not.toHaveBeenCalled(); + }); + + it('should cancel hiding and show confirm dialog when controller is processing', () => { + mockAIAssistantController.isProcessing.mockReturnValue(true); + + const mockDialog = { + show: jest.fn().mockReturnValue({ + done: jest.fn(), + }), + }; + (createConfirmDialog as jest.Mock).mockReturnValue(mockDialog); + createAIAssistantView(); + + const aiChatConfig = (AIChat as jest.Mock).mock.calls[0][0] as AIChatOptions; + const event = { cancel: false, component: { hide: jest.fn() } }; + + aiChatConfig.popupOptions?.onHiding?.(event as any); + + expect(event.cancel).toBe(true); + expect(createConfirmDialog).toHaveBeenCalledTimes(1); + expect(createConfirmDialog).toHaveBeenCalledWith( + expect.objectContaining({ + popupOptions: expect.objectContaining({ + elementAttr: expect.objectContaining({ + class: expect.stringContaining('ai-assistant-confirm-dialog'), + }), + }), + }), + ); + expect(mockDialog.show).toHaveBeenCalledTimes(1); + }); + + it('should abort request and hide popup when confirm result is true', () => { + mockAIAssistantController.isProcessing.mockReturnValue(true); + + let doneCallback: (result: boolean) => void = () => {}; + const mockDialog = { + show: jest.fn().mockReturnValue({ + done: jest.fn((cb: (result: boolean) => void) => { + doneCallback = cb; + }), + }), + }; + (createConfirmDialog as jest.Mock).mockReturnValue(mockDialog); + createAIAssistantView(); + + const aiChatConfig = (AIChat as jest.Mock).mock.calls[0][0] as AIChatOptions; + const hideMock = jest.fn(); + const event = { cancel: false, component: { hide: hideMock } }; + + aiChatConfig.popupOptions?.onHiding?.(event as any); + doneCallback(true); expect(mockAIAssistantController.abortRequest).toHaveBeenCalledTimes(1); + expect(hideMock).toHaveBeenCalledTimes(1); + }); + + it('should not abort request when confirm result is false', () => { + mockAIAssistantController.isProcessing.mockReturnValue(true); + + let doneCallback: (result: boolean) => void = () => {}; + const mockDialog = { + show: jest.fn().mockReturnValue({ + done: jest.fn((cb: (result: boolean) => void) => { + doneCallback = cb; + }), + }), + }; + (createConfirmDialog as jest.Mock).mockReturnValue(mockDialog); + createAIAssistantView(); + + const aiChatConfig = (AIChat as jest.Mock).mock.calls[0][0] as AIChatOptions; + const hideMock = jest.fn(); + const event = { cancel: false, component: { hide: hideMock } }; + + aiChatConfig.popupOptions?.onHiding?.(event as any); + doneCallback(false); + + expect(mockAIAssistantController.abortRequest).not.toHaveBeenCalled(); + expect(hideMock).not.toHaveBeenCalled(); }); }); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view_controller.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view_controller.integration.test.ts index ccd53fa31c3a..ee90be9e1169 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view_controller.integration.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view_controller.integration.test.ts @@ -390,8 +390,17 @@ describe('AIAssistantViewController', () => { const viewController = instance.getController('aiAssistantViewController'); - // Close the AI assistant popup - await viewController.toggle(); + // Close the AI assistant popup — triggers confirm dialog because request is processing. + // toggle() rejects with undefined when onHiding cancels the hide. + await viewController.toggle().catch(() => {}); + jest.runAllTimers(); + await flushAsync(); + + // Confirm abort by clicking "Yes" in the confirmation dialog + const confirmDialogSelector = '.dx-datagrid-ai-assistant-confirm-dialog'; + const yesButton = document.querySelectorAll(`${confirmDialogSelector} .dx-button`)[1] as HTMLElement; + + yesButton.click(); jest.runAllTimers(); await flushAsync(); 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..ce7b4ec31217 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,11 +1,23 @@ import { - describe, expect, it, + beforeEach, + describe, + expect, + it, + jest, } from '@jest/globals'; import type { Message } from '@js/ui/chat'; +import { custom } from '@js/ui/dialog'; +import * as themes from '@js/ui/themes'; -import { AI_ASSISTANT_AUTHOR_ID, MessageStatus } from '../const'; +import { + AI_ASSISTANT_AUTHOR_ID, + AI_ASSISTANT_CONFIRM_DIALOG_COMPACT_WIDTH, + AI_ASSISTANT_CONFIRM_DIALOG_WIDTH, + MessageStatus, +} from '../const'; import type { JsonSchema } from '../types'; import { + createConfirmDialog, expandTypeArraysToAnyOf, getMessageStatus, hasAbortedCommands, @@ -19,6 +31,19 @@ import { isUserMessage, } from '../utils'; +jest.mock('@js/ui/dialog', () => ({ + custom: jest.fn().mockReturnValue({ + show: jest.fn(), + hide: jest.fn(), + }), +})); + +jest.mock('@js/ui/themes', () => ({ + current: jest.fn().mockReturnValue('generic.light'), + isFluent: jest.fn().mockReturnValue(false), + isCompact: jest.fn().mockReturnValue(false), +})); + describe('isAIMessage', () => { it('should return true for message with assistant author id', () => { const message = { @@ -734,3 +759,118 @@ describe('hoistSchemaRefs', () => { expect(itemsAnyOf[0]).toEqual({ $ref: '#/$defs/p_Item' }); }); }); + +describe('createConfirmDialog', () => { + beforeEach(() => { + jest.clearAllMocks(); + (themes.isFluent as jest.Mock).mockReturnValue(false); + (themes.isCompact as jest.Mock).mockReturnValue(false); + }); + + it('should call custom dialog with correct default options', () => { + createConfirmDialog(); + + expect(custom).toHaveBeenCalledTimes(1); + expect(custom).toHaveBeenCalledWith( + expect.objectContaining({ + showTitle: false, + dragEnabled: false, + width: AI_ASSISTANT_CONFIRM_DIALOG_WIDTH, + buttons: expect.arrayContaining([ + expect.objectContaining({ onClick: expect.any(Function) }), + expect.objectContaining({ onClick: expect.any(Function) }), + ]), + }), + ); + }); + + it('should use compact width when compact theme is active', () => { + (themes.isCompact as jest.Mock).mockReturnValue(true); + + createConfirmDialog(); + + expect(custom).toHaveBeenCalledWith( + expect.objectContaining({ + width: AI_ASSISTANT_CONFIRM_DIALOG_COMPACT_WIDTH, + }), + ); + }); + + it('should use default width when non-compact theme is active', () => { + (themes.isCompact as jest.Mock).mockReturnValue(false); + + createConfirmDialog(); + + expect(custom).toHaveBeenCalledWith( + expect.objectContaining({ + width: AI_ASSISTANT_CONFIRM_DIALOG_WIDTH, + }), + ); + }); + + it('should apply fluent styling to buttons when fluent theme is active', () => { + (themes.isFluent as jest.Mock).mockReturnValue(true); + + createConfirmDialog(); + + const callArgs = (custom as jest.Mock).mock.calls[0][0] as any; + const [cancelButton, applyButton] = callArgs.buttons; + + expect(cancelButton).toEqual(expect.objectContaining({ + stylingMode: 'contained', + type: 'default', + })); + expect(applyButton).toEqual(expect.objectContaining({ + stylingMode: 'outlined', + type: 'normal', + })); + }); + + it('should not apply fluent styling to buttons when non-fluent theme is active', () => { + (themes.isFluent as jest.Mock).mockReturnValue(false); + + createConfirmDialog(); + + const callArgs = (custom as jest.Mock).mock.calls[0][0] as any; + const [cancelButton, applyButton] = callArgs.buttons; + + expect(cancelButton.stylingMode).toBeUndefined(); + expect(cancelButton.type).toBeUndefined(); + expect(applyButton.stylingMode).toBeUndefined(); + expect(applyButton.type).toBeUndefined(); + }); + + it('should merge custom options', () => { + createConfirmDialog({ + popupOptions: { + elementAttr: { class: 'custom-class' }, + }, + }); + + expect(custom).toHaveBeenCalledWith( + expect.objectContaining({ + popupOptions: expect.objectContaining({ + elementAttr: { class: 'custom-class' }, + }), + }), + ); + }); + + it('should have No button that returns false', () => { + createConfirmDialog(); + + const callArgs = (custom as jest.Mock).mock.calls[0][0] as any; + const noButton = callArgs.buttons[0]; + + expect(noButton.onClick()).toBe(false); + }); + + it('should have Yes button that returns true', () => { + createConfirmDialog(); + + const callArgs = (custom as jest.Mock).mock.calls[0][0] as any; + const yesButton = callArgs.buttons[1]; + + expect(yesButton.onClick()).toBe(true); + }); +}); 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..929b68e567f2 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 @@ -268,6 +268,10 @@ export class AIAssistantController extends Controller { this.gridCommands?.abort(); } + public isProcessing(): boolean { + return this.processing; + } + public dispose(): void { super.dispose(); this.aiAssistantIntegrationController?.dispose(); diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_view.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_view.ts index cca5ac0776c7..6c66c4d5c38b 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_view.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_view.ts @@ -3,16 +3,8 @@ import type { ArrayStore } from '@js/common/data'; import type { Callback } from '@js/core/utils/callbacks'; import { getHeight } from '@js/core/utils/size'; import type { Message, Properties as ChatProperties } from '@js/ui/chat'; -import type { Properties as PopupProperties } from '@js/ui/popup'; +import type { HidingEvent, Properties as PopupProperties } from '@js/ui/popup'; import { fromPromise } from '@ts/core/utils/m_deferred'; -import { AI_ASSISTANT_POPUP_OFFSET } from '@ts/grids/grid_core/ai_assistant/const'; -import { - isChatOptions, - isEnabledOption, - isPopupOptions, - isTitleOption, - isUserMessage, -} from '@ts/grids/grid_core/ai_assistant/utils'; import type { ColumnHeadersView } from '@ts/grids/grid_core/column_headers/m_column_headers'; import type { OptionChanged } from '@ts/grids/grid_core/m_types'; import type { RowsView } from '@ts/grids/grid_core/views/m_rows_view'; @@ -22,7 +14,16 @@ import { AIChat } from '../ai_chat/ai_chat'; import type { AIChatOptions } from '../ai_chat/types'; import { View } from '../m_modules'; import type { AIAssistantController } from './ai_assistant_controller'; +import { AI_ASSISTANT_POPUP_OFFSET, CLASSES } from './const'; import type { AIMessage } from './types'; +import { + createConfirmDialog, + isChatOptions, + isEnabledOption, + isPopupOptions, + isTitleOption, + isUserMessage, +} from './utils'; export class AIAssistantView extends View { private aiChatInstance!: AIChat; @@ -96,7 +97,26 @@ export class AIAssistantView extends View { }, onHidden: (): void => { this.visibilityChanged?.fire(false); - this.aiAssistantController.abortRequest(); + }, + onHiding: (e: HidingEvent): void => { + if (this.aiAssistantController.isProcessing()) { + e.cancel = true; + + const confirmDialog = createConfirmDialog({ + popupOptions: { + elementAttr: { class: this.addWidgetPrefix(CLASSES.aiAssistantConfirmDialog) }, + }, + }); + + // @ts-expect-error + confirmDialog.show().done((confirmResult) => { + if (confirmResult) { + this.aiAssistantController.abortRequest(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + e.component.hide(); + } + }); + } }, ...this.option('aiAssistant.popup'), }; diff --git a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/const.ts b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/const.ts index b70706e300d6..024b37467651 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/const.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/ai_assistant/const.ts @@ -3,9 +3,12 @@ export const AI_ASSISTANT_ICON_NAME = 'chatsparkleoutline'; export const CLASSES = { aiAssistantButton: 'ai-assistant-button', + aiAssistantConfirmDialog: 'ai-assistant-confirm-dialog', }; export const AI_ASSISTANT_POPUP_OFFSET = 12; +export const AI_ASSISTANT_CONFIRM_DIALOG_WIDTH = 425; +export const AI_ASSISTANT_CONFIRM_DIALOG_COMPACT_WIDTH = 360; export const AI_ASSISTANT_AUTHOR_ID = 'assistant'; export const AI_ASSISTANT_AUTHOR = { id: AI_ASSISTANT_AUTHOR_ID }; 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..0405011a2431 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,16 @@ +import messageLocalization from '@js/common/core/localization/message'; import { isObject } from '@js/core/utils/type'; +import type { Properties as ButtonProperties } from '@js/ui/button'; import type { Message } from '@js/ui/chat'; - -import { AI_ASSISTANT_AUTHOR_ID, MessageStatus } from './const'; +import { custom } from '@js/ui/dialog'; +import { current, isCompact, isFluent } from '@js/ui/themes'; +import type { BaseDialog, DialogParams } from '@ts/ui/dialog'; + +import { + AI_ASSISTANT_AUTHOR_ID, + AI_ASSISTANT_CONFIRM_DIALOG_COMPACT_WIDTH, + AI_ASSISTANT_CONFIRM_DIALOG_WIDTH, MessageStatus, +} from './const'; import type { AIMessage, CommandResult, JsonSchema } from './types'; export const isAIMessage = ( @@ -113,17 +122,17 @@ const resolveJsonPointer = ( } const segments = pointer.slice(2).split('/'); - let current: unknown = schema; + let currentNode: unknown = schema; for (const segment of segments) { - if (!current || typeof current !== 'object') { + if (!currentNode || typeof currentNode !== 'object') { return undefined; } - current = (current as Record)[segment]; + currentNode = (currentNode as Record)[segment]; } - return current; + return currentNode; }; /** Recursively collects all `$ref` string values from a schema node. */ @@ -258,3 +267,53 @@ export const hoistSchemaRefs = ( return mergedDefs; }; + +const getApplyButtonConfig = (): ButtonProperties => { + if (isFluent(current())) { + return { + stylingMode: 'outlined', + type: 'normal', + }; + } + + return {}; +}; + +const getCancelButtonConfig = (): ButtonProperties => { + if (isFluent(current())) { + return { + stylingMode: 'contained', + type: 'default', + }; + } + + return {}; +}; + +const getConfirmDialogWidth = (): number => { + if (isCompact(current())) { + return AI_ASSISTANT_CONFIRM_DIALOG_COMPACT_WIDTH; + } + + return AI_ASSISTANT_CONFIRM_DIALOG_WIDTH; +}; + +export const createConfirmDialog = (options?: DialogParams): BaseDialog => custom({ + messageHtml: messageLocalization.format('dxDataGrid-aiAssistantAbortConfirmText'), + showTitle: false, + dragEnabled: false, + width: getConfirmDialogWidth(), + buttons: [ + { + text: messageLocalization.format('No'), + onClick: (): boolean => false, + ...getCancelButtonConfig(), + }, + { + text: messageLocalization.format('Yes'), + onClick: (): boolean => true, + ...getApplyButtonConfig(), + }, + ], + ...options, +}) as BaseDialog; diff --git a/packages/devextreme/js/__internal/ui/dialog.ts b/packages/devextreme/js/__internal/ui/dialog.ts index adccd3255cde..113ca6342d31 100644 --- a/packages/devextreme/js/__internal/ui/dialog.ts +++ b/packages/devextreme/js/__internal/ui/dialog.ts @@ -25,12 +25,12 @@ import domUtils from '@ts/core/utils/m_dom'; import type { PopupProperties } from '@ts/ui/popup/m_popup'; import Popup from '@ts/ui/popup/m_popup'; -interface BaseDialog { +export interface BaseDialog { show: () => Promise; hide: (value: boolean) => void; } -interface DialogParams extends CustomDialogOptions, PopupProperties { +export interface DialogParams extends CustomDialogOptions, PopupProperties { popupOptions?: PopupProperties; } diff --git a/packages/devextreme/js/localization/messages/ar.json b/packages/devextreme/js/localization/messages/ar.json index c76883eb3da9..00d58aea3174 100644 --- a/packages/devextreme/js/localization/messages/ar.json +++ b/packages/devextreme/js/localization/messages/ar.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "محرر موجهات AI", diff --git a/packages/devextreme/js/localization/messages/bg.json b/packages/devextreme/js/localization/messages/bg.json index 72dbe90b6ce9..63be264f389f 100644 --- a/packages/devextreme/js/localization/messages/bg.json +++ b/packages/devextreme/js/localization/messages/bg.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI редактор на подсказки", diff --git a/packages/devextreme/js/localization/messages/ca.json b/packages/devextreme/js/localization/messages/ca.json index 1791f38a28c4..d12b14a1db35 100644 --- a/packages/devextreme/js/localization/messages/ca.json +++ b/packages/devextreme/js/localization/messages/ca.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Editor de prompts d'IA", diff --git a/packages/devextreme/js/localization/messages/cs.json b/packages/devextreme/js/localization/messages/cs.json index de7d6f4fcb54..4c322e9f45f3 100644 --- a/packages/devextreme/js/localization/messages/cs.json +++ b/packages/devextreme/js/localization/messages/cs.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Editor výzev AI", diff --git a/packages/devextreme/js/localization/messages/da.json b/packages/devextreme/js/localization/messages/da.json index c2d0af06b3ab..239dcce4e459 100644 --- a/packages/devextreme/js/localization/messages/da.json +++ b/packages/devextreme/js/localization/messages/da.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI Prompteditor", diff --git a/packages/devextreme/js/localization/messages/de.json b/packages/devextreme/js/localization/messages/de.json index f7071efedff8..a0dbd85dda1d 100644 --- a/packages/devextreme/js/localization/messages/de.json +++ b/packages/devextreme/js/localization/messages/de.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "KI-Eingabeaufforderungseditor", diff --git a/packages/devextreme/js/localization/messages/el.json b/packages/devextreme/js/localization/messages/el.json index b249f49e5bbc..040711e41726 100644 --- a/packages/devextreme/js/localization/messages/el.json +++ b/packages/devextreme/js/localization/messages/el.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Επεξεργαστής προτροπών AI", diff --git a/packages/devextreme/js/localization/messages/en.json b/packages/devextreme/js/localization/messages/en.json index 755fff6a6566..48767cc1875a 100644 --- a/packages/devextreme/js/localization/messages/en.json +++ b/packages/devextreme/js/localization/messages/en.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI Prompt Editor", diff --git a/packages/devextreme/js/localization/messages/es.json b/packages/devextreme/js/localization/messages/es.json index 54ecaa1dc82d..15e18624b85c 100644 --- a/packages/devextreme/js/localization/messages/es.json +++ b/packages/devextreme/js/localization/messages/es.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Editor de indicaciones de IA", diff --git a/packages/devextreme/js/localization/messages/fa.json b/packages/devextreme/js/localization/messages/fa.json index 2c7784ad28a2..9c3a7f2cfb11 100644 --- a/packages/devextreme/js/localization/messages/fa.json +++ b/packages/devextreme/js/localization/messages/fa.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "ویرایشگر دستورهای هوش مصنوعی", diff --git a/packages/devextreme/js/localization/messages/fi.json b/packages/devextreme/js/localization/messages/fi.json index e653ff26affe..82811ab13aee 100644 --- a/packages/devextreme/js/localization/messages/fi.json +++ b/packages/devextreme/js/localization/messages/fi.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI-kehotemuokkain", diff --git a/packages/devextreme/js/localization/messages/fr.json b/packages/devextreme/js/localization/messages/fr.json index 2ab4f80d2df1..8e2568e5c423 100644 --- a/packages/devextreme/js/localization/messages/fr.json +++ b/packages/devextreme/js/localization/messages/fr.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Éditeur de prompts IA", diff --git a/packages/devextreme/js/localization/messages/hu.json b/packages/devextreme/js/localization/messages/hu.json index fadf3a727b58..9bc2e433e785 100644 --- a/packages/devextreme/js/localization/messages/hu.json +++ b/packages/devextreme/js/localization/messages/hu.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI Prompt Editor", diff --git a/packages/devextreme/js/localization/messages/it.json b/packages/devextreme/js/localization/messages/it.json index 716a965291ee..8ec0f2c46c68 100644 --- a/packages/devextreme/js/localization/messages/it.json +++ b/packages/devextreme/js/localization/messages/it.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Editor prompt AI", diff --git a/packages/devextreme/js/localization/messages/ja.json b/packages/devextreme/js/localization/messages/ja.json index 63d18e7ecf60..d431777e7ccc 100644 --- a/packages/devextreme/js/localization/messages/ja.json +++ b/packages/devextreme/js/localization/messages/ja.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI プロンプト エディター", diff --git a/packages/devextreme/js/localization/messages/ko.json b/packages/devextreme/js/localization/messages/ko.json index 1ab99ce0b716..c296f3232a57 100644 --- a/packages/devextreme/js/localization/messages/ko.json +++ b/packages/devextreme/js/localization/messages/ko.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI 프롬프트 편집기", diff --git a/packages/devextreme/js/localization/messages/lt.json b/packages/devextreme/js/localization/messages/lt.json index 0357ddd346ce..2e7217b60ed9 100644 --- a/packages/devextreme/js/localization/messages/lt.json +++ b/packages/devextreme/js/localization/messages/lt.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI užklausų redaktorius", diff --git a/packages/devextreme/js/localization/messages/lv.json b/packages/devextreme/js/localization/messages/lv.json index c4ec853d42e8..c52837c79ab7 100644 --- a/packages/devextreme/js/localization/messages/lv.json +++ b/packages/devextreme/js/localization/messages/lv.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI uzvedņu redaktors", diff --git a/packages/devextreme/js/localization/messages/nb.json b/packages/devextreme/js/localization/messages/nb.json index c0bd664f6669..9e06c8d9c114 100644 --- a/packages/devextreme/js/localization/messages/nb.json +++ b/packages/devextreme/js/localization/messages/nb.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Redaktør for AI-prompt", diff --git a/packages/devextreme/js/localization/messages/nl.json b/packages/devextreme/js/localization/messages/nl.json index 5d58cfe6d586..5f927597e57a 100644 --- a/packages/devextreme/js/localization/messages/nl.json +++ b/packages/devextreme/js/localization/messages/nl.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI Prompt Editor", diff --git a/packages/devextreme/js/localization/messages/pl.json b/packages/devextreme/js/localization/messages/pl.json index 672e80a0b385..cde4118eedaf 100644 --- a/packages/devextreme/js/localization/messages/pl.json +++ b/packages/devextreme/js/localization/messages/pl.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Edytor promptu AI", diff --git a/packages/devextreme/js/localization/messages/pt.json b/packages/devextreme/js/localization/messages/pt.json index 0106658d81b1..3386d7ec4275 100644 --- a/packages/devextreme/js/localization/messages/pt.json +++ b/packages/devextreme/js/localization/messages/pt.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Editor de Prompt de IA", diff --git a/packages/devextreme/js/localization/messages/ro.json b/packages/devextreme/js/localization/messages/ro.json index 08b80432fc1f..66e8444fbecc 100644 --- a/packages/devextreme/js/localization/messages/ro.json +++ b/packages/devextreme/js/localization/messages/ro.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Editor prompturi AI", diff --git a/packages/devextreme/js/localization/messages/ru.json b/packages/devextreme/js/localization/messages/ru.json index 1e04e295a2b3..46daab0f41a5 100644 --- a/packages/devextreme/js/localization/messages/ru.json +++ b/packages/devextreme/js/localization/messages/ru.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Редактор запросов AI", diff --git a/packages/devextreme/js/localization/messages/sl.json b/packages/devextreme/js/localization/messages/sl.json index 1e70c12a9b8b..765571a6cf99 100644 --- a/packages/devextreme/js/localization/messages/sl.json +++ b/packages/devextreme/js/localization/messages/sl.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Urejevalnik pozivov AI", diff --git a/packages/devextreme/js/localization/messages/sv.json b/packages/devextreme/js/localization/messages/sv.json index 0f3fdc824f60..9e188b6a640c 100644 --- a/packages/devextreme/js/localization/messages/sv.json +++ b/packages/devextreme/js/localization/messages/sv.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI Prompt Editor", diff --git a/packages/devextreme/js/localization/messages/tr.json b/packages/devextreme/js/localization/messages/tr.json index ed68215e84db..0e4db56bb626 100644 --- a/packages/devextreme/js/localization/messages/tr.json +++ b/packages/devextreme/js/localization/messages/tr.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Yapay Zeka İstek Düzenleyicisi", diff --git a/packages/devextreme/js/localization/messages/uk.json b/packages/devextreme/js/localization/messages/uk.json index 17ec136d484d..5081d10fa70b 100644 --- a/packages/devextreme/js/localization/messages/uk.json +++ b/packages/devextreme/js/localization/messages/uk.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Редактор запитів AI", diff --git a/packages/devextreme/js/localization/messages/vi.json b/packages/devextreme/js/localization/messages/vi.json index 55d63a3e0baf..60d01f264d1d 100644 --- a/packages/devextreme/js/localization/messages/vi.json +++ b/packages/devextreme/js/localization/messages/vi.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "Trình soạn thảo AI Prompt", diff --git a/packages/devextreme/js/localization/messages/zh-tw.json b/packages/devextreme/js/localization/messages/zh-tw.json index ce913207383f..da0b82a6e949 100644 --- a/packages/devextreme/js/localization/messages/zh-tw.json +++ b/packages/devextreme/js/localization/messages/zh-tw.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI 提示編輯器", diff --git a/packages/devextreme/js/localization/messages/zh.json b/packages/devextreme/js/localization/messages/zh.json index 131c7dfe26e6..a0d1ee585932 100644 --- a/packages/devextreme/js/localization/messages/zh.json +++ b/packages/devextreme/js/localization/messages/zh.json @@ -117,6 +117,7 @@ "dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted", "dxDataGrid-aiAssistantClearButtonText": "Clear", "dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate", + "dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?", "dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty", "dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.", "dxDataGrid-aiPromptEditorTitle": "AI 提示编辑器",