| UI or UX | UI + UX - Semantic row-and-column data comparison surface | UI + UX - Control for changing the order of an existing result set | UI + UX - Grouped filter control panel for narrowing a current result set | UI + UX - Paged navigation control |
| UI guidance | Render a table with a specific caption or heading, visible column headers, optional row headers, aligned values, consistent row actions, and enough spacing for scanability. | Place the active sort control above or inside the result region it affects, with a visible label such as Sort by and an option name that includes both the attribute and direction. | Render filter categories as labelled form controls in a panel adjacent to the result set on wide layouts, with a visible result count and active-filter summary near the results. | Render a labeled pagination nav near the affected results with current page, previous, next, nearby pages, optional first/last or ellipsis, and clear disabled edge states. |
| UX guidance | Use tables when aligned columns help users compare records, find exceptions, audit values, or triage work faster than opening each item. | Use sort controls when users need to rearrange the same matching results by a meaningful attribute while preserving the current search query, filters, page size, and view context. | Use a filter panel to help users narrow the current list or search result set while preserving orientation, search query, sort order, pagination context, and selected values. | Help users move through an ordered result set with a stable sense of position, progress, and returnability. |
| Good UI | A payment review table has the caption June vendor payments, headers Vendor, Status, Due date, Amount, and Action, right-aligned amounts, and row actions labelled by vendor. | A search results page shows Sort by with options like Relevance, Due date (oldest first), and Amount (highest first) above the results. | A desktop search page shows a left filter panel with Status, Type, and Date groups, while active chips and the result count sit above the results. | Current page, previous/next, disabled edges, page numbers, result range, and total count are visually clear. |
| Bad UI | A div layout looks like columns but has no caption, table semantics, or header associations. | A menu labelled Sort contains Status: Open, Last 30 days, and Owner, which are filters rather than ordering rules. | A filter drawer closes with no active count, leaving users unaware that filters are still hiding records. | Tiny numbers with no current state. |
| Good UX | A user sorts by Amount descending, filters to Pending, moves to page 2, and the table keeps its caption, active sort, active filter, row count, and selected payment context. | A user searches for case, changes Sort by from Relevance to Due date (oldest first), and the same filtered records reorder while the query and filters remain. | A user selects Status: Open and Type: Appeal, applies the batch, lands back at the result summary, and sees 12 records with both criteria removable. | Users move through pages while query, filters, and sort persist. |
| Bad UX | Filtering the table removes selected rows without explaining why or offering a clear-filter path. | Changing sort clears the search box and removes active filters. | Applying a filter silently resets the query, sort order, current page, and view density. | Changing page resets filters. |
| Best fit | Records share comparable attributes that users need to scan in aligned columns. | Users need to compare or act on a result set in different orders. | Users need to narrow the current search results, browse results, table, card grid, or list by multiple criteria. | The collection has many ordered results. |
| Avoid when | The content is layout, not data. | Users need to narrow which records are shown rather than change their order. | The result set is small enough that scanning is faster than filtering. | Users need uninterrupted reading or comparison. |
| Required state | Default table state with caption, visible headers, row values, and result count or context. | Default sort state that identifies the initial order and why it is appropriate. | Default state with no user-applied filters and an explicit result count. | First page with disabled previous control. |
| Accessibility burden | Use native table semantics for tabular data rather than div-only rows. | Use a native select, radio group, or correctly implemented menu button for standalone sort controls. | Use semantic form controls with fieldsets, legends, labels, and accessible names for filter categories and values. | Use a labeled navigation region. |
| Common misuse | Using table markup to create page columns or layout spacing. | Putting filtering criteria such as date ranges, status, category, or owner inside a sort menu. | Hiding active filters inside a closed panel with no count, chips, or result-state summary. | Using pagination for a tiny collection. |