diff --git a/terranova/frontend/src/components/DatasetCreatorForm.tsx b/terranova/frontend/src/components/DatasetCreatorForm.tsx index fcbc854..4df12dc 100644 --- a/terranova/frontend/src/components/DatasetCreatorForm.tsx +++ b/terranova/frontend/src/components/DatasetCreatorForm.tsx @@ -28,6 +28,7 @@ export function DatasetCreatorForm(props: any) { // prefer a controlled state form over uncontrolled, because one of the inputs // (fork from version) is dependent on a previous value (fork from dataset) const [formValues, setFormValues] = useState
({}); + const [submitting, setSubmitting] = useState(false); const setFormValue = (property: string) => (value: any) => { setFormValues((prev) => { @@ -48,8 +49,10 @@ export function DatasetCreatorForm(props: any) { // get some information from the DataController (set of options for 'select' elements, e.g.) const onSubmit = async (e: any) => { e.preventDefault(); + if (submitting) return; if (!formValues.name) return; if (formValues.fork && (!formValues.forkDataset || !formValues.forkDatasetVersion)) return; + setSubmitting(true); // TODO: add form basic form validation, a lengthy process const newDataset = structuredClone(DEFAULT_DATASET); @@ -110,7 +113,7 @@ export function DatasetCreatorForm(props: any) { /> )}
- + Create Dataset
diff --git a/terranova/frontend/src/components/MapCreatorForm.tsx b/terranova/frontend/src/components/MapCreatorForm.tsx index 478c6b7..892bea3 100644 --- a/terranova/frontend/src/components/MapCreatorForm.tsx +++ b/terranova/frontend/src/components/MapCreatorForm.tsx @@ -28,6 +28,7 @@ export function MapCreatorForm(props: any) { // prefer a controlled state form over uncontrolled, because one of the inputs // (fork from version) is dependent on a previous value (fork from map) const [formValues, setFormValues] = useState({}); + const [submitting, setSubmitting] = useState(false); const setFormValue = (property: string) => (value: any) => { setFormValues((prev) => { @@ -47,8 +48,10 @@ export function MapCreatorForm(props: any) { const onSubmit = async (e: any) => { e.preventDefault(); + if (submitting) return; if (!formValues.name) return; if (formValues.fork && (!formValues.forkMap || !formValues.forkMapVersion)) return; + setSubmitting(true); // TODO: add form basic form validation, a lengthy process const newMap = structuredClone(DEFAULT_MAP); @@ -108,7 +111,7 @@ export function MapCreatorForm(props: any) { /> )}
- + Create Map
diff --git a/terranova/frontend/src/components/TemplateEditorForm.tsx b/terranova/frontend/src/components/TemplateEditorForm.tsx index 436f2ba..64744ef 100644 --- a/terranova/frontend/src/components/TemplateEditorForm.tsx +++ b/terranova/frontend/src/components/TemplateEditorForm.tsx @@ -21,6 +21,7 @@ export function TemplateEditorForm(props: any) { const { templateId } = useParams(); const create = templateId === undefined; const [updating, setUpdating] = useState(false); + const [submitting, setSubmitting] = useState(false); const { controller } = useContext(TemplateDataController) as DataControllerContextType; @@ -40,10 +41,16 @@ export function TemplateEditorForm(props: any) { controller.fetch(); }; - const save = (e: any) => { + const save = async (e: any) => { e.preventDefault(); + if (submitting) return; + setSubmitting(true); setUpdating(false); - props.persistTemplate(e); + try { + await props.persistTemplate(e); + } finally { + setSubmitting(false); + } }; return ( @@ -67,15 +74,15 @@ export function TemplateEditorForm(props: any) { /> {create ? ( - + Create ) : (
- + Discard - + Save Changes