v1.10.2
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

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" 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