import React, { useState } from 'react';
import { useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import { STATUS } from 'foremanReact/constants';
import { selectAPIStatus } from 'foremanReact/redux/API/APISelectors';
import {
Button,
Card,
CardHeader,
CardTitle,
CardBody,
DescriptionList,
DescriptionListGroup,
DescriptionListDescription as Dd,
DescriptionListTerm as Dt,
Flex,
FlexItem,
GridItem,
Label,
List,
ListItem,
Tooltip,
Skeleton,
CardExpandableContent,
} from '@patternfly/react-core';
import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';
import { translate as __ } from 'foremanReact/common/I18n';
import { propsToCamelCase } from 'foremanReact/common/helpers';
import './SystemPurposeCard.scss';
import SystemPurposeEditModal from './SystemPurposeEditModal';
import { selectHostDetailsStatus } from '../../HostDetailsSelectors';
import { hasRequiredPermissions, hostIsNotRegistered } from '../../hostDetailsHelpers';
const SystemPurposeCard = ({ hostDetails, akDetails }) => {
const sysPurposeCardType = hostDetails?.id ? 'host' : 'ak';
const isAKType = sysPurposeCardType === 'ak';
const isHostType = sysPurposeCardType === 'host';
const details = isHostType ? hostDetails : akDetails;
const requiredPermission = isHostType ? 'edit_hosts' : 'edit_activation_keys';
const showEditButton = hasRequiredPermissions([requiredPermission], details?.permissions);
const { organization_id: orgId, name } = details;
const subscriptionFacetAttributes = details?.subscription_facet_attributes;
const {
purposeRole, purposeUsage, purposeAddons, releaseVersion, serviceLevel,
} = propsToCamelCase((subscriptionFacetAttributes || details) ?? {});
const sysPurposeProps = {
purposeRole,
purposeUsage,
purposeAddons,
releaseVersion,
serviceLevel,
};
const selectAKDetailsStatus = state =>
selectAPIStatus(state, `ACTIVATION_KEY_${details.id}`) ?? STATUS.PENDING;
const statusSelector = isHostType ? selectHostDetailsStatus : selectAKDetailsStatus;
const detailsStatus = useSelector(statusSelector);
const dataIsLoading = detailsStatus === STATUS.PENDING;
const [editing, setEditing] = useState(false);
const [isExpanded, setIsExpanded] = React.useState(true);
const onExpand = () => {
setIsExpanded(!isExpanded);
};
const cardHeaderProps = {
toggleButtonProps: { id: 'sys-purpose-toggle', 'aria-label': 'sys-purpose-toggle' },
};
if (isAKType) cardHeaderProps.onExpand = onExpand;
if (!details?.id) {
return (
);
}
if (isHostType && hostIsNotRegistered({ hostDetails: details })) return null;
return (
{__('System purpose')}
{showEditButton && (
)
}
{__('Role')}
{dataIsLoading ? : purposeRole}
{__('SLA')}
{serviceLevel && (dataIsLoading ? : (
))}
{__('Usage type')}
{purposeUsage && (dataIsLoading ? : (
))}
{__('Release version')}
{dataIsLoading ? : releaseVersion}
{!!purposeAddons?.length && (
<>
{__('Add-ons')}
{dataIsLoading ? : (
{purposeAddons.map(addon => (
{addon}
))}
)}
>
)
}
{showEditButton && (
setEditing(false)}
name={name}
id={details.id}
{...sysPurposeProps}
type={sysPurposeCardType}
/>
)}
);
};
SystemPurposeCard.propTypes = {
hostDetails: PropTypes.shape({
name: PropTypes.string,
organization_id: PropTypes.number,
id: PropTypes.number,
subscription_facet_attributes: PropTypes.shape({
installed_products: PropTypes.arrayOf(PropTypes.shape({
productId: PropTypes.string,
productName: PropTypes.string,
})),
}),
permissions: PropTypes.shape({
edit_hosts: PropTypes.bool,
}),
}),
akDetails: PropTypes.shape({
name: PropTypes.string,
organization_id: PropTypes.number,
id: PropTypes.number,
purpose_usage: PropTypes.string,
purpose_role: PropTypes.string,
release_version: PropTypes.string,
service_level: PropTypes.string,
purpose_addons: PropTypes.arrayOf(PropTypes.string),
permissions: PropTypes.shape({
edit_activation_keys: PropTypes.bool,
}),
}),
};
SystemPurposeCard.defaultProps = {
hostDetails: {},
akDetails: {},
};
export default SystemPurposeCard;