feat(helpdesk): add domain linking, bulk actions, and revision polish to handovers

Adds domain selection (cascaded from debitor) to handover creation and edit,
bulk delete with confirmation dialog, and various UI improvements to the
handover wizard and list page. Includes migration for domain columns,
domain-select AJAX endpoint, and updated tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-16 13:21:12 +02:00
parent 03e15eaf08
commit e7c60468c9
24 changed files with 913 additions and 146 deletions

View File

@@ -1448,8 +1448,6 @@
overflow-x: clip;
}
#app-details-aside-section .helpdesk-comm-aside {
display: flex;
flex-direction: column;
@@ -1513,7 +1511,7 @@
.helpdesk-ticket-meta dd {
margin: 0.15rem 0 0;
font-size: var(--text-sm);
font-size: var(--text-base);
line-height: 1.4;
color: var(--app-contrast, #1f2937);
word-break: break-word;
@@ -2429,7 +2427,11 @@
}
.handover-schema-preview-highlight {
background-color: color-mix(in srgb, var(--app-primary, #635bff) 5%, transparent);
background-color: color-mix(
in srgb,
var(--app-primary, #635bff) 5%,
transparent
);
border-left-color: var(--app-primary, #635bff);
}
@@ -2614,7 +2616,9 @@
border-radius: var(--app-border-radius);
color: var(--app-muted-color);
text-decoration: none;
transition: background 0.15s ease, color 0.15s ease;
transition:
background 0.15s ease,
color 0.15s ease;
}
.app-wizard-back:hover {
@@ -2653,7 +2657,10 @@
border: 2px solid var(--app-border);
color: var(--app-muted-color);
background: transparent;
transition: border-color 0.2s ease, background 0.2s ease, color 0.2s ease;
transition:
border-color 0.2s ease,
background 0.2s ease,
color 0.2s ease;
flex-shrink: 0;
}
@@ -2798,12 +2805,12 @@
/* Vertical line */
.handover-revision-timeline::before {
content: '';
content: "";
position: absolute;
left: 0.4375rem;
left: 2.9px;
top: 0.5rem;
bottom: 0.5rem;
width: 2px;
width: 1px;
background: var(--app-border);
}
@@ -2817,7 +2824,7 @@
/* Circle node */
.handover-revision-item::before {
content: '';
content: "";
position: absolute;
left: -1.25rem;
top: calc(var(--app-spacing) * 0.4 + 0.35rem);
@@ -2869,11 +2876,14 @@
color: var(--app-muted-color);
text-decoration: none;
border-radius: var(--app-border-radius);
opacity: 0;
transition: opacity 0.15s ease, color 0.15s ease;
opacity: 0.55;
transition:
opacity 0.15s ease,
color 0.15s ease;
}
.handover-revision-item:hover .handover-revision-compare {
.handover-revision-item:hover .handover-revision-compare,
.handover-revision-compare:focus-visible {
opacity: 1;
}
@@ -2881,6 +2891,11 @@
color: var(--app-primary);
}
.handover-revision-compare:focus-visible {
outline: 2px solid color-mix(in srgb, var(--app-primary) 45%, transparent);
outline-offset: 2px;
}
.handover-revision-number {
display: flex;
align-items: center;
@@ -2985,18 +3000,113 @@
}
.handover-diff-indicator::before {
content: '±';
content: "±";
font-weight: var(--font-semibold, 600);
color: hsl(40 70% 45%);
}
.handover-diff-added .handover-diff-indicator::before {
content: '+';
content: "+";
color: hsl(145 60% 38%);
}
.handover-diff-removed .handover-diff-indicator::before {
content: '';
content: "";
color: hsl(0 70% 50%);
}
/* Domain detail page */
.helpdesk-domain-url-prominent {
font-size: var(--text-lg);
font-weight: var(--font-semibold);
word-break: break-all;
text-decoration: none;
}
.helpdesk-domain-url-prominent:hover {
text-decoration: underline;
}
.helpdesk-domain-overview-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: calc(var(--app-spacing) * 1.25);
align-items: start;
}
@media (max-width: 760px) {
.helpdesk-domain-overview-grid {
grid-template-columns: 1fr;
}
}
/* Related domains — compact aside list */
.helpdesk-domain-related-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: calc(var(--app-spacing) * 0.35);
padding: calc(var(--app-spacing) * 0.4) 0;
border-bottom: 1px solid var(--app-border-subtle, #f0f0f0);
text-decoration: none;
color: inherit;
font-size: var(--text-sm);
}
.helpdesk-domain-related-item:last-child {
border-bottom: 0;
}
.helpdesk-domain-related-item:hover .helpdesk-domain-related-item-url {
text-decoration: underline;
}
.helpdesk-domain-related-item-url {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0;
}
/* Handover list — Stripe-style compact clickable rows */
.helpdesk-domain-handover-list {
display: flex;
flex-direction: column;
gap: 1px;
background: var(--app-border-subtle, #f0f0f0);
border-radius: var(--app-border-radius);
overflow: hidden;
}
.helpdesk-domain-handover-item {
display: block;
padding: calc(var(--app-spacing) * 0.65) calc(var(--app-spacing) * 0.75);
background: var(--app-card-background-color, #fff);
text-decoration: none;
color: inherit;
transition: background-color 0.15s ease;
}
.helpdesk-domain-handover-item:hover {
background: var(--app-card-sectioning-background-color, #fafafa);
}
.helpdesk-domain-handover-item-main {
display: flex;
align-items: center;
justify-content: space-between;
gap: calc(var(--app-spacing) * 0.5);
}
.helpdesk-domain-handover-item-product {
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--app-contrast, #1f2937);
}
.helpdesk-domain-handover-item-meta {
margin-top: 0.15rem;
font-size: var(--text-xs);
color: var(--app-muted, #6c757d);
}
}