Katello/katello

View on GitHub
webpack/components/extensions/HostDetails/ActionsBar/index.js

Summary

Maintainability
A
2 hrs
Test Coverage
import React, { useContext } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { DropdownItem, DropdownSeparator } from '@patternfly/react-core';
import { CubeIcon, UndoIcon, RedoIcon } from '@patternfly/react-icons';

import { translate as __ } from 'foremanReact/common/I18n';
import { HOST_DETAILS_KEY } from 'foremanReact/components/HostDetails/consts';
import { ForemanActionsBarContext } from 'foremanReact/components/HostDetails/ActionsBar';
import { foremanUrl } from 'foremanReact/common/helpers';

import { selectHostDetails } from '../HostDetailsSelectors';
import { useRexJobPolling } from '../Tabs/RemoteExecutionHooks';
import { runSubmanRepos } from '../Cards/ContentViewDetailsCard/HostContentViewActions';
import { hasRequiredPermissions as can, userPermissionsFromHostDetails } from '../hostDetailsHelpers';

const HostActionsBar = () => {
  const hostDetails = useSelector(selectHostDetails);
  const dispatch = useDispatch();
  const hostname = hostDetails?.name;
  const { onKebabToggle } = useContext(ForemanActionsBarContext);

  const recalculateApplicability = ['edit_hosts', 'create_job_invocations'];
  const showRecalculate =
    can(recalculateApplicability, userPermissionsFromHostDetails({ hostDetails }));

  const refreshHostDetails = () => dispatch({
    type: 'API_GET',
    payload: {
      key: HOST_DETAILS_KEY,
      url: `/api/hosts/${hostname}`,
    },
  });

  const {
    triggerJobStart: triggerRecalculate,
  } = useRexJobPolling(() => runSubmanRepos(hostname, refreshHostDetails));

  const handleRefreshApplicabilityClick = () => {
    triggerRecalculate();
    onKebabToggle();
  };

  return (
    <>
      <DropdownItem
        ouiaId="katello-legacy-contenthost-ui"
        key="katello-legacy-contenthost-ui"
        href={foremanUrl(`/content_hosts/${hostDetails?.id}`)}
        icon={<UndoIcon />}
      >
        {__('Legacy content host UI')}
      </DropdownItem>
      <DropdownSeparator key="separator" ouiaId="katello-separator" />
      {showRecalculate && (
        <DropdownItem
          ouiaId="katello-refresh-applicability"
          key="katello-refresh-applicability"
          onClick={handleRefreshApplicabilityClick}
          icon={<RedoIcon />}
        >
          {__('Refresh applicability')}
        </DropdownItem>
      )
      }
      <DropdownItem
        ouiaId="katello-change-host-content-source"
        key="katello-change-host-content-source"
        href={foremanUrl(`/change_host_content_source?host_id=${hostDetails?.id}&initialContentSourceId=${hostDetails?.content_facet_attributes?.content_source_id}`)}
        icon={<CubeIcon />}
      >
        {__('Change content source')}
      </DropdownItem>
    </>
  );
};

export default HostActionsBar;