Admit serviceprocess server-side and give Operator Reports its own tab

asset_panels() rewrites any group missing from ASSET_PANEL_GROUPS to 'details' before the client sees it, and Phase 3 never added 'serviceprocess' there. Both panels were relabelled on the wire, so the tab could not appear no matter how consistent the frontend was. That is why the tab was still missing after the schema fix - a second, unrelated cause wearing the same symptom.

Operator Reports moves out of System Monitors into a tab of its own: that tab is machine-collected health, this is a person reporting something, and the thumbnail grid dwarfed the fact cards it sat between. Full width, since it is alone in the tab.

panelGroups.spec.js claimed to cover four files and checked two; it now reads the server tuple as well. The plugin test's hand-copied set was a fifth copy and now derives from the server tuple instead.
This commit is contained in:
benjamin.baker
2026-09-05 07:37:01 -04:00
parent f77a288bdc
commit 7f84e8ca1e
7 changed files with 103 additions and 9 deletions

View File

@@ -349,6 +349,12 @@
<div v-show="activegroup === 'serviceprocess'" class="content-grid">
<PluginAssetPanels :assetid="computer.assetid" group="serviceprocess" />
</div>
<!-- Full width, unlike the two above: the thumbnail grid wants the room,
and it is the only card in this tab so there is nothing to flow
beside it. -->
<div v-show="activegroup === 'reports'" class="detail-full">
<PluginAssetPanels :assetid="computer.assetid" group="reports" />
</div>
<div v-show="activegroup === 'activity'" class="detail-full">
<PluginAssetPanels :assetid="computer.assetid" group="activity" />
</div>
@@ -456,6 +462,10 @@ const detailtabs = computed(() => {
if (has('serviceprocess')) {
tabs.push({ key: 'serviceprocess', label: 'Service/Process Monitors' })
}
// Operator Reports earns a tab rather than a card in System Monitors: it is
// what a person reported, not what the agent measured, and the thumbnail
// grid is much bulkier than the fact cards around it.
if (has('reports')) tabs.push({ key: 'reports', label: 'Operator Reports' })
if (has('software') || installedApps.value.length > 0) {
tabs.push({ key: 'software', label: 'Software', count: installedApps.value.length || null })
}

View File

@@ -647,8 +647,11 @@ class EndpointsPlugin(BasePlugin):
},
{
# Operator-submitted issue reports: a free-text note and an
# optional screenshot the operator captured from the tray. Sits
# in the Monitors tab beside the other watch-and-observe panels.
# optional screenshot the operator captured from the tray. Has
# a tab of its own rather than sitting in System Monitors: that
# tab is machine-collected health, this is a human telling you
# something, and the thumbnail grid is far bulkier than the
# fact cards it used to sit between.
# A custom render carries the thumbnail grid and the expanding
# lightbox with left/right cycling the generic modes cannot.
'id': 'endpoints-operator-reports',
@@ -660,7 +663,7 @@ class EndpointsPlugin(BasePlugin):
'collapsible': True,
'empty': 'No operator reports for this endpoint.',
'position': 18,
'group': 'monitors',
'group': 'reports',
},
]