// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 import React, {FunctionComponent, useEffect, useState} from 'react'; import {Container, Button, ExpandableSection, StatusIndicator, Text} from "aws-northstar"; import Stack from "aws-northstar/layouts/Stack"; import '../home/styles.css'; import Grid from "aws-northstar/esm/layouts/Grid"; import { executeRunbook, getExecutionDetails, } from "../../data"; import Flashbar, {FlashbarMessage} from "aws-northstar/components/Flashbar"; import Alert from "aws-northstar/components/Alert"; import {IExecution, IExecutionDetail, IExecutionStepDetail} from "../../interfaces"; import Table, {Column} from "aws-northstar/components/Table"; import {useDispatch, useSelector} from "react-redux"; import {useHistory} from "react-router-dom"; import {ReduxRoot} from "../../interfaces"; const ExecutionView: FunctionComponent = () => { const executionId = useSelector( (state:ReduxRoot) => { return state.approtationReducerState.executionId }); const columnDefinitions: Column[]= [ { id: 'step_number', width: 100, Header: 'Step #', accessor: 'step_number' }, { id: 'step_name', width: 300, Header: 'Step Name', accessor: 'step_name' }, { id: 'action', width: 200, Header: 'Action', accessor: 'action' }, { id: 'step_status', width: 200, Header: 'Status', Cell: ({ row }: any) => { if (row && row.original) { const status = row.original.step_status; switch(status) { case 'Success': return Success; case 'Failed': return Failed; default: return {row.original.step_status}; } } return row.automation_execution_status; } }, { id: 'execution_start_time', width: 300, Header: 'Start Time', accessor: 'execution_start_time' }, { id: 'execution_end_time', width: 300, Header: 'End Time', accessor: 'execution_end_time' }, ]; const dispatch = useDispatch(); const history = useHistory(); const onOpenExecutionView = () => { history.push("/Runbook-Execution-Detail"); } const [executionDetail, setExecutionDetail] = React.useState({}); const [executionSteps, setExecutionSteps] = React.useState([]); const [selectedExecutionStepNumber, setSelectedExecutionStepNumber] = React.useState(0); const [selectedExecutionStep, setSelectedExecutionStep] = React.useState({}); const [loading, setLoading] = useState(false); const [errors, setErrors] = React.useState([]); const [message, setMessage] = React.useState(""); const renderMessage = () => { return (message == ""?
: setMessage("")} > {message} ); } const getExecution = async () => { await getExecutionDetails(executionId).then( (result: IExecutionDetail) => { console.log("Received Result in Execution Detail:" + JSON.stringify(result)) setExecutionDetail(result) setExecutionSteps(result.steps?result.steps:[]) if (selectedExecutionStepNumber > 0) { setSelectedExecutionStep(executionSteps[selectedExecutionStepNumber]) } }); } useEffect( () => { getExecution().then(() => console.log("getExecutionDetails() completed.")); const interval = setInterval(() => { getExecution().then(() => console.log("getExecutionDetails() completed.")); if (selectedExecutionStepNumber > 0) { setSelectedExecutionStep(executionSteps[selectedExecutionStepNumber]) } }, 5000); return () => clearInterval(interval); }, []); const handleSelectionChange = (items: IExecutionStepDetail[]) => { if (items.length === 1) { const step_number: number = Number(items[0].step_number?items[0].step_number:0) setSelectedExecutionStepNumber(step_number) setSelectedExecutionStep(items[0]) } }; function renderValues(sampleJSON: any) { return (
{Object.keys(sampleJSON).map((key, i) => (

{key}{sampleJSON[key]}

))}
); } const renderInput = (value:any) => { return Object.entries(JSON.parse(value)).map((step) => { return (
{step[0]} : {step[1]}
); }); } const renderLog = (value:any) => { value = value!=""?value.slice(1, -1):"" const lines = value.split("\\n") return lines.map((line:any) => { return (
{line.replace("\\n", "")}
); }); } // const render_input = () => { // let entries = Object.entries(selectedExecutionStep.input_payload?selectedExecutionStep.input_payload:{}) // for (var value in mapObject) { // return (
{value}
) // } // } // function render_value(value: string) { // let response = "" // response = "
" // const new_value = value.slice(1, -1) // response = response // const key_value_pairs = new_value.split(","); // for (const key_value_pair of key_value_pairs) { // const key_value_array = key_value_pair.split(":"); // const key = key_value_array[0].slice(1, -1) // const value = key_value_array[1].slice(1, -1) // response = response + key + ": " + value +"
" // } // response = response + "
" // return response // } // // const renderSteps = (value: string) => { // let response = "" // response = "
" // const new_value = value.slice(1, -1) // response = response // const key_value_pairs = new_value.split(","); // for (const key_value_pair of key_value_pairs) { // const key_value_array = key_value_pair.split(":"); // const key = key_value_array[0].slice(1, -1) // const value = key_value_array[1].slice(1, -1) // response = response + key + ": " + value +"
" // } // response = response + "
" // return response // } // const renderMap = (values: any) => { // const values_map = Object.entries(values) // return values_map.map(() => { // return (
); // }); // } // // const renderSteps = () => { // } // function formatString(value: any) { return value.replace('\\n', '
') } const tableActions = (
); return (
{return originalRow.step_execution_id?originalRow.step_execution_id:""}} selectedRowIds={[selectedExecutionStep.step_execution_id?selectedExecutionStep.step_execution_id:""]} />
Input
{selectedExecutionStep.input_payload?renderInput(selectedExecutionStep.input_payload?selectedExecutionStep.input_payload:{}):""}
Output
{selectedExecutionStep.output_payload?renderInput(selectedExecutionStep.output_payload?selectedExecutionStep.output_payload:{}):""}
Execution Log
{selectedExecutionStep.execution_log?renderLog(selectedExecutionStep.execution_log?selectedExecutionStep.execution_log:""):""}
); // const renderSteps = () => { // return executionSteps.map((step) => { // return ( // //
Step Number
//
// //
Step Name
//
// //
Action
//
// //
Step Status
//
// //
Start Time
//
// //
End Time
//
//
// ); // }); // } // // return ( // //
//
//
//
// // // // // //
// Execution Details //
//
// // // //
// // // // // //
// // // //
Step Number
//
// //
Step Name
//
// //
Action
//
// //
Step Status
//
// //
Start Time
//
// //
End Time
//
//
// // {renderSteps} // //
// //
//
// // // // //
//
// //
//
// //
//
// //
// //
//
//
//
// {renderMessage()} //
// ); } export default ExecutionView;