import React, { useContext, useEffect, useState } from 'react'; import { withI18n } from '@lingui/react'; import { t, Plural } from '@lingui/macro'; import { arrayOf, func } from 'prop-types'; import { Button, DropdownItem, Tooltip } from '@patternfly/react-core'; import { KebabifiedContext } from '../../contexts/Kebabified'; import { isJobRunning } from '../../util/jobs'; import AlertModal from '../AlertModal'; import { Job } from '../../types'; function cannotCancelBecausePermissions(job) { return ( !job.summary_fields.user_capabilities.start && isJobRunning(job.status) ); } function cannotCancelBecauseNotRunning(job) { return !isJobRunning(job.status); } function JobListCancelButton({ i18n, jobsToCancel, onCancel }) { const { isKebabified, onKebabModalChange } = useContext(KebabifiedContext); const [isModalOpen, setIsModalOpen] = useState(false); const numJobsToCancel = jobsToCancel.length; const handleCancelJob = () => { onCancel(); toggleModal(); }; const toggleModal = () => { setIsModalOpen(!isModalOpen); }; useEffect(() => { if (isKebabified) { onKebabModalChange(isModalOpen); } }, [isKebabified, isModalOpen, onKebabModalChange]); const renderTooltip = () => { const cannotCancelPermissions = jobsToCancel .filter(cannotCancelBecausePermissions) .map(job => job.name); const cannotCancelNotRunning = jobsToCancel .filter(cannotCancelBecauseNotRunning) .map(job => job.name); const numJobsUnableToCancel = cannotCancelPermissions.concat( cannotCancelNotRunning ).length; if (numJobsUnableToCancel > 0) { return (
{cannotCancelPermissions.length > 0 && (
{cannotCancelPermissions.map((job, i) => ( {' '} {job} {i !== cannotCancelPermissions.length - 1 ? ',' : ''} ))}
)} {cannotCancelNotRunning.length > 0 && (
{cannotCancelNotRunning.map((job, i) => ( {' '} {job} {i !== cannotCancelNotRunning.length - 1 ? ',' : ''} ))}
)}
); } if (numJobsToCancel > 0) { return ( ); } return i18n._(t`Select a job to cancel`); }; const isDisabled = jobsToCancel.length === 0 || jobsToCancel.some(cannotCancelBecausePermissions) || jobsToCancel.some(cannotCancelBecauseNotRunning); const cancelJobText = ( ); return ( <> {isKebabified ? ( {cancelJobText} ) : (
)} {isModalOpen && ( {cancelJobText} , , ]} >
{jobsToCancel.map(job => ( {job.name}
))}
)} ); } JobListCancelButton.propTypes = { jobsToCancel: arrayOf(Job), onCancel: func, }; JobListCancelButton.defaultProps = { jobsToCancel: [], onCancel: () => {}, }; export default withI18n()(JobListCancelButton);