Skip to content

Filters & Listing

Status: ✅ Implemented

Locate and operate on records with minimal effort.

A listing without live filters, row actions, and bulk actions forces users to navigate to each record individually to do anything. High-volume workflows become impractical.

Use @List for the collection class, @Filterable on filter fields, @RowAction for per-row actions, and @ListToolbarButton for bulk actions. Column display is controlled with @ColumnWidth and @HiddenInList.

@UI("/products")
public class ProductsListing extends AutoCrudOrchestrator<Product> {
@ListToolbarButton(rowsSelectedRequired = true, confirmationRequired = true)
public void deactivateSelected(List<Product> selected) {
selected.forEach(p -> p.setActive(false));
repository.saveAll(selected);
}
}
public class Product {
@Filterable
private String name;
@Filterable
private ProductCategory category;
@HiddenInList
private String internalNotes;
@ColumnWidth("80px")
private boolean active;
}
┌──────────────────────────────────────────────────────┐
│ Name [_________] Category [___▼] [Search] │
├──────────────────────────────────────────────────────┤
│ ☐ Name Category Active [Actions] │
│ ☑ Product A Electronics ✓ [Edit] [▼] │
│ ☑ Product B Clothing ✓ [Edit] [▼] │
│ ☐ Product C Electronics ✗ [Edit] [▼] │
├──────────────────────────────────────────────────────┤
│ [Deactivate selected] [New] │
└──────────────────────────────────────────────────────┘
  • Workflow over screens — act on data without leaving the list
  • Keyboard-first — filters respond to Enter via @Trigger(type = OnEnter)