The Row Transpose Plugin modifies the grid by transposing its data, meaning that the original rows are converted into columns and vice versa.
This can be especially useful when dealing with datasets that require pivoting or when users need to explore data from different perspectives.
Source code import { defineCustomElements } from ' @revolist/revogrid/loader ' ;
import { useRandomData, currentTheme } from ' ../composables/useRandomData ' ;
const { createRandomData } = useRandomData ();
const { isDark } = currentTheme ();
import { RowTransposePlugin, TransposedRow } from ' @revolist/revogrid-pro ' ;
import { ColumnStretchPlugin } from ' @revolist/revogrid-pro ' ;
const grid = document. querySelector ( ' revo-grid ' );
grid.source = createRandomData ( 10 );
grid.plugins = [RowTransposePlugin, ColumnStretchPlugin];
grid.theme = isDark () ? ' darkCompact ' : ' compact ' ;
// Define additional data
transposedRowHeader : { columnTemplate : () => '' },
transposedColumnHeader : { columnTemplate : () => '' },
grid. addEventListener ( ' beforeedit ' , async ( e ) => {
const model = e.detail.model as TransposedRow ;
// Example how to transform TransposedRow to original model
model. getOriginalModels ([e.detail.prop]),
document. querySelector ( ' #transpose ' )?. addEventListener ( ' click ' , () => {
// dispatch(grid, ROW_TRANSPOSE_EVENT);
// or use plugin directly
grid. getPlugins (). then (( plugins ) => {
const plugin = plugins. find (( p ) => p instanceof RowTransposePlugin );
(plugin as RowTransposePlugin )?. transpose ();
< button @ click = " triggerTranspose " class = " rounded-md bg-slate-800 py-1.5 px-3 border border-transparent text-center text-sm text-white transition-all shadow-sm hover:shadow focus:bg-slate-700 focus:shadow-none active:bg-slate-700 hover:bg-slate-700 active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none " id = " transpose " >Transpose</ button >
class = " rounded-lg overflow-hidden "
: theme = " isDark ? ' darkCompact ' : ' compact '"
transposedRowHeader : { columnTemplate : () => '' },
transposedColumnHeader : { columnTemplate : () => '' },
@ beforeedit = " handleBeforeEdit "
import RevoGrid, { type ColumnRegular } from ' @revolist/vue3-datagrid ' ;
import { RowTransposePlugin, ColumnStretchPlugin, type TransposedRow, avatarRenderer, ratingStarRenderer } from ' @revolist/revogrid-pro ' ;
import { ref } from ' vue ' ;
import { currentThemeVue } from ' ../composables/useRandomData ' ;
import { makeData } from ' ../composables/makeData ' ;
const { isDark } = currentThemeVue ();
const grid = ref <{ $el : HTMLRevoGridElement } | null >( null );
const source = ref ( makeData ( 10 ));
const columns : ColumnRegular [] = [
{ name : ' Avatar ' , prop : ' avatar ' , cellTemplate : avatarRenderer, rectangular : true },
{ name : ' Full name ' , prop : ' fullName ' },
{ name : ' Rating ' , prop : ' rating ' , cellTemplate : ratingStarRenderer },
{ name : ' Email ' , prop : ' email ' },
{ name : ' Age ' , prop : ' age ' },
{ name : ' Address ' , prop : ' address ' },
{ name : ' City ' , prop : ' city ' },
{ name : ' State ' , prop : ' state ' },
{ name : ' Zip code ' , prop : ' zipCode ' },
const plugins = [RowTransposePlugin];
function handleBeforeEdit ( e : CustomEvent ) {
const model = e.detail.model as TransposedRow ;
console. log ( ' beforeedit ' , e.detail, model. getOriginalModels ([e.detail.prop]));
function triggerTranspose () {
grid.value?.$el. getPlugins (). then (( plugins ) => {
const plugin = plugins. find (( p ) => p instanceof RowTransposePlugin ) as RowTransposePlugin ;
if (plugin.isTransposed) {
grid.value.$el.rowDefinitions = [{
grid.value.$el.colSize = 250 ;
grid.value.$el.rowDefinitions = [];
grid.value.$el.colSize = 100 ;
import React, { useMemo, useCallback, useRef } from ' react ' ;
import { RevoGrid } from ' @revolist/react-datagrid ' ;
import { RowTransposePlugin, ColumnStretchPlugin, TransposedRow } from ' @revolist/revogrid-pro ' ;
import { useRandomData, currentTheme } from ' ../composables/useRandomData ' ;
const { createRandomData } = useRandomData ();
const { isDark } = currentTheme ();
function RowTranspose () {
const gridRef = useRef < HTMLRevoGridElement >( null );
const source = createRandomData ( 10 );
{ name : ' 🆔 ID ' , prop : ' id ' , size : 80 },
{ name : ' 🍎 Fruit ' , prop : ' name ' },
{ name : ' 💰 Price ' , prop : ' price ' },
const plugins = useMemo (() => [RowTransposePlugin, ColumnStretchPlugin], []);
const additionalData = useMemo (
transposedRowHeader : { columnTemplate : () => '' },
transposedColumnHeader : { columnTemplate : () => '' },
const handleBeforeEdit = useCallback (( e : CustomEvent ) => {
const model = e.detail.model as TransposedRow ;
console. log ( ' beforeedit ' , e.detail, model. getOriginalModels ([e.detail.prop]));
const triggerTranspose = () => {
gridRef?.current?. getPlugins (). then (( plugins ) => {
const plugin = plugins. find (( p ) => p instanceof RowTransposePlugin );
(plugin as RowTransposePlugin )?. transpose ();
additionalData = {additionalData}
theme = { isDark () ? ' darkCompact ' : ' compact ' }
onBeforeedit = {handleBeforeEdit}
< button onClick = {triggerTranspose}>Transpose Rows</ button >
export default RowTranspose;
import { Component, ViewEncapsulation, Input, ViewChild, ElementRef } from ' @angular/core ' ;
import { RevoGrid } from ' @revolist/angular-datagrid ' ;
import { RowTransposePlugin, ColumnStretchPlugin, TransposedRow } from ' @revolist/revogrid-pro ' ;
import { useRandomData, currentTheme } from ' ../composables/useRandomData ' ;
selector : ' row-transpose-grid ' ,
[additionalData]="additionalData"
(beforeedit)="handleBeforeEdit($event)"
<button (click)="triggerTranspose()">Transpose Rows</button>
encapsulation : ViewEncapsulation . None ,
export class RowTransposeGridComponent {
@ ViewChild ( ' gridRef ' , { static : true }) gridRef !: ElementRef < HTMLRevoGridElement >;
source = useRandomData (). createRandomData ( 10 );
{ name : ' 🆔 ID ' , prop : ' id ' , size : 80 },
{ name : ' 🍎 Fruit ' , prop : ' name ' },
{ name : ' 💰 Price ' , prop : ' price ' },
plugins = [RowTransposePlugin, ColumnStretchPlugin];
theme = currentTheme (). isDark () ? ' darkCompact ' : ' compact ' ;
transposedRowHeader : { columnTemplate : () => '' },
transposedColumnHeader : { columnTemplate : () => '' },
handleBeforeEdit ( event : any ) {
const model = event.detail.model as TransposedRow ;
console. log ( ' beforeedit ' , event.detail, model. getOriginalModels ([event.detail.prop]));
const grid = document. querySelector ( ' revo-grid ' ) as HTMLRevoGridElement ;
grid?. getPlugins (). then (( plugins ) => {
const plugin = plugins. find (( p ) => p instanceof RowTransposePlugin );
(plugin as RowTransposePlugin )?. transpose ();
Key Features
Toggle Transpose : Switch between the original view and the transposed view.
Dynamic Headers : Customizable transposed headers for better data representation.
Custom Transpose Configuration : Define how the columns and rows should be transformed, including whether to transpose column headers into rows.
The plugin offers two primary functionalities:
Original View : Displays rows and columns as defined in your data model.
Transposed View : When activated, this feature converts rows into columns and columns into rows.
The RowTransposePlugin
listens for the row-transpose
.
When triggered, it switches between the original view and the transposed view while preserving the original structure, allowing you to revert to the standard view at any time.
Alternatively, you can access the plugin directly using the following JavaScript code:
document. querySelector ( ' revo-grid ' ). getPlugins (). then ( plugins => {
const plugin = plugins. find ( p => p instanceof RowTransposePlugin );
When the rows are transposed, RevoGrid enters a virtual transposed mode. This means that events related to row and column edits will return instances of the TransposedRow
class, which represent the transposed data model. If you wish to retrieve the original model, you can use the TransposedRow.getOriginalModels
method. This method takes transposed column properties as input and converts the corresponding transposed cell back to the original model.
For example:
document. querySelector ( ' revo-grid ' ). addEventListener ( ' beforeedit ' , async ( e ) => {
const model = e.detail.model;
console. log ( ' beforeedit ' , model. getOriginalModels ([e.detail.prop])); // returns original row model
The plugin configuration allows you to fine-tune the transposing process. For example, you can choose to transpose the column headers into rows, or leave them unchanged.
document. querySelector ( ' revo-grid ' ).additionalData = {
transposedRowHeader : { cellTemplate : () => '' , columnTemplate : () => '' }, // defined row/header template
transposedColumnHeader : { columnTemplate : () => '' }, // template for transposed columns
The Row Transpose Plugin is a powerful tool for displaying data in different formats within RevoGrid.
Whether you’re working with complex datasets that require pivoting or simply need to view your data from a different perspective, this plugin provides the flexibility to switch between views seamlessly. With customizable options for how rows and columns are transposed, you can easily tailor the grid to your needs.