diff --git a/src/components/forms/YamlConfirmation.tsx b/src/components/forms/YamlConfirmation.tsx new file mode 100644 index 0000000000..9d346c6227 --- /dev/null +++ b/src/components/forms/YamlConfirmation.tsx @@ -0,0 +1,27 @@ +import { FC } from "react"; +import { ConfirmationModal } from "@canonical/react-components"; + +interface Props { + onConfirm: () => void; + close: () => void; +} + +const YamlConfirmation: FC = ({ onConfirm, close }) => { + return ( + +

+ Switching back to guided forms will discard all changes in the YAML + editor. +
+ Are you sure you want to proceed? +

+
+ ); +}; + +export default YamlConfirmation; diff --git a/src/components/forms/YamlForm.tsx b/src/components/forms/YamlForm.tsx index 02a8733ef0..82912c63a7 100644 --- a/src/components/forms/YamlForm.tsx +++ b/src/components/forms/YamlForm.tsx @@ -4,6 +4,7 @@ import { updateMaxHeight } from "util/updateMaxHeight"; import useEventListener from "@use-it/event-listener"; import { editor } from "monaco-editor/esm/vs/editor/editor.api"; import IStandaloneCodeEditor = editor.IStandaloneCodeEditor; +import classnames from "classnames"; export interface YamlFormValues { yaml?: string; @@ -46,7 +47,10 @@ const YamlForm: FC = ({ return ( <> {children} -
+
{ + const docBaseLink = useDocs(); const eventQueue = useEventQueue(); const location = useLocation() as Location; const navigate = useNavigate(); @@ -381,6 +383,7 @@ const CreateInstance: FC = () => {
{ {section === YAML_CONFIGURATION && ( void formik.setFieldValue("yaml", yaml)} > - - Changes will be discarded, when switching back to the guided - forms. + + This is the YAML representation of the instance. +
+ + Learn more about instances +
)} diff --git a/src/pages/instances/EditInstance.tsx b/src/pages/instances/EditInstance.tsx index 581f80e922..e835e00dd5 100644 --- a/src/pages/instances/EditInstance.tsx +++ b/src/pages/instances/EditInstance.tsx @@ -1,4 +1,4 @@ -import { FC, useEffect, useState } from "react"; +import React, { FC, useEffect, useState } from "react"; import { ActionButton, Button, @@ -55,6 +55,7 @@ import { hasDiskError, hasNetworkError } from "util/instanceValidation"; import FormFooterLayout from "components/forms/FormFooterLayout"; import { useToastNotification } from "context/toastNotificationProvider"; import InstanceLink from "pages/instances/InstanceLink"; +import { useDocs } from "context/useDocs"; export interface InstanceEditDetailsFormValues { name: string; @@ -79,6 +80,7 @@ interface Props { } const EditInstance: FC = ({ instance }) => { + const docBaseLink = useDocs(); const eventQueue = useEventQueue(); const toastNotify = useToastNotification(); const { project, section } = useParams<{ @@ -185,6 +187,7 @@ const EditInstance: FC = ({ instance }) => { toggleConfigOpen={toggleMenu} hasDiskError={hasDiskError(formik)} hasNetworkError={hasNetworkError(formik)} + formik={formik} /> @@ -218,19 +221,22 @@ const EditInstance: FC = ({ instance }) => { {section === slugify(YAML_CONFIGURATION) && ( void formik.setFieldValue("yaml", yaml)} readOnly={readOnly} > - {!readOnly && ( - + This is the YAML representation of the instance. +
+ - Changes will be discarded, when switching back to the guided - forms. -
- )} + Learn more about instances + +
)} diff --git a/src/pages/instances/forms/InstanceFormMenu.tsx b/src/pages/instances/forms/InstanceFormMenu.tsx index d95df01edb..aa95b03699 100644 --- a/src/pages/instances/forms/InstanceFormMenu.tsx +++ b/src/pages/instances/forms/InstanceFormMenu.tsx @@ -1,8 +1,10 @@ -import { FC, useEffect } from "react"; +import React, { FC, ReactNode, useEffect, useState } from "react"; import MenuItem from "components/forms/FormMenuItem"; import { Button, useNotify } from "@canonical/react-components"; import { updateMaxHeight } from "util/updateMaxHeight"; import useEventListener from "@use-it/event-listener"; +import YamlConfirmation from "components/forms/YamlConfirmation"; +import { InstanceAndProfileFormikProps } from "components/forms/instanceAndProfileFormValues"; export const MAIN_CONFIGURATION = "Main configuration"; export const DISK_DEVICES = "Disk devices"; @@ -21,6 +23,7 @@ interface Props { setActive: (val: string) => void; hasDiskError: boolean; hasNetworkError: boolean; + formik: InstanceAndProfileFormikProps; } const InstanceFormMenu: FC = ({ @@ -31,11 +34,30 @@ const InstanceFormMenu: FC = ({ setActive, hasDiskError, hasNetworkError, + formik, }) => { const notify = useNotify(); + const [confirmModal, setConfirmModal] = useState(null); const menuItemProps = { active, - setActive, + setActive: (val: string) => { + if (Boolean(formik.values.yaml) && val !== YAML_CONFIGURATION) { + const handleConfirm = () => { + void formik.setFieldValue("yaml", undefined); + setConfirmModal(null); + setActive(val); + }; + + setConfirmModal( + setConfirmModal(null)} + />, + ); + } else { + setActive(val); + } + }, }; const resize = () => { @@ -46,6 +68,7 @@ const InstanceFormMenu: FC = ({ return (
+ {confirmModal}