Data Table
Multi-select without sorting
ID | Name | Email | Role | Active | |
|---|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes | |
| 2 | Bob | bob@example.com | User | Yes | |
| 3 | Charlie | charlie@example.com | Editor | No | |
| 4 | Diana | diana@example.com | User | Yes | |
| 5 | Eve | eve@example.com | Viewer | No | |
| 6 | Frank | frank@example.com | Admin | Yes | |
| 7 | Grace | grace@example.com | Editor | Yes | |
| 8 | Heidi | heidi@example.com | User | No | |
| 9 | Ivan | ivan@example.com | Viewer | Yes | |
| 10 | Judy | judy@example.com | Admin | Yes | |
| 11 | Karl | karl@example.com | User | Yes | |
| 12 | Linda | linda@example.com | Editor | No |
10
0 of 0
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[config]="{ selectable: true, sortable: false }"
[(selectedItems)]="selectedItems"
/>Multi-select with sorting
ID | Name | Email | Role | Active | |
|---|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes | |
| 2 | Bob | bob@example.com | User | Yes | |
| 3 | Charlie | charlie@example.com | Editor | No | |
| 4 | Diana | diana@example.com | User | Yes | |
| 5 | Eve | eve@example.com | Viewer | No | |
| 6 | Frank | frank@example.com | Admin | Yes | |
| 7 | Grace | grace@example.com | Editor | Yes | |
| 8 | Heidi | heidi@example.com | User | No | |
| 9 | Ivan | ivan@example.com | Viewer | Yes | |
| 10 | Judy | judy@example.com | Admin | Yes | |
| 11 | Karl | karl@example.com | User | Yes | |
| 12 | Linda | linda@example.com | Editor | No |
10
0 of 0
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[config]="{ selectable: true, sortable: true }"
(sortChange)="onSortChange($event)"
[(selectedItems)]="selectedItems"
/>Filter
ID | Name | Email | Role | Active |
|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes |
| 2 | Bob | bob@example.com | User | Yes |
| 3 | Charlie | charlie@example.com | Editor | No |
| 4 | Diana | diana@example.com | User | Yes |
| 5 | Eve | eve@example.com | Viewer | No |
| 6 | Frank | frank@example.com | Admin | Yes |
| 7 | Grace | grace@example.com | Editor | Yes |
| 8 | Heidi | heidi@example.com | User | No |
| 9 | Ivan | ivan@example.com | Viewer | Yes |
| 10 | Judy | judy@example.com | Admin | Yes |
| 11 | Karl | karl@example.com | User | Yes |
| 12 | Linda | linda@example.com | Editor | No |
10
0 of 0
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[config]="{ filterable: true }"
/>Selection output
No sorting table:
[]
With sorting table:
[]
Row Actions Menu
ID | Name | Email | Role | Active | |
|---|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes | |
| 2 | Bob | bob@example.com | User | Yes | |
| 3 | Charlie | charlie@example.com | Editor | No | |
| 4 | Diana | diana@example.com | User | Yes | |
| 5 | Eve | eve@example.com | Viewer | No | |
| 6 | Frank | frank@example.com | Admin | Yes | |
| 7 | Grace | grace@example.com | Editor | Yes | |
| 8 | Heidi | heidi@example.com | User | No | |
| 9 | Ivan | ivan@example.com | Viewer | Yes | |
| 10 | Judy | judy@example.com | Admin | Yes | |
| 11 | Karl | karl@example.com | User | Yes | |
| 12 | Linda | linda@example.com | Editor | No |
10
0 of 0
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[actions]="rowActions"
[config]="{ sortable: true }"
/>Expandable Rows
ID | Name | Email | Role | Active | |
|---|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes | |
| 2 | Bob | bob@example.com | User | Yes | |
| 3 | Charlie | charlie@example.com | Editor | No | |
| 4 | Diana | diana@example.com | User | Yes | |
| 5 | Eve | eve@example.com | Viewer | No | |
| 6 | Frank | frank@example.com | Admin | Yes |
10
0 of 0
HTML
TS
<ng-template #expandedRow let-user>
<div class="grid grid-cols-2 md:grid-cols-3 gap-3">
<div>Department: {{ user.department }}</div>
...
</div>
</ng-template>
<rui-data-table
[data]="usersWithDetails"
[columns]="columns"
[expandedRowTemplate]="expandedRow"
[config]="{ sortable: true }"
/>Usage
Usage
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[actions]="rowActions"
[expandedRowTemplate]="expandedRow"
[config]="{ sortable: true, selectable: true, filterable: true }"
(sortChange)="onSortChange($event)"
(selectionChange)="onSelectionChange($event)"
[(selectedItems)]="selectedItems"
/>Template-driven Form
Using ngModel with the data table. The model value is the array of selected items. Note: data-table does not implement ControlValueAccessor, so ngModel binding is one-way.
ID | Name | Email | Role | Active | |
|---|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes | |
| 2 | Bob | bob@example.com | User | Yes | |
| 3 | Charlie | charlie@example.com | Editor | No | |
| 4 | Diana | diana@example.com | User | Yes | |
| 5 | Eve | eve@example.com | Viewer | No | |
| 6 | Frank | frank@example.com | Admin | Yes | |
| 7 | Grace | grace@example.com | Editor | Yes | |
| 8 | Heidi | heidi@example.com | User | No | |
| 9 | Ivan | ivan@example.com | Viewer | Yes | |
| 10 | Judy | judy@example.com | Admin | Yes | |
| 11 | Karl | karl@example.com | User | Yes | |
| 12 | Linda | linda@example.com | Editor | No |
10
0 of 0
0 item(s) selected
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[config]="{ selectable: true }"
[(selectedItems)]="selectedItems"
/>Reactive Form
Using formControl with the data table. Note: the data table uses its own model for selection; formControl shows one-way value sync.
ID | Name | Email | Role | Active | |
|---|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes | |
| 2 | Bob | bob@example.com | User | Yes | |
| 3 | Charlie | charlie@example.com | Editor | No | |
| 4 | Diana | diana@example.com | User | Yes | |
| 5 | Eve | eve@example.com | Viewer | No | |
| 6 | Frank | frank@example.com | Admin | Yes | |
| 7 | Grace | grace@example.com | Editor | Yes | |
| 8 | Heidi | heidi@example.com | User | No | |
| 9 | Ivan | ivan@example.com | Viewer | Yes | |
| 10 | Judy | judy@example.com | Admin | Yes | |
| 11 | Karl | karl@example.com | User | Yes | |
| 12 | Linda | linda@example.com | Editor | No |
10
0 of 0
0 item(s) selected
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[config]="{ selectable: true }"
[(selectedItems)]="selectedItems"
/>Signal Form
Using model() signal directly — no FormsModule or ReactiveFormsModule needed. This is the native API for the data table selection.
ID | Name | Email | Role | Active | |
|---|---|---|---|---|---|
| 1 | Alice | alice@example.com | Admin | Yes | |
| 2 | Bob | bob@example.com | User | Yes | |
| 3 | Charlie | charlie@example.com | Editor | No | |
| 4 | Diana | diana@example.com | User | Yes | |
| 5 | Eve | eve@example.com | Viewer | No | |
| 6 | Frank | frank@example.com | Admin | Yes | |
| 7 | Grace | grace@example.com | Editor | Yes | |
| 8 | Heidi | heidi@example.com | User | No | |
| 9 | Ivan | ivan@example.com | Viewer | Yes | |
| 10 | Judy | judy@example.com | Admin | Yes | |
| 11 | Karl | karl@example.com | User | Yes | |
| 12 | Linda | linda@example.com | Editor | No |
10
0 of 0
0 item(s) selected
HTML
TS
<rui-data-table
[data]="users"
[columns]="columns"
[config]="{ selectable: true }"
[(selectedItems)]="selectedItems"
/>