feat(workbench): expand SCADA monitoring and investigation presentation

This commit is contained in:
2026-11-07 19:50:14 +08:00
parent 0801e161ec
commit ba71e2d529
133 changed files with 6754 additions and 1438 deletions
@@ -1,6 +1,9 @@
import { useCallback, useEffect, useRef, useState } from "react";
import { useCallback, useEffect, useRef, useState, type RefObject } from "react";
import type { Map as MapLibreMap } from "maplibre-gl";
import { Activity, ClipboardList, RadioTower, ReceiptText, RefreshCw, X } from "lucide-react";
import type { WorkbenchAccess } from "../api/request-context";
import { reverseGeocodePoint } from "../api/place-search-client";
import type { EventLocationAddressResolver } from "./use-event-location-address";
import { Button } from "@/shared/ui/button";
import { cn } from "@/shared/ui/cn";
import { Disclosure } from "@/shared/ui/disclosure";
@@ -21,12 +24,18 @@ export function PeripheralSamplePanel({
open,
onClose,
getAccessToken,
onAgentTrigger
mapReady,
mapRef,
onAgentTrigger,
onOpenInvestigation
}: {
open: boolean;
onClose: () => void;
getAccessToken?: WorkbenchAccess;
mapReady: boolean;
mapRef: RefObject<MapLibreMap | null>;
onAgentTrigger?: (workOrder: PeripheralWorkOrder) => Promise<void>;
onOpenInvestigation?: (taskId: string) => void;
}) {
const clientRef = useRef(new PeripheralSampleClient(getAccessToken));
const client = clientRef.current;
@@ -37,6 +46,10 @@ export function PeripheralSamplePanel({
const [refreshGeneration, setRefreshGeneration] = useState(0);
const [scadaRefreshGeneration, setScadaRefreshGeneration] = useState(0);
const [activeSystem, setActiveSystem] = useState<"work-orders" | "scada">("work-orders");
const resolveEventAddress = useCallback<EventLocationAddressResolver>(async ([longitude, latitude], signal) => {
const result = await reverseGeocodePoint(longitude, latitude, context?.project_id ?? null, getAccessToken, signal);
return result.address.trim() || result.name;
}, [context?.project_id, getAccessToken]);
const refresh = useCallback(async () => {
if (!client.configured) return;
@@ -120,10 +133,14 @@ export function PeripheralSamplePanel({
{context ? (
<div className="space-y-3">
<ManagedTestResources
key={context.project_id}
client={client}
canWrite={context.can_write}
capabilities={context.managed_resources}
refreshGeneration={refreshGeneration}
mapReady={mapReady}
mapRef={mapRef}
resolveAddress={resolveEventAddress}
onAgentTrigger={onAgentTrigger}
/>
<Disclosure
@@ -168,6 +185,7 @@ export function PeripheralSamplePanel({
active={activeSystem === "scada"}
getAccessToken={getAccessToken}
refreshGeneration={scadaRefreshGeneration}
onOpenInvestigation={onOpenInvestigation}
/>
</TabsContent>
</Tabs>