|
|
@ -1,14 +1,15 @@ |
|
|
|
import styles from './styles.module.css' |
|
|
|
import styles from './styles.module.css' |
|
|
|
import {useEffect, useState} from "react" |
|
|
|
import {useEffect, useState} from "react" |
|
|
|
import DeleteForever from "@mui/icons-material/DeleteForever" |
|
|
|
import DeleteForeverOutlined from "@mui/icons-material/DeleteForeverOutlined" |
|
|
|
import StopCircle from "@mui/icons-material/StopCircle" |
|
|
|
import StopCircleOutlined from "@mui/icons-material/StopCircleOutlined" |
|
|
|
import PauseCircleOutline from "@mui/icons-material/PauseCircleOutline" |
|
|
|
import PauseCircleOutline from "@mui/icons-material/PauseCircleOutline" |
|
|
|
import PlayCircleOutline from "@mui/icons-material/PlayCircleOutline" |
|
|
|
import PlayCircleOutline from "@mui/icons-material/PlayCircleOutline" |
|
|
|
import HourglassEmpty from "@mui/icons-material/HourglassEmpty" |
|
|
|
import HourglassEmptyOutlined from "@mui/icons-material/HourglassEmptyOutlined" |
|
|
|
import CheckCircleOutline from "@mui/icons-material/CheckCircleOutline" |
|
|
|
import CheckCircleOutline from "@mui/icons-material/CheckCircleOutline" |
|
|
|
import ErrorOutline from "@mui/icons-material/ErrorOutline" |
|
|
|
import ErrorOutline from "@mui/icons-material/ErrorOutline" |
|
|
|
import Replay from "@mui/icons-material/Replay" |
|
|
|
import ReplayOutlined from "@mui/icons-material/ReplayOutlined" |
|
|
|
import RunCircle from "@mui/icons-material/RunCircle" |
|
|
|
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 {IconButton, LinearProgress, TableContainer, Table, TableBody, TableCell, TableHead, TableRow, TablePagination} from "@mui/material" |
|
|
|
import ConfirmDialog from "../confirm-dialog"; |
|
|
|
import ConfirmDialog from "../confirm-dialog"; |
|
|
|
|
|
|
|
|
|
|
@ -36,6 +37,7 @@ export interface ProcessInterface { |
|
|
|
arguments: Record<string, any>, |
|
|
|
arguments: Record<string, any>, |
|
|
|
exception: ProcessExceptionInterface | null, |
|
|
|
exception: ProcessExceptionInterface | null, |
|
|
|
progress: ProcessProgressInterface | null, |
|
|
|
progress: ProcessProgressInterface | null, |
|
|
|
|
|
|
|
outputId: string | null, |
|
|
|
createdAt: string, |
|
|
|
createdAt: string, |
|
|
|
updatedAt: string | null, |
|
|
|
updatedAt: string | null, |
|
|
|
startedAt: string | null, |
|
|
|
startedAt: string | null, |
|
|
@ -81,8 +83,8 @@ export default function Processes() { |
|
|
|
setCount(Number(response.headers.get('X-Pagination-Count'))) |
|
|
|
setCount(Number(response.headers.get('X-Pagination-Count'))) |
|
|
|
refreshLock = false |
|
|
|
refreshLock = false |
|
|
|
} |
|
|
|
} |
|
|
|
let output = async (process: string) => { |
|
|
|
let output = async (process: ProcessInterface) => { |
|
|
|
let response = await fetch(`http://fmw.sipachev.sv/system-monitoring/processes/${process}/output`, |
|
|
|
let response = await fetch(`http://fmw.sipachev.sv/system-monitoring/processes/${process.id}/output`, |
|
|
|
{ |
|
|
|
{ |
|
|
|
method: 'GET', |
|
|
|
method: 'GET', |
|
|
|
headers: { |
|
|
|
headers: { |
|
|
@ -90,7 +92,12 @@ export default function Processes() { |
|
|
|
'X-Pagination-Count': '0', |
|
|
|
'X-Pagination-Count': '0', |
|
|
|
}, |
|
|
|
}, |
|
|
|
}); |
|
|
|
}); |
|
|
|
const processes: ProcessInterface[] = await response.json() |
|
|
|
const output: string = await response.text() |
|
|
|
|
|
|
|
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(() => { |
|
|
|
useEffect(() => { |
|
|
@ -188,32 +195,35 @@ export default function Processes() { |
|
|
|
<PauseCircleOutline/> |
|
|
|
<PauseCircleOutline/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
{canStop(process) && <IconButton title={`Stop`} aria-label="Stop"> |
|
|
|
{canStop(process) && <IconButton title={`Stop`} aria-label="Stop"> |
|
|
|
<StopCircle/> |
|
|
|
<StopCircleOutlined/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
</TableCell> |
|
|
|
</TableCell> |
|
|
|
<TableCell> |
|
|
|
<TableCell> |
|
|
|
{Status.Error === status(process) && <IconButton title={`Error`} aria-label="Error"> |
|
|
|
{Status.Error === status(process) && <IconButton title={`Error`} aria-label="Error"> |
|
|
|
<ErrorOutline/> |
|
|
|
<ErrorOutline/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
{Status.Success === status(process) && <IconButton onClick={() => output(process.id)} title={`Success`} aria-label="Success"> |
|
|
|
{Status.Success === status(process) && <IconButton title={`Success`} aria-label="Success"> |
|
|
|
<CheckCircleOutline/> |
|
|
|
<CheckCircleOutline/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
{Status.Running === status(process) && <IconButton title={`Running`} aria-label="Running"> |
|
|
|
{Status.Running === status(process) && <IconButton title={`Running`} aria-label="Running"> |
|
|
|
<RunCircle/> |
|
|
|
<RunCircleOutlined/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
{Status.Cancelled === status(process) && <IconButton title={`Cancelled`} aria-label="Cancelled"> |
|
|
|
{Status.Cancelled === status(process) && <IconButton title={`Cancelled`} aria-label="Cancelled"> |
|
|
|
<StopCircle/> |
|
|
|
<StopCircleOutlined/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
{Status.Wait === status(process) && <IconButton title={`Wait`} aria-label="Wait"> |
|
|
|
{Status.Wait === status(process) && <IconButton title={`Wait`} aria-label="Wait"> |
|
|
|
<HourglassEmpty/> |
|
|
|
<HourglassEmptyOutlined/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
</TableCell> |
|
|
|
</TableCell> |
|
|
|
<TableCell> |
|
|
|
<TableCell> |
|
|
|
{canRepeat(process) && <IconButton onClick={() => openRepeatDialog(process)} title={`Repeat`} aria-label="Repeat"> |
|
|
|
{canRepeat(process) && <IconButton onClick={() => openRepeatDialog(process)} title={`Repeat`} aria-label="Repeat"> |
|
|
|
<Replay/> |
|
|
|
<ReplayOutlined/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
{canKill(process) && <IconButton title={`Kill`} aria-label="Kill"> |
|
|
|
{canKill(process) && <IconButton title={`Kill`} aria-label="Kill"> |
|
|
|
<DeleteForever/> |
|
|
|
<DeleteForeverOutlined/> |
|
|
|
|
|
|
|
</IconButton>} |
|
|
|
|
|
|
|
{process?.outputId && <IconButton title={`Output`} onClick={() => output(process)} aria-label="Output"> |
|
|
|
|
|
|
|
<FactCheckOutlined/> |
|
|
|
</IconButton>} |
|
|
|
</IconButton>} |
|
|
|
</TableCell> |
|
|
|
</TableCell> |
|
|
|
<TableCell title={new Date(process.createdAt).toLocaleString()}> |
|
|
|
<TableCell title={new Date(process.createdAt).toLocaleString()}> |
|
|
|