fix(helpdesk): consolidate card content into compact fact pills
Remove duplicate metrics row and reason list. Replace with a single row of compact pills: '5 open', '2 critical' (orange), '1 SLA' (orange), '↑3' (orange) or '↓2'. No bullet points — pills as flex-wrap row. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -609,36 +609,28 @@
|
|||||||
background: var(--app-success, #198754);
|
background: var(--app-success, #198754);
|
||||||
}
|
}
|
||||||
|
|
||||||
.helpdesk-risk-card-metrics {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: calc(var(--app-spacing) * 0.3);
|
|
||||||
margin-bottom: calc(var(--app-spacing) * 0.35);
|
|
||||||
font-size: var(--text-xs, 0.75rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
.helpdesk-risk-card-metric {
|
|
||||||
padding: 0.1em 0.45em;
|
|
||||||
border-radius: var(--app-border-radius, 0.25rem);
|
|
||||||
background: color-mix(in srgb, var(--app-muted-border-color) 40%, transparent);
|
|
||||||
color: var(--app-muted-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.helpdesk-risk-card-metric-warn {
|
|
||||||
background: color-mix(in srgb, var(--app-warning, #f59e0b) 15%, transparent);
|
|
||||||
color: var(--app-warning, #f59e0b);
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.helpdesk-risk-card-reasons {
|
.helpdesk-risk-card-reasons {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: calc(var(--app-spacing) * 0.25) 0 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
font-size: var(--text-xs, 0.75rem);
|
font-size: var(--text-xs, 0.75rem);
|
||||||
color: var(--app-muted-color);
|
color: var(--app-muted-color);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-wrap: wrap;
|
||||||
gap: 0.15em;
|
gap: calc(var(--app-spacing) * 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
.helpdesk-risk-card-reasons li {
|
||||||
|
padding: 0.1em 0.4em;
|
||||||
|
border-radius: var(--app-border-radius, 0.25rem);
|
||||||
|
background: color-mix(in srgb, var(--app-muted-border-color) 30%, transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.helpdesk-risk-card-reason-warn {
|
||||||
|
background: color-mix(in srgb, var(--app-warning, #f59e0b) 15%, transparent);
|
||||||
|
color: var(--app-warning, #f59e0b);
|
||||||
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.helpdesk-risk-card-driver-bar {
|
.helpdesk-risk-card-driver-bar {
|
||||||
|
|||||||
@@ -83,58 +83,30 @@ if (container) {
|
|||||||
header.appendChild(scoreBadge);
|
header.appendChild(scoreBadge);
|
||||||
card.appendChild(header);
|
card.appendChild(header);
|
||||||
|
|
||||||
// Core metrics row
|
// Key facts as compact pills
|
||||||
const metrics = h('div', 'helpdesk-risk-card-metrics');
|
|
||||||
const kpis = customer.kpis || {};
|
const kpis = customer.kpis || {};
|
||||||
|
const pills = h('ul', 'helpdesk-risk-card-reasons');
|
||||||
|
|
||||||
if (kpis.sla_overdue > 0) {
|
if (kpis.open > 0) {
|
||||||
const m = h('span', 'helpdesk-risk-card-metric helpdesk-risk-card-metric-warn');
|
const li = h('li', '', kpis.open + ' ' + d('labelOpen', 'open'));
|
||||||
m.textContent = kpis.sla_overdue + ' ' + d('labelOverdue', 'overdue');
|
pills.appendChild(li);
|
||||||
metrics.appendChild(m);
|
|
||||||
}
|
}
|
||||||
if (kpis.critical > 0) {
|
if (kpis.critical > 0) {
|
||||||
const m = h('span', 'helpdesk-risk-card-metric helpdesk-risk-card-metric-warn');
|
const li = h('li', 'helpdesk-risk-card-reason-warn', kpis.critical + ' ' + d('labelCritical', 'critical'));
|
||||||
m.textContent = kpis.critical + ' ' + d('labelCritical', 'critical');
|
pills.appendChild(li);
|
||||||
metrics.appendChild(m);
|
|
||||||
}
|
}
|
||||||
const openM = h('span', 'helpdesk-risk-card-metric');
|
if (kpis.sla_overdue > 0) {
|
||||||
openM.textContent = kpis.open + ' ' + d('labelOpen', 'open');
|
const li = h('li', 'helpdesk-risk-card-reason-warn', kpis.sla_overdue + ' ' + d('labelSlaBreaches', 'SLA'));
|
||||||
metrics.appendChild(openM);
|
pills.appendChild(li);
|
||||||
|
}
|
||||||
if (kpis.net_flow !== 0) {
|
if (kpis.net_flow > 0) {
|
||||||
const flowM = h('span', 'helpdesk-risk-card-metric');
|
const li = h('li', 'helpdesk-risk-card-reason-warn', '↑' + kpis.net_flow);
|
||||||
const arrow = kpis.net_flow > 0 ? '↑' : '↓';
|
pills.appendChild(li);
|
||||||
flowM.textContent = arrow + Math.abs(kpis.net_flow);
|
} else if (kpis.net_flow < 0) {
|
||||||
if (kpis.net_flow > 0) flowM.classList.add('helpdesk-risk-card-metric-warn');
|
pills.appendChild(h('li', '', '↓' + Math.abs(kpis.net_flow)));
|
||||||
metrics.appendChild(flowM);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
card.appendChild(metrics);
|
card.appendChild(pills);
|
||||||
|
|
||||||
// Why at risk — concrete facts
|
|
||||||
const kpiOpen = kpis.open || 0;
|
|
||||||
const kpiCritical = kpis.critical || 0;
|
|
||||||
const kpiSla = kpis.sla_overdue || 0;
|
|
||||||
const kpiNet = kpis.net_flow || 0;
|
|
||||||
const kpiOldest = kpis.oldest_open_hours || 0;
|
|
||||||
|
|
||||||
const reasons = [];
|
|
||||||
if (kpiOpen > 0) {
|
|
||||||
let text = kpiOpen + ' ' + d('labelOpen', 'open');
|
|
||||||
if (kpiCritical > 0) text += ', ' + kpiCritical + ' ' + d('labelCritical', 'critical');
|
|
||||||
reasons.push(text);
|
|
||||||
}
|
|
||||||
if (kpiNet > 0) reasons.push('↑' + kpiNet + ' ' + d('labelMoreThanResolved', 'more than resolved'));
|
|
||||||
if (kpiSla > 0) reasons.push(kpiSla + ' ' + d('labelSlaBreaches', 'SLA breaches'));
|
|
||||||
if (kpiOldest > 168) reasons.push(d('labelOldestTicket', 'Oldest ticket') + ' ' + formatAge(kpiOldest));
|
|
||||||
|
|
||||||
if (reasons.length > 0) {
|
|
||||||
const reasonList = h('ul', 'helpdesk-risk-card-reasons');
|
|
||||||
for (const r of reasons) {
|
|
||||||
reasonList.appendChild(h('li', '', r));
|
|
||||||
}
|
|
||||||
card.appendChild(reasonList);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Click/keyboard to open detail
|
// Click/keyboard to open detail
|
||||||
card.tabIndex = 0;
|
card.tabIndex = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user