From d317cacbe83394dd3f6de3e74b53f683654e91d1 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Tue, 2 Sep 2025 21:53:57 +0200 Subject: [PATCH] feat(widget): show name in edit modal (#3970) --- .../app/[locale]/widgets/[kind]/_content.tsx | 39 +++++++----- .../src/components/board/items/item-menu.tsx | 63 ++++++++++--------- 2 files changed, 58 insertions(+), 44 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx b/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx index 836800fa7..1dc7ac894 100644 --- a/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx +++ b/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx @@ -10,7 +10,7 @@ import type { IntegrationKind, WidgetKind } from "@homarr/definitions"; import { useModalAction } from "@homarr/modals"; import { showSuccessNotification } from "@homarr/notifications"; import { useSettings } from "@homarr/settings"; -import { useScopedI18n } from "@homarr/translation/client"; +import { useI18n } from "@homarr/translation/client"; import type { BoardItemAdvancedOptions } from "@homarr/validation/shared"; import { loadWidgetDynamic, reduceWidgetOptionsWithDefaultValues, widgetImports } from "@homarr/widgets"; import { WidgetError } from "@homarr/widgets/errors"; @@ -31,7 +31,7 @@ interface WidgetPreviewPageContentProps { export const WidgetPreviewPageContent = ({ kind, integrationData }: WidgetPreviewPageContentProps) => { const settings = useSettings(); - const t = useScopedI18n("widgetPreview"); + const t = useI18n(); const { openModal: openWidgetEditModal } = useModalAction(WidgetEditModal); const { openModal: openPreviewDimensionsModal } = useModalAction(PreviewDimensionsModal); const currentDefinition = useMemo(() => widgetImports[kind].definition, [kind]); @@ -55,20 +55,27 @@ export const WidgetPreviewPageContent = ({ kind, integrationData }: WidgetPrevie }); const handleOpenEditWidgetModal = useCallback(() => { - openWidgetEditModal({ - kind, - value: state, - onSuccessfulEdit: (value) => { - setState(value); + openWidgetEditModal( + { + kind, + value: state, + onSuccessfulEdit: (value) => { + setState(value); + }, + integrationData: integrationData.filter( + (integration) => + "supportedIntegrations" in currentDefinition && + (currentDefinition.supportedIntegrations as string[]).some((kind) => kind === integration.kind), + ), + integrationSupport: "supportedIntegrations" in currentDefinition, + settings, }, - integrationData: integrationData.filter( - (integration) => - "supportedIntegrations" in currentDefinition && - (currentDefinition.supportedIntegrations as string[]).some((kind) => kind === integration.kind), - ), - integrationSupport: "supportedIntegrations" in currentDefinition, - settings, - }); + { + title(t) { + return `${t("item.edit.title")} - ${t(`widget.${kind}.name`)}`; + }, + }, + ); }, [currentDefinition, integrationData, kind, openWidgetEditModal, settings, state]); const Comp = loadWidgetDynamic(kind); @@ -76,7 +83,7 @@ export const WidgetPreviewPageContent = ({ kind, integrationData }: WidgetPrevie const toggleEditMode = useCallback(() => { setEditMode((editMode) => !editMode); showSuccessNotification({ - message: editMode ? t("toggle.disabled") : t("toggle.enabled"), + message: editMode ? t("widgetPreview.toggle.disabled") : t("widgetPreview.toggle.enabled"), }); }, [editMode, t]); diff --git a/apps/nextjs/src/components/board/items/item-menu.tsx b/apps/nextjs/src/components/board/items/item-menu.tsx index e7072fea4..2279755bf 100644 --- a/apps/nextjs/src/components/board/items/item-menu.tsx +++ b/apps/nextjs/src/components/board/items/item-menu.tsx @@ -49,36 +49,43 @@ export const BoardItemMenu = ({ if (!isEditMode || isPending) return null; const openEditModal = () => { - openModal({ - kind: item.kind, - value: { - advancedOptions: item.advancedOptions, - options: item.options, - integrationIds: item.integrationIds, + openModal( + { + kind: item.kind, + value: { + advancedOptions: item.advancedOptions, + options: item.options, + integrationIds: item.integrationIds, + }, + onSuccessfulEdit: ({ options, integrationIds, advancedOptions }) => { + updateItemOptions({ + itemId: item.id, + newOptions: options, + }); + updateItemAdvancedOptions({ + itemId: item.id, + newAdvancedOptions: advancedOptions, + }); + updateItemIntegrations({ + itemId: item.id, + newIntegrations: integrationIds, + }); + refResetErrorBoundaryOnNextRender.current = true; + }, + integrationData: (integrationData ?? []).filter( + (integration) => + "supportedIntegrations" in currentDefinition && + (currentDefinition.supportedIntegrations as string[]).some((kind) => kind === integration.kind), + ), + integrationSupport: "supportedIntegrations" in currentDefinition, + settings, }, - onSuccessfulEdit: ({ options, integrationIds, advancedOptions }) => { - updateItemOptions({ - itemId: item.id, - newOptions: options, - }); - updateItemAdvancedOptions({ - itemId: item.id, - newAdvancedOptions: advancedOptions, - }); - updateItemIntegrations({ - itemId: item.id, - newIntegrations: integrationIds, - }); - refResetErrorBoundaryOnNextRender.current = true; + { + title(t) { + return `${t("item.edit.title")} - ${t(`widget.${item.kind}.name`)}`; + }, }, - integrationData: (integrationData ?? []).filter( - (integration) => - "supportedIntegrations" in currentDefinition && - (currentDefinition.supportedIntegrations as string[]).some((kind) => kind === integration.kind), - ), - integrationSupport: "supportedIntegrations" in currentDefinition, - settings, - }); + ); }; const openRemoveModal = () => {