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;