busy-office-ui
Menu

Pattern: suite home

Who uses it: anyone whose work spans modules — a controller touching Finance and Purchasing, an ops lead across Warehouse and Reports; the screen behind the brand link and the switcher's "home". How often: between tasks, and first thing after sign-in when no single role owns the day. What "done" looks like: cross-module status in one glance, and any module one click away — the sidebar at this level lists modules, not one module's screens (the Fiori "My Home" / Dynamics areas shape). Not for one role's daily queue — a buyer who lives in Purchasing all day wants role home, which shows their work, not the suite; and not just a launcher — a pure tile grid with no live status is app launch.

The screen

Acme ERP
Waiting on you
7 4 approvals · 2 receipts · 1 exception
Across your modules
  • Purchasing PO-88213 waiting on cost-center approval · 2 days
  • Finance Payment run FX-441 blocked — budget hold
  • Warehouse Stock count WH-2 finishes today

Your apps

The frame is the app frame; what makes this screen the SUITE's home is the sidebar level — modules, with Home itself the current entry — and a main region aggregating status across them. Entering a module swaps the whole sidebar to that module's nav.

Markup

<!-- Suite home = the app frame with the sidebar at SUITE level:
     entries are MODULES (the Dynamics areas / Fiori "My Home" shape), and
     main is a cross-module overview. Everything is shipped primitives —
     stat widgets, an elevated-alert list, the launcher's tile grid. -->
<nav class="bo-sidebar-nav bo-app-shell__sidebar" aria-label="Modules">
  <ul role="list">
    <li><a class="bo-sidebar-nav__link" href="/home" aria-current="page">…Home…</a></li>
    <li><a class="bo-sidebar-nav__link" href="/finance">…Finance…</a></li>
    <li><a class="bo-sidebar-nav__link" href="/purchasing">…Purchasing…</a></li>
    <li><a class="bo-sidebar-nav__link" href="/warehouse">…Warehouse…</a></li>
  </ul>
</nav>
<main class="bo-app-shell__main">
  <div class="bo-widget-grid" style="--bo-widget-min: 14rem">
    <section class="bo-widget"> …stat: open approvals, all modules… </section>
    <section class="bo-widget bo-widget--span-2"> …needs attention, cross-module… </section>
  </div>
  <div class="bo-widget-grid" style="--bo-widget-min: 8rem"> …favourite app tiles… </div>
</main>

Anatomy

  1. Module sidebar — sidebar nav, one entry per module the user may open, Home current; aria-label="Modules" says which level this sidebar is.
  2. Cross-module "needs you" stat — a widget with one number and its breakdown; links into the inbox.
  3. Across-your-modules list — module badges + one line each; every row links to the screen that resolves it (the journey rule: an exit lands at the next decision).
  4. Favourite apps — the launcher's own tile mechanism (app launch) at a smaller size; personal, server-persisted.

Data contract

RequestReturns / on failure
GET /homesidebar + tiles render immediately (role-filtered server-side); the two status widgets may arrive as follow-up fragments
GET /home/statusthe cross-module widgets, aggregated server-side — the page never fans out N module requests from the browser. On failure: the widgets show their error state inline; sidebar and tiles are unaffected
4xxexpired session → full navigation to login; a module gone from the user's role → its entry is simply absent on the next render

States

StateWhat ships
Nothing needs youthe stat reads 0 with "all clear" text — a zero is a fact, not an empty state
Status unavailablethe two widgets show an inline error with retry; sidebar and tiles keep working — partial failure never takes the frame
Single-module userthis screen is WRONG for them — route straight to their role home or the module; a one-module suite home is a corridor with one door
New user, no favouritesthe tile row seeds from role defaults, never renders empty beside a working suite
Narrowthe shell's icon rail, same as every screen in the frame
No JSfully functional — every element here is links and server-rendered content; there is nothing to enhance

Components used

complexity 2 of 4

↑↓ move Enter open Esc close