From 9a6a09b5a06b7310b82ee33b8d35f6b16547ddfe Mon Sep 17 00:00:00 2001 From: Katerina Koukiou Date: Fri, 1 Nov 2024 11:14:18 +0100 Subject: [PATCH] Do not permit clicking 'Modify storage' button when installation has been started --- src/components/AnacondaHeader.jsx | 3 ++- src/components/AnacondaWizard.jsx | 14 +++----------- src/components/HeaderKebab.jsx | 4 ++-- src/components/app.jsx | 12 ++++++++++++ .../storage/CockpitStorageIntegration.jsx | 9 ++++++++- test/check-progress | 4 ++++ 6 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/components/AnacondaHeader.jsx b/src/components/AnacondaHeader.jsx index 2cb4a2ee6..2cc266288 100644 --- a/src/components/AnacondaHeader.jsx +++ b/src/components/AnacondaHeader.jsx @@ -36,7 +36,7 @@ import "./AnacondaHeader.scss"; const _ = cockpit.gettext; const N_ = cockpit.noop; -export const AnacondaHeader = ({ dispatch, isFormDisabled, onCritFail, reportLinkURL, setShowStorage, showStorage, title }) => { +export const AnacondaHeader = ({ currentStepId, dispatch, isFormDisabled, onCritFail, reportLinkURL, setShowStorage, showStorage, title }) => { const [beta, setBeta] = useState(); const network = useContext(NetworkContext); const isConnected = network.connected; @@ -57,6 +57,7 @@ export const AnacondaHeader = ({ dispatch, isFormDisabled, onCritFail, reportLin {beta && } { +export const AnacondaWizard = ({ currentStepId, dispatch, isFetching, onCritFail, showStorage }) => { // The Form should be disabled while backend checks are in progress // or the page initialization is in progress const [isFormDisabled, setIsFormDisabled] = useState(false); // The Form should be marked as invalid when the user filled data // are failing the validation const [isFormValid, setIsFormValid] = useState(false); - const [currentStepId, setCurrentStepId] = useState(); const { storageScenarioId } = useContext(StorageContext); const isBootIso = useContext(SystemTypeContext) === "BOOT_ISO"; const { path } = usePageLocation(); - useEffect(() => { - if (!currentStepId) { - return; - } - cockpit.location.go([currentStepId]); - }, [currentStepId]); - const componentProps = { dispatch, isFormDisabled: isFormDisabled || isFetching, @@ -112,7 +104,7 @@ export const AnacondaWizard = ({ dispatch, isFetching, onCritFail, showStorage } setIsFormDisabled(true); } - setCurrentStepId(newStep.id); + cockpit.location.go([newStep.id]); }; const finalStep = stepsOrder[stepsOrder.length - 1]; diff --git a/src/components/HeaderKebab.jsx b/src/components/HeaderKebab.jsx index 4c633a122..b59178c27 100644 --- a/src/components/HeaderKebab.jsx +++ b/src/components/HeaderKebab.jsx @@ -106,7 +106,7 @@ const AnacondaAboutModal = ({ isModalOpen, setIsAboutModalOpen }) => { ); }; -export const HeaderKebab = ({ dispatch, isConnected, onCritFail, reportLinkURL, setShowStorage, showStorage }) => { +export const HeaderKebab = ({ currentStepId, dispatch, isConnected, onCritFail, reportLinkURL, setShowStorage, showStorage }) => { const [isOpen, setIsOpen] = useState(false); const [isAboutModalOpen, setIsAboutModalOpen] = useState(false); const [isReportIssueOpen, setIsReportIssueOpen] = useState(false); @@ -128,7 +128,7 @@ export const HeaderKebab = ({ dispatch, isConnected, onCritFail, reportLinkURL, const dropdownItems = [ , diff --git a/src/components/app.jsx b/src/components/app.jsx index 94f20dcaa..399b402ab 100644 --- a/src/components/app.jsx +++ b/src/components/app.jsx @@ -16,6 +16,8 @@ */ import cockpit from "cockpit"; +import { usePageLocation } from "hooks"; + import React, { useCallback, useEffect, useState } from "react"; import { Bullseye, @@ -51,7 +53,15 @@ export const ApplicationLoading = () => ( export const Application = ({ conf, dispatch, isFetching, onCritFail, osRelease, reportLinkURL }) => { const [storeInitialized, setStoreInitialized] = useState(false); const [showStorage, setShowStorage] = useState(false); + const [currentStepId, setCurrentStepId] = useState(); const address = useAddress(); + const { path } = usePageLocation(); + + useEffect(() => { + if (path[0] !== currentStepId) { + setCurrentStepId(path[0]); + } + }, [path, currentStepId]); useEffect(() => { if (!address) { @@ -81,6 +91,7 @@ export const Application = ({ conf, dispatch, isFetching, onCritFail, osRelease, { ); }; -export const ModifyStorage = ({ setShowStorage }) => { +export const ModifyStorage = ({ currentStepId, setShowStorage }) => { const targetSystemRoot = useContext(TargetSystemRootContext); const { diskSelection } = useContext(StorageContext); const devices = useOriginalDevices(); @@ -646,10 +647,16 @@ export const ModifyStorage = ({ setShowStorage }) => { efi: isEfi, mount_point_prefix: targetSystemRoot, }); + const isDisabled = useMemo(() => { + const steps = getSteps(); + const currentStep = steps.find(step => step.id === currentStepId); + return currentStep?.isFinal; + }, [currentStepId]); return ( { window.sessionStorage.setItem("cockpit_anaconda", cockpitAnaconda); setShowStorage(true); diff --git a/test/check-progress b/test/check-progress index 58d0b5730..bdc5dec62 100755 --- a/test/check-progress +++ b/test/check-progress @@ -61,6 +61,10 @@ class TestInstallationProgress(VirtInstallMachineCase): ignore=[".logo", "#betanag-icon"], ) + # Check that at this stage 'Modify Storage' is not available + b.click("#toggle-kebab") + b.wait_visible("li.pf-m-disabled #modify-storage") + self.handleReboot()