import styles from './styles.module.css' import {useEffect, useState} from "react" import DeleteForeverOutlined from "@mui/icons-material/DeleteForeverOutlined" import StopCircleOutlined from "@mui/icons-material/StopCircleOutlined" import PauseCircleOutline from "@mui/icons-material/PauseCircleOutline" import PlayCircleOutline from "@mui/icons-material/PlayCircleOutline" import HourglassEmptyOutlined from "@mui/icons-material/HourglassEmptyOutlined" import CheckCircleOutline from "@mui/icons-material/CheckCircleOutline" import ErrorOutline from "@mui/icons-material/ErrorOutline" import ReplayOutlined from "@mui/icons-material/ReplayOutlined" import RunCircleOutlined from "@mui/icons-material/RunCircleOutlined" import FactCheckOutlined from "@mui/icons-material/FactCheckOutlined" import {IconButton, LinearProgress, TableContainer, Table, TableBody, TableCell, TableHead, TableRow, TablePagination} from "@mui/material" import ConfirmDialog from "../confirm-dialog"; import smClient from "../../../api/sm/sm-client"; export interface ProcessExceptionInterface { message: string, file: string, line: number, code: number, trace: any[], } export interface ProcessProgressInterface { total: number, progress: number, memory: any[], remaining: string percent: number } export interface ProcessInterface { id: string, lock: string | null, containerUuid: string | null, pid: bigint | null, name: string, options: Record, arguments: Record, exception: ProcessExceptionInterface | null, progress: ProcessProgressInterface | null, outputId: string | null, createdAt: string, updatedAt: string | null, startedAt: string | null, pausedAt: string | null, cancelledAt: string | null completedAt: string | null status: Status canPlay: boolean canPause: boolean canRepeat: boolean canStop: boolean canKill: boolean } enum Status { Wait = 'wait', Running = 'running', Cancelled = 'cancelled', Error = 'error', Success = 'success', } export default function Processes() { const [processes, setProcesses] = useState([]); const [page, setPage] = useState(0); const [count, setCount] = useState(0); const [open, setOpen] = useState(false); const [selectedProcess, setSelectedProcess] = useState(null); let refreshLock = false let refreshProcesses = async () => { if (refreshLock) { return } refreshLock = true const { data: processes, headers } = await smClient.getProcesses({ page: page + 1, limit: 20, }) setProcesses(processes) setCount(Number(headers.get('X-Pagination-Count'))) refreshLock = false } let output = async (process: ProcessInterface) => { const { data: output } = await smClient.getProcessOutput({ id: process.id }) let a = document.createElement("a"); let file = new Blob([output], {type: 'plain/text'}); a.href = URL.createObjectURL(file); a.download = `${process.id}.txt`; a.click(); } useEffect(() => { const timer = setInterval(() => refreshProcesses(), 1000) return () => clearInterval(timer); }, [page]); let isFinished = (process: ProcessInterface) => process.cancelledAt || process.completedAt const handleChangePage = (event: any, page: number) => { setPage(page); } const openRepeatDialog = (process: ProcessInterface) => { setSelectedProcess(process) setOpen(true) } let lock = false const repeat = async (dialogId: string) => { if (lock) { return } if (!selectedProcess) { return } lock = true await smClient.repeatProcess({ id: selectedProcess.id, requestId: dialogId }) lock = false setSelectedProcess(null) setOpen(false) } return ( <> Name Progress Status Action Created {processes.map((process: ProcessInterface, index: number) => ( {process.name} {!process.progress && !isFinished(process) && } {!process.progress && isFinished(process) && } {process.progress && } {process.progress && {`${process.progress.progress}`} / {`${process.progress.total}`} - {process.progress.percent}% [{process.progress.memory}] / {process.progress.remaining} } {process.canPlay && } {process.canPause && } {process.canStop && } {Status.Error === process.status && } {Status.Success === process.status && } {Status.Running === process.status && } {Status.Cancelled === process.status && } {Status.Wait === process.status && } {process.canRepeat && openRepeatDialog(process)} title={`Repeat`} aria-label="Repeat"> } {process.canKill && } {process?.outputId && output(process)} aria-label="Output"> } {new Date(process.createdAt).toLocaleDateString()} ))}
{ setSelectedProcess(null) setOpen(false) }}/> ) }