import { useState } from "react"; import { getWidgetType } from "../widgets/WidgetRegistry"; import { useTranslation } from "@termix/plugin-sdk/frontend"; import { Button, Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, Input, } from "@termix/plugin-sdk/ui"; import type { CanvasWidget, ServiceLinkConfig, FolderConfig, NotesConfig, BookmarkListConfig, ClockConfig, HostStatusConfig, WeatherConfig, IframeConfig, RssFeedConfig, HostGridConfig, PingStatusConfig, RecentActivityConfig, TermixUptimeConfig, SystemOverviewConfig, SshTerminalConfig, QuickConnectConfig, CalendarConfig, CountdownConfig, SearchBarConfig, TextBannerConfig, ImageWidgetConfig, MarkdownNotesConfig, CustomApiConfig, ServiceGridConfig, DashboardLinksConfig, SearchLinksConfig, LinkTreeConfig, } from "../types.js"; 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 { HostGridEditForm } from "./HostGridEditForm"; 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 { 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"; import { validateClockTimezone } from "../clock-timezone"; interface WidgetEditDialogProps { widget: CanvasWidget | null; onSave: ( id: number, title: string | null, config: Record, ) => void; onClose: () => void; } export function WidgetEditDialog({ widget, onSave, onClose, }: WidgetEditDialogProps) { const { t } = useTranslation(); const [title, setTitle] = useState(widget?.title ?? ""); const [config, setConfig] = useState>( widget?.config ?? {}, ); if (!widget) return null; // Configs that need checking before they can be stored. The clock keeps the // normalized zone rather than the raw input, so "America/New York" is filed // as "America/New_York"; the form flags an unusable one and Save stays off. const clockTimezone = widget.typeId === "clock" ? validateClockTimezone(config.timezone) : null; const configInvalid = clockTimezone ? !clockTimezone.valid : false; const handleSave = () => { if (configInvalid) return; onSave( widget.id, title || null, clockTimezone ? { ...config, timezone: clockTimezone.timezone } : config, ); onClose(); }; const renderForm = () => { switch (widget.typeId) { case "service_link": return ( setConfig(c as unknown as Record)} /> ); case "folder": return ( setConfig(c as unknown as Record)} /> ); case "notes": return ( setConfig(c as unknown as Record)} /> ); case "bookmark_list": return ( setConfig(c as unknown as Record)} /> ); case "clock": return ( setConfig(c as unknown as Record)} /> ); case "host_status": return ( setConfig(c as unknown as Record)} /> ); case "weather": return ( setConfig(c as unknown as Record)} /> ); case "iframe_embed": return ( setConfig(c as unknown as Record)} /> ); case "rss_feed": return ( setConfig(c as unknown as Record)} /> ); case "host_grid": return ( setConfig(c as unknown as Record)} /> ); case "ping_status": return ( setConfig(c as unknown as Record)} /> ); case "recent_activity": return ( setConfig(c as unknown as Record)} /> ); case "termix_uptime": return ( setConfig(c as unknown as Record)} /> ); case "system_overview": return ( setConfig(c as unknown as Record)} /> ); case "ssh_terminal": return ( setConfig(c as unknown as Record)} /> ); case "quick_connect": return ( setConfig(c as unknown as Record)} /> ); case "calendar": return ( setConfig(c as unknown as Record)} /> ); case "countdown": return ( setConfig(c as unknown as Record)} /> ); case "search_bar": return ( setConfig(c as unknown as Record)} /> ); case "text_banner": return ( setConfig(c as unknown as Record)} /> ); case "image_widget": return ( setConfig(c as unknown as Record)} /> ); case "markdown_notes": return ( setConfig(c as unknown as Record)} /> ); case "custom_api": return ( setConfig(c as unknown as Record)} /> ); case "service_grid": return ( setConfig(c as unknown as Record)} /> ); case "dashboard_links": return ( setConfig(c as unknown as Record)} /> ); case "search_links": return ( setConfig(c as unknown as Record)} /> ); case "link_tree": return ( setConfig(c as unknown as Record)} /> ); default: { // Plugin widgets bring their own form. const EditForm = getWidgetType(widget.typeId)?.editFormComponent; return EditForm ? ( ) : null; } } }; return ( { if (!open) onClose(); }} > e.stopPropagation()} > {t("homepage.editWidget")}
setTitle(e.target.value)} placeholder={t("homepage.widgetTitlePlaceholder")} className="h-8 text-sm" />
{renderForm()}
); }