Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ describe('AIAssistantController', () => {
status: MessageStatus.Failure,
headerText: 'Failed to process request',
text: MessageStatus.Failure,
errorText: 'Network error',
errorText: 'Invalid response from the AI service. Please try again.',
}),
]);

Expand Down Expand Up @@ -342,11 +342,11 @@ describe('AIAssistantController', () => {
status: MessageStatus.Failure,
headerText: 'Failed to process request',
text: MessageStatus.Failure,
errorText: 'Default error message',
errorText: 'Invalid response from the AI service. Please try again.',
}),
]);

await expect(promise).rejects.toThrow('Default error message');
await expect(promise).rejects.toThrow('Invalid response from the AI service. Please try again.');
});

it('should fail message when response has empty actions array', async () => {
Expand All @@ -368,11 +368,11 @@ describe('AIAssistantController', () => {
expect(messages).toEqual([
expect.objectContaining({
status: MessageStatus.Failure,
errorText: 'Default error message',
errorText: 'Invalid response from the AI service. Please try again.',
}),
]);

await expect(promise).rejects.toThrow('Default error message');
await expect(promise).rejects.toThrow('Invalid response from the AI service. Please try again.');
});

it('should fail message when validation fails', async () => {
Expand Down Expand Up @@ -406,11 +406,11 @@ describe('AIAssistantController', () => {
expect(messages).toEqual([
expect.objectContaining({
status: MessageStatus.Failure,
errorText: 'Received invalid commands',
errorText: 'Invalid response from the AI service. Please try again.',
}),
]);

await expect(promise).rejects.toThrow('Received invalid commands');
await expect(promise).rejects.toThrow('Invalid response from the AI service. Please try again.');
});

it('should fail message when commands are already executing', async () => {
Expand Down Expand Up @@ -444,11 +444,11 @@ describe('AIAssistantController', () => {
expect(messages).toEqual([
expect.objectContaining({
status: MessageStatus.Failure,
errorText: 'Unexpected error',
errorText: 'Execution already in progress. Please wait.',
}),
]);

await expect(promise).rejects.toThrow('Unexpected error');
await expect(promise).rejects.toThrow('Execution already in progress. Please wait.');
});

it('should fail message when buildResponseSchema returns falsy', async () => {
Expand Down Expand Up @@ -477,11 +477,11 @@ describe('AIAssistantController', () => {
expect(messages).toEqual([
expect.objectContaining({
status: MessageStatus.Failure,
errorText: 'Grid commands not initialized',
errorText: 'An unexpected error occurred. Please try again.',
}),
]);

await expect(promise).rejects.toThrow('Grid commands not initialized');
await expect(promise).rejects.toThrow('An unexpected error occurred. Please try again.');
});

it('should resolve promise when command succeeds', async () => {
Expand Down Expand Up @@ -524,7 +524,7 @@ describe('AIAssistantController', () => {

sendRequestCallbacks.onComplete?.({} as ExecuteGridAssistantCommandResult);

await expect(promise).rejects.toThrow('Default error message');
await expect(promise).rejects.toThrow('Invalid response from the AI service. Please try again.');
});

it('should reject second request while first request is still processing', async () => {
Expand Down Expand Up @@ -553,7 +553,7 @@ describe('AIAssistantController', () => {
};
expect(integrationInstance.sendRequest).toHaveBeenCalledTimes(1);

await expect(secondPromise).rejects.toBeUndefined();
await expect(secondPromise).rejects.toThrow('Request already in progress. Please wait.');
});

it('should accept new request after previous request completes successfully', async () => {
Expand Down Expand Up @@ -1003,7 +1003,7 @@ describe('AIAssistantController', () => {
const regeneratePromise = controller.sendRequestToAI(aiMessage);
regeneratePromise.catch(() => {});

await expect(regeneratePromise).rejects.toBeUndefined();
await expect(regeneratePromise).rejects.toThrow('Request already in progress. Please wait.');
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ describe('AIAssistantViewController', () => {
expect($messages.length).toBe(1);
expect(getMessageStatusClass($messages.eq(0))).toBe(MessageStatus.Failure);
expect($messages.eq(0).find(`.${CLASSES.messageErrorText}`).text())
.toBe('Network error');
.toBe('Invalid response from the AI service. Please try again.');
});

it('should render multiple messages with correct statuses after sequential requests', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,24 +75,25 @@ export class AIAssistantController extends Controller {

private processResponse(response: ExecuteGridAssistantCommandResult): Promise<CommandResult[]> {
if (this.gridCommands?.isExecuting()) {
// TODO: need to localize default error message if execution is in progress
return Promise.reject(new Error('Unexpected error'));
const localizedErrorMsg = messageLocalization.format('dxDataGrid-aiAssistantExecutionInProgressMessage');
return Promise.reject(new Error(localizedErrorMsg));
}

if (!response?.actions || !Array.isArray(response.actions) || !response.actions.length) {
// TODO: need to localize default error message when there are no commands
return Promise.reject(new Error('Default error message'));
const localizedErrorMsg = messageLocalization.format('dxDataGrid-aiAssistantInvalidResponseMessage');
return Promise.reject(new Error(localizedErrorMsg));
}

if (!this.gridCommands?.validate(response.actions)) {
// TODO: need to localize error message on validation fail
return Promise.reject(new Error('Received invalid commands'));
const localizedErrorMsg = messageLocalization.format('dxDataGrid-aiAssistantInvalidResponseMessage');
return Promise.reject(new Error(localizedErrorMsg));
}

const customizeResponseText = this.option('aiAssistant.customizeResponseText');
const notInitializedErrorMsg = messageLocalization.format('dxDataGrid-aiAssistantUnexpectedErrorMessage');
Comment thread
dmirgaev marked this conversation as resolved.

return this.gridCommands?.executeCommands(response.actions, customizeResponseText)
?? Promise.reject(new Error('Grid commands not initialized'));
?? Promise.reject(new Error(notInitializedErrorMsg));
}

private createPendingAIMessage(message: Message): AIMessage {
Expand Down Expand Up @@ -177,8 +178,8 @@ export class AIAssistantController extends Controller {
const responseSchema = this.gridCommands?.buildResponseSchema();

if (!responseSchema) {
// TODO: Change error message
const error = new Error('Grid commands not initialized');
const localizedErrorMsg = messageLocalization.format('dxDataGrid-aiAssistantUnexpectedErrorMessage');
const error = new Error(localizedErrorMsg);

this.failAIMessage(aiMessage.id, error);
reject(error);
Expand All @@ -198,7 +199,6 @@ export class AIAssistantController extends Controller {
resolve();
})
.fail((errorMessage) => {
// TODO: Change error message
const error = errorMessage instanceof Error
? errorMessage
: new Error(String(errorMessage));
Expand All @@ -208,8 +208,9 @@ export class AIAssistantController extends Controller {
});
},
onError: (error: Error): void => {
// TODO: Change error message
this.failAIMessage(aiMessage.id, error);
const localizedErrorMsg = messageLocalization.format('dxDataGrid-aiAssistantInvalidResponseMessage');
Comment thread
dmirgaev marked this conversation as resolved.

this.failAIMessage(aiMessage.id, new Error(localizedErrorMsg));
reject(error);
Comment thread
dmirgaev marked this conversation as resolved.
},
Comment thread
dmirgaev marked this conversation as resolved.
onAbort: (): void => {
Expand Down Expand Up @@ -244,8 +245,8 @@ export class AIAssistantController extends Controller {

public sendRequestToAI(message: Message | AIMessage): Promise<void> {
if (this.processing) {
// TODO: need to add localization message when a request is already processing
return Promise.reject();
const localizedErrorMsg = messageLocalization.format('dxDataGrid-aiAssistantRequestInProgressMessage');
return Promise.reject(new Error(localizedErrorMsg));
}

if (isAIMessage(message)) {
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/bg.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/ca.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/da.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/el.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/fa.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/fi.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
4 changes: 4 additions & 0 deletions packages/devextreme/js/localization/messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
"dxDataGrid-aiAssistantSuccessMessage": "Success",
"dxDataGrid-aiAssistantErrorMessage": "Error",
"dxDataGrid-aiAssistantExecutionAbortMessage": "Execution Interrupted",
"dxDataGrid-aiAssistantExecutionInProgressMessage": "Execution already in progress. Please wait.",
"dxDataGrid-aiAssistantRequestInProgressMessage": "Request already in progress. Please wait.",
"dxDataGrid-aiAssistantUnexpectedErrorMessage": "An unexpected error occurred. Please try again.",
"dxDataGrid-aiAssistantInvalidResponseMessage": "Invalid response from the AI service. Please try again.",
"dxDataGrid-aiAssistantClearButtonText": "Clear",
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
"dxDataGrid-aiAssistantAbortConfirmText": "Closing the AI Assistant chat aborts requests in progress. Would you like to close the chat?",
Expand Down
Loading
Loading