diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 8f01d1908..62cf63381 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -1027,7 +1027,11 @@ export async function getMessagesTable( id?: string, excludedFields?: string[], params = {}, -): Promise<{ rows: Array; columns: Array }> { +): Promise<{ + rows: Array; + columns: Array; + sessions: Array; +}> { const config = {}; if (id) { config["params"] = { flow_id: id }; @@ -1037,20 +1041,11 @@ export async function getMessagesTable( } const rows = await api.get(`${BASE_URL_API}monitor/messages`, config); const columns = extractColumnsFromRows(rows.data, mode, excludedFields); - return { rows: rows.data, columns }; -} - -export async function getSessions(id?: string): Promise> { - const config = {}; - if (id) { - config["params"] = { flow_id: id }; - } - const rows = await api.get(`${BASE_URL_API}monitor/messages`, config); const sessions = new Set(); rows.data.forEach((row) => { sessions.add(row.session_id); }); - return Array.from(sessions); + return { rows: rows.data, columns, sessions: Array.from(sessions) }; } export async function deleteMessagesFn(ids: number[]) { diff --git a/src/frontend/src/modals/IOModal/components/SessionView/index.tsx b/src/frontend/src/modals/IOModal/components/SessionView/index.tsx new file mode 100644 index 000000000..273766889 --- /dev/null +++ b/src/frontend/src/modals/IOModal/components/SessionView/index.tsx @@ -0,0 +1,68 @@ +import { + CellEditRequestEvent, + ColDef, + ColGroupDef, + SelectionChangedEvent, +} from "ag-grid-community"; +import { useState } from "react"; +import TableComponent from "../../../../components/tableComponent"; +import { Card, CardContent } from "../../../../components/ui/card"; +import useAlertStore from "../../../../stores/alertStore"; +import { useMessagesStore } from "../../../../stores/messagesStore"; +import useUpdateMessage from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-updateMessage"; +import useRemoveMessages from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-remove-messages"; +import useMessagesTable from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-messages-table"; +import HeaderMessagesComponent from "../../../../pages/SettingsPage/pages/messagesPage/components/headerMessages"; + +export default function SessionView({ + session, + columns, +}: { + session: string; + columns: Array; +}) { + const messages = useMessagesStore((state) => state.messages); + const setErrorData = useAlertStore((state) => state.setErrorData); + const setSuccessData = useAlertStore((state) => state.setSuccessData); + + const [selectedRows, setSelectedRows] = useState([]); + + const { handleRemoveMessages } = useRemoveMessages( + setSelectedRows, + setSuccessData, + setErrorData, + selectedRows, + ); + + const { handleUpdate } = useUpdateMessage(setSuccessData, setErrorData); + + function handleUpdateMessage(event: CellEditRequestEvent) { + const newValue = event.newValue; + const field = event.column.getColId(); + const row = event.data; + const data = { + ...row, + [field]: newValue, + }; + handleUpdate(data); + } + + return ( + { + handleUpdateMessage(event); + }} + editable={["Sender Name", "Message"]} + overlayNoRowsTemplate="No data available" + onSelectionChanged={(event: SelectionChangedEvent) => { + setSelectedRows(event.api.getSelectedRows().map((row) => row.index)); + }} + rowSelection="multiple" + suppressRowClickSelection={true} + pagination={true} + columnDefs={columns} + rowData={messages.filter((message) => message.session_id === session)} + /> + ); +} diff --git a/src/frontend/src/modals/IOModal/index.tsx b/src/frontend/src/modals/IOModal/index.tsx index 36d495d95..bf60384d2 100644 --- a/src/frontend/src/modals/IOModal/index.tsx +++ b/src/frontend/src/modals/IOModal/index.tsx @@ -25,7 +25,10 @@ import { cn } from "../../utils/utils"; import BaseModal from "../baseModal"; import IOFieldView from "./components/IOFieldView"; import ChatView from "./components/chatView"; -import { getSessions } from "../../controllers/API"; +import { getMessagesTable } from "../../controllers/API"; +import { useMessagesStore } from "../../stores/messagesStore"; +import { ColDef, ColGroupDef } from "ag-grid-community"; +import SessionView from "./components/SessionView"; export default function IOModal({ children, @@ -34,6 +37,7 @@ export default function IOModal({ disable, }: IOModalPropsType): JSX.Element { const allNodes = useFlowStore((state) => state.nodes); + const setMessages = useMessagesStore((state) => state.setMessages); const inputs = useFlowStore((state) => state.inputs).filter( (input) => input.type !== "ChatInput", ); @@ -80,6 +84,7 @@ export default function IOModal({ const currentFlow = useFlowsManagerStore((state) => state.currentFlow); const setNode = useFlowStore((state) => state.setNode); const [sessions, setSessions] = useState([]); + const [columns, setColumns] = useState>([]); async function updateVertices() { return updateVerticesOrder(currentFlow!.id, null); @@ -126,8 +131,10 @@ export default function IOModal({ useEffect(() => { setSelectedViewField(startView()); if (haveChat) { - getSessions().then((sessions) => { + getMessagesTable("union").then(({ sessions, rows, columns }) => { setSessions(sessions); + setMessages(rows); + setColumns(columns); }); } }, [open]); @@ -300,7 +307,16 @@ export default function IOModal({ {sessions.map((session, index) => { return ( -
+
{ + event.stopPropagation(); + setSelectedViewField({ + id: session, + type: "Session", + }); + }} + >
{session} @@ -362,14 +378,17 @@ export default function IOModal({
{inputs.some( (input) => input.id === selectedViewField.id, - ) ? ( + ) && ( - ) : ( + )} + {outputs.some( + (output) => output.id === selectedViewField.id, + ) && ( )} + {sessions.some( + (session) => session === selectedViewField.id, + ) && ( + + )}
)}