diff --git a/Data/Server/WebUI/src/Devices/Device_Details.jsx b/Data/Server/WebUI/src/Devices/Device_Details.jsx
index b103856..115c00f 100644
--- a/Data/Server/WebUI/src/Devices/Device_Details.jsx
+++ b/Data/Server/WebUI/src/Devices/Device_Details.jsx
@@ -13,6 +13,9 @@ import {
TableCell,
TableBody,
Button,
+ IconButton,
+ Menu,
+ MenuItem,
LinearProgress,
TableSortLabel,
TextField,
@@ -21,6 +24,8 @@ import {
DialogContent,
DialogActions
} from "@mui/material";
+import MoreHorizIcon from "@mui/icons-material/MoreHoriz";
+import { ClearDeviceActivityDialog } from "../Dialogs.jsx";
import Prism from "prismjs";
import "prismjs/components/prism-yaml";
import "prismjs/components/prism-bash";
@@ -46,6 +51,8 @@ export default function DeviceDetails({ device, onBack }) {
const [outputContent, setOutputContent] = useState("");
const [outputLang, setOutputLang] = useState("powershell");
const [quickJobOpen, setQuickJobOpen] = useState(false);
+ const [menuAnchor, setMenuAnchor] = useState(null);
+ const [clearDialogOpen, setClearDialogOpen] = useState(false);
// Snapshotted status for the lifetime of this page
const [lockedStatus, setLockedStatus] = useState(() => {
// Prefer status provided by the device list row if available
@@ -124,6 +131,17 @@ export default function DeviceDetails({ device, onBack }) {
useEffect(() => { loadHistory(); }, [loadHistory]);
+ const clearHistory = async () => {
+ if (!device?.hostname) return;
+ try {
+ const resp = await fetch(`/api/device/activity/${encodeURIComponent(device.hostname)}`, { method: "DELETE" });
+ if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
+ setHistoryRows([]);
+ } catch (e) {
+ console.warn("Failed to clear activity history", e);
+ }
+ };
+
const saveDescription = async () => {
if (!details.summary?.hostname) return;
try {
@@ -699,19 +717,43 @@ export default function DeviceDetails({ device, onBack }) {
-
+
+
+
- {quickJobOpen && (
- setQuickJobOpen(false)}
- hostnames={[agent?.hostname || device?.hostname].filter(Boolean)}
+ setClearDialogOpen(false)}
+ onConfirm={() => {
+ clearHistory();
+ setClearDialogOpen(false);
+ }}
/>
- )}
-
- );
-}
+
+ {quickJobOpen && (
+ setQuickJobOpen(false)}
+ hostnames={[agent?.hostname || device?.hostname].filter(Boolean)}
+ />
+ )}
+
+ );
+ }
diff --git a/Data/Server/WebUI/src/Dialogs.jsx b/Data/Server/WebUI/src/Dialogs.jsx
index 1aab8e0..49aed0b 100644
--- a/Data/Server/WebUI/src/Dialogs.jsx
+++ b/Data/Server/WebUI/src/Dialogs.jsx
@@ -207,6 +207,23 @@ export function NewWorkflowDialog({ open, value, onChange, onCancel, onCreate })
);
}
+export function ClearDeviceActivityDialog({ open, onCancel, onConfirm }) {
+ return (
+
+ );
+}
+
export function SaveWorkflowDialog({ open, value, onChange, onCancel, onSave }) {
return (