Scoping of the Log In screen — the app's unauthenticated entry point (member-number / ALPA-email credential form). Documentation only; no presentation work. An outlier screen: it sits outside the authenticated screen set and is not modeled in the screen-mapping screen array.
AuthenticateUserViaJWTAsync takes AuthJWTRequest { AlpaId, Domain, Password } and returns
AuthJWTResult { access_token, expires_in, features[], user_info }. Forgot-password and Create-account are
external web links; Help is a mailto (apphelp@alpa.org).
No backend data gaps. Open items are presentation / interactivity in the Blazor
scaffold (see §4) plus three confirms (Domain derivation · features[] semantics ·
UserInfo.Rank dependency).
/login) — a member / non-member user-type selector, then a
two-field credential form: Member Number or ALPA Email + Password (with a show/hide eyeball), a
"Forgot Member Number" link (node 5251:15088, gap-audited 2026-07-06 — see below), a
primary "ALPA Members Log In" CTA, a secondary "Non-Members Log In" button, a
"Create ALPA Account" link, a Remember Me + Forgot Password row, a
footer "Click here for more help" link, and the bottom navigation bar.| Element | Data | Source (exists) | Status |
|---|---|---|---|
| Username field | member number or ALPA email | AuthJWTRequest.AlpaId | mapped |
| Password field | password (+ show/hide) | AuthJWTRequest.Password · show/hide via ToggleShowPasswordCommand (icn_login_eye) | mapped |
| Tenant/domain | auth domain (member vs non-member) | AuthJWTRequest.Domain (derived from RestService.BaseDomain) | mapped confirm |
| ALPA Members Log In (primary) | authenticate | LogInCommand → LogInAsync → AuthenticateUserViaJWTAsync → AuthJWTResult { access_token, expires_in, features[], user_info } | mapped |
| Member / Non-Member toggle | user type | MemberCommand / NonMemberCommand (IsMember, UserTypeSelectorVisible) — same endpoint; email vs member-number validation | mapped |
| Remember Me | persist session preference | SettingsService.RememberMe → AppProperties.RememberMe (local pref) | local |
| Forgot Password | password reset | web: member → {BaseUrl}/pages/password-help; non-member → https://appsignup.{BaseDomain}/Home/ctl/SendPassword (ForgotPasswordCommand) | web-link |
| Forgot Member Number | member-number lookup/recovery | Not yet wired to a command — no member-number-lookup endpoint identified in the mobile REST client. Gap-audited 2026-07-06 (Figma node 5251:15088, "button link" — a plain FRAME, not a published component; resolved not-catalogued as one-off content, D49). Likely mirrors Forgot Password's web-link pattern; not confirmed. | confirm |
| Create ALPA Account | registration | web: https://appsignup.{BaseDomain} (RegisterCommand) | web-link |
| "Click here for more help" | support contact | mailto apphelp@alpa.org (EmailSupportCommand) | |
| Authenticated user | name · rank · profile | AuthJWTResult.user_info → UserInfo (stored via ITokenStore.UserInfoJson) | mapped Rank in-progress |
| Feature flags | login-time capability gating | AuthJWTResult.features (List<string>) | mapped confirm |
| Error states | bad credentials · empty input · network | "BadCredentials" → Constants.ExceptionMessageBadUserNamePassword (401 default); empty-username DisplayAlert; RestService error mapping | mapped |
| # | Item | Question |
|---|---|---|
| 1 | Domain derivation | How is AuthJWTRequest.Domain set for member vs non-member sign-in? It is derived from RestService.BaseDomain — confirm the non-member case resolves to the same tenant the JWT endpoint expects. |
| 2 | features[] semantics | Which feature flags does AuthJWTResult.features return at login, and which login-time / onboarding UI do they gate? Confirm the list and meaning (and the non-member subset). |
| 3 | UserInfo.Rank | Dependency: Rank rides on user_info but is one of the three in-progress backend changes (AB#1821 Change 1 — Rank, blocking for Home's Pilot Card). No login-screen change, but the post-login experience depends on it. See home-screen-data-gap.html. |
| 4 | Non-member scope | What can a non-member session access once authenticated (which features / screens)? Confirm the non-member capability scope so the post-login surface degrades correctly. |
| 5 | Forgot Member Number destination | Added 2026-07-06 (gap audit, D49). No backend endpoint identified for member-number lookup/recovery — confirm whether this is a web-link (mirroring Forgot Password) or a new mobile-side flow. |
Backend mapping is complete; the open work is wiring the Blazor scaffold (/login, currently static inputs)
to the existing view-model commands and adopting the canonical form atoms:
ToggleShowPasswordCommand (icn_login_eye / icn_login_eye_cross), but the scaffold input is a static type="password" with no eyeball. Wire the toggle.<input type="checkbox"> has no C# backing field or handler (violates the "interactive controls must have state" rule). Bind it to RememberMe.UserTypeSelectorVisible toggle (MemberCommand / NonMemberCommand); the scaffold renders both buttons statically. Reconcile to the selector model.LogInCommand / RegisterCommand / ForgotPasswordCommand / EmailSupportCommand.AuthJWTRequest → AuthJWTResult).appsignup.{BaseDomain} /
password-help); Help composes a mailto to apphelp@alpa.org.features[] semantics + non-member subset ·
UserInfo.Rank dependency (AB#1821 Change 1) · Forgot Member Number destination (added 2026-07-06, D49).