import React, { useState } from 'react'; import { Badge, Button, Card, CardHeader, CardTitle, CardBody, Dropdown, ExpandableSection, KebabToggle, Flex, FlexItem, GridItem, DropdownItem, } from '@patternfly/react-core'; import { PlusCircleIcon } from '@patternfly/react-icons'; import { translate as __ } from 'foremanReact/common/I18n'; import { propsToCamelCase } from 'foremanReact/common/helpers'; import PropTypes from 'prop-types'; import { useSet } from '../../../../Table/TableHooks'; import { HostCollectionsAddModal, HostCollectionsRemoveModal } from './HostCollectionsModal'; import { hasRequiredPermissions, hostIsRegistered, userPermissionsFromHostDetails } from '../../hostDetailsHelpers'; import EmptyStateMessage from '../../../../Table/EmptyStateMessage'; import './HostCollectionsCard.scss'; const requiredPermissions = ['edit_hosts', 'view_host_collections']; const HostCollectionsDetails = ({ hostCollections, id: hostId, name: hostName, showKebab, }) => { const [isDropdownOpen, setIsDropdownOpen] = useState(false); const toggleBulkAction = () => setIsDropdownOpen(prev => !prev); const expandedHostCollections = useSet([]); const hostCollectionIds = hostCollections?.map(({ id }) => id) ?? []; const [isAddModalOpen, setIsAddModalOpen] = useState(false); const closeAddModal = () => setIsAddModalOpen(false); const [isRemoveModalOpen, setIsRemoveModalOpen] = useState(false); const closeRemoveModal = () => setIsRemoveModalOpen(false); const openAddHostCollectionsModal = () => { setIsDropdownOpen(false); setIsAddModalOpen(true); }; const openRemoveHostCollectionsModal = () => { setIsDropdownOpen(false); setIsRemoveModalOpen(true); }; const dropdownItems = [ {__('Add host to collections')} , {__('Remove host from collections')} , ]; const primaryActionButton = ( {__('Add to a host collection')} ); return ( {__('Host collections')} {!!hostCollections?.length && {hostCollections.length}} {showKebab && hostCollections?.length > 0 && ( } ouiaId="host-collections-bulk-actions-dropdown" isOpen={isDropdownOpen} isPlain position="right" dropdownItems={dropdownItems} /> ) } {hostCollections?.length === 0 && } {hostCollections?.map((hostCollection) => { const { id, name, description, maxHosts, unlimitedHosts, totalHosts, } = propsToCamelCase(hostCollection); const isExpanded = expandedHostCollections.has(id); return ( expandedHostCollections.onToggle(!isExpanded, id)} isExpanded={isExpanded} isIndented > {description || {__('No description provided')}} {totalHosts}/{unlimitedHosts ? 'unlimited' : maxHosts} ); })} {hostId && <> > } ); }; const HostCollectionsCard = ({ hostDetails }) => { if (hostIsRegistered({ hostDetails })) { const showKebab = hasRequiredPermissions(requiredPermissions, userPermissionsFromHostDetails({ hostDetails })); return ; } return null; }; HostCollectionsDetails.propTypes = { hostCollections: PropTypes.arrayOf(PropTypes.shape({})), id: PropTypes.number, name: PropTypes.string, showKebab: PropTypes.bool, }; HostCollectionsDetails.defaultProps = { hostCollections: [], id: null, name: '', showKebab: false, }; HostCollectionsCard.propTypes = { hostDetails: PropTypes.shape({ permissions: PropTypes.shape({}), contentFacetAttributes: PropTypes.shape({ permissions: PropTypes.shape({}), }), }), }; HostCollectionsCard.defaultProps = { hostDetails: { permissions: {}, contentFacetAttributes: { permissions: {}, }, }, }; export default HostCollectionsCard;