Merge branch 'claude/group-double-click-breadcrumb-7bf3f8'
ci / build and test (push) Successful in 1m21s
ci / android head (push) Failing after 5s
ci / api image (push) Successful in 32s

This commit is contained in:
2026-08-03 16:22:45 +02:00
6 changed files with 549 additions and 80 deletions
+41 -4
View File
@@ -283,11 +283,42 @@ Make two groups and file some hosts into each through the host editor.
flat wrap, in one order, with nothing between them. **There is no heading and no fold on the desktop** — the
headings, their chevrons and UNGROUPED are the phone's, whose list has no room for a row of group cards.
**Then press a group card.** The grid narrows to that group's hosts, the card is marked as chosen, and
SHOW ALL appears beside GROUPS. Pressing it brings the rest back and unmarks the card.
**Then press a group card once.** It is marked as chosen and **nothing else happens** — the grid still holds
every host, and EDIT and DELETE now aim at that group. **Then double-press it.** The group opens: the hosts
narrow to the ones filed under it, the trail above the cards reads `ALL HOSTS <name> `, and the card grid
shows what is *inside* that group rather than every group in the keychain. Pressing ALL HOSTS brings the rest
back.
**Failure means:** a full-width bar with a chevron between the cards is the old grouping coming back through
`SidebarRows` — the desktop grid binds `VisibleHosts`. See `HostsScreen.axaml`.
**Failure means:** if one press still narrows the grid, the card `ListBox` is bound to the wrong property —
`SelectedItem` is `SelectedGroup`, and only `OpenGroupCommand` writes `GroupFilter`. A full-width bar with a
chevron between the cards is the old grouping coming back through `SidebarRows`; the desktop grid binds
`VisibleHosts`. See `HostsScreen.axaml`.
### 3.2a A group inside a group, and the way back out
Make two groups and file one under the other with the parent picker in the group editor.
**Pass:** only the outer group has a card to start with. Double-press it and the inner one is the only card
shown, with the trail reading `ALL HOSTS <outer> `. Double-press that, and the cards disappear entirely —
it has nothing inside it — while the trail, EDIT and DELETE stay: with no card selected the two buttons act
on the group the trail ends with, so a group with nothing in it can still be renamed after being opened.
Pressing the **middle** crumb goes back one level rather than all the way out.
**Failure means:** cards for groups that are not at this level is `VisibleGroups` having been bound past —
the flat `Groups` is the phone's and the lookups'. A group that cannot be reached at all is worse and is the
case `EffectiveParents` promotes: see 3.4a.
### 3.4a A parent that dangles, or a cycle · **needs two machines**
Rare, and the reason it is here is that the repair for both is inside the group's own editor, which is
opened from its card. On A, file group X under group Y and sync. On B, sync, delete Y, sync. Back on A, sync.
For the cycle: with both machines offline, file X under Y on A and Y under X on B, then sync both.
**Pass:** in both cases every group still has a card at the outermost level, so every one of them can be
opened and its parent cleared. Nothing is missing from the grid, and the trail never loops.
**Failure means:** a group drawn nowhere is a group that can never be repaired — the fix is locked inside the
state that needs fixing. See `VaultViewModel.EffectiveParents`.
### 3.3 Deleting a group with hosts in it
@@ -653,6 +684,9 @@ new group's name, the host counts under both group cards change, and the status
group the host is *already* in; over another **host** card, which is deliberately not a target now that there
are no headings to say which group it would mean; and over the empty space around the cards.
**The targets are the cards on screen, which are one level** — see 3.2a. Filing into a group nested under
another means opening the outer one first, exactly as moving a file into a subfolder does.
**And getting a host back out** is the host's own editor — pick "No group" in its picker. There is no
UNGROUPED target on the desktop any more, because there is no UNGROUPED heading for it to be.
@@ -677,6 +711,9 @@ space around the cards connects to nothing.
as 2.16 on the other screen, and here it would make the grid unusable. Empty space that connects means the
double-tap handler has lost its check that the pointer was over a card.
**And the same two gestures on the group cards above**, where they mean select and open rather than select
and connect — the space around *those* cards must open nothing, for the same reason. See 3.2.
### 7.8 The highlight clears after a drag that goes nowhere
Drag a host over a group card and release outside the grid, or press Escape mid-drag.