forked from p15670423/monkey
Fixed all small UI comments
This commit is contained in:
parent
f26ab7f62d
commit
db58bf9a87
|
@ -13,10 +13,10 @@ import PassTheHashMapPageComponent from "./PassTheHashMapPage";
|
||||||
import StrongUsers from "components/report-components/security/StrongUsers";
|
import StrongUsers from "components/report-components/security/StrongUsers";
|
||||||
import AttackReport from "components/report-components/security/AttackReport";
|
import AttackReport from "components/report-components/security/AttackReport";
|
||||||
import ReportHeader, {ReportTypes} from "../report-components/common/ReportHeader";
|
import ReportHeader, {ReportTypes} from "../report-components/common/ReportHeader";
|
||||||
import {MonkeysStillAliveWarning} from "../report-components/common/MonkeysStillAliveWarning";
|
import MonkeysStillAliveWarning from "../report-components/common/MonkeysStillAliveWarning";
|
||||||
import ReportLoader from "../report-components/common/ReportLoader";
|
import ReportLoader from "../report-components/common/ReportLoader";
|
||||||
import MustRunMonkeyWarning from "../report-components/common/MustRunMonkeyWarning";
|
import MustRunMonkeyWarning from "../report-components/common/MustRunMonkeyWarning";
|
||||||
import {SecurityIssuesGlance} from "../report-components/common/SecurityIssuesGlance";
|
import SecurityIssuesGlance from "../report-components/common/SecurityIssuesGlance";
|
||||||
import PrintReportButton from "../report-components/common/PrintReportButton";
|
import PrintReportButton from "../report-components/common/PrintReportButton";
|
||||||
import {extractExecutionStatusFromServerResponse} from "../report-components/common/ExecutionStatus";
|
import {extractExecutionStatusFromServerResponse} from "../report-components/common/ExecutionStatus";
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,11 @@ import ReportHeader, {ReportTypes} from "../report-components/common/ReportHeade
|
||||||
import PillarsOverview from "../report-components/zerotrust/PillarOverview";
|
import PillarsOverview from "../report-components/zerotrust/PillarOverview";
|
||||||
import FindingsTable from "../report-components/zerotrust/FindingsTable";
|
import FindingsTable from "../report-components/zerotrust/FindingsTable";
|
||||||
import {SinglePillarDirectivesStatus} from "../report-components/zerotrust/SinglePillarDirectivesStatus";
|
import {SinglePillarDirectivesStatus} from "../report-components/zerotrust/SinglePillarDirectivesStatus";
|
||||||
import {MonkeysStillAliveWarning} from "../report-components/common/MonkeysStillAliveWarning";
|
import MonkeysStillAliveWarning from "../report-components/common/MonkeysStillAliveWarning";
|
||||||
import ReportLoader from "../report-components/common/ReportLoader";
|
import ReportLoader from "../report-components/common/ReportLoader";
|
||||||
import MustRunMonkeyWarning from "../report-components/common/MustRunMonkeyWarning";
|
import MustRunMonkeyWarning from "../report-components/common/MustRunMonkeyWarning";
|
||||||
import {SecurityIssuesGlance} from "../report-components/common/SecurityIssuesGlance";
|
import SecurityIssuesGlance from "../report-components/common/SecurityIssuesGlance";
|
||||||
import {StatusesToPillarsSummary} from "../report-components/zerotrust/StatusesToPillarsSummary";
|
import StatusesToPillarsSummary from "../report-components/zerotrust/StatusesToPillarsSummary";
|
||||||
import PrintReportButton from "../report-components/common/PrintReportButton";
|
import PrintReportButton from "../report-components/common/PrintReportButton";
|
||||||
import {extractExecutionStatusFromServerResponse} from "../report-components/common/ExecutionStatus";
|
import {extractExecutionStatusFromServerResponse} from "../report-components/common/ExecutionStatus";
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import * as PropTypes from "prop-types";
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
export class MonkeysStillAliveWarning extends Component {
|
export default class MonkeysStillAliveWarning extends Component {
|
||||||
render() {
|
render() {
|
||||||
return <div>
|
return <div>
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import ReactTable from "react-table";
|
import ReactTable from "react-table";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
class PaginatedTable extends Component {
|
class PaginatedTable extends Component {
|
||||||
render() {
|
render() {
|
||||||
|
@ -27,3 +28,9 @@ class PaginatedTable extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default PaginatedTable;
|
export default PaginatedTable;
|
||||||
|
|
||||||
|
PaginatedTable.propTypes = {
|
||||||
|
data: PropTypes.array,
|
||||||
|
columns: PropTypes.array,
|
||||||
|
pageSize: PropTypes.number,
|
||||||
|
};
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import {Col} from "react-bootstrap";
|
import {Col} from "react-bootstrap";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
let monkeyLogoImage = require('../../../images/monkey-icon.svg');
|
let monkeyLogoImage = require('../../../images/monkey-icon.svg');
|
||||||
|
|
||||||
|
@ -38,3 +39,7 @@ export class ReportHeader extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ReportHeader;
|
export default ReportHeader;
|
||||||
|
|
||||||
|
ReportHeader.propTypes = {
|
||||||
|
report_type: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import {css} from "@emotion/core";
|
import {css} from "@emotion/core";
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import {GridLoader} from "react-spinners";
|
import {GridLoader} from "react-spinners";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
const loading_css_override = css`
|
const loading_css_override = css`
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -23,3 +24,5 @@ export default class ReportLoader extends Component {
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReportLoader.propTypes = {loading: PropTypes.bool};
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import React, {Component, Fragment} from "react";
|
import React, {Component, Fragment} from "react";
|
||||||
import * as PropTypes from "prop-types";
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
export class SecurityIssuesGlance extends Component {
|
export default class SecurityIssuesGlance extends Component {
|
||||||
render() {
|
render() {
|
||||||
return <Fragment>
|
return <Fragment>
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,8 +2,8 @@ import React, {Fragment} from "react";
|
||||||
import PaginatedTable from "../common/PaginatedTable";
|
import PaginatedTable from "../common/PaginatedTable";
|
||||||
import AuthComponent from "../../AuthComponent";
|
import AuthComponent from "../../AuthComponent";
|
||||||
import 'styles/ZeroTrustPillars.css'
|
import 'styles/ZeroTrustPillars.css'
|
||||||
import {StatusLabel} from "./StatusLabel";
|
import StatusLabel from "./StatusLabel";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
|
@ -37,15 +37,15 @@ class TestsStatus extends AuthComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
{this.getTestsOfStatusIfAny(conclusiveStatus)}
|
{this.getFilteredTestsByStatusIfAny(conclusiveStatus)}
|
||||||
{this.getTestsOfStatusIfAny(inconclusiveStatus)}
|
{this.getFilteredTestsByStatusIfAny(inconclusiveStatus)}
|
||||||
{this.getTestsOfStatusIfAny(positiveStatus)}
|
{this.getFilteredTestsByStatusIfAny(positiveStatus)}
|
||||||
{this.getTestsOfStatusIfAny(unexecutedStatus)}
|
{this.getFilteredTestsByStatusIfAny(unexecutedStatus)}
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
getTestsOfStatusIfAny(statusToFilter) {
|
getFilteredTestsByStatusIfAny(statusToFilter) {
|
||||||
const filteredTests = this.props.tests.filter((test) => {
|
const filteredTests = this.props.tests.filter((test) => {
|
||||||
return (test.status === statusToFilter);
|
return (test.status === statusToFilter);
|
||||||
}
|
}
|
||||||
|
@ -71,3 +71,5 @@ export class DirectivesStatusTable extends AuthComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default DirectivesStatusTable;
|
export default DirectivesStatusTable;
|
||||||
|
|
||||||
|
DirectivesStatusTable.propTypes = {directivesStatus: PropTypes.array};
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
import React, {Component} from "react";
|
||||||
|
import EventsModal from "./EventsModal";
|
||||||
|
import {Button} from "react-bootstrap";
|
||||||
|
import FileSaver from "file-saver";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
|
export default class EventsAndButtonComponent extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
isShow: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hide = () => {
|
||||||
|
this.setState({isShow: false});
|
||||||
|
};
|
||||||
|
|
||||||
|
show = () => {
|
||||||
|
this.setState({isShow: true});
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<EventsModal events={this.props.events} showEvents={this.state.isShow} hideCallback={this.hide}/>
|
||||||
|
<p style={{margin: '1px'}}>
|
||||||
|
<Button className="btn btn-info btn-lg center-block"
|
||||||
|
onClick={this.show}>
|
||||||
|
Show Events
|
||||||
|
</Button>
|
||||||
|
<Button className="btn btn-primary btn-lg center-block"
|
||||||
|
onClick={() => {
|
||||||
|
const content = JSON.stringify(this.props.events, null, 2);
|
||||||
|
const blob = new Blob([content], {type: "text/plain;charset=utf-8"});
|
||||||
|
FileSaver.saveAs(blob, this.props.exportFilename + ".json");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Export Events
|
||||||
|
</Button>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
EventsAndButtonComponent.propTypes = {
|
||||||
|
events: PropTypes.array,
|
||||||
|
exportFilename: PropTypes.string,
|
||||||
|
};
|
|
@ -1,8 +1,9 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import {Modal} from "react-bootstrap";
|
import {Modal} from "react-bootstrap";
|
||||||
import {EventsTimeline} from "./EventsTimeline";
|
import EventsTimeline from "./EventsTimeline";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
export class EventsModal extends Component {
|
export default class EventsModal extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
}
|
}
|
||||||
|
@ -30,3 +31,9 @@ export class EventsModal extends Component {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventsModal.propTypes = {
|
||||||
|
showEvents: PropTypes.bool,
|
||||||
|
events: PropTypes.array,
|
||||||
|
hideCallback: PropTypes.func,
|
||||||
|
};
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import {Timeline, TimelineEvent} from "react-event-timeline";
|
import {Timeline, TimelineEvent} from "react-event-timeline";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
const eventTypeToIcon = {
|
const eventTypeToIcon = {
|
||||||
"monkey_local": "fa fa-exclamation-circle fa-2x icon-warning",
|
"monkey_local": "fa fa-exclamation-circle fa-2x icon-warning",
|
||||||
|
@ -8,13 +9,13 @@ const eventTypeToIcon = {
|
||||||
null: "fa fa-question-circle fa-2x icon-info",
|
null: "fa fa-question-circle fa-2x icon-info",
|
||||||
};
|
};
|
||||||
|
|
||||||
export class EventsTimeline extends Component {
|
export default class EventsTimeline extends Component {
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Timeline>
|
<Timeline>
|
||||||
{
|
{
|
||||||
this.props["events"].map(event => {
|
this.props.events.map(event => {
|
||||||
const event_time = new Date(event.timestamp['$date']).toString();
|
const event_time = new Date(event.timestamp['$date']).toString();
|
||||||
return (<TimelineEvent
|
return (<TimelineEvent
|
||||||
key={event.timestamp['$date']}
|
key={event.timestamp['$date']}
|
||||||
|
@ -30,3 +31,5 @@ export class EventsTimeline extends Component {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventsTimeline.propTypes = {events: PropTypes.array};
|
||||||
|
|
|
@ -1,52 +1,9 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import {Button} from "react-bootstrap";
|
import PillarLabel from "./PillarLabel";
|
||||||
import {EventsModal} from "./EventsModal";
|
|
||||||
import FileSaver from "file-saver";
|
|
||||||
import {PillarLabel} from "./PillarLabel";
|
|
||||||
import PaginatedTable from "../common/PaginatedTable";
|
import PaginatedTable from "../common/PaginatedTable";
|
||||||
|
import EventsAndButtonComponent from "./EventsAndButtonComponent";
|
||||||
|
|
||||||
|
|
||||||
class EventsAndButtonComponent extends Component {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
show: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hide = () => {
|
|
||||||
this.setState({show: false});
|
|
||||||
};
|
|
||||||
|
|
||||||
show = () => {
|
|
||||||
this.setState({show: true});
|
|
||||||
};
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<EventsModal events={this.props.events} showEvents={this.state.show} hideCallback={this.hide}/>
|
|
||||||
<p style={{margin: '1px'}}>
|
|
||||||
<Button className="btn btn-info btn-lg center-block"
|
|
||||||
onClick={this.show}>
|
|
||||||
Show Events
|
|
||||||
</Button>
|
|
||||||
<Button className="btn btn-primary btn-lg center-block"
|
|
||||||
onClick={() => {
|
|
||||||
const content = JSON.stringify(this.props.events, null, 2);
|
|
||||||
const blob = new Blob([content], {type: "text/plain;charset=utf-8"});
|
|
||||||
FileSaver.saveAs(blob, this.props.exportFilename+".json");
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Export Events
|
|
||||||
</Button>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
Header: 'Findings',
|
Header: 'Findings',
|
||||||
|
@ -82,7 +39,7 @@ class FindingsTable extends Component {
|
||||||
return newFinding;
|
return newFinding;
|
||||||
});
|
});
|
||||||
return (
|
return (
|
||||||
<PaginatedTable data={this.props.findings} pageSize={10} columns={columns}/>
|
<PaginatedTable data={data} pageSize={10} columns={columns}/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,8 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import 'styles/ZeroTrustPillars.css'
|
import 'styles/ZeroTrustPillars.css'
|
||||||
import {statusToLabelType} from "./StatusLabel";
|
import {statusToLabelType} from "./StatusLabel";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
export class PillarLabel extends Component {
|
|
||||||
pillar;
|
|
||||||
status;
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const pillarToIcon = {
|
const pillarToIcon = {
|
||||||
"Data": "fa fa-database",
|
"Data": "fa fa-database",
|
||||||
"People": "fa fa-user",
|
"People": "fa fa-user",
|
||||||
|
@ -17,7 +13,14 @@ export class PillarLabel extends Component {
|
||||||
"Automation & Orchestration": "fa fa-cogs",
|
"Automation & Orchestration": "fa fa-cogs",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default class PillarLabel extends Component {
|
||||||
|
render() {
|
||||||
const className = "label " + statusToLabelType[this.props.status];
|
const className = "label " + statusToLabelType[this.props.status];
|
||||||
return <div className={className} style={{margin: '2px', display: 'inline-block'}}><i className={pillarToIcon[this.props.pillar]}/> {this.props.pillar}</div>
|
return <div className={className} style={{margin: '2px', display: 'inline-block'}}><i className={pillarToIcon[this.props.pillar]}/> {this.props.pillar}</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PillarLabel.propTypes = {
|
||||||
|
status: PropTypes.string,
|
||||||
|
pillar: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import React, {Component} from "react";
|
import React, {Component} from "react";
|
||||||
import {PillarLabel} from "./PillarLabel";
|
import PillarLabel from "./PillarLabel";
|
||||||
import PaginatedTable from "../common/PaginatedTable";
|
import PaginatedTable from "../common/PaginatedTable";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
|
@ -18,9 +19,6 @@ const columns = [
|
||||||
];
|
];
|
||||||
|
|
||||||
class PillarOverview extends Component {
|
class PillarOverview extends Component {
|
||||||
pillarsToStatuses;
|
|
||||||
grades;
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const data = this.props.grades.map((grade) => {
|
const data = this.props.grades.map((grade) => {
|
||||||
const newGrade = grade;
|
const newGrade = grade;
|
||||||
|
@ -34,3 +32,8 @@ class PillarOverview extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default PillarOverview;
|
export default PillarOverview;
|
||||||
|
|
||||||
|
PillarOverview.propTypes = {
|
||||||
|
grades: PropTypes.array,
|
||||||
|
status: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
import AuthComponent from "../../AuthComponent";
|
import AuthComponent from "../../AuthComponent";
|
||||||
import {PillarLabel} from "./PillarLabel";
|
import PillarLabel from "./PillarLabel";
|
||||||
import DirectivesStatusTable from "./DirectivesStatusTable";
|
import DirectivesStatusTable from "./DirectivesStatusTable";
|
||||||
import React, {Fragment} from "react";
|
import React, {Fragment} from "react";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
export class SinglePillarDirectivesStatus extends AuthComponent {
|
export class SinglePillarDirectivesStatus extends AuthComponent {
|
||||||
directivesStatus;
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
if (this.props.directivesStatus.length === 0) {
|
if (this.props.directivesStatus.length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -20,3 +19,8 @@ export class SinglePillarDirectivesStatus extends AuthComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SinglePillarDirectivesStatus.propTypes = {
|
||||||
|
directivesStatus: PropTypes.array,
|
||||||
|
pillar: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import React, {Component, Fragment} from "react";
|
import React, {Component} from "react";
|
||||||
import * as PropTypes from "prop-types";
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
const statusToIcon = {
|
const statusToIcon = {
|
||||||
|
@ -15,7 +15,7 @@ export const statusToLabelType = {
|
||||||
"Unexecuted": "label-default",
|
"Unexecuted": "label-default",
|
||||||
};
|
};
|
||||||
|
|
||||||
export class StatusLabel extends Component {
|
export default class StatusLabel extends Component {
|
||||||
render() {
|
render() {
|
||||||
let text = "";
|
let text = "";
|
||||||
if (this.props.showText) {
|
if (this.props.showText) {
|
||||||
|
@ -28,4 +28,8 @@ export class StatusLabel extends Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusLabel.propTypes = {status: PropTypes.string, showText: PropTypes.bool};
|
StatusLabel.propTypes = {
|
||||||
|
status: PropTypes.string,
|
||||||
|
showText: PropTypes.bool,
|
||||||
|
size: PropTypes.string
|
||||||
|
};
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import React, {Component, Fragment} from "react";
|
import React, {Component, Fragment} from "react";
|
||||||
import {PillarLabel} from "./PillarLabel";
|
import PillarLabel from "./PillarLabel";
|
||||||
import {StatusLabel} from "./StatusLabel";
|
import StatusLabel from "./StatusLabel";
|
||||||
|
import * as PropTypes from "prop-types";
|
||||||
|
|
||||||
export class StatusesToPillarsSummary extends Component {
|
export default class StatusesToPillarsSummary extends Component {
|
||||||
render() {
|
render() {
|
||||||
return (<div id="piilar-summary">
|
return (<div id="piilar-summary">
|
||||||
{this.getStatusSummary("Conclusive")}
|
{this.getStatusSummary("Conclusive")}
|
||||||
|
@ -29,3 +30,7 @@ export class StatusesToPillarsSummary extends Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StatusesToPillarsSummary.propTypes = {
|
||||||
|
statusesToPillars: PropTypes.array
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue