Grégoire Delattre 4b26080193
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Update redux state management
Use immer with native javascript objects instead of immutablejs.
2020-04-07 18:22:26 +02:00

115 lines
2.9 KiB
JavaScript

import React from "react";
import Loader from "../loader/loader";
import PropTypes from "prop-types";
// TODO: udpate this
import { OverlayTrigger, Tooltip } from "react-bootstrap";
const Modules = ({ isLoading, modules }) => {
if (isLoading) {
return <Loader />;
}
return (
<div className="row">
{Object.keys(modules).map((type) => (
<ModulesByVideoType key={type} type={type} modules={modules[type]} />
))}
</div>
);
};
Modules.propTypes = {
isLoading: PropTypes.bool.isRequired,
modules: PropTypes.object.isRequired,
};
export default Modules;
const capitalize = (string) => string.charAt(0).toUpperCase() + string.slice(1);
const ModulesByVideoType = ({ type, modules }) => (
<div className="col-12 col-md-6">
<div className="card mb-3">
<div className="card-header">
<h3>{`${capitalize(type)} modules`}</h3>
</div>
<div className="card-body">
{Object.keys(modules).map((moduleType, i) => (
<ModuleByType key={i} type={type} modules={modules[moduleType]} />
))}
</div>
</div>
</div>
);
ModulesByVideoType.propTypes = {
type: PropTypes.string.isRequired,
modules: PropTypes.object.isRequired,
};
const ModuleByType = ({ type, modules }) => (
<div>
<h4>{capitalize(type)}</h4>
<table className="table">
<tbody>
{modules.map((module, type) => {
return <Module key={type} type={type} module={module} />;
})}
</tbody>
</table>
</div>
);
ModuleByType.propTypes = {
type: PropTypes.string.isRequired,
modules: PropTypes.array.isRequired,
};
const Module = ({ module }) => {
let iconClass, prettyStatus, badgeClass;
switch (module.status) {
case "ok":
iconClass = "fa fa-check-circle";
badgeClass = "badge badge-pill badge-success";
prettyStatus = "OK";
break;
case "fail":
iconClass = "fa fa-times-circle";
badgeClass = "badge badge-pill badge-danger";
prettyStatus = "Fail";
break;
case "not_implemented":
iconClass = "fa fa-question-circle";
badgeClass = "badge badge-pill badge-default";
prettyStatus = "Not implemented";
break;
default:
iconClass = "fa fa-question-circle";
badgeClass = "badge badge-pill badge-warning";
prettyStatus = "Unknown";
}
const tooltip = (
<Tooltip id={`tooltip-status-${module.name}}`}>
<p>
<span className={badgeClass}>Status: {prettyStatus}</span>
</p>
{module.error !== "" && <p>Error: {module.error}</p>}
</Tooltip>
);
return (
<tr>
<th>{module.name}</th>
<td>
<OverlayTrigger placement="right" overlay={tooltip}>
<span className={badgeClass}>
<i className={iconClass}></i> {prettyStatus}
</span>
</OverlayTrigger>
</td>
</tr>
);
};
Module.propTypes = {
module: PropTypes.object.isRequired,
};