Browsing & Search
The main surface shows your cases as a list, a table, or a board. It supports text search, multi-criteria filters, grouping, sorting, and column customisation — designed to help you find the right case quickly, even in repositories with thousands of cases.
Think of it as a spreadsheet with a brain
Unlike a static spreadsheet, the case surface groups rows by lifecycle state or template, filters by linked issues, and shows live execution status alongside your test case data. You get the familiarity of columns and rows with the intelligence of built-in queries — no formulas needed.
Choosing a view
Open the Display popover (the sliders icon in the toolbar) and pick a Case view:
| View | What it gives you |
|---|---|
| List | Compact rows with the properties you choose shown as trailing chips. Good for scanning and for reading long titles. |
| Table | A column grid with a frozen ID and Title block. Good for comparing many fields at once. |
| Board | Cards in columns by whatever you are grouping on. Good for seeing the shape of a folder at a glance. |
You can also switch from the command palette: press ⌘K and choose Switch to List / Table / Board view.
Display properties
In List and Board view, the Display popover carries a Display properties section deciding which trailing chips each row or card shows. Built-in chips, in the order they appear:
State, Folder, Template, Labels, Requirements, Linked issues, Updated, Created by, Updated by, Latest result. Below them, a Custom fields section adds one chip per option-typed field your administrator defined.
On by default: State, Linked issues, Updated, and every custom field chip. The rest are opt-in. A count beside the heading tells you how many are currently shown.
The vocabulary is scoped to the surface you are on. Test Cases does not offer Result, Tester, or Executions — those describe one execution and belong to Test Runs. The repository’s nearest equivalent is Latest result, the most recent outcome across every run.
Once the popover holds more than ten properties — in practice, as soon as your project has a custom field or two — a Find a property… box appears above the chips.
In Table view this section is replaced by a pointer. Columns are a different mechanism, so the popover sends you to the Manage columns control in the table header instead. See Column customisation.
What a board card shows
Two rules shape a board card, and both exist so the cards stay readable rather than complete:
- The grouped property is not repeated on the cards. The column header already states it, so grouping by Folder drops the folder chip from every card beneath it, grouping by State drops the state chip, and so on. Grouped by Linked issue, only that column’s own key is dropped — a case linked to DEV-2 and DEV-4 still shows DEV-4 in the DEV-2 column.
- Chips are capped at two lines. Anything that does not fit folds into a +N badge; open the case to see the rest. A suppressed grouped property does not count toward that +N, and the space for the badge is reserved by measuring it rather than by dropping a fixed number of chips, so cards do not leave a ragged gap.
Both are display-only and recompute as the data changes — edit a case and its card re-folds without a refresh. Neither touches your saved display-property choices: turn grouping off and every chip returns.
Search
The search box in the toolbar matches a case’s title or its case number. It searches as you type — there is no button to press — and Esc clears it.
- Type a title keyword (e.g. login) to match case titles containing that text, case-insensitively.
- Type a case number to jump straight to that one case. The app writes case references as
C-123everywhere. Older forms still work, so references saved in bug reports or bookmarks keep resolving —TC-123as the case header used to write it,#123, or plain123as the list’s ID column shows it.
Search does not look inside a case. Steps, description, preconditions, and custom field values are not matched — only the title and the case number. If you need to find cases by their content, filter on an option-typed custom field instead.
Search persists in the URL (as
?q=). You can bookmark or share a search URL and anyone with access will see the same filtered results. Links built against the older?search=parameter still resolve.
Filters
Click the Filter button (the funnel icon) to open the filter menu. Filters narrow the surface to cases matching specific criteria, and multiple filters combine with AND logic — all conditions must be true for a case to appear.
| Filter | What it matches |
|---|---|
| Status | Current lifecycle state, e.g. Draft, Ready, Approved |
| Last result | Most recent execution result, e.g. Passed, Failed |
| Template | Cases using a specific template |
| Labels | Applied tags |
| Environments | The environments a case is scoped to. No counts are shown against the options. |
| Created by / Updated by | The user who created, or last edited, the case |
| Linked issues | Has linked issues or No linked issues |
| Linked issue | One specific tracker issue, listed as KEY · title. Offered only when cases in the current scope actually link something, so it never shows an empty list. |
| Issue relation | Requirements or Defects — tick both to see either. See the note below on what Defects covers. |
| Unclassified links | Cases carrying a link with no relation set on it — useful for tidying traceability |
| Subfolders | Include subfolders — widens the current folder scope to everything beneath it |
| Custom fields | One filter per enabled dropdown, multi-select, or checkbox field your administrator defined, labelled with the field’s own name |
Filters apply as you pick them — there is no Apply step. Each active filter appears as a chip below the toolbar with its own clear button, plus a clear-all. Like search, filters persist in the URL.
Only option-typed custom fields become filters. Dropdown, multi-select, and checkbox fields form a finite checklist, so they can be offered as facets. Free-text, number, date, and link fields cannot, and are not shown in the filter menu. A filter whose options are all empty is dropped rather than shown as a dead end.
“Defects” means every non-Requirement link. The Issue relation filter splits your links two ways, and the split is Requirement versus everything else — so Defects also returns cases whose only link is a General one such as Relates to or Blocks, and unclassified links too. That is deliberate, and it is the same rule the Relations page describes. If you want coverage specifically, pick Requirements.
The relation filters need the right permission. Linked issues, Linked issue, Issue relation, and Unclassified links all depend on View external references. Without it they are not in the menu at all.
Column customisation
In Table view, click the sliders control in the table header (Manage columns) to choose which columns are visible and in what order. The following built-in columns are available:
| Column | Visible by default | Notes |
|---|---|---|
| ID | Always | Auto-assigned case number. Frozen — cannot be hidden or reordered. |
| Title | Always | Frozen — cannot be hidden or reordered. |
| State | Yes | Lifecycle state with its configured icon and colour |
| Status (latest) | Yes | Most recent execution result |
| Folder | No | The folder the case lives in |
| Template | No | The template the case uses |
| Labels | No | The tags applied to the case |
| Linked issues | No | Count of linked external references |
| Requirements | No | The tracker issues this case covers — its Requirement-relation links |
| Environments | No | The environments the case is scoped to |
| Estimate | No | Time estimate (e.g. 1h 30m) |
| Created by | No | Who created the case |
| Updated by | No | Who last edited the case |
| Created | No | When the case was created, as elapsed time — see Relative timestamps |
| Updated | Yes | When the case was last edited, as elapsed time — see Relative timestamps |
In addition to the built-in columns, custom field columns are offered for the option-typed fields your administrator defined. Long-form text fields are never offered as a column — a paragraph does not fit in a grid cell, so those render as prose on the case itself.
Until you customise it, a project starts with ID, Title, up to four of your inline-editable dropdown fields (Priority and friends), then State, Status (latest), and Updated. The default is derived from your workspace’s own fields, so a workspace with no custom fields still gets a useful grid and one with twenty does not get all twenty.
Reorder and hide columns with the Move up, Move down, and Hide buttons on each row of the Manage columns panel; add one from the Available and Custom fields lists below. Once a project has more than a dozen columns a Find a field… box appears at the top of the panel.
Column preferences are saved per project. Your column layout — which columns are shown, their order, and their widths — is stored on the server so it persists across sessions and devices. Saved views do not carry their own column layout; switching view does not change your columns.
Resizing columns
Every column in Table view can be resized by dragging the divider on the right of its header. Drag to size, release to save; the width holds between 84px and 520px however far the pointer travels. Double-click a divider to put that column back to its default width.
The dividers are keyboard-operable: tab to one, then ← and → resize in 16px steps and Enter or Space does the same job as a double-click.
ID and Title resize together. They are the frozen block that stays put while the rest of the grid scrolls, so they share one divider at the right-hand edge of the pair, sized between 240px and 680px. That divider has no double-click reset, and unlike the scrolling columns its width is remembered in your browser rather than on the server — it follows you across projects instead of being saved per project.
The row-selection checkbox and the narrow actions column on the far right have no divider and cannot be resized.
Relative timestamps
The Created and Updated columns read as elapsed time rather than a calendar date: just now under a minute, then 5m ago, 3h ago, 5d ago, 2w ago, 4mo ago, 1y ago. It keeps counting in years and never switches back to an absolute date.
Hovering either cell shows the exact moment, in your own date format and timezone, as a tooltip.
Custom DATE fields are not affected. A date you recorded on a case is a value, not an age, so DATE-typed columns keep rendering the actual date.
Sorting
Click a column header to sort by that column, and click again to reverse the direction. You can also set the sort field and direction from the Ordering row of the Display popover. These columns support sorting:
- ID, Title, State, Status (latest), Template, Linked issues, Estimate, Created, Updated
The rest — Folder, Labels, Requirements, Environments, Created by, Updated by, and every custom field column — render as plain labels rather than offering a sort the server would reject.
The Ordering row offers the same set under slightly different names: ID, Title, Created, Updated, State, Template, Status (latest), Issues, Est. effort, followed by each of your workspace’s sortable custom fields in label order. So you can order by Priority or Severity even though those columns carry no header sort.
Est. effort sorts biggest-first. Picking it from the Ordering row lands descending, which puts the longest cases on top and sinks unestimated ones to the bottom — almost always what you wanted when you asked. Clicking the Estimate column header instead follows the normal header rule and lands ascending, so unestimated cases lead. Either way, a second click reverses it.
The default order depends on your fields. A project whose administrator defined a sortable Priority field opens sorted by Priority, descending — the most urgent work first. Without one, it opens by Created, descending. The default only applies until something names an order: once you sort, or open a URL that carries one, your choice wins.
The default is not written into the URL. Opening the page leaves the address bar clean; a
?sort=appears only once you actually choose an ordering. A link with no?sort=therefore resolves the project’s own default on whoever opens it — the same project gives the same ordering — while a link that names one reproduces exactly what you picked, Created included. Applying a filter does not disturb your ordering.
Grouping
Open the Display popover and choose a Grouping. The default is No grouping — a flat list of every case in the current folder scope. The options offered are driven by your workspace configuration, and typically include:
| Grouping | What you get |
|---|---|
| Folder | A group per folder. Enabling Nested folders alongside it indents subfolders under their parents; it stays disabled unless you are grouped by folder. |
| State | A group per lifecycle state (e.g. Draft, Ready, Approved). |
| Status (latest) | A group per execution status (e.g. Passed, Failed, Untested). |
| Template | A group per template used in the project. |
| Created by | A group per user who created a case in scope. |
| Updated by | A group per user who last edited a case in scope. |
| Linked issue | A group per tracker issue linked to a case in scope, plus a No linked issue bucket. This one behaves differently — see the note below. |
| Custom fields | A group per value of an option-typed field. A No value group collects cases without one. |
Grouping by Linked issue puts a case in more than one group. Every other grouping splits your cases into buckets that add up to the total. Linked issue does not: a case linked to three issues appears under all three, so the group counts deliberately sum to more than the number of matching cases. That is the point — the group answers “what covers this ticket?”, and a case touching three tickets is genuinely part of all three stories. Read those counts as memberships, not as a tally of cases.
Toggle Show empty groups if you want groups with no cases to stay visible — useful for spotting a state nobody is using.
Grouping and folder scope are separate things. The scope bar decides which cases you are looking at; grouping decides how they are arranged. You can be scoped to one folder and still group by State.
Loading
Cases load in batches as you scroll, with an indicator at the bottom while more are being fetched.
When there are no cases to show
Nothing on screen has three different causes, and the surface tells you which one you are looking at rather than offering advice you cannot act on.
| When | What it says | What it offers |
|---|---|---|
| No filters, not in a folder, no cases anywhere | No test cases yet — Write your first case, or let AI draft a starter set from a spec or an issue. | New case, Generate with AI, New folder, plus a note that a folder is not required and unfiled cases show up under Unfiled |
| Scoped to a folder that is empty, no filters | Nothing in “<folder>” yet — Add a case here, generate a set with AI, or move existing cases into it. | New case here, Generate here, View all cases |
| Any filter or search is active | No cases match — Nothing in this project matches the filters and search you’ve got applied. | Clear filters, New case |
Filters win over folder scope. An empty folder you have also filtered reads as No cases match, not as an empty folder — telling you to add a case here would be answering a question you did not ask.
Actions you lack permission for are simply absent. One exception: Generate with AI stays visible but disabled at the repository root, because the generator writes into a specific folder and has no picker of its own — open a folder first.
On a genuine first run the table drops its header row entirely; on the folder and filtered states the headers stay, with the message beneath them.
Saved views
Once you have a scope, filter, sort, and grouping you keep coming back to, save it as a view. Saved views appear as pills at the left of the toolbar and can be renamed, starred, and deleted. Every workspace also has a built-in All view.
Selecting multiple cases
Select rows with the checkbox on each row, or press Space on a focused row (hold Shift to extend the selection to a range). A bulk action bar appears at the bottom with the number selected, an Add to run button, and an Actions palette. See Editing & Managing for what the palette offers.
When your selection matches a filter, the bar also offers Select all N matching this filter so you can act on cases you have not scrolled to yet. If a filter cannot be expressed to the server, the bar tells you why rather than silently offering a selection it cannot honour — it names the filters responsible and falls back to the rows you picked by hand.
Nine filters switch that escalation off: Created by, Updated by, Has issues, Linked issues, Issue keys, Unclassified links, Issue relation, Requirements, and Requirement source. With any of them active you can still bulk-edit — you just have to select the rows yourself.
Keyboard shortcuts
| Key | Does |
|---|---|
| ⌘K / Ctrl K | Open the command palette — switch views, create a case, jump around |
| C | Create a new case |
| ↓ / ↑ | Move row focus |
| Home / End | First / last row |
| Enter | Open the focused case |
| Space | Toggle selection on the focused row (Shift extends a range) |
| Esc | Clear the selection, close an open menu, or clear the search box |
| ⌘Z / ⌘⇧Z | Undo / redo your last edit |
Delete and Backspace do nothing on a case row. That is deliberate. Deleting a test case cannot be undone, so it is never one keystroke away — it always goes through the menu and a confirmation.