Table โ
A headless, native-<table> helper. controlMonoTable wraps a DataSource or a plain array and small controls (<mono-table-search>, <mono-table-paging>, <mono-table-sort>, โฆ) drive it โ bind each with :control-table. Declare every control's props in the controller's props block and each element needs only :control-table.prop="table"; props.th holds one entry per column, which you loop yourself from a state ref. Grid-as-a-document lives in Export Table.
Control โ
field is the identity every element matches on, which is why <mono-table-th>, <mono-table-sort field> and <mono-table-summary field> need nothing else. Pushing to table.props().th adds a column at runtime.
Setting props on the elements still works
Writing props directly on a mono-table-* element is still supported, as are the columns and summary options. Where both declare the same key, the controller wins.
Basic โ
Native table with search, page size, info and paging on one controller.
External control โ
Filtering the DataSource directly still updates the table via its changed event.
Colors โ
A .mono-table-{color} class on the wrapper recolors the whole table.
Search โ
<mono-table-search> renders mono-input's markup, so it takes the same appearance props โ size, color, variant, width, validation, etc. (see Types) โ and matches an input beside it in a toolbar. clearable resets the grid immediately, skipping the debounce.
Naming the searched fields โ
You don't have to. With no searchValue, a grid searches '*' โ every top-level field โ so search works out of the box. Set it to narrow that down.
searchValue names the columns a term matches. It takes an array or a comma-separated string โ a comma can't appear in a path or a pattern, so the two forms are equivalent:
ts
controlMonoTable(rows, { searchValue: ['Company.Name', 'Transaction.[*].Price', '*.[*].*'] })
controlMonoTable(rows, { searchValue: 'Company.Name,Transaction.[*].Price,*.[*].*' })It's the same name mono-select and mono-tag-input use, so an expression is portable between all of them. The same option works on controlMonoDataDropdown, which forwards its options to the grid it wraps.
You can also declare it next to the search box instead of in the options โ as an attribute, a .prop binding, or centrally through props.search:
vue
<mono-table-search :control-table.prop="table" search-value="Company.Name,*.[*].*" />ts
controlMonoTable(rows, { props: { search: { searchValue: ['Company.Name', '*.[*].*'] } } })An element-level value replaces the controller option rather than merging with it, so a search box can deliberately narrow what the grid searches. table.setSearchValue(โฆ) does the same from code, and table.searchValue() reads back the resolved list โ note that returns the fields; the typed query text is table.searchTerms.
searchExpr is the same thing
The grid originally called this searchExpr, and that spelling still works everywhere โ as the option (plus the kebab forms search-value / search-expr), and as table.searchExpr() / table.setSearchExpr(). Passing more than one spelling of the option merges them, de-duplicated by field. New code should use searchValue.
What the default does, exactly โ
'*' is a mono-side notion: it is expanded against the rows the grid holds into a list of real column names before anything is sent, so no * ever reaches an OData URL.
That expansion is type-aware. On an in-memory source every leaf is kept, so typing 2 can match a numeric Id. On a remote source only string columns are emitted โ contains(Price,'x') is not valid OData and would reject the whole request โ and the shape is read from the rows already loaded, so a field absent from that sample isn't covered. Give such a column an explicit entry or a { field, custom } builder.
The default also steps aside when it shouldn't apply: if the DataSource itself declares a searchExpr, the grid leaves the search to it and table.searchValue() returns undefined. searchValue: [] suppresses the default without filtering anything away โ to offer no search at all, simply don't render a <mono-table-search>.
Vue SFC
Search contexts โ
suggestion pins the term to one column (rows auto-detected from <mono-table-th>); multi-context stacks picks as removable chips โ OR within a column, AND across columns. Too many chips collapse into a See All trigger (max-chips, more-label). Keyboard: Tab toggles input/list, โ/โ move, Enter applies, Esc closes.
Filter builder โ
Slot a <mono-filter-builder slot="filter-builder"> into the search โ a chevron reveals it and its Apply drives the grid. Let the grid own the controller: controlMonoTable({ filterBuilder }) exposes table.filterBuilder to bind (the field list is derived from the <mono-table-th> columns). With multi-context, Apply renders one removable Filter chip (filter-label); without it, the grid just filters. The chevron, suggestion list and chips panel are mutually exclusive; each closes on Esc / outside-click.
filterBuilder takes every controlMonoFilterBuilder option, props included โ so the builder's own props are declared in the same block and read back off the grid-owned controller:
ts
const table = controlMonoTable<Row>(null, {
filterBuilder: {
fields: [{ field: 'Code', caption: 'Code' }],
props: { size: 'sm', width: '100%', maxHeight: 260 },
},
})
table.filterBuilder?.props() // { size: 'sm', width: '100%', maxHeight: 260 }
table.filterBuilder?.setProps({ size: 'lg' }) // the slotted element re-appliesWildcards and custom search clauses โ
'*' searches every field without listing them. Patterns read literally, segment by segment โ '*.*' is an object expand, '*.[*].*' an array one.
ts
searchValue: ['*', '*.[*].*'] // or the comma string '*,*.[*].*'An entry can instead build its own clause, for a column contains can't search โ a boolean, or a code the user never types. An explicitly named field always wins over a pattern, in either order.
ts
searchValue: [
'*',
{ field: 'Active', custom: ({ field, value }) => `${field} eq ${value}` },
{ field: 'Month', custom: ({ field, value }) => [field, '=', MONTHS.indexOf(value)] },
]The custom runs for every term โ return null to opt the column out of one. A filter array works on remote and array sources; a raw OData string is remote-only; a (row) => boolean is array-only. A wildcard only emits clauses for string columns on a remote source (contains(Price,'x') is invalid OData), so give a non-text column an explicit entry. Neither is honoured in server-group mode.
Sorting โ
Give a column sort in props.th and an arrow appears beside its caption. The gesture decides how many keys you get:
- Click the arrow โ always single-key. It cycles asc โ desc โ none and that column becomes the entire sort, so clicking one collapses a multi-key sort back down.
- Right-click the header โ opens the column menu; its
Sort โบrow cascades into Ascending / Descending / Clear / Clear all sorting. Picking a direction here appends, so Id then Name sorts by both ($orderby=Id desc,Name asc) and a<sup>marks each column's precedence. This is the only way to build a multi-key sort from the UI.
showIcon: false moves the single-sort trigger from the arrow onto the caption (right-click still reaches the menu); order seeds the direction โ several columns may each seed one and they combine; index pins precedence; noClear cycles asc โ desc only and drops the submenu's per-column Clear row. Driving it from code, table.setSort(field, order) replaces and table.setSort(field, order, { multi: true }) appends. The standalone <mono-table-sort field> renders the control outside a <mono-table-th> and behaves identically.
Editable rows โ
Mark a column editable: true in props.th and author the editor in its <td> โ the <tr> only needs :data-row-key. editableTrigger picks the gesture ('click' default, 'double-click' to leave single clicks free); it's a controller option, and clicks on an editor or button never open the row, so per-row Edit/Delete keep working. The caret lands in the cell you clicked (falling back to the first editable one); Tab walks from there, rolling into the next row.
Seamless editors โ
A <td> that contains a mono form control is auto-flattened into the cell โ no border, radius, background or height of its own, so the text doesn't shift when editing starts (the focused cell gets a 2px accent underline). Nothing to switch on; re-assert the --theme-* / --mono-input-* vars on a cell to keep its boxed look. The Manager column is a <mono-dropdown-table> in the cell โ render it with v-if, since one shared dropdown reflects one row at a time.
Keyboard navigation โ
Tap Tab for the next column; hold Tab + arrow to move one cell โ โ/โ in the row, โ/โ to the same column of the next row. Arrows never wrap. Enter opens the focused editor, Esc closes a popup then leaves edit mode. editorNavKeys: 'native' opts out for the browser's own Tab order; table.moveEditor(dir) drives a move from your own buttons.
Editing a DataSource โ
Staged edits against a bound DataSource โ Save flushes them with store.update (OData PATCH), not per keystroke.
Row-level CRUD (form()) โ
table.form().add/edit/delete().apply() stages whole rows and commits them without a full reload; showForm: true drops an editable row into the grid to fill in place.
This grid uses editableTrigger: 'double-click' so single clicks stay free for the row's own Edit / Delete buttons โ though the trigger ignores clicks on controls either way, and a showForm add-row renders its editors with no trigger at all.
The same UX bound to a DataSource โ apply() reflects the change in the loaded page optimistically, no reload.
Loading overlay โ
Drop <mono-table-loading> inside the <table> โ it shows a spinner over the rows during any query and freezes the height so the grid can't collapse mid-fetch.
Row selection โ
Put a type="all" checkbox in a <th> and a type="single" one per row โ the <th> can't render the <td> ones, since you loop the rows yourself.
vue
<th><mono-table-checkbox type="all" :control-table.prop="table" key-value="Id" /></th>
<td><mono-table-checkbox :control-table.prop="table" :item.prop="row" /></td>table.check().getAll() โ [{ Id: 8 }, { Id: 12 }]. With mode="all" (default) the select-all drains the source in chunk (100) row requests and selects everything the active search matches, not just the page; mode="per-page" selects the loaded page with no request. Every checkbox on the grid is disabled while a drain runs, and the select-all spins. key-value is path-aware and keeps the shape ('Transaction.[*].Id' โ { Transaction: [{ Id }] }); omit it for whole rows. The selection survives paging, sorting and searching โ check().clear() empties it. Size, color and the rest come from mono-checkbox.
Row detail โ
Put <mono-table-detail> in a <td>; whatever you slot into it renders as a full-width row below that row while open. Anything works inside โ interpolation, v-if, a nested grid, nested details.
vue
<mono-table-detail :control-table.prop="table" :stay-open="row.KeepOpen" @mno-click="onToggle">
Notes: {{ row.Note }}
</mono-table-detail>Opening a row closes the one that was open. stay-open exempts a row from that and from collapseAll() โ set it on every row if you want several panels open at once. Bulk control: table.detail().expandAll() / collapseAll() / collapseOthers() / openCount() / getAll(). Shared defaults go in props: { detail }; open is per-row state and is ignored there.
Header filter โ
Set headerFilter: true on a column in props.th for a distinct-values filter โ an OData groupby for a remote source, client-side for an array. Like sorting, the gesture decides how many columns you get:
- Click the funnel โ always single-column. Tick values, Apply, and this column becomes the only filtered one, so filtering another column through its funnel drops this one. Its
Clearempties every column. - Right-click the header โ
Header Filter โบโ opens the same panel, but it combines: AND across columns, OR within one. This is the only way to filter two columns at once, and the panel grows a Clear all button so a multi-column filter has a one-shot way out.Clearthere drops only this column.
showIcon: false hides the funnel without stranding the filter โ right-click still reaches it. Pass an object to configure it (enable, title, showIcon, dataSourceOptions โ see the demo source). From code, table.setColumnFilter(field, values) replaces and table.setColumnFilter(field, values, { multi: true }) combines; table.filteredColumns() lists the fields currently filtered.
dataSourceOptions is the devextreme load-options shape; by default the request carries only $select=<field> so it sees every row of that column โ set take to cap a large remote table.
One menu per header
Right-click is bound on every header cell that is sortable or filterable, and both features share the one menu (separated). A column with neither keeps the browser's own context menu.
Mapping rows for display โ
map turns each raw row into a presentation row inside the controller, so you stop hand-rolling a computed over items:
ts
const table = controlMonoTable(null, {
map: (row) => ({ ...row, _status: renderStatus(row.Status), _date: formatDateTime(row.Tanggal) }),
props: {
th: [{ field: 'Tanggal', map: (v) => formatDateTime(v) }], // column map: (value, row, index) => any
},
})
table.subscribe(() => { rows.value = [...table.mapped] }) // was: [...table.items]A column map receives the raw field value (so the body and header-filter list stay in agreement) and overwrites the grid map for that field โ pick one per field. Read the results from table.mapped; items stays raw so editing, search, sort and filters read the unformatted values.
Path field expressions โ
A field / searchValue entry can be a path: nested (Job.Name), indexed (User.[1].Id) or wildcard (User.[*].Name) โ resolved for search, sort, filter and edit.
Fixed columns โ
Add mono-table-sticky-left / -right to a column's <th> and <td>s to pin it on horizontal scroll.
Summary footer โ
Give a column a summary in props.th and read it in a <tfoot> via <mono-table-summary field="โฆ"> or table.summary() โ computed over the full set, not just the current page.
Wide / scrolling tables โ
Freeze the footer with mono-table-sticky-foot (plus scroll-y + a max-height) so the totals stay pinned while rows scroll under them.
Full example โ
Everything from a static array โ stat cards, filters, selection, badges, progress and actions.
Infinite scroll โ
<mono-table-paging type="infinity-scroll"> in a fixed-height scroll region auto-loads the next page as you reach the bottom.
The same mode over a remote OData DataSource โ each appended page is a real skip/take round-trip.
Virtual scroll โ
type="virtual-scroll" renders only the height-visible rows (windowed slice + spacer rows), so 10,000 rows stay light.
Virtual scroll over a remote DataSource โ the DOM stays tiny and the server is paged as the window nears the loaded end; :size overrides the source's page size.
Grouping โ
Pass group to controlMonoTable (array or DataSource); table.displayRows is a flat keyed list to v-for (switch on kind). The main pager pages the first group layer; <mono-table-paging-group> pages rows inside a group.
Both pagers together (static array) โ the footer pager moves between groups, each group pages its own rows.
Automatic server-side paging over a real DataSource โ one groupby for the group list + subtotal, each group fetches only its current page.
CSS Variables โ
Vue SFC
Themed through --mono-table-* custom properties (they inherit and pierce the shadow boundary). The color modifier sets the accent; an explicit --mono-table-accent override wins.
| Variable | Default | Controls |
|---|---|---|
--mono-table-accent | --theme-secondary | Accent โ header, sort, pagination, zebra base |
--mono-table-accent-rgb | secondary rgb | Accent as r, g, b (alpha mixes) |
--mono-table-accent-deep | --theme-primary | Deep accent (gradients / active) |
--mono-table-accent-sky | --theme-info | Light accent variant |
--mono-table-text | --theme-text | Cell text color |
--mono-table-border | --theme-border | Grid border color |
--mono-table-border-lite | border 48% | Soft inner border |
--mono-table-surface | --theme-surface | Table / control surface |
--mono-table-soft | accent 7% | Header / hover fill |
--mono-table-zebra | accent 4% | Zebra-stripe fill |
--mono-table-loading-bg | surface 64% | Loading-overlay backdrop (dim) |
--mono-table-loading-blur | 2px | Loading-overlay backdrop blur |
--mono-table-spinner-size | 1.5rem | Loading spinner diameter |
--mono-table-spinner-width | 2.5px | Loading spinner ring width |
--mono-table-spinner-color | accent | Loading spinner color |
--mono-table-spinner-speed | 0.65s | Loading spinner rotation speed |
--mono-table-detail-size | 1.5rem | Row-detail chevron button size |
--mono-table-detail-radius | 0.35rem | Row-detail chevron corner radius |
--mono-table-detail-color | muted | Row-detail chevron color (collapsed) |
--mono-table-detail-color-open | accent | Row-detail chevron color (expanded / hover) |
--mono-table-detail-hover-bg | accent 10% | Row-detail chevron hover fill |
--mono-table-detail-panel-bg | accent 7% | Detail panel row background |
--mono-table-detail-panel-pad | 0.85rem 1rem | Detail panel row padding |
Types โ
controlMonoTable is also exported as monoDataGrid, and :control-table is also accepted as :data-grid โ the older spellings still work.
Import
import { TableThProps, TableInfoProps, TableSortProps, TableDetailProps, TablePagingProps, TableSearchProps, TableLoadingProps, TableSummaryProps, TableCheckboxProps, TablePageSizeProps, TablePagingGroupProps } from 'mono-helper'| Prop | Value | Default | Description |
|---|---|---|---|
<mono-table-th> | |||
field | string | โ | Column field โ a plain key or a **path expression** into nested / collection data: `"Job.Name"` (nested), `"User.[1].Id"` (index), `"User.[*].Name"` (wildcard). `.`/`[` are reserved. |
caption | string | โ | โ |
sort | MonoColumnSort | โ | Bind with `.prop`: `{ order?: 'asc' | 'desc'; noClear?: boolean; disabled?: boolean }`. |
editable | boolean | โ | Whether the column's cells are editable (default `false`). |
editableTrigger | 'click' | 'double-click' | โ | How a row's inline editor opens โ `'click'` (default) or `'double-click'`. Opening a row is a table-wide behaviour, so this writes through to the shared controller and applies to every row; leave it unset to inherit `monoDataGrid(data, { editableTrigger })`. Rows need only `data-row-key` โ the grid binds the listener. Clicks on an editor or on an interactive control (button / link / form field) never open the editor. |
headerFilter | MonoHeaderFilter | boolean | โ | Header filter for this column (default `false`). `true` takes every default: a funnel icon left of the caption which opens a checkbox list of the column's distinct values โ Apply. Right-clicking the header reaches the same panel via the menu's `Header Filter โบ` row. Pass an object to set the panel `title`, hide the icon (`showIcon`) or shape the distinct-values query (`dataSourceOptions`). See {@link MonoHeaderFilter}. An object form needs `.prop` binding (or `props.th`) โ an attribute can only carry the boolean. |
width | string | number | โ | Column width, applied to the parent `<th>`. Number โ px; string used as-is (`'10rem'`, `'40%'`). |
height | string | number | โ | Header-cell height, applied to the parent `<th>`. Number โ px; string used as-is. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-info> | |||
template | string | โ | Override the "Showing {from}โ{to} of {total}" template. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-sort> | |||
field | string | โ | Column to sort by. Omit for a plain, non-sortable label. |
caption | string | โ | Header text (falls back to the element's text content). |
disabled | boolean | โ | โ |
enable | boolean | โ | Whether the control is sortable at all (default `true`). `enable="false"` renders a plain label โ the counterpart of `sort: { enable: false }`. |
noClear | boolean | โ | Cycle asc โ desc only, never clearing. |
showIcon | boolean | โ | Show the sort arrow (default `true`). The arrow is the single-sort click target, so hiding it moves that trigger onto the **label**. Right-click always opens the `Sort โบ` menu either way โ the only way to build a multi-key sort. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-detail> | |||
icon | string | โ | Icon class shown while collapsed (default `i-mdi-chevron-right`). |
iconExpanded | string | โ | Icon class shown while expanded (default `i-mdi-chevron-down`). |
open | boolean | โ | Whether the panel is showing (reflected as the `open` attribute). |
stayOpen | boolean | โ | Exempt this row from every automatic close โ the accordion (opening another row) and `table.detail().collapseAll()`. Not a lock: its own chevron still closes it. Set it on every row to allow many panels open at once. |
disabled | boolean | โ | Disable the toggle. |
label | string | โ | Accessible label for the toggle button (default `Toggle details`). |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-paging> | |||
type | 'standard' | 'infinity-scroll' | 'virtual-scroll' | โ | Paging mode (flat tables only): - `standard` (default) โ numbered buttons + prev/next arrows. - `infinity-scroll` โ scrolling to the end auto-loads & appends the next page. - `virtual-scroll` โ like infinity, but only the height-visible rows render (windowed slice + spacer rows) so huge datasets stay light. |
siblings | number | โ | How many numbered buttons to show around the current page (default 1). standard only. |
simple | boolean | โ | Hide the numbered buttons, keep only Prev / Next. standard only. |
size | number | โ | Page size (rows per page / scroll chunk). Set it to OVERRIDE the bound DataSource's configured `pageSize`; omit to use the DataSource's own pageSize. |
rowHeight | number | โ | Fixed row height in px used to size the virtual window + spacers (default 44). |
scrollTarget | string | โ | CSS selector for the scroll container; defaults to the nearest `.mono-table-scroll`. |
threshold | number | โ | Px from the end at which the next page auto-loads (default 200). |
overscan | number | โ | Extra rows rendered above/below the virtual window (default 6). |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-search> | |||
placeholder | string | โ | โ |
disabled | boolean | โ | โ |
debounce | number | โ | โ |
noIcon | boolean | โ | Hide the leading search icon. |
searchValue | string | MonoSearchExprEntry[] | โ | Which fields a term matches โ a comma string or an array, over the same grammar as `monoDataGrid({ searchExpr })` (paths, `*` patterns, `{ field, custom }`). Replaces the controller's own option. `searchExpr` / `search-expr` is the same prop under the grid's older name. |
searchExpr | string | MonoSearchExprEntry[] | โ | โ |
suggestion | boolean | โ | Show a suggestion dropdown under the field โ an "all fields" row plus one per registered `mono-table-th` (a plain native `<th>` contributes nothing). While it is open, Enter always applies the ACTIVE suggestion. |
multiContext | boolean | โ | Turn each accepted suggestion into a removable chip so several terms stack. Terms group by column: **OR within a column, AND across columns**. |
suggestionTemplate | string | โ | Suggestion wording; `{caption}` and `{term}` are substituted. |
allFieldsLabel | string | โ | Label of the leading "every column" suggestion row. |
maxChips | number | โ | Max context chips shown inline inside the field; the rest collapse into a `${moreLabel}` chip that opens a panel listing them. `0` shows none inline (just the trigger chip); a large value disables the collapse. |
moreLabel | string | โ | Label of the chip that opens the overflow panel (default `See All`). |
filterLabel | string | โ | Label of the filter chip rendered when a slotted `<mono-filter-builder slot="filter-builder">` applies its filter with `multi-context` on (default `Filter`). |
size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | โ | Visual size of the field. |
color | 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | โ | Theme color applied to focus, borders and accents. |
variant | 'underlined' | 'outlined' | 'filled' | โ | Visual style of the field (outlined, filled or underlined). |
readonly | boolean | โ | Read-only while still focusable. |
clearable | boolean | โ | Show a clear button once there is a search term (clears without waiting for the debounce). |
autofocus | boolean | โ | Focus the field on first render. |
label | string | โ | Label text displayed above the field. |
helperText | string | โ | Helper text shown below the field. |
validationState | 'warning' | 'default' | 'valid' | 'invalid' | โ | Explicit validation state for styling and messaging. |
validationMessage | string | โ | Validation message shown below the field. |
error | boolean | โ | Marks the field in an error state. |
errorMessage | string | โ | โ |
success | boolean | โ | Marks the field in a success state. |
successMessage | string | โ | โ |
name | string | โ | Form field name on the inner input. |
autocomplete | string | โ | Native autocomplete hint. |
inputmode | string | โ | Native inputmode hint for the on-screen keyboard. |
minLength | number | โ | โ |
maxLength | number | โ | โ |
ariaLabelText | string | โ | Accessible label for the inner input. |
aria-label | string | โ | โ |
width | string | number | โ | Explicit sizing. Each accepts a CSS length string (`"420px"`, `"80%"`) or a number (px). The field defaults to `width: 100%` with a `180px` floor. |
height | string | number | โ | โ |
minWidth | string | number | โ | โ |
maxWidth | string | number | โ | โ |
minHeight | string | number | โ | โ |
maxHeight | string | number | โ | โ |
cssClass | InputCssClass | โ | Per-part class overrides โ same keys as `mono-input`'s `cssClass`. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-loading> | |||
minDuration | number | โ | Minimum time (ms) to keep the overlay up once shown, so a fast query still flashes a perceptible spinner (default `350`). `0` disables the hold. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-summary> | |||
field | string | โ | Data field to summarize (path-aware). |
type | 'sum' | 'avg' | 'count' | 'min' | 'max' | 'countDistinct' | โ | Pick a specific aggregate when the field has several specs. |
name | string | โ | Pick a specific spec by its `name` when the field has several. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-checkbox> | |||
type | 'single' | 'all' | โ | `'single'` (a row, the default) or `'all'` (the select-all). |
item | unknown | โ | The row this checkbox represents โ `type="single"`. Bind with `.prop`. |
keyValue | string | string[] | โ | Field(s) `check().getAll()` projects each selected row down to. Path-aware and shape-preserving โ `['Company.Name', 'Transaction.[*].Id']` yields `{ Company: { Name }, Transaction: [{ Id }] }`. Omit for whole rows. |
mode | 'all' | 'per-page' | โ | `'all'` (default) drains the source in `chunk`-sized requests and selects every row the active search/filter matches; `'per-page'` selects the loaded page with no request. |
chunk | number | โ | Rows per request while draining in `mode="all"` (default 100). |
size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | โ | Visual size of the box. |
color | 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | โ | Theme color of the box. |
disabled | boolean | โ | โ |
label | string | โ | Label text shown next to the box. |
description | string | โ | Secondary description under the label. |
ariaLabelText | string | โ | โ |
cssClass | CheckboxCssClass | โ | Per-part class overrides โ same keys as `mono-checkbox`'s `cssClass`. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-page-size> | |||
sizes | string | number[] | โ | Options for the select (default [10, 20, 50, 100]). |
label | string | โ | โ |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |
<mono-table-paging-group> | |||
group | string | MonoGroupNode<any> | โ | The group to paginate โ its node (bind with `.prop`) or its `path` string. |
pageSize | number | โ | Rows per group-page (default 5). |
siblings | number | โ | Numbered buttons shown around the current page, each side (default 1). |
simple | boolean | โ | Only Prev / "X / Y" / Next โ no numbered buttons. |
dataGrid | MonoTableController<any> | โ | โ |
controlTable | MonoTableController<any> | โ | Renamed โ `:control-table` / `:controlTable` alias `dataGrid`. |