Skip to content
Open
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
141 changes: 141 additions & 0 deletions apps/demos/Demos/DataGrid/AIAssistant/React/App.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import React, { useCallback, useRef } from 'react';

import type dxChat from 'devextreme/ui/chat';
import type { InitializedEvent, Properties as ChatProperties } from 'devextreme/ui/chat';
import type { ItemClickEvent } from 'devextreme/ui/button_group';

import DataGrid, {
Column,
Paging,
Pager,
SearchPanel,
GroupPanel,
HeaderFilter,
FilterRow,
AIAssistant,
} from 'devextreme-react/data-grid';

import { sales } from './data.ts';
import { aiIntegration } from './service.ts';

const allowedPageSizes = [10, 25, 50, 100];

const suggestions = {
items: [
{
text: '💡 Help',
prompt: `💡 The DataGrid AI Assistant allows you to control the component using natural language. You can execute commands such as the following:
• Sort records
• Apply a filter
• Search for a specific value
• Group records by a field
• Focus and select rows
• Modify paging settings
• Pin, resize, and reorder columns
• Configure data summaries
• Pick a suggestion or enter a custom request to get started.`,
},
{
text: '🔍 Filter Sector by Health',
prompt: 'Filter Sector by Health',
},
{
text: '↕️ Sort by Region',
prompt: 'Sort by Region',
},
{
text: '🧩 Group by Product',
prompt: 'Group by Product',
width: 170,
},
],
};

export default function App() {
const chatRef = useRef<dxChat | null>(null);

const onChatInitialized = useCallback((e: InitializedEvent) => {
chatRef.current = e.component ?? null;
}, []);

const onSuggestionItemClick = useCallback((e: ItemClickEvent) => {
const { prompt, text } = e.itemData;
const userId = text === '💡 Help' ? 'help' : 'user';

const message = {
id: Date.now(),
timestamp: new Date(),
author: { id: userId },
text: prompt,
};

chatRef.current?.getDataSource().store().push([{
type: 'insert',
data: message,
}]);
}, []);

const chatOptions: ChatProperties = {
onInitialized: onChatInitialized,
user: {
id: 'user',
},
suggestions: {
...suggestions,
onItemClick: onSuggestionItemClick,
},
};

return (
<DataGrid
id="gridContainer"
dataSource={sales}
showBorders
keyExpr="Id"
filterSyncEnabled
>
<SearchPanel
visible
width={240}
placeholder="Search..."
/>
<GroupPanel visible />
<HeaderFilter visible />
<FilterRow visible />
<Paging pageSize={10} />
<Pager
visible
allowedPageSizes={allowedPageSizes}
showPageSizeSelector
/>
<AIAssistant
enabled
aiIntegration={aiIntegration}
chat={chatOptions}
/>
<Column dataField="Product" />
<Column
dataField="Amount"
caption="Sale Amount"
dataType="number"
format="currency"
/>
<Column
dataField="Region"
dataType="string"
/>
<Column
dataField="Sector"
dataType="string"
/>
<Column
dataField="SaleDate"
dataType="date"
/>
<Column
dataField="Customer"
dataType="string"
/>
</DataGrid>
);
}
Loading
Loading