• v2026.05.08.3 Stable

    bvandeusen released this 2026-05-08 22:08:27 -04:00 | 978 commits to main since this release

    Flutter admin parity slice — closes the operator-actionable subset of the admin surface on mobile and simplifies the home AppBar.

    Flutter (admin slice)

    Three new fullscreen routes under /admin:

    • Requests — list of pending Lidarr requests with Approve / Reject. Joins requester user_id → username client-side via adminUsersProvider.
    • QuarantineExpansionTile per aggregated track row (collapsed: track + report-count + top reason; expanded: per-user reports). Three-dot menu with Resolve / Delete file / Delete via Lidarr; both deletes route through a TypedConfirmSheet requiring typed "DELETE".
    • Users — Users + Invites in one scroll. User edit sheet exposes admin / auto-approve toggles, admin-supplied password reset, typed-confirm delete. Invites section shows token (monospace, copy button), optional note, redeemed badge; "Generate" opens a note-input dialog (server hardcodes 24h TTL).

    Plus an AdminLandingScreen with three section cards driven by adminCountsProvider (parallel fan-out for at-a-glance counts).

    Flutter (nav restructure)

    Home AppBar simplified from 5 icons to 3 primary + a kebab overflow:

    • Primary icons: Home / Library / Search (current screen suppressed)
    • Kebab: Playlists / Discover / Settings / [Admin if isAdmin]

    The new shared MainAppBarActions widget is adopted across all top-level screens for consistency. Admin entry is also discoverable via a Settings card (admin-only).

    Routing

    buildRouter redirect closure now refuses any /admin/* path when user.isAdmin == false (server RequireAdmin middleware remains the authority — this is UX).

    Operator notes

    • After upgrading the APK, admins will see a new "Admin" entry in the kebab menu and a card at the bottom of Settings.
    • Non-admins see no UI changes besides the simpler AppBar.
    • The next slice (TBD) will address the bootstrap-invite-token gap noticed during the last deploy: when a bootstrap admin already exists from MINSTREL_AUTH_ADMIN_USERNAME, fresh self-registration via /register falls through to the invite-only mode and fails because no invite-generation UI is reachable. Now that admins can generate invites in the new Users screen, the operator workaround is "log in as bootstrap admin → generate invite → register with token", but a smoother default belongs in a follow-up.
    Downloads