import { useEffect, useRef, useState } from "react"; import * as React from "react"; import TableRow from "@mui/material/TableRow"; import TableCell from "@mui/material/TableCell"; import { Box, Collapse, IconButton, Typography, Chip, TextField } from "@mui/material"; import { Button } from "@mui/material"; import { DeleteForever, KeyboardArrowDown, KeyboardArrowUp, Settings } from "@mui/icons-material"; import { deleteRunFromStorage } from "../../api/storage"; import { columns, Data } from "./RunsTable"; import { RunContent } from "./RunContent"; import { GenericModal } from "../ui/GenericModal"; import { modalStyle } from "../recorder/AddWhereCondModal"; import { getUserById } from "../../api/auth"; import { useTranslation } from "react-i18next"; import { useTheme } from "@mui/material/styles"; interface RunTypeChipProps { runByUserId?: string; runByScheduledId?: string; runByAPI: boolean; } const RunTypeChip: React.FC = ({ runByUserId, runByScheduledId, runByAPI }) => { const { t } = useTranslation(); if (runByScheduledId) return ; if (runByAPI) return ; if (runByUserId) return ; return ; }; interface CollapsibleRowProps { row: Data; handleDelete: () => void; isOpen: boolean; onToggleExpanded: (shouldExpand: boolean) => void; currentLog: string; abortRunHandler: (runId: string, robotName: string, browserId: string) => void; runningRecordingName: string; urlRunId: string | null; } export const CollapsibleRow = ({ row, handleDelete, isOpen, onToggleExpanded, currentLog, abortRunHandler, runningRecordingName, urlRunId }: CollapsibleRowProps) => { const { t } = useTranslation(); const theme = useTheme(); const [isDeleteOpen, setDeleteOpen] = useState(false); const [openSettingsModal, setOpenSettingsModal] = useState(false); const [userEmail, setUserEmail] = useState(null); const runByLabel = row.runByScheduleId ? `${row.runByScheduleId}` : row.runByUserId ? `${userEmail}` : row.runByAPI ? 'API' : 'Unknown'; const logEndRef = useRef(null); const scrollToLogBottom = () => { if (logEndRef.current) { logEndRef.current.scrollIntoView({ behavior: "smooth" }); } } const handleAbort = () => { abortRunHandler(row.runId, row.name, row.browserId); } const handleRowExpand = () => { const newOpen = !isOpen; onToggleExpanded(newOpen); //scrollToLogBottom(); }; // useEffect(() => { // scrollToLogBottom(); // }, [currentLog]) useEffect(() => { const fetchUserEmail = async () => { if (row.runByUserId) { const userData = await getUserById(row.runByUserId); if (userData && userData.user) { setUserEmail(userData.user.email); } } }; fetchUserEmail(); }, [row.runByUserId]); const handleConfirmDelete = async () => { try { const res = await deleteRunFromStorage(`${row.runId}`); if (res) { handleDelete(); } } finally { setDeleteOpen(false); } }; return ( *': { borderBottom: 'unset' } }} hover role="checkbox" tabIndex={-1} key={row.id}> {isOpen ? : } {columns.map((column) => { // @ts-ignore const value: any = row[column.id]; if (value !== undefined) { return ( {value} ); } else { switch (column.id) { case 'runStatus': return ( {row.status === 'success' && } {row.status === 'running' && } {row.status === 'scheduled' && } {row.status === 'queued' && } {row.status === 'failed' && } {row.status === 'aborted' && } ) case 'delete': return ( setDeleteOpen(true)}> ); case 'settings': return ( setOpenSettingsModal(true)}> setOpenSettingsModal(false)} modalStyle={modalStyle} > <> {t('runs_table.run_settings_modal.title')} {t('runs_table.run_settings_modal.labels.run_type')}: ) default: return null; } } })} setDeleteOpen(false)} modalStyle={{ ...modalStyle, padding: 0, backgroundColor: 'transparent', width: 'auto', maxWidth: '520px' }}> {t('runs_table.delete_confirm.title', { name: row.name, defaultValue: 'Delete run "{{name}}"?' })} {t('runs_table.delete_confirm.message', { name: row.name, defaultValue: 'Are you sure you want to delete the run "{{name}}"?' })} ); }