Skip to main content

Purpose and access

The shared shells give each application surface its navigation and session controls. Routing selects a surface; the API independently authorizes operations. Browser hosts use ROOT_DOMAIN from application configuration.

Screen layout

The admin Mahall sidebar groups People, Finance, Accountant, Registers, Committee, Services, Events, Announcements, Programs, and Reports. Disabled features hide related items. Division labels come from structure configuration. Control includes fleet/users/roles/analytics/plans/settings/audit; Forms is a direct route without a sidebar item.

Fields and displayed information

Search accepts text; the command palette groups matching results and links. Breadcrumb detail titles are supplied by record screens. Notification items display counts/links and the bell loads its own notification data. Record views reuse a shared tab layout.

Actions

Expand/collapse sidebar groups, collapse the desktop sidebar, open mobile navigation, choose a quick action, search/open a result, inspect notifications, or open the account menu and log out. Active navigation follows the current path; record tabs change the visible record section.

Interaction sequence

Choose a primary area → expand its group → select a screen → inspect its breadcrumb → open a related record. Logging out posts to the configured logout endpoint and returns to login. The idle warning offers Stay Logged In and Log out now; the timeout redirects with reason=inactivity and preserves a non-login return path.

States and rules

  • An account without a resolved tenant membership context returns to the admin root; an account without platform membership cannot gain platform privileges through navigation.
  • Legacy accounting, accountant/accounts, accountant/journal, finance/vouchers, admins, and activity paths redirect with HTTP 308 to their canonical admin paths.
  • Unknown hosts fall back to marketing. The proxy does not resolve custom-domain ownership.
  • The admin layout’s dues notification points at /{tenant}/finance/dues, which has no page route in this snapshot. Treat it as a broken destination to review.
  • Sidebar hiding is presentation behavior, not API authorization. The current TenantContextGuard synthesizes an admin membership context for an account with a platform membership when no tenant membership exists; PermissionGuard bypasses operational permission checks for OWNER/ADMIN and the synthesized context. This differs from older architecture prose, so preserve it as current behavior rather than intended policy.

Implementation references

Application-relative paths: apps/web/src/proxy.ts, apps/web/src/features/navigation/admin-shell.tsx, apps/web/src/features/search/command-palette.tsx, apps/web/src/features/navigation/topbar-quick-actions.tsx, apps/web/src/features/navigation/notification-bell.tsx, apps/web/src/features/tenants/notification-bell.tsx, apps/web/src/features/tenants/record-layout.tsx, apps/web/src/features/tenants/use-record-tab.ts, apps/web/src/features/auth/idle-timeout-provider.tsx, apps/web/src/features/auth/logout-button.tsx, and the surface layout.tsx files.