ed7a7a5ce0
PR 4 of 4 for configurable dashboard widgets. - Replace hard-coded Jellyfin/Backups dashboard sections with a loop that renders enabled widget instances by sort_order. - Add WidgetInstance renderer and WidgetConfigDialog for adding, editing, enabling/disabling, deleting, and reordering widgets. - Add addon pages for grafana, prometheus, and ssh-tasks at /addons/:addonId. - Register /addons/:addonId route in App.tsx. - Update docs/REQUIREMENTS.md with the widget system design and API. Verification: - backend ruff clean; pytest 200 passed - frontend npm run lint: 0 errors - frontend npm run build: success - frontend npm run test -- src/widgets/registry.test.ts: 3 passed
30 lines
866 B
TypeScript
30 lines
866 B
TypeScript
import { Terminal } from "lucide-react";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { useNavigate } from "react-router-dom";
|
|
|
|
export function SshTasksAddonPage() {
|
|
const navigate = useNavigate();
|
|
|
|
return (
|
|
<div className="flex flex-col gap-4">
|
|
<h2 className="text-xl font-semibold">SSH tasks</h2>
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Saved actions</CardTitle>
|
|
</CardHeader>
|
|
<CardContent className="flex flex-col gap-3">
|
|
<p className="text-sm text-muted-foreground">
|
|
Create, edit, and run saved shell or Python tasks against local
|
|
or remote machines.
|
|
</p>
|
|
<Button onClick={() => navigate("/actions")}>
|
|
<Terminal className="mr-2 h-4 w-4" />
|
|
Open Actions
|
|
</Button>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
);
|
|
}
|