Skip to content

General overview

The GeneralOverview<Row> archetype renders a context switcher at the top (a select listing your records) and the selected record’s overview below, re-rendered in place when the user picks another record — no navigation.

@UI("/requisitions")
@Title("Requisitions")
public class RequisitionOverview extends GeneralOverview<Requisition> {
@Autowired RequisitionRepository repo;
@Override
protected List<Option> switcherOptions(HttpRequest rq) {
return repo.findAll().stream().map(r -> new Option(r.id(), r.title())).toList();
}
@Override
protected Requisition load(String id, HttpRequest rq) { return repo.findById(id); }
@Override
protected Component overview(Requisition r, HttpRequest rq) {
return VerticalLayout.builder().content(List.of(
EntityHeader.builder() // the metadata strip: title + badges + facts + metric
.title(r.title())
.facts(List.of(Fact.builder().label("Business Unit").value(r.unit()).build()))
.metricLabel("Amount").metricValue(r.amount())
.build(),
Card.builder().title(new Text("Details")).build() // … the property cards
)).build();
}
}

The first record is selected by default. emptyOverview() customizes what shows when nothing is selected, and recordLabel() labels the switcher (unlabelled by default). Pair the header with Cards, StatusLists or property rows for the record body — or an embedded routed island when the detail needs its own actions.

The Redwood general overview is main + info: the overview, and a contextual side panel with secondary, read-only context — related contacts, recent activity, notes. Override info(row, rq):

@Override
protected Component info(Requisition r, HttpRequest rq) {
return Card.builder().content(activityOf(r)).build();
}
@Override
protected GeneralOverviewDisplay display() { // optional
return GeneralOverviewDisplay.defaults().toBuilder().promoteInfoSlot(Toggle.on).build();
}

On wide pages the panel sits beside the overview (infoWidth(), default 20rem); below 48rem the two stack. promoteInfoSlot (the Redwood display option of the same name, default off) puts the info panel ABOVE the overview when they stack. display().info() = off drops the panel. Composed on the one responsive grid (a ResponsiveGrid template "main info"), so every renderer draws it.

The info slot beside the overview

This archetype’s switcher is a field in the page body. For a record or context switcher in the page header — on any page, not just this one, with type-ahead search and the object/context distinction — implement RecordSwitcherSupplier; see Page templates › record switcher.

Java.NETPythonVaadinRedwoodReact NativeIntelliJ
Switcher + overview✅✅✅✅✅✅✅
info slot✅✅✅✅✅✅✅
promoteInfoSlot✅✅✅✅🟡 ¹✅✅

¹ Redwood places the info panel in its column; when the layout stacks it keeps the main-first order.

What the Redwood general-overview-page template exposes, and what Mateu gives you for it. The canonical page-header elements shared by every template — title, avatar, status badge, @KPI facts, @Timestamp, peer navigation — are documented once in Page templates; this table covers what is specific to this one.

Legend: ✅ supported · 🟡 partial · — not supported · ⚪ deliberately out of scope

Redwood prop / slotMateu
selectContext / selectObject {data, itemText, secondaryText, avatar, icon}switcherOptions(HttpRequest) returning Options✅
selectContextValue / selectContextItem (controlled selection)the public record field, set by the switcher✅
dataSwitcherType: context | objectthe header switcher (RecordSwitcherSupplier, RecordSwitcher.type); this archetype’s body switcher has no type🟡
displayOptions.switcherSearch (type-ahead inside the switcher)the header switcher’s RecordSwitcher.searchable🟡
displayOptions.promoteInfoSlotGeneralOverviewDisplay.promoteInfoSlot✅
displayOptions.contextualInfoLabel / contextualInfoSticky@KPI facts render, but neither toggle exists🟡
displayOptions.density: standard | compact@Compact, set on the view rather than as a template option🟡
previousItem / nextItem + spPreviousItem / spNextItemPeerNavigationSupplier → PeerNav✅
Slot mainoverview(Row, HttpRequest)✅
Slot info (contextual side panel)info(Row, HttpRequest) + infoWidth()✅
Slot searchthe app-level smart search bar / ⌘K palette, not a page slot🟡
Slot announcement (aria-live)UICommand.announce(text) from any action✅
Switcher change eventswitchRecord — re-renders in place, no navigation✅

Mateu adds two things the Redwood template has no equivalent for: emptyOverview() (what shows before anything is selected) and load(String id, HttpRequest) as an explicit data port, so the switcher never carries the record payload.

demo-admin-panel/.../generaloverview/RequisitionOverview.java (/general-overview-demo). Tests: GeneralOverviewSyncTest.