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