Public Access
Give the phone its pins: an editor section and chips on Files
The data was never the gap — HostSecret.PinnedPaths syncs and merges on both heads, and the desktop's drawer has staged it since v5 — the phone just had nowhere to add, remove or use a pin. Now it has both halves. The host editor page gains a QUICK ACCESS section over the same shared staging the drawer binds (EditorPinnedPaths, AddEditorPin, RemoveEditorPin), with the remove target at this head's 44dp touch floor rather than the desktop's 22-pixel close box, and no folder glyph because this head embeds no icon font for one. The page also gains a Status line of its own: the add command's five refusals speak through Status, and this page covers the screen that normally draws it — a refusal nothing shows is no refusal at all. The Files screen draws the connected host's pins as chips between the breadcrumb and the listing, each running GoRemoteCommand exactly as a crumb does. They are captured at connect, like ConnectedTo and the session facts before them; a bucket gets none, having no HostSecret to pin anything on. Covered headlessly in ShellFlowTests — connect populates, disconnect clears, a bucket stays empty — and by manual checks 8.18 and 8.19, whose phase preamble also stops claiming thirteen checks when it lists twenty-one.
This commit is contained in:
+55
-1
@@ -1101,7 +1101,7 @@ time)" — is the worse failure of the two: it rebinds a host as a side effect o
|
||||
|
||||
## Phase 8 — Adding and removing on the phone's host list
|
||||
|
||||
Thirteen checks, and the reason there are thirteen rather than none is worth stating: **the layout suite
|
||||
Twenty-one checks, and the reason there are twenty-one rather than none is worth stating: **the layout suite
|
||||
cannot see any of this and structurally never will.** `DodoSSH.Client.App.Layout.Tests` targets `net10.0` and
|
||||
`DodoSSH.Client.Android` targets `net10.0-android`, so a project reference is impossible; Avalonia's
|
||||
application, dispatcher and platform are one-shot process globals, so a second head cannot share the
|
||||
@@ -1418,6 +1418,60 @@ destinations, so switching under a live one would show a screen titled S3 listin
|
||||
the row — that screen keeps its own copy of the host list, so it has to be re-found there by entity id
|
||||
rather than handed the vault's object.
|
||||
|
||||
### 8.18 QUICK ACCESS in the phone's host editor
|
||||
|
||||
Open a host's editor and scroll to QUICK ACCESS.
|
||||
|
||||
**Pass:** an empty list, an add field and an ADD button. Type `/var/www/app` and press ADD.
|
||||
|
||||
**Pass:** a row appears carrying that path and a ✕ at least 44dp on a side. Type the same path again and
|
||||
press ADD.
|
||||
|
||||
**Pass:** nothing is added, and a sentence appears on the page saying the path is already pinned — this page
|
||||
covers the whole screen while it is open, so that sentence is this page's own `Status` line rather than the
|
||||
one the host list draws above HOSTS, which is off-screen right now. Clear the box and press ADD with nothing
|
||||
typed.
|
||||
|
||||
**Pass:** a sentence saying a pinned path cannot be blank, in the same place.
|
||||
|
||||
Press the ✕ on the pinned row, then SAVE.
|
||||
|
||||
**Pass:** back on HOSTS with the pin gone. Open the editor on that host again.
|
||||
|
||||
**Pass:** QUICK ACCESS is empty — the removal was saved, not merely staged. Re-pin `/var/www/app`, SAVE, and
|
||||
check the same host on the desktop.
|
||||
|
||||
**Pass:** the pin is there. `HostSecret.PinnedPaths` is shared and merged like every other field on a host,
|
||||
so nothing about this page keeps its own copy.
|
||||
|
||||
**Failure means:** a refusal that changes nothing on screen is `AddEditorPinCommand` writing to `Status`
|
||||
with nothing on this page bound to it — the honesty rule broken silently, since the command still behaves
|
||||
correctly and only the telling of it is missing. A pin gone after SAVE-then-reopen but present on the
|
||||
desktop is `BuildHost` not reading `EditorPinnedPaths`, or `EditSelectedHost` not loading it back in.
|
||||
|
||||
### 8.19 Pin chips on the Files screen
|
||||
|
||||
Pin a folder on a host, then connect to it on the files screen (SFTP), either directly or via **Connect via
|
||||
SFTP**.
|
||||
|
||||
**Pass:** once connected, a row of chips appears between the breadcrumb and the listing, one per pin, each
|
||||
at least 44dp tall. Tap one.
|
||||
|
||||
**Pass:** the listing navigates straight to that directory, the same as tapping a breadcrumb crumb does.
|
||||
Disconnect, then connect to a host with nothing pinned.
|
||||
|
||||
**Pass:** no chip row at all — not an empty one. Connect to a bucket instead.
|
||||
|
||||
**Pass:** still no chip row, on any bucket. A bucket has no `HostSecret` underneath it and so nothing to
|
||||
pin.
|
||||
|
||||
**Failure means:** chips that do not move the listing are the row's `GoRemoteCommand` binding pointed at the
|
||||
wrong `DataContext` — see the `$parent[views:FilesScreen]` escape every other command in this file uses. A
|
||||
chip row surviving a disconnect, or appearing under a bucket, is `TransfersViewModel.ConnectedPinnedPaths`
|
||||
not being cleared in `CloseSessionAsync` or `OpenBucketAsync`. A chip row missing a pin added *after* this
|
||||
connect is not a bug — see `ConnectedPinnedPaths`'s own remark on why this is a snapshot rather than a live
|
||||
follow, and try disconnecting and reconnecting instead.
|
||||
|
||||
---
|
||||
|
||||
## Phase 9 — Tag chips and the picker
|
||||
|
||||
Reference in New Issue
Block a user