feat: Add local system override with 24h timeout support
This commit is contained in:
@@ -192,6 +192,54 @@ export default function NodeDetailPage() {
|
||||
<StatusBadge status={node.status} />
|
||||
</div>
|
||||
|
||||
{/* Override Warning */}
|
||||
{node.is_overridden && (
|
||||
<div className="bg-yellow-950/40 border border-yellow-800/60 rounded-lg p-4 font-mono text-sm space-y-3">
|
||||
<div className="flex items-center gap-2 text-yellow-400 font-semibold">
|
||||
<span className="text-base">⚠</span>
|
||||
<span>Local System Override Active</span>
|
||||
</div>
|
||||
<p className="text-gray-400 text-xs leading-relaxed">
|
||||
This node is operating on a local system override.
|
||||
{node.override_timeout_at ? (
|
||||
<> Resets automatically on: <span className="text-white font-bold">{new Date(node.override_timeout_at).toLocaleString()}</span>.</>
|
||||
) : (
|
||||
<> No timeout is currently enforced (permanent override).</>
|
||||
)}
|
||||
</p>
|
||||
<div className="flex gap-2">
|
||||
{node.override_timeout_at && (
|
||||
<button
|
||||
onClick={async () => {
|
||||
try {
|
||||
await c2api.ackOverride(id, 1440);
|
||||
} catch (e) {
|
||||
alert("Failed to extend timer.");
|
||||
}
|
||||
}}
|
||||
className="px-3 py-1 bg-yellow-800 hover:bg-yellow-700 text-white rounded text-xs transition-colors"
|
||||
>
|
||||
Ack (Reset 24h Timer)
|
||||
</button>
|
||||
)}
|
||||
<button
|
||||
onClick={async () => {
|
||||
if (confirm("Force this node to revert back to its assigned system config?")) {
|
||||
try {
|
||||
await c2api.resetOverride(id);
|
||||
} catch (e) {
|
||||
alert("Failed to reset override.");
|
||||
}
|
||||
}
|
||||
}}
|
||||
className="px-3 py-1 bg-red-900 hover:bg-red-800 text-red-200 rounded text-xs transition-colors"
|
||||
>
|
||||
Force Revert Config
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Info */}
|
||||
<div className="bg-gray-900 border border-gray-800 rounded-lg divide-y divide-gray-800 font-mono text-sm">
|
||||
{[
|
||||
@@ -199,6 +247,8 @@ export default function NodeDetailPage() {
|
||||
["Location", `${node.lat}, ${node.lon}`],
|
||||
["Last Seen", node.last_seen ? new Date(node.last_seen).toLocaleString() : "never"],
|
||||
["Configured", node.configured ? "Yes" : "No"],
|
||||
["Node Type", node.node_type ?? "fixed"],
|
||||
...(node.node_type !== "portable" ? [["Enforce Timeout", node.enforce_override_timeout ? "Yes" : "No"]] : []),
|
||||
].map(([label, value]) => (
|
||||
<div key={label} className="flex justify-between px-4 py-2.5">
|
||||
<span className="text-gray-500">{label}</span>
|
||||
|
||||
Reference in New Issue
Block a user