# List Surface Review Checklist > Use this checklist for every spec or PR that creates or modifies a Filament table/list surface. > All items must be satisfied or have a documented exception. --- ## Table Structure - [ ] Columns follow the tier model (Primary / Context / Detail) - [ ] Max ~7 visible columns by default (or density justified) - [ ] Primary identifier is `searchable()` and `sortable()` - [ ] Explicit `defaultSort()` is defined - [ ] Timestamps use `->since()` + tooltip in lists - [ ] Null values use `->placeholder('—')` consistently - [ ] IDs are `toggleable(isToggledHiddenByDefault: true)` and `copyable()` where useful - [ ] Status/enum columns use `badge()` via `BadgeCatalog` / `BadgeRenderer` - [ ] Pagination profile matches the surface type (see table standard) ## Empty State - [ ] `emptyStateHeading(...)` is domain-specific - [ ] `emptyStateDescription(...)` explains what the user should do - [ ] Exactly 1 primary CTA in `emptyStateActions([...])`, RBAC-gated - [ ] When non-empty, CTA is in header only (not duplicated) ## Filters - [ ] Tier 1–2 resources use the persistence trio - [ ] Status/state filters use enum-backed options - [ ] Soft-deletable resources use standard `TrashedFilter` labels - [ ] Date range filters use `indicateUsing()` - [ ] Filter count is reasonable (2–5 for Tier 1–2, 0–3 for Tier 3) - [ ] Filter labels are clear and consistent with domain vocabulary ## Actions - [ ] Inspect affordance exists (clickable rows preferred) - [ ] No lone "View" row action button - [ ] Max 2 visible row actions; rest in "More" group - [ ] Destructive actions use `->requiresConfirmation()` - [ ] Bulk actions use `BulkActionGroup` - [ ] All actions are server-side authorized ## Persistence & State - [ ] Resource lists (Tier 1–2) persist filters, search, sort in session - [ ] Picker/widget tables do NOT persist state - [ ] Refresh does not destroy user context on critical lists ## Performance - [ ] No casual `sortable()` / `searchable()` on relations without query review - [ ] No row-by-row counts in hot lists unless optimized - [ ] Eager loading where relation-backed columns are rendered - [ ] Default sort is query-efficient ## RBAC / Tenancy - [ ] Cross-tenant/workspace tables provide enough context - [ ] Technical IDs are not more prominent than needed - [ ] Actions/CTAs are capability-gated - [ ] Non-member access is 404, not 403 ## Responsive - [ ] No unnecessary horizontal overload - [ ] Long text uses `wrap()` or `limit()` + `tooltip()` - [ ] Long IDs do not break layout --- ## How to Use 1. Before submitting a PR that touches a table surface, walk through this checklist. 2. Mark items as checked or note the documented exception. 3. If you're adding a new resource, this checklist applies from the first implementation. 4. Guard tests enforce the most critical items automatically — this checklist catches the rest.