TablixJS Sorting Feature
July 22, 2025 · View on GitHub
TablixJS provides a simple, intuitive sorting feature that allows users to sort table data by clicking column headers. The sorting feature has been designed for simplicity and ease of use.
Basic Usage
Enable Sorting
const table = new Table('#table', {
data: data,
columns: columns,
sorting: {
enabled: true // Enable sorting (default: true)
}
});
Make Columns Sortable
const columns = [
{ name: 'name', title: 'Name', sortable: true },
{ name: 'age', title: 'Age', sortable: true, sortType: 'number' },
{ name: 'date', title: 'Date', sortable: true, sortType: 'date' },
{ name: 'status', title: 'Status', sortable: false } // Not sortable
];
User Interaction
Header Clicking
- Click any sortable column header to sort by that column
- Click again to reverse the sort order: ascending → descending → unsorted
- Only one column can be sorted at a time (single-column sorting)
Keyboard Navigation
- Use Tab to navigate to sortable headers
- Press Enter or Space to toggle sorting
API Methods
Programmatic Sorting
// Sort by a column
await table.sort('name', 'asc'); // Sort name ascending
await table.sort('age', 'desc'); // Sort age descending
await table.sort('status', null); // Remove sorting
// Toggle sort for a column (cycles through asc → desc → null)
await table.toggleSort('name');
// Clear all sorting
await table.clearSorting();
// Get current sort state
const sortState = table.getSortState();
console.log(sortState); // { sort: { column: 'name', direction: 'asc' }, mode: 'client' }
Configuration Options
const table = new Table('#table', {
sorting: {
enabled: true, // Enable/disable sorting
mode: 'client', // 'client' or 'server'
serverSortLoader: null, // Function for server-side sorting
defaultSortType: 'auto', // Default sort type
caseSensitive: false, // Case-sensitive string sorting
nullsFirst: false // Whether null values appear first
}
});
Sort Types
Built-in Sort Types
auto- Auto-detect type (numbers, dates, strings)string- String comparisonnumber- Numeric comparisondate- Date comparisonboolean- Boolean comparison
Custom Sort Functions
const columns = [
{
name: 'priority',
title: 'Priority',
sortable: true,
sortFunction: (a, b) => {
const order = { 'High': 3, 'Medium': 2, 'Low': 1 };
return order[b] - order[a]; // Reverse order (High to Low)
}
}
];
Server-Side Sorting
const table = new Table('#table', {
sorting: {
enabled: true,
mode: 'server',
serverSortLoader: async ({ sort, page, pageSize, filters }) => {
const response = await fetch('/api/data', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ sort, page, pageSize, filters })
});
return await response.json(); // { data: [...], totalRows: 100 }
}
}
});
Events
// Listen for sorting events
table.on('beforeSort', (data) => {
console.log('About to sort:', data);
});
table.on('afterSort', (data) => {
console.log('Sort completed:', data);
});
Styling
CSS Classes
The sorting feature uses these CSS classes for styling:
.tablix-sortable- Sortable column headers.tablix-sorted- Currently sorted column.tablix-sorted-asc- Ascending sort.tablix-sorted-desc- Descending sort.tablix-sort-indicator- Sort indicator container.tablix-sort-arrow- Sort direction arrow
Visual Indicators
- ↕ - Column is sortable but not currently sorted
- ↑ - Column is sorted ascending
- ↓ - Column is sorted descending
Examples
Basic Client-Side Sorting
const data = [
{ id: 1, name: 'Alice', age: 30, department: 'Engineering' },
{ id: 2, name: 'Bob', age: 25, department: 'Marketing' },
{ id: 3, name: 'Charlie', age: 35, department: 'Sales' }
];
const columns = [
{ name: 'name', title: 'Name', sortable: true },
{ name: 'age', title: 'Age', sortable: true, sortType: 'number' },
{ name: 'department', title: 'Department', sortable: true }
];
const table = new Table('#table', {
data: data,
columns: columns,
sorting: { enabled: true }
});
Custom Sort with Renderer
const columns = [
{
name: 'status',
title: 'Status',
sortable: true,
renderer: (cell) => {
const colors = { 'Active': 'green', 'Inactive': 'red' };
return `<span style="color: ${colors[cell]}">${cell}</span>`;
},
sortFunction: (a, b) => {
const order = { 'Active': 2, 'Inactive': 1 };
return order[b] - order[a];
}
}
];
Migration from Multi-Column Sorting
If you were using multi-column sorting in previous versions, the API has been simplified:
Before (Multi-Column)
// Old multi-column API
await table.sort('name', 'asc', false); // Replace existing sorts
await table.sort('age', 'desc', true); // Add to existing sorts
const sorts = table.getSortState().sorts; // Array of sorts
Now (Single-Column)
// New simplified API
await table.sort('name', 'asc'); // Sort by name (replaces any existing sort)
await table.sort('age', 'desc'); // Sort by age (replaces name sort)
const sort = table.getSortState().sort; // Single sort object or null
This simplification makes the sorting feature more intuitive and easier to use while maintaining all the core functionality.