Skip to main content
Regulaxy

Working with tables

Sorting, filtering, row density and rows per page — the rules that hold for every table in the system, and why none of them scrolls sideways.

Every list in the system — servers, events, tasks, vulnerabilities, equipment, databases — is the same table component. What is true on one page is true on all of them.

The table never scrolls sideways

Column widths are fitted to the window, not the other way round. Each column has a preferred width and a minimum below which it stops being readable. When they cannot all be shown at a readable width, the columns at the end of the column order drop into a panel belonging to the row itself, opened from a +N button at the end of the row. The identity column is never dropped.

The minimum is measured against the header as well as the values, because a narrow column showing a whole date under a header clipped to two letters is not a readable column.

Every cell is one line. The full value is in the tooltip that opens on hover and in the row panel. There are exactly two exceptions: the identity cell, which holds a name and an address as a single unit, and free-text columns, which clamp after two lines. Every row keeps the same height even when its content is short, because that constant rhythm is what makes a table scannable vertically.

Numbers are aligned to the end of the row in fixed-width digits, so magnitudes can be compared; Latin data — host names, addresses, versions — is aligned left in both languages; Hebrew text is aligned to the start. No data column is centered. Column headers are.

Sorting

Clicking a column header sorts by that column alone, cycling ascending, descending, off. Shift and click adds the column as a further sort level on top of the current one, and every sorted header then shows its level number, so "System ①, Next due ②" reads at a glance.

Sorting works on the raw value, not on what is displayed: dates fall into chronological order and numbers sort as numbers, even where the cell renders them as text.

Empty cells always sort last, in both directions. An empty cell is missing data rather than "the smallest value", and a descending sort that buries it hides exactly the rows that need attention.

Filtering

The second header row holds a funnel for every filterable column. The panel it opens offers three operators, and they all apply together:

OperatorWhat it does
Value pickerThe values present in the column, with a search box inside it
ContainsFree text within the column
From / ToA range, on number and date columns only

Hovering a value in the list reveals Only this — the way to isolate a single value in one click. A column holding more than 300 distinct values offers no checklist at all: it says how many values there are and points at the contains box.

The Free-text search box above the table scans every column by what is displayed in it — what you see is what you can search.

Above the table sits a row of chips: one chip per active filter clause — a value pick, a contains and a range are separate chips — one chip per sort level that is not the page's default, and Clear all. Each chip is removed on its own. The row exists so that "why am I looking at 12 rows?" has an answer in one place, rather than in three columns that have scrolled off the screen. With nothing to say, it does not render at all.

A filter and sort combination can be saved under a name — see saved views. For a panel that shows how many rows sit behind each value before you pick it, see quick filters and bulk actions.

Density and rows per page

Row density — Compact, Normal, Margin — is chosen from a button at the top of the table and stored per table, in this browser. So is the number of rows per page, chosen in the footer from 10 / 20 / 50 / 100. Both are viewing preferences: how many rows fit depends on the screen in front of you and on whether you are reading one row or comparing eighty.

The first time a table opens, the row count comes from the administrator's setting if one was chosen, and otherwise from how many rows actually fit the height of the window. A choice made by the user beats both and is never recomputed.

The footer also says where you are — "Showing 21–40 of 847" — and adds the unfiltered total whenever a filter is active. A count that drops from 847 to 12 without saying that anything was filtered reads as missing data.

The row is a door

In tables where a row has a record to open, clicking anywhere on the row that is not a control opens it. Command or Ctrl with the click, and a middle-click, open it in a new tab. A row with no destination stays inert and gains no cursor promising a click that would do nothing.

Keyboard

The table body is a single Tab stop rather than one stop per row — otherwise a keyboard reaching a hundred-row table is a hundred presses away from the control after it. Inside the body: and move between rows, Home and End jump to the ends, and Enter or space opens the highlighted row, in tables where it has a destination.

Columns

The Columns button opens the column selection and their order. The choice is shared by every user of that table, and only an administrator writes it.

Column names are renamed from the same panel. An administrator applies a new name to everyone behind a separate confirmation that states the scope; an administrator can also grant named users the right to rename columns for themselves only, and the panel then opens for them in a names-only mode, with no dragging and no hiding. Clearing the name box restores the shipped name.

Updated

This page is the file content/docs/en/v1/start/tables.mdx