Files
Termix/src/ui/features/homepage/dialogs/WidgetEditDialog.tsx
T

379 lines
12 KiB
TypeScript
Raw Normal View History

2026-06-29 13:28:26 -05:00
import { useState } from "react";
import { useTranslation } from "react-i18next";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogFooter,
} from "@/components/dialog";
import { Button } from "@/components/button";
import { Input } from "@/components/input";
import type {
CanvasWidget,
ServiceLinkConfig,
FolderConfig,
NotesConfig,
BookmarkListConfig,
ClockConfig,
HostStatusConfig,
WeatherConfig,
IframeConfig,
RssFeedConfig,
MetricsChartConfig,
HostGridConfig,
AlertFeedConfig,
PingStatusConfig,
RecentActivityConfig,
TermixUptimeConfig,
SystemOverviewConfig,
SshTerminalConfig,
QuickConnectConfig,
FileManagerWidgetConfig,
DockerWidgetConfig,
TunnelWidgetConfig,
CalendarConfig,
CountdownConfig,
SearchBarConfig,
TextBannerConfig,
ImageWidgetConfig,
MarkdownNotesConfig,
CustomApiConfig,
ServiceGridConfig,
DashboardLinksConfig,
SearchLinksConfig,
LinkTreeConfig,
} from "@/types/homepage-types";
import { ServiceLinkEditForm } from "./ServiceLinkEditForm";
import { FolderEditForm } from "./FolderEditForm";
import { NotesEditForm } from "./NotesEditForm";
import { BookmarkListEditForm } from "./BookmarkListEditForm";
import { ClockEditForm } from "./ClockEditForm";
import { HostStatusEditForm } from "./HostStatusEditForm";
import { WeatherEditForm } from "./WeatherEditForm";
import { IframeEditForm } from "./IframeEditForm";
import { RssFeedEditForm } from "./RssFeedEditForm";
import { MetricsChartEditForm } from "./MetricsChartEditForm";
import { HostGridEditForm } from "./HostGridEditForm";
import { AlertFeedEditForm } from "./AlertFeedEditForm";
import { PingStatusEditForm } from "./PingStatusEditForm";
import { RecentActivityEditForm } from "./RecentActivityEditForm";
import { TermixUptimeEditForm } from "./TermixUptimeEditForm";
import { SystemOverviewEditForm } from "./SystemOverviewEditForm";
import { SshTerminalEditForm } from "./SshTerminalEditForm";
import { QuickConnectEditForm } from "./QuickConnectEditForm";
import { FileManagerWidgetEditForm } from "./FileManagerWidgetEditForm";
import { DockerWidgetEditForm } from "./DockerWidgetEditForm";
import { TunnelWidgetEditForm } from "./TunnelWidgetEditForm";
import { CalendarEditForm } from "./CalendarEditForm";
import { CountdownEditForm } from "./CountdownEditForm";
import { SearchBarEditForm } from "./SearchBarEditForm";
import { TextBannerEditForm } from "./TextBannerEditForm";
import { ImageWidgetEditForm } from "./ImageWidgetEditForm";
import { MarkdownNotesEditForm } from "./MarkdownNotesEditForm";
import { CustomApiEditForm } from "./CustomApiEditForm";
import { ServiceGridEditForm } from "./ServiceGridEditForm";
import { DashboardLinksEditForm } from "./DashboardLinksEditForm";
import { SearchLinksEditForm } from "./SearchLinksEditForm";
import { LinkTreeEditForm } from "./LinkTreeEditForm";
interface WidgetEditDialogProps {
widget: CanvasWidget | null;
onSave: (
id: number,
title: string | null,
config: Record<string, unknown>,
) => void;
onClose: () => void;
}
export function WidgetEditDialog({
widget,
onSave,
onClose,
}: WidgetEditDialogProps) {
const { t } = useTranslation();
const [title, setTitle] = useState(widget?.title ?? "");
const [config, setConfig] = useState<Record<string, unknown>>(
widget?.config ?? {},
);
if (!widget) return null;
const handleSave = () => {
onSave(widget.id, title || null, config);
onClose();
};
const renderForm = () => {
switch (widget.typeId) {
case "service_link":
return (
<ServiceLinkEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as ServiceLinkConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "folder":
return (
<FolderEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as FolderConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "notes":
return (
<NotesEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as NotesConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "bookmark_list":
return (
<BookmarkListEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as BookmarkListConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "clock":
return (
<ClockEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as ClockConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "host_status":
return (
<HostStatusEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as HostStatusConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "weather":
return (
<WeatherEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as WeatherConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "iframe_embed":
return (
<IframeEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as IframeConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "rss_feed":
return (
<RssFeedEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as RssFeedConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "metrics_chart":
return (
<MetricsChartEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as MetricsChartConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "host_grid":
return (
<HostGridEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as HostGridConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "alert_feed":
return (
<AlertFeedEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as AlertFeedConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "ping_status":
return (
<PingStatusEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as PingStatusConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "recent_activity":
return (
<RecentActivityEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as RecentActivityConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "termix_uptime":
return (
<TermixUptimeEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as TermixUptimeConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "system_overview":
return (
<SystemOverviewEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as SystemOverviewConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "ssh_terminal":
return (
<SshTerminalEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as SshTerminalConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "quick_connect":
return (
<QuickConnectEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as QuickConnectConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "file_manager_widget":
return (
<FileManagerWidgetEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as FileManagerWidgetConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "docker_widget":
return (
<DockerWidgetEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as DockerWidgetConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "tunnel_widget":
return (
<TunnelWidgetEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as TunnelWidgetConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "calendar":
return (
<CalendarEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as CalendarConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "countdown":
return (
<CountdownEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as CountdownConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "search_bar":
return (
<SearchBarEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as SearchBarConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "text_banner":
return (
<TextBannerEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as TextBannerConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "image_widget":
return (
<ImageWidgetEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as ImageWidgetConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "markdown_notes":
return (
<MarkdownNotesEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as MarkdownNotesConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "custom_api":
return (
<CustomApiEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as CustomApiConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "service_grid":
return (
<ServiceGridEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as ServiceGridConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "dashboard_links":
return (
<DashboardLinksEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as DashboardLinksConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "search_links":
return (
<SearchLinksEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as SearchLinksConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
case "link_tree":
return (
<LinkTreeEditForm
+5
2026-08-19 14:12:06 -05:00
config={config as unknown as LinkTreeConfig}
2026-06-29 13:28:26 -05:00
onChange={(c) => setConfig(c as unknown as Record<string, unknown>)}
/>
);
default:
return null;
}
};
return (
<Dialog
open={!!widget}
onOpenChange={(open) => {
if (!open) onClose();
}}
>
<DialogContent
className="max-w-sm"
onMouseDown={(e) => e.stopPropagation()}
>
<DialogHeader>
<DialogTitle>{t("homepage.editWidget")}</DialogTitle>
</DialogHeader>
<div className="flex flex-col gap-4">
<div className="flex flex-col gap-1">
<label className="text-xs font-medium text-muted-foreground">
{t("homepage.title_label")}
</label>
<Input
value={title}
onChange={(e) => setTitle(e.target.value)}
placeholder={t("homepage.widgetTitlePlaceholder")}
className="h-8 text-sm"
/>
</div>
{renderForm()}
</div>
<DialogFooter>
<Button variant="outline" size="sm" onClick={onClose}>
{t("homepage.cancel")}
</Button>
<Button size="sm" onClick={handleSave}>
{t("homepage.save")}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}