Skip to main content

Sorting

The <Table /> component allows by default data sorting by clicking on one of the header cells. This is done using to the key property specified in ColumnConfig.

Custom sort icons​

The default sort icons can be changed via the orderIconsConfig prop.

function SortingTable() {
return (
<Table<Person>
indexKey='id'
data={people.slice(0, 6)}
columnConfigs={peopleColumns}
baseHeaderClasses='font-bold'
baseRowClasses={index => {
let baseClasses = 'cursor-pointer';
return index % 2 !== 0 ? baseClasses : `${baseClasses} bg-gray-100 dark:bg-stripe`;
}}
baseCellPadding={{
vertical: '10px',
horizontal: '10px'
}}
// Add custom order icons config
orderIconsConfig={{
ASC: () => <p className='h-2 w-4 mr-1 cursor-pointer'>🍎</p>,
DESC: () => <p className='h-2 w-4 mr-1 cursor-pointer'>🍐</p>,
INITIAL: () => <p className='h-2 w-4 mr-1 cursor-pointer'>🍋</p>
}}
/>
);
}

Disable sorting on some headers​

If some columns should not be sortable, you can do it via the disableOrderIcon property in ColumnConfig.

export const disableSortColumns: ColumnConfig<Person>[] = [
{ title: 'Id', key: 'id', flex: 0.5, disableOrderIcon: true },
{ title: 'Last name', key: 'about.lastName' },
{ title: 'Age', key: 'about.age', flex: 0.5 },
{ title: 'Job', key: 'about.job', flex: 1.5, disableOrderIcon: true },
{ title: 'Company', key: 'company', flex: 1.5 }
];

Custom compare function​

By default, retables simply compares the different column values with the native javascript operators (<,>,=). However, this only works well with primitive types like strings and numbers.

If a column displays a complex data type, or the standard comparison simply isn't enough, you can use the compare property of ColumnConfig to indicate a new sort function.

In the next example we will give priority in the job column to people who have an executive title.

The signature of the function is:

compare?: (a: T, b: T) => -1 | 0 | 1;

export const customCompareColumns: ColumnConfig<Person>[] = [
{ title: 'Id', key: 'id', flex: 0.5 },
{ title: 'Last name', key: 'about.lastName' },
{ title: 'Age', key: 'about.age', flex: 0.5 },
{
title: 'Job',
key: 'about.job',
flex: 1.5,
compare: (a, b) => {
const isAExecutive = a.about.job.toLowerCase().includes('executive');
const isBExecutive = b.about.job.toLowerCase().includes('executive');
if (isAExecutive && !isBExecutive) return -1;
if (isBExecutive && !isAExecutive) return 1;
return 0;
}
},
{ title: 'Company', key: 'company', flex: 1.5 }
];

Caveats​

Currently you can only sort by one column at a time.