import React, { useState, useRef } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import PropTypes from 'prop-types'; import { Button, Wizard } from '@patternfly/react-core'; import { sprintf, translate as __ } from 'foremanReact/common/I18n'; import { API_OPERATIONS, get } from 'foremanReact/redux/API'; import OpenscapRemediationWizardContext from './OpenscapRemediationWizardContext'; import { Footer } from './Footer'; import { selectLogResponse, selectLogError, selectLogStatus, } from './OpenscapRemediationSelectors'; import { REPORT_LOG_REQUEST_KEY, FAIL_RULE_SEARCH, WIZARD_TITLES, } from './constants'; import { SnippetSelect, ReviewHosts, ReviewRemediation, Finish } from './steps'; const OpenscapRemediationWizard = ({ report_id: reportId, host: { id: hostId, name: hostName }, supported_remediation_snippets: supportedJobSnippets, }) => { const dispatch = useDispatch(); const log = useSelector(state => selectLogResponse(state))?.log; const logStatus = useSelector(state => selectLogStatus(state)); const logError = useSelector(state => selectLogError(state)); const fixes = JSON.parse(log?.message?.fixes || null) || []; const source = log?.source?.value || ''; const title = log?.message?.value || ''; const defaultHostIdsParam = `id ^ (${hostId})`; const defaultFailedHostsSearch = `${FAIL_RULE_SEARCH} = ${source}`; const [isRemediationWizardOpen, setIsRemediationWizardOpen] = useState(false); const [snippet, setSnippet] = useState(''); const [method, setMethod] = useState('job'); const [hostIdsParam, setHostIdsParam] = useState(defaultHostIdsParam); const [isRebootSelected, setIsRebootSelected] = useState(false); const [isAllHostsSelected, setIsAllHostsSelected] = useState(false); const savedHostSelectionsRef = useRef({}); const onModalButtonClick = e => { e.preventDefault(); const logId = e.target.getAttribute('data-log-id'); dispatch( get({ type: API_OPERATIONS.GET, key: REPORT_LOG_REQUEST_KEY, url: `/compliance/arf_reports/${reportId}/show_log`, params: { log_id: logId }, }) ); setIsRemediationWizardOpen(true); }; const onWizardClose = () => { // Reset to defaults setHostIdsParam(defaultHostIdsParam); setSnippet(''); setMethod('job'); setIsRebootSelected(false); setIsRemediationWizardOpen(false); savedHostSelectionsRef.current = {}; }; const reviewHostsStep = { id: 2, name: WIZARD_TITLES.reviewHosts, component: , canJumpTo: Boolean(snippet && method === 'job'), enableNext: Boolean(snippet && method), }; const steps = [ { id: 1, name: WIZARD_TITLES.snippetSelect, component: , canJumpTo: true, enableNext: Boolean(snippet && method), }, ...(snippet && method === 'job' ? [reviewHostsStep] : []), { id: 3, name: WIZARD_TITLES.reviewRemediation, component: , canJumpTo: Boolean(snippet && method), enableNext: method === 'job', nextButtonText: __('Run'), }, { id: 4, name: WIZARD_TITLES.finish, component: , isFinishedStep: true, }, ]; return ( <> {isRemediationWizardOpen && ( } /> )}