From 385be2eca72eb3833efa4be0a0088b34e764788a Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Mon, 31 Aug 2026 09:04:45 +0800
Subject: [PATCH] feat(pointcloud): complete annotation and result lifecycle workflows

---
 apps/workbench-console/src/components/TrajectoryAnalysisPanel.vue |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/apps/workbench-console/src/components/TrajectoryAnalysisPanel.vue b/apps/workbench-console/src/components/TrajectoryAnalysisPanel.vue
index 957164e..23fdd57 100644
--- a/apps/workbench-console/src/components/TrajectoryAnalysisPanel.vue
+++ b/apps/workbench-console/src/components/TrajectoryAnalysisPanel.vue
@@ -4,6 +4,7 @@
 
 import { artifactUrl, createTrajectoryRun, readFileAsPayload } from "@/api/artifacts";
 import ArtifactState from "@/components/ArtifactState.vue";
+import RunDeletionControl from "@/components/RunDeletionControl.vue";
 import { useArtifactStore } from "@/stores/artifacts";
 
 const TrajectoryMap = defineAsyncComponent(() => import("@/components/TrajectoryMap.vue"));
@@ -18,6 +19,7 @@
 const currentCase = computed(() => store.trajectoryCases[caseId.value] ?? Object.values(store.trajectoryCases)[0]);
 const caseOptions = computed(() => Object.values(store.trajectoryCases).map((item) => ({ label: item.label, value: item.id })));
 const filteredCaseOptions = computed(() => caseOptions.value.filter((item) => item.label.toLowerCase().includes(searchText.value.trim().toLowerCase())));
+async function removeRun() { await store.loadTrajectory(true); caseId.value = Object.keys(store.trajectoryCases)[0] ?? ""; }
 const eventNames: Record<string, string> = { normal: "正常", stop: "停留", route_deviation: "偏航", restricted_zone: "进入禁入区", gathering: "聚集" };
 const currentRules = computed(() => currentCase.value?.run.thresholds ?? {});
 const outputFiles = computed(() => {
@@ -99,7 +101,7 @@
 
   <div v-if="currentCase" class="trajectory-workspace">
     <a-row :gutter="[18, 18]" class="workspace-top-row">
-      <a-col :xs="24" :xl="5"><section class="surface-section run-library"><h2>案例库</h2><a-input-search v-model:value="searchText" placeholder="搜索运行" allow-clear /><a-list size="small" :data-source="filteredCaseOptions"><template #renderItem="{ item }"><a-list-item class="run-item" :class="{ active: item.value === currentCase.id }" @click="caseId = item.value">{{ item.label }}</a-list-item></template></a-list></section></a-col>
+      <a-col :xs="24" :xl="5"><section class="surface-section run-library"><h2>案例库</h2><a-input-search v-model:value="searchText" placeholder="搜索运行" allow-clear /><a-list size="small" :data-source="filteredCaseOptions"><template #renderItem="{ item }"><a-list-item class="run-item" :class="{ active: item.value === currentCase.id }" @click="caseId = item.value"><span class="run-item-label">{{ item.label }}</span><RunDeletionControl capability="15-trajectory-analysis" :run-id="item.value" :label="item.label" @removed="removeRun" /></a-list-item></template></a-list></section></a-col>
       <a-col :xs="24" :xl="19"><section class="surface-section map-panel"><div class="section-toolbar"><span class="toolbar-note">{{ currentCase.note }}</span></div><TrajectoryMap :artifact-root="currentCase.artifactRoot" :show-spatial-context="currentCase.showSpatialContext" :show-flyable-zones="currentCase.showFlyableZones" /></section></a-col>
     </a-row>
 

--
Gitblit v1.9.3