qualiteer/src/views/jobs/Jobs.jsx

98 lines
2.9 KiB
React
Raw Normal View History

2022-08-06 21:21:41 +00:00
import React, { useState, useContext, useEffect } from "react";
2022-08-05 13:03:48 +00:00
import { useLocation, useNavigate } from "react-router-dom";
2022-07-18 21:43:10 +00:00
2022-08-12 13:08:00 +00:00
import JobContext from "@qltr/jobs";
2022-07-18 21:43:10 +00:00
import JobBox from "./JobBox.jsx";
2022-08-09 14:07:53 +00:00
import JobPipelineBox from "./JobPipelineBox.jsx";
2022-07-18 21:43:10 +00:00
import JobView from "./JobView.jsx";
2022-08-09 14:07:53 +00:00
import JobPipelineDisplay from "./JobPipelineDisplay.jsx";
2022-08-01 14:58:11 +00:00
import JobBuilder from "./builder/JobBuilder.jsx";
2022-08-06 21:21:41 +00:00
import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box";
2022-07-18 21:43:10 +00:00
export default function Jobs() {
2022-08-05 13:03:48 +00:00
const { state: jobState } = useContext(JobContext);
2022-07-18 21:43:10 +00:00
const location = useLocation();
2022-08-05 13:03:48 +00:00
const navigate = useNavigate();
useEffect(() => {
const jobName = location.hash.slice(1);
2022-08-09 14:07:53 +00:00
const pipelineId = jobName.slice(1);
2022-08-09 17:59:36 +00:00
if (!jobName || !pipelineId) return;
const hasJob = jobState.pipelines.find((p) => p.id === pipelineId);
2022-08-09 15:19:09 +00:00
const hasPipeline = jobState.jobs.find((job) => job.name === jobName);
2022-08-09 17:59:36 +00:00
if (hasPipeline || hasJob) return;
if (jobName || pipelineId) navigate("/qualiteer/jobs");
2022-08-05 13:03:48 +00:00
});
2022-07-18 21:43:10 +00:00
return (
<div className="jobs">
2022-08-09 04:29:10 +00:00
{jobState.jobs.length === 0 ? (
<React.Fragment>
<Box
display="flex"
alignItems="center"
justifyContent="center"
sx={{ flexFlow: "wrap" }}
>
2022-08-12 20:10:57 +00:00
<Typography variant="h4">No jobs found!</Typography>
2022-08-09 04:29:10 +00:00
</Box>
<Box
display="flex"
alignItems="center"
justifyContent="center"
sx={{ flexFlow: "wrap" }}
>
<Typography variant="h5">
Click the '+' to start a new one!
</Typography>
</Box>
2022-08-06 21:21:41 +00:00
</React.Fragment>
2022-08-09 04:29:10 +00:00
) : null}
2022-08-12 20:10:57 +00:00
2022-08-01 14:58:11 +00:00
<JobBuilder />
2022-08-12 20:10:57 +00:00
2022-08-09 17:59:36 +00:00
{location.hash === "" && (
<React.Fragment>
{jobState.jobs
.filter((j) => !j.isPipeline)
.map((v, i) => (
<a
key={i}
href={`/qualiteer/jobs#${v.name}`}
style={{ textDecoration: "none" }}
>
<JobBox job={v} />
</a>
))}
{jobState.pipelines.map((p, i) => (
2022-08-09 04:29:10 +00:00
<a
key={i}
style={{ textDecoration: "none" }}
2022-08-09 17:59:36 +00:00
href={`/qualiteer/jobs#p${p.id}`}
2022-08-09 04:29:10 +00:00
>
2022-08-09 17:59:36 +00:00
<JobPipelineBox pipeline={p} />
</a>
))}
</React.Fragment>
2022-07-18 21:43:10 +00:00
)}
2022-08-09 17:59:36 +00:00
{location.hash[1] === "p"
? jobState.pipelines.find((p) => p.id === location.hash.slice(2)) && (
<JobPipelineDisplay
pipeline={jobState.pipelines.find(
(p) => p.id === location.hash.slice(2)
)}
/>
)
: jobState.jobs.find((job) => job.name === location.hash.slice(1)) && (
<JobView
job={jobState.jobs.find(
(job) => job.name === location.hash.slice(1)
)}
/>
)}
2022-07-18 21:43:10 +00:00
</div>
);
}