import PropTypes from 'prop-types'; import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Button, Dropdown, DropdownItem, DropdownPosition, DropdownSeparator, DropdownToggle, Split, SplitItem, } from '@patternfly/react-core'; import { translate as __ } from 'foremanReact/common/I18n'; import { foremanUrl } from 'foremanReact/common/helpers'; import { STATUS as APIStatus } from 'foremanReact/constants'; import { get } from 'foremanReact/redux/API'; import { cancelJob, cancelRecurringLogic, enableRecurringLogic, } from './JobInvocationActions'; import { STATUS, GET_REPORT_TEMPLATES, GET_REPORT_TEMPLATE_INPUTS, } from './JobInvocationConstants'; import { selectTaskCancelable } from './JobInvocationSelectors'; const JobInvocationToolbarButtons = ({ jobId, data, currentPermissions, permissionsStatus, }) => { const { succeeded, failed, task, recurrence, permissions } = data; const recurringEnabled = recurrence?.state === 'active'; const canViewForemanTasks = permissions ? permissions.view_foreman_tasks : false; const canEditRecurringLogic = permissions ? permissions.edit_recurring_logics : false; const isTaskCancelable = useSelector(selectTaskCancelable); const [isActionOpen, setIsActionOpen] = useState(false); const [reportTemplateJobId, setReportTemplateJobId] = useState(undefined); const [templateInputId, setTemplateInputId] = useState(undefined); const queryParams = new URLSearchParams({ [`report_template_report[input_values][${templateInputId}][value]`]: jobId, }); const dispatch = useDispatch(); const onActionFocus = () => { const element = document.getElementById( `toggle-split-button-action-primary-${jobId}` ); element.focus(); }; const onActionSelect = () => { setIsActionOpen(false); onActionFocus(); }; const hasPermission = permissionRequired => permissionsStatus === APIStatus.RESOLVED ? currentPermissions?.some( permission => permission.name === permissionRequired ) : false; useEffect(() => { dispatch( get({ key: GET_REPORT_TEMPLATES, url: '/api/report_templates', handleSuccess: ({ data: { results } }) => { setReportTemplateJobId( results.find(result => result.name === 'Job - Invocation Report') ?.id ); }, handleError: () => { setReportTemplateJobId(undefined); }, }) ); }, [dispatch]); useEffect(() => { if (reportTemplateJobId !== undefined) { dispatch( get({ key: GET_REPORT_TEMPLATE_INPUTS, url: `/api/templates/${reportTemplateJobId}/template_inputs`, handleSuccess: ({ data: { results } }) => { setTemplateInputId( results.find(result => result.name === 'job_id')?.id ); }, handleError: () => { setTemplateInputId(undefined); }, }) ); } }, [dispatch, reportTemplateJobId]); const recurrenceDropdownItems = recurrence ? [ , dispatch( enableRecurringLogic(recurrence?.id, recurringEnabled, jobId) ) } key="change-enabled-recurring" component="button" isDisabled={ recurrence?.id === undefined || recurrence?.state === 'cancelled' || !canEditRecurringLogic } > {recurringEnabled ? __('Disable recurring') : __('Enable recurring')} , dispatch(cancelRecurringLogic(recurrence?.id, jobId))} key="cancel-recurring" component="button" isDisabled={ recurrence?.id === undefined || recurrence?.state === 'cancelled' || !canEditRecurringLogic } > {__('Cancel recurring')} , ] : []; const dropdownItems = [ 0) || !hasPermission('create_job_invocations')} description="Rerun job on successful hosts" > {__('Rerun successful')} , 0) || !hasPermission('create_job_invocations')} description="Rerun job on failed hosts" > {__('Rerun failed')} , {__('View task')} , , dispatch(cancelJob(jobId, false))} key="cancel" component="button" isDisabled={!isTaskCancelable || !hasPermission('cancel_job_invocations')} description="Cancel job gracefully" > {__('Cancel')} , dispatch(cancelJob(jobId, true))} key="abort" component="button" isDisabled={!isTaskCancelable || !hasPermission('cancel_job_invocations')} description="Cancel job immediately" > {__('Abort')} , ...recurrenceDropdownItems, , {__('Legacy UI')} , ]; return ( <> {__(`Rerun all`)} , ]} splitButtonVariant="action" onToggle={setIsActionOpen} /> } isOpen={isActionOpen} dropdownItems={dropdownItems} /> ); }; JobInvocationToolbarButtons.propTypes = { jobId: PropTypes.string.isRequired, data: PropTypes.object.isRequired, currentPermissions: PropTypes.array, permissionsStatus: PropTypes.string, }; JobInvocationToolbarButtons.defaultProps = { currentPermissions: undefined, permissionsStatus: undefined, }; export default JobInvocationToolbarButtons;