// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import * as React from "react"; import {useContext, useEffect, useState} from "react"; import Container from "@cloudscape-design/components/container"; import Header from "@cloudscape-design/components/header"; import {Box, Button, ContentLayout, Grid, Modal, SpaceBetween, TableProps} from "@cloudscape-design/components"; import {useNavigate, useParams} from "react-router-dom"; import {ApiResponseState, deleteItem, get} from "../../util/ApiClient"; import {JobDetails} from "./JobModel"; import {NotificationContext} from "../../contexts/NotificationContext"; import {delegatedAdminColumnsForJob} from "../delegated-admin/DelegatedAdminDefinitions"; import {ContainerAssessmentResultTable} from "../../util/AssessmentResultTable"; import {trustedAccessColumnsForJob} from "../trusted-access/TrustedAccessDefinitions"; import {apiPathJobs, taskFailureColumns} from "./JobsDefinitions"; import {resourceBasedPolicyColumnsForJob} from "../resource-based-policies/ResourceBasedPoliciesDefinitions"; export const JobPage = () => { const {assessmentType, id} = useParams(); let title = "Findings"; let columnDefinitions: TableProps.ColumnDefinition[] = []; switch (assessmentType) { case 'DELEGATED_ADMIN': { title = "Delegated Admin Accounts"; columnDefinitions = delegatedAdminColumnsForJob; break; } case 'TRUSTED_ACCESS': { title = "Trusted Access"; columnDefinitions = trustedAccessColumnsForJob; break; } case 'RESOURCE_BASED_POLICY': { title = "Resource-Based Policies"; columnDefinitions = resourceBasedPolicyColumnsForJob; break; } } const [apiData, setApiData] = useState>({ responseBody: null, error: null, loading: true }); const {setNotifications} = useContext(NotificationContext); const [modalVisible, setModalVisible] = useState(false); const [deleting, setDeleting] = useState(false); const navigate = useNavigate(); function loadJob() { get(`${apiPathJobs}/${assessmentType}/${id}`).then(async (result: ApiResponseState) => { setApiData(result); if (result.error) { setNotifications([{ header: result.error.Error, content: result.error.Message, type: 'error', dismissible: true, onDismiss: () => setNotifications([]) }]); } }); } useEffect(() => { setApiData({responseBody: null, error: null, loading: true}); loadJob(); }, []); function deleteJob() { setNotifications([]); setDeleting(true); setModalVisible(false); deleteItem(`${apiPathJobs}/${assessmentType}/${id}`).then((state) => { if (state.error) { setNotifications([{ header: 'Error', content: 'Job could not be deleted', type: 'error', dismissible: true, onDismiss: () => setNotifications([]) }]); setDeleting(false); } else { setNotifications([{ header: 'Job deleted', content: `Job with JobId ${id} was deleted successfully.`, }]); navigate('/jobs'); setDeleting(false); } } ); } const job = apiData.responseBody?.Job; return ( } > Job {job?.JobId} } > } header="Delete Job"> Do you want to delete this job and all associated findings? Job Details } >{job &&
Status
{job.JobStatus}
Assessment Type
{job.AssessmentType}
Started By
{job.StartedBy}
Started At
{job.StartedAt}
Finished At
{job.FinishedAt}
}
} data={apiData?.responseBody?.Findings || []} loading={apiData.loading} columnDefinitions={columnDefinitions} >
{(apiData?.responseBody?.TaskFailures?.length) ?
} data={apiData?.responseBody?.TaskFailures || []} loading={apiData.loading} columnDefinitions={taskFailureColumns} >
: <>}
); }