From 030a217da358595f7e3191cb63dd4d17c2e0e342 Mon Sep 17 00:00:00 2001 From: philon- Date: Sun, 15 Jun 2025 19:57:47 +0200 Subject: [PATCH] Form reset adjustments --- .../PageComponents/ModuleConfig/MQTT.tsx | 21 ++++-- src/pages/Config/index.tsx | 65 +++++++++++-------- src/validation/moduleConfig/mqtt.ts | 4 +- 3 files changed, 55 insertions(+), 35 deletions(-) diff --git a/src/components/PageComponents/ModuleConfig/MQTT.tsx b/src/components/PageComponents/ModuleConfig/MQTT.tsx index a755ae2a..6b6f4abd 100644 --- a/src/components/PageComponents/ModuleConfig/MQTT.tsx +++ b/src/components/PageComponents/ModuleConfig/MQTT.tsx @@ -50,19 +50,26 @@ export const MQTT = ({ onFormInit }: MqttModuleConfigProps) => { ); }; + const populateDefaultValues = ( + cfg: Protobuf.ModuleConfig.ModuleConfig_MQTTConfig | undefined, + ) => { + return cfg + ? { + ...cfg, + mapReportSettings: cfg.mapReportSettings ?? + { publishIntervalSecs: 0, positionPrecision: 10 }, + } + : undefined; + }; + return ( onSubmit={onSubmit} onFormInit={onFormInit} validationSchema={MqttValidationSchema} formId="ModuleConfig_MqttConfig" - defaultValues={moduleConfig.mqtt} - values={(() => { - const cfg = getEffectiveModuleConfig("mqtt"); - return cfg - ? { ...cfg, mapReportSettings: cfg.mapReportSettings ?? {} } - : undefined; - })()} + defaultValues={populateDefaultValues(moduleConfig.mqtt)} + values={populateDefaultValues(getEffectiveModuleConfig("mqtt"))} fieldGroups={[ { label: t("mqtt.title"), diff --git a/src/pages/Config/index.tsx b/src/pages/Config/index.tsx index f71ab058..98725b0f 100644 --- a/src/pages/Config/index.tsx +++ b/src/pages/Config/index.tsx @@ -27,6 +27,8 @@ const ConfigPage = () => { connection, removeWorkingConfig, removeWorkingModuleConfig, + setConfig, + setModuleConfig, } = useDevice(); const { hasErrors } = useAppStore(); @@ -35,9 +37,7 @@ const ConfigPage = () => { >("device"); const [isSaving, setIsSaving] = useState(false); const [formMethods, setFormMethods] = useState(null); - const { toast } = useToast(); - const isError = hasErrors(); const { t } = useTranslation("deviceConfig"); const onFormInit = (methods: UseFormReturn) => { @@ -51,33 +51,30 @@ const ConfigPage = () => { description: t("toast.validationError.description"), }); } - if ( - (activeConfigSection === "device" && workingConfig.length === 0) || - (activeConfigSection === "module" && workingModuleConfig.length === 0) - ) return; setIsSaving(true); + try { await Promise.all( - workingConfig.map((config) => - connection?.setConfig(config).then(() => + workingConfig.map((newConfig) => + connection?.setConfig(newConfig).then(() => { toast({ title: t("toast.saveSuccess.title"), description: t("toast.saveSuccess.description", { - case: config.payloadVariant.case, + case: newConfig.payloadVariant.case, }), - }) - ) + }); + }) ), ); await Promise.all( - workingModuleConfig.map((moduleConfig) => - connection?.setModuleConfig(moduleConfig).then(() => + workingModuleConfig.map((newModuleConfig) => + connection?.setModuleConfig(newModuleConfig).then(() => toast({ title: t("toast.saveSuccess.title"), description: t("toast.saveSuccess.description", { - case: moduleConfig.payloadVariant.case, + case: newModuleConfig.payloadVariant.case, }), }) ) @@ -85,16 +82,19 @@ const ConfigPage = () => { ); await connection?.commitEditSettings().then(() => { - removeWorkingConfig(); - removeWorkingModuleConfig(); - if (formMethods) { - formMethods.reset({ - keepDefaultValues: true, - keepDirty: false, - keepDirtyValues: true, + formMethods.reset({}, { + keepValues: true, }); } + + workingConfig.map((newConfig) => setConfig(newConfig)); + workingModuleConfig.map((newModuleConfig) => + setModuleConfig(newModuleConfig) + ); + + removeWorkingConfig(); + removeWorkingModuleConfig(); }); } catch (_error) { toast({ @@ -145,13 +145,23 @@ const ConfigPage = () => { ); const buttonOpacity = useMemo( - () => (formMethods?.formState.isDirty || + () => (formMethods?.formState.isDirty && + Object.keys(formMethods?.formState.dirtyFields ?? {}).length > 0 || workingConfig.length > 0 || workingModuleConfig.length > 0 ? "opacity-100" : "opacity-0"), - [formMethods?.formState.isDirty, workingConfig, workingModuleConfig], + [ + formMethods?.formState.isDirty, + formMethods?.formState.dirtyFields, + workingConfig, + workingModuleConfig, + ], ); + const isValid = useMemo(() => { + return Object.keys(formMethods?.formState.errors ?? {}).length === 0; + }, [formMethods?.formState.errors]); + const actions = useMemo(() => [ { key: "unsavedChanges", @@ -172,19 +182,22 @@ const ConfigPage = () => { }, { key: "save", - icon: isError ? SaveOff : SaveIcon, + icon: !isValid ? SaveOff : SaveIcon, isLoading: isSaving, disabled: isSaving || + !isValid || (workingConfig.length === 0 && workingModuleConfig.length === 0), - iconClasses: isError ? "text-red-400 cursor-not-allowed" : "", + iconClasses: !isValid ? "text-red-400 cursor-not-allowed" : "", onClick: handleSave, label: t("common:button.save"), }, ], [ activeConfigSection, - isError, isSaving, + isValid, buttonOpacity, + workingConfig, + workingModuleConfig, ]); return ( diff --git a/src/validation/moduleConfig/mqtt.ts b/src/validation/moduleConfig/mqtt.ts index 638f076f..fe47c93d 100644 --- a/src/validation/moduleConfig/mqtt.ts +++ b/src/validation/moduleConfig/mqtt.ts @@ -1,8 +1,8 @@ import { z } from "zod/v4"; export const MqttValidationMapReportSettingsSchema = z.object({ - publishIntervalSecs: z.number().optional(), - positionPrecision: z.number().optional(), + publishIntervalSecs: z.coerce.number().int(), + positionPrecision: z.coerce.number().int(), }); export const MqttValidationSchema = z.object({