feat(helpdesk): add team workload dashboard with per-agent metrics

New standalone page (helpdesk/team) showing support agent workload
aggregated from BC tickets. KPI bar (open, unassigned, avg age, resolved),
per-agent table sorted by open tickets, period selector (30/90/180/365d).
Global OData query via getTicketsForTeam() without customer filter.
New permission helpdesk.team-workload.view with admin role assignment.
Includes 6 PHPUnit tests for buildTeamWorkloadDashboard().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-05 18:46:54 +02:00
parent aeb9c9f9fb
commit cae66e5361
18 changed files with 711 additions and 12 deletions

View File

@@ -126,6 +126,50 @@
}
}
/* Team workload dashboard */
.helpdesk-team-period-selector {
display: inline-flex;
gap: calc(var(--app-spacing) * 0.25);
margin-bottom: calc(var(--app-spacing) * 0.75);
}
.helpdesk-team-period-button {
padding: calc(var(--app-spacing) * 0.25) calc(var(--app-spacing) * 0.6);
font-size: var(--text-sm, 0.875rem);
border: var(--app-border-width) solid var(--app-muted-border-color);
background: var(--app-background-color);
color: var(--app-color);
cursor: pointer;
transition: background-color 0.15s ease, border-color 0.15s ease;
}
.helpdesk-team-period-button.active {
background: var(--app-primary);
border-color: var(--app-primary);
color: var(--app-primary-inverse);
}
.helpdesk-team-table {
width: 100%;
margin-top: calc(var(--app-spacing) * 0.75);
}
.helpdesk-team-table th,
.helpdesk-team-table td {
text-align: left;
padding: calc(var(--app-spacing) * 0.35) calc(var(--app-spacing) * 0.5);
}
.helpdesk-team-table th:not(:first-child),
.helpdesk-team-table td:not(:first-child) {
text-align: right;
}
.helpdesk-team-row-unassigned {
opacity: 0.7;
font-style: italic;
}
/* Clickable rows — shared between search results and ticket list */
.app-clickable-row {
cursor: pointer;