fix: keep kanban drag drop from opening detail - #2530
1 commit merged into
Conversation
SummaryReading
The split is the right shape: drag/drop is a status mutation, explicit click is a selection. Code referenceThe card template change at return `<article class="kanban-card ${esc(stale)}" data-kanban-task-id="${esc(task.id)}" draggable="true" ondragstart="dragKanbanTask(event, '${esc(task.id)}')" ondragend="finishKanbanDrag(event)" onclick="return openKanbanCard(event, '${esc(task.id)}')" tabindex="0" role="button" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();loadKanbanTask('${esc(task.id)}')}">And the drop handler at async function dropKanbanTask(event, status){
_kanbanSuppressNextCardClick();
event.preventDefault();
event.stopPropagation();
clearKanbanDrop(event);
const taskId = event.dataTransfer ? event.dataTransfer.getData('text/plain') : '';
if (taskId && status) await updateKanbanTask(taskId, {status}, {openDetail: false});
_kanbanSuppressNextCardClick();
}The Diagnosis / RecommendationThe approach is sound. Two small notes that may or may not matter for landing: 1. The 700ms window is generous but bounded. Browsers emit the trailing click essentially synchronously with 2. The double-call to 3. The card stays at VerificationThe static test at One thing the static test doesn't cover but probably can't easily: confirming the time-window logic in Looks good for merge. |
4589dbe
# Conflicts: # CHANGELOG.md
… 0.51.90) (#556) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/nesquena/hermes-webui](https://github.com/nesquena/hermes-webui) | patch | `0.51.89` → `0.51.90` | --- ### Release Notes <details> <summary>nesquena/hermes-webui (ghcr.io/nesquena/hermes-webui)</summary> ### [`v0.51.90`](https://github.com/nesquena/hermes-webui/blob/HEAD/CHANGELOG.md#v05190--2026-05-18--Release-BN-stage-383--10-PR-full-sweep-batch--empty-gateway-messaging-history-fix--previous-messaging-sessions-setting--Kanban-board-switcher-layout--UIUX-demo-theme-controls--Slice-3c-queuegoal-RFC-gate--keyless-custom-endpoints--custom-provider-remote-model-catalog-parity--auto-compression-elapsed-timer--new-conversation-cold-start-guard--Kanban-drag-drop-detail-open-fix) [Compare Source](nesquena/hermes-webui@v0.51.89...v0.51.90) ##### Fixed - **PR [#​2286](nesquena/hermes-webui#2286 by [@​junjunjunbong](https://github.com/junjunjunbong) (refs [#​2275](nesquena/hermes-webui#2275)) — Narrow messaging stale-session filtering to active gateway sessions that are visible in the current sidebar candidate set. Older Discord/messaging history is now preserved when the gateway advertises a fresh zero-message session that hasn't yet entered the visible projection, instead of being hidden as stale. Adds a regression test for an empty active Discord gateway row preserving prior history. - **PR [#​2459](nesquena/hermes-webui#2459 by [@​franksong2702](https://github.com/franksong2702) (closes [#​2458](nesquena/hermes-webui#2458)) — Fix the Kanban board switcher menu when a board's icon slot carries a long text label (e.g. `layout-kanban`). The icon column changed from a fixed `18px` slot to a bounded flex cell with `min-width:18px;max-width:7.5rem`, with overflow ellipsis on the icon itself so long labels render fully when space allows and truncate cleanly when not. Title and count columns keep stable spacing. Adds before/after screenshots and a CSS contract regression in `tests/test_kanban_ui_static.py`. - **PR [#​2522](nesquena/hermes-webui#2522 by [@​Michaelyklam](https://github.com/Michaelyklam) (refs [#​2271](nesquena/hermes-webui#2271)) — Treat named custom OpenAI-compatible endpoints with a configured `base_url` as key-optional at WebUI agent startup. Local keyless servers (llama-server / vLLM-style LAN deployments) no longer fail early with a synthetic `CUSTOM:<slug>_API_KEY` env-var prompt before the request reaches the endpoint; instead the OpenAI-compatible client initialises with a harmless placeholder key and real configured keys are still preferred when present. Refactors the three near-identical custom-provider rebuild blocks (initial agent setup + two retry/healing paths) through the existing `resolve_custom_provider_connection` helper. - **PR [#​2515](nesquena/hermes-webui#2515 by [@​Michaelyklam](https://github.com/Michaelyklam) (closes [#​2513](nesquena/hermes-webui#2513)) — Keep named custom-provider model pickers populated from each configured endpoint's live `/models` catalog even when `custom_providers[].model` is present. The singular `model` field now acts as a sticky/fallback entry appended *after* the remote catalog rather than collapsing the picker to just the configured model and hiding sibling named custom providers. Extracts reusable OpenAI-compatible `/models` parsing/fetching helpers and threads them through both the active-base-url and per-named-provider paths. - **PR [#​2512](nesquena/hermes-webui#2512 by [@​dso2ng](https://github.com/dso2ng) (refs [#​2477](nesquena/hermes-webui#2477), Slice A) — Show an elapsed timer on the running automatic-compression card so long WebUI context-compression pauses no longer look frozen while the browser waits for the `compressed` event. Stamps `startedAt` on the `compressing` SSE event, ticks once per second, and switches to a `5+ min` cap label past the Slice A bound so the UI never frame-freezes at `05:00`. Browser-transient state only — no SSE contract change and no server-side resume reconstruction. - **PR [#​2528](nesquena/hermes-webui#2528 by [@​Michaelyklam](https://github.com/Michaelyklam) (closes [#​2518](nesquena/hermes-webui#2518)) — Guard New Conversation creation while a previous `/api/session/new` request is still in flight, so cold model/provider catalog resolution gives immediate pending feedback and rapid repeated clicks reuse the same create request instead of enqueueing duplicate blank sessions. Coalesces concurrent `newSession()` calls behind a single in-flight promise, disables the sidebar button with `aria-busy="true"`, and shows a localized `Creating new conversation…` composer status. - **PR [#​2530](nesquena/hermes-webui#2530 by [@​franksong2702](https://github.com/franksong2702) (refs [#​2529](nesquena/hermes-webui#2529)) — Keep Kanban drag/drop status updates from also opening the task detail pane. Two failure paths were both producing detail-pane opens after drag/drop: the browser's trailing synthetic click after `drop`, and the generic task-update helper opening detail on every PATCH. The fix adds a time-windowed `_kanbanSuppressCardClickUntil` set on `ondragstart`/`ondragend`/`ondrop` and routes drag/drop status changes through a board-only update path. Explicit card click and keyboard activation remain unchanged. ##### Added - **PR [#​2294](nesquena/hermes-webui#2294 by [@​junjunjunbong](https://github.com/junjunjunbong) — Add a `show_previous_messaging_sessions` setting so users can opt back into seeing previous messaging sessions that were replaced by `session_reset` or auto-compression. The preference is wired through boot, settings persistence, and the sidebar projection. Also adds a separate "Hide from list" action for imported messaging/CLI sessions that hides individual rows from the sidebar without deleting source history. ##### Documentation - **PR [#​2511](nesquena/hermes-webui#2511 by [@​franksong2702](https://github.com/franksong2702) (refs [#​2502](nesquena/hermes-webui#2502) / [#​2503](nesquena/hermes-webui#2503)) — Update the `docs/ui-ux/` demo appearance controls to initialize as `class="dark" data-skin="slate"` instead of the deprecated `data-theme`-only buttons and legacy theme names. Brings the demo pages in line with the live Theme + Skin contract referenced from the new `docs/CONTRACTS.md` so contributors following the contract-index path don't land on stale demos. - **PR [#​2509](nesquena/hermes-webui#2509 by [@​Michaelyklam](https://github.com/Michaelyklam) (refs [#​1925](nesquena/hermes-webui#1925)) — Advance the runtime-adapter RFC after the Slice 3b approval/clarify seam shipped in v0.51.89. The RFC now marks Slice 3b as shipped and defines the next Slice 3c queue/continue + goal control gate: route those controls through `RuntimeAdapter.queue_message(...)` / `update_goal(...)` only after pinning stable response contracts, bounded unavailable-control behavior, replayable lifecycle/status evidence, ordering/idempotency expectations, and explicit non-goals for runner/sidecar ownership or a WebUI-owned queue/goal scheduler. Docs + adapter-seam regression test only — no runtime/control routing changes in this PR. </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/556
# Conflicts: # CHANGELOG.md
# Conflicts: # CHANGELOG.md
Thinking Path
What Changed
updateKanbanTask(..., {openDetail: false})so board refreshes do not programmatically select the moved task.Why It Matters
Dragging a Kanban card is a status update, not a task-selection action. Keeping drag/drop from opening the detail pane makes the board behave predictably and avoids surprising context switches while users reorganize work.
Closes #2529.
Verification
node --check static/panels.jspython3 -m pytest tests/test_kanban_ui_static.py::test_kanban_dragging_card_does_not_open_detail_on_drop_click tests/test_kanban_ui_static.py::test_kanban_ui_parity_polish_adds_card_metadata_quick_actions_and_swimlanes -qpython3 -m pytest tests/test_kanban_ui_static.py -qgit diff --checkScreenshots are not included because this is an interaction-state fix with no visual layout change; the regression is whether drag/drop opens the detail pane.
Risks / Follow-ups
Model Used
OpenAI Codex (GPT-5). AI assisted with code review, implementation, and verification.