> For the complete documentation index, see [llms.txt](https://intuitem.gitbook.io/ciso-assistant/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://intuitem.gitbook.io/ciso-assistant/product-docs/features/working-with-tables.md).

# Working with tables

Almost every list in CISO Assistant — applied controls, risk scenarios, assets, evidences, audits — is a **model table** built from the same component. That means the toolbar and gestures are identical wherever you go: learn them once and they work everywhere.

This page covers the full table surface: the four ways to **shape what you see** (search, filter, sort, columns) and the two ways to **act on rows** (context menu for one, batch actions for many).

## Search

The toolbar's **search box** (placeholder *"Search..."*) runs a full-text search across the table's records. Typing filters the list as you go — the query is debounced, so the table updates a fraction of a second after you stop typing rather than on every keystroke.

Search is scoped to the table you're on and isn't remembered between visits — it's the quick, throwaway way to find a row. For a search that spans the whole platform, use [Universal search](/ciso-assistant/product-docs/features/search.md).

## Filtering

The **Filters** button opens a panel of per-column filters tailored to the model — status, domain, owner, priority, labels, and so on. Pick one or more values and the table narrows to matching rows. A small count next to the **Filters** button shows how many filters are active, and **Reset filters** clears them all.

{% hint style="info" %}
**Filters are remembered in your browser, per table.** Set a filter on applied controls, navigate away, come back — it's still applied. The selection is stored locally on standalone list pages, so each table reopens the way you left it.

Two things override a remembered filter: opening the table through a **link that carries filter parameters** (the link's filters win), and embedded sub-tables inside a record's detail page (those don't persist).
{% endhint %}

## Sorting

Click a **column header** to sort by it; click again to flip ascending ↔ descending. An arrow on the header shows the active sort and its direction. Only one column sorts at a time.

### Why some columns aren't sortable

Columns that hold **a list of values per row** — owners, labels, linked threats or assets, applied controls, evidences — have a non-clickable header on purpose. Sorting puts rows in order by a single value, but a cell containing many values has no single value to sort on: ordering rows by a one-to-many or many-to-many relationship is ambiguous and would duplicate rows in the result. Sort by a **scalar column** instead — reference, name, status, a date — and use [Filtering](#filtering) to narrow by the multi-value fields.

## Rows per page and pagination

The **rows-per-page** selector and the page you're on are remembered per table, so a table you like to read 50-at-a-time stays that way.

## Choosing columns

Tables ship with a sensible default set of columns, but the right set — and the right order — depends on the task. The **column selector** — a table-columns icon in the toolbar, next to the rows-per-page control — lets you pick what shows and arrange it.

The dropdown shows your **visible columns first, in display order**, each with a drag handle, followed by a **Hidden** group you can switch on:

* **Tick / untick** to show or hide a column.
* **Drag the handle** (⋮⋮) to reorder a visible column — e.g. move **Ref ID** below **Name**.
* **Show All** reveals everything, including optional columns.
* **Hide All** trims to a single column.
* **Reset to default** returns to the table's standard columns *and* order.

When some columns are hidden, the button shows a **visible/total** count (e.g. `12/16`).

{% hint style="info" %}
At least one column always stays visible — the last one's checkbox is locked with the note *"At least one column must remain visible"*, so a table can never end up empty. Your column **choice and order** are **remembered per table, in your browser**.
{% endhint %}

### Default and optional columns

Two kinds of columns appear:

* **Default columns** — the standard set shown out of the box, visible until you hide them.
* **Optional columns** — extra fields the record already carries but that aren't shown by default, such as **Start date**, **Expiry date**, **Created at**, and **Updated at** on applied controls. They sit at the end of the list, switched off, ready to turn on when you need them.

This keeps default tables clean while putting the less-common fields one click away. Feature-flagged columns switched off for your instance never appear in the list.

## Acting on rows

The same table surfaces two ways to change data without leaving the list: a **context menu** for one row, and **batch actions** for many.

### Context menu — one row

**Right-click any row** to open a shortcut menu. It's the fast path when all you want is to flip one field, skipping the row-detail page.

Three universal items sit at the bottom:

* **Edit** — opens the row in edit mode (hidden for builtin or library-shipped rows, which are read-only).
* **View** — opens the row's detail page.
* **Delete** — appears only when the table allows deletion and the row isn't builtin. Folders use the recursive-delete dialog; everything else a standard confirm.

Some models add domain-specific shortcuts above the trio:

| Model                                                                                              | Custom items                                                                                         |
| -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| **Applied controls**                                                                               | Change status · Change impact · Change effort · Change priority · Change CSF function · Replace with |
| **Evidences**                                                                                      | Change status                                                                                        |
| **Task occurrences**                                                                               | Change status                                                                                        |
| **Vulnerabilities**                                                                                | Change status · Change severity                                                                      |
| **Elementary actions** (EBIOS RM)                                                                  | Change attack stage                                                                                  |
| **Feared events / RO-TO couples / Stakeholders / Attack paths / Operational scenarios** (EBIOS RM) | Select object                                                                                        |

The win is speed and staying in context — you keep your scroll position, filters, and selection.

### Batch actions — many rows

When the same change has to land on many rows, models that opt in grow a **leading checkbox column**. Tick rows (or the header checkbox to select the whole page) and a **batch action bar** appears with the operations available on that model.

| Type              | What it does                                                                               |
| ----------------- | ------------------------------------------------------------------------------------------ |
| **Delete**        | Removes the selected objects (skips builtin / library-protected rows)                      |
| **Change field**  | Sets a single scalar field on all selected rows                                            |
| **Change M2M**    | *Replaces* a many-to-many field with the picked values                                     |
| **Add M2M**       | *Appends* values to a many-to-many, keeping existing ones                                  |
| **Remove M2M**    | *Removes* specific values from a many-to-many, keeping the rest                            |
| **Change folder** | Reassigns the rows' [domain](/ciso-assistant/product-docs/concepts/foundations/domains.md) |
| **Group**         | A submenu bundling related actions under one button                                        |
| **Merge**         | Combines selected rows into one (today: applied controls)                                  |

Most actions open a confirmation modal — a count and explicit confirm for **Delete**, a dropdown of valid values for **Change field**, a searchable list for the M2M actions, a domain picker for **Change folder** — so a 200-row change is never an accident. Validation runs through the model's normal write rules, the same ones that protect a single edit.

Batch actions are **opt-in per model**. Applied controls have the richest set; risk scenarios, vulnerabilities, evidences, tasks, assets and others carry subsets. Sensitive surfaces like users, frameworks and folders deliberately ship without bulk actions, and requirement assessments have no bulk delete by design (they're children of audits).

## What's remembered in your browser

Your table preferences are stored **locally, per browser and per device** — they don't follow you to another machine or sync to your account.

| Preference                         | Remembered?                                       |
| ---------------------------------- | ------------------------------------------------- |
| Active **filters**                 | Yes, per table (a filter-carrying link overrides) |
| **Columns** shown and their order  | Yes, per table                                    |
| **Rows per page** and current page | Yes, per table                                    |
| **Search** text                    | No — clears each visit                            |
| **Sort** column                    | No — resets to the table's default each visit     |

## Related

* [Universal search](/ciso-assistant/product-docs/features/search.md) — search across the whole platform, not just one table
* [Action plans](/ciso-assistant/product-docs/features/action-plans.md) — a table view that leans on these affordances
* [Applied controls](/ciso-assistant/product-docs/concepts/operations/applied-controls.md) — the model with the richest row actions and optional columns
* [Domains](/ciso-assistant/product-docs/concepts/foundations/domains.md) — the target of the **Change folder** batch action


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://intuitem.gitbook.io/ciso-assistant/product-docs/features/working-with-tables.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
