diff --git a/docs/adding-hosts-on-the-phone.md b/docs/adding-hosts-on-the-phone.md index cb057dd..76ec36b 100644 --- a/docs/adding-hosts-on-the-phone.md +++ b/docs/adding-hosts-on-the-phone.md @@ -4,17 +4,27 @@ The phone can read a keychain and connect through it. It cannot put anything in plan for the change that fixes that, and it is written to be picked up cold — the decisions, the reasons, the ordered work, and the traps that are already known. -> **Status: steps 1–3 built, 4–6 not started.** The domain is done and the phone has not been touched. Each -> built step compiles with the whole suite green, which is the rule the ordering below sets. +> **Status: steps 1–4 built, 5–6 not started.** The domain and the desktop are done and the phone has not +> been touched. Each built step compiles with the whole suite green, which is the rule the ordering below +> sets. > > | Step | State | Notes | > | --- | --- | --- | > | 1. `HostGroupSecret` grows | **Done** | Five fields, a version rule the codec did not have, a byte pin, and the "groups are flat" prose rewritten in all four places it appeared. | > | 2. The `Tag` item kind | **Done** | Secret, codec, merge, cipher, repository, both registries, EF entity and the generated `AddTagItem` migration. | > | 3. `HostSecret` grows, `Port` goes nullable | **Done** | `TagSet`, `TagIds`, `Port` as `int?`, `AsksForPassword`, both schema versions, and `HostInheritance` — the resolver. | -> | 4. The shared view model | Not started | The five port call sites already route through the resolver; the rest of the list below does not. | -> | 5. The phone | Not started | | -> | 6. Tests and false prose | Partly done as it went | The guards steps 1–3 tripped are fixed. `docs/design-import-gaps.md` and the three phone files are untouched. | +> | 4. The shared view model | **Done** | Every choke point below, plus the group editor the plan never assigned a step to and without which nothing could set a default at all. | +> | 5. The phone | Not started | Nothing in `Views/HostsScreen.axaml`, `Theme/Phone.axaml` or `PhoneShell` has changed. | +> | 6. Tests and false prose | Partly done as it went | The guards each step tripped are fixed and the connect path is covered. `docs/design-import-gaps.md` and the three phone files still say the `+` is deliberately absent. | +> +> **Tags are stored but not editable.** `TagIds` merges, encodes and resolves, and no screen can put one on a +> host yet — the desktop editor carries the set through a save untouched so that a client which can set them +> does not lose them. The chips belong with the phone's editors in step 5. +> +> **`HostFields.From` was answered by a refusal rather than by threading the resolver into the sync engine.** +> A relay host may not inherit its port; `HostSecret.TryValidate` refuses one that tries. A plaintext column +> derived from a *different* item goes stale when that item is edited and nothing re-pushes the hosts beneath +> it, so the relay would keep dialling the old port — which is worse than the restriction. > > **One decision was taken that this plan did not specify.** "Three states where there were two" is four, not > three: a host can bind a key, bind a credential, be pinned to a typed password, or take its group's answer, diff --git a/src/DodoSSH.Client.App/Views/HostSidebar.axaml b/src/DodoSSH.Client.App/Views/HostSidebar.axaml index c72f6a5..cbce23f 100644 --- a/src/DodoSSH.Client.App/Views/HostSidebar.axaml +++ b/src/DodoSSH.Client.App/Views/HostSidebar.axaml @@ -177,10 +177,17 @@ + - + FormatString="0" ShowButtonSpinner="False" + PlaceholderText="{Binding EditorPortPlaceholder}" /> + diff --git a/src/DodoSSH.Client.App/Views/HostsScreen.axaml b/src/DodoSSH.Client.App/Views/HostsScreen.axaml index 35a42db..e69e949 100644 --- a/src/DodoSSH.Client.App/Views/HostsScreen.axaml +++ b/src/DodoSSH.Client.App/Views/HostsScreen.axaml @@ -224,13 +224,58 @@ - - -