import React, { useState, useEffect } from 'react';
import {
TextField,
Link,
Button,
CircularProgress,
Select,
MenuList,
MenuItem,
FormControl,
InputLabel,
Autocomplete,
Tooltip,
Typography,
} from '@mui/material';
import { toast } from "react-toastify"
import { makeStyles } from "@mui/styles";
import theme from '../theme.jsx';
import dayjs from 'dayjs';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'
import Pagination from '@mui/material/Pagination';
import { triggers as alltriggers } from "../views/AngularWorkflow.jsx"
import {
DatePicker,
DateTimePicker,
LocalizationProvider,
} from '@mui/x-date-pickers'
import {
OpenInNew as OpenInNewIcon,
PlayArrow as PlayArrowIcon,
} from '@mui/icons-material';
import { DataGrid, GridColDef, GridValueGetterParams } from '@mui/x-data-grid'
const useStyles = makeStyles({
notchedOutline: {
borderColor: "#f85a3e !important",
},
});
const RuntimeDebugger = (props) => {
const { userdata, globalUrl, } = props
const classes = useStyles();
const [workflowId, setWorkflowId] = useState("")
const [status, setStatus] = useState("")
const [endTime, setEndTime] = useState("")
const [startTime, setStartTime] = useState("")
const [workflow, setWorkflow] = useState({})
const [searchLoading, setSearchLoading] = useState(false)
const [rowCursor, setCursor] = useState("")
const [rowsPerPage, setRowsPerPage] = useState(10)
const [resultRows, setResultRows] = useState([])
const [workflows, setWorkflows] = useState([
{"id": "", "name": "All Workflows",}
])
/*
[
{id: "1", execution_id: "1", status: "FINISHED", startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}},
{id: "2", execution_id: "2", status: "WAITING", startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}},
{id: "3", execution_id: "3", status: "EXECUTING",startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}},
{id: "4", execution_id: "4", status: "ABORTED", startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}},
]);
*/
const submitSearch = (workflowId, status, startTime, endTime, cursor, limit) => {
//setResultRows([])
setSearchLoading(true)
const fetchData = {
workflow_id: workflowId,
cursor: cursor,
limit: limit,
status: status.toUpperCase(),
start_time: startTime,
end_time: endTime,
}
fetch(`${globalUrl}/api/v1/workflows/search`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
credentials: "include",
body: JSON.stringify(fetchData),
})
.then((response) => response.json())
.then((data) => {
setSearchLoading(false)
if (data.success) {
if (data.runs !== undefined && data.runs !== null && data.runs.length > 0) {
for (let key in data.runs) {
data.runs[key].id = data.runs[key].execution_id
// make started_at field into ISO string
//data.runs[key].endTimestamp = data.runs[key].ended_at.toISOString().slice(0, 19).replace('T', ' ')
const startTimestamp = new Date(data.runs[key].started_at*1000)
data.runs[key].startTimestamp = startTimestamp.toISOString().slice(0, 19).replace('T', ' ')
const endTimestamp = new Date(data.runs[key].completed_at*1000)
data.runs[key].endTimestamp = endTimestamp.toISOString().slice(0, 19).replace('T', ' ')
if (data.runs[key].completed_at === 0 || data.runs[key].completed_at === null) {
data.runs[key].endTimestamp = ""
}
}
// Add 20 empty rows to the end of the resultRows array
// This is to make sure that the scrollbar is always visible
setResultRows(data.runs)
} else {
toast("No results found. Keeping old runs")
}
} else {
toast("Failed to search for runs. Please try again.")
}
})
.catch((error) => {
setSearchLoading(false)
console.error("Error:", error);
toast("Failed to search for runs. Please try again (2)")
})
}
const getAvailableWorkflows = () => {
fetch(globalUrl + "/api/v1/workflows", {
method: "GET",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
credentials: "include",
})
.then((response) => {
if (response.status !== 200) {
console.log("Status not 200 for workflows :O!");
return;
}
return response.json();
})
.then((responseJson) => {
if (responseJson !== undefined) {
var foundWorkflows = [{"id": "", "name": "All Workflows",}]
foundWorkflows.push(...responseJson)
setWorkflows(foundWorkflows)
}
})
.catch((error) => {
console.log("Error getting workflows: " + error);
})
}
useEffect(() => {
getAvailableWorkflows()
// Find workflow_id in url query
const urlParams = new URLSearchParams(window.location.search);
const workflowId = urlParams.get('workflow_id');
if (workflowId !== undefined && workflowId !== null && workflowId !== "" && workflowId.length === 36) {
setWorkflowId(workflowId)
// find the workflow in workflows and select it
for (let key in workflows) {
if (workflows[key].id === workflowId) {
setWorkflow(workflows[key])
break
}
}
}
const foundStatus = urlParams.get('status');
if (foundStatus !== undefined && foundStatus !== null && foundStatus !== "") {
setStatus(foundStatus)
}
}, [])
const imageSize = 30
const timenowUnix = Math.floor(Date.now() / 1000)
const columns: GridColDef[] = [
{
field: 'execution_source',
headerName: 'Source',
width: 75,
renderCell: (params) => {
var foundSource =
} else if (source === "webhook") {
foundSource =
} else if (source === "subflow" || source.length === 36) {
foundSource =
source = "subflow"
} else {
source = "manual"
}
return (
{
//setStatus(params.row.status)
}}>