From dde6d2ce2a1b83c1579e265bac255149251e539e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roland=20B=C3=BCrgi?= Date: Mon, 6 Jul 2026 10:52:09 +0200 Subject: [PATCH] fix(portal): delete redirects to parent via pure path; status bar single-row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delete: on a distributed portal the ancestor-existence walk (a Query per ancestor) can hang cross-partition, stalling the redirect behind the 10s timeout while the just-deleted node's area re-renders and errors (the 'reload then error'). When the immediate parent is a SATELLITE grouping (_Thread, _Activity, …) — the common case, e.g. deleting a thread — resolve the target by PURE PATH (skip satellite segments), immediately, no query. Only a non-satellite virtual parent (…/Script) still needs the existence walk; its fallback is the pure-path ancestor, never the maybe-virtual parent. Status bar: .thread-chat-status-row was flex-wrap:wrap → stays one row (nowrap + overflow:hidden); chips shrink (min-width:0) so long values ellipsis inline; model chip title carries the full path for hover. Tests: DeleteRedirectToExistingParentTest +NearestNonSatelliteAncestor (4/4). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Chat/ThreadChatView.razor | 2 +- .../Chat/ThreadChatView.razor.css | 9 ++- src/MeshWeaver.Graph/DeleteLayoutArea.cs | 67 ++++++++++++++----- .../DeleteRedirectToExistingParentTest.cs | 20 ++++++ 4 files changed, 80 insertions(+), 18 deletions(-) diff --git a/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor b/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor index 0b3ad071a..7469f8991 100644 --- a/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor +++ b/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor @@ -684,7 +684,7 @@ else @if (!string.IsNullOrEmpty(boundModelPath)) { } diff --git a/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor.css b/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor.css index 82f484d06..e4c9da20e 100644 --- a/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor.css +++ b/src/MeshWeaver.Blazor.Portal/Chat/ThreadChatView.razor.css @@ -410,7 +410,10 @@ .thread-chat-status-row { display: flex; align-items: center; - flex-wrap: wrap; + /* Single row — never wrap. Overflowing chips are clipped (each chip ellipsis-truncates its own + text via .thread-chat-status-item), and the full value is on the chip's title (hover). */ + flex-wrap: nowrap; + overflow: hidden; gap: 10px; padding: 0 2px 6px 2px; font-size: 11px; @@ -427,6 +430,10 @@ overflow: hidden; text-overflow: ellipsis; max-width: 180px; + /* Allow the chip to shrink below its content width so its text ellipsis-truncates when the + single-row status bar runs out of horizontal room (min-width:auto would block the ellipsis). */ + min-width: 0; + flex: 0 1 auto; } /* The chips are