From b5096792749b57755ebb3a76738488187657efdb Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Mon, 20 Jul 2026 18:06:34 +0200 Subject: [PATCH] fix(custom-widgets): surface save validation errors --- .../custom-widgets/_custom-widget-form.tsx | 19 ++++++- .../_custom-widget-save-errors.spec.ts | 57 +++++++++++++++++++ .../_custom-widget-save-errors.ts | 54 ++++++++++++++++++ .../_use-custom-widget-form-actions.ts | 55 ++++++++++++++++-- packages/translation/src/lang/en.json | 5 ++ 5 files changed, 182 insertions(+), 8 deletions(-) create mode 100644 apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-save-errors.spec.ts create mode 100644 apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-save-errors.ts diff --git a/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx b/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx index 7c9db4577..99d4e38ce 100644 --- a/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useMemo, useRef, useState } from "react"; -import { Box, Button, Paper, SegmentedControl, Stack, TextInput, Textarea } from "@mantine/core"; +import { Alert, Box, Button, List, Paper, SegmentedControl, Stack, Text, TextInput, Textarea } from "@mantine/core"; import { IconAlertCircle, IconApi, @@ -119,7 +119,7 @@ export function CustomWidgetForm({ mode, initialValues, definitionId }: CustomWi [candidate, requestDiagnostics, templateDiagnostics], ); - const { save, runPreview, pasteAiResponse, copyDiagnostics, savePending, previewPending } = + const { save, runPreview, pasteAiResponse, copyDiagnostics, saveIssues, savePending, previewPending } = useCustomWidgetFormActions({ mode, definitionId, @@ -164,6 +164,21 @@ export function CustomWidgetForm({ mode, initialValues, definitionId }: CustomWi { value: "preview", label: w("section.preview") }, ]} /> + {saveIssues.length > 0 && ( + }> + + {w("saveError.description")} + + + {saveIssues.map((issue, index) => ( + + {issue.path ? `${issue.path}: ` : ""} + {issue.message} + + ))} + + + )}