v1.2.0
Theme

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

PropertyTypeDefaultDescription
row-heightnumber40Height of each row in pixels
header-heightnumber48Height of the header row
page-sizenumber0Rows per page (0 = no pagination)
current-pagenumber1Current 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
editablebooleanfalseEnable inline cell editing
stripedbooleanfalseAlternating row colors
borderedbooleanfalseShow cell borders
loadingbooleanfalseShow loading overlay
sticky-headerbooleantrueFixed header on scroll
row-keystring'id'Unique row identifier field
empty-textstring'No data'Empty state message
quick-filter-textstring''Global filter text
floating-filterbooleanfalseShow floating filter row
filter-debounce-msnumber300Filter input debounce delay
enable-row-groupingbooleanfalseEnable row grouping
group-default-expandednumber0Default expanded group depth
show-group-panelbooleanfalseShow grouping drag panel
enable-pivotingbooleanfalseEnable pivot mode
pivot-modebooleanfalseActivate pivot layout
tree-databooleanfalseEnable tree data mode
tree-data-child-fieldstring'children'Tree child field name
row-expandablebooleanfalseEnable row expand/detail
cell-selectionbooleanfalseEnable cell range selection
fill-handlebooleanfalseEnable fill handle
enable-row-dragbooleanfalseEnable row drag and drop
show-row-numbersbooleanfalseShow row number column
animate-rowsbooleanfalseAnimate 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

EventDetailDescription
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

MethodParametersDescription
exportCsv(params?)CsvExportParamsExport grid as CSV
exportJson(params?)JsonExportParamsExport grid as JSON
exportExcel(params?)ExcelExportParamsExport 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)RowTransactionApply add/update/remove transaction
getState()-Get grid state for persistence
setState(state)GridStateRestore grid state
undo()-Undo last edit
redo()-Redo last undone edit

CSS Custom Properties

PropertyDefaultDescription
--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" with role="row" and role="gridcell"
  • Keyboard navigation: Arrow keys, Home/End, Page Up/Down
  • aria-sort on sortable headers
  • aria-selected on selected rows/cells
  • aria-expanded on group/tree rows
  • aria-busy during loading
  • Focus management across virtual scroll boundaries