import React, { useState, useContext } from "react"; import { useNavigate } from "react-router-dom"; import { usePipelineMappings } from "../../Queries.jsx"; import StoreContext from "../../ctx/StoreContext.jsx"; import JobContext, { jobStatus } from "../../ctx/JobContext.jsx"; import Accordion from "@mui/material/Accordion"; import AccordionDetails from "@mui/material/AccordionDetails"; import AccordionSummary from "@mui/material/AccordionSummary"; import Typography from "@mui/material/Typography"; import Button from "@mui/material/Button"; import Dialog from "@mui/material/Dialog"; import DialogActions from "@mui/material/DialogActions"; import DialogContent from "@mui/material/DialogContent"; import DialogContentText from "@mui/material/DialogContentText"; import DialogTitle from "@mui/material/DialogTitle"; import IconButton from "@mui/material/IconButton"; import DeleteIcon from "@mui/icons-material/Delete"; import NotificationsIcon from "@mui/icons-material/Notifications"; import ReplayIcon from "@mui/icons-material/Replay"; import PhotoCameraIcon from "@mui/icons-material/PhotoCamera"; import CheckIcon from "@mui/icons-material/Check"; import ClearIcon from "@mui/icons-material/Clear"; import ViewColumnIcon from "@mui/icons-material/ViewColumn"; import PendingIcon from "@mui/icons-material/Pending"; import VisibilityIcon from "@mui/icons-material/Visibility"; import DoNotDisturbIcon from "@mui/icons-material/DoNotDisturb"; import Badge from "@mui/material/Badge"; import Stack from "@mui/material/Stack"; import Box from "@mui/material/Box"; import { selectBranch, asTree, asBranches, as1d, } from "../../../lib/jobs/pipelines.js"; const stopPropagation = (e) => e.stopPropagation() && e.preventDefault(); export default function FailingBox(props) { const { failingTest, silenceClick } = props; const { class: testClass, name: testName, timestamp, silencedUntil, type, dailyFails, screenshot: screenshotUrl, recentResults, failedMessage, isPipeline, jobStatus: testJobStatus, job, pipeline, } = failingTest; const navigate = useNavigate(); const { data: pipelineMappings, isLoading } = usePipelineMappings(); const { jobFactory } = useContext(JobContext); const { state: store, updateStore, removeFailure } = useContext(StoreContext); const [open, setOpen] = useState(false); const toggleOpen = () => setOpen(!open); const [removeOpen, setRemoveOpen] = useState(false); const removeClick = () => setRemoveOpen(!removeOpen); const handleRemoveClose = (confirmed) => (e) => { stopPropagation(e); setRemoveOpen(false); if (!confirmed) return; removeFailure(failingTest); }; function badgeColor() { if (dailyFails === 1) return "primary"; else if (dailyFails === 2) return "secondary"; else if (dailyFails < 6) return "warning"; return "error"; } const retryPipelineTest = () => { const primaries = pipelineMappings.filter((m) => m.includes(testName)); const builderCache = { branches: asBranches(primaries), tree: asTree(primaries), selectedBranches: as1d(primaries), isTriage: true, }; const pipeline = jobFactory(builderCache); if (store.focusJob) navigate(`/qualiteer/jobs#p${pipeline.id}`); }; const retryTest = () => { if (isPipeline) return retryPipelineTest(); const jobId = jobFactory({ testNames: [testName], isTriage: true }); if (store.focusJob) navigate(`/qualiteer/jobs#${jobId}`); }; const navigateToJob = () => { if (pipeline) return navigate(`/qualiteer/jobs#p${pipeline.id}`); navigate(`/qualiteer/jobs#${job.jobId}`); }; const jobOnClick = () => { if (pipeline) return navigateToJob; if (!job) return retryTest; switch (job.status) { case jobStatus.OK: return navigateToJob; case jobStatus.ERROR: return retryTest; case jobStatus.PENDING: return navigateToJob; case jobStatus.ACTIVE: return navigateToJob; case jobStatus.CANCELED: return navigateToJob; case jobStatus.QUEUED: return navigateToJob; default: return retryTest; } }; function jobIcon() { if (pipeline && pipeline.isCanceled) return ; if (pipeline) return ; if (!job) return ; switch (job.status) { case jobStatus.OK: return ; case jobStatus.ERROR: return ; case jobStatus.PENDING: return ; case jobStatus.ACTIVE: return ; case jobStatus.CANCELED: return ; case jobStatus.QUEUED: return ; default: return ; } } function Actions() { return ( {jobIcon()} ); } return ( Remove failure? This will remove 1 test from the database {`${testClass}#`} {testName}{" "}
{recentResults.map( (v, i) => (v && ) || ( ) )} {isPipeline && }
{failedMessage}
); }