From a6566f74c9ae3c8db25c9ae5c54872faebb87809 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Wed, 27 May 2026 15:53:14 +0200 Subject: [PATCH] fix: address PR review feedback - Show error notification on setup failure instead of silent reset - Fix toggleKind stale closure by using prop array directly - Remove duplicate translations from en-gb.json (falls back to en.json) - Align seed board columnCount to 12 (codebase default) - Extract shared placeAllWidgetsAsync helper to @homarr/db/queries - Remove redundant onboardingFormSchema; reuse formSchema for both paths - Fix lint errors (optional chain, unused imports, unnecessary conditions) --- .../integrations/docker-discovery-panel.tsx | 28 ++-- .../_steps/integrations/init-integrations.tsx | 37 +++-- .../new/_integration-new-form.tsx | 13 +- .../integration/integration-grid-shared.ts | 4 +- .../integration-multi-select-grid.tsx | 17 +- .../api/src/router/onboard/onboard-router.ts | 153 ++---------------- packages/db/migrations/seed.ts | 117 ++------------ packages/db/queries/index.ts | 1 + packages/db/queries/widget-placement.ts | 148 +++++++++++++++++ .../src/docker-integration-match.ts | 3 +- .../src/integration-url-template.ts | 3 +- packages/definitions/src/integration.ts | 2 +- .../definitions/src/test/api-key-url.spec.ts | 4 +- packages/translation/src/lang/en-gb.json | 37 ----- packages/translation/src/lang/en.json | 4 + 15 files changed, 233 insertions(+), 338 deletions(-) create mode 100644 packages/db/queries/widget-placement.ts diff --git a/apps/nextjs/src/app/[locale]/init/_steps/integrations/docker-discovery-panel.tsx b/apps/nextjs/src/app/[locale]/init/_steps/integrations/docker-discovery-panel.tsx index 83320184c..1756fd12d 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/integrations/docker-discovery-panel.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/integrations/docker-discovery-panel.tsx @@ -14,7 +14,7 @@ import { ThemeIcon, UnstyledButton, } from "@mantine/core"; -import { IconChevronDown, IconBrandDocker } from "@tabler/icons-react"; +import { IconBrandDocker, IconChevronDown } from "@tabler/icons-react"; import type { IntegrationKind } from "@homarr/definitions"; import { getIntegrationName } from "@homarr/definitions"; @@ -128,21 +128,17 @@ export const DockerDiscoveryIndicator = ({ onChange={() => onToggleAllApps(!appsEnabled)} styles={{ label: { fontSize: "var(--mantine-font-size-xs)" } }} /> - {appsEnabled && apps.map((app) => ( - - - {app.containerName.at(0)?.toUpperCase()} - - - {app.containerName} - - - ))} + {appsEnabled && + apps.map((app) => ( + + + {app.containerName.at(0)?.toUpperCase()} + + + {app.containerName} + + + ))} )} diff --git a/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx b/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx index f6302e5ab..f733b7097 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/integrations/init-integrations.tsx @@ -21,15 +21,14 @@ import { useDisclosure } from "@mantine/hooks"; import { IconArrowRight, IconSettings } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; -import type { IntegrationKind } from "@homarr/definitions"; +import type { IntegrationKind, UrlTemplateMode } from "@homarr/definitions"; import { buildIntegrationUrl, getIntegrationName } from "@homarr/definitions"; -import type { UrlTemplateMode } from "@homarr/definitions"; +import { showErrorNotification } from "@homarr/notifications"; import { useScopedI18n } from "@homarr/translation/client"; import { IntegrationAvatar } from "@homarr/ui"; import { NewIntegrationForm } from "~/app/[locale]/manage/integrations/new/_integration-new-form"; import { IntegrationMultiSelectGrid } from "~/components/integration/integration-multi-select-grid"; - import { DockerDiscoveryIndicator } from "./docker-discovery-panel"; type Phase = "select" | "configure" | "done"; @@ -69,7 +68,7 @@ export const InitIntegrations = () => { const dockerApplied = useRef(false); useEffect(() => { - if (!dockerData || dockerData.status !== "success" || dockerApplied.current) return; + if (dockerData?.status !== "success" || dockerApplied.current) return; dockerApplied.current = true; const newDrafts = new Map(drafts); @@ -132,6 +131,10 @@ export const InitIntegrations = () => { await setupIntegrations(); router.refresh(); } catch { + showErrorNotification({ + title: t("configure.error.title"), + message: t("configure.error.message"), + }); setPhase("select"); } }; @@ -192,7 +195,9 @@ export const InitIntegrations = () => { /> - {t("urlTemplate.label")} + + {t("urlTemplate.label")} + { - +