theforeman/foreman

View on GitHub
webpack/assets/javascripts/react_app/components/HostDetails/Tabs/Details/Cards/SystemProperties/index.js

Summary

Maintainability
D
2 days
Test Coverage
import PropTypes from 'prop-types';
import React from 'react';
import {
  ClipboardCopy,
  DescriptionList,
  DescriptionListTerm,
  DescriptionListGroup,
  DescriptionListDescription,
  Divider,
} from '@patternfly/react-core';
import { translate as __ } from '../../../../../../common/I18n';
import CardTemplate from '../../../../Templates/CardItem/CardTemplate';
import Slot from '../../../../../common/Slot';
import SkeletonLoader from '../../../../../common/SkeletonLoader';
import DefaultLoaderEmptyState from '../../../../DetailsCard/DefaultLoaderEmptyState';
import { STATUS } from '../../../../../../constants';
import { useForemanSettings } from '../../../../../../Root/Context/ForemanContext';

const SystemPropertiesCard = ({ status, hostDetails }) => {
  const { displayFqdnForHosts } = useForemanSettings();
  const {
    name,
    model_name: model,
    location_name: location,
    organization_name: organization,
    owner_name: ownerName,
    domain_name: domain,
    hostgroup_name: hostgroupName,
    owner_type: ownerType,
  } = hostDetails;
  return (
    <CardTemplate
      overrideGridProps={{ rowSpan: 2 }}
      header={__('System properties')}
      expandable
      masonryLayout
    >
      <DescriptionList isCompact>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Name')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {name && (
                <ClipboardCopy
                  isBlock
                  variant="inline-compact"
                  hoverTip={__('Copy to clipboard')}
                  clickTip={__('Copied to clipboard')}
                >
                  {displayFqdnForHosts ? name : name?.replace(`.${domain}`, '')}
                </ClipboardCopy>
              )}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>
        <Slot
          id="host-details-tab-properties-1"
          multi
          hostDetails={hostDetails}
        />
      </DescriptionList>
      <Divider className="padded-divider" />
      <DescriptionList isCompact isHorizontal>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Domain')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {domain && (
                <ClipboardCopy isBlock variant="inline-compact">
                  {domain}
                </ClipboardCopy>
              )}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>

        <DescriptionListGroup>
          <DescriptionListTerm>{__('Model')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {model}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>
        <Slot
          id="host-details-tab-properties-2"
          multi
          hostDetails={hostDetails}
        />
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Host group')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {hostgroupName}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Host owner')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {ownerName}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Owner type')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {ownerType}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Organization')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {organization}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Location')}</DescriptionListTerm>
          <DescriptionListDescription>
            <SkeletonLoader
              status={status}
              emptyState={<DefaultLoaderEmptyState />}
            >
              {location}
            </SkeletonLoader>
          </DescriptionListDescription>
        </DescriptionListGroup>
        <Slot
          id="host-details-tab-properties-3"
          multi
          hostDetails={hostDetails}
        />
      </DescriptionList>
    </CardTemplate>
  );
};

SystemPropertiesCard.propTypes = {
  status: PropTypes.string,
  hostDetails: PropTypes.shape({
    hostgroup_name: PropTypes.string,
    model_name: PropTypes.string,
    organization_name: PropTypes.string,
    location_name: PropTypes.string,
    owner_name: PropTypes.string,
    owner_type: PropTypes.string,
    name: PropTypes.string,
    domain_name: PropTypes.string,
    created_at: PropTypes.string,
    updated_at: PropTypes.string,
  }),
};

SystemPropertiesCard.defaultProps = {
  status: STATUS.PENDING,
  hostDetails: {
    name: undefined,
    model_name: undefined,
    organization_name: undefined,
    location_name: undefined,
    hostgroup_name: undefined,
    owner_type: undefined,
    owner_name: undefined,
    domain_name: undefined,
    created_at: undefined,
    updated_at: undefined,
  },
};

export default SystemPropertiesCard;