Filters & Listing
Status: ✅ Implemented
Intent
Section titled “Intent”Locate and operate on records with minimal effort.
Problem
Section titled “Problem”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.
Solution
Section titled “Solution”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;}Structure
Section titled “Structure”┌──────────────────────────────────────────────────────┐│ Name [_________] Category [___▼] [Search] │├──────────────────────────────────────────────────────┤│ ☐ Name Category Active [Actions] ││ ☑ Product A Electronics ✓ [Edit] [▼] ││ ☑ Product B Clothing ✓ [Edit] [▼] ││ ☐ Product C Electronics ✗ [Edit] [▼] │├──────────────────────────────────────────────────────┤│ [Deactivate selected] [New] │└──────────────────────────────────────────────────────┘Principles served
Section titled “Principles served”- Workflow over screens — act on data without leaving the list
- Keyboard-first — filters respond to Enter via
@Trigger(type = OnEnter)