Skip to content

Commit f62d7ff

Browse files
committed
review fix, localizations
1 parent 81ee689 commit f62d7ff

File tree

37 files changed

+263
-31
lines changed

37 files changed

+263
-31
lines changed

packages/devextreme/js/__internal/grids/data_grid/module_not_extended/ai_assistant.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import messageLocalization from '@js/common/core/localization/message';
12
import { AIAssistantView } from '@ts/grids/grid_core/ai_assistant/ai_assistant_view';
23
import { AIAssistantViewController } from '@ts/grids/grid_core/ai_assistant/ai_assistant_view_controller';
34

@@ -8,7 +9,7 @@ gridCore.registerModule('aiAssistant', {
89
return {
910
aiAssistant: {
1011
enabled: false,
11-
title: 'AI Assistant', // TODO add localization message
12+
title: messageLocalization.format('dxDataGrid-aiAssistantTitle'),
1213
},
1314
};
1415
},

packages/devextreme/js/__internal/grids/grid_core/ai_assistant/__tests__/ai_assistant_view.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,12 @@ describe('AIAssistantView', () => {
212212
});
213213
});
214214

215-
describe('onVisibilityChanged', () => {
216-
it('should fire onVisibilityChanged callback when popup visibility changes', () => {
215+
describe('visibilityChanged', () => {
216+
it('should fire visibilityChanged callback when popup visibility changes', () => {
217217
const { aiAssistantView } = createAIAssistantView();
218218
const callback = jest.fn();
219219

220-
aiAssistantView.onVisibilityChanged = callback;
220+
aiAssistantView.visibilityChanged?.add(callback);
221221

222222
const aiChatConfig = (AIChat as jest.Mock).mock.calls[0][0] as AIChatOptions;
223223
aiChatConfig.onVisibilityChanged?.(true);

packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_view.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1+
import type { Callback } from '@js/core/utils/callbacks';
2+
13
import { AIChat } from '../ai_chat/ai_chat';
24
import type { AIChatOptions } from '../ai_chat/types';
35
import { View } from '../m_modules';
46

57
export class AIAssistantView extends View {
68
private aiChatInstance!: AIChat;
79

8-
public onVisibilityChanged?: (visible: boolean) => void;
10+
public visibilityChanged?: Callback;
911

1012
private getAIChatConfig(): AIChatOptions {
1113
return {
1214
container: this.element(),
1315
createComponent: this._createComponent.bind(this),
1416
onVisibilityChanged: (visible: boolean): void => {
15-
this.onVisibilityChanged?.(visible);
17+
this.visibilityChanged?.fire(visible);
1618
},
1719
};
1820
}
@@ -25,6 +27,10 @@ export class AIAssistantView extends View {
2527
}
2628
}
2729

30+
protected callbackNames(): string[] {
31+
return ['visibilityChanged'];
32+
}
33+
2834
public isVisible(): boolean {
2935
return !!this.option('aiAssistant.enabled');
3036
}

packages/devextreme/js/__internal/grids/grid_core/ai_assistant/ai_assistant_view_controller.ts

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,35 @@
11
import type { dxElementWrapper } from '@js/core/renderer';
2-
import $ from '@js/core/renderer';
3-
import type { InitializedEvent as ButtonInitializedEvent } from '@js/ui/button';
42
import { ACTIVE_STATE_CLASS } from '@ts/core/widget/widget';
3+
import {
4+
AI_ASSISTANT_BUTTON_NAME,
5+
AI_ASSISTANT_ICON_NAME,
6+
CLASSES,
7+
} from '@ts/grids/grid_core/ai_assistant/const';
58
import type { HeaderPanel } from '@ts/grids/grid_core/header_panel/m_header_panel';
69
import type { OptionChanged } from '@ts/grids/grid_core/m_types';
710
import type { ToolbarItem } from '@ts/grids/new/grid_core/toolbar/types';
811

912
import { ViewController } from '../m_modules';
1013
import type { AIAssistantView } from './ai_assistant_view';
1114

12-
const AI_ASSISTANT_BUTTON_NAME = 'aiAssistantButton';
13-
const AI_ASSISTANT_BUTTON_CLASS = 'ai-assistant-button';
14-
const AI_ASSISTANT_ICON_NAME = 'chatsparkleoutline';
15-
1615
export class AIAssistantViewController extends ViewController {
17-
private aiAssistantView!: AIAssistantView;
16+
private aiAssistantView?: AIAssistantView;
1817

1918
private headerPanel?: HeaderPanel;
2019

21-
private $aiAssistantButton?: dxElementWrapper;
20+
private getAiAssistantButton(): dxElementWrapper | undefined {
21+
const className = this.addWidgetPrefix(CLASSES.aiAssistantButton);
22+
23+
return this.headerPanel?.element()?.find(`.${className}`) as dxElementWrapper | undefined;
24+
}
2225

2326
public init(): void {
2427
this.aiAssistantView = this.getView('aiAssistantView');
2528
this.headerPanel = this.getView('headerPanel');
2629

27-
this.aiAssistantView.onVisibilityChanged = (visible: boolean): void => {
28-
this.$aiAssistantButton?.toggleClass(ACTIVE_STATE_CLASS, visible);
29-
};
30+
this.aiAssistantView.visibilityChanged?.add((visible: boolean): void => {
31+
this.getAiAssistantButton()?.toggleClass(ACTIVE_STATE_CLASS, visible);
32+
});
3033

3134
const isAiAssistantEnabled = this.option('aiAssistant.enabled'); // TODO clarify option name
3235

@@ -47,7 +50,7 @@ export class AIAssistantViewController extends ViewController {
4750
}
4851

4952
public toggle(): Promise<boolean> {
50-
return this.aiAssistantView.toggle();
53+
return this.aiAssistantView?.toggle() ?? Promise.resolve(false);
5154
}
5255

5356
private syncAiAssistantItem(): void {
@@ -57,27 +60,23 @@ export class AIAssistantViewController extends ViewController {
5760
const aiAssistantToolbarItem = this.createAiAssistantToolbarItem();
5861

5962
this.headerPanel?.applyToolbarItem(AI_ASSISTANT_BUTTON_NAME, aiAssistantToolbarItem);
60-
this.aiAssistantView._invalidate();
63+
this.aiAssistantView?._invalidate();
6164
} else {
6265
this.headerPanel?.removeToolbarItem(AI_ASSISTANT_BUTTON_NAME);
6366
// eslint-disable-next-line @typescript-eslint/no-floating-promises
64-
this.aiAssistantView.hide();
67+
this.aiAssistantView?.hide();
6568
}
6669
}
6770

6871
private createAiAssistantToolbarItem(): ToolbarItem {
6972
const onClickHandler = (): Promise<boolean> => this.toggle();
7073

71-
const onInitialized = (e: ButtonInitializedEvent): void => {
72-
this.$aiAssistantButton = $(e.element);
73-
74-
if (this.headerPanel) {
75-
const aiAssistantClass = this.addWidgetPrefix(AI_ASSISTANT_BUTTON_CLASS);
76-
this.$aiAssistantButton.addClass(this.headerPanel.getToolbarButtonClass(aiAssistantClass));
77-
}
78-
};
7974
const hintText = this.option('aiAssistant.title'); // TODO clarify option name
8075

76+
const aiAssistantToolbarItemClass = this.headerPanel?.getToolbarButtonClass(
77+
this.addWidgetPrefix(CLASSES.aiAssistantButton),
78+
);
79+
8180
return {
8281
widget: 'dxButton',
8382
options: {
@@ -86,8 +85,10 @@ export class AIAssistantViewController extends ViewController {
8685
onClick: onClickHandler,
8786
hint: hintText,
8887
text: hintText,
89-
onInitialized,
90-
elementAttr: { 'aria-haspopup': 'dialog' },
88+
elementAttr: {
89+
'aria-haspopup': 'dialog',
90+
class: aiAssistantToolbarItemClass,
91+
},
9192
},
9293
showText: 'inMenu',
9394
location: 'after',
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export const AI_ASSISTANT_BUTTON_NAME = 'aiAssistantButton';
2+
export const AI_ASSISTANT_ICON_NAME = 'chatsparkleoutline';
3+
4+
export const CLASSES = {
5+
aiAssistantButton: 'ai-assistant-button',
6+
};

packages/devextreme/js/__internal/grids/tree_list/module_not_extended/ai_assistant.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import messageLocalization from '@js/common/core/localization/message';
12
import { AIAssistantView } from '@ts/grids/grid_core/ai_assistant/ai_assistant_view';
23
import { AIAssistantViewController } from '@ts/grids/grid_core/ai_assistant/ai_assistant_view_controller';
34

@@ -8,7 +9,7 @@ gridCore.registerModule('aiAssistant', {
89
return {
910
aiAssistant: {
1011
enabled: false,
11-
title: 'AI Assistant', // TODO add localization message
12+
title: messageLocalization.format('dxDataGrid-aiAssistantTitle'),
1213
},
1314
};
1415
},

packages/devextreme/js/localization/messages/ar.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@
107107
"dxNumberBox-noDataText": "لا يوجد بيانات",
108108

109109

110+
"dxDataGrid-aiAssistantTitle": "AI Assistant",
111+
"dxDataGrid-aiAssistantProcessingMessage": "Processing...",
112+
"dxDataGrid-aiAssistantSuccessMessage": "Success",
113+
"dxDataGrid-aiAssistantClearButtonText": "Clear",
114+
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
115+
"dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty",
116+
"dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.",
110117
"dxDataGrid-aiPromptEditorTitle": "محرر موجهات AI",
111118
"dxDataGrid-aiPromptEditorPlaceholder": "أطلب من AI إنشاء قيم الأعمدة...",
112119
"dxDataGrid-aiPromptEditorApplyButton": "تطبيق",

packages/devextreme/js/localization/messages/bg.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@
107107
"dxNumberBox-noDataText": "Няма данни",
108108

109109

110+
"dxDataGrid-aiAssistantTitle": "AI Assistant",
111+
"dxDataGrid-aiAssistantProcessingMessage": "Processing...",
112+
"dxDataGrid-aiAssistantSuccessMessage": "Success",
113+
"dxDataGrid-aiAssistantClearButtonText": "Clear",
114+
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
115+
"dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty",
116+
"dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.",
110117
"dxDataGrid-aiPromptEditorTitle": "AI редактор на подсказки",
111118
"dxDataGrid-aiPromptEditorPlaceholder": "Инструктирайте AI да генерира стойности за колоната...",
112119
"dxDataGrid-aiPromptEditorApplyButton": "Прилагане",

packages/devextreme/js/localization/messages/ca.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@
107107
"dxNumberBox-noDataText": "No hi ha dades",
108108

109109

110+
"dxDataGrid-aiAssistantTitle": "AI Assistant",
111+
"dxDataGrid-aiAssistantProcessingMessage": "Processing...",
112+
"dxDataGrid-aiAssistantSuccessMessage": "Success",
113+
"dxDataGrid-aiAssistantClearButtonText": "Clear",
114+
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
115+
"dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty",
116+
"dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.",
110117
"dxDataGrid-aiPromptEditorTitle": "Editor de prompts d'IA",
111118
"dxDataGrid-aiPromptEditorPlaceholder": "Demana a la IA que generi els valors de la columna...",
112119
"dxDataGrid-aiPromptEditorApplyButton": "Aplicar",

packages/devextreme/js/localization/messages/cs.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@
107107
"dxNumberBox-noDataText": "Žádná data",
108108

109109

110+
"dxDataGrid-aiAssistantTitle": "AI Assistant",
111+
"dxDataGrid-aiAssistantProcessingMessage": "Processing...",
112+
"dxDataGrid-aiAssistantSuccessMessage": "Success",
113+
"dxDataGrid-aiAssistantClearButtonText": "Clear",
114+
"dxDataGrid-aiAssistantRegenerateButtonText": "Regenerate",
115+
"dxDataGrid-aiAChatEmptyViewMessage": "Chat is Empty",
116+
"dxDataGrid-aiChatEmptyViewPrompt": "AI Assistant is ready to answer your questions.",
110117
"dxDataGrid-aiPromptEditorTitle": "Editor výzev AI",
111118
"dxDataGrid-aiPromptEditorPlaceholder": "Vyzvěte AI k vygenerování hodnot sloupců...",
112119
"dxDataGrid-aiPromptEditorApplyButton": "Použít",

0 commit comments

Comments
 (0)