Pro Data Grid
The Pro Data Grid is an enterprise-grade data grid web component with virtual scrolling, multi-column sorting, filtering, inline editing, row grouping, pivoting, cell selection, clipboard support, and data export. It handles 1M+ rows via virtualized rendering.
Installation
npm install @duskmoon-dev/el-pro-data-grid
Usage
import '@duskmoon-dev/el-pro-data-grid/register';
<el-dm-pro-data-grid id="grid" striped></el-dm-pro-data-grid>
<script>
const grid = document.getElementById('grid');
grid.columns = [
{ field: 'name', header: 'Name', sortable: true },
{ field: 'email', header: 'Email', sortable: true },
{ field: 'salary', header: 'Salary', type: 'number', align: 'right' }
];
grid.data = [
{ id: 1, name: 'Alice', email: 'alice@example.com', salary: 85000 },
{ id: 2, name: 'Bob', email: 'bob@example.com', salary: 72000 }
];
</script>
Live Demo
Basic Pro Data Grid
Sortable with Floating Filters
Row Selection (Multiple)
Properties
| Property | Type | Default | Description |
|---|---|---|---|
row-height |
number |
40 |
Height of each row in pixels |
header-height |
number |
48 |
Height of the header row |
page-size |
number |
0 |
Rows per page (0 = no pagination) |
current-page |
number |
1 |
Current page number |
selection-mode |
'none' | 'single' | 'multiple' |
'none' |
Row selection mode |
sort-mode |
'client' | 'server' |
'client' |
Client or server-side sorting |
filter-mode |
'client' | 'server' |
'client' |
Client or server-side filtering |
editable |
boolean |
false |
Enable inline cell editing |
striped |
boolean |
false |
Alternating row colors |
bordered |
boolean |
false |
Show cell borders |
loading |
boolean |
false |
Show loading overlay |
sticky-header |
boolean |
true |
Fixed header on scroll |
row-key |
string |
'id' |
Unique row identifier field |
empty-text |
string |
'No data' |
Empty state message |
quick-filter-text |
string |
'' |
Global filter text |
floating-filter |
boolean |
false |
Show floating filter row |
filter-debounce-ms |
number |
300 |
Filter input debounce delay |
enable-row-grouping |
boolean |
false |
Enable row grouping |
group-default-expanded |
number |
0 |
Default expanded group depth |
show-group-panel |
boolean |
false |
Show grouping drag panel |
enable-pivoting |
boolean |
false |
Enable pivot mode |
pivot-mode |
boolean |
false |
Activate pivot layout |
tree-data |
boolean |
false |
Enable tree data mode |
tree-data-child-field |
string |
'children' |
Tree child field name |
row-expandable |
boolean |
false |
Enable row expand/detail |
cell-selection |
boolean |
false |
Enable cell range selection |
fill-handle |
boolean |
false |
Enable fill handle |
enable-row-drag |
boolean |
false |
Enable row drag and drop |
show-row-numbers |
boolean |
false |
Show row number column |
animate-rows |
boolean |
false |
Animate row transitions |
row-model-type |
'client' | 'server' | 'infinite' |
'client' |
Row model type |
ColumnDef Interface
interface ColumnDef {
field: string; // Data field key
header: string; // Display header text
width?: number; // Fixed width in pixels
minWidth?: number; // Minimum width
maxWidth?: number; // Maximum width
flex?: number; // Flex grow factor
sortable?: boolean; // Enable sorting
filterable?: boolean; // Enable filtering
editable?: boolean; // Enable editing
hidden?: boolean; // Hide column
pinned?: 'left' | 'right' | false;
type?: 'text' | 'number' | 'date' | 'boolean' | 'badge' | 'custom';
align?: 'left' | 'center' | 'right';
resizable?: boolean; // Enable column resize
filterType?: 'text' | 'number' | 'date' | 'set' | 'multi';
editor?: 'text' | 'number' | 'select' | 'date' | 'checkbox' | 'richText';
rowGroup?: boolean; // Group by this column
aggFunc?: 'sum' | 'avg' | 'min' | 'max' | 'count';
renderer?: (params: CellRendererParams) => string | HTMLElement;
children?: ColumnDef[]; // Column groups
}
Sorting
Click column headers to sort. Hold Shift to multi-sort. Supports both client-side and server-side sorting modes.
Sortable Columns
<el-dm-pro-data-grid id="grid"></el-dm-pro-data-grid>
<script>
grid.columns = [
{ field: 'name', header: 'Name', sortable: true },
{ field: 'salary', header: 'Salary', sortable: true, type: 'number' }
];
</script>
Filtering
Enable per-column filters with filterable: true, or use a global quick filter.
Floating Filters
<el-dm-pro-data-grid floating-filter></el-dm-pro-data-grid>
Quick Filter
<el-dm-pro-data-grid id="grid" quick-filter-text="search term"></el-dm-pro-data-grid>
// Programmatic quick filter
grid.quickFilterText = 'engineering';
Pagination
Paginated Grid
<el-dm-pro-data-grid page-size="25" current-page="1"></el-dm-pro-data-grid>
Row Selection
<!-- Multiple selection with checkboxes -->
<el-dm-pro-data-grid selection-mode="multiple"></el-dm-pro-data-grid>
<!-- Single selection -->
<el-dm-pro-data-grid selection-mode="single"></el-dm-pro-data-grid>
Inline Editing
Double-click a cell to enter edit mode. Tab to move between cells. Ctrl+Z / Ctrl+Y for undo/redo.
Editable Grid
grid.columns = [
{ field: 'name', header: 'Name', editable: true },
{ field: 'salary', header: 'Salary', editable: true, editor: 'number' }
];
Column Pinning
Pin columns to the left or right edge so they remain visible while scrolling.
Pinned Columns
grid.columns = [
{ field: 'name', header: 'Name', pinned: 'left' },
{ field: 'email', header: 'Email' },
{ field: 'actions', header: '', pinned: 'right', width: 80 }
];
Row Grouping
Group rows by one or more columns with aggregation.
Grouped Rows
grid.columns = [
{ field: 'department', header: 'Department', rowGroup: true },
{ field: 'salary', header: 'Salary', aggFunc: 'sum' }
];
Tree Data
Display hierarchical data with expand/collapse. Click the toggle arrows to expand/collapse tree nodes.
Tree Data
<el-dm-pro-data-grid tree-data tree-data-child-field="children"></el-dm-pro-data-grid>
Row Expandable
Enable expandable detail panels below each row. Click the toggle arrow to expand a row and see its details.
Row Expandable
<el-dm-pro-data-grid row-expandable row-expand-multiple></el-dm-pro-data-grid>
Cell Selection & Clipboard
Click and drag to select cell ranges. Hold Ctrl/Cmd to select multiple ranges. Copy with Ctrl+C.
Cell Selection
<el-dm-pro-data-grid cell-selection fill-handle></el-dm-pro-data-grid>
Data Export
// Export as CSV
grid.exportCsv({ fileName: 'export.csv' });
// Export as JSON
grid.exportJson({ fileName: 'export.json' });
// Export as Excel XML
grid.exportExcel({ fileName: 'export.xlsx' });
Declarative Columns
Use child elements to define columns declaratively:
Declarative Column Definitions
<el-dm-pro-data-grid>
<el-dm-grid-column field="name" header="Name" sortable></el-dm-grid-column>
<el-dm-grid-column field="email" header="Email"></el-dm-grid-column>
<el-dm-grid-column-group header="Details">
<el-dm-grid-column field="department" header="Dept"></el-dm-grid-column>
<el-dm-grid-column field="salary" header="Salary" type="number"></el-dm-grid-column>
</el-dm-grid-column-group>
</el-dm-pro-data-grid>
Events
| Event | Detail | Description |
|---|---|---|
sort-change |
{ sortModel } |
Sort model changed |
filter-change |
{ filterModel } |
Filter model changed |
page-change |
{ page, pageSize } |
Page changed |
selection-change |
{ selectedRows, added, removed } |
Row selection changed |
cell-click |
{ row, field, value, rowIndex } |
Cell clicked |
row-click |
{ row, index } |
Row clicked |
cell-edit |
{ rowIndex, field, oldValue, newValue } |
Cell edited |
column-resize |
{ field, width } |
Column resized |
column-move |
{ field, fromIndex, toIndex } |
Column moved |
Event Handling
const grid = document.querySelector('el-dm-pro-data-grid');
grid.addEventListener('sort-change', (e) => {
console.log('Sort model:', e.detail.sortModel);
});
grid.addEventListener('cell-edit', (e) => {
console.log(`${e.detail.field}: ${e.detail.oldValue} → ${e.detail.newValue}`);
});
Methods
| Method | Parameters | Description |
|---|---|---|
exportCsv(params?) |
CsvExportParams |
Export grid as CSV |
exportJson(params?) |
JsonExportParams |
Export grid as JSON |
exportExcel(params?) |
ExcelExportParams |
Export grid as Excel XML |
selectAll() |
- | Select all rows |
deselectAll() |
- | Deselect all rows |
expandAll() |
- | Expand all groups/tree nodes |
collapseAll() |
- | Collapse all groups/tree nodes |
setFilterModel(model) |
Record<string, FilterModel> |
Set column filter model |
setSortModel(model) |
SortItem[] |
Set sort model |
applyTransaction(tx) |
RowTransaction |
Apply add/update/remove transaction |
getState() |
- | Get grid state for persistence |
setState(state) |
GridState |
Restore grid state |
undo() |
- | Undo last edit |
redo() |
- | Redo last undone edit |
CSS Custom Properties
| Property | Default | Description |
|---|---|---|
--dm-color-surface |
- | Grid background |
--dm-color-surface-variant |
- | Header/stripe background |
--dm-color-outline |
- | Border color |
--dm-color-primary |
- | Sort indicator, selection highlight |
--dm-color-primary-container |
- | Selected row/cell background |
Accessibility
- ARIA
role="grid"withrole="row"androle="gridcell" - Keyboard navigation: Arrow keys, Home/End, Page Up/Down
aria-sorton sortable headersaria-selectedon selected rows/cellsaria-expandedon group/tree rowsaria-busyduring loading- Focus management across virtual scroll boundaries