You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of #2410 (epic: iOS navigation redesign — A′ · Two Hats, adaptive). Wave 1. Blocked by #2412 (IOS-0). Edits AttentionView.swift alongside #2419 and InventoryView.swift alongside #2420 — coordinate landing order with those assignees.
Context — the chrome is inconsistent today
Screen
Server switcher
Evidence
Attention
.topBarLeading
AttentionView.swift:1107-1113
Farm
.topBarTrailing
PrinterListView.swift:68-69
Dashboard
.topBarTrailing
DashboardView.swift:74-75
Scan / Tasks / Inventory
absent
—
Same control, three different answers, and missing entirely from half the roots. And there is no account button anywhere in the app today — it is net-new.
The rule (normative — this is what the UI test in #2425 will assert)
Leading: server chip. Every tab root. Identical position, no exceptions.
Trailing: account button, always last. Screen actions (filter, search, scan) sit to its left.
Pushed screens: none of the above. Back button and title take over.
Why the account button may live in the nav bar when Attention may not
Recorded so the reasoning survives the next redesign: a nav bar belongs to the current screen. A destination placed there is either duplicated on every screen or vanishes when you leave — which is exactly the bug this epic is fixing. Account survives that test because it is low-frequency and terminal: you go there, you do one thing, you come back. That is the same slot iOS gives the profile on a tab root in App Store, Music, and Photos. Attention fails it on every count — high frequency, deep destination with its own feed/filters/detail stack, and a badge that would drop from a system-standard always-visible tab badge to a non-standard glyph badge. Attention stays in the tab bar. See #2410 non-goals.
Scope
Consolidate the server switcher to .topBarLeading on every tab root, including the three that lack it.
Add the account button — the first one in the app — at trailing-last on every tab root.
Order all existing trailing screen actions to sit left of it.
Ensure no pushed screen carries the switcher, the account button, or the mode control.
The account area is the new home for Settings, Notifications, Manage Servers (re-homed by #2419) and the Offline Queue (re-homed by #2420). This issue owns the button and the container; those issues own moving their content into it.
ServerSwitcherMenu already supports a style: parameter (ServerSwitcherMenu(style: .toolbar)) and ServerSwitcherViewModel.isVisible already suppresses it for single-server installs — reuse both rather than adding a new visibility rule.
Acceptance criteria
Server switcher is .topBarLeading on every tab root in both shells and both modes, and its existing single-server suppression still applies.
Part of #2410 (epic: iOS navigation redesign — A′ · Two Hats, adaptive).
Wave 1. Blocked by #2412 (
IOS-0). EditsAttentionView.swiftalongside #2419 andInventoryView.swiftalongside #2420 — coordinate landing order with those assignees.Context — the chrome is inconsistent today
.topBarLeadingAttentionView.swift:1107-1113.topBarTrailingPrinterListView.swift:68-69.topBarTrailingDashboardView.swift:74-75Same control, three different answers, and missing entirely from half the roots. And there is no account button anywhere in the app today — it is net-new.
The rule (normative — this is what the UI test in #2425 will assert)
Why the account button may live in the nav bar when Attention may not
Recorded so the reasoning survives the next redesign: a nav bar belongs to the current screen. A destination placed there is either duplicated on every screen or vanishes when you leave — which is exactly the bug this epic is fixing. Account survives that test because it is low-frequency and terminal: you go there, you do one thing, you come back. That is the same slot iOS gives the profile on a tab root in App Store, Music, and Photos. Attention fails it on every count — high frequency, deep destination with its own feed/filters/detail stack, and a badge that would drop from a system-standard always-visible tab badge to a non-standard glyph badge. Attention stays in the tab bar. See #2410 non-goals.
Scope
.topBarLeadingon every tab root, including the three that lack it.The account area is the new home for Settings, Notifications, Manage Servers (re-homed by #2419) and the Offline Queue (re-homed by #2420). This issue owns the button and the container; those issues own moving their content into it.
ServerSwitcherMenualready supports astyle:parameter (ServerSwitcherMenu(style: .toolbar)) andServerSwitcherViewModel.isVisiblealready suppresses it for single-server installs — reuse both rather than adding a new visibility rule.Acceptance criteria
.topBarLeadingon every tab root in both shells and both modes, and its existing single-server suppression still applies.xcodebuildbuild succeeds;PrintFarmerTestspass.Files to touch
mobile/PrintFarmer/Views/Attention/AttentionView.swiftmobile/PrintFarmer/Views/Printers/PrinterListView.swiftmobile/PrintFarmer/Views/Filament/InventoryView.swiftmobile/PrintFarmer/Views/Shifts/ShiftTasksView.swiftmobile/PrintFarmer/Views/Dashboard/DashboardView.swiftmobile/PrintFarmer/Views/Components/ServerSwitcherMenu.swiftDo not