Calculate optimal column widths based on content.
Auto-size utilities calculate optimal column widths based on content. These functions analyze cell content and headers to determine the best width for each column.
import {
calculateAutoSize,
autoSizeAllColumns,
} from '@workspace/active-grid';Calculate optimal width for a single column.
calculateAutoSize(
table: Table<TData>,
column: Column<TData>,
options?: AutoSizeOptions
): numberinterface AutoSizeOptions {
minWidth?: number; // Minimum width (default: 80)
maxWidth?: number; // Maximum width (default: 800)
padding?: number; // Extra padding (default: 32)
includeHeader?: boolean; // Include header in calculation (default: true)
}import { calculateAutoSize } from '@workspace/active-grid';
function AutoSizeButton({ column }) {
const table = useActiveGrid();
const handleAutoSize = () => {
const optimalWidth = calculateAutoSize(table, column, {
minWidth: 80,
maxWidth: 400,
padding: 32,
includeHeader: true,
});
column.setSize(optimalWidth);
};
return <Button onClick={handleAutoSize}>Auto-size</Button>;
}const width = calculateAutoSize(table, column, {
minWidth: 100,
maxWidth: 600,
padding: 40,
includeHeader: true,
});
column.setSize(width);Auto-size all columns at once.
autoSizeAllColumns(
table: Table<TData>,
options?: AutoSizeOptions
): voidimport { autoSizeAllColumns } from '@workspace/active-grid';
function AutoSizeAllButton() {
const table = useActiveGrid();
const handleAutoSizeAll = () => {
autoSizeAllColumns(table, {
minWidth: 80,
maxWidth: 400,
padding: 32,
includeHeader: true,
});
};
return <Button onClick={handleAutoSizeAll}>Auto-size All</Button>;
}function UsersTable() {
const table = useActiveGrid();
useEffect(() => {
// Auto-size all columns after data loads
autoSizeAllColumns(table);
}, [table]);
return <ActiveGrid {...} />;
}Add auto-size to column header menu:
<ActiveGrid
columns={columns}
data={data}
headerMenu={{
showAutoSize: true, // Enable auto-size in header menu
}}
{...}
/>function CustomAutoSizeButton() {
const table = useActiveGrid();
const handleAutoSize = () => {
autoSizeAllColumns(table, {
minWidth: 100,
maxWidth: 500,
padding: 40,
});
toast.success('Columns auto-sized');
};
return (
<Button variant="outline" size="sm" onClick={handleAutoSize}>
<Maximize className="mr-2 h-4 w-4" />
Auto-size Columns
</Button>
);
}function ColumnAutoSize({ column }) {
const table = useActiveGrid();
const handleAutoSize = () => {
const width = calculateAutoSize(table, column);
column.setSize(width);
};
return (
<Button size="sm" variant="ghost" onClick={handleAutoSize}>
Fit Content
</Button>
);
}{
accessorKey: 'description',
header: ({ column }) => (
<div
onDoubleClick={() => {
const width = calculateAutoSize(table, column);
column.setSize(width);
}}
>
Description
</div>
),
}Auto-size only specific columns:
function AutoSizeSelected() {
const table = useActiveGrid();
const handleAutoSize = () => {
const columnsToSize = ['name', 'email', 'status'];
columnsToSize.forEach(id => {
const column = table.getColumn(id);
if (column) {
const width = calculateAutoSize(table, column);
column.setSize(width);
}
});
};
return <Button onClick={handleAutoSize}>Auto-size Selected</Button>;
}const columns: GridColumnDef<User>[] = [
{
accessorKey: 'actions',
header: 'Actions',
size: 100,
meta: {
suppressSizeToFit: true, // Exclude from auto-sizing
},
},
];function ConstrainedAutoSize() {
const table = useActiveGrid();
const handleAutoSize = () => {
table.getAllColumns().forEach(column => {
// Skip certain columns
if (column.id === 'actions' || column.id === 'select') {
return;
}
const width = calculateAutoSize(table, column, {
minWidth: column.columnDef.minSize || 80,
maxWidth: column.columnDef.maxSize || 400,
});
column.setSize(width);
});
};
return <Button onClick={handleAutoSize}>Smart Auto-size</Button>;
}function ResponsiveTable() {
const [data, setData] = useState<User[]>([]);
const table = useActiveGrid();
useEffect(() => {
// Auto-size when data changes
if (data.length > 0) {
autoSizeAllColumns(table);
}
}, [data, table]);
return <ActiveGrid data={data} {...} />;
}Auto-sizing measures DOM elements, which can be expensive for large datasets. Use sparingly or only on user action.
Double-click resize handle to auto-size:
This is automatically enabled when column resizing is enabled.
The auto-size algorithm:
For performance-critical applications, consider manual sizing:
// Good: User-triggered
<Button onClick={() => autoSizeAllColumns(table)}>Auto-size</Button>
// Bad: On every render
useEffect(() => {
autoSizeAllColumns(table);
}); // No dependency array
// Good: Only on initial data load
useEffect(() => {
if (data.length > 0) {
autoSizeAllColumns(table);
}
}, [data.length]); // Only when data loads// Built-in behavior: double-click column resize handle auto-sizesimport { autoSizeAllColumns, calculateAutoSize } from '@workspace/active-grid';
function UsersTable() {
const [data, setData] = useState<User[]>([]);
const table = useActiveGrid();
const handleAutoSizeAll = () => {
autoSizeAllColumns(table, {
minWidth: 80,
maxWidth: 500,
padding: 32,
includeHeader: true,
});
toast.success('Columns auto-sized');
};
const handleAutoSizeColumn = (columnId: string) => {
const column = table.getColumn(columnId);
if (!column) return;
const width = calculateAutoSize(table, column, {
minWidth: 100,
maxWidth: 400,
});
column.setSize(width);
};
return (
<div>
<div className="mb-4 flex gap-2">
<Button onClick={handleAutoSizeAll}>
Auto-size All Columns
</Button>
<Button onClick={() => handleAutoSizeColumn('name')}>
Auto-size Name
</Button>
</div>
<ActiveGrid
columns={columns}
data={data}
enableColumnResizing={true}
headerMenu={{
showAutoSize: true,
}}
/>
</div>
);
}const columns: GridColumnDef<User>[] = [
{ accessorKey: 'id', header: 'ID', size: 80 },
{ accessorKey: 'name', header: 'Name', size: 200 },
{ accessorKey: 'email', header: 'Email', size: 250 },
{ accessorKey: 'status', header: 'Status', size: 120 },
];import { Table, Column } from '@tanstack/react-table';
import { calculateAutoSize, autoSizeAllColumns } from '@workspace/active-grid';
type User = {
id: string;
name: string;
};
const handleAutoSize = (table: Table<User>, column: Column<User>) => {
const width = calculateAutoSize(table, column, {
minWidth: 80,
maxWidth: 400,
});
column.setSize(width);
};
const handleAutoSizeAll = (table: Table<User>) => {
autoSizeAllColumns(table);
};