From 235cfa3660b88f4fc28b76eac068abe1d157b0cd Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 13 Dec 2023 10:24:26 +0000 Subject: [PATCH] Mutate state when working with form steps to prevent latency issues --- .../controls/FormStepConfiguration.svelte | 9 +- .../app/blocks/MultiStepFormblock.svelte | 161 +++++++++--------- 2 files changed, 91 insertions(+), 79 deletions(-) diff --git a/packages/builder/src/components/design/settings/controls/FormStepConfiguration.svelte b/packages/builder/src/components/design/settings/controls/FormStepConfiguration.svelte index b6f30a875e..e19a8df608 100644 --- a/packages/builder/src/components/design/settings/controls/FormStepConfiguration.svelte +++ b/packages/builder/src/components/design/settings/controls/FormStepConfiguration.svelte @@ -97,7 +97,8 @@ } const addStep = () => { - dispatch("change", value.toSpliced($currentStep + 1, 0, {})) + value = value.toSpliced($currentStep + 1, 0, {}) + dispatch("change", value) multiStepStore.update(state => ({ ...state, currentStep: $currentStep + 1, @@ -105,7 +106,8 @@ } const removeStep = () => { - dispatch("change", value.toSpliced($currentStep, 1)) + value = value.toSpliced($currentStep, 1) + dispatch("change", value) multiStepStore.update(state => ({ ...state, currentStep: Math.min($currentStep, stepCount - 2), @@ -131,7 +133,8 @@ ...value[$currentStep], [field.key]: val, } - dispatch("change", value.toSpliced($currentStep, 1, newStep)) + value = value.toSpliced($currentStep, 1, newStep) + dispatch("change", value) } const handleStepAction = action => { diff --git a/packages/client/src/components/app/blocks/MultiStepFormblock.svelte b/packages/client/src/components/app/blocks/MultiStepFormblock.svelte index 5742df92fe..db7d31eef1 100644 --- a/packages/client/src/components/app/blocks/MultiStepFormblock.svelte +++ b/packages/client/src/components/app/blocks/MultiStepFormblock.svelte @@ -5,7 +5,6 @@ import { builderStore } from "stores" import { Utils } from "@budibase/frontend-core" - export let componentInstance export let steps export let dataSource export let initialFormStep = 1 @@ -33,30 +32,42 @@ $: fetchSchema(dataSource) $: enrichedSteps = enrichSteps(steps, schema, $component.id) - $: currentStep = getCurrentStep($builderStore, $component) + $: currentStep = getCurrentStep(enrichedSteps, $builderStore, $component) - const getCurrentStep = (builderStore, component) => { + const getCurrentStep = (steps, builderStore, component) => { + const { componentId, step } = builderStore.metadata || {} + + // If we aren't in the builder or aren't selected then don't return a form + // step at all. This will let the form component take over state for which + // step is active. if ( !component.selected || !builderStore.inBuilder || - builderStore.metadata?.componentId !== component.id + componentId !== component.id ) { return null } - return (builderStore.metadata.step || 0) + 1 + + // Ensure we have a valid step selected + let currentStep = Math.min(step || 0, steps.length - 1) + + // Sanity check + currentStep = Math.max(currentStep, 0) + + // Add 1 because the form component expects 1 indexed rather than 0 indexed + return currentStep + 1 } const getPropsForField = field => { - return field._component - ? { - ...field, - } - : { - field: field.name, - label: field.name, - placeholder: field.name, - _instanceName: field.name, - } + if (field._component) { + return field + } + return { + field: field.name, + label: field.name, + placeholder: field.name, + _instanceName: field.name, + } } const getComponentForField = field => { @@ -102,69 +113,67 @@ } -{#key enrichedSteps} - - - {#each enrichedSteps as step, idx} + + + {#each enrichedSteps as step, idx} + - - - - - - - {#each step.fields as field, fieldIdx} - {#if getComponentForField(field)} - - {/if} - {/each} - - + + + + + {#each step.fields as field, fieldIdx} + {#if getComponentForField(field)} + + {/if} + {/each} + + - {/each} - - -{/key} + + {/each} + +