Project

General

Profile

Download (4.25 KB) Statistics
| Branch: | Tag: | Revision:
import PropTypes from 'prop-types';
import React, { useState } from 'react';
import { useSelector } from 'react-redux';
import {
Card,
CardTitle,
CardBody,
CardFooter,
Bullseye,
GridItem,
} from '@patternfly/react-core';

import StatusesModal from './StatusesModal';
import { foremanUrl } from '../../../common/helpers';
import { useAPI } from '../../../common/hooks/API/APIHooks';
import { STATUS } from '../../../constants';
import {
selectErrorStatuses,
selectWarningStatuses,
selectOKStatuses,
selectNAStatuses,
selectAllSortedStatuses,
} from './HostStatusSelector';
import GlobalState from './GlobalState';
import AggregateStatusItem from './AggregateStatusItem';
import { translate as __ } from '../../../common/I18n';
import StatusIcon from './StatusIcon';
import {
HOST_STATUSES_OPTIONS,
OK_STATUS_STATE,
WARNING_STATUS_STATE,
ERROR_STATUS_STATE,
NA_STATUS_STATE,
SUPPORTED_STATUSES,
} from './Constants';
import './styles.scss';

const AggregateStatusCard = ({
hostName,
hostDetails: {
permissions: {
view_hosts: canViewStatuses,
forget_status_hosts: canForgetStatuses,
} = {},
},
}) => {
const [openModal, setOpenModal] = useState(false);
const [chosenType, setChosenType] = useState();

const url = foremanUrl(`/hosts/${hostName}/statuses`);
const {
response: { global },
status: responseStatus,
} = useAPI('get', url, HOST_STATUSES_OPTIONS);

const okStatuses = useSelector(selectOKStatuses);
const warnStatus = useSelector(selectWarningStatuses);
const errorStatus = useSelector(selectErrorStatuses);
const naStatuses = useSelector(selectNAStatuses);
const allSortedStatuses = useSelector(selectAllSortedStatuses);

const statusesMapper = type => {
switch (type) {
case OK_STATUS_STATE:
return okStatuses;
case WARNING_STATUS_STATE:
return warnStatus;
case ERROR_STATUS_STATE:
return errorStatus;
case NA_STATUS_STATE:
return naStatuses;
default:
return allSortedStatuses;
}
};

const isOKState =
responseStatus === STATUS.RESOLVED &&
warnStatus.length === 0 &&
errorStatus.length === 0;

const hadleIconClick = type => {
setChosenType(type);
setOpenModal(true);
};

return (
<GridItem xl2={3} xl={4} md={6} lg={4}>
<Card className="card-pf-aggregate-status" isHoverable>
<CardTitle>
<span>
{__('Host Status')}
{!isOKState && <StatusIcon statusNumber={global} />}
</span>
</CardTitle>
<CardBody style={{ height: '129px' }}>
<GlobalState
cannotViewStatuses={!canViewStatuses}
isOKState={isOKState}
responseStatus={responseStatus}
>
<Bullseye>
<p className="card-pf-aggregate-status-notifications">
{SUPPORTED_STATUSES.map(({ label, status }) => (
<AggregateStatusItem
key={`status-${label}`}
label={label}
responseStatus={responseStatus}
status={status}
onClick={() => hadleIconClick(status)}
amount={statusesMapper(status).length}
/>
))}
</p>
</Bullseye>
</GlobalState>
</CardBody>
<CardFooter>
<a
onClick={() => {
setChosenType(undefined);
setOpenModal(true);
}}
>
{__('Manage all statuses')}
</a>
</CardFooter>
</Card>
<StatusesModal
canForgetStatuses={canForgetStatuses}
type={chosenType}
statuses={statusesMapper(chosenType)}
hostName={hostName}
isOpen={openModal}
onClose={() => {
setOpenModal(false);
}}
/>
</GridItem>
);
};

AggregateStatusCard.propTypes = {
hostName: PropTypes.string,
hostDetails: PropTypes.shape({
permissions: PropTypes.shape({
view_hosts: PropTypes.bool,
forget_status_hosts: PropTypes.bool,
}),
}),
};

AggregateStatusCard.defaultProps = {
hostName: undefined,
hostDetails: {
permissions: { statuses_hosts: false, forget_status_hosts: false },
},
};

export default AggregateStatusCard;
(1-1/11)