From 86a47b6bc97d0c9ebd13741c11c996ce8439c323 Mon Sep 17 00:00:00 2001 From: "benjamin.baker" Date: Wed, 2 Sep 2026 18:37:59 -0400 Subject: [PATCH] return to Fleet after editing a PC opened from Fleet Editing or retiring a PC launched from the Fleet view returned focus to the PCs list instead of Fleet. Fleet now tags its PC navigation with from=fleet, and PC Details and the edit form honor that origin for Back, Edit, Cancel, Save, and Retire. Absent the marker, every path still falls back to the PCs list. --- plugins/computers/frontend/views/PCDetail.vue | 14 +++++++++++--- plugins/computers/frontend/views/PCForm.vue | 9 +++++++-- plugins/endpoints/frontend/views/EndpointsList.vue | 4 +++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/computers/frontend/views/PCDetail.vue b/plugins/computers/frontend/views/PCDetail.vue index 820aa606..af6986d2 100644 --- a/plugins/computers/frontend/views/PCDetail.vue +++ b/plugins/computers/frontend/views/PCDetail.vue @@ -9,9 +9,9 @@ look like a peer of printing a sticker. -->
Print Label - Edit + Edit - Back to List + {{ returnLabel }}
@@ -376,6 +376,14 @@ const toast = useToast() const authStore = useAuthStore() const { isEnabled } = useIdentifierFlags() +// Return-navigation origin. Fleet opens this page with ?from=fleet so Back, +// Edit, and Retire all lead back to Fleet; every other entry path falls back +// to the PCs list. +const fromFleet = computed(() => route.query.from === 'fleet') +const fromQuery = computed(() => (fromFleet.value ? '?from=fleet' : '')) +const returnTo = computed(() => (fromFleet.value ? '/endpoints' : '/pcs')) +const returnLabel = computed(() => (fromFleet.value ? 'Back to Fleet' : 'Back to List')) + const loading = ref(true) const computer = ref(null) // Liveness for the triage band. Null when the endpoints plugin is absent, or @@ -643,7 +651,7 @@ async function confirmRetire() { try { await computersApi.delete(route.params.id) toast.success(`Retired ${label}`) - router.push('/pcs') + router.push(returnTo.value) } catch (error) { console.error('Error retiring PC:', error) toast.error(apiError(error, 'Failed to retire PC')) diff --git a/plugins/computers/frontend/views/PCForm.vue b/plugins/computers/frontend/views/PCForm.vue index 0f3a0eb8..6924908f 100644 --- a/plugins/computers/frontend/views/PCForm.vue +++ b/plugins/computers/frontend/views/PCForm.vue @@ -353,7 +353,7 @@ - Cancel + Cancel @@ -385,6 +385,11 @@ const router = useRouter() const isEdit = computed(() => !!route.params.id) +// Return-navigation origin, threaded through from Fleet via ?from=fleet so +// Cancel and a successful Save land back on Fleet; every other entry path +// falls back to the PCs list. +const returnTo = computed(() => (route.query.from === 'fleet' ? '/endpoints' : '/pcs')) + // Seeded asset-type id for computers (see /api/assets/types). Custom-field // values are keyed by the underlying asset id, captured on load / create. const COMPUTER_ASSETTYPEID = 2 @@ -685,7 +690,7 @@ async function savePC() { } } - router.push('/pcs') + router.push(returnTo.value) } catch (err) { console.error('Error saving PC:', err) error.value = apiError(err, 'Failed to save PC') diff --git a/plugins/endpoints/frontend/views/EndpointsList.vue b/plugins/endpoints/frontend/views/EndpointsList.vue index 66a210a0..b7e8bb62 100644 --- a/plugins/endpoints/frontend/views/EndpointsList.vue +++ b/plugins/endpoints/frontend/views/EndpointsList.vue @@ -342,7 +342,9 @@ async function loadEndpoints() { // navigates when it resolved to a computerid. function openPc(item) { if (item.computerid) { - router.push(`/pcs/${item.computerid}`) + // Tag the origin so PC Details and the edit form return here (Fleet) + // instead of the PCs list. Absent for the normal PCs-list entry path. + router.push(`/pcs/${item.computerid}?from=fleet`) } }