Skip to content

Commit 301ebee

Browse files
author
Alyar
committed
Fix load panel stucking when loading cached page
1 parent 47414aa commit 301ebee

File tree

4 files changed

+100
-13
lines changed

4 files changed

+100
-13
lines changed

packages/devextreme/js/__internal/grids/grid_core/ai_column/ai_column.integration.test.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4556,4 +4556,69 @@ describe('Load panel', () => {
45564556
expect(component.getLoadPanel().isVisible()).toBe(false);
45574557
});
45584558
});
4559+
4560+
describe('when AI Column response is cached', () => {
4561+
it('should be hidden', async () => {
4562+
const aiIntegration = new AIIntegration({
4563+
sendRequest(prompt): RequestResult {
4564+
return {
4565+
promise: new Promise<string>((resolve) => {
4566+
const result = {};
4567+
Object.entries(prompt.data?.data).forEach(([key, value]) => {
4568+
result[key] = `Response ${(value as any).name}`;
4569+
});
4570+
4571+
resolve(JSON.stringify(result));
4572+
}),
4573+
abort: (): void => {},
4574+
};
4575+
},
4576+
});
4577+
const { component, instance } = await createDataGrid({
4578+
dataSource: [
4579+
{ id: 1, name: 'Name 1', value: 10 },
4580+
{ id: 2, name: 'Name 2', value: 20 },
4581+
],
4582+
paging: {
4583+
pageSize: 1,
4584+
},
4585+
keyExpr: 'id',
4586+
columns: [
4587+
{ dataField: 'id', caption: 'ID' },
4588+
{ dataField: 'name', caption: 'Name' },
4589+
{ dataField: 'value', caption: 'Value' },
4590+
{
4591+
type: 'ai',
4592+
caption: 'AI Column',
4593+
name: 'myColumn',
4594+
ai: {
4595+
aiIntegration,
4596+
prompt: 'Test prompt',
4597+
},
4598+
},
4599+
],
4600+
});
4601+
4602+
expect(instance.getAIColumnText('myColumn', 1)).toEqual('Response Name 1');
4603+
4604+
instance.option('paging.pageIndex', 1);
4605+
jest.runAllTimers();
4606+
4607+
expect(component.getLoadPanel().isVisible()).toBe(true);
4608+
4609+
await Promise.resolve();
4610+
4611+
expect(instance.getAIColumnText('myColumn', 2)).toEqual('Response Name 2');
4612+
4613+
instance.option('paging.pageIndex', 0);
4614+
jest.runAllTimers();
4615+
4616+
expect(component.getLoadPanel().isVisible()).toBe(false);
4617+
4618+
await Promise.resolve();
4619+
4620+
expect(instance.getAIColumnText('myColumn', 1)).toEqual('Response Name 1');
4621+
expect(component.getLoadPanel().isVisible()).toBe(false);
4622+
});
4623+
});
45594624
});

packages/devextreme/js/__internal/grids/grid_core/ai_column/m_ai_column_controller.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import type { GenerateGridColumnCommandResult, RequestCallbacks } from '@js/common/ai-integration';
21
import type { Callback } from '@js/core/utils/callbacks';
32

43
import type { Column, ColumnsController } from '../columns_controller/m_columns_controller';
54
import type { DataController, HandleDataChangedArguments, UserData } from '../data_controller/m_data_controller';
65
import { Controller } from '../m_modules';
76
import { AIColumnIntegrationController } from './m_ai_column_integration_controller';
7+
import type { InternalRequestCallbacks } from './types';
88
import { getAICommandColumnDefaultOptions, isAIColumnAutoMode, isPromptOption } from './utils';
99

1010
export class AIColumnController extends Controller {
@@ -124,13 +124,13 @@ export class AIColumnController extends Controller {
124124
needToShowLoadPanel = true,
125125
): void {
126126
const callbacks = this.getRequestCallbacks();
127-
const column = this.columnsController.columnOption(columnName);
128127

129-
if (needToShowLoadPanel && !!column?.ai?.prompt) {
130-
this.dataController.beginCustomLoading();
131-
}
132-
133-
this.aiColumnIntegrationController.sendRequest(columnName, useCache, callbacks);
128+
this.aiColumnIntegrationController.sendRequestCore({
129+
columnName,
130+
useCache,
131+
needToShowLoadPanel,
132+
callbacks,
133+
});
134134
}
135135

136136
public sendAIColumnRequest(
@@ -145,8 +145,13 @@ export class AIColumnController extends Controller {
145145
this.sendRequest(columnName, false);
146146
}
147147

148-
private getRequestCallbacks(): RequestCallbacks<GenerateGridColumnCommandResult> {
148+
private getRequestCallbacks(): InternalRequestCallbacks {
149149
return {
150+
onRequestSending: (needToShowLoadPanel: boolean): void => {
151+
if (needToShowLoadPanel) {
152+
this.dataController.beginCustomLoading();
153+
}
154+
},
150155
onComplete: (data): void => {
151156
this.dataController.endCustomLoading();
152157
this.aiRequestCompleted.fire(data);

packages/devextreme/js/__internal/grids/grid_core/ai_column/m_ai_column_integration_controller.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { DataController } from '../data_controller/m_data_controller';
1010
import type { ErrorHandlingController } from '../error_handling/m_error_handling';
1111
import { Controller } from '../m_modules';
1212
import { AIColumnCacheController } from './m_ai_column_cache_controller';
13+
import type { InternalRequestCallbacks } from './types';
1314
import { getDataFromRowItems, reduceDataCachedKeys } from './utils';
1415

1516
export class AIColumnIntegrationController extends Controller {
@@ -35,11 +36,17 @@ export class AIColumnIntegrationController extends Controller {
3536
this.createAction('onAIColumnResponseReceived');
3637
}
3738

38-
public sendRequest(
39-
columnName: string,
40-
useCache: boolean,
41-
callbacks?: RequestCallbacks<GenerateGridColumnCommandResult>,
42-
): void {
39+
public sendRequestCore({
40+
columnName,
41+
useCache,
42+
needToShowLoadPanel,
43+
callbacks,
44+
}: {
45+
columnName: string;
46+
useCache: boolean;
47+
needToShowLoadPanel: boolean;
48+
callbacks: InternalRequestCallbacks;
49+
}): void {
4350
const aiIntegration = this.getAIIntegration(columnName);
4451
if (!aiIntegration) {
4552
return;
@@ -86,6 +93,8 @@ export class AIColumnIntegrationController extends Controller {
8693
return;
8794
}
8895

96+
callbacks.onRequestSending(needToShowLoadPanel);
97+
8998
const abort = aiIntegration.generateGridColumn(
9099
{
91100
text: prompt,
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type {
2+
GenerateGridColumnCommandResult,
3+
RequestCallbacks,
4+
} from '@js/common/ai-integration';
5+
6+
export type InternalRequestCallbacks = RequestCallbacks<GenerateGridColumnCommandResult> & {
7+
onRequestSending: (needToShowLoadPanel: boolean) => void;
8+
};

0 commit comments

Comments
 (0)