Column Collapse
The Column Collapse plugin allows you to make grouped columns collapsible. When a group is collapsed, only columns marked as “sealed” remain visible, while other columns are hidden. If no sealed column exists, the group falls back to a single placeholder column that keeps the expand affordance visible.
Source code
import { AdvanceFilterPlugin, ColumnCollapsePlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin, columnTypeRenderer,} from '@revolist/revogrid-pro';import { defineCustomElements } from '@revolist/revogrid/loader';defineCustomElements();
export function load(parentSelector: string) { const parent = document.querySelector(parentSelector); if (!parent) return;
const grid = document.createElement('revo-grid'); grid.colSize = 120; grid.source = [ { firstName: 'John', lastName: 'Doe', age: 30, street: '123 Main St', city: 'New York', country: 'USA', phone: '123-456-7890', mobile: '098-765-4321', }, { firstName: 'Jane', lastName: 'Smith', age: 28, street: '456 Oak Ave', city: 'São Paulo', country: 'Brazil', phone: '234-567-8901', mobile: '987-654-3210', }, { firstName: 'Bob', lastName: 'Johnson', age: 35, street: '789 Pine Rd', city: 'Madrid', country: 'Spain', phone: '345-678-9012', mobile: '876-543-2109', }, ];
grid.columns = [ { name: 'Personal Information', collapsible: true, collapsed: true, columnTemplate: columnTypeRenderer, children: [ { prop: 'firstName', name: 'First Name', size: 160, }, { prop: 'lastName', name: 'Last Name', size: 160, }, { prop: 'age', name: 'Age', size: 260, sealed: true, rowSelect: true, filterPlaceholder: 'Age?', }, ], }, { name: 'Address', collapsible: true, columnType: 'id', columnTemplate: columnTypeRenderer, children: [ { prop: 'street', name: 'Street', size: 180, sealed: true, filterPlaceholder: 'Where?', }, { prop: 'city', name: 'City', size: 160, filterPlaceholder: 'Where?', }, { prop: 'country', name: 'Country', size: 160, filterPlaceholder: 'Where?', }, ], }, { name: 'Contact', collapsible: true, collapsed: true, columnType: 'integer', columnTemplate: columnTypeRenderer, children: [ { prop: 'email', name: 'Email', size: 240, sealed: true, }, { prop: 'phone', name: 'Phone', size: 180, }, { prop: 'mobile', name: 'Mobile', size: 180, }, ], }, ];
grid.plugins = [ ColumnCollapsePlugin, AdvanceFilterPlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin, ]; grid.theme = 'material'; grid.hideAttribution = true; parent.appendChild(grid);}import React from 'react';import { RevoGrid } from '@revolist/react-datagrid';import { AdvanceFilterPlugin, ColumnCollapsePlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin, columnTypeRenderer,} from '@revolist/revogrid-pro';import { currentTheme } from '../composables/useRandomData';
const { isDark } = currentTheme();
const ColumnCollapse: React.FC = () => { const source = [ { firstName: 'John', lastName: 'Doe', age: 30, street: '123 Main St', city: 'New York', country: 'USA', phone: '123-456-7890', mobile: '098-765-4321', }, { firstName: 'Jane', lastName: 'Smith', age: 28, street: '456 Oak Ave', city: 'São Paulo', country: 'Brazil', phone: '234-567-8901', mobile: '987-654-3210', }, { firstName: 'Bob', lastName: 'Johnson', age: 35, street: '789 Pine Rd', city: 'Madrid', country: 'Spain', phone: '345-678-9012', mobile: '876-543-2109', }, ];
const columns = [ { name: 'Personal Information', collapsible: true, collapsed: true, columnTemplate: columnTypeRenderer, children: [ { prop: 'firstName', name: 'First Name', size: 160, }, { prop: 'lastName', name: 'Last Name', size: 160, }, { prop: 'age', name: 'Age', size: 260, sealed: true, rowSelect: true, filterPlaceholder: 'Age?', }, ], }, { name: 'Address', collapsible: true, columnType: 'id', columnTemplate: columnTypeRenderer, children: [ { prop: 'street', name: 'Street', size: 180, sealed: true, filterPlaceholder: 'Where?', }, { prop: 'city', name: 'City', size: 160, filterPlaceholder: 'Where?', }, { prop: 'country', name: 'Country', size: 160, filterPlaceholder: 'Where?', }, ], }, { name: 'Contact', collapsible: true, collapsed: true, columnType: 'integer', columnTemplate: columnTypeRenderer, children: [ { prop: 'email', name: 'Email', size: 240, sealed: true, }, { prop: 'phone', name: 'Phone', size: 180, }, { prop: 'mobile', name: 'Mobile', size: 180, }, ], }, ];
const plugins = [ ColumnCollapsePlugin, AdvanceFilterPlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin, ];
return ( <RevoGrid className="grow h-full cell-border" theme={isDark() ? 'darkMaterial' : 'material'} source={source} columns={columns} plugins={plugins} resize hide-attribution style={{ minHeight: '300px' }} /> );};
export default ColumnCollapse;<template> <RevoGrid class="grow h-full cell-border" :theme="isDark ? 'darkMaterial' : 'material'" :columns="columns" :source="source" :plugins="plugins" hide-attribution style="min-height: 300px" /></template>
<script setup lang="ts">import { ref } from 'vue';import RevoGrid, { type ColumnData } from '@revolist/vue3-datagrid';import { AdvanceFilterPlugin, ColumnCollapsePlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin, columnTypeRenderer,} from '@revolist/revogrid-pro';import { currentThemeVue } from '../composables/useRandomData';
const { isDark } = currentThemeVue();
const source = ref([ { firstName: 'John', lastName: 'Doe', age: 30, street: '123 Main St', city: 'New York', country: 'USA', phone: '123-456-7890', mobile: '098-765-4321', }, { firstName: 'Jane', lastName: 'Smith', age: 28, street: '456 Oak Ave', city: 'São Paulo', country: 'Brazil', phone: '234-567-8901', mobile: '987-654-3210', }, { firstName: 'Bob', lastName: 'Johnson', age: 35, street: '789 Pine Rd', city: 'Madrid', country: 'Spain', phone: '345-678-9012', mobile: '876-543-2109', },]);
const columns = ref<ColumnData>([ { name: 'Personal Information', collapsible: true, collapsed: true, columnTemplate: columnTypeRenderer, children: [ { prop: 'firstName', name: 'First Name', size: 160, pin: 'colPinStart', }, { prop: 'lastName', name: 'Last Name', size: 160, pin: 'colPinStart', }, { prop: 'age', name: 'Age', size: 260, sealed: true, rowSelect: true, filterPlaceholder: 'Age?', pin: 'colPinStart', }, ], }, { name: 'Address', collapsible: true, columnType: 'id', columnTemplate: columnTypeRenderer, children: [ { prop: 'street', name: 'Street', size: 180, sealed: true, filterPlaceholder: 'Where?', }, { prop: 'city', name: 'City', size: 160, filterPlaceholder: 'Where?', }, { prop: 'country', name: 'Country', size: 160, filterPlaceholder: 'Where?', }, ], }, { name: 'Contact', collapsible: true, collapsed: true, columnType: 'integer', columnTemplate: columnTypeRenderer, children: [ { prop: 'email', name: 'Email', size: 240, sealed: true, }, { prop: 'phone', name: 'Phone', size: 180, }, { prop: 'mobile', name: 'Mobile', size: 180, }, ], },]);
const plugins = [ ColumnCollapsePlugin, AdvanceFilterPlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin,];</script>import { Component } from '@angular/core';import { RevoGrid } from '@revolist/angular-datagrid';import { AdvanceFilterPlugin, ColumnCollapsePlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin, columnTypeRenderer,} from '@revolist/revogrid-pro';import { currentTheme } from '../composables/useRandomData';
const { isDark } = currentTheme();
@Component({ selector: 'column-collapse-grid', standalone: true, imports: [RevoGrid], template: ` <revo-grid class="grow h-full cell-border" [theme]="theme" [source]="source" [columns]="columns" [plugins]="plugins" resize hide-attribution style="min-height: 300px;" ></revo-grid> `,})export class ColumnCollapseGridComponent { readonly theme = isDark() ? 'darkMaterial' : 'material'; source = [ { firstName: 'John', lastName: 'Doe', age: 30, street: '123 Main St', city: 'New York', country: 'USA', phone: '123-456-7890', mobile: '098-765-4321', }, { firstName: 'Jane', lastName: 'Smith', age: 28, street: '456 Oak Ave', city: 'São Paulo', country: 'Brazil', phone: '234-567-8901', mobile: '987-654-3210', }, { firstName: 'Bob', lastName: 'Johnson', age: 35, street: '789 Pine Rd', city: 'Madrid', country: 'Spain', phone: '345-678-9012', mobile: '876-543-2109', }, ];
columns = [ { name: 'Personal Information', collapsible: true, collapsed: true, columnTemplate: columnTypeRenderer, children: [ { prop: 'firstName', name: 'First Name', size: 160, }, { prop: 'lastName', name: 'Last Name', size: 160, }, { prop: 'age', name: 'Age', size: 260, sealed: true, rowSelect: true, filterPlaceholder: 'Age?', }, ], }, { name: 'Address', collapsible: true, columnType: 'id', columnTemplate: columnTypeRenderer, children: [ { prop: 'street', name: 'Street', size: 180, sealed: true, filterPlaceholder: 'Where?', }, { prop: 'city', name: 'City', size: 160, filterPlaceholder: 'Where?', }, { prop: 'country', name: 'Country', size: 160, filterPlaceholder: 'Where?', }, ], }, { name: 'Contact', collapsible: true, collapsed: true, columnType: 'integer', columnTemplate: columnTypeRenderer, children: [ { prop: 'email', name: 'Email', size: 240, sealed: true, }, { prop: 'phone', name: 'Phone', size: 180, }, { prop: 'mobile', name: 'Mobile', size: 180, }, ], }, ];
plugins = [ ColumnCollapsePlugin, AdvanceFilterPlugin, FilterHeaderPlugin, RowSelectPlugin, RowOddPlugin, ];}Features
Section titled “Features”- Add collapse/expand functionality to column groups
- Maintain “sealed” columns visible even when group is collapsed
- Fall back to a single placeholder column when no sealed child exists
- Support for nested column groups
- Customizable initial collapse state
- Smooth animations and intuitive UI
Installation
Section titled “Installation”The Column Collapse plugin is included in the RevoGrid Pro package. To use it, simply import and add it to your grid’s plugins:
import { ColumnCollapsePlugin } from '@revolist/revogrid-pro';
const grid = document.createElement('revo-grid');grid.plugins = [ColumnCollapsePlugin];To make a column group collapsible:
- Add the
collapsibleproperty to the group configuration - Mark important columns as
sealedto keep them visible when collapsed - Optionally provide
placeholderon the group to customize the fallback placeholder header or cell
const grid = document.createElement('revo-grid');grid.plugins = [ColumnCollapsePlugin];
// Configure columns with collapsible groupsgrid.columns = [ { id: 'personalInfo', name: 'Personal Information', collapsible: true, // Enable collapse for this group children: [ { prop: 'name', name: 'Name', sealed: true, // This column will stay visible when collapsed }, { prop: 'email', name: 'Email', }, { prop: 'phone', name: 'Phone', }, ], }, { id: 'addressInfo', name: 'Address', collapsible: true, children: [ { prop: 'street', name: 'Street', sealed: true, }, { prop: 'city', name: 'City', }, { prop: 'country', name: 'Country', }, ], },];
// Optional placeholder customization when no sealed column existsgrid.columns.push({ name: 'Contact', collapsible: true, collapsed: true, placeholder: { header: 'Contact hidden', cellTemplate: (h) => h('span', undefined, 'Expand to view'), }, children: [ { prop: 'altEmail', name: 'Alt Email' }, { prop: 'mobile', name: 'Mobile' }, ],});
// Sample datagrid.source = [ { name: 'John Doe', phone: '123-456-7890', street: '123 Main St', city: 'New York', country: 'USA', }, // ... more rows];Best Practices
Section titled “Best Practices”- Use
sealedfor essential columns that should always be visible - Keep group names concise to avoid UI clutter
- Use
placeholderwhen you want custom fallback content for groups without sealed children - Use nested groups sparingly to maintain clarity
- Consider your users’ needs when deciding which columns to make collapsible
The Column Collapse plugin helps manage complex data grids by allowing users to focus on relevant information while keeping essential data visible at all times.
Expand or collapse all column groups
Section titled “Expand or collapse all column groups”Use the plugin instance to update all authored collapsible column groups in one operation:
const plugin = (await grid.getPlugins()).find( (plugin) => plugin instanceof ColumnCollapsePlugin,);plugin?.setAllGroupsCollapsed(true, 'rgCol');plugin?.setAllGroupsCollapsed(false, 'rgCol');Omit the dimension argument to include pinned column groups. The method preserves sealed columns, placeholder carriers and independent filter trim layers. Repeating the same state is a no-op. Collapse/expand events are emitted for changed groups after the complete state has been applied. Individual group commands retain their existing behavior.